//------------------------------------------------------------------------- /* Copyright (C) 1996, 2003 - 3D Realms Entertainment Copyright (C) 2000, 2003 - Matt Saettler (EDuke Enhancements) Copyright (C) 2004, 2007 - EDuke32 developers 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ //------------------------------------------------------------------------- #include "duke3d.h" #include "gamedef.h" #include "osd.h" extern int g_i,g_p; void ResetPointerVars(void); extern void FreeMapState(int mapnum); static void FreeGameVars(void) /* called from ReadGameVars() and ResetGameVars() */ { // call this function as many times as needed. int i; // AddLog("FreeGameVars"); for (i=0;ivars[j]) map[i].savedstate->vars[j] = Bcalloc(MAXPLAYERS,sizeof(intptr_t)); if (kdfread(&map[i].savedstate->vars[j][0],sizeof(intptr_t) * MAXPLAYERS, 1, fil) != 1) goto corrupt; } else if (aGameVars[j].dwFlags & GAMEVAR_FLAG_PERACTOR) { if (!map[i].savedstate->vars[j]) map[i].savedstate->vars[j] = Bcalloc(MAXSPRITES,sizeof(intptr_t)); if (kdfread(&map[i].savedstate->vars[j][0],sizeof(intptr_t), MAXSPRITES, fil) != MAXSPRITES) goto corrupt; } } } else if (map[i].savedstate) { FreeMapState(i); } } if (kdfread(&l,sizeof(l),1,fil) != 1) goto corrupt; if (kdfread(g_szBuf,l,1,fil) != 1) goto corrupt; g_szBuf[l]=0; OSD_Printf("%s\n",g_szBuf); #if 0 { FILE *fp; AddLog("Dumping Vars..."); fp=fopen("xxx.txt","w"); if (fp) { DumpGameVars(fp); fclose(fp); } AddLog("Done Dumping..."); } #endif return(0); corrupt: return(1); } void SaveGameVars(FILE *fil) { int i, j; intptr_t l; char savedstate[MAXVOLUMES*MAXLEVELS]; Bmemset(&savedstate,0,sizeof(savedstate)); // AddLog("Saving Game Vars to File"); dfwrite(&iGameVarCount,sizeof(iGameVarCount),1,fil); for (i=0;ivars[j][0],sizeof(intptr_t) * MAXPLAYERS, 1, fil); } else if (aGameVars[j].dwFlags & GAMEVAR_FLAG_PERACTOR) { dfwrite(&map[i].savedstate->vars[j][0],sizeof(intptr_t) * MAXSPRITES, 1, fil); } } } Bsprintf(g_szBuf,"EOF: EDuke32"); l=strlen(g_szBuf); dfwrite(&l,sizeof(l),1,fil); dfwrite(g_szBuf,l,1,fil); } void DumpGameVars(FILE *fp) { int i; if (!fp) { return; } fprintf(fp,"// Current Game Definitions\n\n"); for (i=0;i (MAXARRAYLABEL-1)) { error++; ReportError(-1); initprintf("%s:%d: error: array name `%s' exceeds limit of %d characters.\n",compilefile,line_number,pszLabel, MAXARRAYLABEL); return 0; } for (i=0;i (MAXVARLABEL-1)) { error++; ReportError(-1); initprintf("%s:%d: error: variable name `%s' exceeds limit of %d characters.\n",compilefile,line_number,pszLabel, MAXVARLABEL); return 0; } for (i=0;i= iGameVarCount || id<0) { if (id&(MAXGAMEVARS<<2)) { int index=GetGameVarID(*insptr++,iActor,iPlayer); id ^= (MAXGAMEVARS<<2); if (id&(MAXGAMEVARS<<1)) // negative array access { m = -1; id ^= (MAXGAMEVARS<<1); } // OSD_Printf("GetGameVarID(): reading from array\n"); if ((index < aGameArrays[id].size)&&(index>=0)) return(m * aGameArrays[id].plValues[index]); OSD_Printf(OSDTEXT_DARKRED OSDTEXT_BRIGHT "GetGameVarID(): invalid array index (%s[%d])\n",aGameArrays[id].szLabel,index); return -1; } if (!(id&(MAXGAMEVARS<<1))) { OSD_Printf(OSDTEXT_DARKRED OSDTEXT_BRIGHT "GetGameVarID(): invalid gamevar ID (%d)\n",id); return -1; } m = -1; id ^= (MAXGAMEVARS<<1); } if (aGameVars[id].dwFlags & GAMEVAR_FLAG_PERPLAYER) { // for the current player if (iPlayer >= 0 && iPlayer < MAXPLAYERS) { //Bsprintf(g_szBuf,"GetGameVarID(%d, %d, %d) returns %d\n",id,iActor,iPlayer, aGameVars[id].plValues[iPlayer]); //AddLog(g_szBuf); return(m * aGameVars[id].plValues[iPlayer]); } return(m * aGameVars[id].lValue); } if (aGameVars[id].dwFlags & GAMEVAR_FLAG_PERACTOR) { // for the current actor if (iActor >= 0 && iActor <= MAXSPRITES) { return(m * aGameVars[id].plValues[iActor]); } return(m * aGameVars[id].lValue); } if (aGameVars[id].dwFlags & GAMEVAR_FLAG_INTPTR) { return(m * (*((int*)aGameVars[id].lValue))); } if (aGameVars[id].dwFlags & GAMEVAR_FLAG_SHORTPTR) { return(m * (*((short*)aGameVars[id].lValue))); } if (aGameVars[id].dwFlags & GAMEVAR_FLAG_CHARPTR) { return(m * (*((char*)aGameVars[id].lValue))); } return(m * aGameVars[id].lValue); } void SetGameArrayID(int id,int index, int lValue) { if (id<0 || id >= iGameArrayCount || !((index < aGameArrays[id].size)&&(index>=0))) { OSD_Printf(OSDTEXT_DARKRED OSDTEXT_BRIGHT "SetGameVarID(): tried to set invalid array ID (%d) or index out of bounds from sprite %d (%d), player %d\n",id,g_i,sprite[g_i].picnum,g_p); return; } aGameArrays[id].plValues[index]=lValue; } void SetGameVarID(int id, int lValue, int iActor, int iPlayer) { if (id<0 || id >= iGameVarCount) { OSD_Printf(OSDTEXT_DARKRED OSDTEXT_BRIGHT "SetGameVarID(): tried to set invalid gamevar ID (%d) from sprite %d (%d), player %d\n",id,g_i,sprite[g_i].picnum,g_p); return; } //Bsprintf(g_szBuf,"SGVI: %d ('%s') to %d for %d %d",id,aGameVars[id].szLabel,lValue,iActor,iPlayer); //AddLog(g_szBuf); if (aGameVars[id].dwFlags & GAMEVAR_FLAG_PERPLAYER) { if (iPlayer < 0 || iPlayer > MAXPLAYERS-1) { OSD_Printf(OSDTEXT_DARKRED OSDTEXT_BRIGHT "SetGameVarID(): invalid player (%d) for per-player gamevar %s from sprite %d (%d), player %d\n",iPlayer,aGameVars[id].szLabel,g_i,sprite[g_i].picnum,g_p); return; } // for the current player aGameVars[id].plValues[iPlayer]=lValue; return; } if (aGameVars[id].dwFlags & GAMEVAR_FLAG_PERACTOR) { if (iActor < 0 || iActor > MAXSPRITES-1) { OSD_Printf(OSDTEXT_DARKRED OSDTEXT_BRIGHT "SetGameVarID(): invalid sprite (%d) for per-actor gamevar %s from sprite %d (%d), player %d\n",iActor,aGameVars[id].szLabel,g_i,sprite[g_i].picnum,g_p); return; } // for the current actor aGameVars[id].plValues[iActor]=lValue; return; } if (aGameVars[id].dwFlags & GAMEVAR_FLAG_INTPTR) { // set the value at pointer *((int*)aGameVars[id].lValue)=(int)lValue; return; } if (aGameVars[id].dwFlags & GAMEVAR_FLAG_SHORTPTR) { // set the value at pointer *((short*)aGameVars[id].lValue)=(short)lValue; return; } if (aGameVars[id].dwFlags & GAMEVAR_FLAG_CHARPTR) { // set the value at pointer *((char*)aGameVars[id].lValue)=(char)lValue; return; } aGameVars[id].lValue=lValue; } int GetGameVar(const char *szGameLabel, int lDefault, int iActor, int iPlayer) { int i=0; for (;i