2
0
mirror of https://github.com/AxioDL/metaforce.git synced 2025-12-08 21:07:42 +00:00

Implement --warp command-line arguments

This commit is contained in:
Jack Andersen
2018-10-17 18:51:59 -10:00
parent 8d839d8a17
commit f433821320
10 changed files with 115 additions and 36 deletions

View File

@@ -1,20 +1,54 @@
#include "CStateSetterFlow.hpp"
#include "CArchitectureMessage.hpp"
#include "GameGlobalObjects.hpp"
#include "MP1.hpp"
namespace urde::MP1
{
CStateSetterFlow::CStateSetterFlow()
: CIOWin("")
{
}
: CIOWin("") {}
CIOWin::EMessageReturn CStateSetterFlow::OnMessage(const CArchitectureMessage& msg, CArchitectureQueue& queue)
{
if (msg.GetType() == EArchMsgType::TimerTick)
{
//g_Main->sub80004590();
MP1::CMain* m = static_cast<MP1::CMain*>(g_Main);
if (m->m_warpWorldIdx > -1)
{
CResLoader* loader = g_ResFactory->GetResLoader();
CAssetId worldId;
for (const auto& pak : loader->GetPaks())
{
if (*(pak->GetPath().end() - 6) == '0' + m->m_warpWorldIdx)
{
worldId = pak->GetMLVLId();
break;
}
}
if (worldId.IsValid())
{
m->ResetGameState();
g_GameState->SetCurrentWorldId(worldId);
CWorldLayerState& layers = *g_GameState->StateForWorld(worldId).GetLayerState();
if (m->m_warpAreaId < layers.GetAreaCount())
{
g_GameState->StateForWorld(worldId).SetAreaId(m->m_warpAreaId);
if (m->m_warpLayerBits)
{
for (u32 i = 0; i < layers.GetAreaLayerCount(m->m_warpAreaId); ++i)
layers.SetLayerActive(m->m_warpAreaId, i, ((m->m_warpLayerBits >> i) & 1) != 0);
}
}
g_GameState->GameOptions().ResetToDefaults();
g_GameState->WriteBackupBuf();
return EMessageReturn::RemoveIOWinAndExit;
}
}
m->RefreshGameState();
return EMessageReturn::RemoveIOWinAndExit;
}
return EMessageReturn::Exit;