diff --git a/polymer/eduke32/source/duke3d.h b/polymer/eduke32/source/duke3d.h index f01c188bc..01d1f72f6 100644 --- a/polymer/eduke32/source/duke3d.h +++ b/polymer/eduke32/source/duke3d.h @@ -148,7 +148,7 @@ enum gamemodes { #define MAXCYCLERS 1024 -#define MAXSCRIPTSIZE 98304 +#define MAXSCRIPTSIZE 131072 #define MAXANIMATES 256 @@ -437,8 +437,7 @@ typedef struct { typedef struct { long ox,oy,oz; short oa,os; -} player_orig; - +} player_spawnpoint; extern char numplayersprites; @@ -529,7 +528,8 @@ extern char sounds[NUM_SOUNDS][BMAX_PATH]; // JBF 20040531: adding 16 extra to the script so we have some leeway // to (hopefully) safely abort when hitting the limit -extern long script[MAXSCRIPTSIZE+16],*scriptptr,*insptr,*labelcode,labelcnt,defaultlabelcnt,*labeltype; +extern long *script,*scriptptr,*insptr,*labelcode,labelcnt,defaultlabelcnt,*labeltype; +extern int g_ScriptSize; extern char *label; extern long *actorscrptr[MAXTILES],*parsing_actor; extern long *actorLoadEventScrptr[MAXTILES]; @@ -980,7 +980,7 @@ typedef struct { } playerdata_t; extern input inputfifo[MOVEFIFOSIZ][MAXPLAYERS]; -extern player_orig g_PlayerSpawnPoints[MAXPLAYERS]; +extern player_spawnpoint g_PlayerSpawnPoints[MAXPLAYERS]; extern playerdata_t g_player[MAXPLAYERS]; #include "funct.h" diff --git a/polymer/eduke32/source/game.c b/polymer/eduke32/source/game.c index 36eae856c..8c0be74c0 100644 --- a/polymer/eduke32/source/game.c +++ b/polymer/eduke32/source/game.c @@ -9314,6 +9314,8 @@ static void freeconmem(void) Bfree(label); if (labelcode != NULL) Bfree(labelcode); + if (script != NULL) + Bfree(script); } /* diff --git a/polymer/eduke32/source/gamedef.c b/polymer/eduke32/source/gamedef.c index 69c131181..11a819a9f 100644 --- a/polymer/eduke32/source/gamedef.c +++ b/polymer/eduke32/source/gamedef.c @@ -1443,9 +1443,9 @@ static long CountCaseStatements() { long lCount; char *temptextptr = textptr; - long *savescript = scriptptr; - long *savecase = casescriptptr; int temp_line_number = line_number; + long tempscriptptr = (unsigned)(scriptptr-script); + long tempsavecase = (unsigned)(casescriptptr-script); casecount=0; casescriptptr=NULL; @@ -1461,28 +1461,129 @@ static long CountCaseStatements() checking_switch++; textptr=temptextptr; - scriptptr=savescript; + scriptptr = (long *)(script+tempscriptptr); line_number = temp_line_number; lCount=casecount; casecount=0; - casescriptptr=savecase; + casescriptptr = (long *)(script+tempsavecase); return lCount; } static int parsecommand(void) { - long i, j=0, k=0, *tempscrptr, done, tw; + long i, j=0, k=0, done, tw; char *temptextptr; + long *tempscrptr; - if (((unsigned)(scriptptr-script) > MAXSCRIPTSIZE) && error == 0) + if ((unsigned)(scriptptr-script) > (unsigned)(g_ScriptSize-128)) { - /* Bsprintf(tempbuf,"fatal error: Size of compiled CON code exceeds maximum size! (%ud, %d)\n",(unsigned)(scriptptr-script),MAXSCRIPTSIZE); */ - ReportError(-1); - initprintf("%s:%ld: internal compiler error: Aborted (%ud)\n",compilefile,line_number,(unsigned)(scriptptr-script)); - initprintf(tempbuf); - error++; + long oscriptptr = (unsigned)(scriptptr-script); + long ocasescriptptr = (unsigned)(casescriptptr-script); + long oparsing_event = (unsigned)(parsing_event-script); + long oparsing_actor = (unsigned)(parsing_actor-script); + long olabelcode[MAXSECTORS]; + long *scriptptrs; + + Bmemset(&olabelcode,0,sizeof(olabelcode)); + + for (j=0;j<labelcnt;j++) + { + if (labeltype[j] != LABEL_DEFINE) //== LABEL_STATE || labeltype[j] == LABEL_AI || labeltype[j] == LABEL_ACTION || labeltype[j] == LABEL_MOVE) + olabelcode[j] = (long)(labelcode[j]-(long)script); + } + + scriptptrs = Bcalloc(1, (g_ScriptSize+16) * sizeof(long)); + for (i=0;i<g_ScriptSize-1;i++) + { + if ((long)script[i] >= (long)(&script[0]) && (long)script[i] < (long)(&script[g_ScriptSize])) + { + scriptptrs[i] = 1; + j = (long)script[i] - (long)&script[0]; + script[i] = j; + } + else scriptptrs[i] = 0; + } + + for (i=0;i<MAXTILES;i++) + if (actorscrptr[i]) + { + j = (long)actorscrptr[i]-(long)&script[0]; + actorscrptr[i] = (long *)j; + } + + for (i=0;i<MAXTILES;i++) + if (actorLoadEventScrptr[i]) + { + j = (long)actorLoadEventScrptr[i]-(long)&script[0]; + actorLoadEventScrptr[i] = (long *)j; + } + + for (i=0;i<MAXGAMEEVENTS;i++) + if (apScriptGameEvent[i]) + { + j = (long)apScriptGameEvent[i]-(long)&script[0]; + apScriptGameEvent[i] = (long *)j; + } + + //initprintf("offset: %ld\n",(unsigned)(scriptptr-script)); + g_ScriptSize += 16384; + initprintf("Increasing script buffer size to %ld bytes...\n",g_ScriptSize); + script = (long *)realloc(script, (g_ScriptSize+16) * sizeof(long)); + + if (script == NULL) + { + ReportError(-1); + initprintf("%s:%ld: out of memory: Aborted (%ud)\n",compilefile,line_number,(unsigned)(scriptptr-script)); + initprintf(tempbuf); + error++; + return 1; + } + scriptptr = (long *)(script+oscriptptr); + //initprintf("offset: %ld\n",(unsigned)(scriptptr-script)); + if (casescriptptr != NULL) + casescriptptr = (long *)(script+ocasescriptptr); + if (parsing_event != NULL) + parsing_event = (long *)(script+oparsing_event); + if (parsing_actor != NULL) + parsing_actor = (long *)(script+oparsing_actor); + + for (j=0;j<labelcnt;j++) + { + if (labeltype[j] != LABEL_DEFINE)//== LABEL_STATE || labeltype[j] == LABEL_AI || labeltype[j] == LABEL_ACTION || labeltype[j] == LABEL_MOVE) + { + labelcode[j] = (long)(script+olabelcode[j]); + } + } + + for (i=0;i<g_ScriptSize-16384;i++) + if (scriptptrs[i]) + { + j = (long)script[i]+(long)&script[0]; + script[i] = j; + } + + for (i=0;i<MAXTILES;i++) + if (actorscrptr[i]) + { + j = (long)actorscrptr[i]+(long)&script[0]; + actorscrptr[i] = (long *)j; + } + for (i=0;i<MAXTILES;i++) + if (actorLoadEventScrptr[i]) + { + j = (long)actorLoadEventScrptr[i]+(long)&script[0]; + actorLoadEventScrptr[i] = (long *)j; + } + + for (i=0;i<MAXGAMEEVENTS;i++) + if (apScriptGameEvent[i]) + { + j = (long)apScriptGameEvent[i]+(long)&script[0]; + apScriptGameEvent[i] = (long *)j; + } + Bfree(scriptptrs); } if ((error+warning) > 63 || (*textptr == '\0') || (*(textptr+1) == '\0')) return 1; @@ -2435,10 +2536,13 @@ static int parsecommand(void) case CON_ELSE: if (checking_ifelse) { + long offset; checking_ifelse--; tempscrptr = scriptptr; + offset = (unsigned)(tempscrptr-script); scriptptr++; //Leave a spot for the fail location parsecommand(); + tempscrptr = (long *)script+offset; *tempscrptr = (long) scriptptr; } else @@ -3311,17 +3415,23 @@ static int parsecommand(void) case CON_IFVARVARN: case CON_IFVARVARAND: case CON_WHILEVARVARN: + { + long offset; + transmultvars(2); tempscrptr = scriptptr; + offset = (unsigned)(tempscrptr-script); scriptptr++; // Leave a spot for the fail location j = keyword(); parsecommand(); + tempscrptr = (long *)script+offset; *tempscrptr = (long) scriptptr; if (tw != CON_WHILEVARVARN) checking_ifelse++; return 0; + } case CON_SPGETLOTAG: case CON_SPGETHITAG: @@ -3343,22 +3453,26 @@ static int parsecommand(void) case CON_IFVARN: case CON_IFVARAND: case CON_WHILEVARN: + { + long offset; // get the ID of the DEF transvar(); transnum(LABEL_DEFINE); // the number to check against... tempscrptr = scriptptr; + offset = (unsigned)(tempscrptr-script); scriptptr++; //Leave a spot for the fail location j = keyword(); parsecommand(); + tempscrptr = (long *)script+offset; *tempscrptr = (long) scriptptr; if (tw != CON_WHILEVARN) checking_ifelse++; return 0; - + } case CON_ADDLOGVAR: // syntax: addlogvar <var> @@ -3503,6 +3617,9 @@ static int parsecommand(void) break; case CON_SWITCH: + { + long tempoffset; + //AddLog("Got Switch statement"); if (checking_switch) { @@ -3514,6 +3631,7 @@ static int parsecommand(void) transvar(); tempscrptr= scriptptr; + tempoffset = (unsigned)(tempscrptr-script); *scriptptr++=0; // leave spot for end location (for after processing) *scriptptr++=0; // count of case statements casescriptptr=scriptptr; // the first case's pointer. @@ -3540,6 +3658,7 @@ static int parsecommand(void) } if (tempscrptr) { + tempscrptr = (long *)(script+tempoffset); tempscrptr[1]=(long)j; // save count of cases } else @@ -3559,12 +3678,12 @@ static int parsecommand(void) //AddLog(g_szBuf); casecount=0; - while (parsecommand() == 0) { //Bsprintf(g_szBuf,"SWITCH2: '%.22s'",textptr); //AddLog(g_szBuf); } + //Bsprintf(g_szBuf,"SWITCHXX: '%.22s'",textptr); //AddLog(g_szBuf); // done processing switch. clean up. @@ -3576,7 +3695,7 @@ static int parsecommand(void) casecount=0; if (tempscrptr) { - tempscrptr[0]= (long)scriptptr - (long)&script[0]; // save 'end' location + tempscrptr[0]= (unsigned)(scriptptr-script); // save 'end' location } else { @@ -3593,7 +3712,8 @@ static int parsecommand(void) //AddLog(g_szBuf); } //AddLog("End of Switch statement"); - break; + } + break; case CON_CASE: //AddLog("Found Case"); @@ -3622,7 +3742,7 @@ repeatcase: { //AddLog("Adding value to script"); casescriptptr[casecount++]=j; // save value - casescriptptr[casecount]=(long)((long*)scriptptr-&script[0]); // save offset + casescriptptr[casecount]=(long)((long*)scriptptr-script); // save offset } // j = keyword(); //Bsprintf(g_szBuf,"case3: %.12s",textptr); @@ -3670,7 +3790,7 @@ repeatcase: } if (casescriptptr) { - casescriptptr[0]=(long)(scriptptr-&script[0]); // save offset + casescriptptr[0]=(long)(scriptptr-script); // save offset } //Bsprintf(g_szBuf,"default: '%.22s'",textptr); //AddLog(g_szBuf); @@ -3827,6 +3947,8 @@ repeatcase: case CON_IFAWAYFROMWALL: case CON_IFCANSEETARGET: case CON_IFNOSOUNDS: + { + long offset; if (tw == CON_IFP) { j = 0; @@ -3842,16 +3964,18 @@ repeatcase: } tempscrptr = scriptptr; + offset = (unsigned)(tempscrptr-script); + scriptptr++; //Leave a spot for the fail location j = keyword(); parsecommand(); - + tempscrptr = (long *)script+offset; *tempscrptr = (long) scriptptr; checking_ifelse++; return 0; - + } case CON_LEFTBRACE: if (!(parsing_state || parsing_actor || parsing_event)) { @@ -4735,7 +4859,10 @@ void loadefs(const char *filenam) clearbuf(actorscrptr,MAXTILES,0L); // JBF 20040531: MAXSPRITES? I think Todd meant MAXTILES... clearbuf(actorLoadEventScrptr,MAXTILES,0L); // I think this should be here... clearbufbyte(actortype,MAXTILES,0L); - clearbufbyte(script,sizeof(script),0l); // JBF 20040531: yes? no? +// clearbufbyte(script,sizeof(script),0l); // JBF 20040531: yes? no? + if (script != NULL) + Bfree(script); + script = Bcalloc(1,sizeof(long)*(g_ScriptSize+16)); labelcnt = defaultlabelcnt = 0; scriptptr = script+1; @@ -4816,7 +4943,7 @@ void loadefs(const char *filenam) k++; } - initprintf("\nCompiled code size: %ld/%ld bytes\n",(unsigned)(scriptptr-script),MAXSCRIPTSIZE); + initprintf("\nCompiled code size: %ld/%ld bytes\n",(unsigned)(scriptptr-script),g_ScriptSize); initprintf("%ld/%ld labels, %d/%d variables\n",labelcnt,min((sizeof(sector)/sizeof(long)),(sizeof(sprite)/(1<<6))),iGameVarCount,MAXGAMEVARS); initprintf("%ld event definitions, %ld defined actors\n\n",j,k); diff --git a/polymer/eduke32/source/gameexec.c b/polymer/eduke32/source/gameexec.c index 7acc02d14..95ee77e27 100644 --- a/polymer/eduke32/source/gameexec.c +++ b/polymer/eduke32/source/gameexec.c @@ -4506,15 +4506,15 @@ static int parse(void) case CON_LDIST: insptr++; { - int distvar = *insptr++, xvar = *insptr++, yvar = *insptr++, distx=0; + int distvar = *insptr++, xvar = GetGameVarID(*insptr++, g_i, g_p), yvar = GetGameVarID(*insptr++, g_i, g_p), distx=0; switch (tw) { case CON_DIST: - distx = dist(&sprite[GetGameVarID(xvar, g_i, g_p)],&sprite[GetGameVarID(yvar, g_i, g_p)]); + distx = dist(&sprite[xvar],&sprite[yvar]); break; case CON_LDIST: - distx = ldist(&sprite[GetGameVarID(xvar, g_i, g_p)],&sprite[GetGameVarID(yvar, g_i, g_p)]); + distx = ldist(&sprite[xvar],&sprite[yvar]); break; } @@ -4526,14 +4526,16 @@ static int parse(void) case CON_GETANGLE: insptr++; { - int angvar = *insptr++, xvar = *insptr++, yvar = *insptr++; + int angvar = *insptr++; + int xvar = GetGameVarID(*insptr++, g_i, g_p); + int yvar = GetGameVarID(*insptr++, g_i, g_p); if (tw==CON_GETANGLE) { - SetGameVarID(angvar, getangle(GetGameVarID(xvar, g_i, g_p),GetGameVarID(yvar, g_i, g_p)), g_i, g_p); + SetGameVarID(angvar, getangle(xvar,yvar), g_i, g_p); break; } - SetGameVarID(angvar, getincangle(GetGameVarID(xvar, g_i, g_p),GetGameVarID(yvar, g_i, g_p)), g_i, g_p); + SetGameVarID(angvar, getincangle(xvar,yvar), g_i, g_p); break; } diff --git a/polymer/eduke32/source/global.c b/polymer/eduke32/source/global.c index 5c7c65bbd..8ddd68d99 100644 --- a/polymer/eduke32/source/global.c +++ b/polymer/eduke32/source/global.c @@ -88,7 +88,7 @@ char numplayersprites,loadfromgrouponly=0,earthquaketime; long fricxv,fricyv; playerdata_t g_player[MAXPLAYERS]; input inputfifo[MOVEFIFOSIZ][MAXPLAYERS]; -player_orig g_PlayerSpawnPoints[MAXPLAYERS]; +player_spawnpoint g_PlayerSpawnPoints[MAXPLAYERS]; user_defs ud; char pus, pub; @@ -114,7 +114,9 @@ long *actorscrptr[MAXTILES],*parsing_actor; char *label; char *music_pointer; char actortype[MAXTILES]; -long script[MAXSCRIPTSIZE+16]; +long *script = NULL; + +int g_ScriptSize = 16384; char display_mirror,typebuflen,typebuf[141]; diff --git a/polymer/eduke32/source/savegame.c b/polymer/eduke32/source/savegame.c index 6c05ee496..b8d206e25 100644 --- a/polymer/eduke32/source/savegame.c +++ b/polymer/eduke32/source/savegame.c @@ -123,7 +123,8 @@ int loadplayer(int spot) int k; char fn[13]; char mpfn[13]; - char *fnptr, scriptptrs[MAXSCRIPTSIZE]; + char *fnptr; + long *scriptptrs; long fil, bv, i, j, x; int32 nump; @@ -263,9 +264,11 @@ int loadplayer(int spot) if (kdfread(&cloudx[0],sizeof(short)<<7,1,fil) != 1) goto corrupt; if (kdfread(&cloudy[0],sizeof(short)<<7,1,fil) != 1) goto corrupt; - if (kdfread(&scriptptrs[0],1,MAXSCRIPTSIZE,fil) != MAXSCRIPTSIZE) goto corrupt; - if (kdfread(&script[0],4,MAXSCRIPTSIZE,fil) != MAXSCRIPTSIZE) goto corrupt; - for (i=0;i<MAXSCRIPTSIZE;i++) + if (kdfread(&g_ScriptSize,sizeof(g_ScriptSize),1,fil) != 1) goto corrupt; + scriptptrs = Bcalloc(1,g_ScriptSize * sizeof(g_ScriptSize)); + if (kdfread(&scriptptrs[0],sizeof(scriptptrs),g_ScriptSize,fil) != g_ScriptSize) goto corrupt; + if (kdfread(&script[0],sizeof(script),g_ScriptSize,fil) != g_ScriptSize) goto corrupt; + for (i=0;i<g_ScriptSize;i++) if (scriptptrs[i]) { j = (long)script[i]+(long)&script[0]; @@ -287,7 +290,7 @@ int loadplayer(int spot) actorLoadEventScrptr[i] = (long *)j; } - if (kdfread(&scriptptrs[0],1,MAXSPRITES,fil) != MAXSPRITES) goto corrupt; + if (kdfread(&scriptptrs[0],sizeof(scriptptrs),MAXSPRITES,fil) != MAXSPRITES) goto corrupt; if (kdfread(&hittype[0],sizeof(weaponhit),MAXSPRITES,fil) != MAXSPRITES) goto corrupt; for (i=0;i<MAXSPRITES;i++) @@ -515,7 +518,8 @@ int saveplayer(int spot) long i, j; char fn[13]; char mpfn[13]; - char *fnptr,scriptptrs[MAXSCRIPTSIZE]; + char *fnptr; + long *scriptptrs; FILE *fil; long bv = BYTEVERSION; @@ -611,9 +615,11 @@ int saveplayer(int spot) dfwrite(&cloudx[0],sizeof(short)<<7,1,fil); dfwrite(&cloudy[0],sizeof(short)<<7,1,fil); - for (i=0;i<MAXSCRIPTSIZE;i++) + dfwrite(&g_ScriptSize,sizeof(g_ScriptSize),1,fil); + scriptptrs = Bcalloc(1, g_ScriptSize * sizeof(scriptptrs)); + for (i=0;i<g_ScriptSize;i++) { - if ((long)script[i] >= (long)(&script[0]) && (long)script[i] < (long)(&script[MAXSCRIPTSIZE])) + if ((long)script[i] >= (long)(&script[0]) && (long)script[i] < (long)(&script[g_ScriptSize])) { scriptptrs[i] = 1; j = (long)script[i] - (long)&script[0]; @@ -622,10 +628,10 @@ int saveplayer(int spot) else scriptptrs[i] = 0; } - dfwrite(&scriptptrs[0],1,MAXSCRIPTSIZE,fil); - dfwrite(&script[0],4,MAXSCRIPTSIZE,fil); + dfwrite(&scriptptrs[0],sizeof(scriptptrs),g_ScriptSize,fil); + dfwrite(&script[0],sizeof(script),g_ScriptSize,fil); - for (i=0;i<MAXSCRIPTSIZE;i++) + for (i=0;i<g_ScriptSize;i++) if (scriptptrs[i]) { j = script[i]+(long)&script[0]; @@ -669,24 +675,24 @@ int saveplayer(int spot) j = (long)&script[0]; - if (T2 >= j && T2 < (long)(&script[MAXSCRIPTSIZE])) + if (T2 >= j && T2 < (long)(&script[g_ScriptSize])) { scriptptrs[i] |= 1; T2 -= j; } - if (T5 >= j && T5 < (long)(&script[MAXSCRIPTSIZE])) + if (T5 >= j && T5 < (long)(&script[g_ScriptSize])) { scriptptrs[i] |= 2; T5 -= j; } - if (T6 >= j && T6 < (long)(&script[MAXSCRIPTSIZE])) + if (T6 >= j && T6 < (long)(&script[g_ScriptSize])) { scriptptrs[i] |= 4; T6 -= j; } } - dfwrite(&scriptptrs[0],1,MAXSPRITES,fil); + dfwrite(&scriptptrs[0],sizeof(scriptptrs),MAXSPRITES,fil); dfwrite(&hittype[0],sizeof(weaponhit),MAXSPRITES,fil); for (i=0;i<MAXSPRITES;i++)