mirror of
https://github.com/ZDoom/raze-gles.git
synced 2025-01-14 11:50:49 +00:00
- put the entire CON parser into a class to make its state local to the caller
This commit is contained in:
parent
9346b5de7e
commit
2dcaf25fea
14 changed files with 223 additions and 278 deletions
|
@ -115,6 +115,7 @@ enum
|
|||
CSTAT_SPRITE_ONE_SIDED = 1u<<6u,
|
||||
CSTAT_SPRITE_YCENTER = 1u<<7u,
|
||||
CSTAT_SPRITE_BLOCK_HITSCAN = 1u<<8u,
|
||||
CSTAT_SPRITE_BLOCK_ALL = CSTAT_SPRITE_BLOCK_HITSCAN | CSTAT_SPRITE_BLOCK,
|
||||
CSTAT_SPRITE_TRANSLUCENT_INVERT = 1u<<9u,
|
||||
|
||||
CSTAT_SPRITE_RESERVED1 = 1u<<10u, // used by Duke 3D (Polymost)
|
||||
|
|
|
@ -15,7 +15,6 @@
|
|||
#include "funct.h"
|
||||
#include "gamecontrol.h"
|
||||
#include "game.h"
|
||||
#include "gamedef.h"
|
||||
#include "gamevar.h"
|
||||
#include "global.h"
|
||||
#include "macros.h"
|
||||
|
|
|
@ -236,5 +236,6 @@ void sethorizon(int snum, int sb_snum, double factor, bool frominput = false);
|
|||
bool movementBlocked(int snum);
|
||||
void GetInput();
|
||||
void startmainmenu();
|
||||
void loadcons();
|
||||
|
||||
END_DUKE_NS
|
||||
|
|
|
@ -27,7 +27,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|||
#endif
|
||||
|
||||
#include "fix16.h"
|
||||
#include "gamedef.h"
|
||||
#include "mmulti.h"
|
||||
#include "palette.h"
|
||||
#include "cmdlib.h"
|
||||
|
@ -49,13 +48,6 @@ extern int32_t cameradist;
|
|||
extern int32_t g_doQuickSave;
|
||||
extern int32_t tempwallptr;
|
||||
|
||||
void G_BackToMenu(void);
|
||||
|
||||
void G_UpdatePlayerFromMenu(void);
|
||||
|
||||
|
||||
void G_InitTimer(int32_t ticspersec);
|
||||
|
||||
enum
|
||||
{
|
||||
TFLAG_WALLSWITCH = 1
|
||||
|
@ -78,4 +70,12 @@ extern bool sound445done;
|
|||
|
||||
#endif
|
||||
|
||||
|
||||
extern intptr_t apScriptGameEvent[];
|
||||
|
||||
extern TArray<int> ScriptCode;
|
||||
|
||||
|
||||
#include "concmd.h"
|
||||
|
||||
END_DUKE_NS
|
||||
|
|
|
@ -48,20 +48,38 @@ Modifications for JonoF's port by Jonathon Fowler (jf@jonof.id.au)
|
|||
BEGIN_DUKE_NS
|
||||
|
||||
|
||||
// parser state: todo: turn into a class
|
||||
char* textptr;
|
||||
int line_number;
|
||||
int errorcount, warningcount; // was named 'error' and 'warning' which is too generic for public variables and may clash with other code.
|
||||
int g_currentSourceFile;
|
||||
uint32_t parsing_actor, parsing_event;
|
||||
int parsing_state;
|
||||
int num_squigilly_brackets;
|
||||
int checking_ifelse;
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// definitions needed by the parser.
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
//G_EXTERN char tempbuf[MAXSECTORS << 1], buf[1024]; todo - move to compile state. tempbuf gets used nearly everywhere as scratchpad memory.
|
||||
extern char tempbuf[];
|
||||
enum labeltypes {
|
||||
LABEL_ANY = -1,
|
||||
LABEL_DEFINE = 1,
|
||||
LABEL_STATE = 2,
|
||||
LABEL_ACTOR = 4,
|
||||
LABEL_ACTION = 8,
|
||||
LABEL_AI = 16,
|
||||
LABEL_MOVE = 32,
|
||||
};
|
||||
|
||||
TArray<int> ScriptCode;
|
||||
class labelstring
|
||||
{
|
||||
char text[64];
|
||||
|
||||
public:
|
||||
char& operator[](size_t pos)
|
||||
{
|
||||
return text[pos];
|
||||
}
|
||||
operator const char* () { return text; }
|
||||
const char* GetChars() { return text; }
|
||||
int compare(const char* c) const { return strcmp(text, c); }
|
||||
int comparei(const char* c) const { return stricmp(text, c); }
|
||||
labelstring& operator=(const char* c) { strncpy(text, c, 64); text[63] = 0; }
|
||||
|
||||
};
|
||||
|
||||
struct TempMusic
|
||||
{
|
||||
|
@ -69,9 +87,80 @@ struct TempMusic
|
|||
FString music;
|
||||
};
|
||||
|
||||
// This is for situations where the music gets defined before the map. Since the map records do not exist yet, we need a temporary buffer.
|
||||
static TArray<TempMusic> tempMusic;
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// the actual parser
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
class ConCompiler
|
||||
{
|
||||
char* textptr = nullptr;
|
||||
int line_number = 0;
|
||||
int errorcount = 0, warningcount = 0; // was named 'error' and 'warning' which is too generic for public variables and may clash with other code.
|
||||
int currentsourcefile = -1;
|
||||
unsigned parsing_actor = 0, parsing_event = 0;
|
||||
int parsing_state = 0;
|
||||
int num_squigilly_brackets = 0;
|
||||
int checking_ifelse = 0;
|
||||
labelstring parselabel= {};
|
||||
// This is for situations where the music gets defined before the map. Since the map records do not exist yet, we need a temporary buffer.
|
||||
TArray<TempMusic> tempMusic;
|
||||
char parsebuf[1024];
|
||||
TArray<char> parsebuffer; // global so that the storage is persistent across calls.
|
||||
|
||||
void ReportError(int error);
|
||||
int getkeyword(const char* text);
|
||||
FString translatelabeltype(int type);
|
||||
bool ispecial(char c);
|
||||
void skiptoendofline();
|
||||
void skipwhitespace();
|
||||
void skipblockcomment();
|
||||
bool skipcomments();
|
||||
int keyword(void);
|
||||
void getlabel(void);
|
||||
void appendlabelvalue(labeltypes type, int value);
|
||||
void appendlabeladdress(labeltypes type, int offset = 0);
|
||||
int transword(void);
|
||||
int transnum(int type);
|
||||
void checkforkeyword();
|
||||
int parsecommand();
|
||||
|
||||
public:
|
||||
void compilecon(const char* filenam);
|
||||
void setmusic();
|
||||
int getErrorCount() { return errorcount; }
|
||||
};
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// label data
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
static const char* labeltypenames[] = {
|
||||
"define",
|
||||
"state",
|
||||
"actor",
|
||||
"action",
|
||||
"ai",
|
||||
"move"
|
||||
};
|
||||
|
||||
struct labeldef
|
||||
{
|
||||
labelstring name;
|
||||
labeltypes type;
|
||||
int value;
|
||||
|
||||
int compare(const char* c) const { return name.compare(c); }
|
||||
const char* GetChars() { return name.GetChars(); }
|
||||
|
||||
};
|
||||
|
||||
// These arrays contain the global output from the compiler.
|
||||
static TArray<labeldef> labels;
|
||||
TArray<int> ScriptCode;
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
|
@ -110,62 +199,6 @@ void SortCommands()
|
|||
qsort(cmdList, countof(cmdList), sizeof(ConCommand), cmdCmp);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// label data
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
enum labeltypes {
|
||||
LABEL_ANY = -1,
|
||||
LABEL_DEFINE = 1,
|
||||
LABEL_STATE = 2,
|
||||
LABEL_ACTOR = 4,
|
||||
LABEL_ACTION = 8,
|
||||
LABEL_AI = 16,
|
||||
LABEL_MOVE = 32,
|
||||
};
|
||||
|
||||
static const char* labeltypenames[] = {
|
||||
"define",
|
||||
"state",
|
||||
"actor",
|
||||
"action",
|
||||
"ai",
|
||||
"move"
|
||||
};
|
||||
|
||||
class labelstring
|
||||
{
|
||||
char text[64];
|
||||
|
||||
public:
|
||||
char& operator[](size_t pos)
|
||||
{
|
||||
return text[pos];
|
||||
}
|
||||
operator const char* () { return text; }
|
||||
const char* GetChars() { return text; }
|
||||
int compare(const char* c) const { return strcmp(text, c); }
|
||||
int comparei(const char* c) const { return stricmp(text, c); }
|
||||
labelstring& operator=(const char* c) { strncpy(text, c, 64); text[63] = 0; }
|
||||
|
||||
};
|
||||
|
||||
struct labeldef
|
||||
{
|
||||
labelstring name;
|
||||
labeltypes type;
|
||||
int value;
|
||||
|
||||
int compare(const char* c) const { return name.compare(c); }
|
||||
const char* GetChars() { return name.GetChars(); }
|
||||
|
||||
};
|
||||
|
||||
TArray<labeldef> labels;
|
||||
static labelstring parselabel;
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
|
@ -186,10 +219,10 @@ enum
|
|||
ERROR_NOENDSWITCH,
|
||||
};
|
||||
|
||||
void ReportError(int iError)
|
||||
void ConCompiler::ReportError(int error)
|
||||
{
|
||||
const char* fn = fileSystem.GetFileFullName(g_currentSourceFile);
|
||||
switch (iError)
|
||||
const char* fn = fileSystem.GetFileFullName(currentsourcefile);
|
||||
switch (error)
|
||||
{
|
||||
case ERROR_ISAKEYWORD:
|
||||
Printf(TEXTCOLOR_RED " * ERROR!(%s, line %d) Symbol '%s' is a key word.\n",
|
||||
|
@ -197,7 +230,7 @@ void ReportError(int iError)
|
|||
break;
|
||||
case ERROR_PARMUNDEFINED:
|
||||
Printf(TEXTCOLOR_RED " * ERROR!(%s, line %d) Parameter '%s' is undefined.\n",
|
||||
fn, line_number, tempbuf);
|
||||
fn, line_number, parsebuf);
|
||||
break;
|
||||
case WARNING_DUPLICATEDEFINITION:
|
||||
Printf(TEXTCOLOR_YELLOW " * WARNING.(%s, line %d) Duplicate definition '%s' ignored.\n",
|
||||
|
@ -221,15 +254,15 @@ void ReportError(int iError)
|
|||
break;
|
||||
case ERROR_OPENBRACKET:
|
||||
Printf(TEXTCOLOR_RED " * ERROR! (%s, line %d) Found more '{' than '}' before '%s'.\n",
|
||||
fn, line_number, tempbuf);
|
||||
fn, line_number, parsebuf);
|
||||
break;
|
||||
case ERROR_CLOSEBRACKET:
|
||||
Printf(TEXTCOLOR_RED " * ERROR!(%s, line %d) Found more '}' than '{' before '%s'.\n",
|
||||
fn, line_number, tempbuf);
|
||||
fn, line_number, parsebuf);
|
||||
break;
|
||||
case ERROR_NOENDSWITCH:
|
||||
Printf(TEXTCOLOR_RED " * ERROR!%s(%s, line %d) Did not find endswitch before '%s'.\n",
|
||||
fn, line_number, tempbuf);
|
||||
fn, line_number, parsebuf);
|
||||
break;
|
||||
|
||||
}
|
||||
|
@ -241,7 +274,7 @@ void ReportError(int iError)
|
|||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
int getkeyword(const char* text)
|
||||
int ConCompiler::getkeyword(const char* text)
|
||||
{
|
||||
ptrdiff_t min = 0;
|
||||
ptrdiff_t max = countof(cmdList) - 1;
|
||||
|
@ -273,7 +306,7 @@ int getkeyword(const char* text)
|
|||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
FString translatelabeltype(int type)
|
||||
FString ConCompiler::translatelabeltype(int type)
|
||||
{
|
||||
FString buf;
|
||||
for (int i = 0; i < 6; i++)
|
||||
|
@ -321,7 +354,7 @@ int getlabelvalue(const char* text)
|
|||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
bool ispecial(char c)
|
||||
bool ConCompiler::ispecial(char c)
|
||||
{
|
||||
if (c == 0x0a)
|
||||
{
|
||||
|
@ -336,7 +369,7 @@ bool ispecial(char c)
|
|||
return false;
|
||||
}
|
||||
|
||||
bool isaltok(char c)
|
||||
static bool isaltok(char c)
|
||||
{
|
||||
// isalnum pukes on negative input.
|
||||
return c > 0 && (isalnum(c) || c == '{' || c == '}' || c == '/' || c == '*' || c == '-' || c == '_' || c == '.');
|
||||
|
@ -348,13 +381,13 @@ bool isaltok(char c)
|
|||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void skiptoendofline()
|
||||
void ConCompiler::skiptoendofline()
|
||||
{
|
||||
while (*textptr != 0x0a && *textptr != 0x0d && *textptr != 0)
|
||||
textptr++;
|
||||
}
|
||||
|
||||
void skipwhitespace()
|
||||
void ConCompiler::skipwhitespace()
|
||||
{
|
||||
while (*textptr == ' ' || *textptr == '\t' || *textptr == '\r' || *textptr == '\n')
|
||||
{
|
||||
|
@ -363,7 +396,7 @@ void skipwhitespace()
|
|||
}
|
||||
}
|
||||
|
||||
void skipblockcomment()
|
||||
void ConCompiler::skipblockcomment()
|
||||
{
|
||||
while (*textptr != '*' || textptr[1] != '/')
|
||||
{
|
||||
|
@ -374,7 +407,7 @@ void skipblockcomment()
|
|||
textptr += 2;
|
||||
}
|
||||
|
||||
bool skipcomments()
|
||||
bool ConCompiler::skipcomments()
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
|
@ -404,7 +437,7 @@ bool skipcomments()
|
|||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
int keyword(void)
|
||||
int ConCompiler::keyword(void)
|
||||
{
|
||||
int i;
|
||||
const char* temptextptr;
|
||||
|
@ -422,12 +455,12 @@ int keyword(void)
|
|||
i = 0;
|
||||
while (isaltok(*temptextptr))
|
||||
{
|
||||
tempbuf[i] = *(temptextptr++);
|
||||
parsebuf[i] = *(temptextptr++);
|
||||
i++;
|
||||
}
|
||||
tempbuf[i] = 0;
|
||||
parsebuf[i] = 0;
|
||||
|
||||
return getkeyword(tempbuf);
|
||||
return getkeyword(parsebuf);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
|
@ -436,7 +469,7 @@ int keyword(void)
|
|||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void getlabel(void)
|
||||
void ConCompiler::getlabel(void)
|
||||
{
|
||||
long i;
|
||||
|
||||
|
@ -459,8 +492,7 @@ void getlabel(void)
|
|||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// script buffer access wrappers. These are here to reduce the affected code
|
||||
// when the time comes to refactor the buffer into a dynamic array.
|
||||
// script buffer access wrappers.
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
@ -469,7 +501,7 @@ static void setscriptvalue(int offset, int value)
|
|||
ScriptCode[offset] = value;
|
||||
}
|
||||
|
||||
int scriptpos()
|
||||
static int scriptpos()
|
||||
{
|
||||
return ScriptCode.Size();
|
||||
}
|
||||
|
@ -498,7 +530,7 @@ void pushlabeladdress()
|
|||
}
|
||||
*/
|
||||
|
||||
void appendlabelvalue(labeltypes type, int value)
|
||||
void ConCompiler::appendlabelvalue(labeltypes type, int value)
|
||||
{
|
||||
labels.Reserve(1);
|
||||
labels.Last().type = type;
|
||||
|
@ -506,7 +538,7 @@ void appendlabelvalue(labeltypes type, int value)
|
|||
labels.Last().value = value;
|
||||
}
|
||||
|
||||
void appendlabeladdress(labeltypes type, int offset = 0)
|
||||
void ConCompiler::appendlabeladdress(labeltypes type, int offset)
|
||||
{
|
||||
appendlabelvalue(type, ScriptCode.Size() + offset);
|
||||
}
|
||||
|
@ -514,11 +546,11 @@ void appendlabeladdress(labeltypes type, int offset = 0)
|
|||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
//Returns its code #
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
int transword(void) //Returns its code #
|
||||
int ConCompiler::transword(void)
|
||||
{
|
||||
int i, l;
|
||||
|
||||
|
@ -537,13 +569,13 @@ int transword(void) //Returns its code #
|
|||
{
|
||||
if (l < 31)
|
||||
{
|
||||
tempbuf[l] = textptr[l];
|
||||
parsebuf[l] = textptr[l];
|
||||
l++;
|
||||
}
|
||||
}
|
||||
tempbuf[l] = 0;
|
||||
parsebuf[l] = 0;
|
||||
|
||||
i = getkeyword(tempbuf);
|
||||
i = getkeyword(parsebuf);
|
||||
if (i >= 0)
|
||||
{
|
||||
appendscriptvalue(i);
|
||||
|
@ -553,19 +585,19 @@ int transword(void) //Returns its code #
|
|||
|
||||
textptr += l;
|
||||
|
||||
const char* fn = fileSystem.GetFileFullName(g_currentSourceFile);
|
||||
if (tempbuf[0] == '{' && tempbuf[1] != 0)
|
||||
Printf(TEXTCOLOR_RED " * ERROR!(%s, line %d) Expecting a SPACE or CR between '{' and '%s'.\n", fn, line_number, tempbuf + 1);
|
||||
else if (tempbuf[0] == '}' && tempbuf[1] != 0)
|
||||
Printf(TEXTCOLOR_RED " * ERROR!(%s, line %d) Expecting a SPACE or CR between '}' and '%s'.\n", fn, line_number, tempbuf + 1);
|
||||
else if (tempbuf[0] == '/' && tempbuf[1] == '/' && tempbuf[2] != 0)
|
||||
Printf(TEXTCOLOR_RED " * ERROR!(%s, line %d) Expecting a SPACE between '//' and '%s'.\n", fn, line_number, tempbuf + 2);
|
||||
else if (tempbuf[0] == '/' && tempbuf[1] == '*' && tempbuf[2] != 0)
|
||||
Printf(TEXTCOLOR_RED " * ERROR!(%s, line %d) Expecting a SPACE between '/*' and '%s'.\n", fn, line_number, tempbuf + 2);
|
||||
else if (tempbuf[0] == '*' && tempbuf[1] == '/' && tempbuf[2] != 0)
|
||||
Printf(TEXTCOLOR_RED " * ERROR!(%s, line %d) Expecting a SPACE between '*/' and '%s'.\n", fn, line_number, tempbuf + 2);
|
||||
const char* fn = fileSystem.GetFileFullName(currentsourcefile);
|
||||
if (parsebuf[0] == '{' && parsebuf[1] != 0)
|
||||
Printf(TEXTCOLOR_RED " * ERROR!(%s, line %d) Expecting a SPACE or CR between '{' and '%s'.\n", fn, line_number, parsebuf + 1);
|
||||
else if (parsebuf[0] == '}' && parsebuf[1] != 0)
|
||||
Printf(TEXTCOLOR_RED " * ERROR!(%s, line %d) Expecting a SPACE or CR between '}' and '%s'.\n", fn, line_number, parsebuf + 1);
|
||||
else if (parsebuf[0] == '/' && parsebuf[1] == '/' && parsebuf[2] != 0)
|
||||
Printf(TEXTCOLOR_RED " * ERROR!(%s, line %d) Expecting a SPACE between '//' and '%s'.\n", fn, line_number, parsebuf + 2);
|
||||
else if (parsebuf[0] == '/' && parsebuf[1] == '*' && parsebuf[2] != 0)
|
||||
Printf(TEXTCOLOR_RED " * ERROR!(%s, line %d) Expecting a SPACE between '/*' and '%s'.\n", fn, line_number, parsebuf + 2);
|
||||
else if (parsebuf[0] == '*' && parsebuf[1] == '/' && parsebuf[2] != 0)
|
||||
Printf(TEXTCOLOR_RED " * ERROR!(%s, line %d) Expecting a SPACE between '*/' and '%s'.\n", fn, line_number, parsebuf + 2);
|
||||
else
|
||||
Printf(TEXTCOLOR_RED " * ERROR!(%s, line %d) Keyword expected, got '%s'.\n", fn, line_number, tempbuf + 2);
|
||||
Printf(TEXTCOLOR_RED " * ERROR!(%s, line %d) Keyword expected, got '%s'.\n", fn, line_number, parsebuf + 2);
|
||||
|
||||
errorcount++;
|
||||
return -1;
|
||||
|
@ -577,7 +609,7 @@ int transword(void) //Returns its code #
|
|||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
int transnum(int type)
|
||||
int ConCompiler::transnum(int type)
|
||||
{
|
||||
int l;
|
||||
|
||||
|
@ -595,13 +627,13 @@ int transnum(int type)
|
|||
{
|
||||
if (l < 31)
|
||||
{
|
||||
tempbuf[l] = textptr[l];
|
||||
parsebuf[l] = textptr[l];
|
||||
l++;
|
||||
}
|
||||
}
|
||||
tempbuf[l] = 0;
|
||||
parsebuf[l] = 0;
|
||||
|
||||
if (getkeyword(tempbuf) >= 0)
|
||||
if (getkeyword(parsebuf) >= 0)
|
||||
{
|
||||
errorcount++;
|
||||
ReportError(ERROR_ISAKEYWORD);
|
||||
|
@ -611,7 +643,7 @@ int transnum(int type)
|
|||
|
||||
for (unsigned i = 0; i < labels.Size(); i++)
|
||||
{
|
||||
if (labels[i].compare(tempbuf) == 0)
|
||||
if (labels[i].compare(parsebuf) == 0)
|
||||
{
|
||||
// Non-values can be compared with 0.
|
||||
if (labels[i].type & type || (labels[i].value == 0))
|
||||
|
@ -624,7 +656,7 @@ int transnum(int type)
|
|||
textptr += l;
|
||||
auto el = translatelabeltype(type);
|
||||
auto gl = translatelabeltype(labels[i].type);
|
||||
const char* fn = fileSystem.GetFileFullName(g_currentSourceFile);
|
||||
const char* fn = fileSystem.GetFileFullName(currentsourcefile);
|
||||
Printf(TEXTCOLOR_YELLOW " * WARNING.(%s, line %d) %s: Expected a '%s' label but found a '%s' label instead.\n", fn, line_number, labels[i].GetChars(), el.GetChars(), gl.GetChars());
|
||||
return -1; // valid label name, but wrong type
|
||||
}
|
||||
|
@ -636,7 +668,7 @@ int transnum(int type)
|
|||
errorcount++;
|
||||
textptr += l;
|
||||
#ifdef FOR_LATER
|
||||
if (GetDefID(tempbuf) >= 0)
|
||||
if (GetDefID(parsebuf) >= 0)
|
||||
{
|
||||
Printf(TEXTCOLOR_ORANGE " Game Variable not expected\n");
|
||||
}
|
||||
|
@ -659,7 +691,7 @@ int transnum(int type)
|
|||
|
||||
if (type != LABEL_DEFINE && value != 0)
|
||||
{
|
||||
const char* fn = fileSystem.GetFileFullName(g_currentSourceFile);
|
||||
const char* fn = fileSystem.GetFileFullName(currentsourcefile);
|
||||
Printf(TEXTCOLOR_YELLOW " * WARNING.(%s, line %d) Expected an identifier, got a numeric literal %d.\n", fn, line_number, (int)value);
|
||||
}
|
||||
|
||||
|
@ -675,7 +707,7 @@ int transnum(int type)
|
|||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void checkforkeyword()
|
||||
void ConCompiler::checkforkeyword()
|
||||
{
|
||||
if (getkeyword(parselabel) >= 0)
|
||||
{
|
||||
|
@ -690,11 +722,10 @@ void checkforkeyword()
|
|||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
static TArray<char> parsebuffer; // global so that the storage is persistent across calls.
|
||||
|
||||
int parsecommand()
|
||||
int ConCompiler::parsecommand()
|
||||
{
|
||||
const char* fn = fileSystem.GetFileFullName(g_currentSourceFile);
|
||||
const char* fn = fileSystem.GetFileFullName(currentsourcefile);
|
||||
int i, j, k;
|
||||
int tempscrptr;
|
||||
uint8_t done, temp_ifelse_check;// , tw;
|
||||
|
@ -733,6 +764,7 @@ int parsecommand()
|
|||
{
|
||||
Printf(TEXTCOLOR_RED " * ERROR!(%s, line %d) State '%s' not found.\n", fn, line_number, parselabel.GetChars());
|
||||
errorcount++;
|
||||
return 0;
|
||||
}
|
||||
appendscriptvalue(labels[lnum].value);
|
||||
return 0;
|
||||
|
@ -760,6 +792,7 @@ int parsecommand()
|
|||
return 0;
|
||||
|
||||
case concmd_gamevar:
|
||||
{
|
||||
// syntax: gamevar <var1> <initial value> <flags>
|
||||
// defines var1 and sets initial value.
|
||||
// flags are used to define usage
|
||||
|
@ -780,9 +813,23 @@ int parsecommand()
|
|||
|
||||
transnum(LABEL_DEFINE); // get flags
|
||||
lnum = popscriptvalue();
|
||||
AddGameVar(parselabel, j, lnum & (~(GAMEVAR_FLAG_DEFAULT | GAMEVAR_FLAG_SECRET)));
|
||||
return 0;
|
||||
if (strlen(parselabel) > (MAXVARLABEL - 1))
|
||||
{
|
||||
warningcount++;
|
||||
Printf(TEXTCOLOR_RED " * WARNING.(%s, line %d) Variable Name '%s' too int (max is %d)\n", fn, line_number, parselabel, MAXVARLABEL - 1);
|
||||
return 0;
|
||||
}
|
||||
int res = AddGameVar(parselabel, j, lnum & (~(GAMEVAR_FLAG_DEFAULT | GAMEVAR_FLAG_SECRET)));
|
||||
if (res < 0)
|
||||
{
|
||||
errorcount++;
|
||||
if (res == -1) Printf(TEXTCOLOR_RED " * ERROR.(%s, line %d) Duplicate game variable definition '%s'.\n", fn, line_number, parselabel);
|
||||
else if (res == -2) Printf(TEXTCOLOR_RED " * ERROR.(%s, line %d) '%s' maximum number of game variables exceeded.\n", fn, line_number, parselabel);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
case concmd_define:
|
||||
getlabel();
|
||||
checkforkeyword();
|
||||
|
@ -934,8 +981,8 @@ int parsecommand()
|
|||
|
||||
auto data = fileSystem.GetFileData(fni, 1);
|
||||
|
||||
temp_current_file = g_currentSourceFile;
|
||||
g_currentSourceFile = fni;
|
||||
temp_current_file = currentsourcefile;
|
||||
currentsourcefile = fni;
|
||||
|
||||
temp_line_number = line_number;
|
||||
line_number = 1;
|
||||
|
@ -951,7 +998,7 @@ int parsecommand()
|
|||
textptr = origtptr;
|
||||
line_number = temp_line_number;
|
||||
checking_ifelse = temp_ifelse_check;
|
||||
g_currentSourceFile = temp_current_file;
|
||||
currentsourcefile = temp_current_file;
|
||||
if (*textptr == '"') textptr++; // needed for RR.
|
||||
|
||||
return 0;
|
||||
|
@ -1352,7 +1399,7 @@ int parsecommand()
|
|||
case concmd_addlogvar:
|
||||
// syntax: addlogvar <var>
|
||||
|
||||
appendscriptvalue(g_currentSourceFile);
|
||||
appendscriptvalue(currentsourcefile);
|
||||
appendscriptvalue(line_number);
|
||||
|
||||
// get the ID of the DEF
|
||||
|
@ -1375,7 +1422,7 @@ int parsecommand()
|
|||
// syntax: addlog
|
||||
|
||||
// source file.
|
||||
appendscriptvalue(g_currentSourceFile);
|
||||
appendscriptvalue(currentsourcefile);
|
||||
|
||||
// prints the line number in the log file.
|
||||
appendscriptvalue(line_number);
|
||||
|
@ -1703,7 +1750,7 @@ int parsecommand()
|
|||
case concmd_gamestartup:
|
||||
{
|
||||
popscriptvalue();
|
||||
auto parseone = []() { transnum(LABEL_DEFINE); return popscriptvalue(); };
|
||||
auto parseone = [=]() { transnum(LABEL_DEFINE); return popscriptvalue(); };
|
||||
ud.const_visibility = parseone();
|
||||
impact_damage = parseone();
|
||||
max_player_health = parseone();
|
||||
|
@ -1754,15 +1801,15 @@ int parsecommand()
|
|||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void compilecon(const char *filenam)
|
||||
void ConCompiler::compilecon(const char *filenam)
|
||||
{
|
||||
g_currentSourceFile = fileSystem.FindFile(filenam);
|
||||
if (g_currentSourceFile < 0)
|
||||
currentsourcefile = fileSystem.FindFile(filenam);
|
||||
if (currentsourcefile < 0)
|
||||
{
|
||||
I_FatalError("%s: Missing con file(s).", filenam);
|
||||
}
|
||||
Printf("Compiling: '%s'.\n", filenam);
|
||||
auto data = fileSystem.GetFileData(g_currentSourceFile, 1);
|
||||
auto data = fileSystem.GetFileData(currentsourcefile, 1);
|
||||
textptr = (char*)data.Data();
|
||||
|
||||
line_number = 1;
|
||||
|
@ -1817,6 +1864,22 @@ static const char* ConFile(void)
|
|||
return "game.con";
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// process the music definitions after all map records are set up.
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void ConCompiler::setmusic()
|
||||
{
|
||||
for (auto& tm : tempMusic)
|
||||
{
|
||||
auto map = FindMapByLevelNum(tm.levnum);
|
||||
if (map) map->music = tm.music;
|
||||
}
|
||||
tempMusic.Clear();
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// why was this called loadefs?
|
||||
|
@ -1842,18 +1905,19 @@ void loadcons()
|
|||
auto before = I_nsTime();
|
||||
|
||||
ScriptCode.Push(0);
|
||||
compilecon(ConFile()); //Tokenize
|
||||
ConCompiler comp;
|
||||
comp.compilecon(ConFile()); //Tokenize
|
||||
|
||||
if (userConfig.AddCons) for (FString& m : *userConfig.AddCons.get())
|
||||
{
|
||||
compilecon(m);
|
||||
comp.compilecon(m);
|
||||
}
|
||||
ScriptCode.ShrinkToFit();
|
||||
labels.ShrinkToFit();
|
||||
userConfig.AddCons.reset();
|
||||
setscriptvalue(0, scriptpos());
|
||||
|
||||
if (errorcount)
|
||||
if (comp.getErrorCount())
|
||||
{
|
||||
I_FatalError("Failed to compile CONs.");
|
||||
}
|
||||
|
@ -1899,13 +1963,7 @@ void loadcons()
|
|||
maprec->levelNumber = levelnum(1, 7);
|
||||
}
|
||||
}
|
||||
for (auto& tm : tempMusic)
|
||||
{
|
||||
auto map = FindMapByLevelNum(tm.levnum);
|
||||
if (map) map->music = tm.music;
|
||||
}
|
||||
tempMusic.Clear();
|
||||
|
||||
comp.setmusic();
|
||||
}
|
||||
|
||||
END_DUKE_NS
|
||||
|
|
|
@ -1,85 +0,0 @@
|
|||
//-------------------------------------------------------------------------
|
||||
/*
|
||||
Copyright (C) 2016 EDuke32 developers and contributors
|
||||
|
||||
This file is part of EDuke32.
|
||||
|
||||
EDuke32 is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License version 2
|
||||
as published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
#ifndef gamedef_h_
|
||||
#define gamedef_h_
|
||||
|
||||
#include "gamevar.h"
|
||||
#include "funct.h"
|
||||
#include "build.h" // hashtable_t
|
||||
#include "common.h" // tokenlist
|
||||
#include "player.h" // projectile_t
|
||||
|
||||
BEGIN_DUKE_NS
|
||||
|
||||
#define LABEL_HASPARM2 1
|
||||
#define LABEL_ISSTRING 2
|
||||
|
||||
// "magic" number for { and }, overrides line number in compiled code for later detection
|
||||
#define VM_IFELSE_MAGIC 31337
|
||||
#define VM_INSTMASK 0xfff
|
||||
#define VM_DECODE_LINE_NUMBER(xxx) ((int)((xxx) >> 12))
|
||||
|
||||
extern intptr_t apScriptGameEvent[];
|
||||
|
||||
extern char g_scriptFileName[BMAX_PATH];
|
||||
|
||||
extern const uint32_t CheatFunctionFlags[];
|
||||
extern const uint8_t CheatFunctionIDs[];
|
||||
|
||||
extern int errorcount;
|
||||
extern int32_t line_number;
|
||||
extern int32_t g_totalLines;
|
||||
extern int warningcount;
|
||||
extern int32_t otherp;
|
||||
|
||||
int32_t C_AllocQuote(int32_t qnum);
|
||||
void C_InitQuotes(void);
|
||||
|
||||
extern int32_t g_numProjectiles;
|
||||
|
||||
void G_DoGameStartup(const int32_t *params);
|
||||
void C_DefineMusic(int volumeNum, int levelNum, const char *fileName);
|
||||
|
||||
void C_DefineVolumeFlags(int32_t vol, int32_t flags);
|
||||
void ReportError(int32_t iError);
|
||||
void loadcons();
|
||||
|
||||
extern int32_t g_errorLineNum;
|
||||
extern int32_t g_tw;
|
||||
|
||||
typedef struct {
|
||||
const char* token;
|
||||
int32_t val;
|
||||
} tokenmap_t;
|
||||
|
||||
extern char const * VM_GetKeywordForID(int32_t id);
|
||||
|
||||
extern TArray<int> ScriptCode;
|
||||
|
||||
|
||||
#include "concmd.h"
|
||||
|
||||
|
||||
END_DUKE_NS
|
||||
|
||||
#endif // gamedef_h_
|
|
@ -34,7 +34,6 @@ source as it is released.
|
|||
|
||||
#include "ns.h"
|
||||
#include "global.h"
|
||||
#include "gamedef.h"
|
||||
#include "serializer.h"
|
||||
#include "names.h"
|
||||
#include "build.h"
|
||||
|
@ -92,7 +91,7 @@ void SerializeGameVars(FSerializer &arc)
|
|||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
bool AddGameVar(const char* pszLabel, intptr_t lValue, unsigned dwFlags)
|
||||
int AddGameVar(const char* pszLabel, intptr_t lValue, unsigned dwFlags)
|
||||
{
|
||||
|
||||
int i;
|
||||
|
@ -103,12 +102,6 @@ bool AddGameVar(const char* pszLabel, intptr_t lValue, unsigned dwFlags)
|
|||
if (dwFlags & (GAMEVAR_FLAG_PLONG | GAMEVAR_FLAG_PFUNC))
|
||||
dwFlags |= GAMEVAR_FLAG_SYSTEM; // force system if PLONG
|
||||
|
||||
if (strlen(pszLabel) > (MAXVARLABEL - 1))
|
||||
{
|
||||
warningcount++;
|
||||
Printf(TEXTCOLOR_RED " * WARNING.(L%ld) Variable Name '%s' too int (max is %d)\n", line_number, pszLabel, MAXVARLABEL - 1);
|
||||
return 0;
|
||||
}
|
||||
for (i = 0; i < iGameVarCount; i++)
|
||||
{
|
||||
if (strcmp(pszLabel, aGameVars[i].szLabel) == 0)
|
||||
|
@ -121,13 +114,7 @@ bool AddGameVar(const char* pszLabel, intptr_t lValue, unsigned dwFlags)
|
|||
// it's OK to replace
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
// it's a duplicate in error
|
||||
errorcount++;
|
||||
Printf(TEXTCOLOR_RED " * ERROR.(L%ld) Duplicate Game definition '%s' ignored.\n", line_number, pszLabel);
|
||||
return 0;
|
||||
}
|
||||
else return -1;
|
||||
}
|
||||
}
|
||||
if (i < MAXGAMEVARS)
|
||||
|
@ -191,7 +178,7 @@ bool AddGameVar(const char* pszLabel, intptr_t lValue, unsigned dwFlags)
|
|||
else
|
||||
{
|
||||
// no room to add...
|
||||
return 0;
|
||||
return -2;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -113,16 +113,7 @@ extern int g_iZRangeVarID; // var ID of "ZRANGE"
|
|||
extern int g_iAngRangeVarID; // var ID of "ANGRANGE"
|
||||
extern int g_iAimAngleVarID; // var ID of "AUTOAIMANGLE"
|
||||
|
||||
#if 0
|
||||
// global crap for event management
|
||||
extern int g_i, g_p;
|
||||
extern int g_x;
|
||||
extern int* g_t;
|
||||
extern uint8_t killit_flag;
|
||||
//extern sprite_ype* g_sp;
|
||||
#endif
|
||||
|
||||
bool AddGameVar(const char *pszLabel, intptr_t lValue, unsigned dwFlags);
|
||||
int AddGameVar(const char *pszLabel, intptr_t lValue, unsigned dwFlags);
|
||||
int GetGameID(const char *szGameLabel);
|
||||
int GetDefID(const char *szGameLabel);
|
||||
void ClearGameVars(void);
|
||||
|
|
|
@ -221,15 +221,7 @@ extern int32_t g_cdTrack;
|
|||
// MSDN (https://msdn.microsoft.com/en-us/library/2e70t5y1%28VS.80%29.aspx) says:
|
||||
// "pack takes effect at the first struct, union, or class declaration after
|
||||
// the pragma is seen; pack has no effect on definitions."
|
||||
#pragma pack(push,1)
|
||||
#ifdef global_c_
|
||||
static playerdata_t g_player_s[1 + MAXPLAYERS];
|
||||
playerdata_t *const g_player = &g_player_s[1];
|
||||
#else
|
||||
extern playerdata_t *const g_player;
|
||||
#endif
|
||||
G_EXTERN player_orig po[MAXPLAYERS];
|
||||
#pragma pack(pop)
|
||||
|
||||
G_EXTERN uint32_t everyothertime;
|
||||
G_EXTERN double g_gameUpdateTime;
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
#include "mathutil.h"
|
||||
#include "glbackend/glbackend.h"
|
||||
#include "player.h"
|
||||
|
||||
// all inline functions.
|
||||
BEGIN_DUKE_NS
|
||||
|
|
|
@ -60,8 +60,7 @@ extern input_t sync[MAXPLAYERS];
|
|||
|
||||
# define PWEAPON(Player, Weapon, Wmember) (aplWeapon ## Wmember [Weapon][Player])
|
||||
|
||||
extern playerdata_t *const g_player;
|
||||
|
||||
extern playerdata_t g_player[MAXPLAYERS];
|
||||
|
||||
void P_GetInput(int playerNum);
|
||||
void P_GetInputMotorcycle(int playerNum);
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
#pragma once
|
||||
#include "names.h"
|
||||
|
||||
BEGIN_DUKE_NS
|
||||
|
||||
|
|
|
@ -71,5 +71,7 @@ int32_t PHEIGHT = PHEIGHT_DUKE;
|
|||
|
||||
int32_t lastvisinc;
|
||||
|
||||
playerdata_t g_player[MAXPLAYERS];
|
||||
|
||||
|
||||
END_DUKE_NS
|
||||
|
|
|
@ -680,8 +680,6 @@ static uint8_t *svinitsnap;
|
|||
static uint32_t svdiffsiz;
|
||||
static uint8_t *svdiff;
|
||||
|
||||
#include "gamedef.h"
|
||||
|
||||
#define SV_SKIPMASK (GAMEVAR_READONLY | GAMEVAR_PTR_MASK)
|
||||
|
||||
static char svgm_vars_string [] = "blK:vars";
|
||||
|
|
Loading…
Reference in a new issue