diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 0af7c857..27ad9e06 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -154,7 +154,7 @@ d/d_scene.cpp: .sbss start:0x80575220 end:0x80575228 .bss start:0x805A06F0 end:0x805A0720 -d/d_stage.cpp: +d/d_stage_parse.cpp: .text start:0x80062E40 end:0x80064250 d/d_sys.cpp: @@ -648,9 +648,12 @@ d/tg/d_t_weather.cpp: .text start:0x801A65D0 end:0x801AF7D8 .ctors start:0x804DB804 end:0x804DB808 -d/d_room_mgr.cpp: +d/d_stage.cpp: .text start:0x801B32A0 end:0x801B5BC8 .ctors start:0x804DB80C end:0x804DB810 + .data start:0x8052DF40 end:0x8052E080 + .sdata start:0x80573290 end:0x805732F8 + .sdata2 start:0x8057B4E8 end:0x8057B528 d/d_room.cpp: .text start:0x801B5C80 end:0x801B84D8 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 3f9005bf..e2b45c5b 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -10951,52 +10951,52 @@ fn_801B31B0 = .text:0x801B31B0; // type:function size:0x24 fn_801B31E0 = .text:0x801B31E0; // type:function size:0x34 fn_801B3220 = .text:0x801B3220; // type:function size:0x64 initCurrentLangString = .text:0x801B3290; // type:function size:0xC -RoomManager__ctor = .text:0x801B32A0; // type:function size:0x30 -RoomManager__ctorCont = .text:0x801B32D0; // type:function size:0xF0 -fn_801B33C0 = .text:0x801B33C0; // type:function size:0x58 -fn_801B3420 = .text:0x801B3420; // type:function size:0x40 +dStage_c_classInit__Fv = .text:0x801B32A0; // type:function size:0x30 +__ct__8dStage_cFv = .text:0x801B32D0; // type:function size:0xF0 +__dt__18sFPhase<8dStage_c>Fv = .text:0x801B33C0; // type:function size:0x58 +__dt__12dRoomTable_cFv = .text:0x801B3420; // type:function size:0x40 fn_801B3460 = .text:0x801B3460; // type:function size:0x40 -RoomManager__init = .text:0x801B34A0; // type:function size:0x1D8 -fn_801B3680 = .text:0x801B3680; // type:function size:0x30 -RoomManager__baseUpdate = .text:0x801B36B0; // type:function size:0x3C -RoomManager__draw = .text:0x801B36F0; // type:function size:0x24 -fn_801B3720 = .text:0x801B3720; // type:function size:0x4 -RoomManager__createRoomsAfterRespawnMaybe = .text:0x801B3730; // type:function size:0x200 -fn_801B3930 = .text:0x801B3930; // type:function size:0x30 -setRoom__11RoomManagerFiP7dRoom_c = .text:0x801B3960; // type:function size:0x10 -GetRoomByIndex__11RoomManagerFi = .text:0x801B3970; // type:function size:0x10 +create__8dStage_cFv = .text:0x801B34A0; // type:function size:0x1D8 +doDelete__8dStage_cFv = .text:0x801B3680; // type:function size:0x30 +execute__8dStage_cFv = .text:0x801B36B0; // type:function size:0x3C +draw__8dStage_cFv = .text:0x801B36F0; // type:function size:0x24 +deleteReady__8dStage_cFv = .text:0x801B3720; // type:function size:0x4 +createRooms__8dStage_cFv = .text:0x801B3730; // type:function size:0x200 +waitForRooms__8dStage_cFv = .text:0x801B3930; // type:function size:0x30 +setRoom__8dStage_cFiP7dRoom_c = .text:0x801B3960; // type:function size:0x10 +getRoom__8dStage_cFl = .text:0x801B3970; // type:function size:0x10 RoomManager__handleRoomChangeMaybe = .text:0x801B3980; // type:function size:0x114 RoomManager__updateRoomFlags = .text:0x801B3AA0; // type:function size:0x134 RoomManager__checkOtherRoomLoaded = .text:0x801B3BE0; // type:function size:0x78 fn_801B3C60 = .text:0x801B3C60; // type:function size:0x9C -RoomManager__fadeIn = .text:0x801B3D00; // type:function size:0xA8 -RoomManager__fadeOut = .text:0x801B3DB0; // type:function size:0xA8 -RoomManager__somethingFadeOutRelated = .text:0x801B3E60; // type:function size:0x40 -RoomManager__somethingFadeInRelated = .text:0x801B3EA0; // type:function size:0x40 +fadeIn__8dStage_cFlUs = .text:0x801B3D00; // type:function size:0xA8 +fadeOut__8dStage_cFlUs = .text:0x801B3DB0; // type:function size:0xA8 +forceFadeOut__8dStage_cFv = .text:0x801B3E60; // type:function size:0x40 +forceFadeIn__8dStage_cFv = .text:0x801B3EA0; // type:function size:0x40 fn_801B3EE0 = .text:0x801B3EE0; // type:function size:0x3C fn_801B3F20 = .text:0x801B3F20; // type:function size:0x8 fn_801B3F30 = .text:0x801B3F30; // type:function size:0x8 -RoomManager__someCollisionThing = .text:0x801B3F40; // type:function size:0x90 +drawMap__8dStage_cFP6mMtx_ci = .text:0x801B3F40; // type:function size:0x90 RoomManager__getRMPLForRoom = .text:0x801B3FD0; // type:function size:0x34 -RoomManager__getDungeonflagAndShiftForRoomVisit = .text:0x801B4010; // type:function size:0x34 -hasVisitedRoomId__11RoomManagerCFl = .text:0x801B4050; // type:function size:0x8C -RoomManager__setRoomVisited = .text:0x801B40E0; // type:function size:0x12C -RoomManager__createRoom = .text:0x801B4210; // type:function size:0x28 -RoomManager__createLytSeekerStone = .text:0x801B4240; // type:function size:0x68 -getRoom__11RoomManagerFi = .text:0x801B42B0; // type:function size:0x20 -bindStageResToFile__11RoomManagerFPQ34nw4r3g3d7ResFile = .text:0x801B42D0; // type:function size:0x50 -bindSkyCmnToResFile__11RoomManagerFPQ34nw4r3g3d7ResFile = .text:0x801B4320; // type:function size:0x54 -RoomManager__getMA0AnmTexSrt = .text:0x801B4380; // type:function size:0xA0 -getMA0IndirectSrt__11RoomManagerFPQ34nw4r3g3d12ResAnmTexSrtRCQ34nw4r3g3d6ResMdl = .text:0x801B4420; // type:function size:0x9C -changeLoadedEntities__11RoomManagerFP11RoomManagerUlb = .text:0x801B44C0; // type:function size:0x50 +getFlagPositionForRoomVisit__FiPUsPUs = .text:0x801B4010; // type:function size:0x34 +hasVisitedRoom__8dStage_cCFi = .text:0x801B4050; // type:function size:0x8C +setRoomVisited__8dStage_cFi = .text:0x801B40E0; // type:function size:0x12C +createRoom__8dStage_cFib = .text:0x801B4210; // type:function size:0x28 +createLytSeekerStone__8dStage_cFv = .text:0x801B4240; // type:function size:0x68 +getParentForRoom__8dStage_cFl = .text:0x801B42B0; // type:function size:0x20 +bindStageResToFile__8dStage_cFPQ34nw4r3g3d7ResFile = .text:0x801B42D0; // type:function size:0x50 +bindSkyCmnToResFile__8dStage_cFPQ34nw4r3g3d7ResFile = .text:0x801B4320; // type:function size:0x54 +getMA0AnmTexSrt__8dStage_cFPQ34nw4r3g3d12ResAnmTexSrtPCc = .text:0x801B4380; // type:function size:0xA0 +getMA0IndirectSrt__8dStage_cFPQ34nw4r3g3d12ResAnmTexSrtRCQ34nw4r3g3d6ResMdl = .text:0x801B4420; // type:function size:0x9C +changeLoadedEntities__8dStage_cFUlb = .text:0x801B44C0; // type:function size:0x50 RoomManager__checkRoomFlag = .text:0x801B4510; // type:function size:0x3C RoomManager__checkEnemyDefeatFlag = .text:0x801B4550; // type:function size:0x6C fn_801B45C0 = .text:0x801B45C0; // type:function size:0xAC -RoomManager__RoomTable__ctor = .text:0x801B4670; // type:function size:0x110 -RoomManager__MapRelated__init = .text:0x801B4780; // type:function size:0x180 -fn_801B4900 = .text:0x801B4900; // type:function size:0x44 -fn_801B4950 = .text:0x801B4950; // type:function size:0x40 -fn_801B4990 = .text:0x801B4990; // type:function size:0x84 +__ct__12dRoomTable_cFv = .text:0x801B4670; // type:function size:0x110 +__ct__10MapRelatedFv = .text:0x801B4780; // type:function size:0x180 +__ct__Q210MapRelated5ChildFv = .text:0x801B4900; // type:function size:0x44 +__dt__Q210MapRelated5ChildFv = .text:0x801B4950; // type:function size:0x40 +__dt__10MapRelatedFv = .text:0x801B4990; // type:function size:0x84 fn_801B4A20 = .text:0x801B4A20; // type:function size:0xBC fn_801B4AE0 = .text:0x801B4AE0; // type:function size:0x44 fn_801B4B30 = .text:0x801B4B30; // type:function size:0x24 @@ -11014,13 +11014,13 @@ fn_801B5180 = .text:0x801B5180; // type:function size:0x7F0 fn_801B5970 = .text:0x801B5970; // type:function size:0x38 fn_801B59B0 = .text:0x801B59B0; // type:function size:0x58 fn_801B5A10 = .text:0x801B5A10; // type:function size:0x58 -RoomManager__dtor = .text:0x801B5A70; // type:function size:0x94 -fn_801B5B10 = .text:0x801B5B10; // type:function size:0x30 -fn_801B5B40 = .text:0x801B5B40; // type:function size:0xC -fn_801B5B50 = .text:0x801B5B50; // type:function size:0x10 -fn_801B5B60 = .text:0x801B5B60; // type:function size:0x2C +__dt__8dStage_cFv = .text:0x801B5A70; // type:function size:0x94 +callPhase__18sFPhase<8dStage_c>Fv = .text:0x801B5B10; // type:function size:0x30 +onReset__18sFPhase<8dStage_c>Fv = .text:0x801B5B40; // type:function size:0xC +nextPhase__18sFPhase<8dStage_c>Fv = .text:0x801B5B50; // type:function size:0x10 +hasReachedEnd__18sFPhase<8dStage_c>CFv = .text:0x801B5B60; // type:function size:0x2C fn_801B5B90 = .text:0x801B5B90; // type:function size:0x10 -fn_801B5BA0 = .text:0x801B5BA0; // type:function size:0x28 +__sinit_\d_stage_cpp = .text:0x801B5BA0; // type:function size:0x28 AcStageSelect__ctor = .text:0x801B5BD0; // type:function size:0x4C AcStageSelect__dtor = .text:0x801B5C20; // type:function size:0x5C dRoom_c_classInit__Fv = .text:0x801B5C80; // type:function size:0x17C @@ -34180,18 +34180,18 @@ lbl_8052DE68 = .data:0x8052DE68; // type:object size:0x10 GlobalMessageRelatedContext__vtable = .data:0x8052DE78; // type:object size:0x4C ActorEventFlowManager__vtable = .data:0x8052DEC4; // type:object size:0x78 g_profile_STAGE = .data:0x8052DF40; // type:object size:0xC -actorInit.defaultFlags = .data:0x8052DF4C; // type:object size:0x24 +sCallbacks__8dStage_c = .data:0x8052DF4C; // type:object size:0x24 lbl_8052DF70 = .data:0x8052DF70; // type:object size:0x10 lbl_8052DF80 = .data:0x8052DF80; // type:object size:0x10 lbl_8052DF90 = .data:0x8052DF90; // type:object size:0x10 data:string lbl_8052DFA0 = .data:0x8052DFA0; // type:object size:0x10 data:string -lbl_8052DFB0 = .data:0x8052DFB0; // type:object size:0xC data:4byte +sMatsToTry = .data:0x8052DFB0; // type:object size:0xC data:4byte lbl_8052DFBC = .data:0x8052DFBC; // type:object size:0x1C lbl_8052DFD8 = .data:0x8052DFD8; // type:object size:0x1C -RoomManager__vtable = .data:0x8052DFF4; // type:object size:0x4C +__vt__8dStage_c = .data:0x8052DFF4; // type:object size:0x4C lbl_8052E040 = .data:0x8052E040; // type:object size:0xC -RoomManager__RoomTable__vtable = .data:0x8052E04C; // type:object size:0xC -lbl_8052E058 = .data:0x8052E058; // type:object size:0x24 +__vt__12dRoomTable_c = .data:0x8052E04C; // type:object size:0xC +__vt__18sFPhase<8dStage_c> = .data:0x8052E058; // type:object size:0x24 g_profile_STAGE_SELECT = .data:0x8052E080; // type:object size:0xC AcStageSelect__vtable = .data:0x8052E08C; // type:object size:0x4C g_profile_ROOM = .data:0x8052E0D8; // type:object size:0xC @@ -40234,7 +40234,7 @@ lbl_80575749 = .sbss:0x80575749; // type:object size:0x7 data:byte CURRENT_LANGUAGE_STRING = .sbss:0x80575750; // type:object size:0x8 data:byte lbl_80575758 = .sbss:0x80575758; // type:object size:0x4 data:4byte lbl_8057575C = .sbss:0x8057575C; // type:object size:0x4 data:4byte -m_Instance__11RoomManager = .sbss:0x80575760; // type:object size:0x4 data:4byte +sInstance__8dStage_c = .sbss:0x80575760; // type:object size:0x4 data:4byte lbl_80575764 = .sbss:0x80575764; // type:object size:0x1 data:byte lbl_80575768 = .sbss:0x80575768; // type:object size:0x8 data:byte lbl_80575770 = .sbss:0x80575770; // type:object size:0x4 data:float diff --git a/configure.py b/configure.py index 5b1adfc9..be60b1f5 100644 --- a/configure.py +++ b/configure.py @@ -340,7 +340,7 @@ config.libs = [ Object(Matching, "d/d_heap.cpp"), Object(Matching, "d/d_rawarchive.cpp"), Object(Matching, "d/d_scene.cpp"), - Object(NonMatching, "d/d_stage.cpp"), + Object(NonMatching, "d/d_stage_parse.cpp"), Object(NonMatching, "d/d_sys.cpp"), Object(NonMatching, "toBeSorted/sound_info.cpp"), Object(Matching, "toBeSorted/arc_callback_handler.cpp"), @@ -429,6 +429,7 @@ config.libs = [ Object(Matching, "d/lyt/d_lyt_fader.cpp"), Object(Matching, "d/lyt/d_screen_fader.cpp"), Object(NonMatching, "d/a/d_a_insect.cpp"), + Object(NonMatching, "d/d_stage.cpp"), Object(NonMatching, "d/d_room.cpp"), Object(NonMatching, "d/d_cs_base.cpp"), Object(NonMatching, "d/d_cs_game.cpp"), diff --git a/include/d/d_bzs_types.h b/include/d/d_bzs_types.h new file mode 100644 index 00000000..afba4360 --- /dev/null +++ b/include/d/d_bzs_types.h @@ -0,0 +1,163 @@ +#ifndef D_STAGE_TYPES_H +#define D_STAGE_TYPES_H + +#include "common.h" +#include "m/m_angle.h" +#include "m/m_vec.h" + + +// Size 0x20 +struct AREA { + /* 0x00 */ mVec3_c mPos; + /* 0x0C */ mVec3_c mScale; + /* 0x18 */ mAng mAngleY; + /* 0x1A */ mAng mAngleLink; + /* 0x1C */ u8 field_0x1C; +}; + +// TODO: double check, copied from ss-tools +// Size 0x28 +struct BPNT { + /* 0x00 */ mVec3_c position1; + /* 0x0C */ mVec3_c position2; + /* 0x18 */ mVec3_c position3; + /* 0x24 */ u8 _0x24[4]; +}; + +// TODO: double check, copied from ss-tools +// Size 0x2C +struct CAM { + /* 0x00 */ u8 _0x00[4]; + /* 0x04 */ mVec3_c position; + /* 0x10 */ f32 angle; + /* 0x14 */ u8 _0x14[8]; + /* 0x1C */ char name[16]; +}; + +// Size 0x38 +struct EVNT { + /* 0x00 */ u8 _0x00[2]; + /* 0x02 */ u16 storyFlag1; + /* 0x04 */ u16 storyFlag2; + /* 0x06 */ u8 _0x06[3]; + /* 0x09 */ u8 exitId; + /* 0x0A */ u8 _0x0A[3]; + /* 0x0D */ u8 skipEvent; + /* 0x0E */ u8 _0x0E[1]; + /* 0x0F */ u8 sceneFlag1; + /* 0x10 */ u8 sceneFlag2; + /* 0x11 */ u8 skipFlag; + /* 0x12 */ u8 _0x12[2]; + /* 0x14 */ u16 item; + /* 0x16 */ u16 _0x16[2]; + /* 0x18 */ char name[32]; +}; + +// Size 0x04 +struct LYLT { + /* 0x0 */ u8 layer; + /* 0x1 */ u8 demoHigh; + /* 0x2 */ u8 demoLow; + /* 0x3 */ u8 dummy; +}; + +// Size 0x04 +struct LYSE { + /* 0x0 */ u16 storyFlag; + /* 0x2 */ u8 night; + /* 0x3 */ u8 layer; +}; + +// Size 0x24 +struct OBJ { + /* 0x00 */ u32 params1; + /* 0x04 */ u32 params2; + /* 0x08 */ mVec3_c position; + /* 0x14 */ mAng3_c angle; + /* 0x1A */ u16 id; + /* 0x1C */ char name[8]; +}; + +// Size 0xC +struct PATH { + /* 0x00 */ u8 field_0x00; + /* 0x01 */ u8 field_0x01; + /* 0x02 */ u16 pointStartIndex; + /* 0x04 */ u16 pointCount; + /* 0x06 */ u8 _0x06[4]; + /* 0x0A */ u8 firstBitIsWrapAround; + /* 0x0B */ u8 _0x0B[1]; +}; + +// Size 0x24 +struct PCAM { + /* 0x00 */ mVec3_c position1; + /* 0x0C */ mVec3_c position2; + /* 0x18 */ f32 field_0x18; + /* 0x1C */ f32 field_0x1C; + /* 0x20 */ u8 id; + /* 0x21 */ u8 _0x21[3]; +}; + +// Size 0x18 +struct PLY { + /* 0x00 */ u16 storyFlag; + /* 0x02 */ u8 playCutscene; + /* 0x03 */ u8 _0x03[1]; + /* 0x04 */ mVec3_c position; + /* 0x10 */ mAng3_c angle; + /* 0x16 */ u16 entranceId; +}; + +// Size 0x10 +struct PNT { + /* 0x00 */ mVec3_c position; + /* 0x0C */ u8 _0x0C[4]; +}; + +// Size 0x4 +struct RMPL { + /* 0x0 */ u8 roomId; + /* 0x1 */ u8 count; + /* 0x2 */ u16 offset; +}; + +// Size 0x28 +struct SCEN { + /* 0x00 */ char name[32]; + /* 0x20 */ u8 room; + /* 0x21 */ u8 layer; + /* 0x22 */ u8 entrance; + /* 0x23 */ u8 night; + /* 0x24 */ u8 transitionType; + /* 0x25 */ u8 transitionFadeFrames; + /* 0x26 */ u8 zero; + /* 0x27 */ u8 savePrompt; +}; + +// Size 0x30 +struct SOBJ { + /* 0x00 */ u32 params1; + /* 0x04 */ u32 params2; + /* 0x08 */ mVec3_c position; + /* 0x14 */ mVec3_c scale; + /* 0x20 */ mAng3_c angle; + /* 0x26 */ u16 id; + /* 0x28 */ char name[8]; +}; + +// Size 0x14 +struct STIF { + /* 0x00 */ f32 field_0x00; + /* 0x04 */ f32 field_0x04; + /* 0x08 */ f32 defaultCullingDistance; + /* 0x0C */ u16 flagIndex; + /* 0x0E */ u8 areaType; + /* 0x0F */ u8 field_0x0F; + /* 0x10 */ u8 field_0x10; + /* 0x11 */ u8 field_0x11; + /* 0x12 */ u8 mapNameId; + /* 0x13 */ u8 field_0x13; +}; + +#endif diff --git a/include/d/d_fader.h b/include/d/d_fader.h index 24e2cd39..43912630 100644 --- a/include/d/d_fader.h +++ b/include/d/d_fader.h @@ -59,6 +59,10 @@ public: mFadeInFrame = frame; } + void setFadeOutFrame(u16 frame) { + mFadeOutFrame = frame; + } + private: /* 0x08 */ mColorFader_c *mpColorFader; /* 0x0C */ dLytFader_c *mpLytFader; diff --git a/include/d/d_room.h b/include/d/d_room.h index 7af97952..2519dc01 100644 --- a/include/d/d_room.h +++ b/include/d/d_room.h @@ -5,6 +5,7 @@ #include "d/a/d_a_base.h" #include "d/col/bg/d_bg_w_kcol.h" #include "d/d_base.h" +#include "d/d_bzs_types.h" #include "m/m3d/m_anmmatclr.h" #include "m/m3d/m_anmtexpat.h" #include "m/m3d/m_anmtexsrt.h" @@ -115,13 +116,13 @@ public: dRoom_c() : mStateMgr(*this, sStateID::null), field_0x15C(nullptr), - SCEN(nullptr), - PLY(nullptr), - CAM(nullptr), - EVNT(nullptr), - PATH(nullptr), - PNT(nullptr), - BPNT(nullptr), + scen(nullptr), + ply(nullptr), + cam(nullptr), + evnt(nullptr), + path(nullptr), + pnt(nullptr), + bpnt(nullptr), AREA(nullptr), unkCount(0), scenCount(0), @@ -175,17 +176,17 @@ private: /* 0x4E0 */ STATE_MGR_DECLARE(dRoom_c); /* 0x51C */ void *field_0x15C; - /* 0x520 */ void *SCEN; - /* 0x524 */ void *PLY; - /* 0x528 */ void *CAM; - /* 0x52C */ void *EVNT; - /* 0x530 */ void *PATH; - /* 0x534 */ void *PNT; - /* 0x538 */ void *BPNT; - /* 0x53C */ void *SPTH; + /* 0x520 */ SCEN *scen; + /* 0x524 */ PLY *ply; + /* 0x528 */ CAM *cam; + /* 0x52C */ EVNT *evnt; + /* 0x530 */ PATH *path; + /* 0x534 */ PNT *pnt; + /* 0x538 */ BPNT *bpnt; + /* 0x53C */ PATH *spth; /* 0x540 */ void *field_0x540; /* 0x544 */ void *field_0x544; - /* 0x548 */ void *AREA; + /* 0x548 */ AREA *AREA; /* 0x54C */ u16 unkCount; /* 0x54E */ u16 scenCount; /* 0x550 */ u16 plyCount; diff --git a/include/d/d_sc_game.h b/include/d/d_sc_game.h index 0b002f89..1a948eb9 100644 --- a/include/d/d_sc_game.h +++ b/include/d/d_sc_game.h @@ -152,6 +152,10 @@ public: void clearSpawnInfo(); const SpawnInfoExt &getSpawnInfo() const; + static void resetUpdateFrameCount() { + sUpdateFrameCount = 0; + } + protected: static u32 sUpdateFrameCount; static u8 sCurrentLayer; diff --git a/include/d/d_stage.h b/include/d/d_stage.h new file mode 100644 index 00000000..da4bf0ee --- /dev/null +++ b/include/d/d_stage.h @@ -0,0 +1,174 @@ +#ifndef D_STAGE_H +#define D_STAGE_H + +#include "common.h" +#include "d/d_base.h" +#include "d/d_fader.h" +#include "d/d_room.h" +#include "m/m_allocator.h" +#include "m/m_mtx.h" +#include "m/m_vec.h" +#include "s/s_FPhase.h" + +#define MAX_ROOM_NUMBER 64 + +class dRoomTable_c { +public: + /* 801b4670 */ dRoomTable_c(); + virtual ~dRoomTable_c() {} + + void setRoom(int roomid, dRoom_c *room) { + mRooms[roomid] = room; + } + + dRoom_c *getRoom(s32 idx) { + return mRooms[idx]; + } + +private: + dRoom_c *mRooms[MAX_ROOM_NUMBER - 1]; +}; + +class EggScreenEffectBlur { +public: + EggScreenEffectBlur(); + ~EggScreenEffectBlur(); + +private: + u8 _0x00[0x38 - 0x00]; +}; + +class EggPostEffectBlur { +public: + EggPostEffectBlur(); + ~EggPostEffectBlur() {} + + void setField0x30(f32 val) { + field_0x30 = val; + } + +private: + u8 _0x00[0x30 - 0x00]; + f32 field_0x30; + u8 _0x03[0x78 - 0x34]; +}; + +class MapRelated { +friend class dStage_c; + struct Child { + Child() : a(mVec3_c::Zero), b(mVec3_c::Zero), c(false) {} + ~Child() {} + mVec3_c a; + mVec3_c b; + bool c; + }; + +public: + MapRelated(); + ~MapRelated(); + /* 0x000 */ mHeapAllocator_c mAllocator; + /* 0x01C */ Child mChildren[8]; + /* 0x0FC */ mVec3_c field_0x0FC; + /* 0x108 */ f32 field_0x108; + /* 0x10C */ f32 field_0x10C; + /* 0x110 */ f32 field_0x110; + /* 0x114 */ f32 field_0x114; + /* 0x118 */ f32 field_0x118; + /* 0x11C */ f32 field_0x11C; + /* 0x120 */ f32 field_0x120; + /* 0x124 */ f32 field_0x124; + /* 0x128 */ f32 field_0x128; + /* 0x12C */ f32 field_0x12C; + /* 0x130 */ EggScreenEffectBlur mScreenEffect; + /* 0x168 */ EggPostEffectBlur mPostEffect; + /* 0x1E0 */ u32 field_0x1E0; + /* 0x1E4 */ u16 field_0x1E4; + /* 0x1E6 */ u16 field_0x1E6; + /* 0x1E8 */ u8 field_0x1E8; + /* 0x1E9 */ u8 field_0x1E9; + /* 0x1EA */ s8 field_0x1EA; + /* 0x1EB */ u8 field_0x1EB; + /* 0x1EC */ u8 field_0x1EC; + /* 0x1ED */ u8 field_0x1ED; + /* 0x1EE */ u8 field_0x1EE; + /* 0x1EF */ u8 field_0x1EF; + /* 0x1F0 */ u8 field_0x1F0; + +public: + /* 801b4780 */ void init(MapRelated *); + /* 801b4900 */ void fn_801b4900(); + void fn_801B4B80(u32 mapParams, const mVec3_c ¢er, const mVec3_c &size); + void fn_801B4C70(const mVec3_c &); + void fn_801B50C0(s32); +}; + +// OBJ NAME: STAGE +// Ghidra: RoomManager +// size: 0x239c +// vtable: 8052dff4 +class dStage_c : public dBase_c { +public: + dStage_c(); + virtual ~dStage_c() { + sInstance = nullptr; + } + + int create() override; + int doDelete() override; + int execute() override; + int draw() override; + void deleteReady() override; + + void drawMap(mMtx_c *mtx, int); + dRoom_c *getRoom(s32 idx); + void setRoom(int roomid, dRoom_c *room); + + bool fadeIn(s32 fadeType, u16 frames); + bool fadeOut(s32 fadeType, u16 frames); + + void forceFadeIn(); + void forceFadeOut(); + + bool hasVisitedRoom(int roomid) const; + void setRoomVisited(int roomid); + + + static void bindStageResToFile(nw4r::g3d::ResFile *file); + static void bindSkyCmnToResFile(nw4r::g3d::ResFile *file); + static bool getMA0AnmTexSrt(nw4r::g3d::ResAnmTexSrt *, const char *matName); + static bool getMA0IndirectSrt(nw4r::g3d::ResAnmTexSrt *, const nw4r::g3d::ResMdl &mdl); + + /** Returns stage if idx == -1, otherwise room */ + static dBase_c *getParentForRoom(s32 idx); + + void changeLoadedEntities(u32 index_shift, bool set); + + static dStage_c *GetInstance() { + return sInstance; + } + + u8 getCurrRoomId() const { + return curr_room_id; + } + +private: + dRoom_c *createRoom(int roomid, bool flag0x40); + void createLytSeekerStone(); + + sFPhaseBase::sFPhaseState createRooms(); + sFPhaseBase::sFPhaseState waitForRooms(); + + static sFPhase::phaseCallback sCallbacks[]; + + /* 0x0068 */ sFPhase mPhase; + /* 0x007C */ dRoomTable_c rooms; + /* 0x017C */ dFader_c mFader; + /* 0x01A0 */ MapRelated mapRelated; + /* 0x0394 */ u8 _0x394[0x39C - 0x394]; + /* 0x039C */ u32 loaded_entities[2047]; + /* 0x2398 */ u8 curr_room_id; + + /* 80575760 */ static dStage_c *sInstance; +}; + +#endif diff --git a/include/d/flag/sceneflag_manager.h b/include/d/flag/sceneflag_manager.h index d1c8d98f..2d6e6000 100644 --- a/include/d/flag/sceneflag_manager.h +++ b/include/d/flag/sceneflag_manager.h @@ -48,7 +48,7 @@ public: } u16 checkFlag(u16 roomId, u16 flag); bool checkSceneflagGlobal(u16 sceneIdx, u16 flag); - bool checkTempOrSceneflag(u16 flag); + u16 checkTempOrSceneflag(u16 flag); u16 checkUncommittedFlag(u16 roomId, u16 flag); void setZoneflag(u16 roomId, u16 flag); void setFlag(u16 roomId, u16 flag); diff --git a/include/m/m_fader.h b/include/m/m_fader.h index 68509fef..1d61c0ef 100644 --- a/include/m/m_fader.h +++ b/include/m/m_fader.h @@ -8,14 +8,18 @@ public: void draw(); bool setFader(mFaderBase_c *fader); - bool isStatus(mFaderBase_c::EStatus status) { + bool isStatus(mFaderBase_c::EStatus status) const { return mpFader->getStatus() == status; } - bool isNotStatus(mFaderBase_c::EStatus status) { + bool isNotStatus(mFaderBase_c::EStatus status) const { return isStatus(status) != true; } + mFaderBase_c::EStatus getStatus() const { + return mpFader->getStatus(); + } + void setStatus(mFaderBase_c::EStatus status) { mpFader->setStatus(status); } diff --git a/include/nw4r/g3d/res/g3d_resmat.h b/include/nw4r/g3d/res/g3d_resmat.h index dba3bf4e..883ab107 100644 --- a/include/nw4r/g3d/res/g3d_resmat.h +++ b/include/nw4r/g3d/res/g3d_resmat.h @@ -565,6 +565,10 @@ public: return ResTexPlttInfo(&pData[id]); } + const char *GetName() const { + return ofs_to_ptr(ref().name); + } + ResMatDLData *GetResMatDLData() { return ofs_to_ptr(ref().toResMatDLData); } diff --git a/include/toBeSorted/area_utils.h b/include/toBeSorted/area_utils.h index d73cb218..5a38ba07 100644 --- a/include/toBeSorted/area_utils.h +++ b/include/toBeSorted/area_utils.h @@ -1,16 +1,8 @@ #ifndef AREA_UTILS_H #define AREA_UTILS_H -#include "m/m_angle.h" #include "m/m_vec.h" - -struct AREA { - /* 0x00 */ mVec3_c mPos; - /* 0x0C */ mVec3_c mScale; - /* 0x18 */ mAng mAngleY; - /* 0x1A */ mAng mAngleLink; - /* 0x1C */ u8 field_0x1C; -}; +#include "d/d_bzs_types.h" /* 800a9b00 */ bool checkPosInArea(AREA **area, const mVec3_c &pos); /* 800a9bd0 */ AREA *getAreaForIndexInRoom(s32 areaIndex, s32 roomId); diff --git a/include/toBeSorted/event_manager.h b/include/toBeSorted/event_manager.h index bd98a1c9..00f38cf3 100644 --- a/include/toBeSorted/event_manager.h +++ b/include/toBeSorted/event_manager.h @@ -6,6 +6,8 @@ #include "sized_string.h" #include "toBeSorted/event.h" +#include + class dAcBase_c; class EventManager { diff --git a/include/toBeSorted/music_mgrs.h b/include/toBeSorted/music_mgrs.h index 3c1c9c87..620d125a 100644 --- a/include/toBeSorted/music_mgrs.h +++ b/include/toBeSorted/music_mgrs.h @@ -10,4 +10,7 @@ extern "C" void fn_8035E310(void *); extern "C" void *ENEMY_SOUND_MGR; extern "C" void fn_80362150(void *, u16); +extern "C" void *ENEMY_BGM_RELATED_MGR; +extern "C" void fn_80384570(void *, bool); + #endif diff --git a/include/toBeSorted/room_manager.h b/include/toBeSorted/room_manager.h deleted file mode 100644 index 3353e826..00000000 --- a/include/toBeSorted/room_manager.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef ROOM_MANAGER_H -#define ROOM_MANAGER_H - -#include "common.h" -#include "d/d_base.h" -#include "d/d_room.h" -#include "m/m_allocator.h" -#include "m/types_m.h" -#include "nw4r/g3d/res/g3d_resmdl.h" - -#define MAX_ROOM_NUMBER 64 - -class dRoomTable { - /* 801b4670 */ dRoomTable(dRoomTable *roomTable); - virtual ~dRoomTable(); - dRoom_c *rooms[MAX_ROOM_NUMBER - 1]; -}; - -class MapRelated { -public: - mAllocator_c allocator; - char unk[472]; - -public: - /* 801b4780 */ void init(MapRelated *); - /* 801b4900 */ void fn_801b4900(); -}; - -// OBJ NAME: STAGE -// Ghidra: RoomManager -// size: 0x239c -// vtable: 8052dff4 -class RoomManager : public dBase_c { -public: - /* 0068 */ char field_0x68[0x7C - 0x68]; - /* 007C */ dRoomTable rooms; - /* 017c */ char fader[0x1a0 - 0x174]; // size unk - /* 01a0 */ MapRelated mapRelated; - /* 039c */ u32 loaded_entities[2047]; - /* 2398 */ u8 curr_room_id; - -public: - /* 80575760 */ static RoomManager *m_Instance; - -public: - /* 801b3970 */ dRoom_c *GetRoomByIndex(int roomid); - /* 801b42b0 */ static dRoom_c *getRoom(int roomid); - /* 801b42d0 */ static void bindStageResToFile(nw4r::g3d::ResFile *); - /* 801b4320 */ static void bindSkyCmnToResFile(nw4r::g3d::ResFile *); - /* 801b4380 */ static bool getMA0AnmTexSrt(nw4r::g3d::ResAnmTexSrt *, char *); - /* 801b4420 */ static bool getMA0IndirectSrt(nw4r::g3d::ResAnmTexSrt *, const nw4r::g3d::ResMdl &mdl); - /* 801b44c0 */ static void changeLoadedEntities(RoomManager *mgr, u32 index_shift, bool set); - /* 801b4510 */ static u32 checkRoomFlag(RoomManager *mgr, u32 flag); - /* 801b4550 */ static bool checkEnemyDefeatFlag(RoomManager *mgr, u32 flag); - /* 801b45c0 */ static bool fn_801B45C0(RoomManager *mgr /* plus others */); - /* 801b6c60 */ bool hasVisitedRoomId(s32 roomid) const; - - void setRoom(int roomid, dRoom_c *room); -}; - -#endif diff --git a/include/toBeSorted/time_area_mgr.h b/include/toBeSorted/time_area_mgr.h index c4cde66d..507abd11 100644 --- a/include/toBeSorted/time_area_mgr.h +++ b/include/toBeSorted/time_area_mgr.h @@ -69,6 +69,10 @@ public: return field_0x78; } + void setField0x78(bool val) { + field_0x78 = val; + } + void setField0x7A(bool val) { field_0x7A = val; } diff --git a/src/REL/d/a/obj/d_a_obj_appear_bridge.cpp b/src/REL/d/a/obj/d_a_obj_appear_bridge.cpp index dc0e8296..1111db14 100644 --- a/src/REL/d/a/obj/d_a_obj_appear_bridge.cpp +++ b/src/REL/d/a/obj/d_a_obj_appear_bridge.cpp @@ -2,9 +2,9 @@ #include "d/a/d_a_player.h" #include "d/col/bg/d_bg_s.h" +#include "d/d_stage.h" #include "nw4r/types_nw4r.h" #include "toBeSorted/area_utils.h" -#include "toBeSorted/room_manager.h" SPECIAL_ACTOR_PROFILE(OBJ_APPEAR_BRIDGE, dAcOappearBridge_c, fProfile::OBJ_APPEAR_BRIDGE, 0x01FC, 0, 6); @@ -18,7 +18,7 @@ STATE_DEFINE(dAcOappearBridge_c, Disappear); bool dAcOappearBridge_c::createHeap() { mResFile = nw4r::g3d::ResFile(getOarcResFile("TongueStage")); - RoomManager::bindStageResToFile(&mResFile); + dStage_c::bindStageResToFile(&mResFile); nw4r::g3d::ResMdl mdl = mResFile.GetResMdl("TongueStage"); TRY_CREATE(mModel.create(mdl, &heap_allocator, 0x128)); nw4r::g3d::ResAnmTexSrt srt = mResFile.GetResAnmTexSrt("TongueStage"); diff --git a/src/REL/d/a/obj/d_a_obj_bamboo_island.cpp b/src/REL/d/a/obj/d_a_obj_bamboo_island.cpp index 1b727ce1..da0f38e9 100644 --- a/src/REL/d/a/obj/d_a_obj_bamboo_island.cpp +++ b/src/REL/d/a/obj/d_a_obj_bamboo_island.cpp @@ -1,9 +1,9 @@ #include "d/a/obj/d_a_obj_bamboo_island.h" #include "d/col/bg/d_bg_s.h" +#include "d/d_stage.h" #include "d/flag/storyflag_manager.h" #include "nw4r/g3d/res/g3d_resfile.h" -#include "toBeSorted/room_manager.h" const f32 dAcObambooIsland_c::unusedFloat1 = 100000.0f; const f32 dAcObambooIsland_c::unusedFloat2 = 0.0f; @@ -23,8 +23,8 @@ void dAcObambooIsland_c::rideCallback(dBgW *unknown, dAcObjBase_c *actor, dAcObj bool dAcObambooIsland_c::createHeap() { mBrres = nw4r::g3d::ResFile(getOarcResFile("IslBamb")); - RoomManager::bindStageResToFile(&mBrres); - RoomManager::bindSkyCmnToResFile(&mBrres); + dStage_c::bindStageResToFile(&mBrres); + dStage_c::bindSkyCmnToResFile(&mBrres); for (int i = 0; i < 2; i++) { nw4r::g3d::ResMdl mdl = mBrres.GetResMdl(sBambooIslandNames[i]); TRY_CREATE(mModels[i].create(mdl, &heap_allocator, 0x120)); diff --git a/src/REL/d/a/obj/d_a_obj_island_nusi.cpp b/src/REL/d/a/obj/d_a_obj_island_nusi.cpp index c4ee7b25..0177af16 100644 --- a/src/REL/d/a/obj/d_a_obj_island_nusi.cpp +++ b/src/REL/d/a/obj/d_a_obj_island_nusi.cpp @@ -2,6 +2,7 @@ #include "d/a/obj/d_a_obj_base.h" #include "d/col/bg/d_bg_s.h" +#include "d/d_stage.h" #include "d/flag/storyflag_manager.h" #include "f/f_base.h" #include "m/m_vec.h" @@ -10,7 +11,6 @@ #include "nw4r/g3d/res/g3d_resfile.h" #include "nw4r/g3d/res/g3d_resmdl.h" #include "nw4r/g3d/res/g3d_resnode.h" -#include "toBeSorted/room_manager.h" const f32 dAcOislandNusi_c::someFloat = 100000.0f; @@ -26,8 +26,8 @@ STATE_DEFINE(dAcOislandNusi_c, NusiFight); bool dAcOislandNusi_c::createHeap() { mRes = nw4r::g3d::ResFile(getOarcResFile("IslNusi")); - RoomManager::bindStageResToFile(&mRes); - RoomManager::bindSkyCmnToResFile(&mRes); + dStage_c::bindStageResToFile(&mRes); + dStage_c::bindSkyCmnToResFile(&mRes); for (int i = 0; i < 2; i++) { nw4r::g3d::ResMdl mdl = mRes.GetResMdl(sMdlNames[i]); TRY_CREATE(mMdls[i].create(mdl, &heap_allocator, 0x160)); diff --git a/src/REL/d/a/obj/d_a_obj_lava_F200.cpp b/src/REL/d/a/obj/d_a_obj_lava_F200.cpp index 068fd747..1a9311bc 100644 --- a/src/REL/d/a/obj/d_a_obj_lava_F200.cpp +++ b/src/REL/d/a/obj/d_a_obj_lava_F200.cpp @@ -1,13 +1,13 @@ #include "d/a/obj/d_a_obj_lava_F200.h" +#include "d/d_stage.h" #include "nw4r/g3d/res/g3d_resfile.h" -#include "toBeSorted/room_manager.h" SPECIAL_ACTOR_PROFILE(OBJ_LAVA_F200, dAcOlavaF200_c, fProfile::OBJ_LAVA_F200, 0x0214, 0, 0); bool dAcOlavaF200_c::createHeap() { mBrres = nw4r::g3d::ResFile(getOarcResFile("LavaF200")); - RoomManager::bindStageResToFile(&mBrres); + dStage_c::bindStageResToFile(&mBrres); nw4r::g3d::ResMdl mdl0 = mBrres.GetResMdl("LavaF200"); TRY_CREATE(mModels[0].create(mdl0, &heap_allocator, 0x32C)); diff --git a/src/REL/d/a/obj/d_a_obj_megami_island.cpp b/src/REL/d/a/obj/d_a_obj_megami_island.cpp index e8df429f..529e1f8a 100644 --- a/src/REL/d/a/obj/d_a_obj_megami_island.cpp +++ b/src/REL/d/a/obj/d_a_obj_megami_island.cpp @@ -3,12 +3,12 @@ #include "common.h" #include "d/a/obj/d_a_obj_base.h" #include "d/col/bg/d_bg_s.h" +#include "d/d_stage.h" #include "d/flag/storyflag_manager.h" #include "f/f_base.h" #include "m/m_vec.h" #include "nw4r/g3d/res/g3d_resanmtexsrt.h" #include "nw4r/g3d/res/g3d_resmdl.h" -#include "toBeSorted/room_manager.h" static const char *const sResFiles[] = { "F000Megami", @@ -46,8 +46,8 @@ bool dAcOmegamiIsland_c::createHeap() { mVariant = getVariant(); mRes = nw4r::g3d::ResFile(getOarcResFile(sResFiles[mVariant])); - RoomManager::bindStageResToFile(&mRes); - RoomManager::bindSkyCmnToResFile(&mRes); + dStage_c::bindStageResToFile(&mRes); + dStage_c::bindSkyCmnToResFile(&mRes); nw4r::g3d::ResMdl mdl1 = mRes.GetResMdl(sMdl1[mVariant]); TRY_CREATE(mMdls[0].create(mdl1, &heap_allocator, 0x120)); diff --git a/src/REL/d/a/obj/d_a_obj_pool_cock.cpp b/src/REL/d/a/obj/d_a_obj_pool_cock.cpp index 3c786404..f52cd41e 100644 --- a/src/REL/d/a/obj/d_a_obj_pool_cock.cpp +++ b/src/REL/d/a/obj/d_a_obj_pool_cock.cpp @@ -1,9 +1,9 @@ #include "d/a/obj/d_a_obj_pool_cock.h" #include "d/a/obj/d_a_obj_vortex.h" +#include "d/d_stage.h" #include "d/flag/sceneflag_manager.h" #include "s/s_Math.h" -#include "toBeSorted/room_manager.h" SPECIAL_ACTOR_PROFILE(OBJ_POOL_COCK, dAcOPoolCock_c, fProfile::OBJ_POOL_COCK, 0x024D, 0, 7); @@ -11,7 +11,7 @@ STATE_DEFINE(dAcOPoolCock_c, Wait); bool dAcOPoolCock_c::createHeap() { mBrres = nw4r::g3d::ResFile(getOarcResFile("WaterD101")); - RoomManager::bindStageResToFile(&mBrres); + dStage_c::bindStageResToFile(&mBrres); nw4r::g3d::ResMdl mdl = mBrres.GetResMdl("PoolCockD101"); for (int i = 0; i < 2; i++) { TRY_CREATE(mModels[i].create(mdl, &heap_allocator, 0x120)); diff --git a/src/REL/d/a/obj/d_a_obj_sun_light.cpp b/src/REL/d/a/obj/d_a_obj_sun_light.cpp index 6f141c95..7441e083 100644 --- a/src/REL/d/a/obj/d_a_obj_sun_light.cpp +++ b/src/REL/d/a/obj/d_a_obj_sun_light.cpp @@ -1,9 +1,9 @@ #include "d/a/obj/d_a_obj_sun_light.h" #include "d/d_sc_game.h" +#include "d/d_stage.h" #include "nw4r/g3d/res/g3d_resfile.h" #include "toBeSorted/arc_managers/current_stage_arc_manager.h" -#include "toBeSorted/room_manager.h" SPECIAL_ACTOR_PROFILE(OBJ_SUN_LIGHT, dAcOsunLight_c, fProfile::OBJ_SUN_LIGHT, 0x0219, 0, 3); @@ -11,8 +11,8 @@ STATE_DEFINE(dAcOsunLight_c, Wait); bool dAcOsunLight_c::createHeap() { mBrres = nw4r::g3d::ResFile(CurrentStageArcManager::sInstance->getData("g3d/stage.brres")); - RoomManager::bindStageResToFile(&mBrres); - RoomManager::bindSkyCmnToResFile(&mBrres); + dStage_c::bindStageResToFile(&mBrres); + dStage_c::bindSkyCmnToResFile(&mBrres); nw4r::g3d::ResMdl mdl = mBrres.GetResMdl("StageF000Light"); TRY_CREATE(mModel.create(mdl, &heap_allocator, 0x120)); nw4r::g3d::ResAnmTexSrt srt = mBrres.GetResAnmTexSrt("StageF000Light"); diff --git a/src/REL/d/a/obj/d_a_obj_tower_gearD101.cpp b/src/REL/d/a/obj/d_a_obj_tower_gearD101.cpp index 06411982..c5e741e2 100644 --- a/src/REL/d/a/obj/d_a_obj_tower_gearD101.cpp +++ b/src/REL/d/a/obj/d_a_obj_tower_gearD101.cpp @@ -4,12 +4,12 @@ #include "d/a/d_a_base.h" #include "d/a/obj/d_a_obj_tower_D101.h" #include "d/col/bg/d_bg_s_wtr_chk.h" +#include "d/d_stage.h" #include "f/f_base.h" #include "f/f_manager.h" #include "f/f_profile_name.h" #include "m/m_vec.h" #include "nw4r/g3d/res/g3d_resmdl.h" -#include "toBeSorted/room_manager.h" SPECIAL_ACTOR_PROFILE(OBJ_TOWER_GEAR_D101, dAcOTowerGearD101_c, fProfile::OBJ_TOWER_GEAR_D101, 0x17E, 0, 7); @@ -20,7 +20,7 @@ extern "C" void fn_80067340(mVec3_c &, nw4r::g3d::ResMdl *, const char *); bool dAcOTowerGearD101_c::createHeap() { const char *name = "TowerGearD101"; mRes = nw4r::g3d::ResFile(getOarcResFile(name)); - RoomManager::bindStageResToFile(&mRes); + dStage_c::bindStageResToFile(&mRes); nw4r::g3d::ResMdl mdl = mRes.GetResMdl(name); if (!mMdl.create(mdl, &heap_allocator, 0x120, 1, nullptr)) { return false; diff --git a/src/REL/d/a/obj/d_a_obj_tower_hand_D101.cpp b/src/REL/d/a/obj/d_a_obj_tower_hand_D101.cpp index ddd7498a..5a1a4190 100644 --- a/src/REL/d/a/obj/d_a_obj_tower_hand_D101.cpp +++ b/src/REL/d/a/obj/d_a_obj_tower_hand_D101.cpp @@ -5,6 +5,7 @@ #include "d/a/d_a_player.h" #include "d/col/bg/d_bg_s.h" #include "d/col/bg/d_bg_w.h" +#include "d/d_stage.h" #include "d/flag/sceneflag_manager.h" #include "f/f_base.h" #include "m/m3d/m_fanm.h" @@ -17,7 +18,6 @@ #include "s/s_Math.h" #include "toBeSorted/actor_event.h" #include "toBeSorted/event_manager.h" -#include "toBeSorted/room_manager.h" SPECIAL_ACTOR_PROFILE(OBJ_TOWER_HAND_D101, dAcOTowerHandD101_c, fProfile::OBJ_TOWER_HAND_D101, 0x180, 0, 6); @@ -108,7 +108,7 @@ bool dAcOTowerHandD101_c::createHeap() { if (!res.IsValid()) { return false; } - RoomManager::bindStageResToFile(&res); + dStage_c::bindStageResToFile(&res); if (direction == 1) { mMdl.getModel().setCullModeAll(GX_CULL_FRONT, false); } diff --git a/src/REL/d/a/obj/d_a_obj_uta_demo_pedest.cpp b/src/REL/d/a/obj/d_a_obj_uta_demo_pedest.cpp index 3545cb7f..3be5c7b3 100644 --- a/src/REL/d/a/obj/d_a_obj_uta_demo_pedest.cpp +++ b/src/REL/d/a/obj/d_a_obj_uta_demo_pedest.cpp @@ -1,12 +1,12 @@ #include "d/a/obj/d_a_obj_uta_demo_pedest.h" #include "d/a/obj/d_a_obj_base.h" +#include "d/d_stage.h" #include "f/f_base.h" #include "m/m_vec.h" #include "nw4r/g3d/res/g3d_resfile.h" #include "nw4r/g3d/res/g3d_resmdl.h" #include "toBeSorted/arc_managers/current_stage_arc_manager.h" -#include "toBeSorted/room_manager.h" static const char *const sMdlNames[] = { "StageF010rPedest", @@ -25,8 +25,8 @@ bool dAcOutaDemoPedest_c::createHeap() { } mRes = nw4r::g3d::ResFile(CurrentStageArcManager::sInstance->getData("g3d/stage.brres")); - RoomManager::bindStageResToFile(&mRes); - RoomManager::bindSkyCmnToResFile(&mRes); + dStage_c::bindStageResToFile(&mRes); + dStage_c::bindSkyCmnToResFile(&mRes); nw4r::g3d::ResMdl mdl = mRes.GetResMdl(sMdlNames[mModelType]); TRY_CREATE(mMdl.create(mdl, &heap_allocator, 0x120)); diff --git a/src/REL/d/a/obj/d_a_obj_utajima.cpp b/src/REL/d/a/obj/d_a_obj_utajima.cpp index 09df9cfa..f7bd2ccf 100644 --- a/src/REL/d/a/obj/d_a_obj_utajima.cpp +++ b/src/REL/d/a/obj/d_a_obj_utajima.cpp @@ -4,8 +4,8 @@ #include "d/a/obj/d_a_obj_base.h" #include "d/col/bg/d_bg_s.h" #include "d/col/c/c_m3d_g_aab.h" +#include "d/d_stage.h" #include "d/flag/storyflag_manager.h" -#include "toBeSorted/room_manager.h" static const char *const mMdlNames[] = { "IslSon", @@ -24,8 +24,8 @@ void dAcOutajima_c::rideCallback(dBgW *bg, dAcObjBase_c *o1, dAcObjBase_c *o2) { bool dAcOutajima_c::createHeap() { mRes = nw4r::g3d::ResFile(getOarcResFile("IslSon")); - RoomManager::bindStageResToFile(&mRes); - RoomManager::bindSkyCmnToResFile(&mRes); + dStage_c::bindStageResToFile(&mRes); + dStage_c::bindSkyCmnToResFile(&mRes); nw4r::g3d::ResMdl m(nullptr); diff --git a/src/REL/d/a/obj/d_a_obj_utajima_island.cpp b/src/REL/d/a/obj/d_a_obj_utajima_island.cpp index a85dfd6f..6ca9731a 100644 --- a/src/REL/d/a/obj/d_a_obj_utajima_island.cpp +++ b/src/REL/d/a/obj/d_a_obj_utajima_island.cpp @@ -4,13 +4,13 @@ #include "d/a/obj/d_a_obj_base.h" #include "d/a/obj/d_a_obj_utajima_main_mecha.h" #include "d/col/bg/d_bg_s.h" +#include "d/d_stage.h" #include "f/f_base.h" #include "f/f_manager.h" #include "f/f_profile_name.h" #include "m/m_angle.h" #include "nw4r/g3d/res/g3d_resmdl.h" #include "s/s_Math.h" -#include "toBeSorted/room_manager.h" SPECIAL_ACTOR_PROFILE(OBJ_UTAJIMA_ISLAND, dAcOutajimaIsland_c, fProfile::OBJ_UTAJIMA_ISLAND, 0x1D2, 0, 6); @@ -25,8 +25,8 @@ const f32 dAcOutajimaIsland_c::floats[] = { bool dAcOutajimaIsland_c::createHeap() { mRes = nw4r::g3d::ResFile(getOarcResFile("IslPuzIslet00")); - RoomManager::bindStageResToFile(&mRes); - RoomManager::bindSkyCmnToResFile(&mRes); + dStage_c::bindStageResToFile(&mRes); + dStage_c::bindSkyCmnToResFile(&mRes); nw4r::g3d::ResMdl m = mRes.GetResMdl("IslPuzIslet00"); TRY_CREATE(mMdl.create(m, &heap_allocator, 0x120)); diff --git a/src/REL/d/a/obj/d_a_obj_utajima_lv2.cpp b/src/REL/d/a/obj/d_a_obj_utajima_lv2.cpp index 2c68945a..b8624e2e 100644 --- a/src/REL/d/a/obj/d_a_obj_utajima_lv2.cpp +++ b/src/REL/d/a/obj/d_a_obj_utajima_lv2.cpp @@ -2,8 +2,8 @@ #include "common.h" #include "d/col/bg/d_bg_s.h" +#include "d/d_stage.h" #include "m/m_vec.h" -#include "toBeSorted/room_manager.h" SPECIAL_ACTOR_PROFILE(OBJ_UTAJIMA_LV2, dAcOutajimaLv2_c, fProfile::OBJ_UTAJIMA_LV2, 0x1D5, 0, 3); @@ -11,8 +11,8 @@ const f32 dAcOutajimaLv2_c::someFloat = 100000.0f; bool dAcOutajimaLv2_c::createHeap() { mRes = nw4r::g3d::ResFile(getOarcResFile("IslCave")); - RoomManager::bindStageResToFile(&mRes); - RoomManager::bindSkyCmnToResFile(&mRes); + dStage_c::bindStageResToFile(&mRes); + dStage_c::bindSkyCmnToResFile(&mRes); nw4r::g3d::ResMdl mdl = mRes.GetResMdl("IslCave"); TRY_CREATE(mMdl.create(mdl, &heap_allocator, 0x120)); diff --git a/src/REL/d/t/d_t_genki_dws_tgt.cpp b/src/REL/d/t/d_t_genki_dws_tgt.cpp index 778b38f4..1d3479be 100644 --- a/src/REL/d/t/d_t_genki_dws_tgt.cpp +++ b/src/REL/d/t/d_t_genki_dws_tgt.cpp @@ -2,9 +2,9 @@ #include "d/d_room.h" #include "d/d_sc_game.h" +#include "d/d_stage.h" #include "d/flag/sceneflag_manager.h" #include "d/flag/storyflag_manager.h" -#include "toBeSorted/room_manager.h" SPECIAL_ACTOR_PROFILE(TAG_GENKI_DOWSING_TARGET, dTgGenkiDwsTgt_c, fProfile::TAG_GENKI_DOWSING_TARGET, 0x02A5, 0, 0); @@ -50,9 +50,8 @@ int dTgGenkiDwsTgt_c::actorExecute() { if (flag) { deleteRequest(); } else { - RoomManager *mgr = RoomManager::m_Instance; - if (mgr != nullptr) { - dRoom_c *room = RoomManager::m_Instance->GetRoomByIndex(roomid); + if (dStage_c::GetInstance() != nullptr) { + dRoom_c *room = dStage_c::GetInstance()->getRoom(roomid); if (room != nullptr) { if (room->checkFlag(8)) { mDowsingTarget.doRegister(); diff --git a/src/d/a/d_a_base.cpp b/src/d/a/d_a_base.cpp index 68dc8364..c56e80e9 100644 --- a/src/d/a/d_a_base.cpp +++ b/src/d/a/d_a_base.cpp @@ -5,13 +5,13 @@ #include "d/d_heap.h" #include "d/d_room.h" #include "d/d_sc_game.h" +#include "d/d_stage.h" #include "d/flag/enemyflag_manager.h" #include "f/f_list_nd.h" #include "m/m_vec.h" #include "toBeSorted/event.h" #include "toBeSorted/event_manager.h" #include "toBeSorted/file_manager.h" -#include "toBeSorted/room_manager.h" #include "toBeSorted/special_item_drop_mgr.h" // .sdata @@ -126,13 +126,13 @@ int dAcBase_c::initAllocator(int size, char *name, EGG::Heap *heap, int align) { } bool dAcBase_c::addActorToRoom(s32 roomId) { - dBase_c *room = RoomManager::getRoom(roomId); + dBase_c *room = dStage_c::getParentForRoom(roomId); if (room == nullptr) { return false; } if (setConnectChild(room)) { if (roomId == -1) { - this->roomid = RoomManager::m_Instance->curr_room_id; + this->roomid = dStage_c::GetInstance()->getCurrRoomId(); } else { this->roomid = roomId; } @@ -427,14 +427,14 @@ void dAcBase_c::updateRoomId(f32 yOffset) { if (checkCollision(&actorPos)) { roomid = collisionCheckGetRoom(); } else { - roomid = RoomManager::m_Instance->curr_room_id; + roomid = dStage_c::GetInstance()->getCurrRoomId(); } } } // 8002d540 bool dAcBase_c::isRoomFlags_0x6_Set() { - dRoom_c *room = RoomManager::m_Instance->GetRoomByIndex(roomid); + dRoom_c *room = dStage_c::GetInstance()->getRoom(roomid); return (room->checkFlag(0x4 | 0x2)); } @@ -478,12 +478,12 @@ void dAcBase_c::setEnemyDefeatFlag() { // 8002d940 void dAcBase_c::changeLoadedEntitiesWithSet() { - RoomManager::m_Instance->changeLoadedEntities(RoomManager::m_Instance, obj_id, true); + dStage_c::GetInstance()->changeLoadedEntities(obj_id, true); } // 8002d960 void dAcBase_c::changeLoadedEntitiesNoSet() { - RoomManager::m_Instance->changeLoadedEntities(RoomManager::m_Instance, obj_id, false); + dStage_c::GetInstance()->changeLoadedEntities(obj_id, false); } // spawns GroupType2 (ACTOR) @@ -513,7 +513,7 @@ dAcBase_c *dAcBase_c::createActor( setTempCreateParams( actorPosition, actorRotation, actorScale, actorRoomid, newParams2, (dAcBase_c *)actorRef, 0, -1, 0xFF, nullptr ); - dBase_c *room = RoomManager::getRoom(roomid); + dBase_c *room = dStage_c::getParentForRoom(roomid); return (dAcBase_c *)dBase_c::createBase(actorId, room, actorParams1, ACTOR); } @@ -544,7 +544,7 @@ dAcBase_c *dAcBase_c::createActorStage( setTempCreateParams( actorPosition, actorRotation, actorScale, actorRoomid, newParams2, (dAcBase_c *)actorRef, 0, -1, 0xFF, nullptr ); - dBase_c *room = RoomManager::getRoom(roomid); + dBase_c *room = dStage_c::getParentForRoom(roomid); return (dAcBase_c *)dBase_c::createBase(actorId, room, actorParams1, STAGE); } diff --git a/src/d/a/obj/d_a_obj_tbox.cpp b/src/d/a/obj/d_a_obj_tbox.cpp index 1689a31f..d391c4af 100644 --- a/src/d/a/obj/d_a_obj_tbox.cpp +++ b/src/d/a/obj/d_a_obj_tbox.cpp @@ -12,6 +12,7 @@ #include "d/col/cc/d_cc_d.h" #include "d/col/cc/d_cc_s.h" #include "d/d_room.h" +#include "d/d_stage.h" #include "d/flag/sceneflag_manager.h" #include "d/flag/storyflag_manager.h" #include "d/flag/tboxflag_manager.h" @@ -32,7 +33,6 @@ #include "toBeSorted/counters/goddess_chest_counter.h" #include "toBeSorted/dowsing_target.h" #include "toBeSorted/event_manager.h" -#include "toBeSorted/room_manager.h" SPECIAL_ACTOR_PROFILE(TBOX, dAcTbox_c, fProfile::TBOX, 0x018D, 0, 6); @@ -1192,7 +1192,7 @@ int dAcTbox_c::actorExecute() { (this->*mRegisterDowsingTarget)(); } - dRoom_c *r = RoomManager::m_Instance->GetRoomByIndex(roomid); + dRoom_c *r = dStage_c::GetInstance()->getRoom(roomid); bool hasFlags = r->checkFlag(0x1E); if (hasFlags) { setObjectProperty(0x200); @@ -1328,7 +1328,7 @@ int dAcTbox_c::actorExecuteInEvent() { (this->*mRegisterDowsingTarget)(); } - dRoom_c *r = RoomManager::m_Instance->GetRoomByIndex(roomid); + dRoom_c *r = dStage_c::GetInstance()->getRoom(roomid); bool hasFlags = r->checkFlag(0x1E); if (hasFlags) { setObjectProperty(0x200); diff --git a/src/d/d_room.cpp b/src/d/d_room.cpp index f2334854..8d486c1a 100644 --- a/src/d/d_room.cpp +++ b/src/d/d_room.cpp @@ -8,6 +8,7 @@ #include "d/col/bg/d_bg_w_base.h" #include "d/col/bg/d_bg_w_kcol.h" #include "d/d_sc_game.h" +#include "d/d_stage.h" #include "d/flag/sceneflag_manager.h" #include "d/flag/storyflag_manager.h" #include "d/t/d_t_mass_obj.h" @@ -35,7 +36,6 @@ #include "nw4r/math/math_types.h" #include "sized_string.h" #include "toBeSorted/arc_managers/current_stage_arc_manager.h" -#include "toBeSorted/room_manager.h" #include "toBeSorted/stage_manager.h" #include "toBeSorted/time_area_mgr.h" #include "toBeSorted/unk_with_water.h" @@ -66,8 +66,8 @@ int dRoom_c::create() { bool anyError = false; mRoomRes = nw4r::g3d::ResFile(CurrentStageArcManager::sInstance->loadFromRoomArc(roomid, "g3d/room.brres")); - RoomManager::bindStageResToFile(&mRoomRes); - RoomManager::bindSkyCmnToResFile(&mRoomRes); + dStage_c::bindStageResToFile(&mRoomRes); + dStage_c::bindSkyCmnToResFile(&mRoomRes); for (s32 i = 0; i < 8; i++) { model_c *mdl = &mModels[i]; @@ -99,7 +99,7 @@ int dRoom_c::create() { return FAILED; } - RoomManager::m_Instance->setRoom(roomid, this); + dStage_c::GetInstance()->setRoom(roomid, this); BZS = CurrentStageArcManager::sInstance->loadFromRoomArc(roomid, "dat/room.bzs"); parseRoomBzs(roomid, BZS); mDidAlreadyInit = (params >> 6) & 1; @@ -123,7 +123,7 @@ int dRoom_c::doDelete() { stageMr->destroyUnkWithWater(val, &mWaterThing); } - RoomManager::m_Instance->setRoom(roomid, nullptr); + dStage_c::GetInstance()->setRoom(roomid, nullptr); return SUCCEEDED; } @@ -265,7 +265,7 @@ void dRoom_c::drawOnMapIfVisible(mMtx_c *mtx, int param) { // Visited rooms are shown filled out bool drawFully = true; if (dStageMgr_c::GetInstance()->isAreaTypeDungeonOrBoss()) { - drawFully = RoomManager::m_Instance->hasVisitedRoomId(roomid); + drawFully = dStage_c::GetInstance()->hasVisitedRoom(roomid); if (!drawFully && !dAcItem_c::checkFlag(/* DUNGEON_MAP_FI */ 0x32)) { return; } @@ -505,7 +505,7 @@ bool dRoom_c::model_c::create(nw4r::g3d::ResFile resFile, mAllocator_c &alloc, s nw4r::g3d::ResAnmTexSrt anmSrt = resFile.GetResAnmTexSrt(mdlName); if (!anmSrt.IsValid()) { - RoomManager::getMA0IndirectSrt(&anmSrt, mdl); + dStage_c::getMA0IndirectSrt(&anmSrt, mdl); } if (anmSrt.IsValid()) { mpAnmSrt = new m3d::anmTexSrt_c(); diff --git a/src/d/d_sc_game.cpp b/src/d/d_sc_game.cpp index d85b57a6..ce809c76 100644 --- a/src/d/d_sc_game.cpp +++ b/src/d/d_sc_game.cpp @@ -14,7 +14,6 @@ #include "toBeSorted/file_manager.h" #include "toBeSorted/minigame_mgr.h" #include "toBeSorted/music_mgrs.h" -#include "toBeSorted/room_manager.h" #include "toBeSorted/some_gxf_thing.h" #include "toBeSorted/stage_manager.h" diff --git a/src/d/d_stage.cpp b/src/d/d_stage.cpp new file mode 100644 index 00000000..91759aba --- /dev/null +++ b/src/d/d_stage.cpp @@ -0,0 +1,392 @@ +#include "d/d_stage.h" + +#include "common.h" +#include "d/col/bg/d_bg_s.h" +#include "d/d_base.h" +#include "d/d_room.h" +#include "d/d_sc_game.h" +#include "d/d_sc_title.h" +#include "d/flag/dungeonflag_manager.h" +#include "d/flag/sceneflag_manager.h" +#include "d/flag/storyflag_manager.h" +#include "f/f_base.h" +#include "f/f_profile.h" +#include "f/f_profile_name.h" +#include "m/m_fader_base.h" +#include "m/m_vec.h" +#include "nw4r/g3d/res/g3d_resfile.h" +#include "nw4r/g3d/res/g3d_resmat.h" +#include "nw4r/g3d/res/g3d_resmdl.h" +#include "nw4r/math/math_types.h" +#include "s/s_FPhase.h" +#include "toBeSorted/arc_managers/current_stage_arc_manager.h" +#include "toBeSorted/arc_managers/layout_arc_manager.h" +#include "toBeSorted/arc_managers/oarc_manager.h" +#include "toBeSorted/event_manager.h" +#include "toBeSorted/music_mgrs.h" +#include "toBeSorted/time_area_mgr.h" + +#include + +SPECIAL_BASE_PROFILE(STAGE, dStage_c, fProfile::STAGE, 6, 0x4E0); + +sFPhase::phaseCallback dStage_c::sCallbacks[] = { + &dStage_c::createRooms, + &dStage_c::waitForRooms, + nullptr, +}; + +extern "C" void fn_8001BE60(f32, f32); +extern "C" void *SCRAPPER_PTR; + +dStage_c::dStage_c() : mPhase(this, sCallbacks) { + memset(loaded_entities, 0, sizeof(loaded_entities)); + sInstance = this; + dScGame_c::resetUpdateFrameCount(); + SCRAPPER_PTR = nullptr; + fn_8001BE60(2000.0f, 1700.0f); +} + +extern "C" void *SCRAPPER_PICKUP_TARGET; +extern "C" void ScrapperPickupMgr__update(void *); +extern "C" void ScrapperPickupMgr__dtor(); +extern "C" void fn_80028A80(); +extern "C" void fn_80028EC0(); +extern "C" void fn_80066D30(s32); + +int dStage_c::create() { + if (mPhase.step() != sFPhaseBase::PHASE_ALL_DONE) { + return NOT_READY; + } + + // dStageMgr_c *stageMgr = dStageMgr_c::GetInstance(); + // for (int i = 0; i < dSta) + + if (mapRelated.field_0x1EB == 0) { + mVec3_c min, max; + for (s32 i = 0; i < MAX_ROOM_NUMBER - 1; i++) { + dRoom_c *room = getRoom(i); + if (room != nullptr) { + mVec3_c tmin, tmax; + room->getBounds(&tmin, &tmax); + if (i == 0) { + min = tmin; + max = tmax; + } else { + nw4r::math::VEC3Minimize(min, min, tmin); + nw4r::math::VEC3Maximize(max, max, tmax); + } + } + } + max.y += 6000.0f; + mVec3_c size = max - min; + mVec3_c center = mVec3_c(min.x + size.x * 0.5f, min.y, min.z + size.z * 0.5f); + mapRelated.fn_801B4B80(0, center, size); + mVec3_c v = mVec3_c(10000.0f, 10000.0f, 100000.0f); + mapRelated.fn_801B4C70(v); + } + mapRelated.fn_801B50C0(0); + fn_80028A80(); + + return SUCCEEDED; +} + +int dStage_c::doDelete() { + fn_80028EC0(); + fn_80066D30(-1); + ScrapperPickupMgr__dtor(); + return SUCCEEDED; +} + +int dStage_c::execute() { + mFader.calc(); + ScrapperPickupMgr__update(SCRAPPER_PICKUP_TARGET); + return SUCCEEDED; +} + +extern "C" void resetViewClipVals(); + +int dStage_c::draw() { + resetViewClipVals(); + return SUCCEEDED; +} + +void dStage_c::deleteReady() {} + +sFPhaseBase::sFPhaseState dStage_c::createRooms() { + // TODO + // if (dScGame_c::sCo) + mFader.create(); + mFader.setTypes(1, 1); + mFader.setFadeInFrame(1); + mFader.fadeIn(); + mFader.calc(); + mFader.setFrames(15, 15); + mFader.initForLyt(); + // TODO + + if (dScTitle_c::sInstance != nullptr) { + dBase_c::createBase(fProfile::TITLE, this, 0, OTHER); + } + + dTimeAreaMgr_c::sInstance->setField0x78(false); + + return sFPhaseBase::PHASE_NEXT; +} + +sFPhaseBase::sFPhaseState dStage_c::waitForRooms() { + if (checkChildProcessCreateState()) { + return sFPhaseBase::PHASE_RETRY; + } + return sFPhaseBase::PHASE_NEXT; +} + +void dStage_c::setRoom(int roomid, dRoom_c *room) { + rooms.setRoom(roomid, room); +} + +dRoom_c *dStage_c::getRoom(s32 idx) { + return rooms.getRoom(idx); +} + +bool dStage_c::fadeIn(s32 fadeType, u16 frames) { + if (mFader.getStatus() != mFaderBase_c::FADED_OUT) { + return false; + } + mFader.setFadeInType(fadeType); + mFader.setFadeInFrame(frames); + mFader.fadeIn(); + fn_80384570(ENEMY_BGM_RELATED_MGR, false); + return true; +} + +bool dStage_c::fadeOut(s32 fadeType, u16 frames) { + if (mFader.getStatus() != mFaderBase_c::FADED_IN) { + return false; + } + mFader.setFadeOutType(fadeType); + mFader.setFadeOutFrame(frames); + mFader.fadeOut(); + fn_80384570(ENEMY_BGM_RELATED_MGR, true); + return true; +} + +void dStage_c::forceFadeOut() { + mFader.setStatus(mFaderBase_c::FADED_OUT); + fn_80384570(ENEMY_BGM_RELATED_MGR, true); +} + +void dStage_c::forceFadeIn() { + mFader.setStatus(mFaderBase_c::FADED_IN); + fn_80384570(ENEMY_BGM_RELATED_MGR, false); +} + +void dStage_c::drawMap(mMtx_c *mtx, int param) { + dBgS::GetInstance()->UpdateScrollTex(); + for (s32 i = 0; i < MAX_ROOM_NUMBER - 1; i++) { + dRoom_c *room = getRoom(i); + if (room != nullptr) { + room->drawOnMapIfVisible(mtx, param); + } + } + dBgS::GetInstance()->DrawSkyKeepMap(mtx, param); +} + +static void getFlagPositionForRoomVisit(int roomid, u16 *o_flag, u16 *o_shift) { + *o_flag = (roomid / 16) + 8; + *o_shift = 1 << (roomid % 16); +} + +bool dStage_c::hasVisitedRoom(int roomid) const { + u16 flag, shift; + getFlagPositionForRoomVisit(roomid, &flag, &shift); + DungeonflagManager *mg = DungeonflagManager::sInstance; + return (mg->getCounterOrFlag(flag, 8) & shift) != 0; +} + +void dStage_c::setRoomVisited(int roomid) { + // TODO this is probably an inline but inline bools cause extra instructions + if (EventManager::getCurrentEventName() != nullptr && + std::strncmp(EventManager::getCurrentEventName(), "Save", 0x20) == 0) { + return; + } + + if (dScGame_c::sInstance == nullptr || dScGame_c::sInstance->profile_name == fProfile::GAME) { + u16 flag, shift; + getFlagPositionForRoomVisit(roomid, &flag, &shift); + DungeonflagManager *mg = DungeonflagManager::sInstance; + u16 newVal = shift | mg->getCounterOrFlag(flag, 8); + mg->setToValue(flag, newVal); + } +} + +dRoom_c *dStage_c::createRoom(int roomid, bool flag0x40) { + return static_cast( + dBase_c::createBase(fProfile::ROOM, this, (roomid & 0x3F) | (flag0x40 ? 0x40 : 0), OTHER) + ); +} + +void dStage_c::createLytSeekerStone() { + dBase_c::createBase(fProfile::LYT_CONTROL_GAME, this, 0, OTHER); + if (LayoutArcManager::sInstance->hasEntry("SeekerStone")) { + dBase_c::createBase(fProfile::LYT_SEEKER_STONE, this, 0, OTHER); + } +} + +dBase_c *dStage_c::getParentForRoom(s32 idx) { + if (idx == -1) { + return dStage_c::GetInstance(); + } + return dStage_c::GetInstance()->getRoom(idx); +} + +void dStage_c::bindStageResToFile(nw4r::g3d::ResFile *file) { + nw4r::g3d::ResFile f = nw4r::g3d::ResFile(CurrentStageArcManager::sInstance->getData("g3d/stage.brres")); + if (f.IsValid()) { + file->Bind(f); + } +} + +void dStage_c::bindSkyCmnToResFile(nw4r::g3d::ResFile *file) { + nw4r::g3d::ResFile f = nw4r::g3d::ResFile(OarcManager::sInstance->getSubEntryData("SkyCmn", "g3d/model.brres")); + if (f.IsValid()) { + file->Bind(f); + } +} + +static const char *sMatsToTry[] = { + "MA01", + "MA02", + "MA04", +}; + +bool dStage_c::getMA0AnmTexSrt(nw4r::g3d::ResAnmTexSrt *o_srt, const char *matName) { + const char **candidate = sMatsToTry; + for (int i = 0; i < ARRAY_LENGTH(sMatsToTry); i++, candidate++) { + if (!std::strncmp(matName, *candidate, std::strlen(*candidate))) { + nw4r::g3d::ResFile mdl = nw4r::g3d::ResFile(OarcManager::sInstance->getMdlFromArc2("Common")); + *o_srt = mdl.GetResAnmTexSrt(*candidate); + return true; + } + } + return false; +} + +bool dStage_c::getMA0IndirectSrt(nw4r::g3d::ResAnmTexSrt *o_srt, const nw4r::g3d::ResMdl &mdl) { + for (u32 i = 0; i < mdl.GetResMatNumEntries(); i++) { + nw4r::g3d::ResMat mat = mdl.GetResMat(i); + const char *name = mat.GetName(); + if (getMA0AnmTexSrt(o_srt, name)) { + return true; + } + } + return false; +} + +dRoomTable_c::dRoomTable_c() { + // Okay + mRooms[0] = nullptr; + mRooms[1] = nullptr; + mRooms[2] = nullptr; + mRooms[3] = nullptr; + mRooms[4] = nullptr; + mRooms[5] = nullptr; + mRooms[6] = nullptr; + mRooms[7] = nullptr; + mRooms[8] = nullptr; + mRooms[9] = nullptr; + mRooms[10] = nullptr; + mRooms[11] = nullptr; + mRooms[12] = nullptr; + mRooms[13] = nullptr; + mRooms[14] = nullptr; + mRooms[15] = nullptr; + mRooms[16] = nullptr; + mRooms[17] = nullptr; + mRooms[18] = nullptr; + mRooms[19] = nullptr; + mRooms[20] = nullptr; + mRooms[21] = nullptr; + mRooms[22] = nullptr; + mRooms[23] = nullptr; + mRooms[24] = nullptr; + mRooms[25] = nullptr; + mRooms[26] = nullptr; + mRooms[27] = nullptr; + mRooms[28] = nullptr; + mRooms[29] = nullptr; + mRooms[30] = nullptr; + mRooms[31] = nullptr; + mRooms[32] = nullptr; + mRooms[33] = nullptr; + mRooms[34] = nullptr; + mRooms[35] = nullptr; + mRooms[36] = nullptr; + mRooms[37] = nullptr; + mRooms[38] = nullptr; + mRooms[39] = nullptr; + mRooms[40] = nullptr; + mRooms[41] = nullptr; + mRooms[42] = nullptr; + mRooms[43] = nullptr; + mRooms[44] = nullptr; + mRooms[45] = nullptr; + mRooms[46] = nullptr; + mRooms[47] = nullptr; + mRooms[48] = nullptr; + mRooms[49] = nullptr; + mRooms[50] = nullptr; + mRooms[51] = nullptr; + mRooms[52] = nullptr; + mRooms[53] = nullptr; + mRooms[54] = nullptr; + mRooms[55] = nullptr; + mRooms[56] = nullptr; + mRooms[57] = nullptr; + mRooms[58] = nullptr; + mRooms[59] = nullptr; + mRooms[60] = nullptr; + mRooms[61] = nullptr; + mRooms[62] = nullptr; +} + +MapRelated::MapRelated() + : field_0x0FC(0.0f, 0.0f, 0.0f), + field_0x108(0.0f), + field_0x10C(0.0f), + field_0x110(0.0f), + field_0x114(0.0f), + field_0x118(0.0f), + field_0x11C(0.0f), + field_0x120(0.0f), + field_0x124(0.0f), + field_0x128(0.0f), + field_0x12C(0.0f), + field_0x1E0(0), + field_0x1E6(0), + field_0x1E8(0), + field_0x1E9(4), + field_0x1EA(-3), + field_0x1EB(0), + field_0x1EC(0), + field_0x1ED(0), + field_0x1EE(0), + field_0x1F0(0) { + mPostEffect.setField0x30(0.15f); + bool showPastVariant = true; + bool showDesertPast = dScGame_c::isCurrentStage("S300") || + ((dScGame_c::isCurrentStage("F300") || dScGame_c::isCurrentStage("F300_4")) && + SceneflagManager::sInstance->checkTempOrSceneflag(3)); + if (!showDesertPast) { + bool hideSeaPast = !(dScGame_c::isCurrentStage("F301_1") && StoryflagManager::sInstance->getCounterOrFlag(519)); + if (hideSeaPast) { + showPastVariant = false; + } + } + field_0x1EF = showPastVariant; +} + +extern "C" void fn_801B4AE0(); +MapRelated::~MapRelated() { + fn_801B4AE0(); +} diff --git a/src/d/flag/sceneflag_manager.inc b/src/d/flag/sceneflag_manager.inc index 5101567e..2fb9d2b7 100644 --- a/src/d/flag/sceneflag_manager.inc +++ b/src/d/flag/sceneflag_manager.inc @@ -146,7 +146,7 @@ bool SceneflagManager::checkSceneflagGlobal(u16 sceneIdx, u16 flag) { u16 *pData = FileManager::sInstance->getSceneFlagsConst(); return mFlagHelper.checkFlag(getSceneflagSlotGlobal(sceneIdx, flag), flag % 16, pData, 0x800); } -bool SceneflagManager::checkTempOrSceneflag(u16 flag) { +u16 SceneflagManager::checkTempOrSceneflag(u16 flag) { if (flag >= 0x80) { u16 tempflag = flag - 0x80; const u16 *pData = FileManager::sInstance->getTempFlagsConst(); diff --git a/src/toBeSorted/room_manager.cpp b/src/toBeSorted/room_manager.cpp deleted file mode 100644 index fe904bf2..00000000 --- a/src/toBeSorted/room_manager.cpp +++ /dev/null @@ -1,3 +0,0 @@ -#include "toBeSorted/room_manager.h" - -RoomManager* RoomManager::m_Instance; \ No newline at end of file