New CON commands:

* sectsetinterpolation <sector>
 * sectclearinterpolation <sector>
 * clipmove <<ret>> <<x>> <<y>> <z> <<sectnum>> <xvect> <yvect> <walldist> <floordist> <ceildist> <clipmask>
 * lineintersect  <x1> <y1> <z1>  <x2> <y2> <z2>  <x3> <y3>  <x4> <y4>  <<intx>> <<inty>> <<intz>> <<ret>>
 * rayintersect <x1> <y1> <z1>  <xv> <yv> <zv>  <x3> <y3>  <x4> <y4>  <<intx>> <<inty>> <<intz>> <<ret>>
 * calchypotenuse <<ret>> <x> <y>
(all except *interpolation also in m32script). Also fixes Sect_ClearInterpolation to be symmetrical to its Set counterpart (shouldnt change anything since it was unused). Added "-conversion YYYYMMDD" switch for keyword-compatibility with old mods.
Mapster32: invisible sprite preview with Quote-i.

git-svn-id: https://svn.eduke32.com/eduke32@1708 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
helixhorned 2010-09-27 21:52:04 +00:00
parent 68801322dc
commit 91250f081c
15 changed files with 397 additions and 27 deletions

View file

@ -536,6 +536,12 @@ int32_t insertspritestat(int16_t statnum);
int32_t deletespritesect(int16_t deleteme); int32_t deletespritesect(int16_t deleteme);
int32_t deletespritestat(int16_t deleteme); int32_t deletespritestat(int16_t deleteme);
int32_t lineintersect(int32_t x1, int32_t y1, int32_t z1, int32_t x2, int32_t y2, int32_t z2, int32_t x3,
int32_t y3, int32_t x4, int32_t y4, int32_t *intx, int32_t *inty, int32_t *intz);
int32_t rayintersect(int32_t x1, int32_t y1, int32_t z1, int32_t vx, int32_t vy, int32_t vz, int32_t x3,
int32_t y3, int32_t x4, int32_t y4, int32_t *intx, int32_t *inty, int32_t *intz);
static inline int32_t insertsprite(int16_t sectnum, int16_t statnum) static inline int32_t insertsprite(int16_t sectnum, int16_t statnum)
{ {
insertspritestat(statnum); insertspritestat(statnum);

View file

@ -139,14 +139,22 @@ void test_map(int32_t mode);
static inline int32_t wallength(int16_t i) static inline int32_t wallength(int16_t i)
{ {
int32_t dax = POINT2(i).x - wall[i].x; int64_t dax = POINT2(i).x - wall[i].x;
int32_t day = POINT2(i).y - wall[i].y; int64_t day = POINT2(i).y - wall[i].y;
#if 1 //def POLYMOST
int64_t hypsq = dax*dax + day*day;
if (hypsq > (int64_t)INT_MAX)
return (int32_t)sqrt((double)hypsq);
else
return ksqrt((int32_t)hypsq);
#else
return ksqrt(dax*dax + day*day); return ksqrt(dax*dax + day*day);
#endif
} }
#define CLEARLINES2D(Startline, Numlines, Color) clearbuf((char *)(frameplace + ((Startline)*bytesperline)), (bytesperline*(Numlines))>>2, (Color)) #define CLEARLINES2D(Startline, Numlines, Color) clearbuf((char *)(frameplace + ((Startline)*bytesperline)), (bytesperline*(Numlines))>>2, (Color))
#define SCRIPTHISTSIZ 32 // should be the same as OSD_HISTORYDEPTH for maximum win #define SCRIPTHISTSIZ 32 // should be the same as OSD_HISTORYDEPTH for maximum win, should be a power of two
extern const char *scripthist[SCRIPTHISTSIZ]; extern const char *scripthist[SCRIPTHISTSIZ];
extern int32_t scripthistend; extern int32_t scripthistend;

View file

@ -5357,6 +5357,12 @@ static inline int32_t lintersect(int32_t x1, int32_t y1, int32_t z1, int32_t x2,
} }
int32_t lineintersect(int32_t x1, int32_t y1, int32_t z1, int32_t x2, int32_t y2, int32_t z2, int32_t x3,
int32_t y3, int32_t x4, int32_t y4, int32_t *intx, int32_t *inty, int32_t *intz)
{
return lintersect(x1, y1, z1, x2, y2, z2, x3, y3, x4, y4, intx, inty, intz);
}
// //
// rintersect (internal) // rintersect (internal)
// //
@ -5388,6 +5394,11 @@ static inline int32_t rintersect(int32_t x1, int32_t y1, int32_t z1, int32_t vx,
return(1); return(1);
} }
int32_t rayintersect(int32_t x1, int32_t y1, int32_t z1, int32_t vx, int32_t vy, int32_t vz, int32_t x3,
int32_t y3, int32_t x4, int32_t y4, int32_t *intx, int32_t *inty, int32_t *intz)
{
return rintersect(x1, y1, z1, vx, vy, vz, x3, y3, x4, y4, intx, inty, intz);
}
// //
// keepaway (internal) // keepaway (internal)

