Merge pull request #106 from robojumper/d_a_obj_underground_switch

d_a_obj_underground_switch with a single regswap
This commit is contained in:
robojumper
2024-11-14 22:57:16 +01:00
committed by GitHub
12 changed files with 212 additions and 67 deletions
@@ -18,8 +18,5 @@ REL/d/a/obj/d_a_obj_junk_repairing.cpp:
.text start:0x000000F0 end:0x00000D08
.ctors start:0x00000000 end:0x00000004
.rodata start:0x00000000 end:0x00000030
.data start:0x00000000 end:0x000001C8
.data start:0x00000000 end:0x000001F0
.bss start:0x00000008 end:0x00000060
REL/d/a/obj/d_a_obj_junk_repairing_data.cpp:
.data start:0x000001C8 end:0x000001F0
@@ -54,9 +54,9 @@ __vt__82sStateMgr_c<13dAcOJunkRep_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sSta
__vt__29sFStateFct_c<13dAcOJunkRep_c> = .data:0x00000118; // type:object size:0x14
__vt__26sFState_c<13dAcOJunkRep_c> = .data:0x00000130; // type:object size:0x18
__vt__17dMyShadowCircle_c = .data:0x00000148; // type:object size:0xC
lbl_116_data_194 = .data:0x00000194; // type:object size:0x34 scope:local
sMdlName1__13dAcOJunkRep_c = .data:0x000001C8; // type:object size:0x14
sMdlName2__13dAcOJunkRep_c = .data:0x000001DC; // type:object size:0x14
__vt__28sFStateID_c<13dAcOJunkRep_c> = .data:0x00000194; // type:object size:0x34
@STRING@getMdlName1__13dAcOJunkRep_cFv = .data:0x000001C8; // type:object size:0x11 data:string
@STRING@getMdlName2__13dAcOJunkRep_cFv = .data:0x000001DC; // type:object size:0x12 data:string
__global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global
lbl_116_bss_8 = .bss:0x00000008; // type:object size:0x10 scope:local
StateID_Wait__13dAcOJunkRep_c = .bss:0x00000018; // type:object size:0x30 data:4byte
@@ -17,3 +17,6 @@ REL/global_destructor_chain.c:
REL/d/a/obj/d_a_obj_underground_switch.cpp:
.text start:0x000000F0 end:0x00001258
.ctors start:0x00000000 end:0x00000004
.rodata start:0x00000000 end:0x00000028
.data start:0x00000000 end:0x00000270
.bss start:0x00000008 end:0x000000C8
@@ -8,14 +8,14 @@ __dt__27sFState_c<14dAcOUgSwitch_c>Fv = .text:0x000001E0; // type:function size:
__dt__30sFStateFct_c<14dAcOUgSwitch_c>Fv = .text:0x00000240; // type:function size:0x6C
__dt__83sStateMgr_c<14dAcOUgSwitch_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x000002B0; // type:function size:0xA0
__dt__53sFStateMgr_c<14dAcOUgSwitch_c,20sStateMethodUsr_FI_c>Fv = .text:0x00000350; // type:function size:0xA4
fn_621_400 = .text:0x00000400; // type:function size:0xF4
fn_621_500 = .text:0x00000500; // type:function size:0x184
createHeap__14dAcOUgSwitch_cFv = .text:0x00000400; // type:function size:0xF4
create__14dAcOUgSwitch_cFv = .text:0x00000500; // type:function size:0x184
changeState__83sStateMgr_c<14dAcOUgSwitch_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x00000690; // type:function size:0x10
fn_621_6A0 = .text:0x000006A0; // type:function size:0x8
fn_621_6B0 = .text:0x000006B0; // type:function size:0x30
doDelete__14dAcOUgSwitch_cFv = .text:0x000006A0; // type:function size:0x8
actorExecute__14dAcOUgSwitch_cFv = .text:0x000006B0; // type:function size:0x30
executeState__83sStateMgr_c<14dAcOUgSwitch_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x000006E0; // type:function size:0x10
fn_621_6F0 = .text:0x000006F0; // type:function size:0x128
fn_621_820 = .text:0x00000820; // type:function size:0x28
actorExecuteInEvent__14dAcOUgSwitch_cFv = .text:0x000006F0; // type:function size:0x128
draw__14dAcOUgSwitch_cFv = .text:0x00000820; // type:function size:0x28
initializeState_Off__14dAcOUgSwitch_cFv = .text:0x00000850; // type:function size:0x14
executeState_Off__14dAcOUgSwitch_cFv = .text:0x00000870; // type:function size:0x80
finalizeState_Off__14dAcOUgSwitch_cFv = .text:0x000008F0; // type:function size:0x4
@@ -25,7 +25,7 @@ finalizeState_Active__14dAcOUgSwitch_cFv = .text:0x00000AD0; // type:function si
initializeState_On__14dAcOUgSwitch_cFv = .text:0x00000AE0; // type:function size:0x8C
executeState_On__14dAcOUgSwitch_cFv = .text:0x00000B70; // type:function size:0xA0
finalizeState_On__14dAcOUgSwitch_cFv = .text:0x00000C10; // type:function size:0x4
fn_621_C20 = .text:0x00000C20; // type:function size:0x20
setVariant__14dAcOUgSwitch_cFi = .text:0x00000C20; // type:function size:0x20
__dt__14dAcOUgSwitch_cFv = .text:0x00000C40; // type:function size:0xD8
getStateID__83sStateMgr_c<14dAcOUgSwitch_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x00000D20; // type:function size:0x10
build__30sFStateFct_c<14dAcOUgSwitch_c>FRC12sStateIDIf_c = .text:0x00000D30; // type:function size:0x60
@@ -48,24 +48,24 @@ isSameName__29sFStateID_c<14dAcOUgSwitch_c>CFPCc = .text:0x000011D0; // type:fun
_ctors = .ctors:0x00000000; // type:label scope:global
_dtors = .dtors:0x00000000; // type:label scope:global
__destroy_global_chain_reference = .dtors:0x00000000; // type:object size:0x4 scope:global
lbl_621_rodata_0 = .rodata:0x00000000; // type:object size:0x18 data:float
lbl_621_rodata_18 = .rodata:0x00000018; // type:object size:0x4 data:float
lbl_621_rodata_1C = .rodata:0x0000001C; // type:object size:0x4 data:float
lbl_621_rodata_20 = .rodata:0x00000020; // type:object size:0x4 data:float
lbl_621_rodata_24 = .rodata:0x00000024; // type:object size:0x4 data:float
lbl_621_rodata_0 = .rodata:0x00000000; // type:object size:0x18 scope:local data:float
lbl_621_rodata_18 = .rodata:0x00000018; // type:object size:0x4 scope:local data:float
lbl_621_rodata_1C = .rodata:0x0000001C; // type:object size:0x4 scope:local data:float
lbl_621_rodata_20 = .rodata:0x00000020; // type:object size:0x4 scope:local data:float
lbl_621_rodata_24 = .rodata:0x00000024; // type:object size:0x4 scope:local data:float
g_profile_OBJ_UG_SWITCH = .data:0x00000000; // type:object size:0x10 data:4byte
lbl_621_data_10 = .data:0x00000010; // type:object size:0xC
lbl_621_data_1C = .data:0x0000001C; // type:object size:0x14
lbl_621_data_30 = .data:0x00000030; // type:object size:0x1C data:string
lbl_621_data_4C = .data:0x0000004C; // type:object size:0x1C
lbl_621_data_68 = .data:0x00000068; // type:object size:0x80
lbl_621_data_E8 = .data:0x000000E8; // type:object size:0x30
lbl_621_data_118 = .data:0x00000118; // type:object size:0x30
lbl_621_data_148 = .data:0x00000148; // type:object size:0x18
lbl_621_data_160 = .data:0x00000160; // type:object size:0xDC
lbl_621_data_23C = .data:0x0000023C; // type:object size:0x34
lbl_621_data_10 = .data:0x00000010; // type:object size:0xC scope:local
lbl_621_data_1C = .data:0x0000001C; // type:object size:0x14 scope:local
lbl_621_data_30 = .data:0x00000030; // type:object size:0x1C scope:local data:string
lbl_621_data_4C = .data:0x0000004C; // type:object size:0x1C scope:local
__vt__14dAcOUgSwitch_c = .data:0x00000068; // type:object size:0x80
__vt__53sFStateMgr_c<14dAcOUgSwitch_c,20sStateMethodUsr_FI_c> = .data:0x000000E8; // type:object size:0x30
__vt__83sStateMgr_c<14dAcOUgSwitch_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x00000118; // type:object size:0x30
__vt__30sFStateFct_c<14dAcOUgSwitch_c> = .data:0x00000148; // type:object size:0x14
__vt__27sFState_c<14dAcOUgSwitch_c> = .data:0x00000160; // type:object size:0x18
__vt__29sFStateID_c<14dAcOUgSwitch_c> = .data:0x0000023C; // type:object size:0x34
__global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global
lbl_621_bss_8 = .bss:0x00000008; // type:object size:0x10 data:4byte
lbl_621_bss_18 = .bss:0x00000018; // type:object size:0x40 data:4byte
lbl_621_bss_58 = .bss:0x00000058; // type:object size:0x40 data:4byte
lbl_621_bss_98 = .bss:0x00000098; // type:object size:0x30 data:4byte
lbl_621_bss_8 = .bss:0x00000008; // type:object size:0x10 scope:local data:4byte
StateID_Off__14dAcOUgSwitch_c = .bss:0x00000018; // type:object size:0x30 data:4byte
StateID_Active__14dAcOUgSwitch_c = .bss:0x00000058; // type:object size:0x30 data:4byte
StateID_On__14dAcOUgSwitch_c = .bss:0x00000098; // type:object size:0x30 data:4byte
+1 -1
View File
@@ -3573,7 +3573,7 @@ dBase_c__changeOwnEvent = .text:0x8009FCE0; // type:function size:0x11C
fn_8009FE00 = .text:0x8009FE00; // type:function size:0x124
isInEvent__12EventManagerFP9dAcBase_cPCc = .text:0x8009FF30; // type:function size:0x10C
fn_800A0040 = .text:0x800A0040; // type:function size:0x114
dBase_c__finishEvent = .text:0x800A0160; // type:function size:0xB8
finishEvent__12EventManagerFP9dAcBase_cPCc = .text:0x800A0160; // type:function size:0xB8
getCurrentExecutedEVNT = .text:0x800A0220; // type:function size:0x64
fn_800A0290 = .text:0x800A0290; // type:function size:0x38
fn_800A02D0 = .text:0x800A02D0; // type:function size:0x4
+1 -17
View File
@@ -273,16 +273,6 @@ def Rel(status, rel_name, cpp_name, extra_cflags=[]):
}
def MultiRel(rel_name, objects, extra_cflags=[]):
return {
"lib": rel_name,
"mw_version": "Wii/1.5",
"cflags": cflags_rel + extra_cflags,
"host": False,
"objects": objects,
}
def EGGLib(lib_name, objects):
return {
"lib": lib_name,
@@ -1441,13 +1431,7 @@ config.libs = [
"REL/d/a/obj/d_a_obj_item_heart_container.cpp",
),
Rel(NonMatching, "d_a_obj_ivy_rope", "REL/d/a/obj/d_a_obj_ivy_rope.cpp"),
MultiRel(
"d_a_obj_junk_repairing",
[
Object(Matching, "REL/d/a/obj/d_a_obj_junk_repairing.cpp"),
Object(Matching, "REL/d/a/obj/d_a_obj_junk_repairing_data.cpp"),
],
),
Rel(Matching, "d_a_obj_junk_repairing", "REL/d/a/obj/d_a_obj_junk_repairing.cpp"),
Rel(NonMatching, "d_a_obj_kanban_stone", "REL/d/a/obj/d_a_obj_kanban_stone.cpp"),
Rel(NonMatching, "d_a_obj_kibako", "REL/d/a/obj/d_a_obj_kibako.cpp"),
Rel(NonMatching, "d_a_obj_kumite_wall", "REL/d/a/obj/d_a_obj_kumite_wall.cpp"),
+6 -2
View File
@@ -24,8 +24,12 @@ public:
private:
static const f32 sSomeFloat;
static char sMdlName1[];
static char sMdlName2[];
inline const char *getMdlName1() {
return "JunkRepairobject";
}
inline const char *getMdlName2() {
return "JunkRepairobjectB";
}
bool loadMdl(m3d::smdl_c &mdl, const char *name);
void realizeState();
+23 -2
View File
@@ -2,20 +2,41 @@
#define D_A_OBJ_UNDERGROUND_SWITCH_H
#include "d/a/obj/d_a_obj_base.h"
#include "m/m3d/m_anmmatclr.h"
#include "m/m3d/m_smdl.h"
#include "nw4r/g3d/g3d_resfile.h"
#include "nw4r/g3d/g3d_resmdl.h"
#include "s/s_State.hpp"
#include "s/s_StateMgr.hpp"
class dAcOUgSwitch_c : public dAcObjBase_c {
public:
dAcOUgSwitch_c() : mStateMgr(*this, sStateID::null) {}
virtual ~dAcOUgSwitch_c() {}
virtual bool createHeap() override;
virtual int create() override;
virtual int doDelete() override;
virtual int actorExecute() override;
virtual int actorExecuteInEvent() override;
virtual int draw() override;
STATE_FUNC_DECLARE(dAcOUgSwitch_c, Off);
STATE_FUNC_DECLARE(dAcOUgSwitch_c, Active);
STATE_FUNC_DECLARE(dAcOUgSwitch_c, On);
private:
/* 0x??? */ STATE_MGR_DECLARE(dAcOUgSwitch_c);
void setVariant(int variant);
static const f32 sActivationRadius;
static const u8 sEventTimer;
/* 0x330 */ nw4r::g3d::ResFile mRes;
/* 0x334 */ m3d::smdl_c mMdl;
/* 0x350 */ STATE_MGR_DECLARE(dAcOUgSwitch_c);
/* 0x38C */ m3d::anmMatClr_c mAnmClr;
/* 0x3B8 */ int mVariant;
/* 0x3BC */ u8 mActiveSceneFlag;
/* 0x3BD */ u8 field_0x3BD;
/* 0x3BE */ u8 mOnEventTimer;
};
#endif
+1
View File
@@ -11,6 +11,7 @@ class dAcBase_c;
class EventManager {
public:
static bool isInEvent(dAcBase_c *actor, const char *eventName);
static bool finishEvent(dAcBase_c *actor, const char *eventName);
static bool alsoSetAsCurrentEvent(dAcBase_c *actor, Event *event, void *unknown);
static EventManager *sInstance;
+2 -2
View File
@@ -20,10 +20,10 @@ bool dAcOJunkRep_c::getState() {
bool dAcOJunkRep_c::createHeap() {
mResFile = getOarcResFile("Junk");
if (!loadMdl(mModel1, sMdlName1)) {
if (!loadMdl(mModel1, getMdlName1())) {
return false;
}
if (!loadMdl(mModel2, sMdlName2)) {
if (!loadMdl(mModel2, getMdlName2())) {
return false;
}
@@ -1,4 +0,0 @@
#include "d/a/obj/d_a_obj_junk_repairing.h"
char dAcOJunkRep_c::sMdlName1[] = "JunkRepairobject";
char dAcOJunkRep_c::sMdlName2[] = "JunkRepairobjectB";
+145 -6
View File
@@ -1,17 +1,156 @@
#include "d/a/obj/d_a_obj_underground_switch.h"
#include "common.h"
#include "d/a/d_a_player.h"
#include "d/a/obj/d_a_obj_base.h"
#include "d/flag/sceneflag_manager.h"
#include "m/m_vec.h"
#include "nw4r/g3d/g3d_resanmclr.h"
#include "nw4r/g3d/g3d_resmdl.h"
#include "toBeSorted/event_manager.h"
SPECIAL_ACTOR_PROFILE(OBJ_UG_SWITCH, dAcOUgSwitch_c, fProfile::OBJ_UG_SWITCH, 0x15A, 0, 3);
STATE_DEFINE(dAcOUgSwitch_c, Off);
STATE_DEFINE(dAcOUgSwitch_c, Active);
STATE_DEFINE(dAcOUgSwitch_c, On);
void dAcOUgSwitch_c::initializeState_Off() {}
void dAcOUgSwitch_c::executeState_Off() {}
const f32 dAcOUgSwitch_c::sActivationRadius = 40.0f;
const u8 dAcOUgSwitch_c::sEventTimer = 15;
bool dAcOUgSwitch_c::createHeap() {
// Why. Regswap...
void *data = getOarcResFile("SwitchPass");
mRes = data;
nw4r::g3d::ResMdl mdl = mRes.GetResMdl("SwitchPass");
TRY_CREATE(mMdl.create(mdl, &heap_allocator, 0x120));
mRes = data;
mdl = mRes.GetResMdl("SwitchPass");
nw4r::g3d::ResAnmClr clr = mRes.GetResAnmClr("SwitchPass_Light");
TRY_CREATE(mAnmClr.create(mdl, clr, &heap_allocator, nullptr, 1));
mMdl.setAnm(mAnmClr);
return true;
}
int dAcOUgSwitch_c::create() {
mActiveSceneFlag = params & 0xFF;
field_0x3BD = (params >> 8) & 0xFF;
setVariant((params >> 16) & 0xF);
if (!initAllocatorWork1Heap(0x1000, "dAcOUgSwitch_c::m_allocator", 0x20)) {
return FAILED;
}
mOnEventTimer = 0;
updateMatrix();
mMdl.setLocalMtx(mWorldMtx);
mMdl.setPriorityDraw(0x82, 0x7F);
if (!SceneflagManager::sInstance->checkBoolFlag(roomid, mActiveSceneFlag)) {
if (mVariant == 0) {
mStateMgr.changeState(StateID_Active);
} else {
mStateMgr.changeState(StateID_Off);
}
} else {
mStateMgr.changeState(StateID_On);
}
boundingBox.Set(mVec3_c(-50.0f, -20.0f, -50.0f), mVec3_c(50.0f, 20.0f, 50.0f));
return SUCCEEDED;
}
int dAcOUgSwitch_c::doDelete() {
return SUCCEEDED;
}
int dAcOUgSwitch_c::actorExecute() {
mStateMgr.executeState();
return SUCCEEDED;
}
int dAcOUgSwitch_c::actorExecuteInEvent() {
if (EventManager::isInEvent(this, "OnSwitchCount")) {
if (mOnEventTimer != 0 && --mOnEventTimer == 0) {
if (mVariant == 0 && !SceneflagManager::sInstance->checkBoolFlag(roomid, mActiveSceneFlag)) {
SceneflagManager::sInstance->setFlag(roomid, mActiveSceneFlag);
} else {
if (mVariant == 1 && !SceneflagManager::sInstance->checkBoolFlag(roomid, field_0x3BD)) {
SceneflagManager::sInstance->setFlag(roomid, field_0x3BD);
}
}
EventManager::finishEvent(this, "OnSwitchCount");
}
return SUCCEEDED;
}
return NOT_READY;
}
int dAcOUgSwitch_c::draw() {
drawModelType1(&mMdl);
return SUCCEEDED;
}
void dAcOUgSwitch_c::initializeState_Off() {
mAnmClr.setFrame(0.0f, 0);
}
void dAcOUgSwitch_c::executeState_Off() {
if (mVariant == 1 && SceneflagManager::sInstance->checkBoolFlag(roomid, mActiveSceneFlag)) {
mStateMgr.changeState(StateID_Active);
}
}
void dAcOUgSwitch_c::finalizeState_Off() {}
void dAcOUgSwitch_c::initializeState_Active() {}
void dAcOUgSwitch_c::executeState_Active() {}
void dAcOUgSwitch_c::initializeState_Active() {
mAnmClr.setFrame(1.0f, 0);
}
void dAcOUgSwitch_c::executeState_Active() {
if (mVariant == 0 && !SceneflagManager::sInstance->checkBoolFlag(roomid, mActiveSceneFlag)) {
if (isWithinPlayerRadius(sActivationRadius) && dAcPy_c::LINK->checkActionFlags(dAcPy_c::FLG0_CRAWLING)) {
mOnEventTimer = sEventTimer;
playSound(0xB12);
mStateMgr.changeState(StateID_On);
}
}
if (mVariant == 1) {
if (!SceneflagManager::sInstance->checkBoolFlag(roomid, field_0x3BD)) {
if (isWithinPlayerRadius(sActivationRadius) && dAcPy_c::LINK->checkActionFlags(dAcPy_c::FLG0_CRAWLING)) {
mOnEventTimer = sEventTimer;
playSound(0xB13);
mStateMgr.changeState(StateID_On);
}
}
if (!SceneflagManager::sInstance->checkBoolFlag(roomid, mActiveSceneFlag)) {
mStateMgr.changeState(StateID_Off);
}
}
}
void dAcOUgSwitch_c::finalizeState_Active() {}
void dAcOUgSwitch_c::initializeState_On() {}
void dAcOUgSwitch_c::executeState_On() {}
void dAcOUgSwitch_c::initializeState_On() {
mAnmClr.setFrame(2.0f, 0);
static volatile u32 FLAGS_1 = 0x00000001;
static u32 FLAGS_2 = 0x00100001;
u32 f1 = FLAGS_1;
u32 f2 = FLAGS_2;
Event event = Event("OnSwitchCount", 100, f2 & ~f1, nullptr, nullptr);
EventManager::alsoSetAsCurrentEvent(this, &event, nullptr);
}
void dAcOUgSwitch_c::executeState_On() {
if (!SceneflagManager::sInstance->checkBoolFlag(roomid, mActiveSceneFlag)) {
if (mVariant == 0) {
mStateMgr.changeState(StateID_Active);
} else {
mStateMgr.changeState(StateID_Off);
}
}
}
void dAcOUgSwitch_c::finalizeState_On() {}
void dAcOUgSwitch_c::setVariant(int variant) {
if (variant == 0) {
mVariant = 0;
} else {
mVariant = 1;
}
}