diff --git a/polymer/eduke32/build/include/build.h b/polymer/eduke32/build/include/build.h index 1d1678757..6ad212dd4 100644 --- a/polymer/eduke32/build/include/build.h +++ b/polymer/eduke32/build/include/build.h @@ -536,6 +536,12 @@ int32_t insertspritestat(int16_t statnum); int32_t deletespritesect(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) { insertspritestat(statnum); diff --git a/polymer/eduke32/build/include/editor.h b/polymer/eduke32/build/include/editor.h index d8c33bf1b..eeb4b895b 100644 --- a/polymer/eduke32/build/include/editor.h +++ b/polymer/eduke32/build/include/editor.h @@ -139,14 +139,22 @@ void test_map(int32_t mode); static inline int32_t wallength(int16_t i) { - int32_t dax = POINT2(i).x - wall[i].x; - int32_t day = POINT2(i).y - wall[i].y; + int64_t dax = POINT2(i).x - wall[i].x; + 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); +#endif } #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 int32_t scripthistend; diff --git a/polymer/eduke32/build/src/engine.c b/polymer/eduke32/build/src/engine.c index f035a339a..4557a41c2 100644 --- a/polymer/eduke32/build/src/engine.c +++ b/polymer/eduke32/build/src/engine.c @@ -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) // @@ -5388,6 +5394,11 @@ static inline int32_t rintersect(int32_t x1, int32_t y1, int32_t z1, int32_t vx, 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) diff --git a/polymer/eduke32/m32help.hlp b/polymer/eduke32/m32help.hlp index 5182e798d..57d0454d7 100644 --- a/polymer/eduke32/m32help.hlp +++ b/polymer/eduke32/m32help.hlp @@ -389,7 +389,7 @@ RIGHT smooth scrolling 31 : Two-Way Train (SE 30) 10+++ : One-Time Sound 32767 : Secret Room - 65534 : End Of Level with Message + 65534 : End Of Level with Message (sector hitag: sound #) 65535 : End Of Level ^P ^3SE 0/1: ROTATED SECTOR @@ -546,11 +546,13 @@ RIGHT smooth scrolling Hi = tile #4890 Hi ^3^0SE 29: WAVES -^0 (...) -^0 Hi: start height (min. height?) -^0 GPSPEED Lo: start height (?) (phase?) + Hi: start height (phase) + GPSPEED Lo: amplitude (default: 256) -^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 Foreground colors: ^0,15 0 ^1,0 1 ^2 2 ^3 3 ^4 4 ^5 5 ^6 6 ^7 7 diff --git a/polymer/eduke32/source/actors.c b/polymer/eduke32/source/actors.c index ca75d7885..a002bcb49 100644 --- a/polymer/eduke32/source/actors.c +++ b/polymer/eduke32/source/actors.c @@ -600,7 +600,7 @@ void A_DoGutsDir(int32_t sp, int32_t gtype, int32_t n) 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= 0) + k = wall[j].nextwall; + if (k >= 0) { - G_StopInterpolation(&wall[wall[j].nextwall].x); - G_StopInterpolation(&wall[wall[j].nextwall].y); + G_StopInterpolation(&wall[k].x); + G_StopInterpolation(&wall[k].y); + k = wall[k].point2; + G_StopInterpolation(&wall[k].x); + G_StopInterpolation(&wall[k].y); } } } diff --git a/polymer/eduke32/source/astub.c b/polymer/eduke32/source/astub.c index d44623b1b..294968181 100644 --- a/polymer/eduke32/source/astub.c +++ b/polymer/eduke32/source/astub.c @@ -3086,7 +3086,7 @@ static int32_t m32gettile(int32_t idInitialTile) // // 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 @@ -5509,6 +5509,12 @@ static void Keys3d(void) // 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 { shadepreview = !shadepreview; @@ -7887,12 +7893,28 @@ static int32_t osdcmd_do(const osdfuncparm_t *parm) if (!(vm.flags&VMFLAG_ERROR)) { - if (scripthist[scripthistend]) - Bfree((void *)scripthist[scripthistend]); + int32_t idx, dosave=1; - scripthist[scripthistend] = Bstrdup(parm->raw); - scripthistend++; - scripthistend %= SCRIPTHISTSIZ; + for (i=1; i<=4; i++) + { + 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) } @@ -8124,7 +8146,6 @@ void GAME_clearbackground(int32_t numcols, int32_t numrows) CLEARLINES2D(0, min(ydim, numrows*8+8), editorcolors[16]); } - static void m32_osdsetfunctions() { OSD_SetFunctions( @@ -8140,6 +8161,7 @@ static void m32_osdsetfunctions() ); } + #endif enum @@ -9015,7 +9037,7 @@ int32_t ExtInit(void) Bstrcpy(apptitle, "Mapster32"VERSION BUILDDATE); autosavetimer = totalclock+120*autosave; -#if defined(_WIN32) && defined(DUKEOSD) +#if defined(DUKEOSD) m32_osdsetfunctions(); #endif @@ -9457,6 +9479,13 @@ void ExtAnalyzeSprites(void) tspr->xrepeat=0; } + if (showinvisibility && (tspr->cstat&32768)) + { + tspr->pal = 6; + tspr->cstat &= ~32768; + tspr->cstat |= 2+512; + } + if (shadepreview && !(tspr->cstat & 16)) { if (sector[tspr->sectnum].ceilingstat&1) @@ -9700,7 +9729,7 @@ static void Keys2d3d(void) { getmessageleng = 0; getmessagetimeoff = 0; -#if defined(_WIN32) && defined(DUKEOSD) +#if defined(DUKEOSD) m32_osdsetfunctions(); #endif } @@ -10546,7 +10575,7 @@ static void EditSpriteData(int16_t spritenum) if (editval) { 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; diff --git a/polymer/eduke32/source/game.c b/polymer/eduke32/source/game.c index f7d68f45d..e1b89fd54 100644 --- a/polymer/eduke32/source/game.c +++ b/polymer/eduke32/source/game.c @@ -7733,6 +7733,7 @@ static void G_ShowDebugHelp(void) "-ns/-nm\t\tDisable sound or music\n" "-q#\t\tFake multiplayer with # (2-8) players\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 Bsnprintf(tempbuf, sizeof(tempbuf), HEAD2 " %s", s_buildDate); @@ -8321,6 +8322,23 @@ static void G_CheckCommandLine(int32_t argc, const char **argv) i++; 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")) { g_noLogo = 1; diff --git a/polymer/eduke32/source/gamedef.c b/polymer/eduke32/source/gamedef.c index b0003f1d2..f64961fc2 100644 --- a/polymer/eduke32/source/gamedef.c +++ b/polymer/eduke32/source/gamedef.c @@ -32,7 +32,55 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #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 +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 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); } -#define NUMKEYWORDS (int32_t)(sizeof(keyw)/sizeof(keyw[0])) const char *keyw[] = { @@ -503,6 +550,12 @@ const char *keyw[] = "stopactorsound", // 350 "ifclient", // 351 "ifserver", // 352 + "sectsetinterpolation", // 353 + "sectclearinterpolation", // 354 + "clipmove", // 355 + "lineintersect", // 356 + "rayintersect", // 357 + "calchypotenuse", // 358 "" }; @@ -997,7 +1050,24 @@ void C_InitHashes() hash_init(&actorH); 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(§orH,SectorLabels[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); @@ -4397,6 +4467,32 @@ static int32_t C_ParseCommand(void) C_GetManyVars(2); break; + case CON_SECTSETINTERPOLATION: + case CON_SECTCLEARINTERPOLATION: + C_GetNextVar(); + break; + + case CON_CLIPMOVE: + // ,,,z,, 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 + // rayintersect x y z vx vy vz x y x y + C_GetManyVars(10); + C_GetManyVarsType(GAMEVAR_READONLY,4); + break; + case CON_HITSCAN: case CON_CANSEE: // get the ID of the DEF diff --git a/polymer/eduke32/source/gamedef.h b/polymer/eduke32/source/gamedef.h index 3b4d3a15c..931562c26 100644 --- a/polymer/eduke32/source/gamedef.h +++ b/polymer/eduke32/source/gamedef.h @@ -69,6 +69,7 @@ extern char g_szScriptFileName[BMAX_PATH]; extern int32_t g_totalLines,g_lineNumber; extern int32_t g_numCompilerErrors,g_numCompilerWarnings,g_numQuoteRedefinitions; extern int32_t g_scriptVersion; +extern uint32_t g_scriptDateVersion; // YYYYMMDD extern char g_szBuf[1024]; extern intptr_t *g_scriptPtr; @@ -925,6 +926,12 @@ enum ScriptKeywords_t CON_STOPACTORSOUND, // 350 CON_IFCLIENT, // 351 CON_IFSERVER, // 352 + CON_SECTSETINTERPOLATION, // 353 + CON_SECTCLEARINTERPOLATION, // 354 + CON_CLIPMOVE, // 355 + CON_LINEINTERSECT, // 356 + CON_RAYINTERSECT, // 357 + CON_CALCHYPOTENUSE, // 358 CON_END }; #endif diff --git a/polymer/eduke32/source/gameexec.c b/polymer/eduke32/source/gameexec.c index 45cebaf6c..cf1568938 100644 --- a/polymer/eduke32/source/gameexec.c +++ b/polymer/eduke32/source/gameexec.c @@ -2479,6 +2479,100 @@ nullquote: 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, §num, xvect, yvect, walldist, floordist, ceildist, clipmask)); + Gv_SetVarX(sectnumvar, sectnum); + Gv_SetVarX(xvar, vect.x); + Gv_SetVarX(yvar, vect.y); + + continue; + } + case CON_HITSCAN: insptr++; { diff --git a/polymer/eduke32/source/global.c b/polymer/eduke32/source/global.c index 7701afd14..103bf3fea 100644 --- a/polymer/eduke32/source/global.c +++ b/polymer/eduke32/source/global.c @@ -189,4 +189,4 @@ char setupfilename[BMAX_PATH]= SETUPFILENAME; int32_t g_doQuickSave = 0; uint32_t g_moveThingsCount = 0; -int32_t g_restorePalette = 0, g_screenCapture = 0, g_noEnemies = 0; \ No newline at end of file +int32_t g_restorePalette = 0, g_screenCapture = 0, g_noEnemies = 0; diff --git a/polymer/eduke32/source/m32def.c b/polymer/eduke32/source/m32def.c index e525f4595..e087ec55e 100644 --- a/polymer/eduke32/source/m32def.c +++ b/polymer/eduke32/source/m32def.c @@ -244,6 +244,7 @@ const char *keyw[] = "divscale", "dist", "ldist", + "calchypotenuse", "getangle", "getincangle", "a2xy", @@ -316,6 +317,9 @@ const char *keyw[] = "updatesector", "updatesectorz", "getzrange", + "clipmove", + "lineintersect", + "rayintersect", "hitscan", "cansee", "canseespr", @@ -3018,6 +3022,27 @@ repeatcase: C_GetManyVars(2); break; + case CON_CALCHYPOTENUSE: + C_GetNextVarType(GAMEVAR_READONLY); + C_GetManyVars(2); + break; + + case CON_CLIPMOVE: + // ,,,z,, 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 + // rayintersect x y z vx vy vz x y x y + C_GetManyVars(10); + C_GetManyVarsType(GAMEVAR_READONLY,4); + break; + case CON_HITSCAN: case CON_CANSEE: // get the ID of the DEF diff --git a/polymer/eduke32/source/m32def.h b/polymer/eduke32/source/m32def.h index ab56bc196..2ff367d1d 100644 --- a/polymer/eduke32/source/m32def.h +++ b/polymer/eduke32/source/m32def.h @@ -330,6 +330,7 @@ enum ScriptKeywords_t CON_DIVSCALE, CON_DIST, CON_LDIST, + CON_CALCHYPOTENUSE, CON_GETANGLE, CON_GETINCANGLE, CON_A2XY, @@ -414,6 +415,9 @@ enum ScriptKeywords_t CON_UPDATESECTOR, CON_UPDATESECTORZ, CON_GETZRANGE, + CON_CLIPMOVE, + CON_LINEINTERSECT, + CON_RAYINTERSECT, CON_HITSCAN, CON_CANSEE, CON_CANSEESPR, diff --git a/polymer/eduke32/source/m32exec.c b/polymer/eduke32/source/m32exec.c index 21a5ff398..d160ae48f 100644 --- a/polymer/eduke32/source/m32exec.c +++ b/polymer/eduke32/source/m32exec.c @@ -1741,6 +1741,72 @@ badindex: 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, §num, xvect, yvect, walldist, floordist, ceildist, clipmask)); + Gv_SetVarX(sectnumvar, sectnum); + Gv_SetVarX(xvar, vect.x); + Gv_SetVarX(yvar, vect.y); + + continue; + } + case CON_HITSCAN: insptr++; { diff --git a/polymer/eduke32/source/sdlmusic.c b/polymer/eduke32/source/sdlmusic.c index 0d038e0e8..76f7de51d 100644 --- a/polymer/eduke32/source/sdlmusic.c +++ b/polymer/eduke32/source/sdlmusic.c @@ -136,7 +136,7 @@ int32_t MUSIC_Init(int32_t SoundCard, int32_t Address) if (external_midi) { - initprintf("Setting music command to `%s'.\n", command); + initprintf("Setting music command to \"%s\".\n", command); #if defined _WIN32 if (Mix_SetMusicCMD(command)==-1)