From a6eeeedd34283e283e6d878cf62fca3cafae7adb Mon Sep 17 00:00:00 2001 From: Cole Barker Date: Sun, 15 Feb 2026 17:30:21 -0500 Subject: [PATCH 1/4] mostly matching d_t_defeat_boss.cpp --- .../SOUE01/rels/d_t_defeat_bossNP/symbols.txt | 18 +-- include/d/t/d_t_defeat_boss.h | 14 ++ src/REL/d/t/d_t_defeat_boss.cpp | 125 ++++++++++++++++++ 3 files changed, 148 insertions(+), 9 deletions(-) diff --git a/config/SOUE01/rels/d_t_defeat_bossNP/symbols.txt b/config/SOUE01/rels/d_t_defeat_bossNP/symbols.txt index 7c8d6338..da091c9e 100644 --- a/config/SOUE01/rels/d_t_defeat_bossNP/symbols.txt +++ b/config/SOUE01/rels/d_t_defeat_bossNP/symbols.txt @@ -2,16 +2,16 @@ _prolog = .text:0x00000000; // type:function size:0x2C scope:global _epilog = .text:0x00000030; // type:function size:0x2C scope:global _unresolved = .text:0x00000060; // type:function size:0x4 scope:global dTgDefeatBoss_c_classInit__Fv = .text:0x00000070; // type:function size:0x4C -fn_494_C0 = .text:0x000000C0; // type:function size:0xC -fn_494_D0 = .text:0x000000D0; // type:function size:0x84 -TgDefeatBoss__init = .text:0x00000160; // type:function size:0xCC -TgDefeatBoss__update = .text:0x00000230; // type:function size:0x120 -TgDefeatBoss__getSceneflag = .text:0x00000350; // type:function size:0xC -fn_494_360 = .text:0x00000360; // type:function size:0xC -TgDefeatBoss__getStoryflag = .text:0x00000370; // type:function size:0xC -fn_494_380 = .text:0x00000380; // type:function size:0xC +fn_494_C0__15dTgDefeatBoss_cFv = .text:0x000000C0; // type:function size:0xC +fn_494_D0__15dTgDefeatBoss_cFv = .text:0x000000D0; // type:function size:0x84 +init__15dTgDefeatBoss_cFv = .text:0x00000160; // type:function size:0xCC +update__15dTgDefeatBoss_cFv = .text:0x00000230; // type:function size:0x120 +getSceneflag__15dTgDefeatBoss_cFv = .text:0x00000350; // type:function size:0xC +fn_494_360__15dTgDefeatBoss_cFv = .text:0x00000360; // type:function size:0xC +getStoryflag__15dTgDefeatBoss_cFv = .text:0x00000370; // type:function size:0xC +fn_494_380__15dTgDefeatBoss_cFv = .text:0x00000380; // type:function size:0xC __dt__15dTgDefeatBoss_cFv = .text:0x00000390; // type:function size:0x5C _ctors = .ctors:0x00000000; // type:label scope:global _dtors = .dtors:0x00000000; // type:label scope:global g_profile_TAG_DEFEAT_BOSS = .data:0x00000000; // type:object size:0x10 -lbl_494_section4_10 = .data:0x00000010; // type:object size:0x74 +__vt__15dTgDefeatBoss_c = .data:0x00000010; // type:object size:0x74 diff --git a/include/d/t/d_t_defeat_boss.h b/include/d/t/d_t_defeat_boss.h index 35d66f5b..f77af5fd 100644 --- a/include/d/t/d_t_defeat_boss.h +++ b/include/d/t/d_t_defeat_boss.h @@ -7,8 +7,22 @@ class dTgDefeatBoss_c : public dTg_c { public: dTgDefeatBoss_c() {} virtual ~dTgDefeatBoss_c() {} + virtual int update() override; + u16 getSceneflag(); + u16 fn_494_360(); + u16 getStoryflag(); + u16 fn_494_380(); + void fn_494_C0(); + bool fn_494_D0(); + bool init(); + + /* 0xFC */ u8 var8_1;//area? + /* 0xFD */ u8 var8_2;//scene flag? I assume this is only 2 byte + private: }; + + #endif diff --git a/src/REL/d/t/d_t_defeat_boss.cpp b/src/REL/d/t/d_t_defeat_boss.cpp index 5e649112..1d7ff4d6 100644 --- a/src/REL/d/t/d_t_defeat_boss.cpp +++ b/src/REL/d/t/d_t_defeat_boss.cpp @@ -1,3 +1,128 @@ #include "d/t/d_t_defeat_boss.h" +#include "d/flag/storyflag_manager.h" +#include "d/flag/sceneflag_manager.h" +#include "d/flag/dungeonflag_manager.h" +#include "common.h" SPECIAL_ACTOR_PROFILE(TAG_DEFEAT_BOSS, dTgDefeatBoss_c, fProfile::TAG_DEFEAT_BOSS, 0x29E, 0, 0); + +void dTgDefeatBoss_c::fn_494_C0() { + + mID = (fBaseID_e)0x3; + return; + +} + +bool dTgDefeatBoss_c::fn_494_D0() {//checks if valid dungeion flag? + + DungeonflagManager* pDVar2; + u16 sVar4; + + fn_494_C0(); + pDVar2 = DungeonflagManager::sInstance; + sVar4 = pDVar2->getCounterOrFlag(mID, (u32)8); + + return sVar4 != 0; + +} + +bool dTgDefeatBoss_c::init() { + + u16 uVar1; + u16 uVar2; + u16 iVar3; + u16 bVar4; + u32 uVar5; + u16 counterIdx; + + bVar4 = fn_494_D0(); + if (bVar4) { + uVar1 = 2; + } + else { + uVar5 = fn_494_360(); + var8_1 = uVar5; + uVar2 = getSceneflag(); + if ((uVar2 & 0xffff) > 0xfe) { + var8_1 = 0xff; + } + uVar5 = fn_494_380(); + var8_2 = uVar5; + counterIdx = getStoryflag(); + iVar3 = StoryflagManager::sInstance->checkFlagValid(counterIdx); + if (iVar3 == 0) { + var8_2 = 0xff; + } + if (var8_1 == -1 && var8_2 == -1) { + uVar1 = 2; + } + else { + uVar1 = 1; + } + } + return uVar1; + +} + +int dTgDefeatBoss_c::update() { + + StoryflagManager* pSVar1; + bool bVar4; + u16 uVar2; + /*StoryFlags*/int SVar3; + + bVar4 = fn_494_D0(); + if (bVar4) { + switch (var8_1) { + case 0x0: + uVar2 = getSceneflag(); + SceneflagManager::sInstance->unsetFlag + (/*SceneflagManager::sInstance,*/ (u16)/*(param_1->base).members.roomid*/(mRoomID & 0xffff), + (u16)(uVar2 & 0xffff)); + break; + case 0x1: + uVar2 = getSceneflag(); + SceneflagManager::sInstance->setFlag + (/*SceneflagManager::sInstance,*/ (u16)/*(param_1->base).members.roomid*/mRoomID & 0xffff, + (u16)uVar2 & 0xffff); + break; + } + //pSVar1 = StoryflagManager::sInstance; + switch (var8_2) { + case 0x0: + pSVar1 = StoryflagManager::sInstance; + SVar3 = getStoryflag(); + pSVar1->unsetFlag(SVar3); + break; + case 0x1: + pSVar1 = StoryflagManager::sInstance; + SVar3 = getStoryflag(); + pSVar1->setFlag(SVar3); + break; + } + fBase_c::deleteRequest(); + } + + return SUCCEEDED; +} + +u16 dTgDefeatBoss_c::getSceneflag() { + return mParams & 0xff; +} + +u16 dTgDefeatBoss_c::fn_494_360() { + + return mParams >> 0x8 & 0x1; + +} + +u16 dTgDefeatBoss_c::getStoryflag() { + return mParams >> 9 & 0xffff; +} + +u16 dTgDefeatBoss_c::fn_494_380() { + + return (mParams >> 0x19) & 0x1; + +} + From e722e6f9b3c3a4ef48ec11aa4567984061cde388 Mon Sep 17 00:00:00 2001 From: Cole Barker <41011709+coleslaw456@users.noreply.github.com> Date: Mon, 23 Feb 2026 20:27:33 -0500 Subject: [PATCH 2/4] Rename fn_494_C0 Co-authored-by: Elijah Thomas <42302100+elijah-thomas774@users.noreply.github.com> --- include/d/t/d_t_defeat_boss.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/d/t/d_t_defeat_boss.h b/include/d/t/d_t_defeat_boss.h index f77af5fd..6fb783e6 100644 --- a/include/d/t/d_t_defeat_boss.h +++ b/include/d/t/d_t_defeat_boss.h @@ -12,7 +12,7 @@ public: u16 fn_494_360(); u16 getStoryflag(); u16 fn_494_380(); - void fn_494_C0(); + static void getDungeonFlagIndex(u32 &outFlagIdx); bool fn_494_D0(); bool init(); From 1f8ae19f7856200322780799b6bfac6e85a07b33 Mon Sep 17 00:00:00 2001 From: Cole Barker <41011709+coleslaw456@users.noreply.github.com> Date: Mon, 23 Feb 2026 21:10:36 -0500 Subject: [PATCH 3/4] Apply suggestions from code review Co-authored-by: Elijah Thomas <42302100+elijah-thomas774@users.noreply.github.com> --- .../SOUE01/rels/d_t_defeat_bossNP/symbols.txt | 9 +- include/d/t/d_t_defeat_boss.h | 13 +- src/REL/d/t/d_t_defeat_boss.cpp | 113 ++++++++---------- 3 files changed, 63 insertions(+), 72 deletions(-) diff --git a/config/SOUE01/rels/d_t_defeat_bossNP/symbols.txt b/config/SOUE01/rels/d_t_defeat_bossNP/symbols.txt index da091c9e..732d3c42 100644 --- a/config/SOUE01/rels/d_t_defeat_bossNP/symbols.txt +++ b/config/SOUE01/rels/d_t_defeat_bossNP/symbols.txt @@ -5,11 +5,14 @@ dTgDefeatBoss_c_classInit__Fv = .text:0x00000070; // type:function size:0x4C fn_494_C0__15dTgDefeatBoss_cFv = .text:0x000000C0; // type:function size:0xC fn_494_D0__15dTgDefeatBoss_cFv = .text:0x000000D0; // type:function size:0x84 init__15dTgDefeatBoss_cFv = .text:0x00000160; // type:function size:0xCC -update__15dTgDefeatBoss_cFv = .text:0x00000230; // type:function size:0x120 +getDungeonFlagIndex__15dTgDefeatBoss_cFRUl = .text:0x000000C0; // type:function size:0xC +checkDungeonFlag__15dTgDefeatBoss_cFv = .text:0x000000D0; // type:function size:0x84 +create__15dTgDefeatBoss_cFv = .text:0x00000160; // type:function size:0xCC +actorExecute__15dTgDefeatBoss_cFv = .text:0x00000230; // type:function size:0x120 getSceneflag__15dTgDefeatBoss_cFv = .text:0x00000350; // type:function size:0xC -fn_494_360__15dTgDefeatBoss_cFv = .text:0x00000360; // type:function size:0xC +getSceneflagPolarity__15dTgDefeatBoss_cFv = .text:0x00000360; // type:function size:0xC getStoryflag__15dTgDefeatBoss_cFv = .text:0x00000370; // type:function size:0xC -fn_494_380__15dTgDefeatBoss_cFv = .text:0x00000380; // type:function size:0xC +getStoryflagPolarity__15dTgDefeatBoss_cFv = .text:0x00000380; // type:function size:0xC __dt__15dTgDefeatBoss_cFv = .text:0x00000390; // type:function size:0x5C _ctors = .ctors:0x00000000; // type:label scope:global _dtors = .dtors:0x00000000; // type:label scope:global diff --git a/include/d/t/d_t_defeat_boss.h b/include/d/t/d_t_defeat_boss.h index 6fb783e6..1caa51a6 100644 --- a/include/d/t/d_t_defeat_boss.h +++ b/include/d/t/d_t_defeat_boss.h @@ -13,14 +13,19 @@ public: u16 getStoryflag(); u16 fn_494_380(); static void getDungeonFlagIndex(u32 &outFlagIdx); - bool fn_494_D0(); - bool init(); + bool checkDungeonFlag(); + virtual int create() override; + virtual int actorExecute() override; - /* 0xFC */ u8 var8_1;//area? - /* 0xFD */ u8 var8_2;//scene flag? I assume this is only 2 byte + u16 getSceneflag(); + s32 getSceneflagPolarity(); + u32 getStoryflag(); + s32 getStoryflagPolarity(); private: + /* 0xFC */ s8 mSceneflagPolarity; + /* 0xFD */ s8 mStoryflagPolarity; }; diff --git a/src/REL/d/t/d_t_defeat_boss.cpp b/src/REL/d/t/d_t_defeat_boss.cpp index 1d7ff4d6..b088493f 100644 --- a/src/REL/d/t/d_t_defeat_boss.cpp +++ b/src/REL/d/t/d_t_defeat_boss.cpp @@ -1,8 +1,9 @@ #include "d/t/d_t_defeat_boss.h" -#include "d/flag/storyflag_manager.h" -#include "d/flag/sceneflag_manager.h" -#include "d/flag/dungeonflag_manager.h" + #include "common.h" +#include "d/flag/dungeonflag_manager.h" +#include "d/flag/sceneflag_manager.h" +#include "d/flag/storyflag_manager.h" SPECIAL_ACTOR_PROFILE(TAG_DEFEAT_BOSS, dTgDefeatBoss_c, fProfile::TAG_DEFEAT_BOSS, 0x29E, 0, 0); @@ -10,58 +11,36 @@ void dTgDefeatBoss_c::fn_494_C0() { mID = (fBaseID_e)0x3; return; - +void dTgDefeatBoss_c::getDungeonFlagIndex(u32 &outFlagIdx) { + outFlagIdx = 0x3; } -bool dTgDefeatBoss_c::fn_494_D0() {//checks if valid dungeion flag? - - DungeonflagManager* pDVar2; - u16 sVar4; - - fn_494_C0(); - pDVar2 = DungeonflagManager::sInstance; - sVar4 = pDVar2->getCounterOrFlag(mID, (u32)8); - - return sVar4 != 0; - +bool dTgDefeatBoss_c::checkDungeonFlag() { + u32 dungeonFlagIdx; + getDungeonFlagIndex(dungeonFlagIdx); + return DungeonflagManager::sInstance->getCounterOrFlag(dungeonFlagIdx, 8) != 0; } -bool dTgDefeatBoss_c::init() { - - u16 uVar1; - u16 uVar2; - u16 iVar3; - u16 bVar4; - u32 uVar5; - u16 counterIdx; - - bVar4 = fn_494_D0(); - if (bVar4) { - uVar1 = 2; +int dTgDefeatBoss_c::create() { + if (checkDungeonFlag()) { + return FAILED; } - else { - uVar5 = fn_494_360(); - var8_1 = uVar5; - uVar2 = getSceneflag(); - if ((uVar2 & 0xffff) > 0xfe) { - var8_1 = 0xff; - } - uVar5 = fn_494_380(); - var8_2 = uVar5; - counterIdx = getStoryflag(); - iVar3 = StoryflagManager::sInstance->checkFlagValid(counterIdx); - if (iVar3 == 0) { - var8_2 = 0xff; - } - if (var8_1 == -1 && var8_2 == -1) { - uVar1 = 2; - } - else { - uVar1 = 1; - } - } - return uVar1; + mSceneflagPolarity = getSceneflagPolarity(); + if (getSceneflag() >= 0xFF) { + mSceneflagPolarity = -1; + } + + mStoryflagPolarity = getStoryflagPolarity(); + if (!StoryflagManager::sInstance->checkFlagValid(getStoryflag())) { + mStoryflagPolarity = -1; + } + + if (mSceneflagPolarity == -1 && mStoryflagPolarity == -1) { + return FAILED; + } + + return SUCCEEDED; } int dTgDefeatBoss_c::update() { @@ -85,24 +64,28 @@ int dTgDefeatBoss_c::update() { SceneflagManager::sInstance->setFlag (/*SceneflagManager::sInstance,*/ (u16)/*(param_1->base).members.roomid*/mRoomID & 0xffff, (u16)uVar2 & 0xffff); - break; +int dTgDefeatBoss_c::actorExecute() { + if (checkDungeonFlag()) { + switch (mSceneflagPolarity) { + case 0x0: { + SceneflagManager::sInstance->unsetFlag(mRoomID, getSceneflag()); + } break; + case 0x1: { + SceneflagManager::sInstance->setFlag(mRoomID, getSceneflag()); + } break; } - //pSVar1 = StoryflagManager::sInstance; - switch (var8_2) { - case 0x0: - pSVar1 = StoryflagManager::sInstance; - SVar3 = getStoryflag(); - pSVar1->unsetFlag(SVar3); - break; - case 0x1: - pSVar1 = StoryflagManager::sInstance; - SVar3 = getStoryflag(); - pSVar1->setFlag(SVar3); - break; + switch (mStoryflagPolarity) { + case 0x0: { + StoryflagManager *pStoryflagMgr = StoryflagManager::sInstance; + pStoryflagMgr->unsetFlag(getStoryflag()); + } break; + case 0x1: { + StoryflagManager *pStoryflagMgr = StoryflagManager::sInstance; + pStoryflagMgr->setFlag(getStoryflag()); + } break; } fBase_c::deleteRequest(); } - return SUCCEEDED; } @@ -111,12 +94,12 @@ u16 dTgDefeatBoss_c::getSceneflag() { } u16 dTgDefeatBoss_c::fn_494_360() { - +s32 dTgDefeatBoss_c::getSceneflagPolarity() { return mParams >> 0x8 & 0x1; } -u16 dTgDefeatBoss_c::getStoryflag() { +u32 dTgDefeatBoss_c::getStoryflag() { return mParams >> 9 & 0xffff; } From ea5931c780b09a287746b2958d6be7a55d9dda96 Mon Sep 17 00:00:00 2001 From: Cole Barker Date: Mon, 23 Feb 2026 21:23:10 -0500 Subject: [PATCH 4/4] Applied suggestions and removed leftover code --- .../SOUE01/rels/d_t_defeat_bossNP/symbols.txt | 3 --- include/d/t/d_t_defeat_boss.h | 12 +++------ src/REL/d/t/d_t_defeat_boss.cpp | 27 ++----------------- 3 files changed, 6 insertions(+), 36 deletions(-) diff --git a/config/SOUE01/rels/d_t_defeat_bossNP/symbols.txt b/config/SOUE01/rels/d_t_defeat_bossNP/symbols.txt index 732d3c42..b68a2c57 100644 --- a/config/SOUE01/rels/d_t_defeat_bossNP/symbols.txt +++ b/config/SOUE01/rels/d_t_defeat_bossNP/symbols.txt @@ -2,9 +2,6 @@ _prolog = .text:0x00000000; // type:function size:0x2C scope:global _epilog = .text:0x00000030; // type:function size:0x2C scope:global _unresolved = .text:0x00000060; // type:function size:0x4 scope:global dTgDefeatBoss_c_classInit__Fv = .text:0x00000070; // type:function size:0x4C -fn_494_C0__15dTgDefeatBoss_cFv = .text:0x000000C0; // type:function size:0xC -fn_494_D0__15dTgDefeatBoss_cFv = .text:0x000000D0; // type:function size:0x84 -init__15dTgDefeatBoss_cFv = .text:0x00000160; // type:function size:0xCC getDungeonFlagIndex__15dTgDefeatBoss_cFRUl = .text:0x000000C0; // type:function size:0xC checkDungeonFlag__15dTgDefeatBoss_cFv = .text:0x000000D0; // type:function size:0x84 create__15dTgDefeatBoss_cFv = .text:0x00000160; // type:function size:0xCC diff --git a/include/d/t/d_t_defeat_boss.h b/include/d/t/d_t_defeat_boss.h index 1caa51a6..dfb3d022 100644 --- a/include/d/t/d_t_defeat_boss.h +++ b/include/d/t/d_t_defeat_boss.h @@ -7,20 +7,16 @@ class dTgDefeatBoss_c : public dTg_c { public: dTgDefeatBoss_c() {} virtual ~dTgDefeatBoss_c() {} - virtual int update() override; u16 getSceneflag(); - u16 fn_494_360(); - u16 getStoryflag(); - u16 fn_494_380(); + s32 getSceneflagPolarity(); + u32 getStoryflag(); + s32 getStoryflagPolarity(); static void getDungeonFlagIndex(u32 &outFlagIdx); bool checkDungeonFlag(); virtual int create() override; virtual int actorExecute() override; - u16 getSceneflag(); - s32 getSceneflagPolarity(); - u32 getStoryflag(); - s32 getStoryflagPolarity(); + private: diff --git a/src/REL/d/t/d_t_defeat_boss.cpp b/src/REL/d/t/d_t_defeat_boss.cpp index b088493f..3ca33716 100644 --- a/src/REL/d/t/d_t_defeat_boss.cpp +++ b/src/REL/d/t/d_t_defeat_boss.cpp @@ -7,10 +7,7 @@ SPECIAL_ACTOR_PROFILE(TAG_DEFEAT_BOSS, dTgDefeatBoss_c, fProfile::TAG_DEFEAT_BOSS, 0x29E, 0, 0); -void dTgDefeatBoss_c::fn_494_C0() { - mID = (fBaseID_e)0x3; - return; void dTgDefeatBoss_c::getDungeonFlagIndex(u32 &outFlagIdx) { outFlagIdx = 0x3; } @@ -43,27 +40,7 @@ int dTgDefeatBoss_c::create() { return SUCCEEDED; } -int dTgDefeatBoss_c::update() { - StoryflagManager* pSVar1; - bool bVar4; - u16 uVar2; - /*StoryFlags*/int SVar3; - - bVar4 = fn_494_D0(); - if (bVar4) { - switch (var8_1) { - case 0x0: - uVar2 = getSceneflag(); - SceneflagManager::sInstance->unsetFlag - (/*SceneflagManager::sInstance,*/ (u16)/*(param_1->base).members.roomid*/(mRoomID & 0xffff), - (u16)(uVar2 & 0xffff)); - break; - case 0x1: - uVar2 = getSceneflag(); - SceneflagManager::sInstance->setFlag - (/*SceneflagManager::sInstance,*/ (u16)/*(param_1->base).members.roomid*/mRoomID & 0xffff, - (u16)uVar2 & 0xffff); int dTgDefeatBoss_c::actorExecute() { if (checkDungeonFlag()) { switch (mSceneflagPolarity) { @@ -93,7 +70,7 @@ u16 dTgDefeatBoss_c::getSceneflag() { return mParams & 0xff; } -u16 dTgDefeatBoss_c::fn_494_360() { + s32 dTgDefeatBoss_c::getSceneflagPolarity() { return mParams >> 0x8 & 0x1; @@ -103,7 +80,7 @@ u32 dTgDefeatBoss_c::getStoryflag() { return mParams >> 9 & 0xffff; } -u16 dTgDefeatBoss_c::fn_494_380() { +s32 dTgDefeatBoss_c::getStoryflagPolarity() { return (mParams >> 0x19) & 0x1;