View file

@ -389,7 +389,7 @@ RIGHT smooth scrolling
31 : Two-Way Train (SE 30) 31 : Two-Way Train (SE 30)
10+++ : One-Time Sound 10+++ : One-Time Sound
32767 : Secret Room 32767 : Secret Room
65534 : End Of Level with Message 65534 : End Of Level with Message (sector hitag: sound #)
65535 : End Of Level 65535 : End Of Level
^P ^P
^3SE 0/1: ROTATED SECTOR ^3SE 0/1: ROTATED SECTOR
@ -546,11 +546,13 @@ RIGHT smooth scrolling
Hi = tile #4890 Hi Hi = tile #4890 Hi
^3^0SE 29: WAVES ^3^0SE 29: WAVES
^0 (...) Hi: start height (phase)
^0 Hi: start height (min. height?) GPSPEED Lo: amplitude (default: 256)
^0 GPSPEED Lo: start height (?) (phase?)
^0 Based on MAP EDITING FAQ v1.3 BY JONAH BISHOP and code research ^0 Based on
^0 * MAP EDITING FAQ v1.3 BY JONAH BISHOP
^0 * The Duke Nukem 3D Informational Suite by Ryan Lennox
^0 * code research
^P ^P
Foreground colors: Foreground colors:
^0,15 0 ^1,0 1 ^2 2 ^3 3 ^4 4 ^5 5 ^6 6 ^7 7 ^0,15 0 ^1,0 1 ^2 2 ^3 3 ^4 4 ^5 5 ^6 6 ^7 7

View file

@ -600,7 +600,7 @@ void A_DoGutsDir(int32_t sp, int32_t gtype, int32_t n)
void Sect_SetInterpolation(int32_t i) void Sect_SetInterpolation(int32_t i)
{ {
int32_t k, j = sector[SECT].wallptr,endwall = j+sector[SECT].wallnum; int32_t k, j = sector[SECT].wallptr, endwall = j+sector[SECT].wallnum;
for (; j<endwall; j++) for (; j<endwall; j++)
{ {
@ -620,16 +620,20 @@ void Sect_SetInterpolation(int32_t i)
void Sect_ClearInterpolation(int32_t i) void Sect_ClearInterpolation(int32_t i)
{ {
int32_t j = sector[SECT].wallptr,endwall = j+sector[SECT].wallnum; int32_t k, j = sector[SECT].wallptr, endwall = j+sector[SECT].wallnum;
for (; j<endwall; j++) for (; j<endwall; j++)
{ {
G_StopInterpolation(&wall[j].x); G_StopInterpolation(&wall[j].x);
G_StopInterpolation(&wall[j].y); G_StopInterpolation(&wall[j].y);
if (wall[j].nextwall >= 0) k = wall[j].nextwall;
if (k >= 0)
{ {
G_StopInterpolation(&wall[wall[j].nextwall].x); G_StopInterpolation(&wall[k].x);
G_StopInterpolation(&wall[wall[j].nextwall].y); G_StopInterpolation(&wall[k].y);
k = wall[k].point2;
G_StopInterpolation(&wall[k].x);
G_StopInterpolation(&wall[k].y);
} }
} }
} }

View file

@ -3086,7 +3086,7 @@ static int32_t m32gettile(int32_t idInitialTile)
// //
// Ensure tilenum is within valid range // Ensure tilenum is within valid range
// //
iTile = clamp(iTile, 0, localartlookupnum-1); iTile = clamp(iTile, 0, min(MAXTILES-1, localartlookupnum+nDisplayedTiles-1));
// 'S' KEYPRESS: search for named tile // 'S' KEYPRESS: search for named tile
@ -5509,6 +5509,12 @@ static void Keys3d(void)
// printext256(1*4,1*8,11,-1,tempbuf,0); // printext256(1*4,1*8,11,-1,tempbuf,0);
} }
if (keystatus[KEYSC_QUOTE] && PRESSED_KEYSC(I)) // ' i
{
showinvisibility = !showinvisibility;
message("Invisible sprite preview %s", showinvisibility?"enabled":"disabled");
}
if (keystatus[KEYSC_QUOTE] && PRESSED_KEYSC(X)) // ' x if (keystatus[KEYSC_QUOTE] && PRESSED_KEYSC(X)) // ' x
{ {
shadepreview = !shadepreview; shadepreview = !shadepreview;
@ -7887,12 +7893,28 @@ static int32_t osdcmd_do(const osdfuncparm_t *parm)
if (!(vm.flags&VMFLAG_ERROR)) if (!(vm.flags&VMFLAG_ERROR))
{ {
if (scripthist[scripthistend]) int32_t idx, dosave=1;
Bfree((void *)scripthist[scripthistend]);
scripthist[scripthistend] = Bstrdup(parm->raw); for (i=1; i<=4; i++)
scripthistend++; {
scripthistend %= SCRIPTHISTSIZ; idx = (scripthistend-i)&(SCRIPTHISTSIZ-1);
if (!scripthist[idx])
break;
else if (!Bstrcmp(scripthist[idx], parm->raw))
{
dosave = 0;
break;
}
}
if (dosave)
{
if (scripthist[scripthistend])
Bfree((void *)scripthist[scripthistend]);
scripthist[scripthistend] = Bstrdup(parm->raw);
scripthistend++;
scripthistend %= SCRIPTHISTSIZ;
}
} }
// asksave = 1; // handled in Access(Sprite|Sector|Wall) // asksave = 1; // handled in Access(Sprite|Sector|Wall)
} }
@ -8124,7 +8146,6 @@ void GAME_clearbackground(int32_t numcols, int32_t numrows)
CLEARLINES2D(0, min(ydim, numrows*8+8), editorcolors[16]); CLEARLINES2D(0, min(ydim, numrows*8+8), editorcolors[16]);
} }
static void m32_osdsetfunctions() static void m32_osdsetfunctions()
{ {
OSD_SetFunctions( OSD_SetFunctions(
@ -8140,6 +8161,7 @@ static void m32_osdsetfunctions()
); );
} }
#endif #endif
enum enum
@ -9015,7 +9037,7 @@ int32_t ExtInit(void)
Bstrcpy(apptitle, "Mapster32"VERSION BUILDDATE); Bstrcpy(apptitle, "Mapster32"VERSION BUILDDATE);
autosavetimer = totalclock+120*autosave; autosavetimer = totalclock+120*autosave;
#if defined(_WIN32) && defined(DUKEOSD) #if defined(DUKEOSD)
m32_osdsetfunctions(); m32_osdsetfunctions();
#endif #endif
@ -9457,6 +9479,13 @@ void ExtAnalyzeSprites(void)
tspr->xrepeat=0; tspr->xrepeat=0;
} }
if (showinvisibility && (tspr->cstat&32768))
{
tspr->pal = 6;
tspr->cstat &= ~32768;
tspr->cstat |= 2+512;
}
if (shadepreview && !(tspr->cstat & 16)) if (shadepreview && !(tspr->cstat & 16))
{ {
if (sector[tspr->sectnum].ceilingstat&1) if (sector[tspr->sectnum].ceilingstat&1)
@ -9700,7 +9729,7 @@ static void Keys2d3d(void)
{ {
getmessageleng = 0; getmessageleng = 0;
getmessagetimeoff = 0; getmessagetimeoff = 0;
#if defined(_WIN32) && defined(DUKEOSD) #if defined(DUKEOSD)
m32_osdsetfunctions(); m32_osdsetfunctions();
#endif #endif
} }
@ -10546,7 +10575,7 @@ static void EditSpriteData(int16_t spritenum)
if (editval) if (editval)
{ {
printmessage16(edittext); printmessage16(edittext);
sprite[spritenum].owner = getnumber16(edittext,(int32_t)sprite[spritenum].owner,MAXSPRITES,0); sprite[spritenum].owner = getnumber16(edittext,(int32_t)sprite[spritenum].owner,MAXSPRITES,1);
} }
} }
break; break;

