summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorrobojumper <robojumper@gmail.com>2024-10-06 21:41:07 +0200
committerGitHub <noreply@github.com>2024-10-06 15:41:07 -0400
commit8376edcc722df2e71b28270754d2e43a7ea2124c (patch)
tree7f322d98791665b6e01d6222fbe8e3feeca71f21 /src
parentb83c0d5fd2e5edfba64f02786451c6bbbe2b2d8a (diff)
d_t_ship_window "OK" (#55)
Diffstat (limited to 'src')
-rw-r--r--src/REL/d/t/d_t_ship_window.cpp145
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() {}