TombEngine/TR5Main/Game/savegame.cpp

162 lines
4.9 KiB
C++
Raw Normal View History

#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;
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()
{
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-09 00:02:14 +02:00
bool SaveGame::Save(char* fileName)
{
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);
m_stream->Close();
delete m_writer;
delete m_stream;
return true;
}