mirror of
https://github.com/PrimeDecomp/prime.git
synced 2025-12-18 17:25:21 +00:00
Add CScriptWorldTeleporter
This commit is contained in:
163
src/MetroidPrime/ScriptObjects/CScriptWorldTeleporter.cpp
Normal file
163
src/MetroidPrime/ScriptObjects/CScriptWorldTeleporter.cpp
Normal file
@@ -0,0 +1,163 @@
|
||||
#include "MetroidPrime/ScriptObjects/CScriptWorldTeleporter.hpp"
|
||||
|
||||
#include "MetroidPrime/CAnimRes.hpp"
|
||||
#include "MetroidPrime/CMain.hpp"
|
||||
#include "MetroidPrime/CMainFlow.hpp"
|
||||
#include "MetroidPrime/CStateManager.hpp"
|
||||
#include "MetroidPrime/CWorld.hpp"
|
||||
#include "MetroidPrime/Player/CGameState.hpp"
|
||||
#include "MetroidPrime/Player/CWorldTransManager.hpp"
|
||||
|
||||
#include "Kyoto/Audio/CSfxManager.hpp"
|
||||
#include "Kyoto/CResFactory.hpp"
|
||||
|
||||
CScriptWorldTeleporter::CScriptWorldTeleporter(TUniqueId uid, const rstl::string& name,
|
||||
const CEntityInfo& info, bool active,
|
||||
CAssetId worldId, CAssetId areaId)
|
||||
: CEntity(uid, info, active, name)
|
||||
, x34_worldId(worldId)
|
||||
, x38_areaId(areaId)
|
||||
, x3c_type(kTT_NoTransition)
|
||||
, x40_24_upElevator(false)
|
||||
, x40_25_inTransition(false)
|
||||
, x40_27_fadeWhite(false)
|
||||
, x44_charFadeIn(0.1f)
|
||||
, x48_charsPerSecond(8.0f)
|
||||
, x4c_showDelay(0.0f)
|
||||
, x50_playerAnim(kInvalidAssetId, -1, 0)
|
||||
, x5c_playerScale(CVector3f::Zero())
|
||||
, x68_platformModel(kInvalidAssetId)
|
||||
, x6c_platformScale(CVector3f::Zero())
|
||||
, x78_backgroundModel(kInvalidAssetId)
|
||||
, x7c_backgroundScale(CVector3f::Zero())
|
||||
, x88_soundId(CSfxManager::kInternalInvalidSfxId)
|
||||
, x8a_volume(0)
|
||||
, x8b_panning(0)
|
||||
{}
|
||||
|
||||
CScriptWorldTeleporter::CScriptWorldTeleporter(
|
||||
TUniqueId uid, const rstl::string& name, const CEntityInfo& info, bool active, CAssetId worldId,
|
||||
CAssetId areaId, CAssetId playerAncs, uint charIdx, uint defaultAnim,
|
||||
const CVector3f& playerScale, CAssetId platformModel, const CVector3f& platformScale,
|
||||
CAssetId backgroundModel, const CVector3f& backgroundScale, bool upElevator, ushort soundId,
|
||||
uchar volume, uchar panning)
|
||||
: CEntity(uid, info, active, name)
|
||||
, x34_worldId(worldId)
|
||||
, x38_areaId(areaId)
|
||||
, x3c_type(kTT_Elevator)
|
||||
, x40_24_upElevator(upElevator)
|
||||
, x40_25_inTransition(false)
|
||||
, x40_27_fadeWhite(false)
|
||||
, x44_charFadeIn(0.1f)
|
||||
, x48_charsPerSecond(8.0f)
|
||||
, x4c_showDelay(0.0f)
|
||||
, x50_playerAnim(playerAncs, charIdx, defaultAnim)
|
||||
, x5c_playerScale(playerScale)
|
||||
, x68_platformModel(platformModel)
|
||||
, x6c_platformScale(platformScale)
|
||||
, x78_backgroundModel(backgroundModel)
|
||||
, x7c_backgroundScale(backgroundScale)
|
||||
, x88_soundId(CSfxManager::TranslateSFXID(soundId))
|
||||
, x8a_volume(volume)
|
||||
, x8b_panning(panning) {}
|
||||
|
||||
CScriptWorldTeleporter::CScriptWorldTeleporter(TUniqueId uid, const rstl::string& name,
|
||||
const CEntityInfo& info, bool active,
|
||||
CAssetId worldId, CAssetId areaId, ushort soundId,
|
||||
uchar volume, uchar panning, CAssetId fontId,
|
||||
CAssetId stringId, bool fadeWhite, float charFadeIn,
|
||||
float charsPerSecond, float showDelay)
|
||||
: CEntity(uid, info, active, name)
|
||||
, x34_worldId(worldId)
|
||||
, x38_areaId(areaId)
|
||||
, x3c_type(kTT_Text)
|
||||
, x40_24_upElevator(false)
|
||||
, x40_25_inTransition(false)
|
||||
, x40_27_fadeWhite(fadeWhite)
|
||||
, x44_charFadeIn(charFadeIn)
|
||||
, x48_charsPerSecond(charsPerSecond)
|
||||
, x4c_showDelay(showDelay)
|
||||
, x50_playerAnim(kInvalidAssetId, -1, 0)
|
||||
, x5c_playerScale(CVector3f::Zero())
|
||||
, x68_platformModel(kInvalidAssetId)
|
||||
, x6c_platformScale(CVector3f::Zero())
|
||||
, x78_backgroundModel(kInvalidAssetId)
|
||||
, x7c_backgroundScale(CVector3f::Zero())
|
||||
, x88_soundId(CSfxManager::TranslateSFXID(soundId))
|
||||
, x8a_volume(volume)
|
||||
, x8b_panning(panning)
|
||||
, x8c_fontId(fontId)
|
||||
, x90_stringId(stringId) {}
|
||||
|
||||
CScriptWorldTeleporter::~CScriptWorldTeleporter() {}
|
||||
|
||||
void CScriptWorldTeleporter::Accept(IVisitor& visitor) { visitor.Visit(*this); }
|
||||
|
||||
void CScriptWorldTeleporter::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid,
|
||||
CStateManager& mgr) {
|
||||
if (GetActive()) {
|
||||
CWorldTransManager* transMgr = mgr.WorldTransManager();
|
||||
switch (msg) {
|
||||
case kSM_SetToZero: {
|
||||
CWorld* world = mgr.World();
|
||||
world->SetLoadPauseState(true);
|
||||
CAssetId currentWorld = gpGameState->CurrentWorldAssetId();
|
||||
gpGameState->SetCurrentWorldId(x34_worldId);
|
||||
|
||||
if (gpResourceFactory->GetResLoader().GetResourceTypeById(x34_worldId) == 'MLVL') {
|
||||
StartTransition(mgr);
|
||||
gpGameState->SetCurrentWorldId(x34_worldId);
|
||||
gpGameState->CurrentWorldState().SetDesiredAreaAssetId(x38_areaId);
|
||||
gpMain->SetRestartMode(CMain::kRM_None);
|
||||
mgr.QuitGame();
|
||||
} else {
|
||||
x40_25_inTransition = false;
|
||||
transMgr->DisableTransition();
|
||||
gpGameState->SetCurrentWorldId(currentWorld);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case kSM_Play:
|
||||
StartTransition(mgr);
|
||||
transMgr->SetSfx(x88_soundId, x8a_volume, x8b_panning);
|
||||
transMgr->SfxStart();
|
||||
break;
|
||||
|
||||
case kSM_Stop:
|
||||
x40_25_inTransition = false;
|
||||
transMgr->DisableTransition();
|
||||
transMgr->SfxStop();
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
CEntity::AcceptScriptMsg(msg, uid, mgr);
|
||||
}
|
||||
|
||||
void CScriptWorldTeleporter::StartTransition(CStateManager& mgr) {
|
||||
if (x40_25_inTransition) {
|
||||
return;
|
||||
}
|
||||
|
||||
CWorldTransManager* transMgr = mgr.WorldTransManager();
|
||||
|
||||
if (x3c_type == kTT_Elevator && x50_playerAnim.GetACSFile() != kInvalidAssetId &&
|
||||
x50_playerAnim.GetCharacter() != u32(-1)) {
|
||||
transMgr->EnableTransition(CAnimRes(x50_playerAnim.GetACSFile(), x50_playerAnim.GetCharacter(),
|
||||
x5c_playerScale, x50_playerAnim.GetInitialAnimation(),
|
||||
true),
|
||||
x68_platformModel, x6c_platformScale, x78_backgroundModel,
|
||||
x7c_backgroundScale, x40_24_upElevator);
|
||||
x40_25_inTransition = true;
|
||||
|
||||
} else if (x3c_type == kTT_Text) {
|
||||
transMgr->EnableTransition(x8c_fontId, x90_stringId, 0, GetFadeWhite(), x44_charFadeIn,
|
||||
x48_charsPerSecond, x4c_showDelay);
|
||||
x40_25_inTransition = true;
|
||||
|
||||
} else {
|
||||
transMgr->DisableTransition();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user