2018-10-01 22:22:11 +02:00
|
|
|
#include "savegame.h"
|
|
|
|
#include "..\Global\global.h"
|
|
|
|
|
|
|
|
FileStream* SaveGame::m_stream;
|
|
|
|
ChunkReader* SaveGame::m_reader;
|
|
|
|
ChunkWriter* SaveGame::m_writer;
|
2018-10-09 00:02:14 +02:00
|
|
|
vector<LuaVariable> SaveGame::m_luaVariables;
|
2018-10-01 22:22:11 +02:00
|
|
|
|
|
|
|
ChunkId* SaveGame::m_chunkHeader;
|
|
|
|
ChunkId* SaveGame::m_chunkGameStatus;
|
|
|
|
ChunkId* SaveGame::m_chunkItems;
|
|
|
|
ChunkId* SaveGame::m_chunkItem;
|
|
|
|
ChunkId* SaveGame::m_chunkLara;
|
|
|
|
ChunkId* SaveGame::m_chunkLuaVariables;
|
|
|
|
ChunkId* SaveGame::m_chunkLuaLocal;
|
|
|
|
ChunkId* SaveGame::m_chunkLuaGlobal;
|
|
|
|
|
|
|
|
void SaveGame::SaveHeader(__int32 param)
|
|
|
|
{
|
|
|
|
m_stream->WriteString(g_GameFlow->GetString(g_GameFlow->GetLevel(CurrentLevel)->Name));
|
|
|
|
LEB128::Write(m_stream, (Savegame.Game.Timer / 30) / 86400);
|
|
|
|
LEB128::Write(m_stream, ((Savegame.Game.Timer / 30) % 86400) / 3600);
|
|
|
|
LEB128::Write(m_stream, ((Savegame.Game.Timer / 30) / 60) % 60);
|
|
|
|
LEB128::Write(m_stream, (Savegame.Game.Timer / 30) % 60);
|
|
|
|
LEB128::Write(m_stream, CurrentLevel);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SaveGame::SaveGameStatus(__int32 param)
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void SaveGame::SaveItems(__int32 param)
|
|
|
|
{
|
|
|
|
for (__int32 i = 0; i < NumItems; i++)
|
|
|
|
{
|
|
|
|
m_writer->WriteChunk(m_chunkItem, &SaveItem, i);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void SaveGame::SaveItem(__int32 itemNumber)
|
|
|
|
{
|
|
|
|
ITEM_INFO* item = &Items[itemNumber];
|
|
|
|
OBJECT_INFO* obj = &Objects[item->objectNumber];
|
|
|
|
|
|
|
|
LEB128::Write(m_stream, item->flags);
|
|
|
|
LEB128::Write(m_stream, item->pos.xPos);
|
|
|
|
LEB128::Write(m_stream, item->pos.yPos);
|
|
|
|
LEB128::Write(m_stream, item->pos.zPos);
|
|
|
|
LEB128::Write(m_stream, item->pos.xRot);
|
|
|
|
LEB128::Write(m_stream, item->pos.yRot);
|
|
|
|
LEB128::Write(m_stream, item->pos.zRot);
|
|
|
|
LEB128::Write(m_stream, item->roomNumber);
|
|
|
|
LEB128::Write(m_stream, item->itemFlags[0]);
|
|
|
|
LEB128::Write(m_stream, item->itemFlags[1]);
|
|
|
|
LEB128::Write(m_stream, item->itemFlags[2]);
|
|
|
|
LEB128::Write(m_stream, item->itemFlags[3]);
|
|
|
|
LEB128::Write(m_stream, item->triggerFlags);
|
|
|
|
LEB128::Write(m_stream, item->timer);
|
|
|
|
LEB128::Write(m_stream, item->speed);
|
|
|
|
LEB128::Write(m_stream, item->fallspeed);
|
|
|
|
LEB128::Write(m_stream, item->currentAnimState);
|
|
|
|
LEB128::Write(m_stream, item->goalAnimState);
|
|
|
|
LEB128::Write(m_stream, item->requiredAnimState);
|
|
|
|
LEB128::Write(m_stream, item->animNumber);
|
|
|
|
LEB128::Write(m_stream, item->frameNumber);
|
|
|
|
LEB128::Write(m_stream, item->objectNumber);
|
|
|
|
LEB128::Write(m_stream, item->hitPoints);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SaveGame::SaveLara(__int32 param)
|
|
|
|
{
|
|
|
|
LARA_INFO lara;
|
|
|
|
memcpy(&lara, &Lara, sizeof(Lara));
|
|
|
|
|
|
|
|
for (__int32 i = 0; i < 15; i++)
|
|
|
|
lara.meshPtrs[i] = (__int16*)(lara.meshPtrs[i] - MeshBase);
|
|
|
|
|
|
|
|
lara.leftArm.frameBase = (__int16*)(lara.leftArm.frameBase - Objects[ID_PISTOLS_ANIM].frameBase);
|
|
|
|
lara.rightArm.frameBase = (__int16*)(lara.rightArm.frameBase - Objects[ID_PISTOLS_ANIM].frameBase);
|
|
|
|
|
|
|
|
m_stream->Write(reinterpret_cast<char*>(&lara), sizeof(Lara));
|
|
|
|
}
|
|
|
|
|
2018-10-09 00:02:14 +02:00
|
|
|
void SaveGame::SaveVariables(__int32 param)
|
|
|
|
{
|
|
|
|
m_luaVariables.clear();
|
|
|
|
g_GameScript->GetLocalVariables(&m_luaVariables);
|
|
|
|
for (__int32 i = 0; i < m_luaVariables.size(); i++)
|
|
|
|
{
|
|
|
|
m_writer->WriteChunk(m_chunkLuaLocal, &SaveVariable, i);
|
|
|
|
}
|
|
|
|
|
|
|
|
m_luaVariables.clear();
|
|
|
|
g_GameScript->GetGlobalVariables(&m_luaVariables);
|
|
|
|
for (__int32 i = 0; i < m_luaVariables.size(); i++)
|
|
|
|
{
|
|
|
|
m_writer->WriteChunk(m_chunkLuaGlobal, &SaveVariable, i);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void SaveGame::SaveVariable(__int32 param)
|
|
|
|
{
|
|
|
|
LuaVariable variable = m_luaVariables[param];
|
|
|
|
|
|
|
|
LEB128::Write(m_stream, LUA_VARIABLE_TYPE_BOOL);
|
|
|
|
m_stream->WriteString((char*)variable.Name.c_str());
|
|
|
|
|
|
|
|
if (variable.Type == LUA_VARIABLE_TYPE_BOOL)
|
|
|
|
m_stream->WriteBool(&variable.BoolValue);
|
|
|
|
else if (variable.Type == LUA_VARIABLE_TYPE_INT)
|
|
|
|
m_stream->WriteInt32(&variable.IntValue);
|
|
|
|
else if (variable.Type == LUA_VARIABLE_TYPE_STRING)
|
|
|
|
m_stream->WriteString((char*)variable.StringValue.c_str());
|
|
|
|
else if (variable.Type == LUA_VARIABLE_TYPE_FLOAT)
|
|
|
|
m_stream->WriteFloat(&variable.FloatValue);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SaveGame::Start()
|
2018-10-01 22:22:11 +02:00
|
|
|
{
|
|
|
|
m_chunkHeader = ChunkId::FromString("TR5MSgHeader");
|
|
|
|
m_chunkGameStatus = ChunkId::FromString("TR5MSgGameStatus");
|
|
|
|
m_chunkItems = ChunkId::FromString("TR5MSgItems");
|
|
|
|
m_chunkItem = ChunkId::FromString("TR5MSgItem");
|
|
|
|
m_chunkLara = ChunkId::FromString("TR5MSgLara");
|
|
|
|
m_chunkLuaVariables = ChunkId::FromString("TR5MSgLuaVars");
|
|
|
|
m_chunkLuaLocal = ChunkId::FromString("TR5MSgLuaL");
|
|
|
|
m_chunkLuaGlobal = ChunkId::FromString("TR5MSgLuaG");
|
2018-10-09 00:02:14 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void SaveGame::End()
|
|
|
|
{
|
|
|
|
delete m_chunkHeader;
|
|
|
|
delete m_chunkGameStatus;
|
|
|
|
delete m_chunkItems;
|
|
|
|
delete m_chunkItem;
|
|
|
|
delete m_chunkLara;
|
|
|
|
delete m_chunkLuaVariables;
|
|
|
|
delete m_chunkLuaLocal;
|
|
|
|
delete m_chunkLuaGlobal;
|
|
|
|
}
|
2018-10-01 22:22:11 +02:00
|
|
|
|
2018-10-09 00:02:14 +02:00
|
|
|
bool SaveGame::Save(char* fileName)
|
|
|
|
{
|
2018-10-01 22:22:11 +02:00
|
|
|
m_stream = new FileStream(fileName);
|
|
|
|
m_writer = new ChunkWriter(0x4D355254, m_stream);
|
|
|
|
|
|
|
|
m_writer->WriteChunk(m_chunkHeader, &SaveHeader, 0);
|
|
|
|
m_writer->WriteChunk(m_chunkLara, &SaveLara, 0);
|
|
|
|
m_writer->WriteChunkWithChildren(m_chunkItems, &SaveItems, 0);
|
2018-10-09 00:02:14 +02:00
|
|
|
SaveVariables(0);
|
|
|
|
|
|
|
|
__int32 eof = 0;
|
|
|
|
m_stream->WriteInt32(&eof);
|
2018-10-01 22:22:11 +02:00
|
|
|
|
|
|
|
m_stream->Close();
|
|
|
|
|
|
|
|
delete m_writer;
|
|
|
|
delete m_stream;
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|