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