View file

@ -7733,6 +7733,7 @@ static void G_ShowDebugHelp(void)
"-ns/-nm\t\tDisable sound or music\n" "-ns/-nm\t\tDisable sound or music\n"
"-q#\t\tFake multiplayer with # (2-8) players\n" "-q#\t\tFake multiplayer with # (2-8) players\n"
"-z#/-condebug\tEnable line-by-line CON compile debugging at level #\n" "-z#/-condebug\tEnable line-by-line CON compile debugging at level #\n"
"-conversion YYYYMMDD\tSelects CON script version for compatibility with older mods\n"
; ;
#if defined RENDERTYPEWIN #if defined RENDERTYPEWIN
Bsnprintf(tempbuf, sizeof(tempbuf), HEAD2 " %s", s_buildDate); Bsnprintf(tempbuf, sizeof(tempbuf), HEAD2 " %s", s_buildDate);
@ -8321,6 +8322,23 @@ static void G_CheckCommandLine(int32_t argc, const char **argv)
i++; i++;
continue; continue;
} }
if (!Bstrcasecmp(c+1, "conversion"))
{
if (argc > i+1)
{
uint32_t j = atol((char *)argv[i+1]);
if (j>=10000000 && j<=99999999)
{
g_scriptDateVersion = j;
initprintf("CON script date version: %d\n",j);
}
else
initprintf("CON script date version must be specified as YYYYMMDD, ignoring.\n");
i++;
}
i++;
continue;
}
if (!Bstrcasecmp(c+1,"nologo")) if (!Bstrcasecmp(c+1,"nologo"))
{ {
g_noLogo = 1; g_noLogo = 1;

View file

@ -32,7 +32,55 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include <shellapi.h> #include <shellapi.h>
#endif #endif
#define NUMKEYWORDS (int32_t)(sizeof(keyw)/sizeof(keyw[0]))
int32_t g_scriptVersion = 13; // 13 = 1.3D-style CON files, 14 = 1.4/1.5 style CON files int32_t g_scriptVersion = 13; // 13 = 1.3D-style CON files, 14 = 1.4/1.5 style CON files
uint32_t g_scriptDateVersion = 99999999; // YYYYMMDD
static uint32_t g_scriptLastKeyword; // = NUMKEYWORDS-1;
#define NUMKEYWDATES (int32_t)(sizeof(g_keywdate)/sizeof(g_keywdate[0]))
// { keyw, date } means that at the date, all keywords up to keyw inclusive are available
static struct { uint32_t keyw; uint32_t date; } g_keywdate[] =
{
// beginning of eduke32 svn
{ CON_CANSEE, 20060423 },
{ CON_CANSEESPR, 20060424 },
// some stuff here not representable this way
{ CON_FINDNEARSPRITEZVAR, 20060516 },
{ CON_EZSHOOT, 20060701 },
{ CON_EZSHOOTVAR, 20060822 },
{ CON_JUMP, 20060828 },
{ CON_QSTRLEN, 20060930 },
{ CON_QUAKE, 20070105 },
{ CON_SHOWVIEW, 20070208 },
{ CON_NEXTSPRITESECT, 20070819 },
{ CON_GETKEYNAME, 20071024 }, // keyw numbers have been
{ CON_SPRITENOPAL, 20071220 }, // shuffled around here
{ CON_HITRADIUSVAR, 20080216 },
{ CON_ROTATESPRITE16, 20080314 },
{ CON_SETARRAY, 20080401 },
{ CON_READARRAYFROMFILE, 20080405 },
{ CON_STARTTRACKVAR, 20080510 },
{ CON_QGETSYSSTR, 20080709 },
{ CON_GETTICKS, 20080711 },
{ CON_SETTSPR, 20080713 },
{ CON_CLEARMAPSTATE, 20080716 },
{ CON_SCRIPTSIZE, 20080720 },
{ CON_SETGAMENAME, 20080722 },
{ CON_CMENU, 20080725 },
{ CON_GETTIMEDATE, 20080809 },
{ CON_ACTIVATECHEAT, 20080810 },
{ CON_SETGAMEPALETTE, 20080816 },
{ CON_SETCFGNAME, 20080817 },
{ CON_IFVARVAREITHER, 20080907 },
{ CON_SAVENN, 20080915 },
{ CON_COPY, 20090219 },
// { CON_INV, 20090619 },
{ CON_QSTRNCAT, 20090712 },
{ CON_STOPACTORSOUND, 20090715 },
{ CON_IFSERVER, 20100722 },
{ CON_CALCHYPOTENUSE, 20100927 },
};
char g_szScriptFileName[BMAX_PATH] = "(none)"; // file we're currently compiling char g_szScriptFileName[BMAX_PATH] = "(none)"; // file we're currently compiling
static char g_szCurrentBlockName[256] = "(none)", g_szLastBlockName[256] = "NULL"; static char g_szCurrentBlockName[256] = "(none)", g_szLastBlockName[256] = "NULL";
@ -146,7 +194,6 @@ static const char *C_GetLabelType(int32_t type)
return Bstrdup(x); return Bstrdup(x);
} }
#define NUMKEYWORDS (int32_t)(sizeof(keyw)/sizeof(keyw[0]))
const char *keyw[] = const char *keyw[] =
{ {
@ -503,6 +550,12 @@ const char *keyw[] =
"stopactorsound", // 350 "stopactorsound", // 350
"ifclient", // 351 "ifclient", // 351
"ifserver", // 352 "ifserver", // 352
"sectsetinterpolation", // 353
"sectclearinterpolation", // 354
"clipmove", // 355
"lineintersect", // 356
"rayintersect", // 357
"calchypotenuse", // 358
"<null>" "<null>"
}; };
@ -997,7 +1050,24 @@ void C_InitHashes()
hash_init(&actorH); hash_init(&actorH);
hash_init(&tspriteH); hash_init(&tspriteH);
for (i=NUMKEYWORDS-1; i>=0; i--) hash_add(&h_keywords,keyw[i],i,0); g_scriptLastKeyword = NUMKEYWORDS-1;
// determine last CON keyword for backward compatibility with older mods
if (g_scriptDateVersion < g_keywdate[NUMKEYWDATES-1].date)
{
for (i=NUMKEYWDATES-1; i>=0; i--)
{
if (g_scriptDateVersion >= g_keywdate[i].date)
{
g_scriptLastKeyword = g_keywdate[i].keyw;
break;
}
}
if (i<0)
g_scriptLastKeyword = g_keywdate[0].keyw-1; // may be slightly imprecise
}
for (i=g_scriptLastKeyword; i>=0; i--) hash_add(&h_keywords,keyw[i],i,0);
for (i=0; SectorLabels[i].lId >= 0; i++) hash_add(&sectorH,SectorLabels[i].name,i,0); for (i=0; SectorLabels[i].lId >= 0; i++) hash_add(&sectorH,SectorLabels[i].name,i,0);
for (i=0; WallLabels[i].lId >= 0; i++) hash_add(&wallH,WallLabels[i].name,i,0); for (i=0; WallLabels[i].lId >= 0; i++) hash_add(&wallH,WallLabels[i].name,i,0);
for (i=0; UserdefsLabels[i].lId >= 0; i++) hash_add(&userdefH,UserdefsLabels[i].name,i,0); for (i=0; UserdefsLabels[i].lId >= 0; i++) hash_add(&userdefH,UserdefsLabels[i].name,i,0);
@ -4397,6 +4467,32 @@ static int32_t C_ParseCommand(void)
C_GetManyVars(2); C_GetManyVars(2);
break; break;
case CON_SECTSETINTERPOLATION:
case CON_SECTCLEARINTERPOLATION:
C_GetNextVar();
break;
case CON_CLIPMOVE:
// <retvar>,<x>,<y>,z,<sectnum>, xvect,yvect,walldist,floordist,ceildist,clipmask
C_GetManyVarsType(GAMEVAR_READONLY,3);
C_GetNextVar();
C_GetNextVarType(GAMEVAR_READONLY);
C_GetManyVars(6);
break;
case CON_CALCHYPOTENUSE:
C_GetNextVarType(GAMEVAR_READONLY);
C_GetManyVars(2);
break;
case CON_LINEINTERSECT:
case CON_RAYINTERSECT:
// lineintersect x y z x y z x y x y <intx> <inty> <intz> <ret>
// rayintersect x y z vx vy vz x y x y <intx> <inty> <intz> <ret>
C_GetManyVars(10);
C_GetManyVarsType(GAMEVAR_READONLY,4);
break;
case CON_HITSCAN: case CON_HITSCAN:
case CON_CANSEE: case CON_CANSEE:
// get the ID of the DEF // get the ID of the DEF

