diff --git a/source/duke3d/src/gamedef.cpp b/source/duke3d/src/gamedef.cpp index f06a30ee7..3b2c5a0a9 100644 --- a/source/duke3d/src/gamedef.cpp +++ b/source/duke3d/src/gamedef.cpp @@ -676,6 +676,7 @@ static const vec2_t varvartable[] = { CON_XORVARVAR, CON_XORVAR }, }; +#ifdef CON_DISCRETE_VAR_ACCESS static const vec2_t globalvartable[] = { { CON_IFVARA, CON_IFVARA_GLOBAL }, @@ -710,7 +711,6 @@ static const vec2_t globalvartable[] = { CON_XORVAR, CON_XORVAR_GLOBAL }, }; -#ifdef INCOMPLETE_STRUCT_ACCESS static const vec2_t playervartable[] = { { CON_IFVARA, CON_IFVARA_PLAYER }, @@ -781,16 +781,16 @@ static const vec2_t actorvartable[] = #endif static inthashtable_t h_varvar = { NULL, INTHASH_SIZE(ARRAY_SIZE(varvartable)) }; +#ifdef CON_DISCRETE_VAR_ACCESS static inthashtable_t h_globalvar = { NULL, INTHASH_SIZE(ARRAY_SIZE(globalvartable)) }; -#ifdef INCOMPLETE_STRUCT_ACCESS static inthashtable_t h_playervar = { NULL, INTHASH_SIZE(ARRAY_SIZE(playervartable)) }; static inthashtable_t h_actorvar = { NULL, INTHASH_SIZE(ARRAY_SIZE(actorvartable)) }; #endif static inthashtable_t *const inttables[] = { &h_varvar, +#ifdef CON_DISCRETE_VAR_ACCESS &h_globalvar, -#ifdef INCOMPLETE_STRUCT_ACCESS &h_playervar, &h_actorvar, #endif @@ -2442,6 +2442,7 @@ static void scriptUpdateOpcodeForVariableType(intptr_t *ins) { int opcode = -1; +#ifdef CON_DISCRETE_VAR_ACCESS if (ins[1] < MAXGAMEVARS) { switch (aGameVars[ins[1] & (MAXGAMEVARS - 1)].flags & (GAMEVAR_USER_MASK | GAMEVAR_PTR_MASK)) @@ -2449,16 +2450,15 @@ static void scriptUpdateOpcodeForVariableType(intptr_t *ins) case 0: opcode = inthash_find(&h_globalvar, *ins & VM_INSTMASK); break; -#ifdef INCOMPLETE_STRUCT_ACCESS case GAMEVAR_PERACTOR: opcode = inthash_find(&h_actorvar, *ins & VM_INSTMASK); break; case GAMEVAR_PERPLAYER: opcode = inthash_find(&h_playervar, *ins & VM_INSTMASK); break; -#endif } } +#endif if (opcode != -1) { @@ -6158,10 +6158,10 @@ void scriptInitTables() for (auto &varvar : varvartable) inthash_add(&h_varvar, varvar.x, varvar.y, 0); +#ifdef CON_DISCRETE_VAR_ACCESS for (auto &globalvar : globalvartable) inthash_add(&h_globalvar, globalvar.x, globalvar.y, 0); -#ifdef INCOMPLETE_STRUCT_ACCESS for (auto &playervar : playervartable) inthash_add(&h_playervar, playervar.x, playervar.y, 0); diff --git a/source/duke3d/src/gamedef.h b/source/duke3d/src/gamedef.h index eb2e567d9..548d2d071 100644 --- a/source/duke3d/src/gamedef.h +++ b/source/duke3d/src/gamedef.h @@ -23,6 +23,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #ifndef gamedef_h_ #define gamedef_h_ +// #define CON_DISCRETE_VAR_ACCESS + #include "actors.h" #include "build.h" // hashtable_t #include "cheats.h" @@ -846,7 +848,8 @@ enum IterationTypes_t // most keywords have opcodes but some opcodes don't have keywords #define TRANSFORM_SCRIPT_KEYWORDS_LIST(TRANSFORM, DELIMITER) \ - \ +/* CON_DISCRETE_VAR_ACCESS \ + TRANSFORM(CON_IFVARA_GLOBAL) DELIMITER \ TRANSFORM(CON_IFVARAE_GLOBAL) DELIMITER \ TRANSFORM(CON_IFVARAND_GLOBAL) DELIMITER \ @@ -878,7 +881,6 @@ enum IterationTypes_t TRANSFORM(CON_WHILEVARN_GLOBAL) DELIMITER \ TRANSFORM(CON_XORVAR_GLOBAL) DELIMITER \ \ - /* INCOMPLETE_STRUCT_ACCESS TRANSFORM(CON_IFVARA_PLAYER) DELIMITER \ TRANSFORM(CON_IFVARAE_PLAYER) DELIMITER \ TRANSFORM(CON_IFVARAND_PLAYER) DELIMITER \ @@ -940,8 +942,7 @@ enum IterationTypes_t TRANSFORM(CON_WHILEVARL_ACTOR) DELIMITER \ TRANSFORM(CON_WHILEVARN_ACTOR) DELIMITER \ TRANSFORM(CON_XORVAR_ACTOR) DELIMITER \ - */ \ - \ +*/ \ TRANSFORM(CON_IFVARVARA) DELIMITER \ TRANSFORM(CON_IFVARVARAE) DELIMITER \ TRANSFORM(CON_IFVARVARAND) DELIMITER \ diff --git a/source/duke3d/src/gameexec.cpp b/source/duke3d/src/gameexec.cpp index dc39d8550..3d49cd8d3 100644 --- a/source/duke3d/src/gameexec.cpp +++ b/source/duke3d/src/gameexec.cpp @@ -1270,6 +1270,7 @@ void Screen_Play(void) #if defined __GNUC__ || defined __clang__ # define CON_DIRECT_THREADING_DISPATCH #endif + #ifdef CON_DIRECT_THREADING_DISPATCH # define vInstruction(KEYWORDID) VINST_ ## KEYWORDID # define eval(INSTRUCTION) {if ((unsigned)INSTRUCTION <= CON_OPCODE_END) {goto *jumpTable[INSTRUCTION];} goto VINST_CON_OPCODE_END;} @@ -1343,7 +1344,16 @@ GAMEEXEC_STATIC void VM_Execute(native_t const poop) dispatch_unconditionally(); } #endif + vInstruction(CON_STATE): + { + auto tempscrptr = &insptr[2]; + insptr = (intptr_t *)insptr[1]; + VM_Execute(1); + insptr = tempscrptr; + } + dispatch(); +#ifdef CON_DISCRETE_VAR_ACCESS vInstruction(CON_IFVARE_GLOBAL): insptr++; tw = aGameVars[*insptr++].global; @@ -1465,16 +1475,7 @@ GAMEEXEC_STATIC void VM_Execute(native_t const poop) aGameVars[*insptr].global >>= insptr[1]; insptr += 2; dispatch(); - vInstruction(CON_STATE): - { - auto tempscrptr = &insptr[2]; - insptr = (intptr_t *)insptr[1]; - VM_Execute(1); - insptr = tempscrptr; - } - dispatch(); -#ifdef INCOMPLETE_STRUCT_ACCESS vInstruction(CON_IFVARE_ACTOR): insptr++; tw = aGameVars[*insptr++].pValues[vm.spriteNum & (MAXSPRITES-1)]; @@ -1718,7 +1719,6 @@ GAMEEXEC_STATIC void VM_Execute(native_t const poop) aGameVars[*insptr].pValues[vm.playerNum & (MAXPLAYERS-1)] >>= insptr[1]; insptr += 2; dispatch(); -#endif vInstruction(CON_WHILEVARN_GLOBAL): { @@ -1744,7 +1744,6 @@ GAMEEXEC_STATIC void VM_Execute(native_t const poop) dispatch(); } -#ifdef INCOMPLETE_STRUCT_ACCESS vInstruction(CON_WHILEVARN_ACTOR): { auto const savedinsptr = &insptr[2]; @@ -1800,14 +1799,12 @@ GAMEEXEC_STATIC void VM_Execute(native_t const poop) dispatch(); } -#endif vInstruction(CON_MODVAR_GLOBAL): insptr++; aGameVars[*insptr].global %= insptr[1]; insptr += 2; dispatch(); -#ifdef INCOMPLETE_STRUCT_ACCESS vInstruction(CON_MODVAR_ACTOR): insptr++; aGameVars[*insptr].pValues[vm.spriteNum & (MAXSPRITES-1)] %= insptr[1]; @@ -1963,13 +1960,13 @@ GAMEEXEC_STATIC void VM_Execute(native_t const poop) Gv_MulVar(tw, Gv_GetVarX(*insptr++)); dispatch(); +#ifdef CON_DISCRETE_VAR_ACCESS vInstruction(CON_DIVVAR_GLOBAL): insptr++; aGameVars[*insptr].global = tabledivide32(aGameVars[*insptr].global, insptr[1]); insptr += 2; dispatch(); -#ifdef INCOMPLETE_STRUCT_ACCESS vInstruction(CON_DIVVAR_PLAYER): { insptr++; @@ -2281,13 +2278,13 @@ GAMEEXEC_STATIC void VM_Execute(native_t const poop) insptr += 2; dispatch(); +#ifdef CON_DISCRETE_VAR_ACCESS vInstruction(CON_RANDVAR_GLOBAL): insptr++; aGameVars[*insptr].global = mulscale16(krand(), insptr[1] + 1); insptr += 2; dispatch(); -#ifdef INCOMPLETE_STRUCT_ACCESS vInstruction(CON_RANDVAR_PLAYER): insptr++; aGameVars[*insptr].pValues[vm.playerNum & (MAXPLAYERS-1)] = mulscale16(krand(), insptr[1] + 1);