diff options
| author | robojumper <robojumper@gmail.com> | 2024-10-06 21:41:07 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-10-06 15:41:07 -0400 |
| commit | 8376edcc722df2e71b28270754d2e43a7ea2124c (patch) | |
| tree | 7f322d98791665b6e01d6222fbe8e3feeca71f21 /src | |
| parent | b83c0d5fd2e5edfba64f02786451c6bbbe2b2d8a (diff) | |
d_t_ship_window "OK" (#55)
Diffstat (limited to 'src')
| -rw-r--r-- | src/REL/d/t/d_t_ship_window.cpp | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/src/REL/d/t/d_t_ship_window.cpp b/src/REL/d/t/d_t_ship_window.cpp index e69de29b..1700eb30 100644 --- a/src/REL/d/t/d_t_ship_window.cpp +++ b/src/REL/d/t/d_t_ship_window.cpp @@ -0,0 +1,145 @@ +#include <d/tg/d_t_ship_window.h> +#include <toBeSorted/event_manager.h> +#include <toBeSorted/sceneflag_manager.h> + +SPECIAL_ACTOR_PROFILE(TAG_SHIP_WINDOW, dTgShipWindow_c, fProfile::TAG_SHIP_WINDOW, 0x0228, 0, 0); + +STATE_DEFINE(dTgShipWindow_c, On); +STATE_DEFINE(dTgShipWindow_c, Off); + +// sDefaultRotX got placed in .data despite being zero. +// There is a handy pragma for this but it's probably not +// the correct solution. +#pragma explicit_zero_data on +u32 dTgShipWindow_c::sDefaultRotX = 0; +#pragma explicit_zero_data off + +int dTgShipWindow_c::create() { + mInitialStateFlag = params & 0xFF; + mOutputStateFlagBase = (params >> 8) & 0xFF; + mOffEventId = (params >> 16) & 0xFF; + mOnEventId = (params >> 24) & 0xFF; + mAlwaysPlayEvent = rotation.x & 1; + rotation.x = sDefaultRotX; + if (SceneflagManager::sInstance->checkBoolFlag(roomid, mInitialStateFlag)) { + SceneflagManager::sInstance->setFlag(roomid, mOutputStateFlagBase); + mStateMgr.changeState(StateID_On); + } else { + SceneflagManager::sInstance->unsetFlag(roomid, mOutputStateFlagBase); + mStateMgr.changeState(StateID_Off); + } + return SUCCEEDED; +} + +int dTgShipWindow_c::doDelete() { + return SUCCEEDED; +} + +int dTgShipWindow_c::actorExecute() { + mStateMgr.executeState(); + return SUCCEEDED; +} + +int dTgShipWindow_c::actorExecuteInEvent() { + switch (mEvent.getCurrentEventCommand()) { + case 'act0': + actorExecute(); + mEvent.advanceNext(); + break; + case 'act1': + actorExecute(); + if (*mStateMgr.getStateID() == StateID_Off) { + SceneflagManager::sInstance->unsetFlag(roomid, mOutputStateFlagBase); + } else { + SceneflagManager::sInstance->setFlag(roomid, mOutputStateFlagBase); + } + mEvent.advanceNext(); + break; + case '????': actorExecute(); break; + default: actorExecute(); break; + } + + return SUCCEEDED; +} + +int dTgShipWindow_c::draw() { + return SUCCEEDED; +} + +void dTgShipWindow_c::initializeState_Off() {} +void dTgShipWindow_c::executeState_Off() { + if (!SceneflagManager::sInstance->checkBoolFlag(roomid, mInitialStateFlag)) { + return; + } + + if ((mHasPlayedOffEvent == 0 || mAlwaysPlayEvent == 0) && + (mOutputStateFlagBase >= 0xFF || !SceneflagManager::sInstance->checkBoolFlag(roomid, mOutputStateFlagBase + 1))) { + if (mOffEventId != 0xFF) { + { + // this works but I don't like it + static volatile u32 FLAGS_1 = 0x00000001; + static u32 FLAGS_2 = 0x00100001; + u32 f1 = FLAGS_1; + u32 f2 = FLAGS_2; + Event e = Event(mOffEventId, roomid, f2 & ~f1, nullptr, nullptr); + mEvent.scheduleEvent(e, 0); + } + + if (!EventManager::isInEvent(this, nullptr)) { + return; + } + mHasPlayedOffEvent = 1; + if (mOutputStateFlagBase < 0xFF) { + SceneflagManager::sInstance->setFlag(roomid, mOutputStateFlagBase + 1); + } + mStateMgr.changeState(StateID_On); + return; + } else { + SceneflagManager::sInstance->setFlag(roomid, mOutputStateFlagBase); + mStateMgr.changeState(StateID_On); + return; + } + } + SceneflagManager::sInstance->setFlag(roomid, mOutputStateFlagBase); + mStateMgr.changeState(StateID_On); +} +void dTgShipWindow_c::finalizeState_Off() {} + +void dTgShipWindow_c::initializeState_On() {} +void dTgShipWindow_c::executeState_On() { + if (SceneflagManager::sInstance->checkBoolFlag(roomid, mInitialStateFlag)) { + return; + } + + if ((mHasPlayedOnEvent == 0 || mAlwaysPlayEvent == 0) && + (mOutputStateFlagBase >= 0xFF || !SceneflagManager::sInstance->checkBoolFlag(roomid, mOutputStateFlagBase + 2))) { + if (mOnEventId != 0xFF) { + { + // this works but I don't like it + static volatile u32 FLAGS_1 = 0x00000001; + static u32 FLAGS_2 = 0x00100001; + u32 f1 = FLAGS_1; + u32 f2 = FLAGS_2; + Event e = Event(mOnEventId, roomid, f2 & ~f1, nullptr, nullptr); + mEvent.scheduleEvent(e, 0); + } + + if (!EventManager::isInEvent(this, nullptr)) { + return; + } + mHasPlayedOnEvent = 1; + if (mOutputStateFlagBase < 0xFF) { + SceneflagManager::sInstance->setFlag(roomid, mOutputStateFlagBase + 2); + } + mStateMgr.changeState(StateID_Off); + return; + } else { + SceneflagManager::sInstance->unsetFlag(roomid, mOutputStateFlagBase); + mStateMgr.changeState(StateID_Off); + return; + } + } + SceneflagManager::sInstance->unsetFlag(roomid, mOutputStateFlagBase); + mStateMgr.changeState(StateID_Off); +} +void dTgShipWindow_c::finalizeState_On() {} |
