diff --git a/config/SOUE01/rels/d_t_defeat_bossNP/symbols.txt b/config/SOUE01/rels/d_t_defeat_bossNP/symbols.txt index 7c8d6338..b68a2c57 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 +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 +getSceneflagPolarity__15dTgDefeatBoss_cFv = .text:0x00000360; // type:function size:0xC +getStoryflag__15dTgDefeatBoss_cFv = .text:0x00000370; // 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 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..dfb3d022 100644 --- a/include/d/t/d_t_defeat_boss.h +++ b/include/d/t/d_t_defeat_boss.h @@ -7,8 +7,23 @@ class dTgDefeatBoss_c : public dTg_c { public: dTgDefeatBoss_c() {} virtual ~dTgDefeatBoss_c() {} + u16 getSceneflag(); + s32 getSceneflagPolarity(); + u32 getStoryflag(); + s32 getStoryflagPolarity(); + static void getDungeonFlagIndex(u32 &outFlagIdx); + bool checkDungeonFlag(); + virtual int create() override; + virtual int actorExecute() override; + + + private: + /* 0xFC */ s8 mSceneflagPolarity; + /* 0xFD */ s8 mStoryflagPolarity; }; + + #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..3ca33716 100644 --- a/src/REL/d/t/d_t_defeat_boss.cpp +++ b/src/REL/d/t/d_t_defeat_boss.cpp @@ -1,3 +1,88 @@ #include "d/t/d_t_defeat_boss.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); + + +void dTgDefeatBoss_c::getDungeonFlagIndex(u32 &outFlagIdx) { + outFlagIdx = 0x3; +} + +bool dTgDefeatBoss_c::checkDungeonFlag() { + u32 dungeonFlagIdx; + getDungeonFlagIndex(dungeonFlagIdx); + return DungeonflagManager::sInstance->getCounterOrFlag(dungeonFlagIdx, 8) != 0; +} + +int dTgDefeatBoss_c::create() { + if (checkDungeonFlag()) { + return FAILED; + } + + 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::actorExecute() { + if (checkDungeonFlag()) { + switch (mSceneflagPolarity) { + case 0x0: { + SceneflagManager::sInstance->unsetFlag(mRoomID, getSceneflag()); + } break; + case 0x1: { + SceneflagManager::sInstance->setFlag(mRoomID, getSceneflag()); + } 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; +} + +u16 dTgDefeatBoss_c::getSceneflag() { + return mParams & 0xff; +} + + +s32 dTgDefeatBoss_c::getSceneflagPolarity() { + return mParams >> 0x8 & 0x1; + +} + +u32 dTgDefeatBoss_c::getStoryflag() { + return mParams >> 9 & 0xffff; +} + +s32 dTgDefeatBoss_c::getStoryflagPolarity() { + + return (mParams >> 0x19) & 0x1; + +} +