Merge pull request #299 from coleslaw456/main

(WIP) d_t_defeat_boss
This commit is contained in:
robojumper
2026-03-01 20:54:34 +01:00
committed by GitHub
3 changed files with 109 additions and 9 deletions
@@ -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
+15
View File
@@ -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
+85
View File
@@ -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;
}