summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/msgbox.cpp45
-rw-r--r--src/msgbox.h50
-rw-r--r--src/palaceDude.cpp50
3 files changed, 101 insertions, 44 deletions
diff --git a/src/msgbox.cpp b/src/msgbox.cpp
index adbeb24..9a5fb25 100644
--- a/src/msgbox.cpp
+++ b/src/msgbox.cpp
@@ -1,52 +1,9 @@
#include <common.h>
#include <game.h>
+#include "msgbox.h"
// Replaces: EN_LIFT_ROTATION_HALF (Sprite 107; Profile ID 481 @ 80AF96F8)
-class dMsgBoxManager_c : public dStageActor_c {
- public:
- void showMessage(int id);
-
- dMsgBoxManager_c() : state(this, &StateID_LoadRes) { }
-
- int onCreate();
- int onDelete();
- int onExecute();
- int onDraw();
-
- int beforeExecute() { return true; }
- int afterExecute(int) { return true; }
-
- m2d::EmbedLayout_c layout;
- dDvdLoader_c msgDataLoader;
-
- bool layoutLoaded;
- bool visible;
-
- dStateWrapper_c<dMsgBoxManager_c> state;
-
- USING_STATES(dMsgBoxManager_c);
- DECLARE_STATE(LoadRes);
- DECLARE_STATE(Wait);
- DECLARE_STATE(BoxAppearWait);
- DECLARE_STATE(ShownWait);
- DECLARE_STATE(BoxDisappearWait);
-
- static dMsgBoxManager_c *instance;
- static dMsgBoxManager_c *build();
-
- private:
- struct entry_s {
- u32 id;
- u32 titleOffset;
- u32 msgOffset;
- };
-
- struct header_s {
- u32 count;
- entry_s entry[1];
- };
-};
dMsgBoxManager_c *dMsgBoxManager_c::instance = 0;
dMsgBoxManager_c *dMsgBoxManager_c::build() {
diff --git a/src/msgbox.h b/src/msgbox.h
new file mode 100644
index 0000000..032b5c8
--- /dev/null
+++ b/src/msgbox.h
@@ -0,0 +1,50 @@
+#ifndef MSGBOX_H
+#define MSGBOX_H
+#include <common.h>
+#include <game.h>
+
+class dMsgBoxManager_c : public dStageActor_c {
+ public:
+ void showMessage(int id);
+
+ dMsgBoxManager_c() : state(this, &StateID_LoadRes) { }
+
+ int onCreate();
+ int onDelete();
+ int onExecute();
+ int onDraw();
+
+ int beforeExecute() { return true; }
+ int afterExecute(int) { return true; }
+
+ m2d::EmbedLayout_c layout;
+ dDvdLoader_c msgDataLoader;
+
+ bool layoutLoaded;
+ bool visible;
+
+ dStateWrapper_c<dMsgBoxManager_c> state;
+
+ USING_STATES(dMsgBoxManager_c);
+ DECLARE_STATE(LoadRes);
+ DECLARE_STATE(Wait);
+ DECLARE_STATE(BoxAppearWait);
+ DECLARE_STATE(ShownWait);
+ DECLARE_STATE(BoxDisappearWait);
+
+ static dMsgBoxManager_c *instance;
+ static dMsgBoxManager_c *build();
+
+ private:
+ struct entry_s {
+ u32 id;
+ u32 titleOffset;
+ u32 msgOffset;
+ };
+
+ struct header_s {
+ u32 count;
+ entry_s entry[1];
+ };
+};
+#endif /* MSGBOX_H */
diff --git a/src/palaceDude.cpp b/src/palaceDude.cpp
new file mode 100644
index 0000000..eff3299
--- /dev/null
+++ b/src/palaceDude.cpp
@@ -0,0 +1,50 @@
+#include <game.h>
+#include <stage.h>
+#include "msgbox.h"
+
+class dPalaceDude_c : public dStageActor_c {
+ public:
+ static dPalaceDude_c *build();
+
+ bool hasBeenActivated;
+ bool hasExitedStage;
+ int onExecute();
+};
+
+/*****************************************************************************/
+// Glue Code
+dPalaceDude_c *dPalaceDude_c::build() {
+ void *buffer = AllocFromGameHeap1(sizeof(dPalaceDude_c));
+ dPalaceDude_c *c = new(buffer) dPalaceDude_c;
+ return c;
+}
+
+
+int dPalaceDude_c::onExecute() {
+ if (dFlagMgr_c::instance->flags & spriteFlagMask) {
+ if (hasBeenActivated)
+ return true;
+ //OSReport("Activating Palace Dude\n");
+ hasBeenActivated = true;
+
+ dMsgBoxManager_c::instance->showMessage(settings & 0xFFFFFFF);
+
+ SaveBlock *save = GetSaveFile()->GetBlock(-1);
+ save->switch_on |= (1 << (settings >> 28));
+ }
+
+ if (hasBeenActivated) {
+ if (hasExitedStage)
+ return true;
+ //OSReport("Palace Dude is activated, %d\n", dMsgBoxManager_c::instance->visible);
+ if (!dMsgBoxManager_c::instance->visible) {
+ ExitStage(WORLD_MAP, 0, BEAT_LEVEL, MARIO_WIPE);
+ hasExitedStage = true;
+ }
+ }
+
+ return true;
+
+}
+
+