Files
GTASource/game/SaveLoad/SavegameScriptData/script_save_stack.cpp

95 lines
2.7 KiB
C++
Raw Permalink Normal View History

2025-02-23 17:40:52 +08:00
#include "script_save_stack.h"
// Game headers
#include "SaveLoad/savegame_channel.h"
// **************************************** SaveGameDataBlock - Script - CScriptSaveStack ************************************
CScriptSaveStack::CScriptSaveStack()
{
m_nCurrentStackLevel = -1;
}
void CScriptSaveStack::Shutdown()
{
for (int loop = 0; loop < MAX_DEPTH_OF_STACK_OF_STRUCTS; loop++)
{
m_StackOfStructs[loop].m_StartAddressOfStruct = 0;
m_StackOfStructs[loop].m_EndAddressOfStruct = 0;
m_StackOfStructs[loop].m_NameOfInstanceOfStruct.Clear();
m_StackOfStructs[loop].m_ArrayIndexOfStruct = -1;
}
m_nCurrentStackLevel = -1;
}
void CScriptSaveStack::Push(u8* StartAddress, u8* EndAddress, const char *pNameOfInstance, int ArrayIndex)
{
if (savegameVerifyf(m_nCurrentStackLevel < (MAX_DEPTH_OF_STACK_OF_STRUCTS-1), "CScriptSaveStack::Push - no space left on the stack for %s", pNameOfInstance))
{
m_nCurrentStackLevel++;
m_StackOfStructs[m_nCurrentStackLevel].m_StartAddressOfStruct = StartAddress;
m_StackOfStructs[m_nCurrentStackLevel].m_EndAddressOfStruct = EndAddress;
m_StackOfStructs[m_nCurrentStackLevel].m_NameOfInstanceOfStruct = pNameOfInstance;
m_StackOfStructs[m_nCurrentStackLevel].m_ArrayIndexOfStruct = ArrayIndex;
}
}
void CScriptSaveStack::Pop()
{
if (savegameVerifyf(m_nCurrentStackLevel >= 0, "CScriptSaveStack::Pop - stack is already empty"))
{
m_StackOfStructs[m_nCurrentStackLevel].m_NameOfInstanceOfStruct.Clear();
m_nCurrentStackLevel--;
}
}
int CScriptSaveStack::GetArrayIndex(int StackLevel) const
{
if (savegameVerifyf( (StackLevel >= 0) && (StackLevel <= m_nCurrentStackLevel), "CScriptSaveStack::GetArrayIndex - stack level is invalid"))
{
return m_StackOfStructs[StackLevel].m_ArrayIndexOfStruct;
}
return -1;
}
u8* CScriptSaveStack::GetStartAddress(int StackLevel) const
{
if (savegameVerifyf( (StackLevel >= 0) && (StackLevel <= m_nCurrentStackLevel), "CScriptSaveStack::GetStartAddress - stack level is invalid"))
{
return m_StackOfStructs[StackLevel].m_StartAddressOfStruct;
}
return 0;
}
u8* CScriptSaveStack::GetEndAddress(int StackLevel) const
{
if (savegameVerifyf( (StackLevel >= 0) && (StackLevel <= m_nCurrentStackLevel), "CScriptSaveStack::GetEndAddress - stack level is invalid"))
{
return m_StackOfStructs[StackLevel].m_EndAddressOfStruct;
}
return 0;
}
const atString &CScriptSaveStack::GetNameOfInstance(int StackLevel) const
{
static atString ErrorString;
if (savegameVerifyf( (StackLevel >= 0) && (StackLevel <= m_nCurrentStackLevel), "CScriptSaveStack::GetNameOfInstance - stack level is invalid"))
{
return m_StackOfStructs[StackLevel].m_NameOfInstanceOfStruct;
}
else
{
ErrorString = "Unknown";
return ErrorString;
}
}