From 84e4dd169e14fc506b664b89ecd069090274eb43 Mon Sep 17 00:00:00 2001 From: CLF78 <29682335+CLF78@users.noreply.github.com> Date: Sun, 29 Mar 2026 00:24:09 +0100 Subject: [PATCH 1/4] Decompile daWmCannon_c (95% matching) --- include/game/bases/d_a_wm_cannon.hpp | 25 ++++++ include/game/bases/d_a_wm_map.hpp | 3 + include/game/bases/d_cs_seq_manager.hpp | 4 + include/game/bases/d_wm_actor.hpp | 2 +- include/game/bases/d_wm_obj_actor.hpp | 3 +- include/game/framework/f_base.hpp | 2 +- slices/d_basesNP.json | 11 +++ source/d_basesNP/bases/d_a_obj_fruit_tree.cpp | 2 +- source/d_basesNP/bases/d_a_remo_door.cpp | 2 +- source/d_basesNP/bases/d_a_wm_cannon.cpp | 80 +++++++++++++++++++ source/d_basesNP/bases/d_awa.cpp | 2 +- source/dol/bases/d_res_info.cpp | 2 +- source/dol/bases/d_wm_demo_actor.cpp | 2 +- source/dol/framework/f_base.cpp | 4 +- syms.txt | 3 +- 15 files changed, 135 insertions(+), 12 deletions(-) create mode 100644 include/game/bases/d_a_wm_cannon.hpp create mode 100644 source/d_basesNP/bases/d_a_wm_cannon.cpp diff --git a/include/game/bases/d_a_wm_cannon.hpp b/include/game/bases/d_a_wm_cannon.hpp new file mode 100644 index 00000000..0abaa080 --- /dev/null +++ b/include/game/bases/d_a_wm_cannon.hpp @@ -0,0 +1,25 @@ +#pragma once +#include +#include +#include + +class daWmCannon_c : public dWmObjActor_c { +public: + daWmCannon_c(); + ~daWmCannon_c(); + + virtual int create(); + virtual int execute(); + virtual int draw(); + virtual int doDelete(); + + virtual void setCutEndSpecific(int cutsceneId, bool param2); + + void setClipSphere(); + void loadModel(); + void calcModel(); + + dHeapAllocator_c mAllocator; + m3d::smdl_c mModel; + u32 _200; +}; diff --git a/include/game/bases/d_a_wm_map.hpp b/include/game/bases/d_a_wm_map.hpp index a96dbfdf..c801db45 100644 --- a/include/game/bases/d_a_wm_map.hpp +++ b/include/game/bases/d_a_wm_map.hpp @@ -1,5 +1,7 @@ #pragma once +#include +#include #include #include #include @@ -7,6 +9,7 @@ class daWmMap_c : public dWmDemoActor_c { public: int GetNodeCount(int); ///< @unofficial + void GetNodePos(long nodeIdx, mVec3_c &pos); dHeapAllocator_c mAllocator; dWmMapModel_c mModels[4]; diff --git a/include/game/bases/d_cs_seq_manager.hpp b/include/game/bases/d_cs_seq_manager.hpp index a29b0049..7b079879 100644 --- a/include/game/bases/d_cs_seq_manager.hpp +++ b/include/game/bases/d_cs_seq_manager.hpp @@ -4,6 +4,10 @@ class dCsSeqMng_c { public: + enum CUTSCENE_e { + CUTSCENE_NONE = -1 + }; + int GetCutName(); void FUN_801017c0(int, dWmEnemy_c *, int, int); ///< @unofficial diff --git a/include/game/bases/d_wm_actor.hpp b/include/game/bases/d_wm_actor.hpp index a3707003..864ef38c 100644 --- a/include/game/bases/d_wm_actor.hpp +++ b/include/game/bases/d_wm_actor.hpp @@ -41,6 +41,6 @@ class dWmActor_c : public dBaseActor_c { static void setSoftLight_Enemy(m3d::bmdl_c &mdl); ///< @copydoc dGameCom::SetSoftLight_Enemy static void setSoftLight_Boss(m3d::bmdl_c &mdl); ///< @copydoc dGameCom::SetSoftLight_Boss -private: +protected: mSphere_c mClipSphere; ///< A sphere representing the actor's visible area. }; diff --git a/include/game/bases/d_wm_obj_actor.hpp b/include/game/bases/d_wm_obj_actor.hpp index ec4dcebc..04883ac1 100644 --- a/include/game/bases/d_wm_obj_actor.hpp +++ b/include/game/bases/d_wm_obj_actor.hpp @@ -37,8 +37,7 @@ class dWmObjActor_c : public dWmDemoActor_c { bool IsCourseUraClearSimple(); ///< @copybrief dWmLib::IsCourseUraClearSimple bool IsCourseUraOtasukeClearSimple(); ///< @copybrief dWmLib::IsCourseUraOtasukeClearSimple - u8 mUnk174[0x10]; ///< @unused - int mResNodeIdx; ///< The index of the model's root resource node. Always set to @p -1. + int mResNodeIdx; ///< The index of the model's root resource node. ACTOR_PARAM_CONFIG(CourseNo, 0, 8); ///< The level number associated to the object. ACTOR_PARAM_CONFIG(PathNode, 8, 8); ///< The path node associated to the object. diff --git a/include/game/framework/f_base.hpp b/include/game/framework/f_base.hpp index e35614a8..255958ae 100644 --- a/include/game/framework/f_base.hpp +++ b/include/game/framework/f_base.hpp @@ -100,7 +100,7 @@ class fBase_c { fBase_c(); ///< Constructs a new base. /// @brief @p new operator override for all bases. - /// @details Bases are allocated in mHeap::g_gameHeaps[0] in a top-down direction, and are + /// @details Bases are allocated in mHeap::g_gameHeaps[mHeap::GAME_HEAP_DEFAULT] in a top-down direction, and are /// zero-initialized. static void *operator new(size_t); static void operator delete(void *); ///< @p delete operator override for all bases. diff --git a/slices/d_basesNP.json b/slices/d_basesNP.json index f3f938f0..f4ccf05a 100644 --- a/slices/d_basesNP.json +++ b/slices/d_basesNP.json @@ -69,6 +69,17 @@ ".bss": "0xdd88-0xde48" } }, + { + "source": "d_basesNP/bases/d_a_wm_cannon.cpp", + "nonMatching": true, + "memoryRanges": { + ".text": "0x15e7e0-0x15ecc0", + ".ctors": "0x3c4-0x3c8", + ".rodata": "0x86d0-0x86e8", + ".data": "0x43ef8-0x43fd0", + ".bss": "0xfd38-0xfd48" + } + }, { "source": "d_basesNP/bases/d_s_autoselect.cpp", "memoryRanges": { diff --git a/source/d_basesNP/bases/d_a_obj_fruit_tree.cpp b/source/d_basesNP/bases/d_a_obj_fruit_tree.cpp index 26fa2c2c..bead9bcf 100644 --- a/source/d_basesNP/bases/d_a_obj_fruit_tree.cpp +++ b/source/d_basesNP/bases/d_a_obj_fruit_tree.cpp @@ -11,7 +11,7 @@ int daObjFruitTree_c::create() { nw4r::g3d::ResMdl model; nw4r::g3d::ResAnmChr anim; nw4r::g3d::ResFile res; - mHeapAllocator.createFrmHeap(-1, mHeap::g_gameHeaps[0], nullptr, 0x20); + mHeapAllocator.createFrmHeap(-1, mHeap::g_gameHeaps[mHeap::GAME_HEAP_DEFAULT], nullptr, 0x20); int style = ACTOR_PARAM_LOCAL(param, Style); if (style == STYLE_REGULAR) { diff --git a/source/d_basesNP/bases/d_a_remo_door.cpp b/source/d_basesNP/bases/d_a_remo_door.cpp index 01159baa..d5269eee 100644 --- a/source/d_basesNP/bases/d_a_remo_door.cpp +++ b/source/d_basesNP/bases/d_a_remo_door.cpp @@ -12,7 +12,7 @@ STATE_DEFINE(daRemoDoor_c, Open); STATE_DEFINE(daRemoDoor_c, Close); void daRemoDoor_c::init() { - mAllocator.createFrmHeap(-1, mHeap::g_gameHeaps[0], nullptr, 0x20); + mAllocator.createFrmHeap(-1, mHeap::g_gameHeaps[mHeap::GAME_HEAP_DEFAULT], nullptr, 0x20); mRes = dResMng_c::m_instance->getRes("obj_door", "g3d/obj_door.brres"); nw4r::g3d::ResMdl mdl = mRes.GetResMdl("obj_doorA"); mDoorModel.create(mdl, &mAllocator, nw4r::g3d::ScnMdl::BUFFER_RESMATMISC, 1, nullptr); diff --git a/source/d_basesNP/bases/d_a_wm_cannon.cpp b/source/d_basesNP/bases/d_a_wm_cannon.cpp new file mode 100644 index 00000000..3b2ac3cd --- /dev/null +++ b/source/d_basesNP/bases/d_a_wm_cannon.cpp @@ -0,0 +1,80 @@ +#include +#include +#include +#include +#include + +ACTOR_PROFILE(WM_CANNON, daWmCannon_c, 0); + +daWmCannon_c::daWmCannon_c() {} +daWmCannon_c::~daWmCannon_c() {} + +int daWmCannon_c::create() { + setClipSphere(); + loadModel(); + calcModel(); + + return SUCCEEDED; +} + +int daWmCannon_c::execute() { + setCutEndSpecific(dCsSeqMng_c::ms_instance->GetCutName(), dCsSeqMng_c::ms_instance->m_164); + + mModel.play(); + daWmMap_c::m_instance->GetNodePos(mResNodeIdx, mPos); + calcModel(); + + return SUCCEEDED; +} + +int daWmCannon_c::draw() { + mModel.entry(); + return SUCCEEDED; +} + +int daWmCannon_c::doDelete() { + return SUCCEEDED; +} + +void daWmCannon_c::setClipSphere() { + mClipSphere.mCenter = mPos; + mClipSphere.mRadius = 120.0f; +} + +void daWmCannon_c::loadModel() { + mAllocator.createFrmHeap(-1, mHeap::g_gameHeaps[mHeap::GAME_HEAP_DEFAULT], nullptr, 0x20); + + nw4r::g3d::ResFile resFile = dResMng_c::m_instance->getRes("cobCannon", "g3d/model.brres"); + nw4r::g3d::ResMdl resMdl = resFile.GetResMdl("cobCannon"); + + mModel.create(resMdl, &mAllocator, nw4r::g3d::ScnMdl::BUFFER_RESMATMISC, 1, nullptr); + dWmActor_c::setSoftLight_MapObj(mModel); + + mAllocator.adjustFrmHeap(); +} + +void daWmCannon_c::calcModel() { + mVec3_c pos = mPos; + mAng3_c angle = mAngle; + mMatrix.trans(pos); + mMatrix.ZXYrotM(angle); + mModel.setLocalMtx(&mMatrix); + mModel.setScale(mScale); + mModel.calc(false); +} + +void daWmCannon_c::setCutEndSpecific(int cutsceneId, bool param2) { + if (cutsceneId == dCsSeqMng_c::CUTSCENE_NONE) { + return; + } + + if (cutsceneId == 27) { + mIsCutEnd = true; + } else if (cutsceneId == 28) { + mIsCutEnd = true; + } else if (cutsceneId == 29) { + mIsCutEnd = true; + } else { + mIsCutEnd = true; + } +} \ No newline at end of file diff --git a/source/d_basesNP/bases/d_awa.cpp b/source/d_basesNP/bases/d_awa.cpp index 0a78f4ba..5194460d 100644 --- a/source/d_basesNP/bases/d_awa.cpp +++ b/source/d_basesNP/bases/d_awa.cpp @@ -27,7 +27,7 @@ int dAwa_c::create() { } void dAwa_c::createModel() { - mAllocator.createFrmHeap(0x80000, mHeap::g_gameHeaps[0], nullptr, 0x20); + mAllocator.createFrmHeap(0x80000, mHeap::g_gameHeaps[mHeap::GAME_HEAP_DEFAULT], nullptr, 0x20); mResFile = dResMng_c::m_instance->getRes("waterbubble", "g3d/waterbubble.brres"); nw4r::g3d::ResMdl model = mResFile.GetResMdl("waterbubble"); diff --git a/source/dol/bases/d_res_info.cpp b/source/dol/bases/d_res_info.cpp index 5b70a49d..0cb23bcd 100644 --- a/source/dol/bases/d_res_info.cpp +++ b/source/dol/bases/d_res_info.cpp @@ -97,7 +97,7 @@ dRes_c::info_c::LOAD_STATUS_e dRes_c::info_c::setRes(callback_c *callback) { } // Prepare the heap for the archive data - EGG::Heap *heap = (mpMountHeap != nullptr) ? mpMountHeap : mHeap::g_gameHeaps[0]; + EGG::Heap *heap = (mpMountHeap != nullptr) ? mpMountHeap : mHeap::g_gameHeaps[mHeap::GAME_HEAP_DEFAULT]; mDataHeap = mHeap::createFrmHeapToCurrent(-1, heap, "dRes_c::info_c::mDataHeap", 0x20, mHeap::OPT_NONE); if (mDataHeap == nullptr) { return LOAD_ERROR; diff --git a/source/dol/bases/d_wm_demo_actor.cpp b/source/dol/bases/d_wm_demo_actor.cpp index 05a36468..ce2f4ca4 100644 --- a/source/dol/bases/d_wm_demo_actor.cpp +++ b/source/dol/bases/d_wm_demo_actor.cpp @@ -162,7 +162,7 @@ bool dWmDemoActor_c::checkArriveTargetXZ(const mVec3_c &startPos, const mVec3_c } void dWmDemoActor_c::CreateShadowModel(const char *arc, const char *path, const char *mdlName, bool param4) { - mHeapAllocator.createFrmHeapToCurrent(-1, mHeap::g_gameHeaps[0], nullptr, 0x20, mHeap::OPT_NONE); + mHeapAllocator.createFrmHeapToCurrent(-1, mHeap::g_gameHeaps[mHeap::GAME_HEAP_DEFAULT], nullptr, 0x20, mHeap::OPT_NONE); nw4r::g3d::ResFile resFile = dResMng_c::m_instance->getRes(arc, path); mModel.create(resFile.GetResMdl(mdlName), &mHeapAllocator, nw4r::g3d::ScnMdl::BUFFER_RESMATMISC, 1, 0); diff --git a/source/dol/framework/f_base.cpp b/source/dol/framework/f_base.cpp index eb6bc1e0..155ce4dc 100644 --- a/source/dol/framework/f_base.cpp +++ b/source/dol/framework/f_base.cpp @@ -436,7 +436,7 @@ bool fBase_c::createHeap() { } void *fBase_c::operator new(size_t size) { - void *mem = EGG::Heap::alloc(size, -4, mHeap::g_gameHeaps[0]); + void *mem = EGG::Heap::alloc(size, -4, mHeap::g_gameHeaps[mHeap::GAME_HEAP_DEFAULT]); if (mem != nullptr) { memset(mem, 0, size); } @@ -444,7 +444,7 @@ void *fBase_c::operator new(size_t size) { } void fBase_c::operator delete(void *mem) { - EGG::Heap::free(mem, mHeap::g_gameHeaps[0]); + EGG::Heap::free(mem, mHeap::g_gameHeaps[mHeap::GAME_HEAP_DEFAULT]); } void fBase_c::runCreate() { diff --git a/syms.txt b/syms.txt index 4bf5d3d6..e3af0653 100644 --- a/syms.txt +++ b/syms.txt @@ -242,6 +242,7 @@ isKoopaShipAnchor__6dWmLibFv=0x800FC100 getEnemyRevivalCount__6dWmLibFii=0x800FC250 getPointDir__6dWmLibFRC7mVec3_cRC7mVec3_c=0x800FC300 CheckClipSphere__13dWmViewClip_cFPC9mSphere_c=0x800FE150 +GetNodePos__9daWmMap_cFlR7mVec3_c=0x801007D0 GetNodeCount__9daWmMap_cFi=0x80100830 checkWalkPlayers__12daWmPlayer_cFv=0x80100A10 isPlayerStarMode__12daWmPlayer_cFv=0x801011A0 @@ -713,4 +714,4 @@ smc_SCORE_X__11dScoreMng_c=0x8042CF68 smc_SCORE_Y__11dScoreMng_c=0x8042CF6C c_CASTLE_ID__10dCsvData_c=0x8042D24C c_START_ID__10dCsvData_c=0x8042D264 -c_PLAYNUM_DIGIT__14dGameDisplay_c=0x8042DE90 +c_PLAYNUM_DIGIT__14dGameDisplay_c=0x8042DE90 \ No newline at end of file From d572c9f5962a996b60f736801c177f7a959ca476 Mon Sep 17 00:00:00 2001 From: RootCubed Date: Sun, 29 Mar 2026 09:17:48 +0200 Subject: [PATCH 2/4] `daWmCannon_c`: only sinit non-matching --- alias_db.txt | 9 +++++++++ include/game/bases/d_a_wm_cannon.hpp | 4 ++-- include/game/bases/d_wm_lib.hpp | 4 +--- source/d_basesNP/bases/d_a_wm_cannon.cpp | 25 +++++++++++++++--------- 4 files changed, 28 insertions(+), 14 deletions(-) diff --git a/alias_db.txt b/alias_db.txt index 602c5e85..be7a5b6e 100644 --- a/alias_db.txt +++ b/alias_db.txt @@ -5,6 +5,8 @@ R_3_1_100 = finalizeEpilog__Fv R_4_1_F0 = finalizeProlog__Fv R_4_1_100 = finalizeEpilog__Fv R_2_1_70 = __register_global_object +R_2_1_1be0 = __dt__7mVec3_cFv +R_2_1_88b0 = __dt__Q26dWmLib19ForceInCourseList_tFv R_2_1_49500 = finalUpdate__12dBaseActor_cFv R_2_1_49510 = GetActorType__12dBaseActor_cFv R_2_1_49520 = funsuiMoveX__8dActor_cFv @@ -17,6 +19,13 @@ R_2_1_4ac20 = endFunsui__5dEn_cFv R_2_1_4ac30 = beginFunsui__5dEn_cFv R_2_1_4ac40 = calcBoyonScale__5dEn_cFv R_2_1_4ac50 = isQuakeDamage__5dEn_cFv +R_2_1_15a8a0 = doDelete__14dWmDemoActor_cFv +R_2_1_15ab60 = setCutEnd__14dWmDemoActor_cFv +R_2_1_15ab70 = clearCutEnd__14dWmDemoActor_cFv +R_2_1_15ab80 = checkCutEnd__14dWmDemoActor_cFv +R_2_1_15ab90 = vf78__13dWmObjActor_cFv +R_2_1_15aba0 = vf74__13dWmObjActor_cFv +R_2_1_15abb0 = GetActorType__13dWmObjActor_cFv R_2_5_4fa70 = g_profile_WORLD_MAP R_2_5_4da38 = g_profile_WORLD_9_DEMO R_2_5_4f238 = g_profile_STAGE diff --git a/include/game/bases/d_a_wm_cannon.hpp b/include/game/bases/d_a_wm_cannon.hpp index 0abaa080..afff8b3c 100644 --- a/include/game/bases/d_a_wm_cannon.hpp +++ b/include/game/bases/d_a_wm_cannon.hpp @@ -7,7 +7,7 @@ class daWmCannon_c : public dWmObjActor_c { public: daWmCannon_c(); ~daWmCannon_c(); - + virtual int create(); virtual int execute(); virtual int draw(); @@ -21,5 +21,5 @@ class daWmCannon_c : public dWmObjActor_c { dHeapAllocator_c mAllocator; m3d::smdl_c mModel; - u32 _200; + u32 m_200; }; diff --git a/include/game/bases/d_wm_lib.hpp b/include/game/bases/d_wm_lib.hpp index 7f3cc1f8..910d4a29 100644 --- a/include/game/bases/d_wm_lib.hpp +++ b/include/game/bases/d_wm_lib.hpp @@ -39,8 +39,6 @@ namespace dWmLib { }; struct ForceInCourseList_t { - ~ForceInCourseList_t() {} - int nodeWorld; const char *nodeName; int world; @@ -78,7 +76,7 @@ namespace dWmLib { int getEnemyRevivalCount(int, int); static ForceInCourseList_t sc_ForceList[] = { - {WORLD_7, "F7C0", WORLD_7, dCsvData_c::c_CASTLE_ID, 4, "W7C0", mVec3_c(2160, -30, -478)} + {WORLD_7, "F7C0", WORLD_7, dCsvData_c::c_CASTLE_ID, 4, "W7C0", mVec3_c(2160.0f, -30.0f, -478.0f)} }; static int c_StartPointKinokoHouseID = dCsvData_c::c_START_ID; diff --git a/source/d_basesNP/bases/d_a_wm_cannon.cpp b/source/d_basesNP/bases/d_a_wm_cannon.cpp index 3b2ac3cd..5c0657bf 100644 --- a/source/d_basesNP/bases/d_a_wm_cannon.cpp +++ b/source/d_basesNP/bases/d_a_wm_cannon.cpp @@ -10,6 +10,8 @@ daWmCannon_c::daWmCannon_c() {} daWmCannon_c::~daWmCannon_c() {} int daWmCannon_c::create() { + float a = 0.0f; // [Needed for .rodata ordering] + setClipSphere(); loadModel(); calcModel(); @@ -68,13 +70,18 @@ void daWmCannon_c::setCutEndSpecific(int cutsceneId, bool param2) { return; } - if (cutsceneId == 27) { - mIsCutEnd = true; - } else if (cutsceneId == 28) { - mIsCutEnd = true; - } else if (cutsceneId == 29) { - mIsCutEnd = true; - } else { - mIsCutEnd = true; + switch (cutsceneId) { + case 27: + mIsCutEnd = true; + break; + case 28: + mIsCutEnd = true; + break; + case 29: + mIsCutEnd = true; + break; + default: + mIsCutEnd = true; + break; } -} \ No newline at end of file +} From f87d4c6095ea55c099675818f9a598274530f1de Mon Sep 17 00:00:00 2001 From: RootCubed Date: Sun, 29 Mar 2026 10:43:32 +0200 Subject: [PATCH 3/4] Match and link `daWmCannon_c` --- include/game/bases/d_wm_csv_data.hpp | 22 +++++++++++----------- include/game/bases/d_wm_lib.hpp | 14 +++++++------- slices/d_basesNP.json | 1 - 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/include/game/bases/d_wm_csv_data.hpp b/include/game/bases/d_wm_csv_data.hpp index 8ff4e9d9..b2d71551 100644 --- a/include/game/bases/d_wm_csv_data.hpp +++ b/include/game/bases/d_wm_csv_data.hpp @@ -7,15 +7,15 @@ class dCsvData_c { u8 mPad[0x16518]; public: - static int c_COURSE_ID; - static int c_GHOST_ID; - static int c_TOWER_ID; - static int c_CASTLE_ID; - static int c_KINOKO_ID; - static int c_ENEMY_ID; - static int c_CANON_ID; - static int c_TRSHIP_ID; - static int c_AIRSHIP_ID; - static int c_START_ID; - static int c_PEACH_ID; + static const int c_COURSE_ID; + static const int c_GHOST_ID; + static const int c_TOWER_ID; + static const int c_CASTLE_ID; + static const int c_KINOKO_ID; + static const int c_ENEMY_ID; + static const int c_CANON_ID; + static const int c_TRSHIP_ID; + static const int c_AIRSHIP_ID; + static const int c_START_ID; + static const int c_PEACH_ID; }; diff --git a/include/game/bases/d_wm_lib.hpp b/include/game/bases/d_wm_lib.hpp index 910d4a29..286c1cf3 100644 --- a/include/game/bases/d_wm_lib.hpp +++ b/include/game/bases/d_wm_lib.hpp @@ -39,13 +39,13 @@ namespace dWmLib { }; struct ForceInCourseList_t { - int nodeWorld; - const char *nodeName; - int world; - int level; - int entrance; - const char *levelNode; - mVec3_c nodePos; + int mNodeWorld; + const char *mNodeName; + int mWorld; + int mLevel; + int mEntrance; + const char *mLevelNode; + mVec3_c mNodePos; }; int GetCourseTypeFromCourseNo(int courseNo); diff --git a/slices/d_basesNP.json b/slices/d_basesNP.json index f4ccf05a..20e315ff 100644 --- a/slices/d_basesNP.json +++ b/slices/d_basesNP.json @@ -71,7 +71,6 @@ }, { "source": "d_basesNP/bases/d_a_wm_cannon.cpp", - "nonMatching": true, "memoryRanges": { ".text": "0x15e7e0-0x15ecc0", ".ctors": "0x3c4-0x3c8", From 03788cdeb24ab00f23d96e01d01a61e8579f0398 Mon Sep 17 00:00:00 2001 From: CLF78 <29682335+CLF78@users.noreply.github.com> Date: Sun, 29 Mar 2026 17:43:28 +0200 Subject: [PATCH 4/4] Add documentation + minor clean up --- include/game/bases/d_a_wm_cannon.hpp | 21 ++++--- include/game/bases/d_cs_seq_manager.hpp | 72 +++++++++++++++++++++++- include/game/bases/d_wm_demo_actor.hpp | 6 +- source/d_basesNP/bases/d_a_wm_cannon.cpp | 16 +++--- source/dol/bases/d_wm_demo_actor.cpp | 18 +++--- source/dol/bases/d_wm_enemy.cpp | 34 ++++++----- 6 files changed, 122 insertions(+), 45 deletions(-) diff --git a/include/game/bases/d_a_wm_cannon.hpp b/include/game/bases/d_a_wm_cannon.hpp index afff8b3c..3c3c5277 100644 --- a/include/game/bases/d_a_wm_cannon.hpp +++ b/include/game/bases/d_a_wm_cannon.hpp @@ -3,23 +3,26 @@ #include #include +/// @brief The actor for the Warp Cannons found on the World Map. +/// @ingroup bases +/// @paramtable class daWmCannon_c : public dWmObjActor_c { public: - daWmCannon_c(); - ~daWmCannon_c(); + daWmCannon_c(); ///< @copydoc dWmObjActor_c::dWmObjActor_c + ~daWmCannon_c(); ///< @copydoc dWmObjActor_c::~dWmObjActor_c virtual int create(); virtual int execute(); virtual int draw(); virtual int doDelete(); - virtual void setCutEndSpecific(int cutsceneId, bool param2); + virtual void setCutEndSpecific(int cutsceneCommandId, bool param2); - void setClipSphere(); - void loadModel(); - void calcModel(); + void setClipSphere(); ///< Sets the @ref mClipSphere "clip sphere" for the actor. + void createModel(); ///< Initializes the resources for the actor. + void calcModel(); ///< Updates the model's transformation matrix. - dHeapAllocator_c mAllocator; - m3d::smdl_c mModel; - u32 m_200; + dHeapAllocator_c mAllocator; ///< The allocator. + m3d::smdl_c mModel; ///< The model. + u32 mUnk200; ///< @unused }; diff --git a/include/game/bases/d_cs_seq_manager.hpp b/include/game/bases/d_cs_seq_manager.hpp index 7b079879..8fb1ec87 100644 --- a/include/game/bases/d_cs_seq_manager.hpp +++ b/include/game/bases/d_cs_seq_manager.hpp @@ -4,8 +4,78 @@ class dCsSeqMng_c { public: + /// @unofficial enum CUTSCENE_e { - CUTSCENE_NONE = -1 + SMC_DEMO_DEFAULT_CLR, + SMC_DEMO_DEFAULT_FAIL, + SMC_DEMO_ENEMY_CLR, + SMC_DEMO_ENEMY_FAIL, + SMC_DEMO_TORIDE_IN, + SMC_DEMO_TORIDE_CLR, + SMC_DEMO_TORIDE_FAIL, + SMC_DEMO_TORIDE_FAIL2, + SMC_DEMO_CASTLE_IN, + SMC_DEMO_CASTLE_CLR, + SMC_DEMO_CASTLE_FAIL, + SMC_DEMO_CASTLE_FAIL2, + SMC_DEMO_GHOST_IN, + SMC_DEMO_GHOST_CLR, + SMC_DEMO_GHOST_FAIL, + SMC_DEMO_GHOST_FAIL2, + SMC_DEMO_CANNON, + SMC_DEMO_TRSHIP_APPEAR, + SMC_DEMO_DOKAN, + SMC_DEMO_DOKAN_WARP, + SMC_DEMO_DOKAN_START, + SMC_DEMO_W_WALKING_IN, + SMC_DEMO_W_WALKING_IN_NORMAL, + SMC_DEMO_W_FLYING_IN, + SMC_DEMO_W_CANNON_IN, + SMC_DEMO_W_CANNON_IN_NORMAL, + SMC_DEMO_W1_TORIDE_CLR, + SMC_DEMO_W1_CASTLE_CLR, + SMC_DEMO_W3_CASTLE_CLR, + SMC_DEMO_FADE_TEST, + SMC_DEMO_VIEW_WORLD, + SMC_DEMO_COURSE_IN, + SMC_DEMO_KINOKO_OUT, + SMC_DEMO_AIRSHIP_COURSE_IN, + SMC_DEMO_AIRSHIP_COURSE_OUT, + SMC_DEMO_START_KINOKO_IN, + SMC_DEMO_AIRSHIP_GONEXT, + SMC_DEMO_W36_CLEAR_NORMAL, + SMC_DEMO_NULL, + SMC_DEMO_ANTLION, + SMC_DEMO_KILLER, + SMC_DEMO_START_BATTLE, + SMC_DEMO_SWITCH, + SMC_DEMO_KOOPACASTLEAPPEAR, + SMC_DEMO_KINOPIOSTART, + SMC_DEMO_WORLDIN_NOSHIP, + SMC_DEMO_WORLDIN_JUMP_NOSHIP, + SMC_DEMO_PAUSE_MENU, + SMC_DEMO_AIRSHIP_CLEAR, + SMC_DEMO_STOCK_MENU, + SMC_DEMO_WORLDSELECT_MENU, + SMC_DEMO_ANTLION_STAR, + SMC_DEMO_GAMESTART, + SMC_DEMO_END, + SMC_DEMO_COUNT + }; + + /// @unofficial + enum CUTSCENE_CMD_e { + CUTSCENE_CMD_NONE = -1, + CUTSCENE_CMD_4 = 4, + CUTSCENE_CMD_27 = 27, + CUTSCENE_CMD_28 = 28, + CUTSCENE_CMD_29 = 29, + CUTSCENE_CMD_56 = 56, + CUTSCENE_CMD_86 = 86, + CUTSCENE_CMD_87 = 87, + CUTSCENE_CMD_89 = 89, + CUTSCENE_CMD_91 = 91, + CUTSCENE_CMD_136 = 136, }; int GetCutName(); diff --git a/include/game/bases/d_wm_demo_actor.hpp b/include/game/bases/d_wm_demo_actor.hpp index bd1da153..86925e8f 100644 --- a/include/game/bases/d_wm_demo_actor.hpp +++ b/include/game/bases/d_wm_demo_actor.hpp @@ -16,7 +16,7 @@ class dWmDemoActor_c : public dWmActor_c { virtual int execute() = 0; virtual int GetActorType() { return ACTOR_MAP_DEMO; } - virtual void setCutEndSpecific(int cutsceneId, bool param2); ///< @unofficial + virtual void setCutEndSpecific(int cutsceneCommandId, bool param2); ///< @unofficial virtual bool checkCutEnd() { return mIsCutEnd; } virtual void setCutEnd() { mIsCutEnd = true; } virtual void clearCutEnd() { mIsCutEnd = false; } @@ -47,9 +47,9 @@ class dWmDemoActor_c : public dWmActor_c { void CsSPosSimple(int directionType, float yTarget); void clearSpeedAll(); void adjustHeightBase(const mVec3_c &startPos, const mVec3_c &targetPos, int directionType); - bool isCutscenePlaying(const int *csList, int csCount); ///< @unofficial + bool isCutsceneCommandPlaying(const int *cmdList, int cmdCount); ///< @unofficial - static dBaseActor_c *GetChildDemoActor(dBaseActor_c *prev, dWmDemoActor_c *&next); ///< @unofficial + static dWmDemoActor_c *GetChildDemoActor(dBaseActor_c *prev, dWmDemoActor_c *&next); ///< @unofficial protected: bool m_00; diff --git a/source/d_basesNP/bases/d_a_wm_cannon.cpp b/source/d_basesNP/bases/d_a_wm_cannon.cpp index 5c0657bf..566f2ec5 100644 --- a/source/d_basesNP/bases/d_a_wm_cannon.cpp +++ b/source/d_basesNP/bases/d_a_wm_cannon.cpp @@ -13,7 +13,7 @@ int daWmCannon_c::create() { float a = 0.0f; // [Needed for .rodata ordering] setClipSphere(); - loadModel(); + createModel(); calcModel(); return SUCCEEDED; @@ -43,7 +43,7 @@ void daWmCannon_c::setClipSphere() { mClipSphere.mRadius = 120.0f; } -void daWmCannon_c::loadModel() { +void daWmCannon_c::createModel() { mAllocator.createFrmHeap(-1, mHeap::g_gameHeaps[mHeap::GAME_HEAP_DEFAULT], nullptr, 0x20); nw4r::g3d::ResFile resFile = dResMng_c::m_instance->getRes("cobCannon", "g3d/model.brres"); @@ -65,19 +65,19 @@ void daWmCannon_c::calcModel() { mModel.calc(false); } -void daWmCannon_c::setCutEndSpecific(int cutsceneId, bool param2) { - if (cutsceneId == dCsSeqMng_c::CUTSCENE_NONE) { +void daWmCannon_c::setCutEndSpecific(int cutsceneCommandId, bool param2) { + if (cutsceneCommandId == dCsSeqMng_c::CUTSCENE_CMD_NONE) { return; } - switch (cutsceneId) { - case 27: + switch (cutsceneCommandId) { + case dCsSeqMng_c::CUTSCENE_CMD_27: mIsCutEnd = true; break; - case 28: + case dCsSeqMng_c::CUTSCENE_CMD_28: mIsCutEnd = true; break; - case 29: + case dCsSeqMng_c::CUTSCENE_CMD_29: mIsCutEnd = true; break; default: diff --git a/source/dol/bases/d_wm_demo_actor.cpp b/source/dol/bases/d_wm_demo_actor.cpp index ce2f4ca4..2bb6121d 100644 --- a/source/dol/bases/d_wm_demo_actor.cpp +++ b/source/dol/bases/d_wm_demo_actor.cpp @@ -10,7 +10,7 @@ dWmDemoActor_c::dWmDemoActor_c() {} -dBaseActor_c *dWmDemoActor_c::GetChildDemoActor(dBaseActor_c *prev, dWmDemoActor_c *&next) { +dWmDemoActor_c *dWmDemoActor_c::GetChildDemoActor(dBaseActor_c *prev, dWmDemoActor_c *&next) { dBaseActor_c *actor = (dBaseActor_c *) fManager_c::searchBaseByGroupType(fBase_c::ACTOR, prev); if (actor == nullptr) { next = nullptr; @@ -27,11 +27,11 @@ dBaseActor_c *dWmDemoActor_c::GetChildDemoActor(dBaseActor_c *prev, dWmDemoActor next = nullptr; break; } - return actor; + return (dWmDemoActor_c *)actor; } -void dWmDemoActor_c::setCutEndSpecific(int cutsceneId, bool param2) { - if (cutsceneId == -1) { +void dWmDemoActor_c::setCutEndSpecific(int cutsceneCommandId, bool param2) { + if (cutsceneCommandId == dCsSeqMng_c::CUTSCENE_CMD_NONE) { return; } dWmDemoActor_c::setCutEnd(); @@ -165,7 +165,7 @@ void dWmDemoActor_c::CreateShadowModel(const char *arc, const char *path, const mHeapAllocator.createFrmHeapToCurrent(-1, mHeap::g_gameHeaps[mHeap::GAME_HEAP_DEFAULT], nullptr, 0x20, mHeap::OPT_NONE); nw4r::g3d::ResFile resFile = dResMng_c::m_instance->getRes(arc, path); - mModel.create(resFile.GetResMdl(mdlName), &mHeapAllocator, nw4r::g3d::ScnMdl::BUFFER_RESMATMISC, 1, 0); + mModel.create(resFile.GetResMdl(mdlName), &mHeapAllocator, nw4r::g3d::ScnMdl::BUFFER_RESMATMISC, 1, nullptr); mSvMdl = new dWmSVMdl_c(); mSvMdl->create(&mHeapAllocator, mModel); @@ -311,11 +311,11 @@ void dWmDemoActor_c::adjustHeightBase(const mVec3_c &startPos, const mVec3_c &ta CsSPosSimple(directionType, GetBgPosY(startPos, targetPos, directionType)); } -bool dWmDemoActor_c::isCutscenePlaying(const int *csList, int csCount) { - int cutName = dCsSeqMng_c::ms_instance->GetCutName(); +bool dWmDemoActor_c::isCutsceneCommandPlaying(const int *cmdList, int cmdCount) { + int currCmd = dCsSeqMng_c::ms_instance->GetCutName(); bool found = false; - for (int i = 0; i < csCount; i++) { - if (csList[i] == cutName) { + for (int i = 0; i < cmdCount; i++) { + if (cmdList[i] == currCmd) { found = true; break; } diff --git a/source/dol/bases/d_wm_enemy.cpp b/source/dol/bases/d_wm_enemy.cpp index 771a6c3e..83e0f714 100644 --- a/source/dol/bases/d_wm_enemy.cpp +++ b/source/dol/bases/d_wm_enemy.cpp @@ -107,7 +107,7 @@ int dWmEnemy_c::execute() { } } setCutEndSpecific(dCsSeqMng_c::ms_instance->GetCutName(), dCsSeqMng_c::ms_instance->m_164); - if (IsExecEnable() || dCsSeqMng_c::ms_instance->GetCutName() == 0x57) { + if (IsExecEnable() || dCsSeqMng_c::ms_instance->GetCutName() == dCsSeqMng_c::CUTSCENE_CMD_87) { static const ProcFunc Proc_tbl[PROC_COUNT] = { &dWmEnemy_c::mode_exec, &dWmEnemy_c::mode_DemoContinue, @@ -321,33 +321,33 @@ void dWmEnemy_c::initShapeAngle() { bool dWmEnemy_c::csCommand(int id, bool b) { dWmDemoActor_c *actor = dCsSeqMng_c::ms_instance->m_1ac; bool isEnd = false; - if (id == -1) { + if (id == dCsSeqMng_c::CUTSCENE_CMD_NONE) { return false; } if (b) { switch (id) { - case 4: + case dCsSeqMng_c::CUTSCENE_CMD_4: if (mEnWalk) { initWalk(); } break; - case 86: + case dCsSeqMng_c::CUTSCENE_CMD_86: if (actor == this) { initDemoAnger(); } break; - case 89: + case dCsSeqMng_c::CUTSCENE_CMD_89: if (isMainCast()) { initDemoLose(); } break; - case 91: + case dCsSeqMng_c::CUTSCENE_CMD_91: mRotateTimer = 5; break; } } switch (id) { - case 4: + case dCsSeqMng_c::CUTSCENE_CMD_4: if (mEnWalk) { isEnd = true; if (doWalk()) { @@ -357,21 +357,21 @@ bool dWmEnemy_c::csCommand(int id, bool b) { mIsCutEnd = true; } break; - case 86: + case dCsSeqMng_c::CUTSCENE_CMD_86: if (actor == this) { isEnd = !procDemoAnger(); } else { isEnd = false; } break; - case 89: + case dCsSeqMng_c::CUTSCENE_CMD_89: if (isMainCast()) { isEnd = !procDemoLose(); } else { isEnd = false; } break; - case 91: + case dCsSeqMng_c::CUTSCENE_CMD_91: if (mHitPlayer && dScWMap_c::m_WorldNo != WORLD_4) { isEnd = true; if (mRotateTimer > 0) { @@ -529,10 +529,14 @@ int dWmEnemy_c::getEnemyWalkSeID() { } bool dWmEnemy_c::IsExecEnable() { - static const int cutsceneIDs[] = { - -1, 56, 136, 86, 87 + static const int cutsceneCommands[] = { + dCsSeqMng_c::CUTSCENE_CMD_NONE, + dCsSeqMng_c::CUTSCENE_CMD_56, + dCsSeqMng_c::CUTSCENE_CMD_136, + dCsSeqMng_c::CUTSCENE_CMD_86, + dCsSeqMng_c::CUTSCENE_CMD_87 }; - return isCutscenePlaying(cutsceneIDs, ARRAY_SIZE(cutsceneIDs)); + return isCutsceneCommandPlaying(cutsceneCommands, ARRAY_SIZE(cutsceneCommands)); } bool dWmEnemy_c::IsPlayerComingCore() { @@ -625,12 +629,12 @@ bool dWmEnemy_c::CheckIsHitToPlayer() { } if (hitWait) { daWmPlayer_c::ms_instance->m_2fc = true; - dCsSeqMng_c::ms_instance->FUN_801017c0(0x29, this, 0, 0x80); + dCsSeqMng_c::ms_instance->FUN_801017c0(dCsSeqMng_c::SMC_DEMO_START_BATTLE, this, 0, 0x80); deleteSound(); return true; } else { if (hitMove) { - dCsSeqMng_c::ms_instance->FUN_801017c0(0x29, this, 0, 0x80); + dCsSeqMng_c::ms_instance->FUN_801017c0(dCsSeqMng_c::SMC_DEMO_START_BATTLE, this, 0, 0x80); deleteSound(); return true; } else {