summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cutScene.yaml6
-rw-r--r--src/msgbox.cpp27
-rw-r--r--src/msgbox.h5
-rw-r--r--src/palaceDude.cpp17
-rw-r--r--src/sceneGlue.cpp33
-rw-r--r--switchblock.yaml5
6 files changed, 74 insertions, 19 deletions
diff --git a/cutScene.yaml b/cutScene.yaml
index 138117c..c75e92d 100644
--- a/cutScene.yaml
+++ b/cutScene.yaml
@@ -1,6 +1,12 @@
---
source_files: [../src/cutScene.cpp, ../src/sceneGlue.cpp]
hooks:
+ - name: DoOpeningLevel
+ type: branch_insn
+ branch_type: bl
+ src_addr_pal: 0x809191D4
+ target_func: 'EnterOpeningLevel'
+
- name: BuildCutScene
type: add_func_pointer
src_addr_pal: 0x8098CD18
diff --git a/src/msgbox.cpp b/src/msgbox.cpp
index 30ee66e..ed75f83 100644
--- a/src/msgbox.cpp
+++ b/src/msgbox.cpp
@@ -101,7 +101,12 @@ void dMsgBoxManager_c::executeState_Wait() {
/*****************************************************************************/
// Show Box
-void dMsgBoxManager_c::showMessage(int id) {
+void dMsgBoxManager_c::showMessage(int id, bool canCancel, int delay) {
+ if (!this) {
+ OSReport("ADD A MESSAGE BOX MANAGER YOU MORON\n");
+ return;
+ }
+
// get the data file
header_s *data = (header_s*)msgDataLoader.buffer;
@@ -116,12 +121,17 @@ void dMsgBoxManager_c::showMessage(int id) {
}
if (title == 0) {
+ OSReport("Message Box: Message %08x not found\n", id);
return;
}
layout.findTextBoxByName("T_title")->SetString(title);
layout.findTextBoxByName("T_msg")->SetString(msg);
+ this->canCancel = canCancel;
+ this->delay = delay;
+ layout.findPictureByName("button")->SetVisible(canCancel);
+
state.setState(&StateID_BoxAppearWait);
}
@@ -151,10 +161,17 @@ CREATE_STATE(dMsgBoxManager_c, ShownWait);
void dMsgBoxManager_c::beginState_ShownWait() { }
void dMsgBoxManager_c::executeState_ShownWait() {
- int nowPressed = Remocon_GetPressed(GetActiveRemocon());
-
- if (nowPressed & WPAD_TWO) {
- state.setState(&StateID_BoxDisappearWait);
+ if (canCancel) {
+ int nowPressed = Remocon_GetPressed(GetActiveRemocon());
+
+ if (nowPressed & WPAD_TWO)
+ state.setState(&StateID_BoxDisappearWait);
+ }
+
+ if (delay > 0) {
+ delay--;
+ if (delay == 0)
+ state.setState(&StateID_BoxDisappearWait);
}
}
void dMsgBoxManager_c::endState_ShownWait() { }
diff --git a/src/msgbox.h b/src/msgbox.h
index f71749d..22ae812 100644
--- a/src/msgbox.h
+++ b/src/msgbox.h
@@ -5,7 +5,7 @@
class dMsgBoxManager_c : public dStageActor_c {
public:
- void showMessage(int id);
+ void showMessage(int id, bool canCancel=true, int delay=-1);
dMsgBoxManager_c() : state(this, &StateID_LoadRes) { }
@@ -25,6 +25,9 @@ class dMsgBoxManager_c : public dStageActor_c {
bool layoutLoaded;
bool visible;
+ bool canCancel;
+ int delay;
+
dStateWrapper_c<dMsgBoxManager_c> state;
USING_STATES(dMsgBoxManager_c);
diff --git a/src/palaceDude.cpp b/src/palaceDude.cpp
index 19f7255..7aa0ccc 100644
--- a/src/palaceDude.cpp
+++ b/src/palaceDude.cpp
@@ -2,6 +2,8 @@
#include <stage.h>
#include "msgbox.h"
+const char *PalaceDudeFileList[] = {"OpeningScene", 0};
+
class dPalaceDude_c : public dStageActor_c {
public:
static dPalaceDude_c *build();
@@ -26,12 +28,17 @@ int dPalaceDude_c::onExecute() {
// OSReport("Activating Palace Dude\n");
hasBeenActivated = true;
- StopBGMMusic();
+ if (!(settings & 0xF000000))
+ StopBGMMusic();
- dMsgBoxManager_c::instance->showMessage(settings & 0xFFFFFFF);
+ dMsgBoxManager_c::instance->showMessage(
+ settings & 0xFFFFFF, // message ID
+ false, // cannot cancel
+ (settings & 0xF000000) ? 270 : 840 // delay
+ );
SaveBlock *save = GetSaveFile()->GetBlock(-1);
- GameMgrP->switchPalaceFlag|= (1 << (settings >> 28));
+ GameMgrP->switchPalaceFlag |= (1 << (settings >> 28));
}
}
@@ -41,7 +48,9 @@ int dPalaceDude_c::onExecute() {
// OSReport("Palace Dude is activated, %d\n", dMsgBoxManager_c::instance->visible);
if (!dMsgBoxManager_c::instance->visible) {
// OSReport("Exiting\n");
- ExitStage(WORLD_MAP, 0, BEAT_LEVEL, MARIO_WIPE);
+ if (settings & 0xF000000)
+ SaveGame(0, false);
+ ExitStage(WORLD_MAP, 0x80000000, BEAT_LEVEL, MARIO_WIPE);
hasExitedStage = true;
}
}
diff --git a/src/sceneGlue.cpp b/src/sceneGlue.cpp
index 3e2167a..fef5ad9 100644
--- a/src/sceneGlue.cpp
+++ b/src/sceneGlue.cpp
@@ -5,18 +5,33 @@ extern char CurrentLevel, CurrentWorld;
extern u8 MaybeFinishingLevel[2];
extern "C" void ExitStageReal(int scene, int sceneParams, int powerupStoreType, int wipe);
+
extern "C" void ExitStageWrapper(int scene, int sceneParams, int powerupStoreType, int wipe) {
- if (scene == WORLD_MAP && powerupStoreType == BEAT_LEVEL) {
- if (CurrentWorld == 6 && CurrentLevel == STAGE_DOOMSHIP) {
- if (MaybeFinishingLevel[0] == 6 && MaybeFinishingLevel[1] == STAGE_DOOMSHIP) {
- // We're done with 7-38
- ExitStage(MOVIE, 0x10000000, powerupStoreType, wipe);
- return;
- }
- }
- }
+ // TO RE-ENABLE CUTSCENES, UNCOMMENT THIS
+ // if (scene == WORLD_MAP && powerupStoreType == BEAT_LEVEL) {
+ // if (CurrentWorld == 6 && CurrentLevel == STAGE_DOOMSHIP) {
+ // if (MaybeFinishingLevel[0] == 6 && MaybeFinishingLevel[1] == STAGE_DOOMSHIP) {
+ // // We're done with 7-38
+ // ExitStage(MOVIE, 0x10000000, powerupStoreType, wipe);
+ // return;
+ // }
+ // }
+ // }
ExitStageReal(scene, sceneParams, powerupStoreType, wipe);
}
+extern "C" void EnterOpeningLevel() {
+ DontShowPreGame = true;
+ RESTART_CRSIN_LevelStartStruct.purpose = 0;
+ RESTART_CRSIN_LevelStartStruct.world1 = 1;
+ RESTART_CRSIN_LevelStartStruct.world2 = 1;
+ RESTART_CRSIN_LevelStartStruct.level1 = 40;
+ RESTART_CRSIN_LevelStartStruct.level2 = 40;
+ RESTART_CRSIN_LevelStartStruct.areaMaybe = 0;
+ RESTART_CRSIN_LevelStartStruct.entrance = 0xFF;
+ RESTART_CRSIN_LevelStartStruct.unk4 = 0; // load replay
+ DoSceneChange(RESTART_CRSIN, 0, 0);
+}
+
diff --git a/switchblock.yaml b/switchblock.yaml
index e18fda8..567a6d6 100644
--- a/switchblock.yaml
+++ b/switchblock.yaml
@@ -43,3 +43,8 @@ hooks:
data: '02A7 0000 00000010 00000010 00000000 00000000 00000200 00000200 0000 0000 0200 0200 0000 0000'
# 0x8030A340 + sprite num * 0x28 == offset
+ - name: PalaceDudeSpriteFileInfo
+ type: add_func_pointer
+ src_addr_pal: 0x8031AF90
+ target_func: 'PalaceDudeFileList'
+ # 0x8031AB4C + sprite num * 0x4 == offset