2018-08-19 09:46:58 +02:00
|
|
|
#pragma once
|
2020-05-27 09:21:20 +02:00
|
|
|
#include "ChunkId.h"
|
|
|
|
#include "ChunkReader.h"
|
|
|
|
#include "ChunkWriter.h"
|
|
|
|
#include "LEB128.h"
|
|
|
|
#include "Streams.h"
|
|
|
|
#include "GameFlowScript.h"
|
|
|
|
#include "GameLogicScript.h"
|
2018-09-03 21:08:40 +02:00
|
|
|
|
2018-10-01 22:22:11 +02:00
|
|
|
#define SAVEGAME_BUFFER_SIZE 1048576
|
|
|
|
|
2020-05-30 17:58:09 +02:00
|
|
|
typedef struct STATS
|
|
|
|
{
|
|
|
|
unsigned int Timer;
|
|
|
|
unsigned int Distance;
|
|
|
|
unsigned int AmmoUsed;
|
|
|
|
unsigned int AmmoHits;
|
|
|
|
unsigned short Kills;
|
|
|
|
unsigned char Secrets;
|
|
|
|
unsigned char HealthUsed;
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef struct SAVEGAME_INFO
|
|
|
|
{
|
|
|
|
short Checksum;
|
|
|
|
unsigned short VolumeCD;
|
|
|
|
unsigned short VolumeFX;
|
|
|
|
short ScreenX;
|
|
|
|
short ScreenY;
|
|
|
|
unsigned char ControlOption;
|
|
|
|
bool VibrateOn;
|
|
|
|
bool AutoTarget;
|
|
|
|
STATS Level;
|
|
|
|
STATS Game;
|
|
|
|
short WeaponObject;
|
|
|
|
short WeaponAnim;
|
|
|
|
short WeaponFrame;
|
|
|
|
short WeaponCurrent;
|
|
|
|
short WeaponGoal;
|
|
|
|
unsigned int CutSceneTriggered1;
|
|
|
|
unsigned int CutSceneTriggered2;
|
|
|
|
byte GameComplete;
|
|
|
|
unsigned char LevelNumber;
|
|
|
|
unsigned char CampaignSecrets[4];
|
|
|
|
unsigned char TLCount;
|
|
|
|
};
|
2018-10-01 22:22:11 +02:00
|
|
|
|
2018-10-24 23:32:22 +02:00
|
|
|
typedef struct SaveGameHeader
|
|
|
|
{
|
|
|
|
string LevelName;
|
2019-11-27 15:12:35 +01:00
|
|
|
int Days;
|
|
|
|
int Hours;
|
|
|
|
int Minutes;
|
|
|
|
int Seconds;
|
|
|
|
int Level;
|
|
|
|
int Timer;
|
|
|
|
int Count;
|
2018-10-24 23:32:22 +02:00
|
|
|
bool Present;
|
|
|
|
};
|
|
|
|
|
2020-05-30 17:58:09 +02:00
|
|
|
extern GameFlow* g_GameFlow;
|
|
|
|
extern GameScript* g_GameScript;
|
|
|
|
extern SAVEGAME_INFO Savegame;
|
|
|
|
|
2018-10-01 22:22:11 +02:00
|
|
|
class SaveGame {
|
|
|
|
private:
|
|
|
|
static FileStream* m_stream;
|
|
|
|
static ChunkReader* m_reader;
|
|
|
|
static ChunkWriter* m_writer;
|
2018-10-09 00:02:14 +02:00
|
|
|
static vector<LuaVariable> m_luaVariables;
|
2018-10-01 22:22:11 +02:00
|
|
|
|
|
|
|
static ChunkId* m_chunkGameStatus;
|
|
|
|
static ChunkId* m_chunkItems;
|
|
|
|
static ChunkId* m_chunkItem;
|
|
|
|
static ChunkId* m_chunkLara;
|
2018-10-10 22:29:40 +02:00
|
|
|
static ChunkId* m_chunkLuaVariable;
|
2018-10-24 23:32:22 +02:00
|
|
|
static ChunkId* m_chunkStaticFlags;
|
2018-11-01 09:10:32 +01:00
|
|
|
static ChunkId* m_chunkVehicle;
|
2019-11-09 09:55:56 +01:00
|
|
|
static ChunkId* m_chunkSequenceSwitch;
|
2018-10-24 23:32:22 +02:00
|
|
|
static ChunkId* m_chunkFlybyFlags;
|
|
|
|
static ChunkId* m_chunkCdFlags;
|
|
|
|
static ChunkId* m_chunkCamera;
|
|
|
|
static ChunkId* m_chunkFlipStats;
|
|
|
|
static ChunkId* m_chunkFlipMap;
|
|
|
|
static ChunkId* m_chunkItemDummy;
|
|
|
|
static ChunkId* m_chunkStatistics;
|
|
|
|
static ChunkId* m_chunkItemAnims;
|
|
|
|
static ChunkId* m_chunkItemMeshes;
|
|
|
|
static ChunkId* m_chunkItemFlags;
|
|
|
|
static ChunkId* m_chunkItemHitPoints;
|
|
|
|
static ChunkId* m_chunkItemPosition;
|
|
|
|
static ChunkId* m_chunkItemIntelligentData;
|
2018-10-25 23:43:58 +02:00
|
|
|
static ChunkId* m_chunkSpecialItemBurningTorch;
|
|
|
|
static ChunkId* m_chunkSpecialItemChaff;
|
|
|
|
static ChunkId* m_chunkSpecialItemTorpedo;
|
|
|
|
static ChunkId* m_chunkSpecialItemCrossbowBolt;
|
|
|
|
static ChunkId* m_chunkSpecialItemFlare;
|
|
|
|
static ChunkId* m_chunkItemQuadInfo;
|
2018-11-08 23:05:25 +01:00
|
|
|
static ChunkId* m_chunkRats;
|
|
|
|
static ChunkId* m_chunkSpiders;
|
|
|
|
static ChunkId* m_chunkBats;
|
2020-01-12 08:02:48 +01:00
|
|
|
static ChunkId* m_chunkLaraExtraInfo;
|
|
|
|
static ChunkId* m_chunkWeaponInfo;
|
|
|
|
static ChunkId* m_chunkPuzzle;
|
|
|
|
static ChunkId* m_chunkKey;
|
|
|
|
static ChunkId* m_chunkPickup;
|
|
|
|
static ChunkId* m_chunkExamine;
|
|
|
|
static ChunkId* m_chunkPuzzleCombo;
|
|
|
|
static ChunkId* m_chunkKeyCombo;
|
|
|
|
static ChunkId* m_chunkPickupCombo;
|
|
|
|
static ChunkId* m_chunkExamineCombo;
|
|
|
|
static ChunkId* m_chunkWeaponItem;
|
2018-10-10 22:29:40 +02:00
|
|
|
|
2019-11-27 15:12:35 +01:00
|
|
|
static void saveGameStatus(int arg1, int arg2);
|
|
|
|
static void saveLara(int arg1, int arg2);
|
|
|
|
static void saveItem(int arg1, int arg2);
|
|
|
|
static void saveBurningTorch(int arg1, int arg2);
|
|
|
|
static void saveChaff(int arg1, int arg2);
|
|
|
|
static void saveTorpedo(int arg1, int arg2);
|
|
|
|
static void saveCrossbowBolt(int arg1, int arg2);
|
|
|
|
static void saveFlare(int arg1, int arg2);
|
2018-10-24 23:32:22 +02:00
|
|
|
static void saveItems();
|
|
|
|
static void saveVariables();
|
2019-11-27 15:12:35 +01:00
|
|
|
static void saveVariable(int arg1, int arg2);
|
|
|
|
static void saveStaticFlag(int arg1, int arg2);
|
|
|
|
static void saveCamera(int arg1, int arg2);
|
|
|
|
static void saveSequenceSwitch(int arg1, int arg2);
|
|
|
|
static void saveFlybyFlags(int arg1, int arg2);
|
|
|
|
static void saveFlipMap(int arg1, int arg2);
|
|
|
|
static void saveFlipStats(int arg1, int arg2);
|
|
|
|
static void saveCdFlags(int arg1, int arg2);
|
|
|
|
static void saveStatistics(int arg1, int arg2);
|
|
|
|
static void saveItemFlags(int arg1, int arg2);
|
|
|
|
static void saveItemHitPoints(int arg1, int arg2);
|
|
|
|
static void saveItemPosition(int arg1, int arg2);
|
|
|
|
static void saveItemMesh(int arg1, int arg2);
|
|
|
|
static void saveItemAnims(int arg1, int arg2);
|
|
|
|
static void saveItemIntelligentData(int arg1, int arg2);
|
|
|
|
static void saveItemQuadInfo(int arg1, int arg2);
|
|
|
|
static void saveRats(int arg1, int arg2);
|
|
|
|
static void saveBats(int arg1, int arg2);
|
|
|
|
static void saveSpiders(int arg1, int arg2);
|
2020-01-12 08:02:48 +01:00
|
|
|
static void saveLaraExtraInfo(int arg1, int arg2);
|
|
|
|
static void savePuzzle(int arg1, int arg2);
|
|
|
|
static void saveWeaponInfo(int arg1, int arg2);
|
|
|
|
static void saveWeaponItem(int arg1, int arg2);
|
2018-10-10 22:29:40 +02:00
|
|
|
|
|
|
|
static bool readGameStatus();
|
|
|
|
static bool readLara();
|
|
|
|
static bool readItem();
|
2018-10-25 23:43:58 +02:00
|
|
|
static bool readBurningTorch();
|
|
|
|
static bool readChaff();
|
|
|
|
static bool readCrossbowBolt();
|
|
|
|
static bool readFlare();
|
|
|
|
static bool readTorpedo();
|
2018-11-11 11:33:13 +01:00
|
|
|
static bool readBats();
|
|
|
|
static bool readRats();
|
|
|
|
static bool readSpiders();
|
2018-10-24 23:32:22 +02:00
|
|
|
static bool readStatistics();
|
2018-10-10 22:29:40 +02:00
|
|
|
static bool readVariable();
|
2019-11-27 15:12:35 +01:00
|
|
|
static bool readSavegameChunks(ChunkId* chunkId, int maxSize, int arg);
|
|
|
|
static bool readLaraChunks(ChunkId* chunkId, int maxSize, int arg);
|
|
|
|
static bool readGameStatusChunks(ChunkId* chunkId, int maxSize, int arg);
|
|
|
|
static bool readItemChunks(ChunkId* chunkId, int maxSize, int itemNumber);
|
2018-10-24 23:32:22 +02:00
|
|
|
|
2018-10-01 22:22:11 +02:00
|
|
|
public:
|
2019-11-27 15:12:35 +01:00
|
|
|
static int LastSaveGame;
|
2018-10-24 23:32:22 +02:00
|
|
|
|
2018-10-09 00:02:14 +02:00
|
|
|
static void Start();
|
|
|
|
static void End();
|
2018-10-10 22:29:40 +02:00
|
|
|
static bool Load(char* fileName);
|
2018-10-24 23:32:22 +02:00
|
|
|
static bool LoadHeader(char* fileName, SaveGameHeader* header);
|
|
|
|
static bool Save(char* fileName);
|
2018-10-01 22:22:11 +02:00
|
|
|
};
|