View file

@ -69,6 +69,7 @@ extern char g_szScriptFileName[BMAX_PATH];
extern int32_t g_totalLines,g_lineNumber; extern int32_t g_totalLines,g_lineNumber;
extern int32_t g_numCompilerErrors,g_numCompilerWarnings,g_numQuoteRedefinitions; extern int32_t g_numCompilerErrors,g_numCompilerWarnings,g_numQuoteRedefinitions;
extern int32_t g_scriptVersion; extern int32_t g_scriptVersion;
extern uint32_t g_scriptDateVersion; // YYYYMMDD
extern char g_szBuf[1024]; extern char g_szBuf[1024];
extern intptr_t *g_scriptPtr; extern intptr_t *g_scriptPtr;
@ -925,6 +926,12 @@ enum ScriptKeywords_t
CON_STOPACTORSOUND, // 350 CON_STOPACTORSOUND, // 350
CON_IFCLIENT, // 351 CON_IFCLIENT, // 351
CON_IFSERVER, // 352 CON_IFSERVER, // 352
CON_SECTSETINTERPOLATION, // 353
CON_SECTCLEARINTERPOLATION, // 354
CON_CLIPMOVE, // 355
CON_LINEINTERSECT, // 356
CON_RAYINTERSECT, // 357
CON_CALCHYPOTENUSE, // 358
CON_END CON_END
}; };
#endif #endif

