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; }