diff --git a/asm/MetroidPrime/ScriptObjects/CScriptPlayerStateChange.s b/asm/MetroidPrime/ScriptObjects/CScriptPlayerStateChange.s index 6e9f1d65..3a832fd9 100644 --- a/asm/MetroidPrime/ScriptObjects/CScriptPlayerStateChange.s +++ b/asm/MetroidPrime/ScriptObjects/CScriptPlayerStateChange.s @@ -2,8 +2,8 @@ .section .data .balign 8 -.global lbl_803E5CC0 -lbl_803E5CC0: +.global __vt__24CScriptPlayerStateChange +__vt__24CScriptPlayerStateChange: # ROM: 0x3E2CC0 .4byte 0 .4byte 0 @@ -26,9 +26,9 @@ __dt__24CScriptPlayerStateChangeFv: /* 801DA4B4 001D7414 93 C1 00 08 */ stw r30, 8(r1) /* 801DA4B8 001D7418 7C 7E 1B 79 */ or. r30, r3, r3 /* 801DA4BC 001D741C 41 82 00 28 */ beq lbl_801DA4E4 -/* 801DA4C0 001D7420 3C A0 80 3E */ lis r5, lbl_803E5CC0@ha +/* 801DA4C0 001D7420 3C A0 80 3E */ lis r5, __vt__24CScriptPlayerStateChange@ha /* 801DA4C4 001D7424 38 80 00 00 */ li r4, 0 -/* 801DA4C8 001D7428 38 05 5C C0 */ addi r0, r5, lbl_803E5CC0@l +/* 801DA4C8 001D7428 38 05 5C C0 */ addi r0, r5, __vt__24CScriptPlayerStateChange@l /* 801DA4CC 001D742C 90 1E 00 00 */ stw r0, 0(r30) /* 801DA4D0 001D7430 4B E7 6D A5 */ bl __dt__7CEntityFv /* 801DA4D4 001D7434 7F E0 07 35 */ extsh. r0, r31 @@ -158,9 +158,9 @@ Accept__24CScriptPlayerStateChangeFR8IVisitor: /* 801DA694 001D75F4 7C 87 23 78 */ mr r7, r4 /* 801DA698 001D75F8 38 81 00 08 */ addi r4, r1, 8 /* 801DA69C 001D75FC 4B E7 6C 89 */ bl "__ct__7CEntityF9TUniqueIdRC11CEntityInfobRCQ24rstl66basic_string,Q24rstl17rmemory_allocator>" -/* 801DA6A0 001D7600 3C 80 80 3E */ lis r4, lbl_803E5CC0@ha +/* 801DA6A0 001D7600 3C 80 80 3E */ lis r4, __vt__24CScriptPlayerStateChange@ha /* 801DA6A4 001D7604 7F 43 D3 78 */ mr r3, r26 -/* 801DA6A8 001D7608 38 04 5C C0 */ addi r0, r4, lbl_803E5CC0@l +/* 801DA6A8 001D7608 38 04 5C C0 */ addi r0, r4, __vt__24CScriptPlayerStateChange@l /* 801DA6AC 001D760C 90 1A 00 00 */ stw r0, 0(r26) /* 801DA6B0 001D7610 93 7A 00 34 */ stw r27, 0x34(r26) /* 801DA6B4 001D7614 93 9A 00 38 */ stw r28, 0x38(r26) diff --git a/include/MetroidPrime/CControlMapper.hpp b/include/MetroidPrime/CControlMapper.hpp new file mode 100644 index 00000000..981bfb13 --- /dev/null +++ b/include/MetroidPrime/CControlMapper.hpp @@ -0,0 +1,77 @@ +#ifndef _CCONTROLMAPPER +#define _CCONTROLMAPPER + +class ControlMapper { +public: + enum ECommands { + kC_Forward, + kC_Backward, + kC_TurnLeft, + kC_TurnRight, + kC_StrafeLeft, + kC_StrafeRight, + kC_LookLeft, + kC_LookRight, + kC_LookUp, + kC_LookDown, + kC_JumpOrBoost = 10, + kC_FireOrBomb = 11, + kC_MissileOrPowerBomb = 12, + kC_Morph, + kC_AimUp, + kC_AimDown, + kC_CycleBeamUp, + kC_CycleBeamDown, + kC_CycleItem, + kC_PowerBeam, + kC_IceBeam, + kC_WaveBeam, + kC_PlasmaBeam, + kC_ToggleHolster = 23, + kC_OrbitClose, + kC_OrbitFar, + kC_OrbitObject, + kC_OrbitSelect, + kC_OrbitConfirm, + kC_OrbitLeft, + kC_OrbitRight, + kC_OrbitUp, + kC_OrbitDown, + kC_LookHold1, + kC_LookHold2, + kC_LookZoomIn, + kC_LookZoomOut, + kC_AimHold, + kC_MapCircleUp, + kC_MapCircleDown, + kC_MapCircleLeft, + kC_MapCircleRight, + kC_MapMoveForward, + kC_MapMoveBack, + kC_MapMoveLeft, + kC_MapMoveRight, + kC_MapZoomIn, + kC_MapZoomOut, + kC_SpiderBall, + kC_ChaseCamera, + kC_XrayVisor = 50, + kC_ThermoVisor = 51, + kC_InviroVisor = 52, + kC_NoVisor = 53, + kC_VisorMenu, + kC_VisorUp, + kC_VisorDown, + kC_ShowCrosshairs, + kC_UseSheild = 0x3B, + kC_ScanItem = 0x3C, + kC_PreviousPauseScreen = 0x41, + kC_NextPauseScreen = 0x42, + kC_UNKNOWN, + kC_None, + kC_MAX + }; + + static void SetCommandFiltered(ECommands cmd, bool filtered); +}; + +#endif // _CCONTROLMAPPER diff --git a/include/MetroidPrime/ScriptObjects/CScriptPlayerStateChange.hpp b/include/MetroidPrime/ScriptObjects/CScriptPlayerStateChange.hpp new file mode 100644 index 00000000..1a0cc0b6 --- /dev/null +++ b/include/MetroidPrime/ScriptObjects/CScriptPlayerStateChange.hpp @@ -0,0 +1,26 @@ +#ifndef _CSCRIPTPLAYERSTATECHANGE +#define _CSCRIPTPLAYERSTATECHANGE + +#include "MetroidPrime/CEntity.hpp" + +class CScriptPlayerStateChange : public CEntity { +public: + enum EControl { kC_Unfiltered, kC_Filtered }; + enum EControlCommandOption { kCCO_Unfiltered, kCCO_Filtered }; + +private: + int x34_itemType; + int x38_itemCount; + int x3c_itemCapacity; + EControl x40_ctrl; + EControlCommandOption x44_ctrlCmdOpt; + +public: + CScriptPlayerStateChange(TUniqueId, const rstl::string&, const CEntityInfo&, bool, int, int, int, EControl, + EControlCommandOption); + void Accept(IVisitor& visit) override; + void AcceptScriptMsg(EScriptObjectMessage, TUniqueId, CStateManager&) override; + ~CScriptPlayerStateChange(); +}; + +#endif // _CSCRIPTPLAYERSTATECHANGE diff --git a/src/MetroidPrime/ScriptObjects/CScriptPlayerStateChange.cpp b/src/MetroidPrime/ScriptObjects/CScriptPlayerStateChange.cpp new file mode 100644 index 00000000..fcf5a8f0 --- /dev/null +++ b/src/MetroidPrime/ScriptObjects/CScriptPlayerStateChange.cpp @@ -0,0 +1,48 @@ +#include "MetroidPrime/ScriptObjects/CScriptPlayerStateChange.hpp" + +#include "MetroidPrime/CControlMapper.hpp" +#include "MetroidPrime/CStateManager.hpp" +#include "MetroidPrime/Player/CPlayerState.hpp" + +CScriptPlayerStateChange::CScriptPlayerStateChange(TUniqueId uid, const rstl::string& name, + const CEntityInfo& info, bool active, + int itemType, int itemCount, int itemCapacity, + EControl control, + EControlCommandOption controlCmdOpt) +: CEntity(uid, info, active, name) +, x34_itemType(itemType) +, x38_itemCount(itemCount) +, x3c_itemCapacity(itemCapacity) +, x40_ctrl(control) +, x44_ctrlCmdOpt(controlCmdOpt) {} + +void CScriptPlayerStateChange::Accept(IVisitor& visitor) { visitor.Visit(*this); } + +void CScriptPlayerStateChange::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, + CStateManager& stateMgr) override { + if (GetActive() && msg == kSM_SetToZero) { + stateMgr.PlayerState()->InitializePowerUp(CPlayerState::EItemType(x34_itemType), + x3c_itemCapacity); + stateMgr.PlayerState()->IncrPickUp(CPlayerState::EItemType(x34_itemType), x38_itemCount); + + if (x44_ctrlCmdOpt != kCCO_Unfiltered) { + switch (x40_ctrl) { + case kC_Filtered: + bool filtered = !(1 - x44_ctrlCmdOpt); + ControlMapper::SetCommandFiltered(ControlMapper::kC_OrbitClose, filtered); + ControlMapper::SetCommandFiltered(ControlMapper::kC_OrbitConfirm, filtered); + ControlMapper::SetCommandFiltered(ControlMapper::kC_OrbitDown, filtered); + ControlMapper::SetCommandFiltered(ControlMapper::kC_OrbitFar, filtered); + ControlMapper::SetCommandFiltered(ControlMapper::kC_OrbitLeft, filtered); + ControlMapper::SetCommandFiltered(ControlMapper::kC_OrbitObject, filtered); + ControlMapper::SetCommandFiltered(ControlMapper::kC_OrbitRight, filtered); + ControlMapper::SetCommandFiltered(ControlMapper::kC_OrbitSelect, filtered); + ControlMapper::SetCommandFiltered(ControlMapper::kC_OrbitUp, filtered); + } + } + } + + CEntity::AcceptScriptMsg(msg, objId, stateMgr); +} + +CScriptPlayerStateChange::~CScriptPlayerStateChange() {}