View file

@ -2479,6 +2479,100 @@ nullquote:
continue; continue;
} }
case CON_SECTSETINTERPOLATION:
case CON_SECTCLEARINTERPOLATION:
insptr++;
{
int32_t sectnum = Gv_GetVarX(*insptr++), osectnum;
if ((sectnum<0 || sectnum>=numsectors))
{
OSD_Printf(CON_ERROR "Invalid sector %d\n",g_errorLineNum,keyw[g_tw],sectnum);
continue;
}
osectnum = sprite[MAXSPRITES-1].sectnum;
sprite[MAXSPRITES-1].sectnum = sectnum;
if (tw==CON_SECTSETINTERPOLATION)
Sect_SetInterpolation(MAXSPRITES-1);
else
Sect_ClearInterpolation(MAXSPRITES-1);
sprite[MAXSPRITES-1].sectnum = osectnum;
continue;
}
case CON_CALCHYPOTENUSE:
insptr++;
{
int32_t retvar=*insptr++;
int64_t dax=Gv_GetVarX(*insptr++), day=Gv_GetVarX(*insptr++);
int64_t hypsq = dax*dax + day*day;
if (hypsq > (int64_t)INT_MAX)
Gv_SetVarX(retvar, (int32_t)sqrt((double)hypsq));
else
Gv_SetVarX(retvar, ksqrt((int32_t)hypsq));
continue;
}
case CON_LINEINTERSECT:
case CON_RAYINTERSECT:
insptr++;
{
int32_t x1=Gv_GetVarX(*insptr++), y1=Gv_GetVarX(*insptr++), z1=Gv_GetVarX(*insptr++);
int32_t x2=Gv_GetVarX(*insptr++), y2=Gv_GetVarX(*insptr++), z2=Gv_GetVarX(*insptr++);
int32_t x3=Gv_GetVarX(*insptr++), y3=Gv_GetVarX(*insptr++), x4=Gv_GetVarX(*insptr++), y4=Gv_GetVarX(*insptr++);
int32_t intxvar=*insptr++, intyvar=*insptr++, intzvar=*insptr++, retvar=*insptr++;
int32_t intx, inty, intz, ret;
if (tw==CON_LINEINTERSECT)
ret = lineintersect(x1, y1, z1, x2, y2, z2, x3, y3, x4, y4, &intx, &inty, &intz);
else
ret = rayintersect(x1, y1, z1, x2, y2, z2, x3, y3, x4, y4, &intx, &inty, &intz);
Gv_SetVarX(retvar, ret);
if (ret)
{
Gv_SetVarX(intxvar, intx);
Gv_SetVarX(intyvar, inty);
Gv_SetVarX(intzvar, intz);
}
continue;
}
case CON_CLIPMOVE:
insptr++;
{
vec3_t vect;
int32_t retvar=*insptr++, xvar=*insptr++, yvar=*insptr++, z=Gv_GetVarX(*insptr++), sectnumvar=*insptr++;
int32_t xvect=Gv_GetVarX(*insptr++), yvect=Gv_GetVarX(*insptr++);
int32_t walldist=Gv_GetVarX(*insptr++), floordist=Gv_GetVarX(*insptr++), ceildist=Gv_GetVarX(*insptr++);
int32_t clipmask=Gv_GetVarX(*insptr++);
int16_t sectnum;
vect.x = Gv_GetVarX(xvar);
vect.y = Gv_GetVarX(yvar);
vect.z = z;
sectnum = Gv_GetVarX(sectnumvar);
if ((sectnum<0 || sectnum>=numsectors))
{
OSD_Printf(CON_ERROR "Invalid sector %d\n",g_errorLineNum,keyw[g_tw],sectnum);
Gv_SetVarX(retvar, 0);
continue;
}
Gv_SetVarX(retvar, clipmove(&vect, &sectnum, xvect, yvect, walldist, floordist, ceildist, clipmask));
Gv_SetVarX(sectnumvar, sectnum);
Gv_SetVarX(xvar, vect.x);
Gv_SetVarX(yvar, vect.y);
continue;
}
case CON_HITSCAN: case CON_HITSCAN:
insptr++; insptr++;
{ {

View file

@ -244,6 +244,7 @@ const char *keyw[] =
"divscale", "divscale",
"dist", "dist",
"ldist", "ldist",
"calchypotenuse",
"getangle", "getangle",
"getincangle", "getincangle",
"a2xy", "a2xy",
@ -316,6 +317,9 @@ const char *keyw[] =
"updatesector", "updatesector",
"updatesectorz", "updatesectorz",
"getzrange", "getzrange",
"clipmove",
"lineintersect",
"rayintersect",
"hitscan", "hitscan",
"cansee", "cansee",
"canseespr", "canseespr",
@ -3018,6 +3022,27 @@ repeatcase:
C_GetManyVars(2); C_GetManyVars(2);
break; break;
case CON_CALCHYPOTENUSE:
C_GetNextVarType(GAMEVAR_READONLY);
C_GetManyVars(2);
break;
case CON_CLIPMOVE:
// <retvar>,<x>,<y>,z,<sectnum>, xvect,yvect,walldist,floordist,ceildist,clipmask
C_GetManyVarsType(GAMEVAR_READONLY,3);
C_GetNextVar();
C_GetNextVarType(GAMEVAR_READONLY);
C_GetManyVars(6);
break;
case CON_LINEINTERSECT:
case CON_RAYINTERSECT:
// lineintersect x y z x y z x y x y <intx> <inty> <intz> <ret>
// rayintersect x y z vx vy vz x y x y <intx> <inty> <intz> <ret>
C_GetManyVars(10);
C_GetManyVarsType(GAMEVAR_READONLY,4);
break;
case CON_HITSCAN: case CON_HITSCAN:
case CON_CANSEE: case CON_CANSEE:
// get the ID of the DEF // get the ID of the DEF

View file

@ -330,6 +330,7 @@ enum ScriptKeywords_t
CON_DIVSCALE, CON_DIVSCALE,
CON_DIST, CON_DIST,
CON_LDIST, CON_LDIST,
CON_CALCHYPOTENUSE,
CON_GETANGLE, CON_GETANGLE,
CON_GETINCANGLE, CON_GETINCANGLE,
CON_A2XY, CON_A2XY,
@ -414,6 +415,9 @@ enum ScriptKeywords_t
CON_UPDATESECTOR, CON_UPDATESECTOR,
CON_UPDATESECTORZ, CON_UPDATESECTORZ,
CON_GETZRANGE, CON_GETZRANGE,
CON_CLIPMOVE,
CON_LINEINTERSECT,
CON_RAYINTERSECT,
CON_HITSCAN, CON_HITSCAN,
CON_CANSEE, CON_CANSEE,
CON_CANSEESPR, CON_CANSEESPR,

View file

@ -1741,6 +1741,72 @@ badindex:
continue; continue;
} }
case CON_CALCHYPOTENUSE:
insptr++;
{
int32_t retvar=*insptr++;
int64_t dax=Gv_GetVarX(*insptr++), day=Gv_GetVarX(*insptr++);
int64_t hypsq = dax*dax + day*day;
if (hypsq > (int64_t)INT_MAX)
Gv_SetVarX(retvar, (int32_t)sqrt((double)hypsq));
else
Gv_SetVarX(retvar, ksqrt((int32_t)hypsq));
continue;
}
case CON_LINEINTERSECT:
case CON_RAYINTERSECT:
insptr++;
{
int32_t x1=Gv_GetVarX(*insptr++), y1=Gv_GetVarX(*insptr++), z1=Gv_GetVarX(*insptr++);
int32_t x2=Gv_GetVarX(*insptr++), y2=Gv_GetVarX(*insptr++), z2=Gv_GetVarX(*insptr++);
int32_t x3=Gv_GetVarX(*insptr++), y3=Gv_GetVarX(*insptr++), x4=Gv_GetVarX(*insptr++), y4=Gv_GetVarX(*insptr++);
int32_t intxvar=*insptr++, intyvar=*insptr++, intzvar=*insptr++, retvar=*insptr++;
int32_t intx, inty, intz, ret;
if (tw==CON_LINEINTERSECT)
ret = lineintersect(x1, y1, z1, x2, y2, z2, x3, y3, x4, y4, &intx, &inty, &intz);
else
ret = rayintersect(x1, y1, z1, x2, y2, z2, x3, y3, x4, y4, &intx, &inty, &intz);
Gv_SetVarX(retvar, ret);
if (ret)
{
Gv_SetVarX(intxvar, intx);
Gv_SetVarX(intyvar, inty);
Gv_SetVarX(intzvar, intz);
}
continue;
}
case CON_CLIPMOVE:
insptr++;
{
vec3_t vect;
int32_t retvar=*insptr++, xvar=*insptr++, yvar=*insptr++, z=Gv_GetVarX(*insptr++), sectnumvar=*insptr++;
int32_t xvect=Gv_GetVarX(*insptr++), yvect=Gv_GetVarX(*insptr++);
int32_t walldist=Gv_GetVarX(*insptr++), floordist=Gv_GetVarX(*insptr++), ceildist=Gv_GetVarX(*insptr++);
int32_t clipmask=Gv_GetVarX(*insptr++);
int16_t sectnum;
vect.x = Gv_GetVarX(xvar);
vect.y = Gv_GetVarX(yvar);
vect.z = z;
sectnum = Gv_GetVarX(sectnumvar);
X_ERROR_INVALIDSECT(sectnum);
Gv_SetVarX(retvar, clipmove(&vect, &sectnum, xvect, yvect, walldist, floordist, ceildist, clipmask));
Gv_SetVarX(sectnumvar, sectnum);
Gv_SetVarX(xvar, vect.x);
Gv_SetVarX(yvar, vect.y);
continue;
}
case CON_HITSCAN: case CON_HITSCAN:
insptr++; insptr++;
{ {

View file

@ -136,7 +136,7 @@ int32_t MUSIC_Init(int32_t SoundCard, int32_t Address)
if (external_midi) if (external_midi)
{ {
initprintf("Setting music command to `%s'.\n", command); initprintf("Setting music command to \"%s\".\n", command);
#if defined _WIN32 #if defined _WIN32
if (Mix_SetMusicCMD(command)==-1) if (Mix_SetMusicCMD(command)==-1)