mirror of
https://github.com/ZDoom/raze-gles.git
synced 2025-01-27 01:10:51 +00:00
- added savegame records for all global data that looks to be game relevant.
The data organization here is a mess, no wonder that this game could only save at the beginning of a level. Fortunately it's all static so no allocations and pointers to track.
This commit is contained in:
parent
90fecbc6c0
commit
79d0818201
37 changed files with 570 additions and 54 deletions
|
@ -28,7 +28,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
|
||||||
BEGIN_PS_NS
|
BEGIN_PS_NS
|
||||||
|
|
||||||
|
|
||||||
#define kMaxAnims 400
|
#define kMaxAnims 400
|
||||||
|
|
||||||
short nMagicSeq = -1;
|
short nMagicSeq = -1;
|
||||||
|
@ -41,6 +40,16 @@ short AnimsFree[kMaxAnims];
|
||||||
Anim AnimList[kMaxAnims];
|
Anim AnimList[kMaxAnims];
|
||||||
uint8_t AnimFlags[kMaxAnims];
|
uint8_t AnimFlags[kMaxAnims];
|
||||||
|
|
||||||
|
static SavegameHelper sgh("anims",
|
||||||
|
SV(nMagicSeq),
|
||||||
|
SV(nPreMagicSeq),
|
||||||
|
SV(nSavePointSeq),
|
||||||
|
SV(nAnimsFree),
|
||||||
|
SA(AnimRunRec),
|
||||||
|
SA(AnimsFree),
|
||||||
|
SA(AnimList),
|
||||||
|
SA(AnimFlags),
|
||||||
|
nullptr);
|
||||||
|
|
||||||
void InitAnims()
|
void InitAnims()
|
||||||
{
|
{
|
||||||
|
|
|
@ -71,6 +71,13 @@ static actionSeq ActionSeq[] = {
|
||||||
|
|
||||||
short nAnubisDrum = 0;
|
short nAnubisDrum = 0;
|
||||||
|
|
||||||
|
static SavegameHelper sgh("anubis",
|
||||||
|
SA(AnubisList),
|
||||||
|
SV(AnubisSprite),
|
||||||
|
SV(AnubisCount),
|
||||||
|
SV(nAnubisDrum),
|
||||||
|
nullptr);
|
||||||
|
|
||||||
|
|
||||||
void InitAnubis()
|
void InitAnubis()
|
||||||
{
|
{
|
||||||
|
|
|
@ -59,6 +59,14 @@ uint8_t nBubblesFree[kMaxBubbles];
|
||||||
machine Machine[kMaxMachines];
|
machine Machine[kMaxMachines];
|
||||||
Bubble BubbleList[kMaxBubbles];
|
Bubble BubbleList[kMaxBubbles];
|
||||||
|
|
||||||
|
static SavegameHelper sgh("bubbles",
|
||||||
|
SA(BubbleCount),
|
||||||
|
SA(nFreeCount),
|
||||||
|
SA(nMachineCount),
|
||||||
|
SA(nBubblesFree),
|
||||||
|
SA(Machine),
|
||||||
|
SA(BubbleList),
|
||||||
|
nullptr);
|
||||||
|
|
||||||
void InitBubbles()
|
void InitBubbles()
|
||||||
{
|
{
|
||||||
|
|
|
@ -74,6 +74,22 @@ short lasthitsect, lasthitsprite, lasthitwall;
|
||||||
int nBulletCount = 0;
|
int nBulletCount = 0;
|
||||||
short nRadialBullet = 0;
|
short nRadialBullet = 0;
|
||||||
|
|
||||||
|
static SavegameHelper sgh("bullet",
|
||||||
|
SV(BulletFree),
|
||||||
|
SV(BulletList),
|
||||||
|
SV(nBulletEnemy),
|
||||||
|
SA(nBulletsFree),
|
||||||
|
SA(lasthitz),
|
||||||
|
SA(lasthitx),
|
||||||
|
SA(lasthity),
|
||||||
|
SA(lasthitsect),
|
||||||
|
SA(lasthitsprite),
|
||||||
|
SA(lasthitwall),
|
||||||
|
SV(nBulletCount),
|
||||||
|
SV(nRadialBullet),
|
||||||
|
nullptr);
|
||||||
|
|
||||||
|
|
||||||
bulletInfo BulletInfo[] = {
|
bulletInfo BulletInfo[] = {
|
||||||
{ 25, 1, 20, -1, -1, 13, 0, 0, -1, 0 },
|
{ 25, 1, 20, -1, -1, 13, 0, 0, -1, 0 },
|
||||||
{ 25, -1, 65000, -1, 31, 73, 0, 0, -1, 0 },
|
{ 25, -1, 65000, -1, 31, 73, 0, 0, -1, 0 },
|
||||||
|
|
|
@ -3401,5 +3401,65 @@ bool GameInterface::CanSave()
|
||||||
return new GameInterface;
|
return new GameInterface;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//short lastlevel;
|
||||||
|
//short forcelevel = -1;
|
||||||
|
//int lLocalCodes = 0;
|
||||||
|
//int flash;
|
||||||
|
//short textpages;
|
||||||
|
|
||||||
|
// This is only the static global data.
|
||||||
|
static SavegameHelper sgh("exhumed",
|
||||||
|
SA(cPupData),
|
||||||
|
SV(nPupData),
|
||||||
|
SV(nPixels),
|
||||||
|
SA(curx),
|
||||||
|
SA(cury),
|
||||||
|
SA(destvelx),
|
||||||
|
SA(destvely),
|
||||||
|
SA(pixelval),
|
||||||
|
SA(origy),
|
||||||
|
SA(origx),
|
||||||
|
SA(velx),
|
||||||
|
SA(vely),
|
||||||
|
SV(nMouthTile),
|
||||||
|
SV(nSpiritSprite),
|
||||||
|
SV(word_964E8),
|
||||||
|
SV(word_964EA),
|
||||||
|
SV(word_964EC),
|
||||||
|
SV(nSpiritRepeatX),
|
||||||
|
SV(nSpiritRepeatY),
|
||||||
|
SV(nPixelsToShow),
|
||||||
|
SV(nCreaturesLeft), // todo: also maintain a total counter.
|
||||||
|
SV(nFreeze),
|
||||||
|
SV(nSnakeCam),
|
||||||
|
SV(nLocalSpr),
|
||||||
|
SV(levelnew),
|
||||||
|
SV(nClockVal), // kTile3603
|
||||||
|
SV(nRedTicks),
|
||||||
|
SV(nAlarmTicks),
|
||||||
|
SV(nButtonColor),
|
||||||
|
SV(nEnergyChan),
|
||||||
|
SV(lCountDown),
|
||||||
|
SV(nEnergyTowers),
|
||||||
|
SV(nHeadStage),
|
||||||
|
SV(nTalkTime),
|
||||||
|
SV(levelnum),
|
||||||
|
SV(moveframes),
|
||||||
|
SV(totalmoves),
|
||||||
|
SV(nCurBodyNum),
|
||||||
|
SV(nBodyTotal),
|
||||||
|
SV(bSnakeCam),
|
||||||
|
SV(bSlipMode),
|
||||||
|
nullptr);
|
||||||
|
|
||||||
|
// These need to be saved as diffs.
|
||||||
|
//int lHeadStartClock; // Timer
|
||||||
|
//int lNextStateChange; // Timer
|
||||||
|
//int nHeadTimeStart; // Timer
|
||||||
|
//int localclock; // timer
|
||||||
|
|
||||||
|
//short* pPupData;
|
||||||
|
//uint8_t* Worktile;
|
||||||
|
|
||||||
|
|
||||||
END_PS_NS
|
END_PS_NS
|
||||||
|
|
|
@ -27,6 +27,10 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#include "m_argv.h"
|
#include "m_argv.h"
|
||||||
#include "gamecontrol.h"
|
#include "gamecontrol.h"
|
||||||
#include "c_buttons.h"
|
#include "c_buttons.h"
|
||||||
|
#include <algorithm>
|
||||||
|
#include "tarray.h"
|
||||||
|
#include "save.h"
|
||||||
|
#include "zstring.h"
|
||||||
#include "filesystem/filesystem.h"
|
#include "filesystem/filesystem.h"
|
||||||
|
|
||||||
BEGIN_PS_NS
|
BEGIN_PS_NS
|
||||||
|
|
|
@ -77,6 +77,15 @@ struct Chunk
|
||||||
Fish FishList[kMaxFishes];
|
Fish FishList[kMaxFishes];
|
||||||
Chunk FishChunk[kMaxChunks];
|
Chunk FishChunk[kMaxChunks];
|
||||||
|
|
||||||
|
static SavegameHelper sgh("fish",
|
||||||
|
SV(FishSprite),
|
||||||
|
SV(FishCount),
|
||||||
|
SV(nChunksFree),
|
||||||
|
SA(nFreeChunk),
|
||||||
|
SA(FishList),
|
||||||
|
SA(FishChunk),
|
||||||
|
nullptr);
|
||||||
|
|
||||||
|
|
||||||
void InitFishes()
|
void InitFishes()
|
||||||
{
|
{
|
||||||
|
|
|
@ -56,6 +56,13 @@ struct Grenade
|
||||||
|
|
||||||
Grenade GrenadeList[kMaxGrenades];
|
Grenade GrenadeList[kMaxGrenades];
|
||||||
|
|
||||||
|
static SavegameHelper sgh("grenade",
|
||||||
|
SV(nGrenadeCount),
|
||||||
|
SV(nGrenadesFree),
|
||||||
|
SA(GrenadeFree),
|
||||||
|
SA(GrenadeList),
|
||||||
|
nullptr);
|
||||||
|
|
||||||
|
|
||||||
void InitGrenades()
|
void InitGrenades()
|
||||||
{
|
{
|
||||||
|
|
|
@ -74,6 +74,11 @@ short nTemperature[kMaxPlayers];
|
||||||
short nMinAmmo[] = { 0, 24, 51, 50, 1, 0, 0 };
|
short nMinAmmo[] = { 0, 24, 51, 50, 1, 0, 0 };
|
||||||
short word_96E26 = 0;
|
short word_96E26 = 0;
|
||||||
|
|
||||||
|
static SavegameHelper sgh("gun",
|
||||||
|
SA(nTemperature),
|
||||||
|
SV(word_96E26),
|
||||||
|
nullptr);
|
||||||
|
|
||||||
|
|
||||||
void RestoreMinAmmo(short nPlayer)
|
void RestoreMinAmmo(short nPlayer)
|
||||||
{
|
{
|
||||||
|
|
|
@ -76,58 +76,7 @@ int SectBelow[kMaxSectors] = { 0 };
|
||||||
|
|
||||||
uint8_t bIsVersion6 = kTrue;
|
uint8_t bIsVersion6 = kTrue;
|
||||||
|
|
||||||
#if 0
|
|
||||||
// definitions for map version 6 structures
|
|
||||||
#pragma pack(1)
|
|
||||||
|
|
||||||
// 37 bytes
|
|
||||||
struct Sector_6
|
|
||||||
{
|
|
||||||
uint16_t wallptr, wallnum;
|
|
||||||
short ceilingpicnum, floorpicnum;
|
|
||||||
short ceilingheinum, floorheinum;
|
|
||||||
int ceilingz, floorz;
|
|
||||||
int8_t ceilingshade, floorshade;
|
|
||||||
uint8_t ceilingxpanning, floorxpanning;
|
|
||||||
uint8_t ceilingypanning, floorypanning;
|
|
||||||
uint8_t ceilingstat, floorstat;
|
|
||||||
uint8_t ceilingpal, floorpal;
|
|
||||||
uint8_t visibility;
|
|
||||||
short lotag, hitag, extra;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Wall_6
|
|
||||||
{
|
|
||||||
int x, y;
|
|
||||||
short point2, nextsector, nextwall;
|
|
||||||
short picnum, overpicnum;
|
|
||||||
int8_t shade;
|
|
||||||
uint8_t pal;
|
|
||||||
short cstat;
|
|
||||||
uint8_t xrepeat, yrepeat, xpanning, ypanning;
|
|
||||||
short lotag, hitag, extra;
|
|
||||||
};
|
|
||||||
|
|
||||||
// 43 bytes
|
|
||||||
struct Sprite_6
|
|
||||||
{
|
|
||||||
int x, y, z;
|
|
||||||
short cstat;
|
|
||||||
int8_t shade;
|
|
||||||
uint8_t pal, clipdist;
|
|
||||||
uint8_t xrepeat, yrepeat;
|
|
||||||
int8_t xoffset, yoffset;
|
|
||||||
short picnum, ang, xvel, yvel, zvel, owner;
|
|
||||||
short sectnum, statnum;
|
|
||||||
short lotag, hitag, extra;
|
|
||||||
};
|
|
||||||
|
|
||||||
#pragma pack()
|
|
||||||
|
|
||||||
static Sector_6 sector_6[1024];
|
|
||||||
static Wall_6 wall_6[8192];
|
|
||||||
static Sprite_6 sprite_6[4096];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
uint8_t LoadLevel(int nMap)
|
uint8_t LoadLevel(int nMap)
|
||||||
|
@ -996,4 +945,25 @@ int mysaveconfig()
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static SavegameHelper sgh("init",
|
||||||
|
SV(initx),
|
||||||
|
SV(inity),
|
||||||
|
SV(initz),
|
||||||
|
SV(inita),
|
||||||
|
SV(initsect),
|
||||||
|
SV(nCurChunkNum),
|
||||||
|
SA(nBodyGunSprite),
|
||||||
|
SV(nCurBodyGunNum),
|
||||||
|
SA(SectSoundSect),
|
||||||
|
SA(SectSound),
|
||||||
|
SA(SectFlag),
|
||||||
|
SA(SectDepth),
|
||||||
|
SA(SectAbove),
|
||||||
|
SA(SectDamage),
|
||||||
|
SA(SectSpeed),
|
||||||
|
SA(SectBelow),
|
||||||
|
nullptr);
|
||||||
|
|
||||||
|
|
||||||
END_PS_NS
|
END_PS_NS
|
||||||
|
|
|
@ -113,6 +113,12 @@ short nRegenerates;
|
||||||
short nFirstRegenerate;
|
short nFirstRegenerate;
|
||||||
short nMagicCount;
|
short nMagicCount;
|
||||||
|
|
||||||
|
static SavegameHelper sgh("items",
|
||||||
|
SV(nRegenerates),
|
||||||
|
SV(nFirstRegenerate),
|
||||||
|
SV(nMagicCount),
|
||||||
|
nullptr);
|
||||||
|
|
||||||
|
|
||||||
void BuildItemAnim(short nSprite)
|
void BuildItemAnim(short nSprite)
|
||||||
{
|
{
|
||||||
|
|
|
@ -61,6 +61,13 @@ static actionSeq ActionSeq[] = {
|
||||||
{42, 1}
|
{42, 1}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static SavegameHelper sgh("lavadude",
|
||||||
|
SA(LavaList),
|
||||||
|
SV(LavaCount),
|
||||||
|
SV(LavaSprite),
|
||||||
|
nullptr);
|
||||||
|
|
||||||
|
|
||||||
// done
|
// done
|
||||||
void InitLava()
|
void InitLava()
|
||||||
{
|
{
|
||||||
|
|
|
@ -90,6 +90,28 @@ short nGlowCount;
|
||||||
int bDoFlicks = 0;
|
int bDoFlicks = 0;
|
||||||
int bDoGlows = 0;
|
int bDoGlows = 0;
|
||||||
|
|
||||||
|
|
||||||
|
static SavegameHelper sgh("lightning",
|
||||||
|
SA(sFlash),
|
||||||
|
SA(sGlow),
|
||||||
|
SA(nNextFlash),
|
||||||
|
SA(sFlicker),
|
||||||
|
SA(nFreeFlash),
|
||||||
|
SA(sFlowInfo),
|
||||||
|
SA(flickermask),
|
||||||
|
SV(bTorch),
|
||||||
|
SV(nFirstFlash),
|
||||||
|
SV(nLastFlash),
|
||||||
|
SV(nFlashDepth),
|
||||||
|
SV(nFlashes),
|
||||||
|
SV(nFlowCount),
|
||||||
|
SV(nFlickerCount),
|
||||||
|
SV(nGlowCount),
|
||||||
|
SV(bDoFlicks),
|
||||||
|
SV(bDoGlows),
|
||||||
|
nullptr);
|
||||||
|
|
||||||
|
|
||||||
// done
|
// done
|
||||||
int GrabFlash()
|
int GrabFlash()
|
||||||
{
|
{
|
||||||
|
|
|
@ -52,6 +52,12 @@ struct Lion
|
||||||
|
|
||||||
Lion LionList[kMaxLions];
|
Lion LionList[kMaxLions];
|
||||||
|
|
||||||
|
static SavegameHelper sgh("lion",
|
||||||
|
SV(LionCount),
|
||||||
|
SA(MoveHook),
|
||||||
|
SA(LionList),
|
||||||
|
nullptr);
|
||||||
|
|
||||||
|
|
||||||
void InitLion()
|
void InitLion()
|
||||||
{
|
{
|
||||||
|
|
|
@ -2036,4 +2036,9 @@ LABEL_28:
|
||||||
MySetView(nViewLeft, nViewTop, nViewRight, nViewBottom);
|
MySetView(nViewLeft, nViewTop, nViewRight, nViewBottom);
|
||||||
MaskStatus();
|
MaskStatus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static SavegameHelper sgh("menu",
|
||||||
|
SA(nCinemaSeen),
|
||||||
|
nullptr);
|
||||||
|
|
||||||
END_PS_NS
|
END_PS_NS
|
||||||
|
|
|
@ -65,6 +65,21 @@ BlockInfo sBlockInfo[kMaxPushBlocks];
|
||||||
short nChunkSprite[kMaxChunks];
|
short nChunkSprite[kMaxChunks];
|
||||||
|
|
||||||
|
|
||||||
|
static SavegameHelper sgh("move",
|
||||||
|
SV(nPushBlocks),
|
||||||
|
SV(overridesect),
|
||||||
|
SV(NearCount),
|
||||||
|
SV(hihit),
|
||||||
|
SV(sprceiling),
|
||||||
|
SV(sprfloor),
|
||||||
|
SV(lohit),
|
||||||
|
SA(nBodySprite),
|
||||||
|
SA(NearSector),
|
||||||
|
SA(sBlockInfo),
|
||||||
|
SA(nChunkSprite),
|
||||||
|
nullptr);
|
||||||
|
|
||||||
|
|
||||||
signed int lsqrt(int a1)
|
signed int lsqrt(int a1)
|
||||||
{
|
{
|
||||||
int v1; // edx@1
|
int v1; // edx@1
|
||||||
|
|
|
@ -58,6 +58,12 @@ static actionSeq ActionSeq[] = {
|
||||||
{50, 0}
|
{50, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static SavegameHelper sgh("mummy",
|
||||||
|
SV(nMummies),
|
||||||
|
SA(MummyList),
|
||||||
|
nullptr);
|
||||||
|
|
||||||
// done
|
// done
|
||||||
void InitMummy()
|
void InitMummy()
|
||||||
{
|
{
|
||||||
|
|
|
@ -2673,4 +2673,46 @@ void PostProcess()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static SavegameHelper sgh("objects",
|
||||||
|
SA(sTrap),
|
||||||
|
SA(sBob),
|
||||||
|
SA(sTrail),
|
||||||
|
SA(sTrailPoint),
|
||||||
|
SA(Elevator),
|
||||||
|
SA(ObjectList),
|
||||||
|
SA(sMoveSect),
|
||||||
|
SA(SlideData),
|
||||||
|
SA(sMoveDir),
|
||||||
|
SA(WallFace),
|
||||||
|
SA(SlideData2),
|
||||||
|
SA(PointList),
|
||||||
|
SA(nTrapInterval),
|
||||||
|
SA(sBobID),
|
||||||
|
SA(PointFree),
|
||||||
|
SA(SlideFree),
|
||||||
|
SA(nTrailPointVal),
|
||||||
|
SA(nTrailPointPrev),
|
||||||
|
SA(nTrailPointNext),
|
||||||
|
SA(sDrip),
|
||||||
|
SV(PointCount),
|
||||||
|
SV(SlideCount),
|
||||||
|
SV(ElevCount),
|
||||||
|
SV(WallFaceCount),
|
||||||
|
SV(lFinaleStart),
|
||||||
|
SV(nTrailPoints),
|
||||||
|
SV(nEnergyBlocks),
|
||||||
|
SV(nMoveSects),
|
||||||
|
SV(nFinaleStage),
|
||||||
|
SV(nTrails),
|
||||||
|
SV(nTraps),
|
||||||
|
SV(nFinaleSpr),
|
||||||
|
SV(ObjectCount),
|
||||||
|
SV(nDrips),
|
||||||
|
SV(nBobs),
|
||||||
|
SV(nDronePitch),
|
||||||
|
SV(nSmokeSparks),
|
||||||
|
nullptr);
|
||||||
|
|
||||||
END_PS_NS
|
END_PS_NS
|
||||||
|
|
|
@ -3112,4 +3112,56 @@ loc_1BD2E:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static SavegameHelper sgh("player",
|
||||||
|
SV(lPlayerXVel),
|
||||||
|
SV(lPlayerYVel),
|
||||||
|
SV(nPlayerDAng),
|
||||||
|
SV(obobangle),
|
||||||
|
SV(bobangle),
|
||||||
|
SV(bPlayerPan),
|
||||||
|
SV(bLockPan),
|
||||||
|
SV(g_MyAimMode),
|
||||||
|
SV(nStandHeight),
|
||||||
|
SV(PlayerCount),
|
||||||
|
SV(nNetStartSprites),
|
||||||
|
SV(nCurStartSprite),
|
||||||
|
SV(nLocalPlayer),
|
||||||
|
SA(nBreathTimer),
|
||||||
|
SA(nPlayerSwear),
|
||||||
|
SA(nPlayerPushSect),
|
||||||
|
SA(nDeathType),
|
||||||
|
SA(nPlayerScore),
|
||||||
|
SA(nPlayerColor),
|
||||||
|
SA(nPlayerDY),
|
||||||
|
SA(nPlayerDX),
|
||||||
|
SA(playerNames),
|
||||||
|
SA(nPistolClip),
|
||||||
|
SA(nXDamage),
|
||||||
|
SA(nYDamage),
|
||||||
|
SA(nDoppleSprite),
|
||||||
|
SA(namelen),
|
||||||
|
SA(nPlayerOldWeapon),
|
||||||
|
SA(nPlayerClip),
|
||||||
|
SA(nPlayerPushSound),
|
||||||
|
SA(nTauntTimer),
|
||||||
|
SA(nPlayerTorch),
|
||||||
|
SA(nPlayerWeapons),
|
||||||
|
SA(nPlayerLives),
|
||||||
|
SA(nPlayerItem),
|
||||||
|
SA(PlayerList),
|
||||||
|
SA(nPlayerInvisible),
|
||||||
|
SA(nPlayerDouble),
|
||||||
|
SA(nPlayerViewSect),
|
||||||
|
SA(nPlayerFloorSprite),
|
||||||
|
SA(sPlayerSave),
|
||||||
|
SA(totalvel),
|
||||||
|
SA(eyelevel),
|
||||||
|
SA(nNetStartSprite),
|
||||||
|
SA(nPlayerGrenade),
|
||||||
|
SA(nGrenadePlayer),
|
||||||
|
SA(word_D282A),
|
||||||
|
nullptr);
|
||||||
|
|
||||||
END_PS_NS
|
END_PS_NS
|
||||||
|
|
|
@ -87,7 +87,6 @@ short QueenChan[kMaxQueens];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct Queen
|
struct Queen
|
||||||
{
|
{
|
||||||
short nHealth;
|
short nHealth;
|
||||||
|
@ -137,6 +136,27 @@ short MoveQS[25];
|
||||||
short MoveQA[25];
|
short MoveQA[25];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static SavegameHelper sgh("queen",
|
||||||
|
SV(QueenCount),
|
||||||
|
SV(nQHead),
|
||||||
|
SV(nEggsFree),
|
||||||
|
SV(nHeadVel),
|
||||||
|
SV(nVelShift),
|
||||||
|
SV(QueenHead),
|
||||||
|
SA(tailspr),
|
||||||
|
SA(nEggFree),
|
||||||
|
SA(QueenChan),
|
||||||
|
SA(QueenEgg),
|
||||||
|
SA(QueenList),
|
||||||
|
SA(MoveQX),
|
||||||
|
SA(MoveQY),
|
||||||
|
SA(MoveQZ),
|
||||||
|
SA(MoveQS),
|
||||||
|
SA(MoveQA),
|
||||||
|
nullptr);
|
||||||
|
|
||||||
|
|
||||||
void InitQueens()
|
void InitQueens()
|
||||||
{
|
{
|
||||||
QueenCount = 1;
|
QueenCount = 1;
|
||||||
|
|
|
@ -41,6 +41,12 @@ static actionSeq ActionSeq[] = {
|
||||||
{2, 1}, {0, 0}, {1, 0}, {2, 0}
|
{2, 1}, {0, 0}, {1, 0}, {2, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static SavegameHelper sgh("ra",
|
||||||
|
SA(Ra),
|
||||||
|
SV(RaCount),
|
||||||
|
nullptr);
|
||||||
|
|
||||||
|
|
||||||
void FreeRa(short nPlayer)
|
void FreeRa(short nPlayer)
|
||||||
{
|
{
|
||||||
int nRun = Ra[nPlayer].field_4;
|
int nRun = Ra[nPlayer].field_4;
|
||||||
|
|
|
@ -17,6 +17,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
//-------------------------------------------------------------------------
|
//-------------------------------------------------------------------------
|
||||||
#include "ns.h"
|
#include "ns.h"
|
||||||
#include "random.h"
|
#include "random.h"
|
||||||
|
#include "exhumed.h"
|
||||||
|
|
||||||
BEGIN_PS_NS
|
BEGIN_PS_NS
|
||||||
|
|
||||||
|
@ -24,6 +25,12 @@ int randA = 0;
|
||||||
int randB = 0x11111111;
|
int randB = 0x11111111;
|
||||||
int randC = 0x1010101;
|
int randC = 0x1010101;
|
||||||
|
|
||||||
|
static SavegameHelper sgh("rand",
|
||||||
|
SV(randA),
|
||||||
|
SV(randB),
|
||||||
|
SV(randC),
|
||||||
|
nullptr);
|
||||||
|
|
||||||
|
|
||||||
void InitRandom()
|
void InitRandom()
|
||||||
{
|
{
|
||||||
|
|
|
@ -53,6 +53,14 @@ Rat RatList[kMaxRats];
|
||||||
static actionSeq ActionSeq[] = {{0, 1}, {1, 0}, {1, 0}, {9, 1}, {0, 1}};
|
static actionSeq ActionSeq[] = {{0, 1}, {1, 0}, {1, 0}, {9, 1}, {0, 1}};
|
||||||
|
|
||||||
|
|
||||||
|
static SavegameHelper sgh("rat",
|
||||||
|
SV(nMinChunk),
|
||||||
|
SV(nPlayerPic),
|
||||||
|
SV(nRatCount),
|
||||||
|
SV(nMaxChunk),
|
||||||
|
SA(RatList),
|
||||||
|
nullptr);
|
||||||
|
|
||||||
void InitRats()
|
void InitRats()
|
||||||
{
|
{
|
||||||
nRatCount = 0;
|
nRatCount = 0;
|
||||||
|
|
|
@ -60,6 +60,13 @@ static actionSeq ActionSeq[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static SavegameHelper sgh("rex",
|
||||||
|
SV(RexCount),
|
||||||
|
SA(RexChan),
|
||||||
|
SA(RexList),
|
||||||
|
nullptr);
|
||||||
|
|
||||||
|
|
||||||
void InitRexs()
|
void InitRexs()
|
||||||
{
|
{
|
||||||
RexCount = kMaxRex;
|
RexCount = kMaxRex;
|
||||||
|
|
|
@ -52,6 +52,12 @@ struct Roach
|
||||||
|
|
||||||
Roach RoachList[kMaxRoach];
|
Roach RoachList[kMaxRoach];
|
||||||
|
|
||||||
|
static SavegameHelper sgh("roach",
|
||||||
|
SV(RoachSprite),
|
||||||
|
SV(RoachCount),
|
||||||
|
SA(RoachList),
|
||||||
|
nullptr);
|
||||||
|
|
||||||
|
|
||||||
/* Kilmaat Sentry */
|
/* Kilmaat Sentry */
|
||||||
|
|
||||||
|
|
|
@ -1842,4 +1842,24 @@ void runlist_DamageEnemy(int nSprite, int nSprite2, short nDamage)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static SavegameHelper sgh("runlist",
|
||||||
|
SV(RunCount),
|
||||||
|
SV(nRadialSpr),
|
||||||
|
SV(nStackCount),
|
||||||
|
SV(word_966BE),
|
||||||
|
SV(ChannelList),
|
||||||
|
SV(ChannelLast),
|
||||||
|
SV(nRadialOwner),
|
||||||
|
SV(nDamageRadius),
|
||||||
|
SV(nRadialDamage),
|
||||||
|
SV(RunChain),
|
||||||
|
SV(NewRun),
|
||||||
|
SA(sRunStack),
|
||||||
|
SA(RunFree),
|
||||||
|
SA(sRunChannels),
|
||||||
|
SA(RunData),
|
||||||
|
SV(word_96760),
|
||||||
|
nullptr);
|
||||||
|
|
||||||
END_PS_NS
|
END_PS_NS
|
||||||
|
|
|
@ -18,10 +18,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
#include "ns.h"
|
#include "ns.h"
|
||||||
#include "save.h"
|
#include "save.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <stdarg.h>
|
||||||
//#include <fcntl.h>
|
//#include <fcntl.h>
|
||||||
//#include <sys/stat.h>
|
//#include <sys/stat.h>
|
||||||
//#include <io.h>
|
//#include <io.h>
|
||||||
#include "engine.h"
|
#include "engine.h"
|
||||||
|
#include "exhumed.h"
|
||||||
|
#include "savegamehelp.h"
|
||||||
|
|
||||||
BEGIN_PS_NS
|
BEGIN_PS_NS
|
||||||
|
|
||||||
|
@ -121,4 +124,55 @@ int loadgame(int nSlot)
|
||||||
return 1; // CHECKME
|
return 1; // CHECKME
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static TArray<SavegameHelper*> sghelpers(TArray<SavegameHelper*>::NoInit);
|
||||||
|
|
||||||
|
SavegameHelper::SavegameHelper(const char* name, ...)
|
||||||
|
{
|
||||||
|
Name = name;
|
||||||
|
sghelpers.Push(this);
|
||||||
|
va_list ap;
|
||||||
|
va_start(ap, name);
|
||||||
|
for(;;)
|
||||||
|
{
|
||||||
|
void* addr = va_arg(ap, void*);
|
||||||
|
if (!addr) break;
|
||||||
|
size_t size = va_arg(ap, size_t);
|
||||||
|
Elements.Push(std::make_pair(addr, size));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SavegameHelper::Load()
|
||||||
|
{
|
||||||
|
auto fr = ReadSavegameChunk(Name);
|
||||||
|
for (auto& entry : Elements)
|
||||||
|
{
|
||||||
|
auto read = fr.Read(entry.first, entry.second);
|
||||||
|
if (read != entry.second) I_Error("Save game read error in %s", Name.GetChars());
|
||||||
|
}
|
||||||
|
|
||||||
|
// reset the sky in case it hasn't been done yet.
|
||||||
|
psky_t* pSky = tileSetupSky(0);
|
||||||
|
pSky->tileofs[0] = 0;
|
||||||
|
pSky->tileofs[1] = 0;
|
||||||
|
pSky->tileofs[2] = 0;
|
||||||
|
pSky->tileofs[3] = 0;
|
||||||
|
pSky->yoffs = 256;
|
||||||
|
pSky->lognumtiles = 2;
|
||||||
|
pSky->horizfrac = 65536;
|
||||||
|
pSky->yscale = 65536;
|
||||||
|
parallaxtype = 2;
|
||||||
|
g_visibility = 2048;
|
||||||
|
|
||||||
|
}
|
||||||
|
void SavegameHelper::Save()
|
||||||
|
{
|
||||||
|
auto fw = WriteSavegameChunk(Name);
|
||||||
|
for (auto& entry : Elements)
|
||||||
|
{
|
||||||
|
auto write = fw->Write(entry.first, entry.second);
|
||||||
|
if (write != entry.second) I_Error("Save game write error in %s", Name.GetChars());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
END_PS_NS
|
END_PS_NS
|
||||||
|
|
|
@ -18,12 +18,27 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
|
||||||
#ifndef __save_h__
|
#ifndef __save_h__
|
||||||
#define __save_h__
|
#define __save_h__
|
||||||
|
#include "zstring.h"
|
||||||
|
|
||||||
BEGIN_PS_NS
|
BEGIN_PS_NS
|
||||||
|
|
||||||
int savegame(int nSlot);
|
int savegame(int nSlot);
|
||||||
int loadgame(int nSlot);
|
int loadgame(int nSlot);
|
||||||
|
|
||||||
|
|
||||||
|
struct SavegameHelper
|
||||||
|
{
|
||||||
|
FString Name;
|
||||||
|
TArray<std::pair<void*, size_t>> Elements;
|
||||||
|
SavegameHelper(const char* name, ...);
|
||||||
|
void Load();
|
||||||
|
void Save();
|
||||||
|
};
|
||||||
|
|
||||||
|
#define SV(v) &v, sizeof(v)
|
||||||
|
#define SA(a) a, sizeof(a)
|
||||||
|
|
||||||
|
|
||||||
END_PS_NS
|
END_PS_NS
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -53,6 +53,11 @@ static actionSeq ActionSeq[] = {
|
||||||
{53, 1}
|
{53, 1}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static SavegameHelper sgh("scorp",
|
||||||
|
SV(ScorpCount),
|
||||||
|
SA(scorpion),
|
||||||
|
SA(ScorpChan),
|
||||||
|
nullptr);
|
||||||
|
|
||||||
void InitScorp()
|
void InitScorp()
|
||||||
{
|
{
|
||||||
|
|
|
@ -661,4 +661,14 @@ int seq_PlotSequence(short nSprite, short edx, short nFrame, short ecx)
|
||||||
|
|
||||||
return nPict;
|
return nPict;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static SavegameHelper sgh("sequence",
|
||||||
|
SV(nPilotLightFrame),
|
||||||
|
SV(nPilotLightCount),
|
||||||
|
SV(nPilotLightBase),
|
||||||
|
SV(laststatustile),
|
||||||
|
SV(nShadowWidth),
|
||||||
|
SV(nFlameHeight),
|
||||||
|
nullptr);
|
||||||
|
|
||||||
END_PS_NS
|
END_PS_NS
|
||||||
|
|
|
@ -64,6 +64,12 @@ struct Set
|
||||||
Set SetList[kMaxSets];
|
Set SetList[kMaxSets];
|
||||||
short SetChan[kMaxSets];
|
short SetChan[kMaxSets];
|
||||||
|
|
||||||
|
static SavegameHelper sgh("set",
|
||||||
|
SV(SetCount),
|
||||||
|
SA(SetList),
|
||||||
|
SA(SetChan),
|
||||||
|
nullptr);
|
||||||
|
|
||||||
|
|
||||||
void InitSets()
|
void InitSets()
|
||||||
{
|
{
|
||||||
|
|
|
@ -47,6 +47,14 @@ short nPlayerSnake[kMaxPlayers];
|
||||||
Snake SnakeList[kMaxSnakes];
|
Snake SnakeList[kMaxSnakes];
|
||||||
short nSnakePlayer[kMaxSnakes];
|
short nSnakePlayer[kMaxSnakes];
|
||||||
|
|
||||||
|
static SavegameHelper sgh("snake",
|
||||||
|
SV(nSnakeCount),
|
||||||
|
SV(nSnakesFree),
|
||||||
|
SA(SnakeFree),
|
||||||
|
SA(nPlayerSnake),
|
||||||
|
SA(SnakeList),
|
||||||
|
SA(nSnakePlayer),
|
||||||
|
nullptr);
|
||||||
|
|
||||||
void InitSnakes()
|
void InitSnakes()
|
||||||
{
|
{
|
||||||
|
|
|
@ -50,6 +50,11 @@ Spider SpiderList[kMaxSpiders];
|
||||||
|
|
||||||
static actionSeq ActionSeq[] = { {16, 0}, {8, 0}, {32, 0}, {24, 0}, {0, 0}, {40, 1}, {41, 1} };
|
static actionSeq ActionSeq[] = { {16, 0}, {8, 0}, {32, 0}, {24, 0}, {0, 0}, {40, 1}, {41, 1} };
|
||||||
|
|
||||||
|
static SavegameHelper sgh("spider",
|
||||||
|
SV(SpiderSprite),
|
||||||
|
SV(SpiderCount),
|
||||||
|
SA(SpiderList),
|
||||||
|
nullptr);
|
||||||
|
|
||||||
void InitSpider()
|
void InitSpider()
|
||||||
{
|
{
|
||||||
|
|
|
@ -850,4 +850,49 @@ void DrawStatus()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// I'm not sure this really needs to be saved.
|
||||||
|
static SavegameHelper sgh("status",
|
||||||
|
SV(nMaskY),
|
||||||
|
SV(nAnimsFree),
|
||||||
|
SV(message_timer),
|
||||||
|
SV(magicperline),
|
||||||
|
SV(airperline),
|
||||||
|
SV(healthperline),
|
||||||
|
SV(nAirFrames),
|
||||||
|
SV(nCounter),
|
||||||
|
SV(nCounterDest),
|
||||||
|
SV(nStatusSeqOffset),
|
||||||
|
SV(nItemFrames),
|
||||||
|
SV(laststatusx),
|
||||||
|
SV(laststatusy),
|
||||||
|
SV(nItemSeq),
|
||||||
|
SV(nMagicFrames),
|
||||||
|
SV(nHealthLevel),
|
||||||
|
SV(nItemFrame),
|
||||||
|
SV(nMeterRange),
|
||||||
|
SV(nMagicLevel),
|
||||||
|
SV(nHealthFrame),
|
||||||
|
SV(nMagicFrame),
|
||||||
|
SV(statusx),
|
||||||
|
SV(statusy),
|
||||||
|
SV(nHealthFrames),
|
||||||
|
SV(airframe),
|
||||||
|
SV(nFirstAnim),
|
||||||
|
SV(nLastAnim),
|
||||||
|
SV(nItemAltSeq),
|
||||||
|
SV(airpages),
|
||||||
|
SV(ammodelay),
|
||||||
|
SV(nCounterBullet),
|
||||||
|
SA(statusmask),
|
||||||
|
SA(message_text),
|
||||||
|
SA(nDigit),
|
||||||
|
SA(StatusAnim),
|
||||||
|
SA(StatusAnimsFree),
|
||||||
|
SA(StatusAnimFlags),
|
||||||
|
SA(nItemSeqOffset),
|
||||||
|
SA(word_9AD54),
|
||||||
|
SA(dword_9AD64),
|
||||||
|
nullptr);
|
||||||
|
|
||||||
|
|
||||||
END_PS_NS
|
END_PS_NS
|
||||||
|
|
|
@ -50,7 +50,12 @@ struct Switch
|
||||||
|
|
||||||
Switch SwitchData[kMaxSwitches];
|
Switch SwitchData[kMaxSwitches];
|
||||||
|
|
||||||
|
static SavegameHelper sgh("switch",
|
||||||
|
SV(LinkCount),
|
||||||
|
SV(SwitchCount),
|
||||||
|
SA(LinkMap),
|
||||||
|
SA(SwitchData),
|
||||||
|
nullptr);
|
||||||
|
|
||||||
void InitLink()
|
void InitLink()
|
||||||
{
|
{
|
||||||
|
|
|
@ -650,4 +650,31 @@ void Clip()
|
||||||
|
|
||||||
bClip = kTrue;
|
bClip = kTrue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static SavegameHelper sgh("view",
|
||||||
|
SV(nCamerax),
|
||||||
|
SV(nCameray),
|
||||||
|
SV(nCameraz),
|
||||||
|
SV(bTouchFloor),
|
||||||
|
SV(nChunkTotal),
|
||||||
|
SV(nCameraa),
|
||||||
|
SV(nCamerapan),
|
||||||
|
SV(nViewTop),
|
||||||
|
SV(bClip),
|
||||||
|
SV(nViewBottom),
|
||||||
|
SV(nViewRight),
|
||||||
|
SV(besttarget),
|
||||||
|
SV(nViewLeft),
|
||||||
|
SV(bCamera),
|
||||||
|
SV(nViewy),
|
||||||
|
SV(viewz),
|
||||||
|
SV(enemy),
|
||||||
|
SV(nEnemyPal),
|
||||||
|
SA(nDestVertPan),
|
||||||
|
SA(dVertPan),
|
||||||
|
SA(nVertPan),
|
||||||
|
SA(nQuake),
|
||||||
|
nullptr);
|
||||||
|
|
||||||
END_PS_NS
|
END_PS_NS
|
||||||
|
|
|
@ -55,6 +55,12 @@ Wasp WaspList[kMaxWasps];
|
||||||
|
|
||||||
static actionSeq ActionSeq[] = {{0,0}, {0,0}, {9,0}, {18,0}, {27,1}, {28,1}, {29,1}};
|
static actionSeq ActionSeq[] = {{0,0}, {0,0}, {9,0}, {18,0}, {27,1}, {28,1}, {29,1}};
|
||||||
|
|
||||||
|
static SavegameHelper sgh("wasp",
|
||||||
|
SV(nVelShift),
|
||||||
|
SV(nWaspCount),
|
||||||
|
SA(WaspList),
|
||||||
|
nullptr);
|
||||||
|
|
||||||
|
|
||||||
void InitWasps()
|
void InitWasps()
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue