Skip to content

Commit 2e010f8

Browse files
authored
Decompile dScRestartCrsin_c (#120)
1 parent e38f90d commit 2e010f8

10 files changed

Lines changed: 166 additions & 2 deletions

File tree

‎alias_db.txt‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -460,7 +460,6 @@ R_2_5_4da38 = g_profile_WORLD_9_DEMO
460460
R_2_5_4dff8 = g_profile_CRSIN
461461
R_2_5_4e710 = g_profile_GAMEOVER
462462
R_2_5_4ea98 = g_profile_MOVIE
463-
R_2_5_4f150 = g_profile_RESTART_CRSIN
464463
R_2_5_4f238 = g_profile_STAGE
465464
R_2_5_4fa70 = g_profile_WORLD_MAP
466465
R_2_5_4fff8 = g_profile_WORLD_SELECT

‎include/game/bases/d_info.hpp‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ class dInfo_c {
5151
void SetMapEnemyInfo(int, int, int, int);
5252
void FUN_800bbc40(int, int, int);
5353

54+
void startGame(const dInfo_c::StartGameInfo_s &);
55+
5456
u8 getCourse() const { return m_startGameInfo.mLevel1; }
5557
u8 getWorld() const { return m_startGameInfo.mWorld1; }
5658
dCyuukan_c *getCyuukan() { return &mCyuukan; }
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#pragma once
2+
#include <types.h>
3+
4+
class dScCrsin_c {
5+
public:
6+
static bool m_isDispOff; ///< Whether the Pre-Game screen will display or not.
7+
};
Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,32 @@
11
#pragma once
22
#include <game/bases/d_scene.hpp>
3+
#include <game/bases/d_info.hpp>
34

5+
/**
6+
* @brief This scene is used to "restart" levels.
7+
* @ingroup bases
8+
* @details It is used for the following purposes:
9+
* - Returning to Peach's Castle after a Hint Movie ends.
10+
* - Starting the title screen stage.
11+
*/
412
class dScRestartCrsin_c : public dScene_c {
513
public:
6-
static void startTitle(unsigned char, bool);
14+
dScRestartCrsin_c(); ///< @copydoc dScene_c::dScene_c
15+
virtual ~dScRestartCrsin_c(); ///< @copydoc dScene_c::~dScene_c
16+
17+
virtual int create();
18+
virtual int doDelete();
19+
virtual int preExecute();
20+
virtual int execute();
21+
virtual int draw();
22+
23+
/// @brief Starts the title screen stage or a title replay.
24+
/// @param isReplay Whether it will start a random replay or the title screen.
25+
/// @param forceChange If the scene transition should always be performed.
26+
static void startTitle(u8 isReplay, bool forceChange);
27+
28+
/// @brief Starts the Peach's Castle stage.
729
static void reStartPeachCastle();
30+
31+
static dInfo_c::StartGameInfo_s m_startGameInfo; ///< Info used to start a level.
832
};

‎include/game/bases/d_s_stage.hpp‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ class dScStage_c : public dScene_c {
5050
static u32 m_exeFrame;
5151
static int m_loopType;
5252
static PLAYER_TYPE_e mCollectionCoin[STAR_COIN_COUNT];
53+
static int m_titleCount;
54+
static u8 m_titleRandomTable[];
5355

5456
static const char mCdArcName[];
5557

‎slices/d_basesNP.json‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,13 @@
154154
".data": "0x4dfa0-0x4dff8"
155155
}
156156
},
157+
{
158+
"source": "d_basesNP/bases/d_s_restart_crsin.cpp",
159+
"memoryRanges": {
160+
".text": "0x1b6200-0x1b63f0",
161+
".data": "0x4f150-0x4f1a8"
162+
}
163+
},
157164
{
158165
"source": "d_basesNP/bases/d_s_select.cpp",
159166
"memoryRanges": {

‎slices/wiimj2d.json‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -552,6 +552,14 @@
552552
".data": "0x1de58-0x1de68"
553553
}
554554
},
555+
{
556+
"source": "dol/bases/d_s_restart_crsin_static.cpp",
557+
"memoryRanges": {
558+
".text": "0xfb160-0xfb2d0",
559+
".rodata": "0x6cf0-0x6d10",
560+
".bss": "0x226e0-0x226f0"
561+
}
562+
},
555563
{
556564
"source": "dol/bases/d_SelectCursor.cpp",
557565
"memoryRanges": {
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
#include <game/bases/d_s_restart_crsin.hpp>
2+
#include <game/bases/d_game_com.hpp>
3+
#include <game/bases/d_WarningManager.hpp>
4+
#include <game/bases/d_fader.hpp>
5+
#include <game/bases/d_system.hpp>
6+
7+
BASE_PROFILE(RESTART_CRSIN, dScRestartCrsin_c);
8+
9+
dScRestartCrsin_c::dScRestartCrsin_c() {}
10+
11+
dScRestartCrsin_c::~dScRestartCrsin_c() {}
12+
13+
int dScRestartCrsin_c::create() {
14+
if (m_startGameInfo.mGameMode == dInfo_c::GAME_MODE_TITLE) {
15+
dGameCom::initGame();
16+
}
17+
18+
dWarningManager_c::m_WarningForbid++;
19+
dFader_c::setFader(dFader_c::FADER_FADE);
20+
dScene_c::setFadeInOutFrame(1);
21+
22+
nw4r::ut::Color color;
23+
color = nw4r::ut::Color::BLACK;
24+
dSys_c::setClearColor(color);
25+
26+
return SUCCEEDED;
27+
}
28+
29+
int dScRestartCrsin_c::preExecute() {
30+
return dScene_c::preExecute() != NOT_READY;
31+
}
32+
33+
int dScRestartCrsin_c::execute() {
34+
dInfo_c::m_instance->startGame(m_startGameInfo);
35+
return SUCCEEDED;
36+
}
37+
38+
int dScRestartCrsin_c::doDelete() {
39+
dScene_c::setFadeInFrame(30);
40+
dScene_c::setFadeOutFrame(30);
41+
42+
return SUCCEEDED;
43+
}
44+
45+
int dScRestartCrsin_c::draw() {
46+
return SUCCEEDED;
47+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
#include <game/bases/d_s_restart_crsin.hpp>
2+
#include <game/bases/d_s_stage.hpp>
3+
#include <game/bases/d_s_crsin_static.hpp>
4+
5+
dInfo_c::StartGameInfo_s dScRestartCrsin_c::m_startGameInfo;
6+
7+
void dScRestartCrsin_c::startTitle(u8 isReplay, bool forceChange) {
8+
static const u8 c_stage[][2] = {
9+
{WORLD_1, STAGE_4},
10+
{WORLD_1, STAGE_6},
11+
{WORLD_2, STAGE_1},
12+
{WORLD_2, STAGE_4},
13+
{WORLD_3, STAGE_1},
14+
{WORLD_3, STAGE_5},
15+
{WORLD_3, STAGE_TOWER},
16+
{WORLD_4, STAGE_1},
17+
{WORLD_4, STAGE_5},
18+
{WORLD_5, STAGE_4},
19+
{WORLD_5, STAGE_5},
20+
{WORLD_5, STAGE_GHOST_HOUSE},
21+
{WORLD_6, STAGE_CASTLE},
22+
{WORLD_7, STAGE_6},
23+
{WORLD_8, STAGE_7}
24+
};
25+
26+
if (!isReplay) {
27+
m_startGameInfo.mWorld1 = WORLD_1;
28+
m_startGameInfo.mLevel1 = STAGE_TITLE;
29+
m_startGameInfo.mGameMode = dInfo_c::GAME_MODE_TITLE;
30+
m_startGameInfo.mIsReplay = false;
31+
} else {
32+
m_startGameInfo.mWorld1 = c_stage[dScStage_c::m_titleRandomTable[dScStage_c::m_titleCount]][0];
33+
m_startGameInfo.mLevel1 = c_stage[dScStage_c::m_titleRandomTable[dScStage_c::m_titleCount]][1];
34+
m_startGameInfo.mGameMode = dInfo_c::GAME_MODE_TITLE_REPLAY;
35+
m_startGameInfo.mIsReplay = true;
36+
}
37+
38+
m_startGameInfo.mWorld2 = m_startGameInfo.mWorld1;
39+
m_startGameInfo.mLevel2 = m_startGameInfo.mLevel1;
40+
m_startGameInfo.mArea = 0;
41+
m_startGameInfo.mEntrance = 0xFF;
42+
43+
dFader_c::setFader(dFader_c::FADER_FADE);
44+
dScCrsin_c::m_isDispOff = true;
45+
dScene_c::setNextScene(fProf::RESTART_CRSIN, forceChange, forceChange);
46+
}
47+
48+
void dScRestartCrsin_c::reStartPeachCastle() {
49+
m_startGameInfo.mGameMode = dInfo_c::GAME_MODE_NORMAL;
50+
m_startGameInfo.mIsReplay = false;
51+
m_startGameInfo.mArea = 0;
52+
m_startGameInfo.mEntrance = 0xFF;
53+
m_startGameInfo.mWorld1 = WORLD_1;
54+
m_startGameInfo.mLevel1 = STAGE_PEACH_CASTLE;
55+
m_startGameInfo.mWorld2 = WORLD_1;
56+
m_startGameInfo.mLevel2 = STAGE_PEACH_CASTLE;
57+
58+
dFader_c::setFader(dFader_c::FADER_CIRCLE_MIDDLE);
59+
dScCrsin_c::m_isDispOff = true;
60+
dScStage_c::m_exitMode = dScStage_c::EXIT_2;
61+
62+
dScene_c::setNextScene(fProf::RESTART_CRSIN, 0, false);
63+
}

‎syms.txt‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,7 @@ checkInstantBreak__9dIceMng_cFi=0x800B8A70
258258
breakEffect__9dIceMng_cFv=0x800B8C00
259259
manageProc__9dIceMng_cFv=0x800B8F30
260260
__ct__7dInfo_cFv=0x800BB0E0
261+
startGame__7dInfo_cFRCQ27dInfo_c15StartGameInfo_s=0x800BB7D0
261262
SetMapEnemyInfo__7dInfo_cFiiii=0x800BBC20
262263
FUN_800bbc40__7dInfo_cFiii=0x800BBC40
263264
GetMapEnemyInfo__7dInfo_cFiiRQ27dInfo_c7enemy_s=0x800BBC60
@@ -915,8 +916,10 @@ mPlayerMode__9daPyMng_c=0x80355170
915916
mCreateItem__9daPyMng_c=0x80355180
916917
mRest__9daPyMng_c=0x80355190
917918
m_hio__11dPyMdlMng_c=0x803710A0
919+
m_startGameInfo__17dScRestartCrsin_c=0x80374060
918920
mCdArcName__10dScStage_c=0x8037407C
919921
mCollectionCoin__10dScStage_c=0x803744B0
922+
m_titleRandomTable__10dScStage_c=0x803744BC
920923
g_core__4mPad=0x80377F88
921924
sScreen__Q23EGG16ScreenEffectBase=0x80424A98
922925
m_isBoot__Q213dRemoconMng_c10dConnect_c=0x80428280
@@ -966,8 +969,10 @@ m_instance__16dWaterEntryMng_c=0x8042A3E0
966969
m_instance__9daWmMap_c=0x8042A46C
967970
ms_instance__12daWmPlayer_c=0x8042A480
968971
ms_instance__11dCsSeqMng_c=0x8042A48C
972+
m_isDispOff__10dScCrsin_c=0x8042A490
969973
m_instance__10dScMovie_c=0x8042A498
970974
m_instance__10dScStage_c=0x8042A4A8
975+
m_titleCount__10dScStage_c=0x8042A4D8
971976
m_exeFrame__10dScStage_c=0x8042A4E0
972977
m_gameMode__10dScStage_c=0x8042A4E4
973978
m_loopType__10dScStage_c=0x8042A4E8

0 commit comments

Comments
 (0)