mirror of
https://github.com/ZDoom/raze-gles.git
synced 2025-01-12 11:10:39 +00:00
CON VM maintenance
git-svn-id: https://svn.eduke32.com/eduke32@7658 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
parent
7659e816fa
commit
efa3022d07
5 changed files with 87 additions and 99 deletions
|
@ -165,7 +165,7 @@ void G_OpenDemoWrite(void)
|
||||||
for (i=1; i<g_scriptSize-2; i++)
|
for (i=1; i<g_scriptSize-2; i++)
|
||||||
{
|
{
|
||||||
intptr_t w=apScript[i];
|
intptr_t w=apScript[i];
|
||||||
if ((w&0x0fff)==CON_RESIZEARRAY && (w>>12) && apScript[i+1]>=0 && apScript[i+1]<g_gameArrayCount)
|
if (VM_DECODE_INST(w)==CON_RESIZEARRAY && VM_DECODE_LINE_NUMBER(w) && apScript[i+1]>=0 && apScript[i+1]<g_gameArrayCount)
|
||||||
{
|
{
|
||||||
OSD_Printf("\nThe CON code possibly contains a RESIZEARRAY command.\n");
|
OSD_Printf("\nThe CON code possibly contains a RESIZEARRAY command.\n");
|
||||||
OSD_Printf("Gamearrays that change their size during the game are unsupported by\n");
|
OSD_Printf("Gamearrays that change their size during the game are unsupported by\n");
|
||||||
|
|
|
@ -999,9 +999,6 @@ hashtable_t h_arrays = { MAXGAMEARRAYS >> 1, NULL };
|
||||||
hashtable_t h_gamevars = { MAXGAMEVARS >> 1, NULL };
|
hashtable_t h_gamevars = { MAXGAMEVARS >> 1, NULL };
|
||||||
hashtable_t h_labels = { 11264 >> 1, NULL };
|
hashtable_t h_labels = { 11264 >> 1, NULL };
|
||||||
|
|
||||||
// "magic" number for { and }, overrides line number in compiled code for later detection
|
|
||||||
#define IFELSE_MAGIC 31337
|
|
||||||
|
|
||||||
static void C_SetScriptSize(int32_t newsize)
|
static void C_SetScriptSize(int32_t newsize)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < g_scriptSize - 1; ++i)
|
for (int i = 0; i < g_scriptSize - 1; ++i)
|
||||||
|
@ -1270,7 +1267,7 @@ static int C_GetNextKeyword(void) //Returns its code #
|
||||||
if (EDUKE32_PREDICT_TRUE((i = hash_find(&h_keywords,tempbuf)) >= 0))
|
if (EDUKE32_PREDICT_TRUE((i = hash_find(&h_keywords,tempbuf)) >= 0))
|
||||||
{
|
{
|
||||||
if (i == CON_LEFTBRACE || i == CON_RIGHTBRACE || i == CON_NULLOP)
|
if (i == CON_LEFTBRACE || i == CON_RIGHTBRACE || i == CON_NULLOP)
|
||||||
scriptWriteValue(i | (IFELSE_MAGIC<<12));
|
scriptWriteValue(i | (VM_IFELSE_MAGIC<<12));
|
||||||
else scriptWriteValue(i | LINE_NUMBER);
|
else scriptWriteValue(i | LINE_NUMBER);
|
||||||
|
|
||||||
textptr += l;
|
textptr += l;
|
||||||
|
@ -1843,7 +1840,7 @@ static bool C_CheckEmptyBranch(int tw, intptr_t lastScriptPtr)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((*(g_scriptPtr) & VM_INSTMASK) != CON_NULLOP || *(g_scriptPtr)>>12 != IFELSE_MAGIC)
|
if ((*(g_scriptPtr) & VM_INSTMASK) != CON_NULLOP || *(g_scriptPtr)>>12 != VM_IFELSE_MAGIC)
|
||||||
g_skipBranch = false;
|
g_skipBranch = false;
|
||||||
|
|
||||||
if (EDUKE32_PREDICT_FALSE(g_skipBranch))
|
if (EDUKE32_PREDICT_FALSE(g_skipBranch))
|
||||||
|
@ -1853,7 +1850,7 @@ static bool C_CheckEmptyBranch(int tw, intptr_t lastScriptPtr)
|
||||||
g_scriptPtr = lastScriptPtr + apScript;
|
g_scriptPtr = lastScriptPtr + apScript;
|
||||||
initprintf("%s:%d: warning: empty `%s' branch\n",g_scriptFileName,g_lineNumber,
|
initprintf("%s:%d: warning: empty `%s' branch\n",g_scriptFileName,g_lineNumber,
|
||||||
VM_GetKeywordForID(*(g_scriptPtr) & VM_INSTMASK));
|
VM_GetKeywordForID(*(g_scriptPtr) & VM_INSTMASK));
|
||||||
scriptWriteAtOffset(CON_NULLOP | (IFELSE_MAGIC<<12), g_scriptPtr);
|
scriptWriteAtOffset(CON_NULLOP | (VM_IFELSE_MAGIC<<12), g_scriptPtr);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5011,11 +5008,11 @@ repeatcase:
|
||||||
case CON_RIGHTBRACE:
|
case CON_RIGHTBRACE:
|
||||||
g_numBraces--;
|
g_numBraces--;
|
||||||
|
|
||||||
if ((g_scriptPtr[-2]>>12) == (IFELSE_MAGIC) &&
|
if ((g_scriptPtr[-2]>>12) == (VM_IFELSE_MAGIC) &&
|
||||||
((g_scriptPtr[-2] & VM_INSTMASK) == CON_LEFTBRACE)) // rewrite "{ }" into "nullop"
|
((g_scriptPtr[-2] & VM_INSTMASK) == CON_LEFTBRACE)) // rewrite "{ }" into "nullop"
|
||||||
{
|
{
|
||||||
// initprintf("%s:%d: rewriting empty braces '{ }' as 'nullop' from right\n",g_szScriptFileName,g_lineNumber);
|
// initprintf("%s:%d: rewriting empty braces '{ }' as 'nullop' from right\n",g_szScriptFileName,g_lineNumber);
|
||||||
g_scriptPtr[-2] = CON_NULLOP | (IFELSE_MAGIC<<12);
|
g_scriptPtr[-2] = CON_NULLOP | (VM_IFELSE_MAGIC<<12);
|
||||||
g_scriptPtr -= 2;
|
g_scriptPtr -= 2;
|
||||||
|
|
||||||
if (C_GetKeyword() != CON_ELSE && (g_scriptPtr[-2] & VM_INSTMASK) != CON_ELSE)
|
if (C_GetKeyword() != CON_ELSE && (g_scriptPtr[-2] & VM_INSTMASK) != CON_ELSE)
|
||||||
|
|
|
@ -57,8 +57,11 @@ enum
|
||||||
#define LABEL_READFUNC 64
|
#define LABEL_READFUNC 64
|
||||||
#define LABEL_WRITEFUNC 128
|
#define LABEL_WRITEFUNC 128
|
||||||
|
|
||||||
|
// "magic" number for { and }, overrides line number in compiled code for later detection
|
||||||
|
#define VM_IFELSE_MAGIC 31337
|
||||||
#define VM_INSTMASK 0xfff
|
#define VM_INSTMASK 0xfff
|
||||||
|
#define VM_DECODE_INST(xxx) ((int)((xxx) & VM_INSTMASK))
|
||||||
|
#define VM_DECODE_LINE_NUMBER(xxx) ((int)((xxx) >> 12))
|
||||||
#define C_CUSTOMERROR(Text, ...) \
|
#define C_CUSTOMERROR(Text, ...) \
|
||||||
do \
|
do \
|
||||||
{ \
|
{ \
|
||||||
|
|
|
@ -50,7 +50,6 @@ vmstate_t vm;
|
||||||
|
|
||||||
#if !defined LUNATIC
|
#if !defined LUNATIC
|
||||||
int32_t g_tw;
|
int32_t g_tw;
|
||||||
int32_t g_errorLineNum;
|
|
||||||
int32_t g_currentEvent = -1;
|
int32_t g_currentEvent = -1;
|
||||||
|
|
||||||
intptr_t const *insptr;
|
intptr_t const *insptr;
|
||||||
|
@ -92,9 +91,11 @@ void VM_ScriptInfo(intptr_t const * const ptr, int const range)
|
||||||
initprintf("%5d: %3d: ", (int32_t)(pScript - apScript), (int32_t)(pScript - ptr));
|
initprintf("%5d: %3d: ", (int32_t)(pScript - apScript), (int32_t)(pScript - ptr));
|
||||||
|
|
||||||
auto &v = *pScript;
|
auto &v = *pScript;
|
||||||
|
int const lineNum = VM_DECODE_LINE_NUMBER(v);
|
||||||
|
int const vmInst = VM_DECODE_INST(v);
|
||||||
|
|
||||||
if (v >> 12 && (v & VM_INSTMASK) < CON_OPCODE_END)
|
if (lineNum && lineNum != VM_IFELSE_MAGIC && vmInst < CON_OPCODE_END)
|
||||||
initprintf("%5d %s (%d)\n", (int32_t)(v >> 12), VM_GetKeywordForID(v & VM_INSTMASK), (int)v & VM_INSTMASK);
|
initprintf("%5d %s (%d)\n", lineNum, VM_GetKeywordForID(vmInst), vmInst);
|
||||||
else
|
else
|
||||||
initprintf("%d\n", (int32_t)*pScript);
|
initprintf("%d\n", (int32_t)*pScript);
|
||||||
}
|
}
|
||||||
|
@ -106,7 +107,7 @@ void VM_ScriptInfo(intptr_t const * const ptr, int const range)
|
||||||
if (vm.pUSprite)
|
if (vm.pUSprite)
|
||||||
initprintf("current actor: %d (%d)\n", vm.spriteNum, vm.pUSprite->picnum);
|
initprintf("current actor: %d (%d)\n", vm.spriteNum, vm.pUSprite->picnum);
|
||||||
|
|
||||||
initprintf("g_errorLineNum: %d, g_tw: %d\n", g_errorLineNum, g_tw);
|
initprintf("g_errorLineNum: %d, g_tw: %d\n", VM_DECODE_LINE_NUMBER(g_tw), VM_DECODE_INST(g_tw));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -1264,8 +1265,8 @@ void Screen_Play(void)
|
||||||
#ifdef CON_USE_COMPUTED_GOTO
|
#ifdef CON_USE_COMPUTED_GOTO
|
||||||
# define vInstruction(KEYWORDID) VINST_ ## KEYWORDID
|
# define vInstruction(KEYWORDID) VINST_ ## KEYWORDID
|
||||||
# define vmErrorCase VINST_CON_OPCODE_END
|
# define vmErrorCase VINST_CON_OPCODE_END
|
||||||
# define eval(INSTRUCTION) { goto *jumpTable[min<uint16_t>((unsigned)INSTRUCTION, CON_OPCODE_END)]; }
|
# define eval(INSTRUCTION) { goto *jumpTable[min<uint16_t>(INSTRUCTION, CON_OPCODE_END)]; }
|
||||||
# define dispatch_unconditionally(...) { tw = *insptr; g_errorLineNum = tw >> 12; g_tw = tw &= VM_INSTMASK; eval(tw) }
|
# define dispatch_unconditionally(...) { g_tw = tw = *insptr; eval((VM_DECODE_INST(tw))) }
|
||||||
# define dispatch(...) { if (vm_execution_depth && (vm.flags & (VM_RETURN|VM_KILL|VM_NOEXECUTE)) == 0) dispatch_unconditionally(__VA_ARGS__); return; }
|
# define dispatch(...) { if (vm_execution_depth && (vm.flags & (VM_RETURN|VM_KILL|VM_NOEXECUTE)) == 0) dispatch_unconditionally(__VA_ARGS__); return; }
|
||||||
# define abort_after_error(...) return
|
# define abort_after_error(...) return
|
||||||
# define vInstructionPointer(KEYWORDID) &&VINST_ ## KEYWORDID
|
# define vInstructionPointer(KEYWORDID) &&VINST_ ## KEYWORDID
|
||||||
|
@ -1294,7 +1295,7 @@ void Screen_Play(void)
|
||||||
#define VM_CONDITIONAL(xxx) \
|
#define VM_CONDITIONAL(xxx) \
|
||||||
do \
|
do \
|
||||||
{ \
|
{ \
|
||||||
if ((xxx) || ((insptr = (intptr_t *)insptr[1]) && ((*insptr & VM_INSTMASK) == CON_ELSE))) \
|
if ((xxx) || ((insptr = (intptr_t *)insptr[1]) && (VM_DECODE_INST(*insptr) == CON_ELSE))) \
|
||||||
{ \
|
{ \
|
||||||
insptr += 2; \
|
insptr += 2; \
|
||||||
VM_Execute(); \
|
VM_Execute(); \
|
||||||
|
@ -1303,19 +1304,17 @@ void Screen_Play(void)
|
||||||
|
|
||||||
GAMEEXEC_STATIC void VM_Execute(bool const loop /*= false*/)
|
GAMEEXEC_STATIC void VM_Execute(bool const loop /*= false*/)
|
||||||
{
|
{
|
||||||
native_t vm_execution_depth = loop;
|
int vm_execution_depth = loop;
|
||||||
|
#ifdef CON_USE_COMPUTED_GOTO
|
||||||
#ifndef CON_USE_COMPUTED_GOTO
|
static void *const jumpTable[] = JUMP_TABLE_ARRAY_LITERAL;
|
||||||
|
#else
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
#else
|
|
||||||
static void* jumpTable[] = JUMP_TABLE_ARRAY_LITERAL;
|
|
||||||
#endif
|
#endif
|
||||||
native_t tw = *insptr;
|
int32_t tw = *insptr;
|
||||||
g_errorLineNum = tw >> 12;
|
g_tw = tw;
|
||||||
g_tw = tw &= VM_INSTMASK;
|
|
||||||
|
|
||||||
eval(tw)
|
eval(VM_DECODE_INST(tw))
|
||||||
{
|
{
|
||||||
vInstruction(CON_LEFTBRACE):
|
vInstruction(CON_LEFTBRACE):
|
||||||
{
|
{
|
||||||
|
@ -2177,69 +2176,58 @@ GAMEEXEC_STATIC void VM_Execute(bool const loop /*= false*/)
|
||||||
}
|
}
|
||||||
|
|
||||||
vInstruction(CON_SETVAR):
|
vInstruction(CON_SETVAR):
|
||||||
insptr++;
|
Gv_SetVar(insptr[1], insptr[2]);
|
||||||
Gv_SetVar(*insptr, insptr[1]);
|
insptr += 3;
|
||||||
insptr += 2;
|
|
||||||
dispatch();
|
dispatch();
|
||||||
|
|
||||||
vInstruction(CON_ADDVAR):
|
vInstruction(CON_ADDVAR):
|
||||||
insptr++;
|
Gv_AddVar(insptr[1], insptr[2]);
|
||||||
Gv_AddVar(*insptr, insptr[1]);
|
insptr += 3;
|
||||||
insptr += 2;
|
|
||||||
dispatch();
|
dispatch();
|
||||||
|
|
||||||
vInstruction(CON_SUBVAR):
|
vInstruction(CON_SUBVAR):
|
||||||
insptr++;
|
Gv_SubVar(insptr[1], insptr[2]);
|
||||||
Gv_SubVar(*insptr, insptr[1]);
|
insptr += 3;
|
||||||
insptr += 2;
|
|
||||||
dispatch();
|
dispatch();
|
||||||
|
|
||||||
vInstruction(CON_MULVAR):
|
vInstruction(CON_MULVAR):
|
||||||
insptr++;
|
Gv_MulVar(insptr[1], insptr[2]);
|
||||||
Gv_MulVar(*insptr, insptr[1]);
|
insptr += 3;
|
||||||
insptr += 2;
|
|
||||||
dispatch();
|
dispatch();
|
||||||
|
|
||||||
vInstruction(CON_DIVVAR):
|
vInstruction(CON_DIVVAR):
|
||||||
insptr++;
|
Gv_DivVar(insptr[1], insptr[2]);
|
||||||
Gv_DivVar(*insptr, insptr[1]);
|
insptr += 3;
|
||||||
insptr += 2;
|
|
||||||
dispatch();
|
dispatch();
|
||||||
|
|
||||||
vInstruction(CON_ANDVAR):
|
vInstruction(CON_ANDVAR):
|
||||||
insptr++;
|
Gv_AndVar(insptr[1], insptr[2]);
|
||||||
Gv_AndVar(*insptr, insptr[1]);
|
insptr += 3;
|
||||||
insptr += 2;
|
|
||||||
dispatch();
|
dispatch();
|
||||||
|
|
||||||
vInstruction(CON_XORVAR):
|
vInstruction(CON_XORVAR):
|
||||||
insptr++;
|
Gv_XorVar(insptr[1], insptr[2]);
|
||||||
Gv_XorVar(*insptr, insptr[1]);
|
insptr += 3;
|
||||||
insptr += 2;
|
|
||||||
dispatch();
|
dispatch();
|
||||||
|
|
||||||
vInstruction(CON_ORVAR):
|
vInstruction(CON_ORVAR):
|
||||||
insptr++;
|
Gv_OrVar(insptr[1], insptr[2]);
|
||||||
Gv_OrVar(*insptr, insptr[1]);
|
insptr += 3;
|
||||||
insptr += 2;
|
|
||||||
dispatch();
|
dispatch();
|
||||||
|
|
||||||
vInstruction(CON_SHIFTVARL):
|
vInstruction(CON_SHIFTVARL):
|
||||||
insptr++;
|
Gv_ShiftVarL(insptr[1], insptr[2]);
|
||||||
Gv_ShiftVarL(*insptr, insptr[1]);
|
insptr += 3;
|
||||||
insptr += 2;
|
|
||||||
dispatch();
|
dispatch();
|
||||||
|
|
||||||
vInstruction(CON_SHIFTVARR):
|
vInstruction(CON_SHIFTVARR):
|
||||||
insptr++;
|
Gv_ShiftVarR(insptr[1], insptr[2]);
|
||||||
Gv_ShiftVarR(*insptr, insptr[1]);
|
insptr += 3;
|
||||||
insptr += 2;
|
|
||||||
dispatch();
|
dispatch();
|
||||||
|
|
||||||
vInstruction(CON_MODVAR):
|
vInstruction(CON_MODVAR):
|
||||||
insptr++;
|
Gv_ModVar(insptr[1], insptr[2]);
|
||||||
Gv_ModVar(*insptr, insptr[1]);
|
insptr += 3;
|
||||||
insptr += 2;
|
|
||||||
dispatch();
|
dispatch();
|
||||||
|
|
||||||
vInstruction(CON_MODVARVAR):
|
vInstruction(CON_MODVARVAR):
|
||||||
|
@ -2356,7 +2344,7 @@ GAMEEXEC_STATIC void VM_Execute(bool const loop /*= false*/)
|
||||||
|
|
||||||
VM_ASSERT((unsigned)lSprite < MAXSPRITES, "invalid sprite %d\n", lSprite);
|
VM_ASSERT((unsigned)lSprite < MAXSPRITES, "invalid sprite %d\n", lSprite);
|
||||||
|
|
||||||
if (tw == CON_SETACTORVAR)
|
if (VM_DECODE_INST(tw) == CON_SETACTORVAR)
|
||||||
Gv_SetVar(lVar1, Gv_GetVar(lVar2), lSprite, vm.playerNum);
|
Gv_SetVar(lVar1, Gv_GetVar(lVar2), lSprite, vm.playerNum);
|
||||||
else
|
else
|
||||||
Gv_SetVar(lVar2, Gv_GetVar(lVar1, lSprite, vm.playerNum));
|
Gv_SetVar(lVar2, Gv_GetVar(lVar1, lSprite, vm.playerNum));
|
||||||
|
@ -2374,7 +2362,7 @@ GAMEEXEC_STATIC void VM_Execute(bool const loop /*= false*/)
|
||||||
|
|
||||||
VM_ASSERT((unsigned)playerNum < (unsigned)g_mostConcurrentPlayers, "invalid player %d\n", playerNum);
|
VM_ASSERT((unsigned)playerNum < (unsigned)g_mostConcurrentPlayers, "invalid player %d\n", playerNum);
|
||||||
|
|
||||||
if (tw == CON_SETPLAYERVAR)
|
if (VM_DECODE_INST(tw) == CON_SETPLAYERVAR)
|
||||||
Gv_SetVar(lVar1, Gv_GetVar(lVar2), vm.spriteNum, playerNum);
|
Gv_SetVar(lVar1, Gv_GetVar(lVar2), vm.spriteNum, playerNum);
|
||||||
else
|
else
|
||||||
Gv_SetVar(lVar2, Gv_GetVar(lVar1, vm.spriteNum, playerNum));
|
Gv_SetVar(lVar2, Gv_GetVar(lVar1, vm.spriteNum, playerNum));
|
||||||
|
@ -2768,7 +2756,7 @@ GAMEEXEC_STATIC void VM_Execute(bool const loop /*= false*/)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
badindex:
|
badindex:
|
||||||
OSD_Printf(OSD_ERROR "Line %d, for %s: index %d out of range!\n", g_errorLineNum, iter_tokens[iterType].token, nIndex);
|
OSD_Printf(OSD_ERROR "Line %d, for %s: index %d out of range!\n", VM_DECODE_LINE_NUMBER(g_tw), iter_tokens[iterType].token, nIndex);
|
||||||
vm.flags |= VM_RETURN;
|
vm.flags |= VM_RETURN;
|
||||||
dispatch();
|
dispatch();
|
||||||
}
|
}
|
||||||
|
@ -3759,7 +3747,7 @@ badindex:
|
||||||
{
|
{
|
||||||
int const q = Gv_GetVar(*insptr++);
|
int const q = Gv_GetVar(*insptr++);
|
||||||
int j;
|
int j;
|
||||||
if (tw == CON_GETPNAME && *insptr == g_thisActorVarID)
|
if (VM_DECODE_INST(tw) == CON_GETPNAME && *insptr == g_thisActorVarID)
|
||||||
{
|
{
|
||||||
j = vm.playerNum;
|
j = vm.playerNum;
|
||||||
insptr++;
|
insptr++;
|
||||||
|
@ -3767,7 +3755,7 @@ badindex:
|
||||||
else
|
else
|
||||||
j = Gv_GetVar(*insptr++);
|
j = Gv_GetVar(*insptr++);
|
||||||
|
|
||||||
switch (tw)
|
switch (VM_DECODE_INST(tw))
|
||||||
{
|
{
|
||||||
case CON_GETPNAME:
|
case CON_GETPNAME:
|
||||||
VM_ASSERT((unsigned)q < MAXQUOTES && apStrings[q], "invalid quote %d\n", q);
|
VM_ASSERT((unsigned)q < MAXQUOTES && apStrings[q], "invalid quote %d\n", q);
|
||||||
|
@ -3960,7 +3948,7 @@ badindex:
|
||||||
} v;
|
} v;
|
||||||
Gv_FillWithVars(v);
|
Gv_FillWithVars(v);
|
||||||
|
|
||||||
switch (tw)
|
switch (VM_DECODE_INST(tw))
|
||||||
{
|
{
|
||||||
case CON_MYOS: VM_DrawTile(v.pos.x, v.pos.y, v.tilenum, v.shade, v.orientation); break;
|
case CON_MYOS: VM_DrawTile(v.pos.x, v.pos.y, v.tilenum, v.shade, v.orientation); break;
|
||||||
case CON_MYOSPAL: VM_DrawTilePal(v.pos.x, v.pos.y, v.tilenum, v.shade, v.orientation, Gv_GetVar(*insptr++)); break;
|
case CON_MYOSPAL: VM_DrawTilePal(v.pos.x, v.pos.y, v.tilenum, v.shade, v.orientation, Gv_GetVar(*insptr++)); break;
|
||||||
|
@ -4006,7 +3994,7 @@ badindex:
|
||||||
abort_after_error();
|
abort_after_error();
|
||||||
}
|
}
|
||||||
|
|
||||||
Gv_SetVar(out, (tw == CON_LDIST ? ldist : dist)(&sprite[in.x], &sprite[in.y]));
|
Gv_SetVar(out, (VM_DECODE_INST(tw) == CON_LDIST ? ldist : dist)(&sprite[in.x], &sprite[in.y]));
|
||||||
dispatch();
|
dispatch();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4017,7 +4005,7 @@ badindex:
|
||||||
int const out = *insptr++;
|
int const out = *insptr++;
|
||||||
vec2_t in;
|
vec2_t in;
|
||||||
Gv_FillWithVars(in);
|
Gv_FillWithVars(in);
|
||||||
Gv_SetVar(out, (tw == CON_GETANGLE ? getangle : G_GetAngleDelta)(in.x, in.y));
|
Gv_SetVar(out, (VM_DECODE_INST(tw) == CON_GETANGLE ? getangle : G_GetAngleDelta)(in.x, in.y));
|
||||||
dispatch();
|
dispatch();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4029,7 +4017,7 @@ badindex:
|
||||||
vec3_t in;
|
vec3_t in;
|
||||||
Gv_FillWithVars(in);
|
Gv_FillWithVars(in);
|
||||||
|
|
||||||
if (tw == CON_MULSCALE)
|
if (VM_DECODE_INST(tw) == CON_MULSCALE)
|
||||||
Gv_SetVar(out, mulscale(in.x, in.y, in.z));
|
Gv_SetVar(out, mulscale(in.x, in.y, in.z));
|
||||||
else
|
else
|
||||||
Gv_SetVar(out, divscale(in.x, in.y, in.z));
|
Gv_SetVar(out, divscale(in.x, in.y, in.z));
|
||||||
|
@ -4079,7 +4067,7 @@ badindex:
|
||||||
|
|
||||||
int const spriteNum = A_Spawn(vm.spriteNum, tileNum);
|
int const spriteNum = A_Spawn(vm.spriteNum, tileNum);
|
||||||
|
|
||||||
switch (tw)
|
switch (VM_DECODE_INST(tw))
|
||||||
{
|
{
|
||||||
case CON_EQSPAWN:
|
case CON_EQSPAWN:
|
||||||
if (spriteNum != -1)
|
if (spriteNum != -1)
|
||||||
|
@ -4104,7 +4092,7 @@ badindex:
|
||||||
|
|
||||||
j = A_Shoot(vm.spriteNum, j);
|
j = A_Shoot(vm.spriteNum, j);
|
||||||
|
|
||||||
if (tw == CON_ESHOOT)
|
if (VM_DECODE_INST(tw) == CON_ESHOOT)
|
||||||
aGameVars[g_returnVarID].global = j;
|
aGameVars[g_returnVarID].global = j;
|
||||||
|
|
||||||
dispatch();
|
dispatch();
|
||||||
|
@ -4121,7 +4109,7 @@ badindex:
|
||||||
|
|
||||||
j = A_ShootWithZvel(vm.spriteNum, j, zvel);
|
j = A_ShootWithZvel(vm.spriteNum, j, zvel);
|
||||||
|
|
||||||
if (tw == CON_EZSHOOT)
|
if (VM_DECODE_INST(tw) == CON_EZSHOOT)
|
||||||
aGameVars[g_returnVarID].global = j;
|
aGameVars[g_returnVarID].global = j;
|
||||||
|
|
||||||
dispatch();
|
dispatch();
|
||||||
|
@ -4143,7 +4131,7 @@ badindex:
|
||||||
|
|
||||||
VM_ASSERT((unsigned)soundNum < MAXSOUNDS, "invalid sound %d\n", soundNum);
|
VM_ASSERT((unsigned)soundNum < MAXSOUNDS, "invalid sound %d\n", soundNum);
|
||||||
|
|
||||||
switch (tw)
|
switch (VM_DECODE_INST(tw))
|
||||||
{
|
{
|
||||||
case CON_SOUNDONCE:
|
case CON_SOUNDONCE:
|
||||||
if (!S_CheckSoundPlaying(soundNum))
|
if (!S_CheckSoundPlaying(soundNum))
|
||||||
|
@ -4170,7 +4158,7 @@ badindex:
|
||||||
|
|
||||||
VM_ASSERT((unsigned)nQuote < MAXQUOTES && apStrings[nQuote], "invalid quote %d\n", nQuote);
|
VM_ASSERT((unsigned)nQuote < MAXQUOTES && apStrings[nQuote], "invalid quote %d\n", nQuote);
|
||||||
|
|
||||||
if (tw == CON_IFCUTSCENE)
|
if (VM_DECODE_INST(tw) == CON_IFCUTSCENE)
|
||||||
{
|
{
|
||||||
insptr--;
|
insptr--;
|
||||||
VM_CONDITIONAL(g_animPtr == Anim_Find(apStrings[nQuote]));
|
VM_CONDITIONAL(g_animPtr == Anim_Find(apStrings[nQuote]));
|
||||||
|
@ -4212,7 +4200,7 @@ badindex:
|
||||||
insptr++;
|
insptr++;
|
||||||
dispatch();
|
dispatch();
|
||||||
}
|
}
|
||||||
switch (tw)
|
switch (VM_DECODE_INST(tw))
|
||||||
{
|
{
|
||||||
case CON_SAVEGAMEVAR:
|
case CON_SAVEGAMEVAR:
|
||||||
nValue = Gv_GetVar(*insptr);
|
nValue = Gv_GetVar(*insptr);
|
||||||
|
@ -4248,14 +4236,14 @@ badindex:
|
||||||
|
|
||||||
VM_ASSERT((unsigned)v.params[2] < MAXSECTORS, "invalid sector %d\n", v.params[2]);
|
VM_ASSERT((unsigned)v.params[2] < MAXSECTORS, "invalid sector %d\n", v.params[2]);
|
||||||
|
|
||||||
if (tw != CON_SHOWVIEWQ16 && tw != CON_SHOWVIEWQ16UNBIASED)
|
if (VM_DECODE_INST(tw) != CON_SHOWVIEWQ16 && VM_DECODE_INST(tw) != CON_SHOWVIEWQ16UNBIASED)
|
||||||
{
|
{
|
||||||
v.params[0] <<= 16;
|
v.params[0] <<= 16;
|
||||||
v.params[1] <<= 16;
|
v.params[1] <<= 16;
|
||||||
}
|
}
|
||||||
|
|
||||||
G_ShowView(v.vec, v.params[0], v.params[1], v.params[2], v.scrn[0].x, v.scrn[0].y, v.scrn[1].x, v.scrn[1].y,
|
G_ShowView(v.vec, v.params[0], v.params[1], v.params[2], v.scrn[0].x, v.scrn[0].y, v.scrn[1].x, v.scrn[1].y,
|
||||||
(tw != CON_SHOWVIEW && tw != CON_SHOWVIEWQ16));
|
(VM_DECODE_INST(tw) != CON_SHOWVIEW && VM_DECODE_INST(tw) != CON_SHOWVIEWQ16));
|
||||||
|
|
||||||
dispatch();
|
dispatch();
|
||||||
}
|
}
|
||||||
|
@ -4272,12 +4260,12 @@ badindex:
|
||||||
} v;
|
} v;
|
||||||
Gv_FillWithVars(v);
|
Gv_FillWithVars(v);
|
||||||
|
|
||||||
int32_t alpha = (tw == CON_ROTATESPRITEA) ? Gv_GetVar(*insptr++) : 0;
|
int32_t alpha = (VM_DECODE_INST(tw) == CON_ROTATESPRITEA) ? Gv_GetVar(*insptr++) : 0;
|
||||||
|
|
||||||
vec2_t bound[2];
|
vec2_t bound[2];
|
||||||
Gv_FillWithVars(bound);
|
Gv_FillWithVars(bound);
|
||||||
|
|
||||||
if (tw != CON_ROTATESPRITE16 && !(v.orientation & ROTATESPRITE_FULL16))
|
if (VM_DECODE_INST(tw) != CON_ROTATESPRITE16 && !(v.orientation & ROTATESPRITE_FULL16))
|
||||||
{
|
{
|
||||||
v.pos.x <<= 16;
|
v.pos.x <<= 16;
|
||||||
v.pos.y <<= 16;
|
v.pos.y <<= 16;
|
||||||
|
@ -4311,7 +4299,7 @@ badindex:
|
||||||
} v;
|
} v;
|
||||||
Gv_FillWithVars(v);
|
Gv_FillWithVars(v);
|
||||||
|
|
||||||
int32_t const z = (tw == CON_GAMETEXTZ) ? Gv_GetVar(*insptr++) : 65536;
|
int32_t const z = (VM_DECODE_INST(tw) == CON_GAMETEXTZ) ? Gv_GetVar(*insptr++) : 65536;
|
||||||
|
|
||||||
if (EDUKE32_PREDICT_FALSE(v.tilenum < 0 || v.tilenum + 127 >= MAXTILES))
|
if (EDUKE32_PREDICT_FALSE(v.tilenum < 0 || v.tilenum + 127 >= MAXTILES))
|
||||||
{
|
{
|
||||||
|
@ -4339,7 +4327,7 @@ badindex:
|
||||||
} v;
|
} v;
|
||||||
Gv_FillWithVars(v);
|
Gv_FillWithVars(v);
|
||||||
|
|
||||||
int32_t const nZoom = (tw == CON_DIGITALNUMBERZ) ? Gv_GetVar(*insptr++) : 65536;
|
int32_t const nZoom = (VM_DECODE_INST(tw) == CON_DIGITALNUMBERZ) ? Gv_GetVar(*insptr++) : 65536;
|
||||||
|
|
||||||
// NOTE: '-' not taken into account, but we have rotatesprite() bound check now anyway
|
// NOTE: '-' not taken into account, but we have rotatesprite() bound check now anyway
|
||||||
if (EDUKE32_PREDICT_FALSE(v.tilenum < 0 || v.tilenum + 9 >= MAXTILES))
|
if (EDUKE32_PREDICT_FALSE(v.tilenum < 0 || v.tilenum + 9 >= MAXTILES))
|
||||||
|
@ -4439,7 +4427,7 @@ badindex:
|
||||||
|
|
||||||
VM_ASSERT((unsigned)sectnum < MAXSECTORS, "invalid sector %d\n", sectnum);
|
VM_ASSERT((unsigned)sectnum < MAXSECTORS, "invalid sector %d\n", sectnum);
|
||||||
|
|
||||||
if (tw == CON_SECTSETINTERPOLATION)
|
if (VM_DECODE_INST(tw) == CON_SECTSETINTERPOLATION)
|
||||||
Sect_SetInterpolation(sectnum);
|
Sect_SetInterpolation(sectnum);
|
||||||
else
|
else
|
||||||
Sect_ClearInterpolation(sectnum);
|
Sect_ClearInterpolation(sectnum);
|
||||||
|
@ -4476,7 +4464,7 @@ badindex:
|
||||||
int const retvar = *insptr++;
|
int const retvar = *insptr++;
|
||||||
vec3_t in;
|
vec3_t in;
|
||||||
|
|
||||||
int ret = ((tw == CON_LINEINTERSECT) ? lintersect : rayintersect)(v.vec[0].x, v.vec[0].y, v.vec[0].z, v.vec[1].x, v.vec[1].y,
|
int ret = ((VM_DECODE_INST(tw) == CON_LINEINTERSECT) ? lintersect : rayintersect)(v.vec[0].x, v.vec[0].y, v.vec[0].z, v.vec[1].x, v.vec[1].y,
|
||||||
v.vec[1].z, v.vec2[0].x, v.vec2[0].y, v.vec2[1].x, v.vec2[1].y,
|
v.vec[1].z, v.vec2[0].x, v.vec2[0].y, v.vec2[1].x, v.vec2[1].y,
|
||||||
&in.x, &in.y, &in.z);
|
&in.x, &in.y, &in.z);
|
||||||
|
|
||||||
|
@ -4526,7 +4514,7 @@ badindex:
|
||||||
|
|
||||||
Gv_SetVar(
|
Gv_SetVar(
|
||||||
returnVar,
|
returnVar,
|
||||||
clipmovex(&v.vec3, §Num, v.vec2.x, v.vec2.y, v.dist.w, v.dist.f, v.dist.c, v.clipMask, (tw == CON_CLIPMOVENOSLIDE)));
|
clipmovex(&v.vec3, §Num, v.vec2.x, v.vec2.y, v.dist.w, v.dist.f, v.dist.c, v.clipMask, (VM_DECODE_INST(tw) == CON_CLIPMOVENOSLIDE)));
|
||||||
Gv_SetVar(sectReturn, v.sectNum32);
|
Gv_SetVar(sectReturn, v.sectNum32);
|
||||||
Gv_SetVar(xReturn, v.vec3.x);
|
Gv_SetVar(xReturn, v.vec3.x);
|
||||||
Gv_SetVar(yReturn, v.vec3.y);
|
Gv_SetVar(yReturn, v.vec3.y);
|
||||||
|
@ -4714,7 +4702,7 @@ badindex:
|
||||||
|
|
||||||
VM_ASSERT((unsigned)v.sectNum < MAXSECTORS, "invalid sector %d\n", v.sectNum);
|
VM_ASSERT((unsigned)v.sectNum < MAXSECTORS, "invalid sector %d\n", v.sectNum);
|
||||||
|
|
||||||
Gv_SetVar(*insptr++, (tw == CON_GETFLORZOFSLOPE ? getflorzofslope : getceilzofslope)(v.sectNum, v.vect.x, v.vect.y));
|
Gv_SetVar(*insptr++, (VM_DECODE_INST(tw) == CON_GETFLORZOFSLOPE ? getflorzofslope : getceilzofslope)(v.sectNum, v.vect.x, v.vect.y));
|
||||||
dispatch();
|
dispatch();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4828,7 +4816,7 @@ badindex:
|
||||||
|
|
||||||
g_lastAutoSaveArbitraryID = requestedSlot;
|
g_lastAutoSaveArbitraryID = requestedSlot;
|
||||||
|
|
||||||
if (tw == CON_SAVE || g_lastautosave.name[0] == 0)
|
if (VM_DECODE_INST(tw) == CON_SAVE || g_lastautosave.name[0] == 0)
|
||||||
{
|
{
|
||||||
time_t timeStruct = time(NULL);
|
time_t timeStruct = time(NULL);
|
||||||
struct tm *pTime = localtime(&timeStruct);
|
struct tm *pTime = localtime(&timeStruct);
|
||||||
|
@ -5059,7 +5047,7 @@ badindex:
|
||||||
int outputPos = 0;
|
int outputPos = 0;
|
||||||
int argIdx = 0;
|
int argIdx = 0;
|
||||||
|
|
||||||
while ((*insptr & VM_INSTMASK) != CON_NULLOP && argIdx < 32)
|
while (VM_DECODE_INST(*insptr) != CON_NULLOP && argIdx < 32)
|
||||||
arg[argIdx++] = Gv_GetVar(*insptr++);
|
arg[argIdx++] = Gv_GetVar(*insptr++);
|
||||||
|
|
||||||
int numArgs = argIdx;
|
int numArgs = argIdx;
|
||||||
|
@ -5156,7 +5144,7 @@ badindex:
|
||||||
index = Gv_GetVar(*insptr++);
|
index = Gv_GetVar(*insptr++);
|
||||||
if (EDUKE32_PREDICT_TRUE((unsigned)index < (unsigned)aGameArrays[lVarID].size))
|
if (EDUKE32_PREDICT_TRUE((unsigned)index < (unsigned)aGameArrays[lVarID].size))
|
||||||
{
|
{
|
||||||
initprintf(OSDTEXT_GREEN "CONLOGVAR: L=%d %s[%d] =%d\n", g_errorLineNum, aGameArrays[lVarID].szLabel, index,
|
initprintf(OSDTEXT_GREEN "CONLOGVAR: L=%d %s[%d] =%d\n", VM_DECODE_LINE_NUMBER(g_tw), aGameArrays[lVarID].szLabel, index,
|
||||||
(int32_t)(m * Gv_GetArrayValue(lVarID, index)));
|
(int32_t)(m * Gv_GetArrayValue(lVarID, index)));
|
||||||
dispatch();
|
dispatch();
|
||||||
}
|
}
|
||||||
|
@ -5180,7 +5168,7 @@ badindex:
|
||||||
CON_ERRPRINTF("invalid array index\n");
|
CON_ERRPRINTF("invalid array index\n");
|
||||||
abort_after_error();
|
abort_after_error();
|
||||||
}
|
}
|
||||||
initprintf(OSDTEXT_GREEN "CONLOGVAR: L=%d %d %d\n", g_errorLineNum, index, Gv_GetVar(*insptr++, index, vm.playerNum));
|
initprintf(OSDTEXT_GREEN "CONLOGVAR: L=%d %d %d\n", VM_DECODE_LINE_NUMBER(g_tw), index, Gv_GetVar(*insptr++, index, vm.playerNum));
|
||||||
dispatch();
|
dispatch();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5196,7 +5184,7 @@ badindex:
|
||||||
abort_after_error();
|
abort_after_error();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Bsprintf(tempbuf, "CONLOGVAR: L=%d %s ", g_errorLineNum, aGameVars[lVarID].szLabel);
|
Bsprintf(tempbuf, "CONLOGVAR: L=%d %s ", VM_DECODE_LINE_NUMBER(g_tw), aGameVars[lVarID].szLabel);
|
||||||
|
|
||||||
if (aGameVars[lVarID].flags & GAMEVAR_READONLY)
|
if (aGameVars[lVarID].flags & GAMEVAR_READONLY)
|
||||||
{
|
{
|
||||||
|
@ -5243,8 +5231,9 @@ badindex:
|
||||||
// that is of <type> into <getvar>
|
// that is of <type> into <getvar>
|
||||||
// -1 for none found
|
// -1 for none found
|
||||||
// <type> <maxdistvarid> <varid>
|
// <type> <maxdistvarid> <varid>
|
||||||
bool const actorsOnly = (tw == CON_FINDNEARACTOR || tw == CON_FINDNEARACTOR3D);
|
int const decodedInst = VM_DECODE_INST(tw);
|
||||||
auto const dist_funcptr = (tw == CON_FINDNEARACTOR || tw == CON_FINDNEARSPRITE) ? &ldist : &dist;
|
bool const actorsOnly = (decodedInst == CON_FINDNEARACTOR || decodedInst == CON_FINDNEARACTOR3D);
|
||||||
|
auto const dist_funcptr = (decodedInst == CON_FINDNEARACTOR || decodedInst == CON_FINDNEARSPRITE) ? &ldist : &dist;
|
||||||
|
|
||||||
int const findTile = *insptr++;
|
int const findTile = *insptr++;
|
||||||
int maxDist = Gv_GetVar(*insptr++);
|
int maxDist = Gv_GetVar(*insptr++);
|
||||||
|
@ -5291,7 +5280,7 @@ badindex:
|
||||||
// that is of <type> into <getvar>
|
// that is of <type> into <getvar>
|
||||||
// -1 for none found
|
// -1 for none found
|
||||||
// <type> <maxdistvarid> <varid>
|
// <type> <maxdistvarid> <varid>
|
||||||
bool const actorsOnly = (tw == CON_FINDNEARACTORZ);
|
bool const actorsOnly = (VM_DECODE_INST(tw) == CON_FINDNEARACTORZ);
|
||||||
|
|
||||||
int const findTile = *insptr++;
|
int const findTile = *insptr++;
|
||||||
int maxDist = Gv_GetVar(*insptr++);
|
int maxDist = Gv_GetVar(*insptr++);
|
||||||
|
@ -5451,7 +5440,7 @@ badindex:
|
||||||
|
|
||||||
VM_ASSERT((unsigned)playerNum < (unsigned)g_mostConcurrentPlayers, "invalid player %d\n", playerNum);
|
VM_ASSERT((unsigned)playerNum < (unsigned)g_mostConcurrentPlayers, "invalid player %d\n", playerNum);
|
||||||
|
|
||||||
if (tw == CON_CHECKAVAILWEAPON)
|
if (VM_DECODE_INST(tw) == CON_CHECKAVAILWEAPON)
|
||||||
P_CheckWeapon(g_player[playerNum].ps);
|
P_CheckWeapon(g_player[playerNum].ps);
|
||||||
else
|
else
|
||||||
P_SelectNextInvItem(g_player[playerNum].ps);
|
P_SelectNextInvItem(g_player[playerNum].ps);
|
||||||
|
@ -6423,7 +6412,7 @@ void G_SaveMapState(void)
|
||||||
// If we're in EVENT_ANIMATESPRITES, we'll be saving pointer values to disk :-/
|
// If we're in EVENT_ANIMATESPRITES, we'll be saving pointer values to disk :-/
|
||||||
#if !defined LUNATIC
|
#if !defined LUNATIC
|
||||||
if (EDUKE32_PREDICT_FALSE(g_currentEvent == EVENT_ANIMATESPRITES))
|
if (EDUKE32_PREDICT_FALSE(g_currentEvent == EVENT_ANIMATESPRITES))
|
||||||
initprintf("Line %d: savemapstate called from EVENT_ANIMATESPRITES. WHY?\n", g_errorLineNum);
|
initprintf("Line %d: savemapstate called from EVENT_ANIMATESPRITES. WHY?\n", VM_DECODE_LINE_NUMBER(g_tw));
|
||||||
#endif
|
#endif
|
||||||
Bmemcpy(&save->spriteext[0],&spriteext[0],sizeof(spriteext_t)*MAXSPRITES);
|
Bmemcpy(&save->spriteext[0],&spriteext[0],sizeof(spriteext_t)*MAXSPRITES);
|
||||||
#ifndef NEW_MAP_FORMAT
|
#ifndef NEW_MAP_FORMAT
|
||||||
|
@ -6563,7 +6552,7 @@ void G_RestoreMapState(void)
|
||||||
#if !defined LUNATIC
|
#if !defined LUNATIC
|
||||||
if (EDUKE32_PREDICT_FALSE(g_currentEvent == EVENT_ANIMATESPRITES))
|
if (EDUKE32_PREDICT_FALSE(g_currentEvent == EVENT_ANIMATESPRITES))
|
||||||
{
|
{
|
||||||
initprintf("Line %d: loadmapstate called from EVENT_ANIMATESPRITES. WHY?\n",g_errorLineNum);
|
initprintf("Line %d: loadmapstate called from EVENT_ANIMATESPRITES. WHY?\n", VM_DECODE_LINE_NUMBER(g_tw));
|
||||||
for (native_t i=0; i<MAXSPRITES; i++)
|
for (native_t i=0; i<MAXSPRITES; i++)
|
||||||
spriteext[i].tspr = NULL;
|
spriteext[i].tspr = NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -82,7 +82,6 @@ extern int32_t ticrandomseed;
|
||||||
extern vmstate_t vm;
|
extern vmstate_t vm;
|
||||||
#if !defined LUNATIC
|
#if !defined LUNATIC
|
||||||
extern int32_t g_tw;
|
extern int32_t g_tw;
|
||||||
extern int32_t g_errorLineNum;
|
|
||||||
extern int32_t g_currentEvent;
|
extern int32_t g_currentEvent;
|
||||||
|
|
||||||
void A_LoadActor(int const spriteNum);
|
void A_LoadActor(int const spriteNum);
|
||||||
|
@ -117,13 +116,13 @@ void VM_DrawTileSmall(int32_t x, int32_t y, int32_t tilenum, int32_t shade, int3
|
||||||
|
|
||||||
#define CON_ERRPRINTF(Text, ...) do { \
|
#define CON_ERRPRINTF(Text, ...) do { \
|
||||||
vm.flags |= VM_RETURN; \
|
vm.flags |= VM_RETURN; \
|
||||||
OSD_Printf("Line %d, %s: " Text, g_errorLineNum, VM_GetKeywordForID(g_tw), ## __VA_ARGS__); \
|
OSD_Printf("Line %d, %s: " Text, VM_DECODE_LINE_NUMBER(g_tw), VM_GetKeywordForID(VM_DECODE_INST(g_tw)), ## __VA_ARGS__); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define CON_CRITICALERRPRINTF(Text, ...) do { \
|
#define CON_CRITICALERRPRINTF(Text, ...) do { \
|
||||||
vm.flags |= VM_RETURN; \
|
vm.flags |= VM_RETURN; \
|
||||||
OSD_Printf("Line %d, %s: " Text, g_errorLineNum, VM_GetKeywordForID(g_tw), ## __VA_ARGS__); \
|
OSD_Printf("Line %d, %s: " Text, VM_DECODE_LINE_NUMBER(g_tw), VM_GetKeywordForID(VM_DECODE_INST(g_tw)), ## __VA_ARGS__); \
|
||||||
wm_msgbox(APPNAME, "Line %d, %s: " Text, g_errorLineNum, VM_GetKeywordForID(g_tw), ## __VA_ARGS__); \
|
wm_msgbox(APPNAME, "Line %d, %s: " Text, VM_DECODE_LINE_NUMBER(g_tw), VM_GetKeywordForID(VM_DECODE_INST(g_tw)), ## __VA_ARGS__); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
void G_GetTimeDate(int32_t * pValues);
|
void G_GetTimeDate(int32_t * pValues);
|
||||||
|
|
Loading…
Reference in a new issue