diff --git a/config/SOUE01/rels/d_t_touchNP/splits.txt b/config/SOUE01/rels/d_t_touchNP/splits.txt index c47dbcee..31a087ad 100644 --- a/config/SOUE01/rels/d_t_touchNP/splits.txt +++ b/config/SOUE01/rels/d_t_touchNP/splits.txt @@ -17,3 +17,6 @@ REL/global_destructor_chain.c: REL/d/t/d_t_touch.cpp: .text start:0x000000F0 end:0x00000BB8 .ctors start:0x00000000 end:0x00000004 + .rodata start:0x00000000 end:0x00000008 + .data start:0x00000000 end:0x00000200 + .bss start:0x00000008 end:0x00000048 diff --git a/config/SOUE01/rels/d_t_touchNP/symbols.txt b/config/SOUE01/rels/d_t_touchNP/symbols.txt index 5f62f15b..d5104afe 100644 --- a/config/SOUE01/rels/d_t_touchNP/symbols.txt +++ b/config/SOUE01/rels/d_t_touchNP/symbols.txt @@ -3,53 +3,53 @@ _epilog = .text:0x00000030; // type:function size:0x2C scope:global _unresolved = .text:0x00000060; // type:function size:0x4 scope:global __register_global_object = .text:0x00000070; // type:function size:0x1C scope:global __destroy_global_chain = .text:0x00000090; // type:function size:0x54 scope:global -TgTouchTag__ctor = .text:0x000000F0; // type:function size:0xAC -fn_565_1A0 = .text:0x000001A0; // type:function size:0x58 -fn_565_200 = .text:0x00000200; // type:function size:0x58 -fn_565_260 = .text:0x00000260; // type:function size:0x6C -fn_565_2D0 = .text:0x000002D0; // type:function size:0xA0 -fn_565_370 = .text:0x00000370; // type:function size:0xA4 -TgTouchTag__init = .text:0x00000420; // type:function size:0xA0 -fn_565_4C0 = .text:0x000004C0; // type:function size:0x10 -fn_565_4D0 = .text:0x000004D0; // type:function size:0x8 -TgTouchTag__update = .text:0x000004E0; // type:function size:0xA0 -fn_565_580 = .text:0x00000580; // type:function size:0x10 -fn_565_590 = .text:0x00000590; // type:function size:0x8 -TgTouchTag__stateWaitEnter = .text:0x000005A0; // type:function size:0xC -TgTouchTag__stateWaitIn = .text:0x000005B0; // type:function size:0x138 -TgTouchTag__decrement = .text:0x000006F0; // type:function size:0x1C -fn_565_710 = .text:0x00000710; // type:function size:0x4 -TgTouchTag__dtor = .text:0x00000720; // type:function size:0xC8 -fn_565_7F0 = .text:0x000007F0; // type:function size:0x10 -fn_565_800 = .text:0x00000800; // type:function size:0x60 -fn_565_860 = .text:0x00000860; // type:function size:0xC -fn_565_870 = .text:0x00000870; // type:function size:0x1C -fn_565_890 = .text:0x00000890; // type:function size:0x1C -fn_565_8B0 = .text:0x000008B0; // type:function size:0x1C -fn_565_8D0 = .text:0x000008D0; // type:function size:0x10 -fn_565_8E0 = .text:0x000008E0; // type:function size:0x10 -fn_565_8F0 = .text:0x000008F0; // type:function size:0x10 -fn_565_900 = .text:0x00000900; // type:function size:0x10 -fn_565_910 = .text:0x00000910; // type:function size:0x10 -fn_565_920 = .text:0x00000920; // type:function size:0x10 -fn_565_930 = .text:0x00000930; // type:function size:0x30 -fn_565_960 = .text:0x00000960; // type:function size:0x30 -fn_565_990 = .text:0x00000990; // type:function size:0x30 -fn_565_9C0 = .text:0x000009C0; // type:function size:0x10C -fn_565_AD0 = .text:0x00000AD0; // type:function size:0x58 -fn_565_B30 = .text:0x00000B30; // type:function size:0x88 +dTgTouchTag_classInit__Fv = .text:0x000000F0; // type:function size:0xAC +__dt__5dTg_cFv = .text:0x000001A0; // type:function size:0x58 +__dt__24sFState_c<11dTgTouchTag>Fv = .text:0x00000200; // type:function size:0x58 +__dt__27sFStateFct_c<11dTgTouchTag>Fv = .text:0x00000260; // type:function size:0x6C +__dt__80sStateMgr_c<11dTgTouchTag,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x000002D0; // type:function size:0xA0 +__dt__50sFStateMgr_c<11dTgTouchTag,20sStateMethodUsr_FI_c>Fv = .text:0x00000370; // type:function size:0xA4 +create__11dTgTouchTagFv = .text:0x00000420; // type:function size:0xA0 +changeState__80sStateMgr_c<11dTgTouchTag,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x000004C0; // type:function size:0x10 +doDelete__11dTgTouchTagFv = .text:0x000004D0; // type:function size:0x8 +actorExecute__11dTgTouchTagFv = .text:0x000004E0; // type:function size:0xA0 +executeState__80sStateMgr_c<11dTgTouchTag,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000580; // type:function size:0x10 +draw__11dTgTouchTagFv = .text:0x00000590; // type:function size:0x8 +initializeState_Wait__11dTgTouchTagFv = .text:0x000005A0; // type:function size:0xC +executeState_Wait__11dTgTouchTagFv = .text:0x000005B0; // type:function size:0x138 +calcTimer__2cMFPUs_Us = .text:0x000006F0; // type:function size:0x1C +finalizeState_Wait__11dTgTouchTagFv = .text:0x00000710; // type:function size:0x4 +__dt__11dTgTouchTagFv = .text:0x00000720; // type:function size:0xC8 +getStateID__80sStateMgr_c<11dTgTouchTag,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x000007F0; // type:function size:0x10 +build__27sFStateFct_c<11dTgTouchTag>FRC12sStateIDIf_c = .text:0x00000800; // type:function size:0x60 +dispose__27sFStateFct_c<11dTgTouchTag>FRP10sStateIf_c = .text:0x00000860; // type:function size:0xC +initialize__24sFState_c<11dTgTouchTag>Fv = .text:0x00000870; // type:function size:0x1C +execute__24sFState_c<11dTgTouchTag>Fv = .text:0x00000890; // type:function size:0x1C +finalize__24sFState_c<11dTgTouchTag>Fv = .text:0x000008B0; // type:function size:0x1C +initializeState__80sStateMgr_c<11dTgTouchTag,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x000008D0; // type:function size:0x10 +finalizeState__80sStateMgr_c<11dTgTouchTag,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x000008E0; // type:function size:0x10 +refreshState__80sStateMgr_c<11dTgTouchTag,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x000008F0; // type:function size:0x10 +getState__80sStateMgr_c<11dTgTouchTag,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x00000900; // type:function size:0x10 +getNewStateID__80sStateMgr_c<11dTgTouchTag,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x00000910; // type:function size:0x10 +getOldStateID__80sStateMgr_c<11dTgTouchTag,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x00000920; // type:function size:0x10 +finalizeState__26sFStateID_c<11dTgTouchTag>CFR11dTgTouchTag = .text:0x00000930; // type:function size:0x30 +executeState__26sFStateID_c<11dTgTouchTag>CFR11dTgTouchTag = .text:0x00000960; // type:function size:0x30 +initializeState__26sFStateID_c<11dTgTouchTag>CFR11dTgTouchTag = .text:0x00000990; // type:function size:0x30 +__sinit_\d_t_touch_cpp = .text:0x000009C0; // type:function size:0x10C scope:local +__dt__26sFStateID_c<11dTgTouchTag>Fv = .text:0x00000AD0; // type:function size:0x58 +isSameName__26sFStateID_c<11dTgTouchTag>CFPCc = .text:0x00000B30; // type:function size:0x88 _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_565_rodata_0 = .rodata:0x00000000; // type:object size:0x4 -lbl_565_rodata_4 = .rodata:0x00000004; // type:object size:0x4 data:float -lbl_565_data_0 = .data:0x00000000; // type:object size:0x10 data:4byte -lbl_565_data_10 = .data:0x00000010; // type:object size:0x78 -lbl_565_data_88 = .data:0x00000088; // type:object size:0x30 -lbl_565_data_B8 = .data:0x000000B8; // type:object size:0x30 -lbl_565_data_E8 = .data:0x000000E8; // type:object size:0x18 -lbl_565_data_100 = .data:0x00000100; // type:object size:0xCC -lbl_565_data_1CC = .data:0x000001CC; // type:object size:0x34 +ACTIVATORS = .rodata:0x00000000; // type:object size:0x4 scope:local +lbl_565_rodata_4 = .rodata:0x00000004; // type:object size:0x4 scope:local data:float +g_profile_TOUCH_TAG = .data:0x00000000; // type:object size:0x10 data:4byte +__vt__11dTgTouchTag = .data:0x00000010; // type:object size:0x74 +__vt__50sFStateMgr_c<11dTgTouchTag,20sStateMethodUsr_FI_c> = .data:0x00000088; // type:object size:0x30 +__vt__80sStateMgr_c<11dTgTouchTag,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x000000B8; // type:object size:0x30 +__vt__27sFStateFct_c<11dTgTouchTag> = .data:0x000000E8; // type:object size:0x14 +__vt__24sFState_c<11dTgTouchTag> = .data:0x00000100; // type:object size:0x18 +lbl_565_data_1CC = .data:0x000001CC; // type:object size:0x34 scope:local __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global -lbl_565_bss_8 = .bss:0x00000008; // type:object size:0x10 -lbl_565_bss_18 = .bss:0x00000018; // type:object size:0x30 data:4byte +lbl_565_bss_8 = .bss:0x00000008; // type:object size:0x10 scope:local +StateID_Wait__11dTgTouchTag = .bss:0x00000018; // type:object size:0x30 data:4byte diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index c66e65cd..11e55329 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -2899,8 +2899,8 @@ fn_80066E00 = .text:0x80066E00; // type:function size:0x44 fn_80066E50 = .text:0x80066E50; // type:function size:0x108 fn_80066F60 = .text:0x80066F60; // type:function size:0x50 lzSafeDecompress = .text:0x80066FB0; // type:function size:0x64 -matrixCreateFromPosRotYScale = .text:0x80067020; // type:function size:0x138 -checkIfVec3fInMatrix = .text:0x80067160; // type:function size:0x88 +matrixCreateFromPosRotYScale__FR6mMtx_cRC7mVec3_c4mAngRC7mVec3_cP6mMtx_cf = .text:0x80067020; // type:function size:0x138 +checkIfVec3fInMatrix__FRC6mMtx_cRC7mVec3_c = .text:0x80067160; // type:function size:0x88 fn_800671F0 = .text:0x800671F0; // type:function size:0x84 fn_80067280 = .text:0x80067280; // type:function size:0x4 fn_80067290 = .text:0x80067290; // type:function size:0xA8 diff --git a/configure.py b/configure.py index b94f0397..9c0393d1 100644 --- a/configure.py +++ b/configure.py @@ -1463,7 +1463,7 @@ config.libs = [ Rel(Matching, "d_t_timer", "REL/d/t/d_t_timer.cpp"), Rel(Matching, "d_t_time_area_check", "REL/d/t/d_t_time_area_check.cpp"), Rel(NonMatching, "d_t_time_door_beam", "REL/d/t/d_t_time_door_beam.cpp"), - Rel(NonMatching, "d_t_touch", "REL/d/t/d_t_touch.cpp"), + Rel(Matching, "d_t_touch", "REL/d/t/d_t_touch.cpp"), Rel(NonMatching, "d_t_tumble_weed", "REL/d/t/d_t_tumble_weed.cpp"), ] diff --git a/include/d/tg/d_t_mole_prohibit.h b/include/d/tg/d_t_mole_prohibit.h index 090bcc1b..3d10d0e3 100644 --- a/include/d/tg/d_t_mole_prohibit.h +++ b/include/d/tg/d_t_mole_prohibit.h @@ -2,7 +2,6 @@ #define D_T_MOLE_PROHIBIT_H #include -#include #include #include diff --git a/include/d/tg/d_t_touch.h b/include/d/tg/d_t_touch.h new file mode 100644 index 00000000..544e523e --- /dev/null +++ b/include/d/tg/d_t_touch.h @@ -0,0 +1,41 @@ +#ifndef D_T_TOUCH_H +#define D_T_TOUCH_H + +#include +#include +#include +#include + +class dTgTouchTag : public dTg_c { +public: + dTgTouchTag() : mStateMgr(*this, sStateID::null) {} + virtual ~dTgTouchTag() {} + virtual int create() override; + virtual int actorExecute() override; + virtual int draw() override; + virtual int doDelete() override; + + STATE_FUNC_DECLARE(dTgTouchTag, Wait); + +private: + u8 getActivatorIndex() { + return params & 0xF; + } + + u8 getZoneFlag() { + return params >> 0x4; + } + + u8 getChkFlag() { + return params >> 0xC; + } + + STATE_MGR_DECLARE(dTgTouchTag); + mMtx_c mAreaOfEffect; + u16 mFlagTimer; + u8 mActivatorIndex; + u8 mZoneFlag; + u8 mChkFlag; +}; + +#endif diff --git a/include/toBeSorted/area_math.h b/include/toBeSorted/area_math.h new file mode 100644 index 00000000..08b11c35 --- /dev/null +++ b/include/toBeSorted/area_math.h @@ -0,0 +1,11 @@ +#ifndef D_AREA_MATH_H +#define D_AREA_MATH_H + +#include +#include +#include + +void matrixCreateFromPosRotYScale(mMtx_c &, const mVec3_c &, const mAng, const mVec3_c &, mMtx_c *, f32); +bool checkIfVec3fInMatrix(const mMtx_c &, const mVec3_c &); + +#endif diff --git a/src/REL/d/t/d_t_touch.cpp b/src/REL/d/t/d_t_touch.cpp index e69de29b..9d37f45b 100644 --- a/src/REL/d/t/d_t_touch.cpp +++ b/src/REL/d/t/d_t_touch.cpp @@ -0,0 +1,66 @@ +#include +#include +#include +#include + +SPECIAL_ACTOR_PROFILE(TOUCH_TAG, dTgTouchTag, fProfile::TOUCH_TAG, 0x028E, 0, 0); + +STATE_DEFINE(dTgTouchTag, Wait); + +const static u16 ACTIVATORS[] = { + fProfile::BOMB, + fProfile::BOMB, +}; + +int dTgTouchTag::create() { + mActivatorIndex = !(getActivatorIndex() == 0xF) ? getActivatorIndex() : 0; + mZoneFlag = getZoneFlag(); + mChkFlag = getChkFlag(); + matrixCreateFromPosRotYScale(mAreaOfEffect, position, rotation.y, scale, nullptr, 0.0f); + mStateMgr.changeState(StateID_Wait); + return SUCCEEDED; +} + +int dTgTouchTag::doDelete() { + return SUCCEEDED; +} + +int dTgTouchTag::actorExecute() { + if (mChkFlag != 0xFF && SceneflagManager::sInstance->checkBoolFlag(roomid, mChkFlag)) { + SceneflagManager::sInstance->unsetFlag(roomid, mZoneFlag); + return SUCCEEDED; + } + + mStateMgr.executeState(); + return SUCCEEDED; +} + +int dTgTouchTag::draw() { + return SUCCEEDED; +} + +void dTgTouchTag::initializeState_Wait() { + mFlagTimer = 0; +} +void dTgTouchTag::executeState_Wait() { + dAcBase_c *actor = static_cast(fManager_c::searchBaseByProfName(ACTIVATORS[mActivatorIndex], nullptr)); + + while (actor != nullptr) { + if (actor->roomid == roomid && checkIfVec3fInMatrix(mAreaOfEffect, actor->position)) { + mFlagTimer = 5; + if (mZoneFlag != 0xFF) { + SceneflagManager::sInstance->setFlag(roomid, mZoneFlag); + } + break; + } + + actor = static_cast(fManager_c::searchBaseByProfName(ACTIVATORS[mActivatorIndex], actor)); + } + + if (cM::calcTimer(&mFlagTimer) == 0) { + if (mZoneFlag != 0xFF && SceneflagManager::sInstance->checkBoolFlag(roomid, mZoneFlag)) { + SceneflagManager::sInstance->unsetFlag(roomid, mZoneFlag); + } + } +} +void dTgTouchTag::finalizeState_Wait() {}