From 6b9d1737d481005b925702525efc232a933269e0 Mon Sep 17 00:00:00 2001 From: robojumper Date: Mon, 28 Oct 2024 05:02:53 +0100 Subject: [PATCH 01/10] Fix one of the dowsing_target functions (#84) --- src/toBeSorted/dowsing_target.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/toBeSorted/dowsing_target.cpp b/src/toBeSorted/dowsing_target.cpp index 41acf5bf..0dbf031e 100644 --- a/src/toBeSorted/dowsing_target.cpp +++ b/src/toBeSorted/dowsing_target.cpp @@ -72,12 +72,15 @@ bool DowsingTarget::hasDesertNodeDowsing() { return StoryflagManager::sInstance->getCounterOrFlag(107) && !StoryflagManager::sInstance->getCounterOrFlag(8); } +inline bool checkTrial(u16 itemflag, u16 storyflag) { + return (ItemflagManager::sInstance->getFlagDirect(itemflag) && !StoryflagManager::sInstance->getCounterOrFlag(storyflag)) ? true : false; +} + bool DowsingTarget::hasAnyTrialDowsing() { - // TODO more complicated code - return ItemflagManager::sInstance->getFlag(187) && !StoryflagManager::sInstance->getCounterOrFlag(93) || - ItemflagManager::sInstance->getFlag(188) && !StoryflagManager::sInstance->getCounterOrFlag(97) || - ItemflagManager::sInstance->getFlag(189) && !StoryflagManager::sInstance->getCounterOrFlag(98) || - ItemflagManager::sInstance->getFlag(193) && !StoryflagManager::sInstance->getCounterOrFlag(99); + return checkTrial(187, 93) || + checkTrial(188, 97) || + checkTrial(189, 98) || + checkTrial(193, 99); } bool DowsingTarget::hasSacredWaterDowsing() { From 1d17e35316b4fe989eae438fe55df64647277107 Mon Sep 17 00:00:00 2001 From: robojumper Date: Mon, 28 Oct 2024 05:03:08 +0100 Subject: [PATCH 02/10] d_lyt_meter_drink with regswaps in one function (#83) --- config/SOUE01/splits.txt | 2 + config/SOUE01/symbols.txt | 110 ++--- include/d/lyt/d2d.h | 4 + include/d/lyt/meter/d_lyt_meter_drink.h | 57 ++- include/m/m2d.h | 6 + include/toBeSorted/file_manager.h | 24 +- src/d/lyt/meter/d_lyt_meter_drink.cpp | 542 ++++++++++++++++++++++++ src/toBeSorted/file_manager.cpp | 24 +- tools/decompctx.py | 28 +- 9 files changed, 713 insertions(+), 84 deletions(-) diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 4970d2cb..3286d0c4 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -244,7 +244,9 @@ d/lyt/meter/d_lyt_meter_key.cpp: d/lyt/meter/d_lyt_meter_drink.cpp: .text start:0x800E4930 end:0x800E6AC8 .ctors start:0x804DB6F0 end:0x804DB6F4 + .rodata start:0x804E55A0 end:0x804E5640 .data start:0x805148B0 end:0x80514D60 + .sdata2 start:0x80579BA0 end:0x80579BB0 .bss start:0x805AA790 end:0x805AA9D0 d/lyt/meter/d_lyt_meter_remocon_bg.cpp: diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index be65cf08..8eed7f28 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -327,17 +327,17 @@ setSelectedPouchSlot__11FileManagerFUc = .text:0x8000B5F0; // type:function size getSelectedPouchSlot__11FileManagerFv = .text:0x8000B620; // type:function size:0x44 setShieldPouchSlot__11FileManagerFUc = .text:0x8000B670; // type:function size:0x30 getShieldPouchSlot__11FileManagerFv = .text:0x8000B6A0; // type:function size:0x44 -setAirPotionTimer__11FileManagerFs = .text:0x8000B6F0; // type:function size:0x30 +setAirPotionTimer__11FileManagerFUs = .text:0x8000B6F0; // type:function size:0x30 getAirPotionTimer__11FileManagerFv = .text:0x8000B720; // type:function size:0x44 -setAirPotionPlusTimer__11FileManagerFs = .text:0x8000B770; // type:function size:0x30 +setAirPotionPlusTimer__11FileManagerFUs = .text:0x8000B770; // type:function size:0x30 getAirPotionPlusTimer__11FileManagerFv = .text:0x8000B7A0; // type:function size:0x44 -setStaminaPotionTimer__11FileManagerFs = .text:0x8000B7F0; // type:function size:0x30 +setStaminaPotionTimer__11FileManagerFUs = .text:0x8000B7F0; // type:function size:0x30 getStaminaPotionTimer__11FileManagerFv = .text:0x8000B820; // type:function size:0x44 -setStaminaPotionPlusTimer__11FileManagerFs = .text:0x8000B870; // type:function size:0x30 +setStaminaPotionPlusTimer__11FileManagerFUs = .text:0x8000B870; // type:function size:0x30 getStaminaPotionPlusTimer__11FileManagerFv = .text:0x8000B8A0; // type:function size:0x44 -setGuardianPotionTimer__11FileManagerFs = .text:0x8000B8F0; // type:function size:0x30 +setGuardianPotionTimer__11FileManagerFUs = .text:0x8000B8F0; // type:function size:0x30 getGuardianPotionTimer__11FileManagerFv = .text:0x8000B920; // type:function size:0x44 -setGuardianPotionPlusTimer__11FileManagerFs = .text:0x8000B970; // type:function size:0x30 +setGuardianPotionPlusTimer__11FileManagerFUs = .text:0x8000B970; // type:function size:0x30 getGuardianPotionPlusTimer__11FileManagerFv = .text:0x8000B9A0; // type:function size:0x44 setDowsingSlotIdx__11FileManagerFUc = .text:0x8000B9F0; // type:function size:0x30 getDowsingSlotIdx__11FileManagerFv = .text:0x8000BA20; // type:function size:0x44 @@ -4792,8 +4792,8 @@ changeState__84sStateMgr_c<15dLytBossGauge_c,20sStateMethodUsr_FI_c,12sFStateFct changeState__84sStateMgr_c<15dLytBirdGauge_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x800D9840; // type:function size:0x10 changeState__85sStateMgr_c<16dLytMeterTimer_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x800D9850; // type:function size:0x10 getStateID__85sStateMgr_c<16dLytMeterTimer_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x800D9860; // type:function size:0x10 -fn_800D9870 = .text:0x800D9870; // type:function size:0x8 -fn_800D9880 = .text:0x800D9880; // type:function size:0x8 +getName__16dLytMeterDrink_cFv = .text:0x800D9870; // type:function size:0x8 +getLyt__16dLytMeterDrink_cFv = .text:0x800D9880; // type:function size:0x8 changeState__85sStateMgr_c<16dLytMeterDrink_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x800D9890; // type:function size:0x10 changeState__90sStateMgr_c<21dLytMeterDrinkParts_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x800D98A0; // type:function size:0x10 fn_800D98B0 = .text:0x800D98B0; // type:function size:0x8 @@ -5557,45 +5557,45 @@ __dt__34sFStateID_c<19dLytMeterSmallKey_c>Fv = .text:0x800E4720; // type:functio isSameName__34sFStateID_c<19dLytMeterSmallKey_c>CFPCc = .text:0x800E4780; // type:function size:0x88 isSameName__33sFStateID_c<18dLytMeterBossKey_c>CFPCc = .text:0x800E4810; // type:function size:0x88 isSameName__35sFStateID_c<20dLytMeterKakeraKey_c>CFPCc = .text:0x800E48A0; // type:function size:0x88 -fn_800E4930 = .text:0x800E4930; // type:function size:0x9C -fn_800E49D0 = .text:0x800E49D0; // type:function size:0x6C -fn_800E4A40 = .text:0x800E4A40; // type:function size:0x4 -fn_800E4A50 = .text:0x800E4A50; // type:function size:0xA4 -fn_800E4B00 = .text:0x800E4B00; // type:function size:0x9C -fn_800E4BA0 = .text:0x800E4BA0; // type:function size:0x4 -fn_800E4BB0 = .text:0x800E4BB0; // type:function size:0x88 -fn_800E4C40 = .text:0x800E4C40; // type:function size:0x78 -fn_800E4CC0 = .text:0x800E4CC0; // type:function size:0x4 -fn_800E4CD0 = .text:0x800E4CD0; // type:function size:0xA4 -fn_800E4D80 = .text:0x800E4D80; // type:function size:0xB4 -fn_800E4E40 = .text:0x800E4E40; // type:function size:0x4 -fn_800E4E50 = .text:0x800E4E50; // type:function size:0x6C -fn_800E4EC0 = .text:0x800E4EC0; // type:function size:0x74 -fn_800E4F40 = .text:0x800E4F40; // type:function size:0xD4 -fn_800E5020 = .text:0x800E5020; // type:function size:0xE4 -fn_800E5110 = .text:0x800E5110; // type:function size:0x158 -fn_800E5270 = .text:0x800E5270; // type:function size:0x4 -fn_800E5280 = .text:0x800E5280; // type:function size:0x28 -fn_800E52B0 = .text:0x800E52B0; // type:function size:0x4 -fn_800E52C0 = .text:0x800E52C0; // type:function size:0x48 -fn_800E5310 = .text:0x800E5310; // type:function size:0x94 -fn_800E53B0 = .text:0x800E53B0; // type:function size:0x4 -fn_800E53C0 = .text:0x800E53C0; // type:function size:0xC -fn_800E53D0 = .text:0x800E53D0; // type:function size:0x1A4 -fn_800E5580 = .text:0x800E5580; // type:function size:0x4 -fn_800E5590 = .text:0x800E5590; // type:function size:0x90 -fn_800E5620 = .text:0x800E5620; // type:function size:0x1B8 -fn_800E57E0 = .text:0x800E57E0; // type:function size:0x4 -fn_800E57F0 = .text:0x800E57F0; // type:function size:0x48 -fn_800E5840 = .text:0x800E5840; // type:function size:0x94 -fn_800E58E0 = .text:0x800E58E0; // type:function size:0x4 -fn_800E58F0 = .text:0x800E58F0; // type:function size:0x1E8 +initializeState_Invisible__21dLytMeterDrinkParts_cFv = .text:0x800E4930; // type:function size:0x9C +executeState_Invisible__21dLytMeterDrinkParts_cFv = .text:0x800E49D0; // type:function size:0x6C +finalizeState_Invisible__21dLytMeterDrinkParts_cFv = .text:0x800E4A40; // type:function size:0x4 +initializeState_In__21dLytMeterDrinkParts_cFv = .text:0x800E4A50; // type:function size:0xA4 +executeState_In__21dLytMeterDrinkParts_cFv = .text:0x800E4B00; // type:function size:0x9C +finalizeState_In__21dLytMeterDrinkParts_cFv = .text:0x800E4BA0; // type:function size:0x4 +initializeState_Visible__21dLytMeterDrinkParts_cFv = .text:0x800E4BB0; // type:function size:0x88 +executeState_Visible__21dLytMeterDrinkParts_cFv = .text:0x800E4C40; // type:function size:0x78 +finalizeState_Visible__21dLytMeterDrinkParts_cFv = .text:0x800E4CC0; // type:function size:0x4 +initializeState_Out__21dLytMeterDrinkParts_cFv = .text:0x800E4CD0; // type:function size:0xA4 +executeState_Out__21dLytMeterDrinkParts_cFv = .text:0x800E4D80; // type:function size:0xB4 +finalizeState_Out__21dLytMeterDrinkParts_cFv = .text:0x800E4E40; // type:function size:0x4 +init__21dLytMeterDrinkParts_cFv = .text:0x800E4E50; // type:function size:0x6C +execute__21dLytMeterDrinkParts_cFv = .text:0x800E4EC0; // type:function size:0x74 +getDrinkFrame__21dLytMeterDrinkParts_cCFQ221dLytMeterDrinkParts_c11DrinkType_e = .text:0x800E4F40; // type:function size:0xD4 +isDrinkAboutToExpire__21dLytMeterDrinkParts_cCFv = .text:0x800E5020; // type:function size:0xE4 +copy__21dLytMeterDrinkParts_cFP21dLytMeterDrinkParts_cP21dLytMeterDrinkParts_c = .text:0x800E5110; // type:function size:0x158 +initializeState_Invisible__16dLytMeterDrink_cFv = .text:0x800E5270; // type:function size:0x4 +executeState_Invisible__16dLytMeterDrink_cFv = .text:0x800E5280; // type:function size:0x28 +finalizeState_Invisible__16dLytMeterDrink_cFv = .text:0x800E52B0; // type:function size:0x4 +initializeState_In__16dLytMeterDrink_cFv = .text:0x800E52C0; // type:function size:0x48 +executeState_In__16dLytMeterDrink_cFv = .text:0x800E5310; // type:function size:0x94 +finalizeState_In__16dLytMeterDrink_cFv = .text:0x800E53B0; // type:function size:0x4 +initializeState_Wait__16dLytMeterDrink_cFv = .text:0x800E53C0; // type:function size:0xC +executeState_Wait__16dLytMeterDrink_cFv = .text:0x800E53D0; // type:function size:0x1A4 +finalizeState_Wait__16dLytMeterDrink_cFv = .text:0x800E5580; // type:function size:0x4 +initializeState_Move__16dLytMeterDrink_cFv = .text:0x800E5590; // type:function size:0x90 +executeState_Move__16dLytMeterDrink_cFv = .text:0x800E5620; // type:function size:0x1B8 +finalizeState_Move__16dLytMeterDrink_cFv = .text:0x800E57E0; // type:function size:0x4 +initializeState_Out__16dLytMeterDrink_cFv = .text:0x800E57F0; // type:function size:0x48 +executeState_Out__16dLytMeterDrink_cFv = .text:0x800E5840; // type:function size:0x94 +finalizeState_Out__16dLytMeterDrink_cFv = .text:0x800E58E0; // type:function size:0x4 +build__16dLytMeterDrink_cFPQ23d2d10ResAccIf_c = .text:0x800E58F0; // type:function size:0x1E8 remove__16dLytMeterDrink_cFv = .text:0x800E5AE0; // type:function size:0x58 -fn_800E5B40 = .text:0x800E5B40; // type:function size:0xC4 +execute__16dLytMeterDrink_cFv = .text:0x800E5B40; // type:function size:0xC4 draw__16dLytMeterDrink_cFv = .text:0x800E5C10; // type:function size:0x28 -fn_800E5C40 = .text:0x800E5C40; // type:function size:0xD0 -fn_800E5D10 = .text:0x800E5D10; // type:function size:0x44 -fn_800E5D60 = .text:0x800E5D60; // type:function size:0x498 +fn_800E5C40__16dLytMeterDrink_cFi = .text:0x800E5C40; // type:function size:0xD0 +getPartForDrinkType__16dLytMeterDrink_cCFQ221dLytMeterDrinkParts_c11DrinkType_e = .text:0x800E5D10; // type:function size:0x44 +executeInternal__16dLytMeterDrink_cFv = .text:0x800E5D60; // type:function size:0x498 __sinit_\d_lyt_meter_drink_cpp = .text:0x800E6200; // type:function size:0x6F0 scope:local __dt__36sFStateID_c<21dLytMeterDrinkParts_c>Fv = .text:0x800E68F0; // type:function size:0x58 __dt__31sFStateID_c<16dLytMeterDrink_c>Fv = .text:0x800E6950; // type:function size:0x58 @@ -48378,16 +48378,16 @@ LytMeterSmallKey__STATE_WAIT = .bss:0x805AA6A0; // type:object size:0x40 data:4b LytMeterSmallKey__STATE_ON = .bss:0x805AA6E0; // type:object size:0x40 data:4byte LytMeterSmallKey__STATE_ACTIVE = .bss:0x805AA720; // type:object size:0x40 data:4byte LytMeterSmallKey__STATE_OFF = .bss:0x805AA760; // type:object size:0x30 data:4byte -lbl_805AA790 = .bss:0x805AA790; // type:object size:0x10 -LytMeterDrinkParts__STATE_INVISIBLE = .bss:0x805AA7A0; // type:object size:0x40 data:4byte -LytMeterDrinkParts__STATE_IN = .bss:0x805AA7E0; // type:object size:0x40 data:4byte -LytMeterDrinkParts__STATE_VISIBLE = .bss:0x805AA820; // type:object size:0x40 data:4byte -LytMeterDrinkParts__STATE_OUT = .bss:0x805AA860; // type:object size:0x40 data:4byte -LytMeterDrink__STATE_INVISIBLE = .bss:0x805AA8A0; // type:object size:0x40 data:4byte -LytMeterDrink__STATE_IN = .bss:0x805AA8E0; // type:object size:0x40 data:4byte -LytMeterDrink__STATE_WAIT = .bss:0x805AA920; // type:object size:0x40 data:4byte -LytMeterDrink__STATE_MOVE = .bss:0x805AA960; // type:object size:0x40 data:4byte -LytMeterDrink__STATE_OUT = .bss:0x805AA9A0; // type:object size:0x30 data:4byte +lbl_805AA790 = .bss:0x805AA790; // type:object size:0xC scope:local +StateID_Invisible__21dLytMeterDrinkParts_c = .bss:0x805AA7A0; // type:object size:0x30 data:4byte +StateID_In__21dLytMeterDrinkParts_c = .bss:0x805AA7E0; // type:object size:0x30 data:4byte +StateID_Visible__21dLytMeterDrinkParts_c = .bss:0x805AA820; // type:object size:0x30 data:4byte +StateID_Out__21dLytMeterDrinkParts_c = .bss:0x805AA860; // type:object size:0x30 data:4byte +StateID_Invisible__16dLytMeterDrink_c = .bss:0x805AA8A0; // type:object size:0x30 data:4byte +StateID_In__16dLytMeterDrink_c = .bss:0x805AA8E0; // type:object size:0x30 data:4byte +StateID_Wait__16dLytMeterDrink_c = .bss:0x805AA920; // type:object size:0x30 data:4byte +StateID_Move__16dLytMeterDrink_c = .bss:0x805AA960; // type:object size:0x30 data:4byte +StateID_Out__16dLytMeterDrink_c = .bss:0x805AA9A0; // type:object size:0x30 data:4byte lbl_805AA9D0 = .bss:0x805AA9D0; // type:object size:0x10 LytMeterRemoconBg__STATE_WAIT = .bss:0x805AA9E0; // type:object size:0xF0 data:4byte lbl_805AAAD0 = .bss:0x805AAAD0; // type:object size:0x10 diff --git a/include/d/lyt/d2d.h b/include/d/lyt/d2d.h index 9747f09c..3741c886 100644 --- a/include/d/lyt/d2d.h +++ b/include/d/lyt/d2d.h @@ -262,6 +262,10 @@ struct AnmGroupBase_c { syncAnmFrame(); } + inline f32 getNextFrame() const { + return mpFrameCtrl->getNextFrame(); + } + private: /* 0x04 */ void *field_0x04; /* 0x08 */ m2d::FrameCtrl_c *mpFrameCtrl; diff --git a/include/d/lyt/meter/d_lyt_meter_drink.h b/include/d/lyt/meter/d_lyt_meter_drink.h index dc229ec1..43d8a7db 100644 --- a/include/d/lyt/meter/d_lyt_meter_drink.h +++ b/include/d/lyt/meter/d_lyt_meter_drink.h @@ -1,15 +1,45 @@ #ifndef D_LYT_METER_DRINK_H #define D_LYT_METER_DRINK_H +#include "common.h" #include "d/lyt/d2d.h" +#include "m/m_vec.h" +#include "nw4r/lyt/lyt_pane.h" #include "s/s_State.hpp" #include "s/s_StateMgr.hpp" +// Size 0x54 class dLytMeterDrinkParts_c { + friend class dLytMeterDrink_c; + + enum DrinkType_e { + TYPE_STAMINA, + TYPE_AIR, + TYPE_GUARDIAN, + TYPE_NONE, + }; + + enum DrinkFrame_e { + FRAME_STAMINA, + FRAME_STAMINA_PLUS, + FRAME_AIR, + FRAME_AIR_PLUS, + FRAME_GUARDIAN, + FRAME_GUARDIAN_PLUS, + FRAME_NONE + }; + public: dLytMeterDrinkParts_c() : mStateMgr(*this, sStateID::null) {} ~dLytMeterDrinkParts_c() {} + void init(); + void execute(); + + bool isDrinkAboutToExpire() const; + DrinkFrame_e getDrinkFrame(DrinkType_e ty) const; + void copy(dLytMeterDrinkParts_c *other, dLytMeterDrinkParts_c *third); + private: STATE_FUNC_DECLARE(dLytMeterDrinkParts_c, Invisible); STATE_FUNC_DECLARE(dLytMeterDrinkParts_c, In); @@ -17,7 +47,11 @@ class dLytMeterDrinkParts_c { STATE_FUNC_DECLARE(dLytMeterDrinkParts_c, Out); /* 0x004 */ UI_STATE_MGR_DECLARE(dLytMeterDrinkParts_c); - /* 0x03C */ u8 field_0x03C[0x18]; + /* 0x03C */ d2d::AnmGroup_c *mAnmGroups[3]; + /* 0x048 */ s32 field_0x48; + /* 0x04C */ DrinkType_e mDrinkType; + /* 0x050 */ u8 field_0x50; + /* 0x051 */ u8 field_0x51; }; class dLytMeterDrink_c { @@ -25,14 +59,23 @@ class dLytMeterDrink_c { dLytMeterDrink_c() : mStateMgr(*this, sStateID::null) {} ~dLytMeterDrink_c() {} - virtual void BossKey0x8() {} - virtual void BossKey0xC() {} + virtual d2d::dLytSub *getLyt() { + return &mLyt; + } + virtual const char *getName() { + return mLyt.getName(); + } bool build(d2d::ResAccIf_c *); bool remove(); bool draw(); + bool execute(); private: + bool fn_800E5C40(int); + int getPartForDrinkType(dLytMeterDrinkParts_c::DrinkType_e ty) const; + void executeInternal(); + STATE_FUNC_DECLARE(dLytMeterDrink_c, Invisible); STATE_FUNC_DECLARE(dLytMeterDrink_c, In); STATE_FUNC_DECLARE(dLytMeterDrink_c, Wait); @@ -42,8 +85,14 @@ class dLytMeterDrink_c { /* 0x004 */ UI_STATE_MGR_DECLARE(dLytMeterDrink_c); /* 0x040 */ d2d::dLytSub mLyt; /* 0x0D4 */ d2d::AnmGroup_c mAnmGroups[20]; - /* 0x5D4 */ u8 field_0x5D4[0x5E4 - 0x5D4]; + /* 0x5D4 */ nw4r::lyt::Pane *mpPartPanes[3]; + /* 0x5E0 */ nw4r::lyt::Pane *mpPane; /* 0x5E4 */ dLytMeterDrinkParts_c mParts[3]; + /* 0x6E0 */ mVec3_c field_0x6E0; + /* 0x6EC */ UNKWORD field_0x6EC; + /* 0x6F0 */ s32 field_0x6F0; + /* 0x6F4 */ u8 field_0x6F4; + /* 0x6F5 */ u8 field_0x6F5[3]; }; #endif diff --git a/include/m/m2d.h b/include/m/m2d.h index 2d3a1750..72349aef 100644 --- a/include/m/m2d.h +++ b/include/m/m2d.h @@ -99,6 +99,12 @@ class FrameCtrl_c { setFrame(actualEnd - (ratio * actualEnd)); } + inline f32 getNextFrame() const { + f32 end = mEndFrame; + f32 f = mCurrFrame + 1.0f; + return f >= end ? 0.0f : f; + } + private: inline bool notLooping() const { return (mFlags & FLAG_NO_LOOP) != 0; diff --git a/include/toBeSorted/file_manager.h b/include/toBeSorted/file_manager.h index 89a769aa..b4f44e6f 100644 --- a/include/toBeSorted/file_manager.h +++ b/include/toBeSorted/file_manager.h @@ -150,18 +150,18 @@ class FileManager { /* 8000B670 */ void setShieldPouchSlot(u8 slot); /* 8000B6A0 */ u8 getShieldPouchSlot(); - /* 8000B6F0 */ void setAirPotionTimer(s16 time); - /* 8000B720 */ s16 getAirPotionTimer(); - /* 8000B770 */ void setAirPotionPlusTimer(s16 time); - /* 8000B7A0 */ s16 getAirPotionPlusTimer(); - /* 8000B7F0 */ void setStaminaPotionTimer(s16 time); - /* 8000B820 */ s16 getStaminaPotionTimer(); - /* 8000B870 */ void setStaminaPotionPlusTimer(s16 time); - /* 8000B8A0 */ s16 getStaminaPotionPlusTimer(); - /* 8000B8F0 */ void setGuardianPotionTimer(s16 time); - /* 8000B920 */ s16 getGuardianPotionTimer(); - /* 8000B970 */ void setGuardianPotionPlusTimer(s16 time); - /* 8000B9A0 */ s16 getGuardianPotionPlusTimer(); + /* 8000B6F0 */ void setAirPotionTimer(u16 time); + /* 8000B720 */ u16 getAirPotionTimer(); + /* 8000B770 */ void setAirPotionPlusTimer(u16 time); + /* 8000B7A0 */ u16 getAirPotionPlusTimer(); + /* 8000B7F0 */ void setStaminaPotionTimer(u16 time); + /* 8000B820 */ u16 getStaminaPotionTimer(); + /* 8000B870 */ void setStaminaPotionPlusTimer(u16 time); + /* 8000B8A0 */ u16 getStaminaPotionPlusTimer(); + /* 8000B8F0 */ void setGuardianPotionTimer(u16 time); + /* 8000B920 */ u16 getGuardianPotionTimer(); + /* 8000B970 */ void setGuardianPotionPlusTimer(u16 time); + /* 8000B9A0 */ u16 getGuardianPotionPlusTimer(); /* 8000B9F0 */ void setDowsingSlotIdx(u8 idx); /* 8000BA20 */ u8 getDowsingSlotIdx(); diff --git a/src/d/lyt/meter/d_lyt_meter_drink.cpp b/src/d/lyt/meter/d_lyt_meter_drink.cpp index 8e691aab..7960cce5 100644 --- a/src/d/lyt/meter/d_lyt_meter_drink.cpp +++ b/src/d/lyt/meter/d_lyt_meter_drink.cpp @@ -1,5 +1,11 @@ #include "d/lyt/meter/d_lyt_meter_drink.h" +#include "common.h" +#include "d/lyt/d2d.h" +#include "m/m_vec.h" +#include "nw4r/lyt/lyt_pane.h" +#include "toBeSorted/file_manager.h" + STATE_DEFINE(dLytMeterDrinkParts_c, Invisible); STATE_DEFINE(dLytMeterDrinkParts_c, In); STATE_DEFINE(dLytMeterDrinkParts_c, Visible); @@ -10,3 +16,539 @@ STATE_DEFINE(dLytMeterDrink_c, In); STATE_DEFINE(dLytMeterDrink_c, Wait); STATE_DEFINE(dLytMeterDrink_c, Move); STATE_DEFINE(dLytMeterDrink_c, Out); + +void dLytMeterDrinkParts_c::initializeState_Invisible() { + if (field_0x51) { + if (mAnmGroups[2]->isFlag2()) { + mAnmGroups[2]->setAnimEnable(false); + } + if (!mAnmGroups[0]->isFlag2()) { + mAnmGroups[0]->setAnimEnable(true); + } + mAnmGroups[0]->setFrame(0.0f); + field_0x48 = 6; + mDrinkType = TYPE_NONE; + field_0x51 = 0; + } +} +void dLytMeterDrinkParts_c::executeState_Invisible() { + if (mAnmGroups[0]->isFlag2()) { + mAnmGroups[0]->setAnimEnable(false); + } + if (field_0x50) { + mStateMgr.changeState(StateID_In); + } +} +void dLytMeterDrinkParts_c::finalizeState_Invisible() {} + +void dLytMeterDrinkParts_c::initializeState_In() { + if (field_0x51) { + if (mAnmGroups[2]->isFlag2()) { + mAnmGroups[2]->setAnimEnable(false); + } + mAnmGroups[0]->setToEnd(); + field_0x51 = 0; + } else { + mAnmGroups[0]->setFrame(0.0f); + } + mAnmGroups[0]->setAnimEnable(true); +} +void dLytMeterDrinkParts_c::executeState_In() { + if (mAnmGroups[0]->isEndReached()) { + mAnmGroups[0]->setAnimEnable(false); + mStateMgr.changeState(StateID_Visible); + } + + if (mAnmGroups[0]->isFlag2()) { + mAnmGroups[0]->play(); + } +} +void dLytMeterDrinkParts_c::finalizeState_In() {} + +void dLytMeterDrinkParts_c::initializeState_Visible() { + if (field_0x51) { + if (mAnmGroups[2]->isFlag2()) { + mAnmGroups[2]->setAnimEnable(false); + } + mAnmGroups[0]->setAnimEnable(true); + mAnmGroups[0]->setToEnd(); + field_0x51 = 0; + } +} + +void dLytMeterDrinkParts_c::executeState_Visible() { + if (mAnmGroups[0]->isFlag2()) { + mAnmGroups[0]->setAnimEnable(false); + } + + if (field_0x48 != getDrinkFrame(mDrinkType)) { + mStateMgr.changeState(StateID_Out); + } +} +void dLytMeterDrinkParts_c::finalizeState_Visible() {} + +void dLytMeterDrinkParts_c::initializeState_Out() { + if (field_0x51) { + if (mAnmGroups[0]->isFlag2()) { + mAnmGroups[0]->setAnimEnable(false); + } + mAnmGroups[2]->setToEnd(); + field_0x51 = 0; + } else { + mAnmGroups[2]->setFrame(0.0f); + } + + mAnmGroups[2]->setAnimEnable(true); +} +void dLytMeterDrinkParts_c::executeState_Out() { + if (mAnmGroups[2]->isEndReached()) { + mAnmGroups[2]->setAnimEnable(false); + field_0x48 = 6; + mDrinkType = TYPE_NONE; + field_0x50 = 0; + mStateMgr.changeState(StateID_Invisible); + } + if (mAnmGroups[2]->isFlag2()) { + mAnmGroups[2]->play(); + } +} +void dLytMeterDrinkParts_c::finalizeState_Out() {} + +void dLytMeterDrinkParts_c::init() { + field_0x50 = 0; + field_0x51 = 0; + field_0x48 = 6; + mDrinkType = TYPE_NONE; + mAnmGroups[1]->setAnimEnable(true); + mStateMgr.changeState(StateID_Invisible); +} + +void dLytMeterDrinkParts_c::execute() { + mStateMgr.executeState(); + if (field_0x48 != 6) { + mAnmGroups[1]->setFrame(field_0x48); + } +} + +dLytMeterDrinkParts_c::DrinkFrame_e dLytMeterDrinkParts_c::getDrinkFrame(dLytMeterDrinkParts_c::DrinkType_e type +) const { + if (type == TYPE_STAMINA) { + if (FileManager::sInstance->getStaminaPotionPlusTimer()) { + return FRAME_STAMINA_PLUS; + } + if (FileManager::sInstance->getStaminaPotionTimer()) { + return FRAME_STAMINA; + } + } + if (type == TYPE_AIR) { + if (FileManager::sInstance->getAirPotionPlusTimer()) { + return FRAME_AIR_PLUS; + } + if (FileManager::sInstance->getAirPotionTimer()) { + return FRAME_AIR; + } + } + if (type == TYPE_GUARDIAN) { + if (FileManager::sInstance->getGuardianPotionPlusTimer()) { + return FRAME_GUARDIAN_PLUS; + } + if (FileManager::sInstance->getGuardianPotionTimer()) { + return FRAME_GUARDIAN; + } + } + return FRAME_NONE; +} + +bool dLytMeterDrinkParts_c::isDrinkAboutToExpire() const { + if (field_0x48 == FRAME_STAMINA_PLUS) { + return FileManager::sInstance->getStaminaPotionPlusTimer() < 600; + } else if (field_0x48 == FRAME_STAMINA) { + return FileManager::sInstance->getStaminaPotionTimer() < 600; + } else if (field_0x48 == FRAME_AIR_PLUS) { + return FileManager::sInstance->getAirPotionPlusTimer() < 600; + } else if (field_0x48 == FRAME_AIR) { + return FileManager::sInstance->getAirPotionTimer() < 600; + } else if (field_0x48 == FRAME_GUARDIAN_PLUS) { + return FileManager::sInstance->getGuardianPotionPlusTimer() < 600; + } else if (field_0x48 == FRAME_GUARDIAN) { + return FileManager::sInstance->getGuardianPotionTimer() < 600; + } + return false; +} + +void dLytMeterDrinkParts_c::copy(dLytMeterDrinkParts_c *other, dLytMeterDrinkParts_c *third) { + field_0x50 = other->field_0x50; + field_0x51 = 1; + field_0x48 = other->field_0x48; + mDrinkType = other->mDrinkType; + mStateMgr.changeState(*other->mStateMgr.getStateID()); + if (third == nullptr) { + other->field_0x50 = 0; + other->field_0x51 = 1; + other->field_0x48 = FRAME_NONE; + other->mDrinkType = TYPE_NONE; + other->mStateMgr.changeState(StateID_Invisible); + } else { + other->field_0x50 = third->field_0x50; + other->field_0x51 = 1; + other->field_0x48 = third->field_0x48; + other->mDrinkType = third->mDrinkType; + other->mStateMgr.changeState(*third->mStateMgr.getStateID()); + + third->field_0x50 = 0; + third->field_0x51 = 1; + third->field_0x48 = FRAME_NONE; + third->mDrinkType = TYPE_NONE; + third->mStateMgr.changeState(StateID_Invisible); + } +} + +static const char *sPanes[] = { + "N_drink_00", + "N_drink_01", + "N_drink_02", +}; + +static const d2d::LytBrlanMapping brlanMap[] = { + { "drink_00_demoIn.brlan", "G_demoInOut_00"}, + { "drink_00_in.brlan", "G_inOut_00"}, + { "drink_00_in.brlan", "G_inOut_01"}, + { "drink_00_in.brlan", "G_inOut_02"}, + { "drink_00_drink.brlan", "G_drink_00"}, + { "drink_00_drink.brlan", "G_drink_01"}, + { "drink_00_drink.brlan", "G_drink_02"}, + { "drink_00_loop.brlan", "G_loop_00"}, + { "drink_00_loop.brlan", "G_loop_01"}, + { "drink_00_loop.brlan", "G_loop_02"}, + {"drink_00_caution.brlan", "G_caution_00"}, + {"drink_00_caution.brlan", "G_caution_01"}, + {"drink_00_caution.brlan", "G_caution_02"}, + { "drink_00_move.brlan", "G_move_00"}, + { "drink_00_move.brlan", "G_move_01"}, + { "drink_00_move.brlan", "G_move_02"}, + { "drink_00_out.brlan", "G_inOut_00"}, + { "drink_00_out.brlan", "G_inOut_01"}, + { "drink_00_out.brlan", "G_inOut_02"}, + {"drink_00_demoOut.brlan", "G_demoInOut_00"}, +}; + +#define LYT_METER_DRINK_OFFSET_ANIM_LOOP 7 +#define LYT_METER_DRINK_OFFSET_ANIM_CAUTION 10 +#define LYT_METER_DRINK_OFFSET_ANIM_MOVE 13 + +#define LYT_METER_DRINK_ANIM_DEMO_OUT 19 + +void dLytMeterDrink_c::initializeState_Invisible() {} +void dLytMeterDrink_c::executeState_Invisible() { + if (field_0x6F4) { + mStateMgr.changeState(StateID_In); + } +} +void dLytMeterDrink_c::finalizeState_Invisible() {} + +void dLytMeterDrink_c::initializeState_In() { + mAnmGroups[0].setAnimEnable(true); + mAnmGroups[0].setFrame(0.0f); +} +void dLytMeterDrink_c::executeState_In() { + if (mAnmGroups[0].isEndReached()) { + mAnmGroups[0].setAnimEnable(false); + mStateMgr.changeState(StateID_Wait); + } + if (mAnmGroups[0].isFlag2()) { + mAnmGroups[0].play(); + } +} +void dLytMeterDrink_c::finalizeState_In() {} + +void dLytMeterDrink_c::initializeState_Wait() { + field_0x6F0 = -1; +} +void dLytMeterDrink_c::executeState_Wait() { + int i5 = -1; + int i7 = -1; + for (int i = 0; i < 3; i++) { + int a = getPartForDrinkType((dLytMeterDrinkParts_c::DrinkType_e)i); + if (fn_800E5C40(i) != 0 && a == 3) { + i5 = i; + } + if (field_0x6F5[i] == 1 && mParts[i].field_0x50 == 0) { + i7 = i; + } + } + + if (i5 >= 0) { + for (int i = 0; i < 3; i++) { + if (mParts[i].field_0x50 == 0 && i7 != i) { + mParts[i].field_0x50 = 1; + mParts[i].field_0x51 = 0; + mParts[i].field_0x48 = mParts[i].getDrinkFrame((dLytMeterDrinkParts_c::DrinkType_e)i5); + mParts[i].mDrinkType = (dLytMeterDrinkParts_c::DrinkType_e)i5; + break; + } + } + } + + switch (i7) { + case 0: + if (mParts[1].field_0x50 != 0) { + field_0x6F0 = i7; + mStateMgr.changeState(StateID_Move); + } + break; + case 1: + if (mParts[2].field_0x50 != 0) { + field_0x6F0 = i7; + mStateMgr.changeState(StateID_Move); + } + break; + } + if (field_0x6F4 == 0) { + mStateMgr.changeState(StateID_Out); + } +} +void dLytMeterDrink_c::finalizeState_Wait() {} + +void dLytMeterDrink_c::initializeState_Move() { + for (int i = field_0x6F0; i < 3; i++) { + mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_MOVE + i].setAnimEnable(true); + mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_MOVE + i].setFrame(0.0f); + } +} +void dLytMeterDrink_c::executeState_Move() { + bool needsCopy = false; + for (int i = field_0x6F0; i < 3; i++) { + if (mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_MOVE + i].isEndReached()) { + mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_MOVE + i].setFrame(0.0f); + needsCopy = true; + } + } + + if (needsCopy) { + if (field_0x6F0 == 0) { + if (mParts[1].field_0x50) { + mParts[0].copy(&mParts[1], &mParts[2]); + } + } else if (field_0x6F0 == 1 && mParts[2].field_0x50) { + mParts[1].copy(&mParts[2], nullptr); + } + + mLyt.calc(); + + for (int i = 0; i < 3; i++) { + if (mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_MOVE + i].isFlag2()) { + mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_MOVE + i].setAnimEnable(false); + } + } + mStateMgr.changeState(StateID_Wait); + } + + for (int i = 0; i < 3; i++) { + if (mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_MOVE + i].isFlag2()) { + mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_MOVE + i].play(); + } + } +} +void dLytMeterDrink_c::finalizeState_Move() {} + +void dLytMeterDrink_c::initializeState_Out() { + mAnmGroups[LYT_METER_DRINK_ANIM_DEMO_OUT].setAnimEnable(true); + mAnmGroups[LYT_METER_DRINK_ANIM_DEMO_OUT].setFrame(0.0f); +} +void dLytMeterDrink_c::executeState_Out() { + if (mAnmGroups[LYT_METER_DRINK_ANIM_DEMO_OUT].isEndReached()) { + mAnmGroups[LYT_METER_DRINK_ANIM_DEMO_OUT].setAnimEnable(false); + mStateMgr.changeState(StateID_Invisible); + } + if (mAnmGroups[LYT_METER_DRINK_ANIM_DEMO_OUT].isFlag2()) { + mAnmGroups[LYT_METER_DRINK_ANIM_DEMO_OUT].play(); + } +} +void dLytMeterDrink_c::finalizeState_Out() {} + +bool dLytMeterDrink_c::build(d2d::ResAccIf_c *resAcc) { + mLyt.setResAcc(resAcc); + mLyt.build("drink_00.brlyt", nullptr); + for (int i = 0; i < 3; i++) { + mpPartPanes[i] = mLyt.findPane(sPanes[i]); + } + + for (int i = 0; i < 20; i++) { + mAnmGroups[i].init(brlanMap[i].mFile, resAcc, mLyt.getLayout(), brlanMap[i].mName); + mAnmGroups[i].setDirection(false); + mAnmGroups[i].setAnimEnable(false); + } + + for (int i = 0; i < 3; i++) { + mParts[i].mAnmGroups[0] = &mAnmGroups[1 + i]; + mParts[i].mAnmGroups[1] = &mAnmGroups[4 + i]; + mParts[i].mAnmGroups[2] = &mAnmGroups[16 + i]; + mParts[i].init(); + field_0x6F5[i] = mParts[i].field_0x50; + } + + mpPane = mLyt.getLayout()->GetRootPane(); + + field_0x6F0 = -1; + field_0x6F4 = 0; + field_0x6E0.z = 0.0f; + field_0x6E0.y = 0.0f; + field_0x6E0.x = 0.0f; + mpPane->SetTranslate(field_0x6E0); + + mAnmGroups[0].setFrame(0.0f); + mAnmGroups[0].setAnimEnable(true); + mLyt.calc(); + mAnmGroups[0].setAnimEnable(false); + + mStateMgr.changeState(StateID_Invisible); + + return true; +} + +bool dLytMeterDrink_c::execute() { + mStateMgr.executeState(); + + for (int i = 0; i < 3; i++) { + field_0x6F5[i] = mParts[i].field_0x50; + mParts[i].execute(); + } + + executeInternal(); + mpPane->SetTranslate(field_0x6E0); + mLyt.calc(); + return true; +} + +bool dLytMeterDrink_c::remove() { + for (int i = 0; i < 20; i++) { + mAnmGroups[i].unbind(); + mAnmGroups[i].afterUnbind(); + } + + return true; +} + +bool dLytMeterDrink_c::draw() { + mLyt.addToDrawList(); + return true; +} + +int dLytMeterDrink_c::getPartForDrinkType(dLytMeterDrinkParts_c::DrinkType_e ty) const { + for (int i = 0; i < 3; i++) { + if (ty == mParts[i].mDrinkType) { + return i; + } + } + return 3; +} + +bool dLytMeterDrink_c::fn_800E5C40(int i) { + if ((i == 0 || i == 3) && (FileManager::sInstance->getStaminaPotionTimer() != 0 || + FileManager::sInstance->getStaminaPotionPlusTimer() != 0)) { + return true; + } + + if ((i == 1 || i == 3) && + (FileManager::sInstance->getAirPotionTimer() != 0 || FileManager::sInstance->getAirPotionPlusTimer() != 0)) { + return true; + } + + if ((i == 2 || i == 3) && (FileManager::sInstance->getGuardianPotionTimer() != 0 || + FileManager::sInstance->getGuardianPotionPlusTimer() != 0)) { + return true; + } + + return false; +} + +void dLytMeterDrink_c::executeInternal() { + bool bHasNotSoonExpiringDrink = false; + bool bHasSoonExpiringDrink = false; + bool drinksLast[3]; + + f32 frameLoop = 0.0f; + f32 frameCaution = 0.0f; + + for (int i = 0; i < 3; i++) { + if (!mParts[i].isDrinkAboutToExpire()) { + drinksLast[i] = true; + bHasNotSoonExpiringDrink = true; + if (mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_LOOP + i].isFlag2()) { + frameLoop = mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_LOOP + i].getNextFrame(); + } + } else { + drinksLast[i] = false; + bHasSoonExpiringDrink = true; + if (mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_CAUTION + i].isFlag2()) { + frameCaution = mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_CAUTION + i].getNextFrame(); + } + } + } + + if (bHasNotSoonExpiringDrink) { + for (int i = 0; i < 3; i++) { + if (drinksLast[i] == true) { + if (mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_LOOP + i].isFlag2()) { + mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_LOOP + i].play(); + } else { + mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_LOOP + i].setAnimEnable(true); + mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_LOOP + i].setFrame(frameLoop); + } + + if (mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_CAUTION + i].isFlag2()) { + bool oldVisible = mpPartPanes[i]->IsVisible(); + mpPartPanes[i]->SetVisible(true); + mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_CAUTION + i].setFrame(0.0f); + mLyt.calc(); + mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_CAUTION + i].setAnimEnable(false); + mpPartPanes[i]->SetVisible(oldVisible); + } + } + } + } else { + for (int i = 0; i < 3; i++) { + if (mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_LOOP + i].isFlag2()) { + bool oldVisible = mpPartPanes[i]->IsVisible(); + mpPartPanes[i]->SetVisible(true); + mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_LOOP + i].setFrame(0.0f); + mLyt.calc(); + mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_LOOP + i].setAnimEnable(false); + mpPartPanes[i]->SetVisible(oldVisible); + } + } + } + + if (bHasSoonExpiringDrink) { + for (int i = 0; i < 3; i++) { + if (drinksLast[i] == false) { + if (mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_CAUTION + i].isFlag2()) { + mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_CAUTION + i].play(); + } else { + mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_CAUTION + i].setAnimEnable(true); + mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_CAUTION + i].setFrame(frameCaution); + } + + if (mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_LOOP + i].isFlag2()) { + bool oldVisible = mpPartPanes[i]->IsVisible(); + mpPartPanes[i]->SetVisible(true); + mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_LOOP + i].setFrame(0.0f); + mLyt.calc(); + mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_LOOP + i].setAnimEnable(false); + mpPartPanes[i]->SetVisible(oldVisible); + } + } + } + } else { + for (int i = 0; i < 3; i++) { + if (mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_CAUTION + i].isFlag2()) { + bool oldVisible = mpPartPanes[i]->IsVisible(); + mpPartPanes[i]->SetVisible(true); + mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_CAUTION + i].setFrame(0.0f); + mLyt.calc(); + mAnmGroups[LYT_METER_DRINK_OFFSET_ANIM_CAUTION + i].setAnimEnable(false); + mpPartPanes[i]->SetVisible(oldVisible); + } + } + } +} diff --git a/src/toBeSorted/file_manager.cpp b/src/toBeSorted/file_manager.cpp index cc5376dd..b78b9fa6 100644 --- a/src/toBeSorted/file_manager.cpp +++ b/src/toBeSorted/file_manager.cpp @@ -171,18 +171,18 @@ u16 *FileManager::getStoryFlagsMut() { /* 8000B670 */ void FileManager::setShieldPouchSlot(u8 slot) {} /* 8000B6A0 */ u8 FileManager::getShieldPouchSlot() {} -/* 8000B6F0 */ void FileManager::setAirPotionTimer(s16 time) {} -/* 8000B720 */ s16 FileManager::getAirPotionTimer() {} -/* 8000B770 */ void FileManager::setAirPotionPlusTimer(s16 time) {} -/* 8000B7A0 */ s16 FileManager::getAirPotionPlusTimer() {} -/* 8000B7F0 */ void FileManager::setStaminaPotionTimer(s16 time) {} -/* 8000B820 */ s16 FileManager::getStaminaPotionTimer() {} -/* 8000B870 */ void FileManager::setStaminaPotionPlusTimer(s16 time) {} -/* 8000B8A0 */ s16 FileManager::getStaminaPotionPlusTimer() {} -/* 8000B8F0 */ void FileManager::setGuardianPotionTimer(s16 time) {} -/* 8000B920 */ s16 FileManager::getGuardianPotionTimer() {} -/* 8000B970 */ void FileManager::setGuardianPotionPlusTimer(s16 time) {} -/* 8000B9A0 */ s16 FileManager::getGuardianPotionPlusTimer() {} +/* 8000B6F0 */ void FileManager::setAirPotionTimer(u16 time) {} +/* 8000B720 */ u16 FileManager::getAirPotionTimer() {} +/* 8000B770 */ void FileManager::setAirPotionPlusTimer(u16 time) {} +/* 8000B7A0 */ u16 FileManager::getAirPotionPlusTimer() {} +/* 8000B7F0 */ void FileManager::setStaminaPotionTimer(u16 time) {} +/* 8000B820 */ u16 FileManager::getStaminaPotionTimer() {} +/* 8000B870 */ void FileManager::setStaminaPotionPlusTimer(u16 time) {} +/* 8000B8A0 */ u16 FileManager::getStaminaPotionPlusTimer() {} +/* 8000B8F0 */ void FileManager::setGuardianPotionTimer(u16 time) {} +/* 8000B920 */ u16 FileManager::getGuardianPotionTimer() {} +/* 8000B970 */ void FileManager::setGuardianPotionPlusTimer(u16 time) {} +/* 8000B9A0 */ u16 FileManager::getGuardianPotionPlusTimer() {} /* 8000B9F0 */ void FileManager::setDowsingSlotIdx(u8 idx) {} /* 8000BA20 */ u8 FileManager::getDowsingSlotIdx() {} diff --git a/tools/decompctx.py b/tools/decompctx.py index 290946f1..a857b8a2 100644 --- a/tools/decompctx.py +++ b/tools/decompctx.py @@ -21,9 +21,35 @@ include_dirs = [ os.path.join(root_dir, "include"), # Add additional include directories here + os.path.join(root_dir, "src"), + os.path.join(root_dir, "src", "PowerPC_EABI_Support", "MetroTRK"), + os.path.join( + root_dir, "src", "PowerPC_EABI_Support", "MSL", "MSL_C", "MSL_Common", "Include" + ), + os.path.join( + root_dir, + "src", + "PowerPC_EABI_Support", + "MSL", + "MSL_C", + "MSL_Common_Embedded", + "Math", + "Include", + ), + os.path.join(root_dir, "src", "PowerPC_EABI_Support", "MSL", "MSL_C", "PPC_EABI"), + os.path.join( + root_dir, + "src", + "PowerPC_EABI_Support", + "MSL", + "MSL_C++", + "MSL_Common", + "Include", + ), + os.path.join(root_dir, "src", "PowerPC_EABI_Support", "Runtime", "Inc"), ] -include_pattern = re.compile(r'^#\s*include\s*[<"](.+?)[>"]$') +include_pattern = re.compile(r'^#\s*include\s*[<"](.+?)[>"]') guard_pattern = re.compile(r"^#\s*ifndef\s+(.*)$") defines = set() From 8a3710824bf3acbe081cc942cc4fce0f695ba812 Mon Sep 17 00:00:00 2001 From: Elijah Thomas <42302100+elijah-thomas774@users.noreply.github.com> Date: Fri, 1 Nov 2024 17:07:16 -0400 Subject: [PATCH 03/10] Updated CC collision (#80) * c_cc_d soooo close * d_cc_shape_colliders -> d_cc_d * ported over changes from #43 * Oops, didnt save * use better collision functions in bombf * bombf fixes * bombf actorPostCreate matching * fix * small fix for cCcD_UnkAttr Set function * more cleanup(?) for c_cc_d * d_cc_mass_s OK * Initial d_cc_s setup * some easy funcs --------- Co-authored-by: robojumper --- .vscode/settings.json | 3 +- config/SOUE01/rels/d_a_bombfNP/splits.txt | 1 + config/SOUE01/rels/d_a_bombfNP/symbols.txt | 26 +- config/SOUE01/splits.txt | 13 +- config/SOUE01/symbols.txt | 764 ++++----- configure.py | 12 +- include/d/a/d_a_bombf.h | 26 +- include/d/a/d_a_player.h | 1 + include/d/a/obj/d_a_obj_arrow.h | 60 + include/d/a/obj/d_a_obj_base.h | 5 +- .../d/a/{d_a_bomb.h => obj/d_a_obj_bomb.h} | 39 +- include/d/a/obj/d_a_obj_spike.h | 6 +- include/d/a/obj/d_a_obj_toD3_stone_figure.h | 2 +- include/d/a/obj/d_a_obj_triforce.h | 2 +- include/d/col/c/c_bg_s_poly_info.h | 1 + include/d/col/c/c_cc_d.h | 912 ++++++++++ include/d/col/c/c_cc_s.h | 108 +- include/d/col/c/c_m3d.h | 90 +- include/d/col/c/c_m3d_g_aab.h | 21 +- include/d/col/c/c_m3d_g_cps.h | 2 +- include/d/col/c/c_m3d_g_cyl.h | 13 +- include/d/col/c/c_m3d_g_lin.h | 22 +- include/d/col/c/c_m3d_g_pla.h | 15 +- include/d/col/c/c_m3d_g_sph.h | 7 +- include/d/col/c/c_m3d_g_tri.h | 15 +- include/d/col/c/c_m3d_g_unk.h | 20 +- include/d/col/cc/d_cc_d.h | 528 +----- include/d/col/cc/d_cc_mass_s.h | 104 ++ include/d/col/cc/d_cc_mgr.h | 13 - include/d/col/cc/d_cc_s.h | 78 + include/d/col/cc/d_cc_shape_colliders.h | 89 - include/d/d_shadow.h | 9 + include/d/t/d_t_reaction.h | 4 +- include/egg/math/eggMath.h | 1 + include/egg/math/eggMatrix.h | 1 - include/m/m_angle.h | 9 + include/m/m_mtx.h | 62 +- include/m/m_vec.h | 21 + include/nw4r/math/math_arithmetic.h | 1 + include/nw4r/nw4r_types.h | 189 --- include/nw4r/types_nw4r.h | 1 + include/rvl/OS/OSError.h | 4 +- include/s/s_State.hpp | 6 +- include/toBeSorted/effects_struct.h | 2 + src/REL/d/a/d_a_bombf.cpp | 219 ++- src/REL/d/a/obj/d_a_obj_mole_soil.cpp | 5 - src/REL/d/a/obj/d_a_obj_pool_cock.cpp | 2 +- src/REL/d/a/obj/d_a_obj_ring.cpp | 2 +- src/REL/d/a/obj/d_a_obj_spike.cpp | 23 +- src/REL/d/a/obj/d_a_obj_toD3_stone_figure.cpp | 58 +- src/REL/d/a/obj/d_a_obj_triforce.cpp | 19 +- src/REL/d/t/d_t_reaction.cpp | 64 +- src/REL/d/t/d_t_sound_area.cpp | 2 +- src/d/a/d_a_base.cpp | 2 +- src/d/a/obj/d_a_obj_arrow.cpp | 131 ++ src/d/a/obj/d_a_obj_bomb.cpp | 20 + src/d/a/obj/d_a_obj_fairy.cpp | 9 +- src/d/a/obj/d_a_obj_switch.cpp | 8 +- src/d/col/bg/d_bg_w.cpp | 4 +- src/d/col/bg/d_bg_w_time.cpp | 2 +- src/d/col/c/c_cc_d.cpp | 1494 +++++++++++++++++ src/d/col/c/c_m3d.cpp | 49 +- src/d/col/c/c_m3d_g_cps.cpp | 6 +- src/d/col/c/c_m3d_g_cyl.cpp | 8 +- src/d/col/c/c_m3d_g_pla.cpp | 10 +- src/d/col/c/c_m3d_g_sph.cpp | 10 +- src/d/col/c/c_m3d_g_unk.cpp | 52 +- src/d/col/cc/d_cc_d.cpp | 385 +---- src/d/col/cc/d_cc_mass_s.cpp | 276 +++ src/d/col/cc/d_cc_s.cpp | 180 ++ src/d/col/cc/d_cc_shape_colliders.cpp | 108 -- src/m/m3d/m_shadow.cpp | 7 +- src/m/m_angle.cpp | 1 + tools/decompctx.py | 2 +- 74 files changed, 4513 insertions(+), 1953 deletions(-) create mode 100644 include/d/a/obj/d_a_obj_arrow.h rename include/d/a/{d_a_bomb.h => obj/d_a_obj_bomb.h} (57%) create mode 100644 include/d/col/cc/d_cc_mass_s.h delete mode 100644 include/d/col/cc/d_cc_mgr.h create mode 100644 include/d/col/cc/d_cc_s.h delete mode 100644 include/d/col/cc/d_cc_shape_colliders.h create mode 100644 include/d/d_shadow.h delete mode 100644 include/nw4r/nw4r_types.h create mode 100644 src/d/a/obj/d_a_obj_arrow.cpp create mode 100644 src/d/a/obj/d_a_obj_bomb.cpp create mode 100644 src/d/col/cc/d_cc_mass_s.cpp create mode 100644 src/d/col/cc/d_cc_s.cpp delete mode 100644 src/d/col/cc/d_cc_shape_colliders.cpp diff --git a/.vscode/settings.json b/.vscode/settings.json index 13b3e250..6eeacd5f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,9 +1,11 @@ { "[c]": { + "files.autoSave": "onFocusChange", "files.encoding": "utf8", "editor.defaultFormatter": "llvm-vs-code-extensions.vscode-clangd" }, "[cpp]": { + "files.autoSave": "onFocusChange", "files.encoding": "utf8", "editor.defaultFormatter": "xaver.clang-format" }, @@ -11,7 +13,6 @@ // "editor.defaultFormatter": "ms-python.black-formatter" // }, // "editor.tabSize": 2, - "files.autoSave": "onFocusChange", "files.insertFinalNewline": true, "files.trimFinalNewlines": true, "files.associations": { diff --git a/config/SOUE01/rels/d_a_bombfNP/splits.txt b/config/SOUE01/rels/d_a_bombfNP/splits.txt index 252e7949..b2edf4bf 100644 --- a/config/SOUE01/rels/d_a_bombfNP/splits.txt +++ b/config/SOUE01/rels/d_a_bombfNP/splits.txt @@ -17,3 +17,4 @@ REL/global_destructor_chain.c: REL/d/a/d_a_bombf.cpp: .text start:0x000000F0 end:0x00001358 .ctors start:0x00000000 end:0x00000004 + .rodata start:0x00000000 end:0x00000044 diff --git a/config/SOUE01/rels/d_a_bombfNP/symbols.txt b/config/SOUE01/rels/d_a_bombfNP/symbols.txt index c2f92fe9..b6b93eec 100644 --- a/config/SOUE01/rels/d_a_bombfNP/symbols.txt +++ b/config/SOUE01/rels/d_a_bombfNP/symbols.txt @@ -8,15 +8,15 @@ __dt__23sFState_c<10dAcBombf_c>Fv = .text:0x000001F0; // type:function size:0x58 __dt__26sFStateFct_c<10dAcBombf_c>Fv = .text:0x00000250; // type:function size:0x6C __dt__79sStateMgr_c<10dAcBombf_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x000002C0; // type:function size:0xA0 __dt__49sFStateMgr_c<10dAcBombf_c,20sStateMethodUsr_FI_c>Fv = .text:0x00000360; // type:function size:0xA4 -fn_17_410 = .text:0x00000410; // type:function size:0x68 -AcBombf__init1 = .text:0x00000480; // type:function size:0x184 +createHeap__10dAcBombf_cFv = .text:0x00000410; // type:function size:0x68 +actorCreate__10dAcBombf_cFv = .text:0x00000480; // type:function size:0x184 changeState__79sStateMgr_c<10dAcBombf_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x00000610; // type:function size:0x10 -AcBombf__init2 = .text:0x00000620; // type:function size:0x2A4 -fn_17_8D0 = .text:0x000008D0; // type:function size:0x8 -fn_17_8E0 = .text:0x000008E0; // type:function size:0x138 +actorPostCreate__10dAcBombf_cFv = .text:0x00000620; // type:function size:0x2A4 +doDelete__10dAcBombf_cFv = .text:0x000008D0; // type:function size:0x8 +actorExecute__10dAcBombf_cFv = .text:0x000008E0; // type:function size:0x138 executeState__79sStateMgr_c<10dAcBombf_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000A20; // type:function size:0x10 -fn_17_A30 = .text:0x00000A30; // type:function size:0x50 -AcBombf__regrowBomb = .text:0x00000A80; // type:function size:0x124 +draw__10dAcBombf_cFv = .text:0x00000A30; // type:function size:0x50 +regrowBomb__10dAcBombf_cFv = .text:0x00000A80; // type:function size:0x124 initializeState_Wait__10dAcBombf_cFv = .text:0x00000BB0; // type:function size:0x4 executeState_Wait__10dAcBombf_cFv = .text:0x00000BC0; // type:function size:0x2DC finalizeState_Wait__10dAcBombf_cFv = .text:0x00000EA0; // type:function size:0x4 @@ -36,7 +36,7 @@ getOldStateID__79sStateMgr_c<10dAcBombf_c,20sStateMethodUsr_FI_c,12sFStateFct_c, finalizeState__25sFStateID_c<10dAcBombf_c>CFR10dAcBombf_c = .text:0x000010D0; // type:function size:0x30 executeState__25sFStateID_c<10dAcBombf_c>CFR10dAcBombf_c = .text:0x00001100; // type:function size:0x30 initializeState__25sFStateID_c<10dAcBombf_c>CFR10dAcBombf_c = .text:0x00001130; // type:function size:0x30 -__sinit_\d_a_bombf_cpp = .text:0x00001160; // type:function size:0x10C scope:local +__sinit_\d_a_bombf_cpp = .text:0x00001160; // type:function size:0x10C __dt__25sFStateID_c<10dAcBombf_c>Fv = .text:0x00001270; // type:function size:0x58 isSameName__25sFStateID_c<10dAcBombf_c>CFPCc = .text:0x000012D0; // type:function size:0x88 _ctors = .ctors:0x00000000; // type:label scope:global @@ -49,11 +49,11 @@ g_profile_BOMBF = .data:0x00000000; // type:object size:0x10 data:4byte lbl_17_data_10 = .data:0x00000010; // type:object size:0xC lbl_17_data_1C = .data:0x0000001C; // type:object size:0xC lbl_17_data_28 = .data:0x00000028; // type:object size:0x18 data:string -lbl_17_data_40 = .data:0x00000040; // type:object size:0x80 -lbl_17_data_C0 = .data:0x000000C0; // type:object size:0x30 -lbl_17_data_F0 = .data:0x000000F0; // type:object size:0x30 -lbl_17_data_120 = .data:0x00000120; // type:object size:0x18 -lbl_17_data_138 = .data:0x00000138; // type:object size:0x58 +__vt__10dAcBombf_c = .data:0x00000040; // type:object size:0x80 +__vt__49sFStateMgr_c<10dAcBombf_c,20sStateMethodUsr_FI_c> = .data:0x000000C0; // type:object size:0x30 +__vt__79sStateMgr_c<10dAcBombf_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x000000F0; // type:object size:0x30 +__vt__26sFStateFct_c<10dAcBombf_c> = .data:0x00000120; // type:object size:0x18 +__vt__23sFState_c<10dAcBombf_c> = .data:0x00000138; // type:object size:0x58 lbl_17_data_190 = .data:0x00000190; // type:object size:0x34 lbl_17_data_1C4 = .data:0x000001C4; // type:object size:0x8 __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 3286d0c4..ff362c43 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -997,6 +997,7 @@ d/col/c/c_m3d_g_lin.cpp: d/col/c/c_m3d_g_pla.cpp: .text start:0x80338430 end:0x80338678 + .sdata2 start:0x8057D048 end:0x8057D04C d/col/c/c_m3d_g_sph.cpp: .text start:0x80338680 end:0x803388D8 @@ -1114,10 +1115,20 @@ d/col/bg/d_bg_w_time.cpp: .sdata2 start:0x8057D230 end:0x8057D240 .bss start:0x805D0F90 end:0x805D0FB4 -d/col/cc/d_cc_shape_colliders.cpp: +d/col/cc/d_cc_d.cpp: .text start:0x80353B50 end:0x80354298 .data start:0x80548340 end:0x80548580 +d/col/cc/d_cc_mass_s.cpp: + .text start:0x803543F0 end:0x80355080 + .data start:0x80548580 end:0x805485A4 + .sdata2 start:0x8057D240 end:0x8057D254 + +d/col/cc/d_cc_s.cpp: + .text start:0x80355080 end:0x80358654 + .data start:0x805485A8 end:0x805485B4 + .sbss start:0x80575D20 end:0x80575D24 + rvl/CX/cx.c: .text start:0x803CEE90 end:0x803D0B20 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 8eed7f28..8c9ad4ef 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -920,9 +920,9 @@ fn_800274D0 = .text:0x800274D0; // type:function size:0x40 fn_80027510 = .text:0x80027510; // type:function size:0x4C fn_80027560 = .text:0x80027560; // type:function size:0x5C __ct__13EffectsStructFv = .text:0x800275C0; // type:function size:0x44 -EffectsStruct__ctor = .text:0x80027610; // type:function size:0x44 +__ct__13EffectsStructFP9dAcBase_c = .text:0x80027610; // type:function size:0x44 __dt__13EffectsStructFv = .text:0x80027660; // type:function size:0x78 -fn_800276E0 = .text:0x800276E0; // type:function size:0x84 +remove__13EffectsStructFb = .text:0x800276E0; // type:function size:0x84 fn_80027770 = .text:0x80027770; // type:function size:0xE8 fn_80027860 = .text:0x80027860; // type:function size:0xC8 fn_80027930 = .text:0x80027930; // type:function size:0x130 @@ -13974,8 +13974,8 @@ fn_80258D10 = .text:0x80258D10; // type:function size:0x1C fn_80258D30 = .text:0x80258D30; // type:function size:0x40 AcItem__state_dtor = .text:0x80258D70; // type:function size:0x58 fn_80258DD0 = .text:0x80258DD0; // type:function size:0x88 -AcBomb__ctor = .text:0x80258E60; // type:function size:0x134 -fn_80258FA0 = .text:0x80258FA0; // type:function size:0x58 +dAcBomb_c_classInit__Fv = .text:0x80258E60; // type:function size:0x134 +__dt__21sFState_c<9dAcBomb_c>Fv = .text:0x80258FA0; // type:function size:0x58 fn_80259000 = .text:0x80259000; // type:function size:0x6C fn_80259070 = .text:0x80259070; // type:function size:0xA0 fn_80259110 = .text:0x80259110; // type:function size:0xA4 @@ -13992,7 +13992,7 @@ fn_80259B00 = .text:0x80259B00; // type:function size:0x304 fn_80259E10 = .text:0x80259E10; // type:function size:0x68 fn_80259E80 = .text:0x80259E80; // type:function size:0xB0 fn_80259F30 = .text:0x80259F30; // type:function size:0x58 -fn_80259F90 = .text:0x80259F90; // type:function size:0x150 +setTransformFromFlower__9dAcBomb_cFRC6mMtx_c = .text:0x80259F90; // type:function size:0x150 fn_8025A0E0 = .text:0x8025A0E0; // type:function size:0x20 fn_8025A100 = .text:0x8025A100; // type:function size:0x50 fn_8025A150 = .text:0x8025A150; // type:function size:0x94 @@ -14038,17 +14038,17 @@ fn_8025D0A0 = .text:0x8025D0A0; // type:function size:0x30 AcBomb__sinit = .text:0x8025D0D0; // type:function size:0x420 AcBomb__state_dtor = .text:0x8025D4F0; // type:function size:0x58 fn_8025D550 = .text:0x8025D550; // type:function size:0x88 -AcArrow__ctor = .text:0x8025D5E0; // type:function size:0x110 -fn_8025D6F0 = .text:0x8025D6F0; // type:function size:0x58 -fn_8025D750 = .text:0x8025D750; // type:function size:0x6C -fn_8025D7C0 = .text:0x8025D7C0; // type:function size:0xA0 -fn_8025D860 = .text:0x8025D860; // type:function size:0xA4 -fn_8025D910 = .text:0x8025D910; // type:function size:0x24 -AcArrow__initModels = .text:0x8025D940; // type:function size:0x90 -AcArrow__init = .text:0x8025D9D0; // type:function size:0x184 -fn_8025DB60 = .text:0x8025DB60; // type:function size:0x10 -fn_8025DB70 = .text:0x8025DB70; // type:function size:0x110 -fn_8025DC80 = .text:0x8025DC80; // type:function size:0xA0 +dAcArrow_c_classInit__Fv = .text:0x8025D5E0; // type:function size:0x110 +__dt__23sFState_c<10dAcArrow_c>Fv = .text:0x8025D6F0; // type:function size:0x58 +__dt__26sFStateFct_c<10dAcArrow_c>Fv = .text:0x8025D750; // type:function size:0x6C +__dt__79sStateMgr_c<10dAcArrow_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8025D7C0; // type:function size:0xA0 +__dt__49sFStateMgr_c<10dAcArrow_c,20sStateMethodUsr_FI_c>Fv = .text:0x8025D860; // type:function size:0xA4 +hitCallback__FP12dAcObjBase_cP12dCcD_GObjInfP12dAcObjBase_cP12dCcD_GObjInf = .text:0x8025D910; // type:function size:0x24 +createHeap__10dAcArrow_cFv = .text:0x8025D940; // type:function size:0x90 +create__10dAcArrow_cFv = .text:0x8025D9D0; // type:function size:0x184 +changeState__79sStateMgr_c<10dAcArrow_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x8025DB60; // type:function size:0x10 +__dt__10dAcArrow_cFv = .text:0x8025DB70; // type:function size:0x110 +hitCallback__10dAcArrow_cFP12dCcD_GObjInfP12dAcObjBase_cP12dCcD_GObjInf = .text:0x8025DC80; // type:function size:0xA0 fn_8025DD20 = .text:0x8025DD20; // type:function size:0x1AC fn_8025DED0 = .text:0x8025DED0; // type:function size:0x288 fn_8025E160 = .text:0x8025E160; // type:function size:0x480 @@ -14096,9 +14096,9 @@ fn_80260720 = .text:0x80260720; // type:function size:0x10 fn_80260730 = .text:0x80260730; // type:function size:0x30 fn_80260760 = .text:0x80260760; // type:function size:0x30 fn_80260790 = .text:0x80260790; // type:function size:0x30 -AcArrow__initStates = .text:0x802607C0; // type:function size:0x490 -AcArrow__dtor = .text:0x80260C50; // type:function size:0x58 -fn_80260CB0 = .text:0x80260CB0; // type:function size:0x88 +__sinit_\d_a_obj_arrow_cpp = .text:0x802607C0; // type:function size:0x490 scope:local +__dt__25sFStateID_c<10dAcArrow_c>Fv = .text:0x80260C50; // type:function size:0x58 +isSameName__25sFStateID_c<10dAcArrow_c>CFPCc = .text:0x80260CB0; // type:function size:0x88 AcBoomerang__ctor = .text:0x80260D40; // type:function size:0x1CC fn_80260F10 = .text:0x80260F10; // type:function size:0x5C fn_80260F70 = .text:0x80260F70; // type:function size:0x58 @@ -17840,12 +17840,12 @@ createAssertHeap__5mHeapFPQ23EGG4Heap = .text:0x802F15F0; // type:function size: makeHeapOnCurrentGameHeap__5mHeapFUlPCcUlUl = .text:0x802F1640; // type:function size:0x20 mMtx__ctor = .text:0x802F1660; // type:function size:0x44 XrotS__6mMtx_cFRC4mAng = .text:0x802F16B0; // type:function size:0xBC -mMtx__XrotM = .text:0x802F1770; // type:function size:0x4C +XrotM__6mMtx_cFRC4mAng = .text:0x802F1770; // type:function size:0x4C YrotS__6mMtx_cFRC4mAng = .text:0x802F17C0; // type:function size:0xBC YrotM__6mMtx_cFRC4mAng = .text:0x802F1880; // type:function size:0x4C mMtx__ZrotS = .text:0x802F18D0; // type:function size:0xBC ZrotM__6mMtx_cFRC4mAng = .text:0x802F1990; // type:function size:0x4C -mMtx__ZXYrotS = .text:0x802F19E0; // type:function size:0x60 +ZXYrotS__6mMtx_cFRC4mAngRC4mAngRC4mAng = .text:0x802F19E0; // type:function size:0x60 mMtx__ZXYrotM = .text:0x802F1A40; // type:function size:0x60 mMtx__XYZrotS = .text:0x802F1AA0; // type:function size:0x60 mMtx__ZYXrotM = .text:0x802F1B00; // type:function size:0x60 @@ -18740,262 +18740,262 @@ __dt__9cBgW_BgIdFv = .text:0x80328090; // type:function size:0x40 Regist__9cBgW_BgIdFi = .text:0x803280D0; // type:function size:0x8 Release__9cBgW_BgIdFv = .text:0x803280E0; // type:function size:0xC ChkUsed__9cBgW_BgIdCFv = .text:0x803280F0; // type:function size:0x24 -__ct__15dCcD_DivideInfoFv = .text:0x80328120; // type:function size:0x10 -__dt__15dCcD_DivideInfoFv = .text:0x80328130; // type:function size:0x40 -__ct__15dCcD_DivideAreaFv = .text:0x80328170; // type:function size:0x10 -__dt__15dCcD_DivideAreaFv = .text:0x80328180; // type:function size:0x40 -SetArea__15dCcD_DivideAreaFRC4Aabb = .text:0x803281C0; // type:function size:0x104 -DivideArea__CalcDivideInfo = .text:0x803282D0; // type:function size:0x198 -DivideArea__CalcArea2 = .text:0x80328470; // type:function size:0x1E0 -__ct__12UnkCCDStructFP9dAcBase_c = .text:0x80328650; // type:function size:0x4C -postExecute__12UnkCCDStructFv = .text:0x803286A0; // type:function size:0x20 -getId__12UnkCCDStructFv = .text:0x803286C0; // type:function size:0x1C -fn_803286E0 = .text:0x803286E0; // type:function size:0xA0 -reset__12UnkCCDStructFv = .text:0x80328780; // type:function size:0x54 -getSomething__12UnkCCDStructFi = .text:0x803287E0; // type:function size:0xD4 -__ct__22dCcD_GAtTgCoCommonBaseFv = .text:0x803288C0; // type:function size:0x2C -__dt__22dCcD_GAtTgCoCommonBaseFv = .text:0x803288F0; // type:function size:0x94 -unlink__22dCcD_GAtTgCoCommonBaseFv = .text:0x80328990; // type:function size:0x8 -setActor__22dCcD_GAtTgCoCommonBaseFP9dAcBase_c = .text:0x803289A0; // type:function size:0x14 -getActor__22dCcD_GAtTgCoCommonBaseFv = .text:0x803289C0; // type:function size:0x8 -decreaseCount__22dCcD_GAtTgCoCommonBaseFv = .text:0x803289D0; // type:function size:0x18 -__ct__12dCcD_GObjInfFv = .text:0x803289F0; // type:function size:0x58 -__dt__12dCcD_GObjInfFv = .text:0x80328A50; // type:function size:0x7C -weirdConditionCheck__12dCcD_GObjInfFP9dAcBase_cUl = .text:0x80328AD0; // type:function size:0x58 -clear__12dCcD_GObjInfFv = .text:0x80328B30; // type:function size:0x28 -init__12dCcD_GObjInfFRC15dCcD_SrcGObjInf = .text:0x80328B60; // type:function size:0x50 -ResetAtHit__12dCcD_GObjInfFv = .text:0x80328BB0; // type:function size:0x48 -ResetTgHit__12dCcD_GObjInfFv = .text:0x80328C00; // type:function size:0x4C -ResetCoHit__12dCcD_GObjInfFv = .text:0x80328C50; // type:function size:0x4C -GetAtHitPosP__12dCcD_GObjInfFv = .text:0x80328CA0; // type:function size:0x8 -GetAtHitPosP2__12dCcD_GObjInfFv = .text:0x80328CB0; // type:function size:0x8 -fn_80328CC0 = .text:0x80328CC0; // type:function size:0xC -fn_80328CD0 = .text:0x80328CD0; // type:function size:0xC -fn_80328CE0 = .text:0x80328CE0; // type:function size:0xC -fn_80328CF0 = .text:0x80328CF0; // type:function size:0x8 -fn_80328D00 = .text:0x80328D00; // type:function size:0x8 -fn_80328D10 = .text:0x80328D10; // type:function size:0xC -fn_80328D20 = .text:0x80328D20; // type:function size:0xC -dCcD_GObjInf_0x10__12dCcD_GObjInfFv = .text:0x80328D30; // type:function size:0x4 -fn_80328D40 = .text:0x80328D40; // type:function size:0xC -fn_80328D50 = .text:0x80328D50; // type:function size:0x8 -fn_80328D60 = .text:0x80328D60; // type:function size:0xC -fn_80328D70 = .text:0x80328D70; // type:function size:0xC -fn_80328D80 = .text:0x80328D80; // type:function size:0xC -fn_80328D90 = .text:0x80328D90; // type:function size:0xC -fn_80328DA0 = .text:0x80328DA0; // type:function size:0xC -fn_80328DB0 = .text:0x80328DB0; // type:function size:0xC -fn_80328DC0 = .text:0x80328DC0; // type:function size:0xC -GetAtActor__12dCcD_GObjInfFv = .text:0x80328DD0; // type:function size:0x4 -CheckCollidedMask__12dCcD_GObjInfFUl = .text:0x80328DE0; // type:function size:0x18 -ActorEnemyBase__getRoomIdCopy = .text:0x80328E00; // type:function size:0x8 -fn_80328E10 = .text:0x80328E10; // type:function size:0xC -UnkCollider__getDamage = .text:0x80328E20; // type:function size:0x8 -UnkCollider__getDamageSpecialFlags = .text:0x80328E30; // type:function size:0x8 -UnkCollider__checkSkywardStrike = .text:0x80328E40; // type:function size:0xC -fn_80328E50 = .text:0x80328E50; // type:function size:0xC -fn_80328E60 = .text:0x80328E60; // type:function size:0xC -fn_80328E70 = .text:0x80328E70; // type:function size:0xC -fn_80328E80 = .text:0x80328E80; // type:function size:0xC -fn_80328E90 = .text:0x80328E90; // type:function size:0xC -fn_80328EA0 = .text:0x80328EA0; // type:function size:0xC -fn_80328EB0 = .text:0x80328EB0; // type:function size:0xC -fn_80328EC0 = .text:0x80328EC0; // type:function size:0x8 -fn_80328ED0 = .text:0x80328ED0; // type:function size:0x8 -fn_80328EE0 = .text:0x80328EE0; // type:function size:0xC -fn_80328EF0 = .text:0x80328EF0; // type:function size:0x8 -GetTgActor__12dCcD_GObjInfFv = .text:0x80328F00; // type:function size:0x8 -fn_80328F10 = .text:0x80328F10; // type:function size:0x8 -GetCoActor__12dCcD_GObjInfFv = .text:0x80328F20; // type:function size:0x8 -fn_80328F30 = .text:0x80328F30; // type:function size:0xC -setColliderAtFlags = .text:0x80328F40; // type:function size:0x14 -fn_80328F60 = .text:0x80328F60; // type:function size:0xC -adjustHitPos__12dCcD_GObjInfFff = .text:0x80328F70; // type:function size:0x64 -__ct__14dCcD_ShapeAttrFv = .text:0x80328FE0; // type:function size:0x40 -__dt__14dCcD_ShapeAttrFv = .text:0x80329020; // type:function size:0x5C -fn_80329080 = .text:0x80329080; // type:function size:0x8 -getShapeAccess__14dCcD_ShapeAttrFv = .text:0x80329090; // type:function size:0x5C -dCcD_ShapeAttr_0x54__14dCcD_ShapeAttrFv = .text:0x803290F0; // type:function size:0x8 -fn_80329100 = .text:0x80329100; // type:function size:0x8 -fn_80329110 = .text:0x80329110; // type:function size:0x8 -getVirtualCenter__14dCcD_ShapeAttrFv = .text:0x80329120; // type:function size:0xC -__ct__15dCcD_ShapeAttr2Fv = .text:0x80329130; // type:function size:0x3C -__dt__15dCcD_ShapeAttr2Fv = .text:0x80329170; // type:function size:0x58 -dCcD_ShapeAttr_0x0C__15dCcD_ShapeAttr2Fv = .text:0x803291D0; // type:function size:0x458 -dCcD_ShapeAttr_0x10__15dCcD_ShapeAttr2Fv = .text:0x80329630; // type:function size:0x1C -dCcD_ShapeAttr_0x14__15dCcD_ShapeAttr2Fv = .text:0x80329650; // type:function size:0x10 -dCcD_ShapeAttr_0x20__15dCcD_ShapeAttr2Fv = .text:0x80329660; // type:function size:0x10 -dCcD_ShapeAttr_0x24__15dCcD_ShapeAttr2Fv = .text:0x80329670; // type:function size:0x18 -dCcD_ShapeAttr_0x18__15dCcD_ShapeAttr2Fv = .text:0x80329690; // type:function size:0xC -dCcD_ShapeAttr_0x1C__15dCcD_ShapeAttr2Fv = .text:0x803296A0; // type:function size:0x10 -dCcD_ShapeAttr_0x28__15dCcD_ShapeAttr2Fv = .text:0x803296B0; // type:function size:0x1C -dCcD_ShapeAttr_0x2C__15dCcD_ShapeAttr2Fv = .text:0x803296D0; // type:function size:0x8 -dCcD_ShapeAttr_0x30__15dCcD_ShapeAttr2Fv = .text:0x803296E0; // type:function size:0x8 -dCcD_ShapeAttr_0x34__15dCcD_ShapeAttr2Fv = .text:0x803296F0; // type:function size:0x8 -dCcD_ShapeAttr_0x38__15dCcD_ShapeAttr2Fv = .text:0x80329700; // type:function size:0x8 -dCcD_ShapeAttr_0x3C__15dCcD_ShapeAttr2Fv = .text:0x80329710; // type:function size:0x8 -dCcD_ShapeAttr_0x44__15dCcD_ShapeAttr2Fv = .text:0x80329720; // type:function size:0xD4 -dCcD_ShapeAttr_0x48__15dCcD_ShapeAttr2Fv = .text:0x80329800; // type:function size:0x98 -getShapeAccess__15dCcD_ShapeAttr2Fv = .text:0x803298A0; // type:function size:0x54 -dCcD_ShapeAttr_0x50__15dCcD_ShapeAttr2Fv = .text:0x80329900; // type:function size:0x1C -dCcD_ShapeAttr_0x58__15dCcD_ShapeAttr2Fv = .text:0x80329920; // type:function size:0x4C -__ct__15dCcD_ShapeAttr5Fv = .text:0x80329970; // type:function size:0x4C +__ct__15cCcD_DivideInfoFv = .text:0x80328120; // type:function size:0x10 +__dt__15cCcD_DivideInfoFv = .text:0x80328130; // type:function size:0x40 +__ct__15cCcD_DivideAreaFv = .text:0x80328170; // type:function size:0x10 +__dt__15cCcD_DivideAreaFv = .text:0x80328180; // type:function size:0x40 +SetArea__15cCcD_DivideAreaFRC8cM3dGAab = .text:0x803281C0; // type:function size:0x104 +CalcDivideInfo__15cCcD_DivideAreaFP15cCcD_DivideInfoRC8cM3dGAab = .text:0x803282D0; // type:function size:0x198 +CalcDivideInfoOverArea__15cCcD_DivideAreaFP15cCcD_DivideInfoRC8cM3dGAab = .text:0x80328470; // type:function size:0x1E0 +__ct__9cCcD_SttsFP12dAcObjBase_c = .text:0x80328650; // type:function size:0x4C +Move__9cCcD_SttsFv = .text:0x803286A0; // type:function size:0x20 +GetID__9cCcD_SttsCFv = .text:0x803286C0; // type:function size:0x1C +PlusCcMove__9cCcD_SttsFfff = .text:0x803286E0; // type:function size:0xA0 +ClrCcMove__9cCcD_SttsFv = .text:0x80328780; // type:function size:0x54 +GetWeight__9cCcD_SttsCFi = .text:0x803287E0; // type:function size:0xD4 +__ct__22cCcD_GAtTgCoCommonBaseFv = .text:0x803288C0; // type:function size:0x2C +__dt__22cCcD_GAtTgCoCommonBaseFv = .text:0x803288F0; // type:function size:0x94 +ClrActorInfo__22cCcD_GAtTgCoCommonBaseFv = .text:0x80328990; // type:function size:0x8 +SetHitActor__22cCcD_GAtTgCoCommonBaseFP12dAcObjBase_c = .text:0x803289A0; // type:function size:0x14 +GetActor__22cCcD_GAtTgCoCommonBaseFv = .text:0x803289C0; // type:function size:0x8 +SubtractEffCounter__22cCcD_GAtTgCoCommonBaseFv = .text:0x803289D0; // type:function size:0x18 +__ct__8cCcD_ObjFv = .text:0x803289F0; // type:function size:0x58 +__dt__8cCcD_ObjFv = .text:0x80328A50; // type:function size:0x7C +fn_80328ad0__8cCcD_ObjFP12dAcObjBase_cUl = .text:0x80328AD0; // type:function size:0x58 +ClrSet__8cCcD_ObjFv = .text:0x80328B30; // type:function size:0x28 +Set__8cCcD_ObjFRC12cCcD_SrcGObj = .text:0x80328B60; // type:function size:0x50 +ClrAtHit__8cCcD_ObjFv = .text:0x80328BB0; // type:function size:0x48 +ClrTgHit__8cCcD_ObjFv = .text:0x80328C00; // type:function size:0x4C +ClrCoHit__8cCcD_ObjFv = .text:0x80328C50; // type:function size:0x4C +GetAtHitPos__8cCcD_ObjCFv = .text:0x80328CA0; // type:function size:0x8 +GetAtHitPos__8cCcD_ObjFv = .text:0x80328CB0; // type:function size:0x8 +GetAtFlag0x2__8cCcD_ObjCFv = .text:0x80328CC0; // type:function size:0xC +GetAtFlag0x4__8cCcD_ObjCFv = .text:0x80328CD0; // type:function size:0xC +GetAtFlag0x8__8cCcD_ObjCFv = .text:0x80328CE0; // type:function size:0xC +GetTgHitPos__8cCcD_ObjCFv = .text:0x80328CF0; // type:function size:0x8 +GetTgHitPos__8cCcD_ObjFv = .text:0x80328D00; // type:function size:0x8 +GetTgFlag0x4__8cCcD_ObjCFv = .text:0x80328D10; // type:function size:0xC +GetTgFlag0x8__8cCcD_ObjCFv = .text:0x80328D20; // type:function size:0xC +GetGObjInfo__8cCcD_ObjFv = .text:0x80328D30; // type:function size:0x4 +ChkAtClawshot__8cCcD_ObjCFv = .text:0x80328D40; // type:function size:0xC +ChkAtClawshotDebug__8cCcD_ObjCFv = .text:0x80328D50; // type:function size:0x8 +ChkAtElectrified__8cCcD_ObjCFv = .text:0x80328D60; // type:function size:0xC +ChkAtElectrifiedExtra__8cCcD_ObjCFv = .text:0x80328D70; // type:function size:0xC +ChkAtWhippable__8cCcD_ObjCFv = .text:0x80328D80; // type:function size:0xC +ChkAtBit24__8cCcD_ObjCFv = .text:0x80328D90; // type:function size:0xC +ChkAtArrowStick__8cCcD_ObjCFv = .text:0x80328DA0; // type:function size:0xC +ChkAtWaterScaleBonk__8cCcD_ObjCFv = .text:0x80328DB0; // type:function size:0xC +ChkAtSwordBonk__8cCcD_ObjCFv = .text:0x80328DC0; // type:function size:0xC +GetAtActor__8cCcD_ObjFv = .text:0x80328DD0; // type:function size:0x4 +ChkTgAtHitType__8cCcD_ObjCFUl = .text:0x80328DE0; // type:function size:0x18 +GetTg_0x58__8cCcD_ObjCFv = .text:0x80328E00; // type:function size:0x8 +ChkTgBit14__8cCcD_ObjCFv = .text:0x80328E10; // type:function size:0xC +GetTgDamage__8cCcD_ObjCFv = .text:0x80328E20; // type:function size:0x8 +GetTgDamageFlags__8cCcD_ObjCFv = .text:0x80328E30; // type:function size:0x8 +ChkTgSkywardStrike__8cCcD_ObjCFv = .text:0x80328E40; // type:function size:0xC +ChkTgBit17__8cCcD_ObjCFv = .text:0x80328E50; // type:function size:0xC +ChkTgBit18__8cCcD_ObjCFv = .text:0x80328E60; // type:function size:0xC +ChkTgBit19__8cCcD_ObjCFv = .text:0x80328E70; // type:function size:0xC +ChkTgBit23__8cCcD_ObjCFv = .text:0x80328E80; // type:function size:0xC +ChkTgBit20__8cCcD_ObjCFv = .text:0x80328E90; // type:function size:0xC +ChkTgBit24__8cCcD_ObjCFv = .text:0x80328EA0; // type:function size:0xC +ChkTgBit25__8cCcD_ObjCFv = .text:0x80328EB0; // type:function size:0xC +GetTgSoundID__8cCcD_ObjCFv = .text:0x80328EC0; // type:function size:0x8 +GetTg_0x6A__8cCcD_ObjCFv = .text:0x80328ED0; // type:function size:0x8 +ChkTgBit8__8cCcD_ObjCFv = .text:0x80328EE0; // type:function size:0xC +GetTg_0x4A__8cCcD_ObjCFv = .text:0x80328EF0; // type:function size:0x8 +GetTgActor__8cCcD_ObjFv = .text:0x80328F00; // type:function size:0x8 +GetTg_0x2C__8cCcD_ObjCFv = .text:0x80328F10; // type:function size:0x8 +GetCoActor__8cCcD_ObjFv = .text:0x80328F20; // type:function size:0x8 +ChkCoBit4__8cCcD_ObjCFv = .text:0x80328F30; // type:function size:0xC +SetAtFlagsUpper__8cCcD_ObjFUl = .text:0x80328F40; // type:function size:0x14 +ChkTgBit1__8cCcD_ObjCFv = .text:0x80328F60; // type:function size:0xC +AdjustHitPos__8cCcD_ObjFff = .text:0x80328F70; // type:function size:0x64 +__ct__14cCcD_ShapeAttrFv = .text:0x80328FE0; // type:function size:0x40 +__dt__14cCcD_ShapeAttrFv = .text:0x80329020; // type:function size:0x5C +Calc__14cCcD_ShapeAttrFRC7mVec3_cRC7mVec3_cP7mVec3_c = .text:0x80329080; // type:function size:0x8 +GetShapeAccess__14cCcD_ShapeAttrCFPQ214cCcD_ShapeAttr5Shape = .text:0x80329090; // type:function size:0x5C +GetPosBool__14cCcD_ShapeAttrCFP7mVec3_c = .text:0x803290F0; // type:function size:0x8 +CrossAtTg__14cCcD_ShapeAttrFR14cCcD_ShapeAttrP7mVec3_c = .text:0x80329100; // type:function size:0x8 +CrossCo__14cCcD_ShapeAttrFR14cCcD_ShapeAttrPf = .text:0x80329110; // type:function size:0x8 +GetCoP__14cCcD_ShapeAttrFv = .text:0x80329120; // type:function size:0xC +__ct__12cCcD_TriAttrFv = .text:0x80329130; // type:function size:0x3C +__dt__12cCcD_TriAttrFv = .text:0x80329170; // type:function size:0x58 +Calc__12cCcD_TriAttrFRC7mVec3_cRC7mVec3_cP7mVec3_c = .text:0x803291D0; // type:function size:0x458 +CrossAtTg__12cCcD_TriAttrFR14cCcD_ShapeAttrP7mVec3_c = .text:0x80329630; // type:function size:0x1C +CrossAtTg__12cCcD_TriAttrFR12cCcD_CpsAttrP7mVec3_c = .text:0x80329650; // type:function size:0x10 +CrossAtTg__12cCcD_TriAttrFR12cCcD_CylAttrP7mVec3_c = .text:0x80329660; // type:function size:0x10 +CrossAtTg__12cCcD_TriAttrFR12cCcD_SphAttrP7mVec3_c = .text:0x80329670; // type:function size:0x18 +CrossAtTg__12cCcD_TriAttrFR12cCcD_TriAttrP7mVec3_c = .text:0x80329690; // type:function size:0xC +CrossAtTg__12cCcD_TriAttrFR12cCcD_UnkAttrP7mVec3_c = .text:0x803296A0; // type:function size:0x10 +CrossCo__12cCcD_TriAttrFR14cCcD_ShapeAttrPf = .text:0x803296B0; // type:function size:0x1C +CrossCo__12cCcD_TriAttrFR12cCcD_CpsAttrPf = .text:0x803296D0; // type:function size:0x8 +CrossCo__12cCcD_TriAttrFR12cCcD_TriAttrPf = .text:0x803296E0; // type:function size:0x8 +CrossCo__12cCcD_TriAttrFR12cCcD_UnkAttrPf = .text:0x803296F0; // type:function size:0x8 +CrossCo__12cCcD_TriAttrFR12cCcD_CylAttrPf = .text:0x80329700; // type:function size:0x8 +CrossCo__12cCcD_TriAttrFR12cCcD_SphAttrPf = .text:0x80329710; // type:function size:0x8 +CalcAabBox__12cCcD_TriAttrFv = .text:0x80329720; // type:function size:0xD4 +GetNVec__12cCcD_TriAttrCFRC7mVec3_cP7mVec3_c = .text:0x80329800; // type:function size:0x98 +GetShapeAccess__12cCcD_TriAttrCFPQ214cCcD_ShapeAttr5Shape = .text:0x803298A0; // type:function size:0x54 +GetPos__12cCcD_TriAttrCFPQ34nw4r4math4VEC3 = .text:0x80329900; // type:function size:0x1C +TranslateXZ__12cCcD_TriAttrFff = .text:0x80329920; // type:function size:0x4C +__ct__12cCcD_UnkAttrFv = .text:0x80329970; // type:function size:0x4C __dt__8cM3dGUnkFv = .text:0x803299C0; // type:function size:0x40 -__dt__15dCcD_ShapeAttr5Fv = .text:0x80329A00; // type:function size:0x58 -dCcD_ShapeAttr_0x0C__15dCcD_ShapeAttr5Fv = .text:0x80329A60; // type:function size:0x1B0 -dCcD_ShapeAttr_0x10__15dCcD_ShapeAttr5Fv = .text:0x80329C10; // type:function size:0x1C -dCcD_ShapeAttr_0x14__15dCcD_ShapeAttr5Fv = .text:0x80329C30; // type:function size:0xC -dCcD_ShapeAttr_0x18__15dCcD_ShapeAttr5Fv = .text:0x80329C40; // type:function size:0xC -dCcD_ShapeAttr_0x1C__15dCcD_ShapeAttr5Fv = .text:0x80329C50; // type:function size:0xC -dCcD_ShapeAttr_0x20__15dCcD_ShapeAttr5Fv = .text:0x80329C60; // type:function size:0xC -dCcD_ShapeAttr_0x24__15dCcD_ShapeAttr5Fv = .text:0x80329C70; // type:function size:0xC -dCcD_ShapeAttr_0x28__15dCcD_ShapeAttr5Fv = .text:0x80329C80; // type:function size:0x1C -dCcD_ShapeAttr_0x2C__15dCcD_ShapeAttr5Fv = .text:0x80329CA0; // type:function size:0x84 -dCcD_ShapeAttr_0x30__15dCcD_ShapeAttr5Fv = .text:0x80329D30; // type:function size:0x8 -dCcD_ShapeAttr_0x34__15dCcD_ShapeAttr5Fv = .text:0x80329D40; // type:function size:0x8 -dCcD_ShapeAttr_0x38__15dCcD_ShapeAttr5Fv = .text:0x80329D50; // type:function size:0xC -dCcD_ShapeAttr_0x3C__15dCcD_ShapeAttr5Fv = .text:0x80329D60; // type:function size:0xC -dCcD_ShapeAttr_0x44__15dCcD_ShapeAttr5Fv = .text:0x80329D70; // type:function size:0x164 -dCcD_ShapeAttr_0x48__15dCcD_ShapeAttr5Fv = .text:0x80329EE0; // type:function size:0x18 -dCcD_ShapeAttr_0x50__15dCcD_ShapeAttr5Fv = .text:0x80329F00; // type:function size:0x1C -init__15dCcD_ShapeAttr5FRC16dCcD_SrcAabbAttr = .text:0x80329F20; // type:function size:0x5C -getVirtualCenter__15dCcD_ShapeAttr5Fv = .text:0x80329F80; // type:function size:0x8 -dCcD_ShapeAttr_0x58__15dCcD_ShapeAttr5Fv = .text:0x80329F90; // type:function size:0x8 -__ct__15dCcD_ShapeAttr1Fv = .text:0x80329FA0; // type:function size:0x44 -__dt__15dCcD_ShapeAttr1Fv = .text:0x80329FF0; // type:function size:0x58 -init__15dCcD_ShapeAttr1FRC16dCcD_SrcUnk1Attr = .text:0x8032A050; // type:function size:0x5C -getVirtualCenter__15dCcD_ShapeAttr1Fv = .text:0x8032A0B0; // type:function size:0x8 -dCcD_ShapeAttr_0x10__15dCcD_ShapeAttr1Fv = .text:0x8032A0C0; // type:function size:0x1C -dCcD_ShapeAttr_0x28__15dCcD_ShapeAttr1Fv = .text:0x8032A0E0; // type:function size:0x1C -dCcD_ShapeAttr_0x30__15dCcD_ShapeAttr1Fv = .text:0x8032A100; // type:function size:0x8 -fn_8032A110 = .text:0x8032A110; // type:function size:0x308 -dCcD_ShapeAttr_0x0C__15dCcD_ShapeAttr1Fv = .text:0x8032A420; // type:function size:0x28C -dCcD_ShapeAttr_0x14__15dCcD_ShapeAttr1Fv = .text:0x8032A6B0; // type:function size:0x14 -dCcD_ShapeAttr_0x20__15dCcD_ShapeAttr1Fv = .text:0x8032A6D0; // type:function size:0xC -dCcD_ShapeAttr_0x24__15dCcD_ShapeAttr1Fv = .text:0x8032A6E0; // type:function size:0xC -dCcD_ShapeAttr_0x18__15dCcD_ShapeAttr1Fv = .text:0x8032A6F0; // type:function size:0xC -dCcD_ShapeAttr_0x1C__15dCcD_ShapeAttr1Fv = .text:0x8032A700; // type:function size:0xC -fn_8032A710 = .text:0x8032A710; // type:function size:0xB0 -fn_8032A7C0 = .text:0x8032A7C0; // type:function size:0xBC -dCcD_ShapeAttr_0x2C__15dCcD_ShapeAttr1Fv = .text:0x8032A880; // type:function size:0xA4 -dCcD_ShapeAttr_0x38__15dCcD_ShapeAttr1Fv = .text:0x8032A930; // type:function size:0x84 -dCcD_ShapeAttr_0x3C__15dCcD_ShapeAttr1Fv = .text:0x8032A9C0; // type:function size:0x8C -dCcD_ShapeAttr_0x34__15dCcD_ShapeAttr1Fv = .text:0x8032AA50; // type:function size:0x8C -dCcD_ShapeAttr_0x44__15dCcD_ShapeAttr1Fv = .text:0x8032AAE0; // type:function size:0x90 -dCcD_ShapeAttr_0x48__15dCcD_ShapeAttr1Fv = .text:0x8032AB70; // type:function size:0x188 -dCcD_ShapeAttr_0x50__15dCcD_ShapeAttr1Fv = .text:0x8032AD00; // type:function size:0x1C -getShapeAccess__15dCcD_ShapeAttr1Fv = .text:0x8032AD20; // type:function size:0x50 -dCcD_ShapeAttr_0x58__15dCcD_ShapeAttr1Fv = .text:0x8032AD70; // type:function size:0x34 -__ct__15dCcD_ShapeAttr3Fv = .text:0x8032ADB0; // type:function size:0x3C -__dt__15dCcD_ShapeAttr3Fv = .text:0x8032ADF0; // type:function size:0x58 -init__15dCcD_ShapeAttr3FRC15dCcD_SrcCylAttr = .text:0x8032AE50; // type:function size:0x68 -getVirtualCenter__15dCcD_ShapeAttr3Fv = .text:0x8032AEC0; // type:function size:0x8 -dCcD_ShapeAttr_0x0C__15dCcD_ShapeAttr3Fv = .text:0x8032AED0; // type:function size:0x28 -dCcD_ShapeAttr_0x10__15dCcD_ShapeAttr3Fv = .text:0x8032AF00; // type:function size:0x1C -dCcD_ShapeAttr_0x14__15dCcD_ShapeAttr3Fv = .text:0x8032AF20; // type:function size:0x10 -dCcD_ShapeAttr_0x20__15dCcD_ShapeAttr3Fv = .text:0x8032AF30; // type:function size:0xC -dCcD_ShapeAttr_0x24__15dCcD_ShapeAttr3Fv = .text:0x8032AF40; // type:function size:0x2C -dCcD_ShapeAttr_0x18__15dCcD_ShapeAttr3Fv = .text:0x8032AF70; // type:function size:0xC -dCcD_ShapeAttr_0x1C__15dCcD_ShapeAttr3Fv = .text:0x8032AF80; // type:function size:0xC -dCcD_ShapeAttr_0x28__15dCcD_ShapeAttr3Fv = .text:0x8032AF90; // type:function size:0x1C -dCcD_ShapeAttr_0x30__15dCcD_ShapeAttr3Fv = .text:0x8032AFB0; // type:function size:0x8 -dCcD_ShapeAttr_0x38__15dCcD_ShapeAttr3Fv = .text:0x8032AFC0; // type:function size:0xC -dCcD_ShapeAttr_0x3C__15dCcD_ShapeAttr3Fv = .text:0x8032AFD0; // type:function size:0xC -dCcD_ShapeAttr_0x2C__15dCcD_ShapeAttr3Fv = .text:0x8032AFE0; // type:function size:0x84 -dCcD_ShapeAttr_0x34__15dCcD_ShapeAttr3Fv = .text:0x8032B070; // type:function size:0xC -dCcD_ShapeAttr_0x44__15dCcD_ShapeAttr3Fv = .text:0x8032B080; // type:function size:0x64 -dCcD_ShapeAttr_0x48__15dCcD_ShapeAttr3Fv = .text:0x8032B0F0; // type:function size:0xE8 -getShapeAccess__15dCcD_ShapeAttr3Fv = .text:0x8032B1E0; // type:function size:0x5C -dCcD_ShapeAttr_0x50__15dCcD_ShapeAttr3Fv = .text:0x8032B240; // type:function size:0x1C -dCcD_ShapeAttr_0x58__15dCcD_ShapeAttr3Fv = .text:0x8032B260; // type:function size:0x1C -__ct__15dCcD_ShapeAttr4Fv = .text:0x8032B280; // type:function size:0x44 -__dt__15dCcD_ShapeAttr4Fv = .text:0x8032B2D0; // type:function size:0x58 -init__15dCcD_ShapeAttr4FRC15dCcD_SrcSphAttr = .text:0x8032B330; // type:function size:0x50 -getVirtualCenter__15dCcD_ShapeAttr4Fv = .text:0x8032B380; // type:function size:0x8 -dCcD_ShapeAttr_0x0C__15dCcD_ShapeAttr4Fv = .text:0x8032B390; // type:function size:0x190 -dCcD_ShapeAttr_0x10__15dCcD_ShapeAttr4Fv = .text:0x8032B520; // type:function size:0x1C -dCcD_ShapeAttr_0x14__15dCcD_ShapeAttr4Fv = .text:0x8032B540; // type:function size:0x10 -dCcD_ShapeAttr_0x20__15dCcD_ShapeAttr4Fv = .text:0x8032B550; // type:function size:0x30 -dCcD_ShapeAttr_0x24__15dCcD_ShapeAttr4Fv = .text:0x8032B580; // type:function size:0x10 -dCcD_ShapeAttr_0x18__15dCcD_ShapeAttr4Fv = .text:0x8032B590; // type:function size:0x14 -dCcD_ShapeAttr_0x1C__15dCcD_ShapeAttr4Fv = .text:0x8032B5B0; // type:function size:0xC -dCcD_ShapeAttr_0x28__15dCcD_ShapeAttr4Fv = .text:0x8032B5C0; // type:function size:0x1C -dCcD_ShapeAttr_0x30__15dCcD_ShapeAttr4Fv = .text:0x8032B5E0; // type:function size:0x8 -dCcD_ShapeAttr_0x38__15dCcD_ShapeAttr4Fv = .text:0x8032B5F0; // type:function size:0x10 -dCcD_ShapeAttr_0x3C__15dCcD_ShapeAttr4Fv = .text:0x8032B600; // type:function size:0xC -dCcD_ShapeAttr_0x2C__15dCcD_ShapeAttr4Fv = .text:0x8032B610; // type:function size:0x8C -dCcD_ShapeAttr_0x34__15dCcD_ShapeAttr4Fv = .text:0x8032B6A0; // type:function size:0xC -dCcD_ShapeAttr_0x44__15dCcD_ShapeAttr4Fv = .text:0x8032B6B0; // type:function size:0x8 -dCcD_ShapeAttr_0x48__15dCcD_ShapeAttr4Fv = .text:0x8032B6C0; // type:function size:0xA4 -getShapeAccess__15dCcD_ShapeAttr4Fv = .text:0x8032B770; // type:function size:0x58 -dCcD_ShapeAttr_0x50__15dCcD_ShapeAttr4Fv = .text:0x8032B7D0; // type:function size:0x1C -dCcD_ShapeAttr_0x54__15dCcD_ShapeAttr4Fv = .text:0x8032B7F0; // type:function size:0x20 -dCcD_ShapeAttr_0x58__15dCcD_ShapeAttr4Fv = .text:0x8032B810; // type:function size:0x1C -__ct__11dCcD_GObjAtFv = .text:0x8032B830; // type:function size:0x44 -__dt__11dCcD_GObjAtFv = .text:0x8032B880; // type:function size:0x58 -init__11dCcD_GObjAtFPC14dCcD_SrcGObjAt = .text:0x8032B8E0; // type:function size:0x94 -setSomeAtFlags__11dCcD_GObjAtFUl = .text:0x8032B980; // type:function size:0x14 -adjustHitPos__11dCcD_GObjAtFff = .text:0x8032B9A0; // type:function size:0x1C -__ct__11dCcD_GObjTgFv = .text:0x8032B9C0; // type:function size:0x6C -__dt__11dCcD_GObjTgFv = .text:0x8032BA30; // type:function size:0x58 -init__11dCcD_GObjTgFPC14dCcD_SrcGObjTg = .text:0x8032BA90; // type:function size:0x64 -adjustHitPos__11dCcD_GObjTgFff = .text:0x8032BB00; // type:function size:0x34 -__ct__11dCcD_GObjCoFv = .text:0x8032BB40; // type:function size:0x48 -__dt__11dCcD_GObjCoFv = .text:0x8032BB90; // type:function size:0x58 -init__11dCcD_GObjCoFPC14dCcD_SrcGObjCo = .text:0x8032BBF0; // type:function size:0x18 -setSomeAtFlags__11dCcD_GObjCoFUl = .text:0x8032BC10; // type:function size:0x1C -adjustHitPos__11dCcD_GObjCoFff = .text:0x8032BC30; // type:function size:0x4 -__sinit_\d_cc_d_cpp = .text:0x8032BC40; // type:function size:0x2C scope:local -@44@__dt__15dCcD_ShapeAttr5Fv = .text:0x8032BC70; // type:function size:0x8 +__dt__12cCcD_UnkAttrFv = .text:0x80329A00; // type:function size:0x58 +Calc__12cCcD_UnkAttrFRC7mVec3_cRC7mVec3_cP7mVec3_c = .text:0x80329A60; // type:function size:0x1B0 +CrossAtTg__12cCcD_UnkAttrFR14cCcD_ShapeAttrP7mVec3_c = .text:0x80329C10; // type:function size:0x1C +CrossAtTg__12cCcD_UnkAttrFR12cCcD_CpsAttrP7mVec3_c = .text:0x80329C30; // type:function size:0xC +CrossAtTg__12cCcD_UnkAttrFR12cCcD_TriAttrP7mVec3_c = .text:0x80329C40; // type:function size:0xC +CrossAtTg__12cCcD_UnkAttrFR12cCcD_UnkAttrP7mVec3_c = .text:0x80329C50; // type:function size:0xC +CrossAtTg__12cCcD_UnkAttrFR12cCcD_CylAttrP7mVec3_c = .text:0x80329C60; // type:function size:0xC +CrossAtTg__12cCcD_UnkAttrFR12cCcD_SphAttrP7mVec3_c = .text:0x80329C70; // type:function size:0xC +CrossCo__12cCcD_UnkAttrFR14cCcD_ShapeAttrPf = .text:0x80329C80; // type:function size:0x1C +CrossCo__12cCcD_UnkAttrFR12cCcD_CpsAttrPf = .text:0x80329CA0; // type:function size:0x84 +CrossCo__12cCcD_UnkAttrFR12cCcD_TriAttrPf = .text:0x80329D30; // type:function size:0x8 +CrossCo__12cCcD_UnkAttrFR12cCcD_UnkAttrPf = .text:0x80329D40; // type:function size:0x8 +CrossCo__12cCcD_UnkAttrFR12cCcD_CylAttrPf = .text:0x80329D50; // type:function size:0xC +CrossCo__12cCcD_UnkAttrFR12cCcD_SphAttrPf = .text:0x80329D60; // type:function size:0xC +CalcAabBox__12cCcD_UnkAttrFv = .text:0x80329D70; // type:function size:0x164 +GetNVec__12cCcD_UnkAttrCFRC7mVec3_cP7mVec3_c = .text:0x80329EE0; // type:function size:0x18 +GetPos__12cCcD_UnkAttrCFPQ34nw4r4math4VEC3 = .text:0x80329F00; // type:function size:0x1C +Set__12cCcD_UnkAttrFRC15cCcD_SrcUnkAttr = .text:0x80329F20; // type:function size:0x5C +GetCoP__12cCcD_UnkAttrFv = .text:0x80329F80; // type:function size:0x8 +TranslateXZ__12cCcD_UnkAttrFff = .text:0x80329F90; // type:function size:0x8 +__ct__12cCcD_CpsAttrFv = .text:0x80329FA0; // type:function size:0x44 +__dt__12cCcD_CpsAttrFv = .text:0x80329FF0; // type:function size:0x58 +Set__12cCcD_CpsAttrFRC15cCcD_SrcCpsAttr = .text:0x8032A050; // type:function size:0x5C +GetCoP__12cCcD_CpsAttrFv = .text:0x8032A0B0; // type:function size:0x8 +CrossAtTg__12cCcD_CpsAttrFR14cCcD_ShapeAttrP7mVec3_c = .text:0x8032A0C0; // type:function size:0x1C +CrossCo__12cCcD_CpsAttrFR14cCcD_ShapeAttrPf = .text:0x8032A0E0; // type:function size:0x1C +CrossCo__12cCcD_CpsAttrFR12cCcD_TriAttrPf = .text:0x8032A100; // type:function size:0x8 +CalcCyl__FRC8cM3dGCylRC7mVec3_cRC7mVec3_cP7mVec3_c = .text:0x8032A110; // type:function size:0x308 +Calc__12cCcD_CpsAttrFRC7mVec3_cRC7mVec3_cP7mVec3_c = .text:0x8032A420; // type:function size:0x28C +CrossAtTg__12cCcD_CpsAttrFR12cCcD_CpsAttrP7mVec3_c = .text:0x8032A6B0; // type:function size:0x14 +CrossAtTg__12cCcD_CpsAttrFR12cCcD_CylAttrP7mVec3_c = .text:0x8032A6D0; // type:function size:0xC +CrossAtTg__12cCcD_CpsAttrFR12cCcD_SphAttrP7mVec3_c = .text:0x8032A6E0; // type:function size:0xC +CrossAtTg__12cCcD_CpsAttrFR12cCcD_TriAttrP7mVec3_c = .text:0x8032A6F0; // type:function size:0xC +CrossAtTg__12cCcD_CpsAttrFR12cCcD_UnkAttrP7mVec3_c = .text:0x8032A700; // type:function size:0xC +SetVirtCenter__12cCcD_CpsAttrFP7mVec3_c = .text:0x8032A710; // type:function size:0xB0 +CrossCoCommon__12cCcD_CpsAttrFR14cCcD_ShapeAttrf = .text:0x8032A7C0; // type:function size:0xBC +CrossCo__12cCcD_CpsAttrFR12cCcD_CpsAttrPf = .text:0x8032A880; // type:function size:0xA4 +CrossCo__12cCcD_CpsAttrFR12cCcD_CylAttrPf = .text:0x8032A930; // type:function size:0x84 +CrossCo__12cCcD_CpsAttrFR12cCcD_SphAttrPf = .text:0x8032A9C0; // type:function size:0x8C +CrossCo__12cCcD_CpsAttrFR12cCcD_UnkAttrPf = .text:0x8032AA50; // type:function size:0x8C +CalcAabBox__12cCcD_CpsAttrFv = .text:0x8032AAE0; // type:function size:0x90 +GetNVec__12cCcD_CpsAttrCFRC7mVec3_cP7mVec3_c = .text:0x8032AB70; // type:function size:0x188 +GetPos__12cCcD_CpsAttrCFPQ34nw4r4math4VEC3 = .text:0x8032AD00; // type:function size:0x1C +GetShapeAccess__12cCcD_CpsAttrCFPQ214cCcD_ShapeAttr5Shape = .text:0x8032AD20; // type:function size:0x50 +TranslateXZ__12cCcD_CpsAttrFff = .text:0x8032AD70; // type:function size:0x34 +__ct__12cCcD_CylAttrFv = .text:0x8032ADB0; // type:function size:0x3C +__dt__12cCcD_CylAttrFv = .text:0x8032ADF0; // type:function size:0x58 +Set__12cCcD_CylAttrFRC15cCcD_SrcCylAttr = .text:0x8032AE50; // type:function size:0x68 +GetCoP__12cCcD_CylAttrFv = .text:0x8032AEC0; // type:function size:0x8 +Calc__12cCcD_CylAttrFRC7mVec3_cRC7mVec3_cP7mVec3_c = .text:0x8032AED0; // type:function size:0x28 +CrossAtTg__12cCcD_CylAttrFR14cCcD_ShapeAttrP7mVec3_c = .text:0x8032AF00; // type:function size:0x1C +CrossAtTg__12cCcD_CylAttrFR12cCcD_CpsAttrP7mVec3_c = .text:0x8032AF20; // type:function size:0x10 +CrossAtTg__12cCcD_CylAttrFR12cCcD_CylAttrP7mVec3_c = .text:0x8032AF30; // type:function size:0xC +CrossAtTg__12cCcD_CylAttrFR12cCcD_SphAttrP7mVec3_c = .text:0x8032AF40; // type:function size:0x2C +CrossAtTg__12cCcD_CylAttrFR12cCcD_TriAttrP7mVec3_c = .text:0x8032AF70; // type:function size:0xC +CrossAtTg__12cCcD_CylAttrFR12cCcD_UnkAttrP7mVec3_c = .text:0x8032AF80; // type:function size:0xC +CrossCo__12cCcD_CylAttrFR14cCcD_ShapeAttrPf = .text:0x8032AF90; // type:function size:0x1C +CrossCo__12cCcD_CylAttrFR12cCcD_TriAttrPf = .text:0x8032AFB0; // type:function size:0x8 +CrossCo__12cCcD_CylAttrFR12cCcD_CylAttrPf = .text:0x8032AFC0; // type:function size:0xC +CrossCo__12cCcD_CylAttrFR12cCcD_SphAttrPf = .text:0x8032AFD0; // type:function size:0xC +CrossCo__12cCcD_CylAttrFR12cCcD_CpsAttrPf = .text:0x8032AFE0; // type:function size:0x84 +CrossCo__12cCcD_CylAttrFR12cCcD_UnkAttrPf = .text:0x8032B070; // type:function size:0xC +CalcAabBox__12cCcD_CylAttrFv = .text:0x8032B080; // type:function size:0x64 +GetNVec__12cCcD_CylAttrCFRC7mVec3_cP7mVec3_c = .text:0x8032B0F0; // type:function size:0xE8 +GetShapeAccess__12cCcD_CylAttrCFPQ214cCcD_ShapeAttr5Shape = .text:0x8032B1E0; // type:function size:0x5C +GetPos__12cCcD_CylAttrCFPQ34nw4r4math4VEC3 = .text:0x8032B240; // type:function size:0x1C +TranslateXZ__12cCcD_CylAttrFff = .text:0x8032B260; // type:function size:0x1C +__ct__12cCcD_SphAttrFv = .text:0x8032B280; // type:function size:0x44 +__dt__12cCcD_SphAttrFv = .text:0x8032B2D0; // type:function size:0x58 +Set__12cCcD_SphAttrFRC15cCcD_SrcSphAttr = .text:0x8032B330; // type:function size:0x50 +GetCoP__12cCcD_SphAttrFv = .text:0x8032B380; // type:function size:0x8 +Calc__12cCcD_SphAttrFRC7mVec3_cRC7mVec3_cP7mVec3_c = .text:0x8032B390; // type:function size:0x190 +CrossAtTg__12cCcD_SphAttrFR14cCcD_ShapeAttrP7mVec3_c = .text:0x8032B520; // type:function size:0x1C +CrossAtTg__12cCcD_SphAttrFR12cCcD_CpsAttrP7mVec3_c = .text:0x8032B540; // type:function size:0x10 +CrossAtTg__12cCcD_SphAttrFR12cCcD_CylAttrP7mVec3_c = .text:0x8032B550; // type:function size:0x30 +CrossAtTg__12cCcD_SphAttrFR12cCcD_SphAttrP7mVec3_c = .text:0x8032B580; // type:function size:0x10 +CrossAtTg__12cCcD_SphAttrFR12cCcD_TriAttrP7mVec3_c = .text:0x8032B590; // type:function size:0x14 +CrossAtTg__12cCcD_SphAttrFR12cCcD_UnkAttrP7mVec3_c = .text:0x8032B5B0; // type:function size:0xC +CrossCo__12cCcD_SphAttrFR14cCcD_ShapeAttrPf = .text:0x8032B5C0; // type:function size:0x1C +CrossCo__12cCcD_SphAttrFR12cCcD_TriAttrPf = .text:0x8032B5E0; // type:function size:0x8 +CrossCo__12cCcD_SphAttrFR12cCcD_CylAttrPf = .text:0x8032B5F0; // type:function size:0x10 +CrossCo__12cCcD_SphAttrFR12cCcD_SphAttrPf = .text:0x8032B600; // type:function size:0xC +CrossCo__12cCcD_SphAttrFR12cCcD_CpsAttrPf = .text:0x8032B610; // type:function size:0x8C +CrossCo__12cCcD_SphAttrFR12cCcD_UnkAttrPf = .text:0x8032B6A0; // type:function size:0xC +CalcAabBox__12cCcD_SphAttrFv = .text:0x8032B6B0; // type:function size:0x8 +GetNVec__12cCcD_SphAttrCFRC7mVec3_cP7mVec3_c = .text:0x8032B6C0; // type:function size:0xA4 +GetShapeAccess__12cCcD_SphAttrCFPQ214cCcD_ShapeAttr5Shape = .text:0x8032B770; // type:function size:0x58 +GetPos__12cCcD_SphAttrCFPQ34nw4r4math4VEC3 = .text:0x8032B7D0; // type:function size:0x1C +GetPosBool__12cCcD_SphAttrCFP7mVec3_c = .text:0x8032B7F0; // type:function size:0x20 +TranslateXZ__12cCcD_SphAttrFff = .text:0x8032B810; // type:function size:0x1C +__ct__10cCcD_ObjAtFv = .text:0x8032B830; // type:function size:0x44 +__dt__10cCcD_ObjAtFv = .text:0x8032B880; // type:function size:0x58 +Set__10cCcD_ObjAtFRC14cCcD_SrcGObjAt = .text:0x8032B8E0; // type:function size:0x94 +SetAtFlag__10cCcD_ObjAtFUl = .text:0x8032B980; // type:function size:0x14 +AdjustHitPos__10cCcD_ObjAtFff = .text:0x8032B9A0; // type:function size:0x1C +__ct__10cCcD_ObjTgFv = .text:0x8032B9C0; // type:function size:0x6C +__dt__10cCcD_ObjTgFv = .text:0x8032BA30; // type:function size:0x58 +Set__10cCcD_ObjTgFRC14cCcD_SrcGObjTg = .text:0x8032BA90; // type:function size:0x64 +AdjustHitPos__10cCcD_ObjTgFff = .text:0x8032BB00; // type:function size:0x34 +__ct__10cCcD_ObjCoFv = .text:0x8032BB40; // type:function size:0x48 +__dt__10cCcD_ObjCoFv = .text:0x8032BB90; // type:function size:0x58 +Set__10cCcD_ObjCoFRC14cCcD_SrcGObjCo = .text:0x8032BBF0; // type:function size:0x18 +SetCoFlag__10cCcD_ObjCoFUl = .text:0x8032BC10; // type:function size:0x1C +AdjustHitPos__10cCcD_ObjCoFff = .text:0x8032BC30; // type:function size:0x4 +__sinit_\c_cc_d_cpp = .text:0x8032BC40; // type:function size:0x2C scope:local +@44@__dt__12cCcD_UnkAttrFv = .text:0x8032BC70; // type:function size:0x8 cM2d_CrossCirLin__FR8cM2dGCirffffPfPf = .text:0x8032BC80; // type:function size:0x238 fn_8032BEC0 = .text:0x8032BEC0; // type:function size:0x40 cM3d_Len2dSqPntAndSegLine__FffffffPfPfPf = .text:0x8032BF00; // type:function size:0xB0 -cM3d_Len3dSqPntAndSegLine__FPC8cM3dGLinPCQ34nw4r4math4VEC3PQ34nw4r4math4VEC3PfPf = .text:0x8032BFB0; // type:function size:0x11C +cM3d_Len3dSqPntAndSegLine__FRC8cM3dGLinRCQ34nw4r4math4VEC3PQ34nw4r4math4VEC3PfPf = .text:0x8032BFB0; // type:function size:0x11C cM3d_SignedLenPlaAndPos__FPC8cM3dGPlaPCQ34nw4r4math4VEC3 = .text:0x8032C0D0; // type:function size:0x84 cM3d_CalcPla__FPCQ34nw4r4math4VEC3PCQ34nw4r4math4VEC3PCQ34nw4r4math4VEC3PQ34nw4r4math4VEC3Pf = .text:0x8032C160; // type:function size:0x10C cM3d_Check_LinLin__FPC8cM3dGLinPC8cM3dGLinPfPf = .text:0x8032C270; // type:function size:0x298 cM3d_Cross_LinPla__FPC8cM3dGLinPC8cM3dGPlaPQ34nw4r4math4VEC3bb = .text:0x8032C510; // type:function size:0x1D0 cM3d_Cross_MinMaxBoxLine__FPCQ34nw4r4math4VEC3PCQ34nw4r4math4VEC3PCQ34nw4r4math4VEC3PCQ34nw4r4math4VEC3 = .text:0x8032C6E0; // type:function size:0xD34 cM3d_InclusionCheckPosIn3PosBox3d__FPCQ34nw4r4math4VEC3PCQ34nw4r4math4VEC3PCQ34nw4r4math4VEC3PCQ34nw4r4math4VEC3f = .text:0x8032D420; // type:function size:0x134 -cM3d_CrossX_Tri__FPC8cM3dGTriPCQ34nw4r4math4VEC3f = .text:0x8032D560; // type:function size:0x224 -cM3d_CrossX_Tri__FPC8cM3dGTriPCQ34nw4r4math4VEC3 = .text:0x8032D790; // type:function size:0x228 -cM3d_CrossY_Tri__FPC8cM3dGTriPCQ34nw4r4math4VEC3 = .text:0x8032D9C0; // type:function size:0x228 +cM3d_CrossX_Tri__FRC8cM3dGTriPCQ34nw4r4math4VEC3f = .text:0x8032D560; // type:function size:0x224 +cM3d_CrossX_Tri__FRC8cM3dGTriPCQ34nw4r4math4VEC3 = .text:0x8032D790; // type:function size:0x228 +cM3d_CrossY_Tri__FRC8cM3dGTriPCQ34nw4r4math4VEC3 = .text:0x8032D9C0; // type:function size:0x228 cM3d_CrossY_Tri_Front__FRCQ34nw4r4math4VEC3RCQ34nw4r4math4VEC3RCQ34nw4r4math4VEC3PCQ34nw4r4math4VEC3 = .text:0x8032DBF0; // type:function size:0x184 -cM3d_CrossY_Tri__FPC8cM3dGTriPCQ34nw4r4math4VEC3Pf = .text:0x8032DD80; // type:function size:0x8C -cM3d_CrossY_Tri__FPC8cM3dGTriPCQ34nw4r4math4VEC3f = .text:0x8032DE10; // type:function size:0x224 -cM3d_CrossY_Tri__FPC8cM3dGTriPCQ34nw4r4math4VEC3PC10cM3d_RangePf = .text:0x8032E040; // type:function size:0xDC -cM3d_CrossZ_Tri__FPC8cM3dGTriPCQ34nw4r4math4VEC3f = .text:0x8032E120; // type:function size:0x224 -cM3d_CrossZ_Tri__FPC8cM3dGTriPCQ34nw4r4math4VEC3 = .text:0x8032E350; // type:function size:0x228 -cM3d_CrossZ_Tri__FPC8cM3dGTriPCQ34nw4r4math4VEC3Pf = .text:0x8032E580; // type:function size:0x8C -cM3d_Cross_LinTri__FPC8cM3dGLinPC8cM3dGTriPQ34nw4r4math4VEC3bb = .text:0x8032E610; // type:function size:0x2F0 -cM3d_Cross_LinTri__FPC8cM3dGLinPCQ34nw4r4math4VEC3PCQ34nw4r4math4VEC3PCQ34nw4r4math4VEC3PC8cM3dGTriPQ34nw4r4math4VEC3bb = .text:0x8032E900; // type:function size:0x2E4 -cM3d_Cross_LinTri_Easy__FPC8cM3dGTriPCQ34nw4r4math4VEC3 = .text:0x8032EBF0; // type:function size:0xD4 -cM3d_Cross_SphPnt__FPC8cM3dGSphPCQ34nw4r4math4VEC3 = .text:0x8032ECD0; // type:function size:0x44 -cM3d_Cross_LinSph__FPC8cM3dGLinPC8cM3dGSphPQ34nw4r4math4VEC3 = .text:0x8032ED20; // type:function size:0x2CC +cM3d_CrossY_Tri__FRC8cM3dGTriPCQ34nw4r4math4VEC3Pf = .text:0x8032DD80; // type:function size:0x8C +cM3d_CrossY_Tri__FRC8cM3dGTriPCQ34nw4r4math4VEC3f = .text:0x8032DE10; // type:function size:0x224 +cM3d_CrossY_Tri__FRC8cM3dGTriPCQ34nw4r4math4VEC3PC10cM3d_RangePf = .text:0x8032E040; // type:function size:0xDC +cM3d_CrossZ_Tri__FRC8cM3dGTriPCQ34nw4r4math4VEC3f = .text:0x8032E120; // type:function size:0x224 +cM3d_CrossZ_Tri__FRC8cM3dGTriPCQ34nw4r4math4VEC3 = .text:0x8032E350; // type:function size:0x228 +cM3d_CrossZ_Tri__FRC8cM3dGTriPCQ34nw4r4math4VEC3Pf = .text:0x8032E580; // type:function size:0x8C +cM3d_Cross_LinTri__FRC8cM3dGLinPC8cM3dGTriPQ34nw4r4math4VEC3bb = .text:0x8032E610; // type:function size:0x2F0 +cM3d_Cross_LinTri__FRC8cM3dGLinPCQ34nw4r4math4VEC3PCQ34nw4r4math4VEC3PCQ34nw4r4math4VEC3PC8cM3dGTriPQ34nw4r4math4VEC3bb = .text:0x8032E900; // type:function size:0x2E4 +cM3d_Cross_LinTri_Easy__FRC8cM3dGTriPCQ34nw4r4math4VEC3 = .text:0x8032EBF0; // type:function size:0xD4 +cM3d_Cross_SphPnt__FRC8cM3dGSphPCQ34nw4r4math4VEC3 = .text:0x8032ECD0; // type:function size:0x44 +cM3d_Cross_LinSph__FRC8cM3dGLinPC8cM3dGSphPQ34nw4r4math4VEC3 = .text:0x8032ED20; // type:function size:0x2CC cM3d_Cross_LinSph_CrossPos__FRC8cM3dGSphRC8cM3dGLinPQ34nw4r4math4VEC3PQ34nw4r4math4VEC3 = .text:0x8032EFF0; // type:function size:0x438 -cM3d_Cross_CylSph__FPC8cM3dGCylPC8cM3dGSphPf = .text:0x8032F430; // type:function size:0x558 -cM3d_Cross_CylSph__FPC8cM3dGCylPC8cM3dGSphPQ34nw4r4math4VEC3Pf = .text:0x8032F990; // type:function size:0x300 -cM3d_Cross_SphSph__FPC8cM3dGSphPC8cM3dGSphPf = .text:0x8032FC90; // type:function size:0xE4 -cM3d_Cross_SphSph__FPC8cM3dGSphPC8cM3dGSphPfPf = .text:0x8032FD80; // type:function size:0x98 -cM3d_Cross_SphSph__FPC8cM3dGSphPC8cM3dGSphPQ34nw4r4math4VEC3 = .text:0x8032FE20; // type:function size:0xE4 -cM3d_CalcSphVsTriCrossPoint__FPC8cM3dGSphPC8cM3dGTriPQ34nw4r4math4VEC3 = .text:0x8032FF10; // type:function size:0xFC -cM3d_Cross_SphTri__FPC8cM3dGSphPC8cM3dGTriPQ34nw4r4math4VEC3PfPQ34nw4r4math4VEC3 = .text:0x80330010; // type:function size:0x330 -cM3d_Cross_CylCyl__FPC8cM3dGCylPC8cM3dGCylPf = .text:0x80330340; // type:function size:0x12C -cM3d_Cross_CylCyl__FPC8cM3dGCylPC8cM3dGCylPQ34nw4r4math4VEC3 = .text:0x80330470; // type:function size:0x1C4 -cM3d_Cross_CylTri__FPC8cM3dGCylPC8cM3dGTriPQ34nw4r4math4VEC3 = .text:0x80330640; // type:function size:0x320 +cM3d_Cross_CylSph__FRC8cM3dGCylRC8cM3dGSphPf = .text:0x8032F430; // type:function size:0x558 +cM3d_Cross_CylSph__FRC8cM3dGCylRC8cM3dGSphPQ34nw4r4math4VEC3Pf = .text:0x8032F990; // type:function size:0x300 +cM3d_Cross_SphSph__FRC8cM3dGSphRC8cM3dGSphPf = .text:0x8032FC90; // type:function size:0xE4 +cM3d_Cross_SphSph__FRC8cM3dGSphRC8cM3dGSphPfPf = .text:0x8032FD80; // type:function size:0x98 +cM3d_Cross_SphSph__FRC8cM3dGSphRC8cM3dGSphPQ34nw4r4math4VEC3 = .text:0x8032FE20; // type:function size:0xE4 +cM3d_CalcSphVsTriCrossPoint__FRC8cM3dGSphRC8cM3dGTriPQ34nw4r4math4VEC3 = .text:0x8032FF10; // type:function size:0xFC +cM3d_Cross_SphTri__FRC8cM3dGSphRC8cM3dGTriPQ34nw4r4math4VEC3PfPQ34nw4r4math4VEC3 = .text:0x80330010; // type:function size:0x330 +cM3d_Cross_CylCyl__FRC8cM3dGCylRC8cM3dGCylPf = .text:0x80330340; // type:function size:0x12C +cM3d_Cross_CylCyl__FRC8cM3dGCylRC8cM3dGCylPQ34nw4r4math4VEC3 = .text:0x80330470; // type:function size:0x1C4 +cM3d_Cross_CylTri__FRC8cM3dGCylRC8cM3dGTriPQ34nw4r4math4VEC3 = .text:0x80330640; // type:function size:0x320 fn_80330960 = .text:0x80330960; // type:function size:0x34 -cM3d_Cross_CylLin__FPC8cM3dGCylPC8cM3dGLinPQ34nw4r4math4VEC3PQ34nw4r4math4VEC3 = .text:0x803309A0; // type:function size:0xB30 -cM3d_Cross_CylPntPnt__FPC8cM3dGCylPCQ34nw4r4math4VEC3PCQ34nw4r4math4VEC3PQ34nw4r4math4VEC3PQ34nw4r4math4VEC3 = .text:0x803314D0; // type:function size:0x5C -cM3d_Cross_CylPnt__FPC8cM3dGCylPCQ34nw4r4math4VEC3 = .text:0x80331530; // type:function size:0x64 +cM3d_Cross_CylLin__FRC8cM3dGCylRC8cM3dGLinPQ34nw4r4math4VEC3PQ34nw4r4math4VEC3 = .text:0x803309A0; // type:function size:0xB30 +cM3d_Cross_CylPntPnt__FRC8cM3dGCylPCQ34nw4r4math4VEC3PCQ34nw4r4math4VEC3PQ34nw4r4math4VEC3PQ34nw4r4math4VEC3 = .text:0x803314D0; // type:function size:0x5C +cM3d_Cross_CylPnt__FRC8cM3dGCylPCQ34nw4r4math4VEC3 = .text:0x80331530; // type:function size:0x64 fn_803315A0 = .text:0x803315A0; // type:function size:0x9F8 fn_80331FA0 = .text:0x80331FA0; // type:function size:0x2BC -fn_80332260 = .text:0x80332260; // type:function size:0x19C8 +cM3d_Cross_CpsCps__FRC8cM3dGCpsRC8cM3dGCpsPQ34nw4r4math4VEC3PfPf = .text:0x80332260; // type:function size:0x19C8 fn_80333C30 = .text:0x80333C30; // type:function size:0x100 -fn_80333D30 = .text:0x80333D30; // type:function size:0x244 +cM3d_Cross_CpsCyl__FRC8cM3dGCpsRC8cM3dGCylPQ34nw4r4math4VEC3 = .text:0x80333D30; // type:function size:0x244 cM3d_Cross_CpsSph_CrossPos__FRC8cM3dGCpsRC8cM3dGSphRCQ34nw4r4math4VEC3PQ34nw4r4math4VEC3 = .text:0x80333F80; // type:function size:0x14C cM3d_Cross_CpsSph__FRC8cM3dGCpsRC8cM3dGSphPQ34nw4r4math4VEC3 = .text:0x803340D0; // type:function size:0x628 cM3d_Cross_TriTri__FRC8cM3dGTriRC8cM3dGTriPQ34nw4r4math4VEC3 = .text:0x80334700; // type:function size:0x2B8 -cM3d_Cross_CpsTri__FRC8cM3dGCps8cM3dGTriPQ34nw4r4math4VEC3 = .text:0x803349C0; // type:function size:0x360 +cM3d_Cross_CpsTri__FRC8cM3dGCpsRC8cM3dGTriPQ34nw4r4math4VEC3 = .text:0x803349C0; // type:function size:0x360 fn_80334D20 = .text:0x80334D20; // type:function size:0x1C4 cM3d_CalcVecZAngle__FRCQ34nw4r4math4VEC3P7mAng3_c = .text:0x80334EF0; // type:function size:0xA0 fn_80334F90 = .text:0x80334F90; // type:function size:0x110 @@ -19003,19 +19003,19 @@ fn_803350A0 = .text:0x803350A0; // type:function size:0x18 cM3d_PlaneCrossLineProcWork__FfffffffPfPf = .text:0x803350C0; // type:function size:0x2C cM3d_2PlaneCrossLine__FRC8cM3dGPlaRC8cM3dGPlaP8cM3dGLin = .text:0x803350F0; // type:function size:0x194 cM3d_3PlaneCrossPos__FRC8cM3dGPlaRC8cM3dGPlaRC8cM3dGPlaPQ34nw4r4math4VEC3 = .text:0x80335290; // type:function size:0x144 -cM3d_lineVsPosSuisenCross__FPC8cM3dGLinPCQ34nw4r4math4VEC3PQ34nw4r4math4VEC3 = .text:0x803353E0; // type:function size:0x10 +cM3d_lineVsPosSuisenCross__FRC8cM3dGLinRCQ34nw4r4math4VEC3PQ34nw4r4math4VEC3 = .text:0x803353E0; // type:function size:0x10 cM3d_lineVsPosSuisenCross__FRCQ34nw4r4math4VEC3RCQ34nw4r4math4VEC3RCQ34nw4r4math4VEC3PQ34nw4r4math4VEC3 = .text:0x803353F0; // type:function size:0xEC -fn_803354e0__FP8cM3dGUnkP8cM3dGUnkPQ34nw4r4math4VEC3 = .text:0x803354E0; // type:function size:0xB20 +cM3d_Cross_UnkTri__FRC8cM3dGUnkR8cM3dGTriPQ34nw4r4math4VEC3 = .text:0x803354E0; // type:function size:0xB20 fn_80336000 = .text:0x80336000; // type:function size:0x108 -fn_80336110__FP8cM3dGCylP8cM3dGUnkPQ34nw4r4math4VEC3 = .text:0x80336110; // type:function size:0x3C4 -fn_803364e0__FP8cM3dGCylP8cM3dGUnkPf = .text:0x803364E0; // type:function size:0x858 +cM3d_Cross_CylUnk__FRC8cM3dGCylR8cM3dGUnkPQ34nw4r4math4VEC3 = .text:0x80336110; // type:function size:0x3C4 +cM3d_Cross_CylUnk__FRC8cM3dGCylR8cM3dGUnkPf = .text:0x803364E0; // type:function size:0x858 fn_80336D40 = .text:0x80336D40; // type:function size:0x4C -fn_80336d90__FP8cM3dGCpsP8cM3dGUnkPQ34nw4r4math4VEC3 = .text:0x80336D90; // type:function size:0x68C +cM3d_Cross_CpsUnk__FRC8cM3dGCpsR8cM3dGUnkPQ34nw4r4math4VEC3 = .text:0x80336D90; // type:function size:0x68C fn_80337420 = .text:0x80337420; // type:function size:0x264 -fn_80337690__FP8cM3dGUnkP8cM3dGSphPQ34nw4r4math4VEC3 = .text:0x80337690; // type:function size:0xE4 -fn_80337780__FP8cM3dGUnkP8cM3dGSphPf = .text:0x80337780; // type:function size:0x308 -fn_80337A90 = .text:0x80337A90; // type:function size:0x80 -fn_80337B10 = .text:0x80337B10; // type:function size:0x48 +cM3d_Cross_UnkSph__FRC8cM3dGUnkR8cM3dGSphPQ34nw4r4math4VEC3 = .text:0x80337690; // type:function size:0xE4 +cM3d_Cross_UnkSph__FRC8cM3dGUnkR8cM3dGSphPf = .text:0x80337780; // type:function size:0x308 +cM3d_Normalize__FPQ34nw4r4math4VEC3 = .text:0x80337A90; // type:function size:0x80 +cM3d_Normalize_Ex__FPQ34nw4r4math4VEC3 = .text:0x80337B10; // type:function size:0x48 SetMin__8cM3dGAabFRC7mVec3_c = .text:0x80337B60; // type:function size:0x40 SetMax__8cM3dGAabFRC7mVec3_c = .text:0x80337BA0; // type:function size:0x40 CalcCenter__8cM3dGAabCFR7mVec3_c = .text:0x80337BE0; // type:function size:0x44 @@ -19028,14 +19028,14 @@ __ct__8cM3dGCpsFv = .text:0x80337EA0; // type:function size:0x18 SetR__8cM3dGCpsFf = .text:0x80337EC0; // type:function size:0x20 Set_0x1C__8cM3dGCpsFf = .text:0x80337EE0; // type:function size:0x8 Set__8cM3dGCpsFRC7mVec3_cRC7mVec3_cf = .text:0x80337EF0; // type:function size:0x34 -fn_80337f30__8cM3dGCpsFP8cM3dGUnkP7mVec3_c = .text:0x80337F30; // type:function size:0x4 +Cross__8cM3dGCpsFR8cM3dGUnkP7mVec3_c = .text:0x80337F30; // type:function size:0x4 fn_80337f40__8cM3dGCpsCFRC7mVec3_c = .text:0x80337F40; // type:function size:0xD8 SetC__8cM3dGCylFRC7mVec3_cff = .text:0x80338020; // type:function size:0x5C SetC__8cM3dGCylFRC7mVec3_c = .text:0x80338080; // type:function size:0x1C SetH__8cM3dGCylFf = .text:0x803380A0; // type:function size:0x18 SetR__8cM3dGCylFf = .text:0x803380C0; // type:function size:0x18 -fn_803380e0__8cM3dGCylFP8cM3dGUnkP7mVec3_c = .text:0x803380E0; // type:function size:0x4 -fn_803380f0__8cM3dGCylFP8cM3dGUnkPf = .text:0x803380F0; // type:function size:0x4 +Cross__8cM3dGCylFR8cM3dGUnkP7mVec3_c = .text:0x803380E0; // type:function size:0x4 +Cross__8cM3dGCylFR8cM3dGUnkPf = .text:0x803380F0; // type:function size:0x4 Cross__8cM3dGCylCFRC7mVec3_c = .text:0x80338100; // type:function size:0x6C Clamp__8cM3dGCylCFRC7mVec3_cR7mVec3_c = .text:0x80338170; // type:function size:0x1D8 SetStartEnd__8cM3dGLinFRCQ34nw4r4math4VEC3RCQ34nw4r4math4VEC3 = .text:0x80338350; // type:function size:0x34 @@ -19051,8 +19051,8 @@ SetC__8cM3dGSphFPC7mVec3_c = .text:0x80338690; // type:function size:0x1C Set__8cM3dGSphFPC7mVec3_cf = .text:0x803386B0; // type:function size:0x44 SetR__8cM3dGSphFf = .text:0x80338700; // type:function size:0x18 SetC__8cM3dGSphFfff = .text:0x80338720; // type:function size:0x30 -fn_80338750__8cM3dGSphFP8cM3dGUnkP7mVec3_c = .text:0x80338750; // type:function size:0x10 -fn_80338760__8cM3dGSphFP8cM3dGUnkPf = .text:0x80338760; // type:function size:0x10 +Cross__8cM3dGSphFR8cM3dGUnkP7mVec3_c = .text:0x80338750; // type:function size:0x10 +Cross__8cM3dGSphFR8cM3dGUnkPf = .text:0x80338760; // type:function size:0x10 GetYDist__8cM3dGSphCFf = .text:0x80338770; // type:function size:0x6C Cross__8cM3dGSphFPC8cM3dGTriPfP7mVec3_c = .text:0x803387E0; // type:function size:0x10 Clamp__8cM3dGSphCFRC7mVec3_cR7mVec3_c = .text:0x803387F0; // type:function size:0xE0 @@ -19062,13 +19062,13 @@ __ct__8cM3dGUnkFv = .text:0x80338940; // type:function size:0xB4 Set__8cM3dGUnkFRC7mVec3_cRC7mVec3_c = .text:0x80338A00; // type:function size:0x144 Update__8cM3dGUnkFv = .text:0x80338B50; // type:function size:0xA0 GetStartEnd__8cM3dGUnkFR7mVec3_cR7mVec3_c = .text:0x80338BF0; // type:function size:0x34 -fn_80338c30__8cM3dGUnkFP8cM3dGCpsP7mVec3_c = .text:0x80338C30; // type:function size:0x10 -fn_80338c40__8cM3dGUnkFP8cM3dGUnkP7mVec3_c = .text:0x80338C40; // type:function size:0x5C -fn_80338ca0__8cM3dGUnkFv = .text:0x80338CA0; // type:function size:0x8 -fn_80338cb0__8cM3dGUnkFP8cM3dGCylP7mVec3_c = .text:0x80338CB0; // type:function size:0x10 -fn_80338cc0__8cM3dGUnkFP8cM3dGCylPf = .text:0x80338CC0; // type:function size:0x10 -fn_80338cd0__8cM3dGUnkFP8cM3dGSphP7mVec3_c = .text:0x80338CD0; // type:function size:0x4 -fn_80338ce0__8cM3dGUnkFP8cM3dGSphPf = .text:0x80338CE0; // type:function size:0x4 +Cross__8cM3dGUnkFR8cM3dGCpsP7mVec3_c = .text:0x80338C30; // type:function size:0x10 +Cross__8cM3dGUnkFR8cM3dGTriP7mVec3_c = .text:0x80338C40; // type:function size:0x5C +Cross__8cM3dGUnkFR8cM3dGUnkP7mVec3_c = .text:0x80338CA0; // type:function size:0x8 +Cross__8cM3dGUnkFR8cM3dGCylP7mVec3_c = .text:0x80338CB0; // type:function size:0x10 +Cross__8cM3dGUnkFR8cM3dGCylPf = .text:0x80338CC0; // type:function size:0x10 +Cross__8cM3dGUnkFR8cM3dGSphP7mVec3_c = .text:0x80338CD0; // type:function size:0x4 +Cross__8cM3dGUnkFR8cM3dGSphPf = .text:0x80338CE0; // type:function size:0x4 Set__8cM3dGUnkFRC6mMtx_c = .text:0x80338CF0; // type:function size:0x64 Set__8cM3dGUnkFRC7mVec3_cRC4mAng = .text:0x80338D60; // type:function size:0x78 Cross__8cM3dGUnkFRC7mVec3_c = .text:0x80338DE0; // type:function size:0xBC @@ -19694,94 +19694,94 @@ fn_80353920 = .text:0x80353920; // type:function size:0xDC fn_80353A00 = .text:0x80353A00; // type:function size:0x128 GetIsDraw__8dBgWTimeFi = .text:0x80353B30; // type:function size:0x8 DrawOnMap__8dBgWTimeFib = .text:0x80353B40; // type:function size:0x4 -__ct__9dCcD_Unk1Fv = .text:0x80353B50; // type:function size:0x4C -__dt__9dCcD_Unk1Fv = .text:0x80353BA0; // type:function size:0x68 -init__9dCcD_Unk1FRC11dCcD_SrcUnk = .text:0x80353C10; // type:function size:0x44 -dCcD_GObjInf_0x0C__9dCcD_Unk1Fv = .text:0x80353C60; // type:function size:0x10 -unknownCalc__9dCcD_Unk1Fv = .text:0x80353C70; // type:function size:0x14 -__ct__10dCcD_EmptyFv = .text:0x80353C90; // type:function size:0x4C -__dt__10dCcD_EmptyFv = .text:0x80353CE0; // type:function size:0x68 -init__10dCcD_EmptyFRC13dCcD_SrcEmpty = .text:0x80353D50; // type:function size:0x4 -dCcD_GObjInf_0x0C__10dCcD_EmptyFv = .text:0x80353D60; // type:function size:0x10 +__ct__8dCcD_CpsFv = .text:0x80353B50; // type:function size:0x4C +__dt__8dCcD_CpsFv = .text:0x80353BA0; // type:function size:0x68 +Set__8dCcD_CpsFRC11dCcD_SrcCps = .text:0x80353C10; // type:function size:0x44 +GetShapeAttr__8dCcD_CpsFv = .text:0x80353C60; // type:function size:0x10 +unknownCalc__8dCcD_CpsFv = .text:0x80353C70; // type:function size:0x14 +__ct__8dCcD_TriFv = .text:0x80353C90; // type:function size:0x4C +__dt__8dCcD_TriFv = .text:0x80353CE0; // type:function size:0x68 +Set__8dCcD_TriFRC11dCcD_SrcTri = .text:0x80353D50; // type:function size:0x4 +GetShapeAttr__8dCcD_TriFv = .text:0x80353D60; // type:function size:0x10 __ct__8dCcD_CylFv = .text:0x80353D70; // type:function size:0x4C __dt__8dCcD_CylFv = .text:0x80353DC0; // type:function size:0x68 -init__8dCcD_CylFRC11dCcD_SrcCyl = .text:0x80353E30; // type:function size:0x44 -dCcD_GObjInf_0x0C__8dCcD_CylFv = .text:0x80353E80; // type:function size:0x10 +Set__8dCcD_CylFRC11dCcD_SrcCyl = .text:0x80353E30; // type:function size:0x44 +GetShapeAttr__8dCcD_CylFv = .text:0x80353E80; // type:function size:0x10 setCenter__8dCcD_CylFRC7mVec3_c = .text:0x80353E90; // type:function size:0x28 moveCenter__8dCcD_CylFRC7mVec3_c = .text:0x80353EC0; // type:function size:0x64 __ct__8dCcD_SphFv = .text:0x80353F30; // type:function size:0x4C __dt__8dCcD_SphFv = .text:0x80353F80; // type:function size:0x68 -init__8dCcD_SphFRC11dCcD_SrcSph = .text:0x80353FF0; // type:function size:0x44 +Set__8dCcD_SphFRC11dCcD_SrcSph = .text:0x80353FF0; // type:function size:0x44 setCenter__8dCcD_SphFRC7mVec3_c = .text:0x80354040; // type:function size:0x28 moveCenter__8dCcD_SphFRC7mVec3_c = .text:0x80354070; // type:function size:0x64 setCenterAndAtVec__8dCcD_SphFRC7mVec3_cRC7mVec3_c = .text:0x803540E0; // type:function size:0x20 -dCcD_GObjInf_0x0C__8dCcD_SphFv = .text:0x80354100; // type:function size:0x10 -__ct__9dCcD_AabbFv = .text:0x80354110; // type:function size:0x54 -__dt__9dCcD_AabbFv = .text:0x80354170; // type:function size:0x68 -init__9dCcD_AabbFRC12dCcD_SrcAabb = .text:0x803541E0; // type:function size:0x44 -dCcD_GObjInf_0x0C__9dCcD_AabbFv = .text:0x80354230; // type:function size:0x10 -@272@__dt__9dCcD_Unk1Fv = .text:0x80354240; // type:function size:0x8 -@272@__dt__10dCcD_EmptyFv = .text:0x80354250; // type:function size:0x8 +GetShapeAttr__8dCcD_SphFv = .text:0x80354100; // type:function size:0x10 +__ct__8dCcD_UnkFv = .text:0x80354110; // type:function size:0x54 +__dt__8dCcD_UnkFv = .text:0x80354170; // type:function size:0x68 +Set__8dCcD_UnkFRC11dCcD_SrcUnk = .text:0x803541E0; // type:function size:0x44 +GetShapeAttr__8dCcD_UnkFv = .text:0x80354230; // type:function size:0x10 +@272@__dt__8dCcD_CpsFv = .text:0x80354240; // type:function size:0x8 +@272@__dt__8dCcD_TriFv = .text:0x80354250; // type:function size:0x8 @272@__dt__8dCcD_CylFv = .text:0x80354260; // type:function size:0x8 @272@__dt__8dCcD_SphFv = .text:0x80354270; // type:function size:0x8 -@316@__dt__9dCcD_AabbFv = .text:0x80354280; // type:function size:0x8 -@272@__dt__9dCcD_AabbFv = .text:0x80354290; // type:function size:0x8 +@316@__dt__8dCcD_UnkFv = .text:0x80354280; // type:function size:0x8 +@272@__dt__8dCcD_UnkFv = .text:0x80354290; // type:function size:0x8 fn_803542A0 = .text:0x803542A0; // type:function size:0x14 fn_803542C0 = .text:0x803542C0; // type:function size:0x54 fn_80354320 = .text:0x80354320; // type:function size:0x54 fn_80354380 = .text:0x80354380; // type:function size:0x48 fn_803543D0 = .text:0x803543D0; // type:function size:0x14 -fn_803543F0 = .text:0x803543F0; // type:function size:0x40 -fn_80354430 = .text:0x80354430; // type:function size:0x5C -fn_80354490 = .text:0x80354490; // type:function size:0x10 -fn_803544A0 = .text:0x803544A0; // type:function size:0x24 -fn_803544D0 = .text:0x803544D0; // type:function size:0x10 -fn_803544E0 = .text:0x803544E0; // type:function size:0x40 -fn_80354520 = .text:0x80354520; // type:function size:0x1C -fn_80354540 = .text:0x80354540; // type:function size:0xA4 -fn_803545F0 = .text:0x803545F0; // type:function size:0xB4 -fn_803546B0 = .text:0x803546B0; // type:function size:0x30 -fn_803546E0 = .text:0x803546E0; // type:function size:0x68 -fn_80354750 = .text:0x80354750; // type:function size:0x240 -fn_80354990 = .text:0x80354990; // type:function size:0x504 -fn_80354EA0 = .text:0x80354EA0; // type:function size:0xAC -fn_80354F50 = .text:0x80354F50; // type:function size:0x9C -fn_80354FF0 = .text:0x80354FF0; // type:function size:0x90 -getColliderManager__15ColliderManagerFv = .text:0x80355080; // type:function size:0x8 -ColliderManager__Ct = .text:0x80355090; // type:function size:0x428 -ColliderManager__ctor = .text:0x803554C0; // type:function size:0x4C -fn_80355510 = .text:0x80355510; // type:function size:0x70 -ColliderManager__init = .text:0x80355580; // type:function size:0x3C -fn_803555C0 = .text:0x803555C0; // type:function size:0x34 -fn_80355600 = .text:0x80355600; // type:function size:0x30 -fn_80355630 = .text:0x80355630; // type:function size:0x218 -fn_80355850 = .text:0x80355850; // type:function size:0x1CC -fn_80355A20 = .text:0x80355A20; // type:function size:0x8CC -fn_803562F0 = .text:0x803562F0; // type:function size:0x170 -fn_80356460 = .text:0x80356460; // type:function size:0x138 -ColliderManager__calcHits1 = .text:0x803565A0; // type:function size:0x168 -fn_80356710 = .text:0x80356710; // type:function size:0xD4 -fn_803567F0 = .text:0x803567F0; // type:function size:0xF0 -fn_803568E0 = .text:0x803568E0; // type:function size:0xEC -fn_803569D0 = .text:0x803569D0; // type:function size:0xE8 -fn_80356AC0 = .text:0x80356AC0; // type:function size:0x258 -fn_80356D20 = .text:0x80356D20; // type:function size:0x2A4 -fn_80356FD0 = .text:0x80356FD0; // type:function size:0x184 -fn_80357160 = .text:0x80357160; // type:function size:0x21C -fn_80357380 = .text:0x80357380; // type:function size:0x274 -fn_80357600 = .text:0x80357600; // type:function size:0x1E8 -fn_803577F0 = .text:0x803577F0; // type:function size:0x2D4 -fn_80357AD0 = .text:0x80357AD0; // type:function size:0x1B4 -fn_80357C90 = .text:0x80357C90; // type:function size:0x218 -addCollider__15ColliderManagerFP12dCcD_GObjInf = .text:0x80357EB0; // type:function size:0x13C -fn_80357FF0 = .text:0x80357FF0; // type:function size:0x4 -fn_80358000 = .text:0x80358000; // type:function size:0x1DC -ColliderManager__CalcArea = .text:0x803581E0; // type:function size:0x1D0 -fn_803583B0 = .text:0x803583B0; // type:function size:0xA4 -fn_80358460 = .text:0x80358460; // type:function size:0x8 -fn_80358470 = .text:0x80358470; // type:function size:0x114 -fn_80358590 = .text:0x80358590; // type:function size:0xC -fn_803585A0 = .text:0x803585A0; // type:function size:0xB4 +__ct__12dCcMassS_ObjFv = .text:0x803543F0; // type:function size:0x40 +__dt__12dCcMassS_ObjFv = .text:0x80354430; // type:function size:0x5C +Set__12dCcMassS_ObjFP8cCcD_ObjUcPFP12dAcObjBase_cP7mVec3_cUl_v = .text:0x80354490; // type:function size:0x10 +Clear__12dCcMassS_ObjFv = .text:0x803544A0; // type:function size:0x24 +__ct__15dCcMassS_HitInfFv = .text:0x803544D0; // type:function size:0x10 +__dt__15dCcMassS_HitInfFv = .text:0x803544E0; // type:function size:0x40 +ClearPointer__15dCcMassS_HitInfFv = .text:0x80354520; // type:function size:0x1C +__ct__12dCcMassS_MngFv = .text:0x80354540; // type:function size:0xA4 +__dt__12dCcMassS_MngFv = .text:0x803545F0; // type:function size:0xB4 +Ct__12dCcMassS_MngFv = .text:0x803546B0; // type:function size:0x30 +SetAttr__12dCcMassS_MngFffUcUc = .text:0x803546E0; // type:function size:0x68 +Prepare__12dCcMassS_MngFv = .text:0x80354750; // type:function size:0x240 +Chk__12dCcMassS_MngFP7mVec3_cPP12dAcObjBase_cP15dCcMassS_HitInf = .text:0x80354990; // type:function size:0x504 +Clear__12dCcMassS_MngFv = .text:0x80354EA0; // type:function size:0xAC +SetObj__12dCcMassS_MngFP8cCcD_ObjUc = .text:0x80354F50; // type:function size:0x9C +SetArea__12dCcMassS_MngFP8cCcD_ObjUcPFP12dAcObjBase_cP7mVec3_cUl_v = .text:0x80354FF0; // type:function size:0x90 +GetInstance__4dCcSFv = .text:0x80355080; // type:function size:0x8 +Ct_cCcS__4dCcSFv = .text:0x80355090; // type:function size:0x428 +__ct__4dCcSFv = .text:0x803554C0; // type:function size:0x4C +__dt__4dCcSFv = .text:0x80355510; // type:function size:0x70 +Ct__4dCcSFv = .text:0x80355580; // type:function size:0x3C +Dt__4dCcSFv = .text:0x803555C0; // type:function size:0x34 +ChkRemoveActor__4dCcSFP12dAcObjBase_c = .text:0x80355600; // type:function size:0x30 +ChkNoHitAtTg__4dCcSFP8cCcD_ObjP8cCcD_Obj = .text:0x80355630; // type:function size:0x218 +ChkAtTgCommonHitInf__4dCcSFP8cCcD_ObjP8cCcD_Obj = .text:0x80355850; // type:function size:0x1CC +ChkAtTg__4dCcSFv = .text:0x80355A20; // type:function size:0x8CC +ChkNoHitCo__4dCcSFP8cCcD_ObjP8cCcD_Obj = .text:0x803562F0; // type:function size:0x170 +SetCoCommonHitInf__4dCcSFP8cCcD_ObjP7mVec3_cP8cCcD_ObjP7mVec3_cf = .text:0x80356460; // type:function size:0x138 +ChkCo__4dCcSFv = .text:0x803565A0; // type:function size:0x168 +ChkSheildFrontRange__4dCcSFP8cCcD_ObjP8cCcD_Obj = .text:0x80356710; // type:function size:0xD4 +ChkShield__4dCcSFP8cCcD_ObjP8cCcD_ObjPPFP12dAcObjBase_cP8cCcD_ObjP12dAcObjBase_cP8cCcD_Obj_i = .text:0x803567F0; // type:function size:0xF0 +ChkAtTgHitAfterCross__4dCcSFbbP8cCcD_ObjP8cCcD_Obj = .text:0x803568E0; // type:function size:0xEC +SetCoObjInf__4dCcSFbbP8cCcD_ObjP8cCcD_Obj = .text:0x803569D0; // type:function size:0xE8 +SetPosCorrect__4dCcSFP8cCcD_ObjP7mVec3_cP8cCcD_ObjP7mVec3_cf = .text:0x80356AC0; // type:function size:0x258 +CalcParticleAngle__4dCcSFP8cCcD_ObjP8cCcD_ObjP7mAng3_cb = .text:0x80356D20; // type:function size:0x2A4 +fn_80356fd0__4dCcSFP7mVec3_cP8cCcD_ObjP8cCcD_Obj = .text:0x80356FD0; // type:function size:0x184 +ProcAtTgHitmark__4dCcSFP8cCcD_ObjP8cCcD_ObjP7mVec3_cUlP7mVec3_c = .text:0x80357160; // type:function size:0x21C +SetAtTgObjInf__4dCcSFbbP8cCcD_ObjP8cCcD_ObjP7mVec3_cb = .text:0x80357380; // type:function size:0x274 +ChkCamera__4dCcSFR7mVec3_cR7mVec3_cP12dAcObjBase_cP12dAcObjBase_cP12dAcObjBase_cf = .text:0x80357600; // type:function size:0x1E8 +ChkCameraPoint__4dCcSFRC7mVec3_cRC7mVec3_cR7mVec3_cP12dAcObjBase_cP12dAcObjBase_cP12dAcObjBase_cf = .text:0x803577F0; // type:function size:0x2D4 +ChkCo__4dCcSFRC7mVec3_cP12dAcObjBase_c = .text:0x80357AD0; // type:function size:0x1B4 +fn_80357c90__4dCcSFRC7mVec3_cRC7mVec3_cUlPPv = .text:0x80357C90; // type:function size:0x218 +Set__4dCcSFP8cCcD_Obj = .text:0x80357EB0; // type:function size:0x13C +MoveAfterCheck__4dCcSFv = .text:0x80357FF0; // type:function size:0x4 +RemoveDeadObj__4dCcSFv = .text:0x80358000; // type:function size:0x1DC +CalcArea__4dCcSFv = .text:0x803581E0; // type:function size:0x1D0 +Move__4dCcSFv = .text:0x803583B0; // type:function size:0xA4 +MassClear__4dCcSFv = .text:0x80358460; // type:function size:0x8 +SetArea__4dCcSFP6mMtx_c = .text:0x80358470; // type:function size:0x114 +ClearArea__4dCcSFv = .text:0x80358590; // type:function size:0xC +AdjustHitPos__4dCcSFv = .text:0x803585A0; // type:function size:0xB4 fn_80358660 = .text:0x80358660; // type:function size:0x1C fn_80358680 = .text:0x80358680; // type:function size:0x2C fn_803586B0 = .text:0x803586B0; // type:function size:0x7C @@ -34378,7 +34378,7 @@ lbl_80533090 = .data:0x80533090; // type:object size:0x18 lbl_805330A8 = .data:0x805330A8; // type:object size:0x18 lbl_805330C0 = .data:0x805330C0; // type:object size:0xC lbl_805330CC = .data:0x805330CC; // type:object size:0xDC -lbl_805331A8 = .data:0x805331A8; // type:object size:0xA0 +__vt__15dShadowCircle_c = .data:0x805331A8; // type:object size:0xA0 scope:weak lbl_80533248 = .data:0x80533248; // type:object size:0xC lbl_80533254 = .data:0x80533254; // type:object size:0x14 lbl_80533268 = .data:0x80533268; // type:object size:0x10 @@ -34413,11 +34413,11 @@ lbl_805344A0 = .data:0x805344A0; // type:object size:0x2C lbl_805344CC = .data:0x805344CC; // type:object size:0xC lbl_805344D8 = .data:0x805344D8; // type:object size:0x18 jumptable_805344F0 = .data:0x805344F0; // type:object size:0x20 scope:local -AcBomb__vtable = .data:0x80534510; // type:object size:0x80 -lbl_80534590 = .data:0x80534590; // type:object size:0x30 -lbl_805345C0 = .data:0x805345C0; // type:object size:0x30 -lbl_805345F0 = .data:0x805345F0; // type:object size:0x18 -lbl_80534608 = .data:0x80534608; // type:object size:0x168 +__vt__9dAcBomb_c = .data:0x80534510; // type:object size:0x80 +__vt__47sFStateMgr_c<9dAcBomb_c,20sStateMethodUsr_FI_c> = .data:0x80534590; // type:object size:0x30 +__vt__77sStateMgr_c<9dAcBomb_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x805345C0; // type:object size:0x30 +__vt__24sFStateFct_c<9dAcBomb_c> = .data:0x805345F0; // type:object size:0x18 +__vt__21sFState_c<9dAcBomb_c> = .data:0x80534608; // type:object size:0x168 lbl_80534770 = .data:0x80534770; // type:object size:0x38 g_profile_ARROW = .data:0x805347A8; // type:object size:0x38 lbl_805347E0 = .data:0x805347E0; // type:object size:0x2C data:4byte @@ -36105,19 +36105,19 @@ __vt__11cBgS_GndChk = .data:0x80547398; // type:object size:0xC __vt__11cBgS_LinChk = .data:0x805473A8; // type:object size:0x10 __vt__13cBgS_ShdwDraw = .data:0x805473B8; // type:object size:0xC __vt__9cBgW_BgId = .data:0x805473C8; // type:object size:0xC -__vt__15dCcD_ShapeAttr4 = .data:0x805473D8; // type:object size:0x5C -__vt__15dCcD_ShapeAttr3 = .data:0x80547434; // type:object size:0x5C -__vt__15dCcD_ShapeAttr5 = .data:0x80547490; // type:object size:0x68 -__vt__15dCcD_ShapeAttr2 = .data:0x805474F8; // type:object size:0x5C -__vt__15dCcD_ShapeAttr1 = .data:0x80547554; // type:object size:0x5C -__vt__12dCcD_GObjInf = .data:0x805475B0; // type:object size:0x14 -__vt__14dCcD_ShapeAttr = .data:0x805475C4; // type:object size:0x5C -__vt__11dCcD_GObjCo = .data:0x80547620; // type:object size:0xC -__vt__11dCcD_GObjTg = .data:0x8054762C; // type:object size:0xC -__vt__11dCcD_GObjAt = .data:0x80547638; // type:object size:0xC -__vt__22dCcD_GAtTgCoCommonBase = .data:0x80547644; // type:object size:0xC -__vt__15dCcD_DivideArea = .data:0x80547650; // type:object size:0xC -__vt__15dCcD_DivideInfo = .data:0x8054765C; // type:object size:0xC +__vt__12cCcD_SphAttr = .data:0x805473D8; // type:object size:0x5C +__vt__12cCcD_CylAttr = .data:0x80547434; // type:object size:0x5C +__vt__12cCcD_UnkAttr = .data:0x80547490; // type:object size:0x68 +__vt__12cCcD_TriAttr = .data:0x805474F8; // type:object size:0x5C +__vt__12cCcD_CpsAttr = .data:0x80547554; // type:object size:0x5C +__vt__8cCcD_Obj = .data:0x805475B0; // type:object size:0x14 +__vt__14cCcD_ShapeAttr = .data:0x805475C4; // type:object size:0x5C +__vt__10cCcD_ObjCo = .data:0x80547620; // type:object size:0xC +__vt__10cCcD_ObjTg = .data:0x8054762C; // type:object size:0xC +__vt__10cCcD_ObjAt = .data:0x80547638; // type:object size:0xC +__vt__22cCcD_GAtTgCoCommonBase = .data:0x80547644; // type:object size:0xC +__vt__15cCcD_DivideArea = .data:0x80547650; // type:object size:0xC +__vt__15cCcD_DivideInfo = .data:0x8054765C; // type:object size:0xC __vt__8cM2dGCir = .data:0x80547668; // type:object size:0xC __vt__8cM3dGUnk = .data:0x80547678; // type:object size:0xC __vt__10cPartition = .data:0x80547688; // type:object size:0xC @@ -36173,15 +36173,15 @@ __vt__9dBgW_Base = .data:0x80547F10; // type:object size:0x108 __vt__8dBgWKCol = .data:0x80548018; // type:object size:0x108 __vt__6dBgWSv = .data:0x80548120; // type:object size:0x114 __vt__8dBgWTime = .data:0x80548238; // type:object size:0x108 -__vt__9dCcD_Aabb = .data:0x80548340; // type:object size:0x7C +__vt__8dCcD_Unk = .data:0x80548340; // type:object size:0x7C __vt__8dCcD_Sph = .data:0x805483C0; // type:object size:0x70 __vt__8dCcD_Cyl = .data:0x80548430; // type:object size:0x70 -__vt__10dCcD_Empty = .data:0x805484A0; // type:object size:0x70 -__vt__9dCcD_Unk1 = .data:0x80548510; // type:object size:0x70 -lbl_80548580 = .data:0x80548580; // type:object size:0xC -lbl_8054858C = .data:0x8054858C; // type:object size:0xC -lbl_80548598 = .data:0x80548598; // type:object size:0x10 -lbl_805485A8 = .data:0x805485A8; // type:object size:0x10 +__vt__8dCcD_Tri = .data:0x805484A0; // type:object size:0x70 +__vt__8dCcD_Cps = .data:0x80548510; // type:object size:0x70 +__vt__12dCcMassS_Mng = .data:0x80548580; // type:object size:0xC +__vt__15dCcMassS_HitInf = .data:0x8054858C; // type:object size:0xC +__vt__12dCcMassS_Obj = .data:0x80548598; // type:object size:0xC +__vt__4dCcS = .data:0x805485A8; // type:object size:0xC lbl_805485B8 = .data:0x805485B8; // type:object size:0xC lbl_805485C4 = .data:0x805485C4; // type:object size:0xC lbl_805485D0 = .data:0x805485D0; // type:object size:0xA8 @@ -40409,7 +40409,7 @@ sSplGrpCheck__4cBgW = .sbss:0x80575D14; // type:object size:0x1 data:byte sSphCheck__4cBgW = .sbss:0x80575D15; // type:object size:0x1 data:byte l_start = .sbss:0x80575D18; // type:object size:0x4 data:4byte l_wcsbuf_num = .sbss:0x80575D1C; // type:object size:0x4 data:4byte -COLLIDER_MANAGER = .sbss:0x80575D20; // type:object size:0x8 data:4byte +sInstance__4dCcS = .sbss:0x80575D20; // type:object size:0x4 data:4byte lbl_80575D28 = .sbss:0x80575D28; // type:object size:0x8 data:4byte lbl_80575D30 = .sbss:0x80575D30; // type:object size:0x8 data:4byte BGM_MGR = .sbss:0x80575D38; // type:object size:0x4 data:4byte @@ -46167,7 +46167,7 @@ lbl_8057D240 = .sdata2:0x8057D240; // type:object size:0x4 data:float lbl_8057D244 = .sdata2:0x8057D244; // type:object size:0x4 data:float lbl_8057D248 = .sdata2:0x8057D248; // type:object size:0x4 data:float lbl_8057D24C = .sdata2:0x8057D24C; // type:object size:0x4 data:float -lbl_8057D250 = .sdata2:0x8057D250; // type:object size:0x8 data:float +lbl_8057D250 = .sdata2:0x8057D250; // type:object size:0x4 data:float lbl_8057D258 = .sdata2:0x8057D258; // type:object size:0x4 data:float lbl_8057D25C = .sdata2:0x8057D25C; // type:object size:0x4 data:float lbl_8057D260 = .sdata2:0x8057D260; // type:object size:0x4 data:float @@ -46180,7 +46180,7 @@ lbl_8057D280 = .sdata2:0x8057D280; // type:object size:0x4 data:float lbl_8057D284 = .sdata2:0x8057D284; // type:object size:0x4 data:float lbl_8057D288 = .sdata2:0x8057D288; // type:object size:0x4 data:float lbl_8057D28C = .sdata2:0x8057D28C; // type:object size:0x4 data:float -lbl_8057D290 = .sdata2:0x8057D290; // type:object size:0x8 data:float +lbl_8057D290 = .sdata2:0x8057D290; // type:object size:0x4 data:float lbl_8057D298 = .sdata2:0x8057D298; // type:object size:0x4 data:float lbl_8057D29C = .sdata2:0x8057D29C; // type:object size:0x4 data:float lbl_8057D2A0 = .sdata2:0x8057D2A0; // type:object size:0x4 data:float @@ -48906,7 +48906,7 @@ AcItem__STATE_WAIT_TURN_OFF = .bss:0x805B4838; // type:object size:0x40 data:4by AcItem__STATE_WAIT_SACRED_DEW_GET_EFFECT = .bss:0x805B4878; // type:object size:0x30 data:4byte lbl_805B48A8 = .bss:0x805B48A8; // type:object size:0x10 AcBomb__STATE_WAIT = .bss:0x805B48B8; // type:object size:0x40 data:4byte -AcBomb__STATE_FLOWER_WAIT = .bss:0x805B48F8; // type:object size:0x40 data:4byte +StateID_FlowerWait__9dAcBomb_c = .bss:0x805B48F8; // type:object size:0x40 data:4byte AcBomb__STATE_EXPLODE = .bss:0x805B4938; // type:object size:0x40 data:4byte AcBomb__STATE_CARRY = .bss:0x805B4978; // type:object size:0x40 data:4byte AcBomb__STATE_WIND_CARRY = .bss:0x805B49B8; // type:object size:0x30 data:4byte @@ -49234,7 +49234,7 @@ lbl_805CED68 = .bss:0x805CED68; // type:object size:0x48 lbl_805CEDB0 = .bss:0x805CEDB0; // type:object size:0x1318 lbl_805D00C8 = .bss:0x805D00C8; // type:object size:0x30 lbl_805D00F8 = .bss:0x805D00F8; // type:object size:0x30 -m_virtual_center__14dCcD_ShapeAttr = .bss:0x805D0128; // type:object size:0xC data:float +sVirtualCenter__14cCcD_ShapeAttr = .bss:0x805D0128; // type:object size:0xC data:float lbl_805D0138 = .bss:0x805D0138; // type:object size:0x7C data:4byte lbl_805D01B4 = .bss:0x805D01B4; // type:object size:0x14 data:4byte lbl_805D01C8 = .bss:0x805D01C8; // type:object size:0xC diff --git a/configure.py b/configure.py index 474e5cd1..1a158930 100644 --- a/configure.py +++ b/configure.py @@ -438,11 +438,11 @@ def nw4rLib(lib_name, objects, extra_cflags=[]): Object(NonMatching, "d/col/c/c_m2d.cpp"), Object(NonMatching, "d/col/c/c_m3d.cpp"), Object(Matching, "d/col/c/c_m3d_g_aab.cpp"), - Object(NonMatching, "d/col/c/c_m3d_g_cir.cpp"), + # Object(NonMatching, "d/col/c/c_m3d_g_cir.cpp"), Object(Matching, "d/col/c/c_m3d_g_cps.cpp"), Object(Matching, "d/col/c/c_m3d_g_cyl.cpp"), Object(Matching, "d/col/c/c_m3d_g_lin.cpp"), - Object(NonMatching, "d/col/c/c_m3d_g_pla.cpp"), + Object(Matching, "d/col/c/c_m3d_g_pla.cpp"), Object(Matching, "d/col/c/c_m3d_g_sph.cpp"), Object(Matching, "d/col/c/c_m3d_g_tri.cpp"), Object(Matching, "d/col/c/c_m3d_g_unk.cpp"), @@ -465,7 +465,9 @@ def nw4rLib(lib_name, objects, extra_cflags=[]): Object(NonMatching, "d/col/bg/d_bg_w_kcol.cpp"), Object(Matching, "d/col/bg/d_bg_w_sv.cpp"), Object(NonMatching, "d/col/bg/d_bg_w_time.cpp"), - Object(Matching, "d/col/cc/d_cc_shape_colliders.cpp"), + Object(Matching, "d/col/cc/d_cc_d.cpp"), + Object(Matching, "d/col/cc/d_cc_mass_s.cpp"), + Object(NonMatching, "d/col/cc/d_cc_s.cpp"), ], }, { @@ -1702,9 +1704,7 @@ def nw4rLib(lib_name, objects, extra_cflags=[]): Rel(NonMatching, "d_a_obj_under_cloud", "REL/d/a/obj/d_a_obj_under_cloud.cpp"), Rel(NonMatching, "d_a_obj_updown_lava", "REL/d/a/obj/d_a_obj_updown_lava.cpp"), Rel(Matching, "d_a_obj_utajima", "REL/d/a/obj/d_a_obj_utajima.cpp"), - Rel( - Matching, "d_a_obj_utajima_island", "REL/d/a/obj/d_a_obj_utajima_island.cpp" - ), + Rel(Matching, "d_a_obj_utajima_island", "REL/d/a/obj/d_a_obj_utajima_island.cpp"), Rel(Matching, "d_a_obj_utajima_lv2", "REL/d/a/obj/d_a_obj_utajima_lv2.cpp"), Rel( NonMatching, diff --git a/include/d/a/d_a_bombf.h b/include/d/a/d_a_bombf.h index 7306ed03..83ab3a9f 100644 --- a/include/d/a/d_a_bombf.h +++ b/include/d/a/d_a_bombf.h @@ -2,18 +2,40 @@ #define D_A_BOMBF_H #include "d/a/obj/d_a_obj_base.h" +#include "d/a/obj/d_a_obj_bomb.h" +#include "d/col/c/c_bg_s_poly_info.h" #include "s/s_State.hpp" -#include "s/s_StateMgr.hpp" +#include "toBeSorted/time_area_mgr.h" class dAcBombf_c : public dAcObjBase_c { public: dAcBombf_c() : mStateMgr(*this, sStateID::null) {} virtual ~dAcBombf_c() {} + virtual bool createHeap() override; + virtual int create() override; + virtual int actorExecute() override; + virtual int draw() override; + virtual int doDelete() override; + + virtual int actorCreate() override; + virtual int actorPostCreate() override; STATE_FUNC_DECLARE(dAcBombf_c, Wait); private: - /* 0x??? */ STATE_MGR_DECLARE(dAcBombf_c); + void regrowBomb(); + + /* 0x330 */ m3d::smdl_c mModel; + /* 0x34C */ STATE_MGR_DECLARE(dAcBombf_c); + /* 0x388 */ dAcRef_c mBombRef; + /* 0x394 */ UNKWORD field_0x394; + /* 0x398 */ cBgS_PolyInfo field_0x398; + /* 0x3C4 */ TimeAreaStruct mTimeAreaStruct; + /* 0x3D0 */ bool field_0x3D0; + /* 0x3D1 */ u8 mDespawnSceneFlag; + /* 0x3D2 */ u8 field_0x3D2; + /* 0x3D3 */ u8 field_0x3D3; + /* 0x3D4 */ u8 field_0x3D4; }; #endif diff --git a/include/d/a/d_a_player.h b/include/d/a/d_a_player.h index a5969ffd..adfa8a3e 100644 --- a/include/d/a/d_a_player.h +++ b/include/d/a/d_a_player.h @@ -223,6 +223,7 @@ class dAcPy_c : public dAcObjBase_c { /* 0x35C */ u32 mForceOrPreventActionFlags; /* 0x360 */ UNKWORD field_0x360; /* 0x364 */ u32 mActionFlags; + /* 0x368 */ u32 mActionFlagsCont; inline bool checkFlags0x340(u32 mask) const { return (someFlags_0x340 & mask) != 0; diff --git a/include/d/a/obj/d_a_obj_arrow.h b/include/d/a/obj/d_a_obj_arrow.h new file mode 100644 index 00000000..2cfb6b47 --- /dev/null +++ b/include/d/a/obj/d_a_obj_arrow.h @@ -0,0 +1,60 @@ +#ifndef D_A_OBJ_ARROW_H +#define D_A_OBJ_ARROW_H + +#include "d/a/obj/d_a_obj_base.h" +#include "d/col/c/c_bg_s_poly_info.h" +#include "d/col/c/c_cc_d.h" +#include "d/col/cc/d_cc_d.h" +#include "m/m3d/m_smdl.h" +#include "nw4r/g3d/g3d_resfile.h" +#include "s/s_State.hpp" +#include "s/s_StateID.hpp" +#include "toBeSorted/effects_struct.h" + +class dAcArrow_c : public dAcObjBase_c { +public: + dAcArrow_c() : mPolyInfo(), mStateMgr(*this, sStateID::null) {} + virtual ~dAcArrow_c(); + + virtual bool createHeap() override; + virtual int create() override; + virtual int doDelete() override; + virtual int actorExecute() override; + virtual int draw() override; + + STATE_FUNC_DECLARE(dAcArrow_c, Wait); + STATE_FUNC_DECLARE(dAcArrow_c, Move); + STATE_FUNC_DECLARE(dAcArrow_c, ActorStop); + STATE_FUNC_DECLARE(dAcArrow_c, BgStop); + STATE_FUNC_DECLARE(dAcArrow_c, Bound); + + void hitCallback(cCcD_Obj *i_objInfA, dAcObjBase_c *i_actorB, cCcD_Obj *i_objInfB); + +public: + static cCcD_SrcGObj sCcSrcInf; + static dCcD_SrcCps sCc1; + static const dCcD_SrcSph sCc2; + + /* 0x330 */ nw4r::g3d::ResFile mResFile; + /* 0x334 */ m3d::smdl_c mModel; + /* 0x350 */ dAcRef_c mRef1; + /* 0x35C */ dCcD_Cps mCcCps; + /* 0x4CC */ dCcD_Sph mCcSph; + /* 0x61C */ cBgS_PolyInfo mPolyInfo; // ?? + /* 0x648 */ EffectsStruct mEffects; + /* 0x67C */ u32 field_0x67C; + /* 0x680 */ u8 mSubType; + /* 0x681 */ u8 field_0x681; + /* 0x682 */ u8 mDespawnTimer; + /* 0x684 */ s16 field_0x684; + /* 0x686 */ u8 field_0x686[0x688 - 0x686]; + /* 0x688 */ u16 field_0x688; + /* 0x68A */ u16 field_0x68A; + /* 0x68C */ u8 field_0x68C[0x6A8 - 0x68C]; + /* 0x6A8 */ f32 field_0x6A8; + /* 0x6AC */ u8 field_0x6AC[0x6F8 - 0x6AC]; + /* 0x6F8 */ dAcRef_c mRef2; + /* 0x704 */ STATE_MGR_DECLARE(dAcArrow_c); +}; + +#endif diff --git a/include/d/a/obj/d_a_obj_base.h b/include/d/a/obj/d_a_obj_base.h index 23555bd9..97d0e5ed 100644 --- a/include/d/a/obj/d_a_obj_base.h +++ b/include/d/a/obj/d_a_obj_base.h @@ -2,8 +2,8 @@ #define D_A_OBJ_BASE_H #include "d/a/d_a_base.h" +#include "d/col/c/c_cc_d.h" #include "d/col/c/c_m3d_g_aab.h" -#include "d/col/cc/d_cc_d.h" #include "m/m3d/m_shadow.h" #include "m/m3d/m_smdl.h" #include "m/m_angle.h" @@ -11,6 +11,7 @@ #include "m/m_vec.h" #include "m/types_m.h" + // Size: 0xA8 struct ActorCarryStruct { /* 0x00 */ fLiNdBa_c actorLink; @@ -68,7 +69,7 @@ class dAcObjBase_c : public dAcBase_c { /* 0x1B0 */ u8 unk_0x1B0[0x1C0 - 0x1B0]; - /* 0x1C0 */ UnkCCDStruct mCCdStruct; + /* 0x1C0 */ cCcD_Stts mStts; /* 0x1FC */ mVec3_c mStartingPos; /* 0x208 */ mAng3_c mStartingRot; diff --git a/include/d/a/d_a_bomb.h b/include/d/a/obj/d_a_obj_bomb.h similarity index 57% rename from include/d/a/d_a_bomb.h rename to include/d/a/obj/d_a_obj_bomb.h index 3f2ce62d..686a4987 100644 --- a/include/d/a/d_a_bomb.h +++ b/include/d/a/obj/d_a_obj_bomb.h @@ -1,20 +1,32 @@ -#ifndef D_A_BOMB_H -#define D_A_BOMB_H +#ifndef D_A_OBJ_BOMB_H +#define D_A_OBJ_BOMB_H +#include "common.h" #include "d/a/obj/d_a_obj_base.h" #include "d/col/bg/d_bg_s_acch.h" #include "d/col/bg/d_bg_s_lin_chk.h" -#include "d/col/cc/d_cc_shape_colliders.h" +#include "d/col/c/c_bg_s_poly_info.h" +#include "d/col/cc/d_cc_d.h" +#include "d/d_shadow.h" #include "m/m3d/m_smdl.h" +#include "m/m_mtx.h" #include "nw4r/g3d/g3d_resfile.h" #include "s/s_State.hpp" -#include "s/s_StateMgr.hpp" +#include "s/s_StateID.hpp" #include "toBeSorted/effects_struct.h" +// This may need its own file and could be independent of a bomb +class UnkBombColInfo : public cBgS_PolyInfo { +public: + UnkBombColInfo() : mField_0x10(0), mField_0x14(0), mField_0x18(0) {} + u32 mField_0x10; + u32 mField_0x14; + u32 mField_0x18; +}; class dAcBomb_c : public dAcObjBase_c { public: - dAcBomb_c(); + dAcBomb_c() : mStateMgr(*this, sStateID::null), mSelfRef(this), mEffect1(this), mEffect2(this) {} virtual ~dAcBomb_c(); /* vt 0x08 */ virtual int create() override; @@ -32,19 +44,28 @@ class dAcBomb_c : public dAcObjBase_c { STATE_FUNC_DECLARE(dAcBomb_c, Carry); STATE_FUNC_DECLARE(dAcBomb_c, WindCarry); -private: + void setTransformFromFlower(const mMtx_c &); + +public: /* 0x330 */ nw4r::g3d::ResFile mBrres; /* 0x334 */ m3d::smdl_c mMdl; - /* 0x350 */ u8 _0[0x358 - 0x350]; + /* 0x350 */ dShadowCircle_c mShdw; /* 0x358 */ dBgS_BombAcch mAcch; /* 0x708 */ dBgS_AcchCir mAcchCir; /* 0x764 */ dCcD_Sph mCcDSph; /* 0x8B4 */ mMtx_c mMtx; /* 0x8E4 */ dBgS_BombLinChk mLinChk; - /* 0x97C */ u8 _1[0x9D4 - 0x97C]; + /* 0x97C */ UnkBombColInfo mUnkInfo; + /* 0x9B4 */ u8 _0[0x9B8 - 0x9B4]; + /* 0x9B8 */ dAcBomb_c *mSelfRef; + /* 0x9BC */ u8 _1[0x9D4 - 0x9BC]; /* 0x9D4 */ EffectsStruct mEffect1; /* 0xA08 */ EffectsStruct mEffect2; - /* 0xA3C */ u8 _2[0xA9C - 0xA3C]; + /* 0xA3C */ u8 _2[0xA44 - 0xA3C]; + /* 0xA44 */ s16 mField_0xA44; + /* 0xA46 */ u8 _3[0xA50 - 0xA46]; + /* 0xA50 */ f32 mField_0xA50; + /* 0xA54 */ u8 _4[0xA9C - 0xA54]; /* 0xA9C */ STATE_MGR_DECLARE(dAcBomb_c); }; diff --git a/include/d/a/obj/d_a_obj_spike.h b/include/d/a/obj/d_a_obj_spike.h index cadb8407..2dace343 100644 --- a/include/d/a/obj/d_a_obj_spike.h +++ b/include/d/a/obj/d_a_obj_spike.h @@ -2,7 +2,7 @@ #define D_A_O_SPIKE_H #include "d/a/obj/d_a_obj_base.h" -#include "d/col/cc/d_cc_shape_colliders.h" +#include "d/col/cc/d_cc_d.h" #include "m/m3d/m_smdl.h" #include "m/m_vec.h" #include "nw4r/g3d/g3d_resfile.h" @@ -25,11 +25,11 @@ class dAcOspike_c : public dAcObjBase_c { static const mVec3_c sVec2; private: - static dCcD_SrcAabb sCcSrc; + static dCcD_SrcUnk sCcSrc; nw4r::g3d::ResFile mResFile; m3d::smdl_c mMdl; - dCcD_Aabb mCollision; + dCcD_Unk mCollision; STATE_MGR_DECLARE(dAcOspike_c); }; diff --git a/include/d/a/obj/d_a_obj_toD3_stone_figure.h b/include/d/a/obj/d_a_obj_toD3_stone_figure.h index bdc94976..c796b92e 100644 --- a/include/d/a/obj/d_a_obj_toD3_stone_figure.h +++ b/include/d/a/obj/d_a_obj_toD3_stone_figure.h @@ -3,7 +3,7 @@ #include "c/c_math.h" #include "d/a/obj/d_a_obj_base.h" -#include "d/col/cc/d_cc_shape_colliders.h" +#include "d/col/cc/d_cc_d.h" #include "m/m3d/m_smdl.h" #include "nw4r/g3d/g3d_resfile.h" #include "s/s_State.hpp" diff --git a/include/d/a/obj/d_a_obj_triforce.h b/include/d/a/obj/d_a_obj_triforce.h index aaa6f654..eab787bb 100644 --- a/include/d/a/obj/d_a_obj_triforce.h +++ b/include/d/a/obj/d_a_obj_triforce.h @@ -3,7 +3,7 @@ #include "c/c_math.h" #include "d/a/obj/d_a_obj_base.h" -#include "d/col/cc/d_cc_shape_colliders.h" +#include "d/col/cc/d_cc_d.h" #include "m/m3d/m_anmtexsrt.h" #include "m/m3d/m_smdl.h" #include "m/m_angle.h" diff --git a/include/d/col/c/c_bg_s_poly_info.h b/include/d/col/c/c_bg_s_poly_info.h index 7ab2943f..25e41452 100644 --- a/include/d/col/c/c_bg_s_poly_info.h +++ b/include/d/col/c/c_bg_s_poly_info.h @@ -2,6 +2,7 @@ #define C_BG_S_POLY_INFO_H #include "common.h" +#include "d/a/obj/d_a_obj_base.h" #include "d/col/c/c_bg_w.h" #include "d/col/c/c_m3d_g_pla.h" #include "m/m_vec.h" diff --git a/include/d/col/c/c_cc_d.h b/include/d/col/c/c_cc_d.h index be4685be..3a1796b1 100644 --- a/include/d/col/c/c_cc_d.h +++ b/include/d/col/c/c_cc_d.h @@ -1,4 +1,916 @@ #ifndef C_CC_D_H #define C_CC_D_H +#include "common.h" +#include "d/a/d_a_base.h" +#include "d/col/c/c_m3d.h" +#include "d/col/c/c_m3d_g_aab.h" +#include "d/col/c/c_m3d_g_cps.h" +#include "d/col/c/c_m3d_g_cyl.h" +#include "d/col/c/c_m3d_g_sph.h" +#include "d/col/c/c_m3d_g_tri.h" +#include "d/col/c/c_m3d_g_unk.h" +#include "m/m_vec.h" +#include "nw4r/types_nw4r.h" + +class dAcObjBase_c; + +class cCcD_CpsAttr; +class cCcD_TriAttr; +class cCcD_UnkAttr; +class cCcD_CylAttr; +class cCcD_SphAttr; + +class cCcD_DivideInfo { +private: + /* 0x00 */ u32 mXDivInfo; + /* 0x04 */ u32 mYDivInfo; + /* 0x08 */ u32 mZDivInfo; + /* 0x0C vtable */ +public: + cCcD_DivideInfo(); + virtual ~cCcD_DivideInfo(); + + // Following two funcs were probably inlined based on how other classes went + void Set(u32 xDivInfo, u32 yDivInfo, u32 zDivInfo) { + mXDivInfo = xDivInfo; + mYDivInfo = yDivInfo; + mZDivInfo = zDivInfo; + } + + bool Chk(cCcD_DivideInfo const &other) const { + if ((mXDivInfo & other.mXDivInfo) && (mZDivInfo & other.mZDivInfo) && (mYDivInfo & other.mYDivInfo)) { + return true; + } else { + return false; + } + } +}; + +class cCcD_DivideArea : public cM3dGAab { +private: + /* 0x18 */ bool mXDiffIsZero; + /* 0x1C */ f32 mScaledXDiff; + /* 0x20 */ f32 mInvScaledXDiff; + /* 0x24 */ bool mYDiffIsZero; + /* 0x28 */ f32 mScaledYDiff; + /* 0x2C */ f32 mInvScaledYDiff; + /* 0x30 */ bool mZDiffIsZero; + /* 0x34 */ f32 mScaledZDiff; + /* 0x38 */ f32 mInvScaledZDiff; + /* 0x3C vtable */ + +public: + cCcD_DivideArea(); + virtual ~cCcD_DivideArea(); + void SetArea(cM3dGAab const &); + void CalcDivideInfo(cCcD_DivideInfo *, cM3dGAab const &); + void CalcDivideInfoOverArea(cCcD_DivideInfo *, cM3dGAab const &); +}; + +class cCcD_ShapeAttr { +public: + cM3dGAab mAab; + cCcD_DivideInfo mInfo; + enum ShapeType { + SHAPE_SPHERE = 0, + SHAPE_CYLINDER = 1, + SHAPE_CAPSULE = 2, + SHAPE_TRIANGLE = 3, + SHAPE_DEFAULT = 4, + }; + struct Shape { + ~Shape(); + + /* 0x00 */ int mField_0x00; + /* 0x04 */ mVec3_c mField_0x04; + /* 0x10 */ mVec3_c mField_0x10; + /* 0x1C */ mVec3_c mField_0x1C; + }; + cCcD_ShapeAttr(); + /* vt 0x08 */ virtual ~cCcD_ShapeAttr(); + /* vt 0x0C */ virtual bool Calc(const mVec3_c &, const mVec3_c &, mVec3_c *); + /* vt 0x10 */ virtual bool CrossAtTg(cCcD_ShapeAttr &, mVec3_c *); + /* vt 0x14 */ virtual bool CrossAtTg(cCcD_CpsAttr &, mVec3_c *) = 0; + /* vt 0x18 */ virtual bool CrossAtTg(cCcD_TriAttr &, mVec3_c *) = 0; + /* vt 0x1C */ virtual bool CrossAtTg(cCcD_UnkAttr &, mVec3_c *) = 0; + /* vt 0x20 */ virtual bool CrossAtTg(cCcD_CylAttr &, mVec3_c *) = 0; + /* vt 0x24 */ virtual bool CrossAtTg(cCcD_SphAttr &, mVec3_c *) = 0; + /* vt 0x28 */ virtual bool CrossCo(cCcD_ShapeAttr &, f32 *); + /* vt 0x2C */ virtual bool CrossCo(cCcD_CpsAttr &, f32 *) = 0; + /* vt 0x30 */ virtual bool CrossCo(cCcD_TriAttr &, f32 *) = 0; + /* vt 0x34 */ virtual bool CrossCo(cCcD_UnkAttr &, f32 *) = 0; + /* vt 0x38 */ virtual bool CrossCo(cCcD_CylAttr &, f32 *) = 0; + /* vt 0x3C */ virtual bool CrossCo(cCcD_SphAttr &, f32 *) = 0; + /* vt 0x40 */ virtual mVec3_c &GetCoP(); + /* vt 0x44 */ virtual void CalcAabBox() = 0; + /* vt 0x48 */ virtual bool GetNVec(const mVec3_c &, mVec3_c *) const = 0; + /* vt 0x4C */ virtual void GetShapeAccess(cCcD_ShapeAttr::Shape *) const; + /* vt 0x50 */ virtual void GetPos(nw4r::math::VEC3 *) const = 0; + /* vt 0x54 */ virtual bool GetPosBool(mVec3_c *) const; + /* vt 0x58 */ virtual void TranslateXZ(f32, f32) = 0; + + cM3dGAab &GetWorkAab() { + return mAab; + } + cM3dGAab const &GetWorkAab() const { + return mAab; + } + + static mVec3_c sVirtualCenter; +}; + +struct cCcD_SrcCpsAttr { + f32 mRadius; +}; +class cCcD_CpsAttr : public cCcD_ShapeAttr, public cM3dGCps { +public: + mVec3_c mVirtCenter; + + cCcD_CpsAttr(); + void Set(const cCcD_SrcCpsAttr &src); + void SetVirtCenter(mVec3_c *); + + f32 CrossCoCommon(cCcD_ShapeAttr &, f32); + + /* vt 0x08 */ virtual ~cCcD_CpsAttr(); + /* vt 0x0C */ virtual bool Calc(const mVec3_c &, const mVec3_c &, mVec3_c *) override; + /* vt 0x10 */ virtual bool CrossAtTg(cCcD_ShapeAttr &, mVec3_c *) override; + /* vt 0x14 */ virtual bool CrossAtTg(cCcD_CpsAttr &, mVec3_c *) override; + /* vt 0x18 */ virtual bool CrossAtTg(cCcD_TriAttr &, mVec3_c *) override; + /* vt 0x1C */ virtual bool CrossAtTg(cCcD_UnkAttr &, mVec3_c *) override; + /* vt 0x20 */ virtual bool CrossAtTg(cCcD_CylAttr &, mVec3_c *) override; + /* vt 0x24 */ virtual bool CrossAtTg(cCcD_SphAttr &, mVec3_c *) override; + /* vt 0x28 */ virtual bool CrossCo(cCcD_ShapeAttr &, f32 *) override; + /* vt 0x2C */ virtual bool CrossCo(cCcD_CpsAttr &, f32 *) override; + /* vt 0x30 */ virtual bool CrossCo(cCcD_TriAttr &, f32 *) override; + /* vt 0x34 */ virtual bool CrossCo(cCcD_UnkAttr &, f32 *) override; + /* vt 0x38 */ virtual bool CrossCo(cCcD_CylAttr &, f32 *) override; + /* vt 0x3C */ virtual bool CrossCo(cCcD_SphAttr &, f32 *) override; + /* vt 0x40 */ virtual mVec3_c &GetCoP() override; + /* vt 0x44 */ virtual void CalcAabBox() override; + /* vt 0x48 */ virtual bool GetNVec(const mVec3_c &, mVec3_c *) const override; + /* vt 0x4C */ virtual void GetShapeAccess(cCcD_ShapeAttr::Shape *) const override; + /* vt 0x50 */ virtual void GetPos(nw4r::math::VEC3 *) const override; + /* vt 0x58 */ virtual void TranslateXZ(f32, f32) override; +}; + +class cCcD_TriAttr : public cCcD_ShapeAttr, public cM3dGTri { +public: + cCcD_TriAttr(); + /* vt 0x08 */ virtual ~cCcD_TriAttr(); + /* vt 0x0C */ virtual bool Calc(const mVec3_c &, const mVec3_c &, mVec3_c *) override; + /* vt 0x10 */ virtual bool CrossAtTg(cCcD_ShapeAttr &, mVec3_c *) override; + /* vt 0x14 */ virtual bool CrossAtTg(cCcD_CpsAttr &, mVec3_c *) override; + /* vt 0x18 */ virtual bool CrossAtTg(cCcD_TriAttr &, mVec3_c *) override; + /* vt 0x1C */ virtual bool CrossAtTg(cCcD_UnkAttr &, mVec3_c *) override; + /* vt 0x20 */ virtual bool CrossAtTg(cCcD_CylAttr &, mVec3_c *) override; + /* vt 0x24 */ virtual bool CrossAtTg(cCcD_SphAttr &, mVec3_c *) override; + /* vt 0x28 */ virtual bool CrossCo(cCcD_ShapeAttr &, f32 *) override; + /* vt 0x2C */ virtual bool CrossCo(cCcD_CpsAttr &, f32 *) override; + /* vt 0x30 */ virtual bool CrossCo(cCcD_TriAttr &, f32 *) override; + /* vt 0x34 */ virtual bool CrossCo(cCcD_UnkAttr &, f32 *) override; + /* vt 0x38 */ virtual bool CrossCo(cCcD_CylAttr &, f32 *) override; + /* vt 0x3C */ virtual bool CrossCo(cCcD_SphAttr &, f32 *) override; + /* vt 0x44 */ virtual void CalcAabBox() override; + /* vt 0x48 */ virtual bool GetNVec(const mVec3_c &, mVec3_c *) const override; + /* vt 0x4C */ virtual void GetShapeAccess(cCcD_ShapeAttr::Shape *) const override; + /* vt 0x50 */ virtual void GetPos(nw4r::math::VEC3 *) const override; + /* vt 0x58 */ virtual void TranslateXZ(f32, f32) override; +}; + +struct cCcD_SrcUnkAttr { + f32 mMinX, mMinY, mMinZ; + f32 mMaxX, mMaxY, mMaxZ; + + mVec3_c &getMin() const { + return *(mVec3_c *)&mMinX; + } + mVec3_c &getMax() const { + return *(mVec3_c *)&mMaxX; + } +}; + +class cCcD_UnkAttr : public cCcD_ShapeAttr, public cM3dGUnk { +public: + cCcD_UnkAttr(); + + void Set(const cCcD_SrcUnkAttr &src); + /* vt 0x08 */ virtual ~cCcD_UnkAttr(); + /* vt 0x0C */ virtual bool Calc(const mVec3_c &, const mVec3_c &, mVec3_c *) override; + /* vt 0x10 */ virtual bool CrossAtTg(cCcD_ShapeAttr &, mVec3_c *) override; + /* vt 0x14 */ virtual bool CrossAtTg(cCcD_CpsAttr &, mVec3_c *) override; + /* vt 0x18 */ virtual bool CrossAtTg(cCcD_TriAttr &, mVec3_c *) override; + /* vt 0x1C */ virtual bool CrossAtTg(cCcD_UnkAttr &, mVec3_c *) override; + /* vt 0x20 */ virtual bool CrossAtTg(cCcD_CylAttr &, mVec3_c *) override; + /* vt 0x24 */ virtual bool CrossAtTg(cCcD_SphAttr &, mVec3_c *) override; + /* vt 0x28 */ virtual bool CrossCo(cCcD_ShapeAttr &, f32 *) override; + /* vt 0x2C */ virtual bool CrossCo(cCcD_CpsAttr &, f32 *) override; + /* vt 0x30 */ virtual bool CrossCo(cCcD_TriAttr &, f32 *) override; + /* vt 0x34 */ virtual bool CrossCo(cCcD_UnkAttr &, f32 *) override; + /* vt 0x38 */ virtual bool CrossCo(cCcD_CylAttr &, f32 *) override; + /* vt 0x3C */ virtual bool CrossCo(cCcD_SphAttr &, f32 *) override; + /* vt 0x40 */ virtual mVec3_c &GetCoP() override; + /* vt 0x44 */ virtual void CalcAabBox() override; + /* vt 0x48 */ virtual bool GetNVec(const mVec3_c &, mVec3_c *) const override; + /* vt 0x50 */ virtual void GetPos(nw4r::math::VEC3 *) const override; + /* vt 0x58 */ virtual void TranslateXZ(f32, f32) override; +}; + +struct cCcD_SrcCylAttr { + f32 mRadius; + f32 mHeight; +}; + +class cCcD_CylAttr : public cCcD_ShapeAttr, public cM3dGCyl { +public: + cCcD_CylAttr(); + void Set(const cCcD_SrcCylAttr &); + /* vt 0x08 */ virtual ~cCcD_CylAttr(); + /* vt 0x0C */ virtual bool Calc(const mVec3_c &, const mVec3_c &, mVec3_c *) override; + /* vt 0x10 */ virtual bool CrossAtTg(cCcD_ShapeAttr &, mVec3_c *) override; + /* vt 0x14 */ virtual bool CrossAtTg(cCcD_CpsAttr &, mVec3_c *) override; + /* vt 0x18 */ virtual bool CrossAtTg(cCcD_TriAttr &, mVec3_c *) override; + /* vt 0x1C */ virtual bool CrossAtTg(cCcD_UnkAttr &, mVec3_c *) override; + /* vt 0x20 */ virtual bool CrossAtTg(cCcD_CylAttr &, mVec3_c *) override; + /* vt 0x24 */ virtual bool CrossAtTg(cCcD_SphAttr &, mVec3_c *) override; + /* vt 0x28 */ virtual bool CrossCo(cCcD_ShapeAttr &, f32 *) override; + /* vt 0x2C */ virtual bool CrossCo(cCcD_CpsAttr &, f32 *) override; + /* vt 0x30 */ virtual bool CrossCo(cCcD_TriAttr &, f32 *) override; + /* vt 0x34 */ virtual bool CrossCo(cCcD_UnkAttr &, f32 *) override; + /* vt 0x38 */ virtual bool CrossCo(cCcD_CylAttr &, f32 *) override; + /* vt 0x3C */ virtual bool CrossCo(cCcD_SphAttr &, f32 *) override; + /* vt 0x40 */ virtual mVec3_c &GetCoP() override; + /* vt 0x44 */ virtual void CalcAabBox() override; + /* vt 0x48 */ virtual bool GetNVec(const mVec3_c &, mVec3_c *) const override; + /* vt 0x4C */ virtual void GetShapeAccess(cCcD_ShapeAttr::Shape *) const override; + /* vt 0x50 */ virtual void GetPos(nw4r::math::VEC3 *) const override; + /* vt 0x58 */ virtual void TranslateXZ(f32, f32) override; +}; + +struct cCcD_SrcSphAttr { + f32 mRadius; +}; + +class cCcD_SphAttr : public cCcD_ShapeAttr, public cM3dGSph { +public: + cCcD_SphAttr(); + void Set(const cCcD_SrcSphAttr &); + /* vt 0x08 */ virtual ~cCcD_SphAttr(); + /* vt 0x0C */ virtual bool Calc(const mVec3_c &, const mVec3_c &, mVec3_c *) override; + /* vt 0x10 */ virtual bool CrossAtTg(cCcD_ShapeAttr &, mVec3_c *) override; + /* vt 0x14 */ virtual bool CrossAtTg(cCcD_CpsAttr &, mVec3_c *) override; + /* vt 0x18 */ virtual bool CrossAtTg(cCcD_TriAttr &, mVec3_c *) override; + /* vt 0x1C */ virtual bool CrossAtTg(cCcD_UnkAttr &, mVec3_c *) override; + /* vt 0x20 */ virtual bool CrossAtTg(cCcD_CylAttr &, mVec3_c *) override; + /* vt 0x24 */ virtual bool CrossAtTg(cCcD_SphAttr &, mVec3_c *) override; + /* vt 0x28 */ virtual bool CrossCo(cCcD_ShapeAttr &, f32 *) override; + /* vt 0x2C */ virtual bool CrossCo(cCcD_CpsAttr &, f32 *) override; + /* vt 0x30 */ virtual bool CrossCo(cCcD_TriAttr &, f32 *) override; + /* vt 0x34 */ virtual bool CrossCo(cCcD_UnkAttr &, f32 *) override; + /* vt 0x38 */ virtual bool CrossCo(cCcD_CylAttr &, f32 *) override; + /* vt 0x3C */ virtual bool CrossCo(cCcD_SphAttr &, f32 *) override; + /* vt 0x40 */ virtual mVec3_c &GetCoP() override; + /* vt 0x44 */ virtual void CalcAabBox() override; + /* vt 0x48 */ virtual bool GetNVec(const mVec3_c &, mVec3_c *) const override; + /* vt 0x4C */ virtual void GetShapeAccess(cCcD_ShapeAttr::Shape *) const override; + /* vt 0x50 */ virtual void GetPos(nw4r::math::VEC3 *) const override; + /* vt 0x54 */ virtual bool GetPosBool(mVec3_c *) const override; + /* vt 0x58 */ virtual void TranslateXZ(f32, f32) override; +}; + +// This has changed bit +class cCcD_Stts { +public: + /* 0x00 */ int mAtApid; + /* 0x04 */ int mAtOldApid; + /* 0x08 */ int mTgApid; + /* 0x0C */ int mTgOldApid; + /* 0x10 */ mVec3_c mField_0x10; + /* 0x1C */ mVec3_c mField_0x1C; + /* 0x28 */ mVec3_c mCcMove; + /* 0x34 */ dAcObjBase_c *mpActor; + /* 0x38 */ int mRank; + + cCcD_Stts(dAcObjBase_c *); + void Move(); + int GetID() const; + void PlusCcMove(f32, f32, f32); + void ClrCcMove(); + int GetWeight(int) const; // idk what to really call it but it removes the rank table + + void SetDefaultRank() { + mRank = 0xD; + } + void SetRank(int rank) { + mRank = rank; + } + dAcObjBase_c *GetAc() { + return mpActor; + } +}; + +struct cCcD_SrcGObjTgInfo { + /* 0x00 */ u16 mField_0x0; + /* 0x02 */ u16 mField_0x2; +}; + +struct cCcD_SrcGObjTg { + /* 0x00 */ u32 mType; + /* 0x04 */ u32 mSPrm; + /* 0x08 */ cCcD_SrcGObjTgInfo mInfo; + /* 0x0C */ u16 mField_0x0C; + /* 0x0E */ u16 mField_0x0E; +}; + +enum cCcD_AtModifiers_e { + /* 0x 0000 0001 */ AT_MOD_FIRE = (1 << 0), + /* 0x 0000 0002 */ AT_MOD_0x2 = (1 << 1), + /* 0x 0000 0004 */ AT_MOD_ELECTRIC = (1 << 2), + /* 0x 0000 0008 */ AT_MOD_WIND = (1 << 3), + /* 0x 0000 0010 */ AT_MOD_0x10 = (1 << 4), + /* 0x 0000 0020 */ AT_MOD_0x20 = (1 << 5), + /* 0x 0000 0040 */ AT_MOD_WATER = (1 << 6), + /* 0x 0000 0080 */ AT_MOD_0x80 = (1 << 7), + /* 0x 0000 0100 */ AT_MOD_0x100 = (1 << 8), + /* 0x 0000 0200 */ AT_MOD_STINKY = (1 << 9), + /* 0x 0000 0400 */ AT_MOD_CURSED = (1 << 10), +}; +struct cCcD_SrcGObjAtInfo { + /* 0x00 */ u8 mField_0x0; + /* 0x01 */ u8 mField_0x1; + /* 0x02 */ u16 mModifier; +}; + +enum cCcD_AtSPrm { + AT_SPRM_DAMAGE = 0x4, +}; + +struct cCcD_SrcGObjAt { + /* 0x00 */ u32 mType; + /* 0x04 */ u32 mSPrm; + /* 0x08 */ cCcD_SrcGObjAtInfo mInfo; + /* 0x0C */ u8 mDamage; + /* 0x0D */ u8 mField_0xD; + /* 0x0E */ u8 mField_0xE; + /* 0x0F */ u8 mField_0xF; + /* 0x10 */ u16 mField_0x10; + /* 0x12 */ s16 mField_0x12; +}; + +struct cCcD_SrcGObjCo { + /* 0x00 */ u32 mSPrm; +}; + +struct cCcD_SrcGObj { + /* 0x00 */ cCcD_SrcGObjAt mObjAt; + /* 0x14 */ cCcD_SrcGObjTg mObjTg; + /* 0x1C */ cCcD_SrcGObjCo mObjCo; +}; + +class dAcObjBase_c; +class cCcD_Obj; + +typedef bool (*cCcD_HitCallback)( + dAcObjBase_c *i_actorA, cCcD_Obj *i_objInfA, dAcObjBase_c *i_actorB, cCcD_Obj *i_objInfB +); +typedef int (*cCcD_ShieldChkCallback)( + dAcObjBase_c *i_actorA, cCcD_Obj *i_objInfA, dAcObjBase_c *i_actorB, cCcD_Obj *i_objInfB +); + +class cCcD_GAtTgCoCommonBase { +public: + cCcD_HitCallback mHit_cb; + s8 mEffCounter; + dAcRef_c mAc; + u32 mRPrm; + + cCcD_GAtTgCoCommonBase(); + + virtual ~cCcD_GAtTgCoCommonBase(); + void dt() { + mEffCounter = 0; + ClrActorInfo(); + mHit_cb = nullptr; + } + void ClrActorInfo(); + void SetHitActor(dAcObjBase_c *); + dAcObjBase_c *GetActor(); + void SubtractEffCounter(); + + bool ChkEffCounter() { + return mEffCounter > 0; + } + void ClrEffCounter() { + mEffCounter = 0; + } + void SetEffCounterTimer() { + mEffCounter = 5; + } + + u32 MskRPrm(u32 m) const { + return mRPrm & m; + } + void SetRPrm(u32 f) { + mRPrm = f; + } + void OnRPrm(u32 m) { + mRPrm |= m; + } + void OffRPrm(u32 m) { + mRPrm = (mRPrm & ~m) | m; + } +}; + +class cCcD_ObjAt : public cCcD_GAtTgCoCommonBase { +public: + cCcD_ObjAt(); + virtual ~cCcD_ObjAt(); + void Set(const cCcD_SrcGObjAt &); + void SetAtFlag(u32); + void AdjustHitPos(f32, f32); + + void SetVec(const mVec3_c &vec) { + mVec = vec; + } + mVec3_c &GetVec() { + return mVec; + } + + void SetHitPos(mVec3_c &pos) { + mHitPos = pos; + } + mVec3_c &GetHitPos() { + return mHitPos; + } + void ClrSet() { + OffSPrm(1); + } + u32 ChkSet() { + return MskSPrm(1); + } + + void SetCallback(cCcD_HitCallback cb) { + mHit_cb = cb; + } + + u32 MskType(u32 mask) const { + return mSrc.mType & mask; + } + void SetType(u32 flag) { + mSrc.mType = flag; + } + void OnType(u32 m) { + mSrc.mType |= m; + } + void OffType(u32 m) { + mSrc.mType &= ~m; + } + u32 MskSPrm(u32 m) const { + return mSrc.mSPrm & m; + } + void SetSPrm(u32 f) { + mSrc.mSPrm = f; + } + void OnSPrm(u32 m) { + mSrc.mSPrm |= m; + } + void OffSPrm(u32 m) { + mSrc.mSPrm &= ~m; + } + u32 MskTgHitSPrm(u32 m) const { + return mTgHitSrc.mSPrm & m; + } + void SetTgHitSPrm(u32 f) { + mTgHitSrc.mSPrm = f; + } + void OnTgHitSPrm(u32 m) { + mTgHitSrc.mSPrm |= m; + } + void OffTgHitSPrm(u32 m) { + mTgHitSrc.mSPrm &= ~m; + } + + const cCcD_SrcGObjAt &GetSrc() const { + return mSrc; + } + void SetTgHitSrc(const cCcD_SrcGObjTg &src) { + mTgHitSrc = src; + } + const cCcD_SrcGObjTg &GetTgHitSrc() const { + return mTgHitSrc; + } + +public: + /* 0x1C */ cCcD_SrcGObjAt mSrc; + /* 0x30 */ mVec3_c mHitPos; + /* 0x3C */ mVec3_c mVec; + /* 0x48 */ cCcD_SrcGObjTg mTgHitSrc; + /* 0x58 */ cCcD_HitCallback mField_0x58; +}; + +class cCcD_ObjTg : public cCcD_GAtTgCoCommonBase { +public: + cCcD_ObjTg(); + virtual ~cCcD_ObjTg(); + void Set(const cCcD_SrcGObjTg &); + void AdjustHitPos(f32, f32); + + void SetHitPos(mVec3_c &pos) { + mHitPos = pos; + } + mVec3_c &GetHitPos() { + return mHitPos; + } + + u32 GetAtHitType() const { + return mAtHitSrc.mType; + } + + void SetFlag_0xA(u16 flag) { + mSrc.mField_0x0E = flag; + } + + u16 GetFlag_0xA(u16 mask) const { + return mSrc.mField_0x0E & mask; + } + void ClrSet() { + OffSPrm(1); + } + u32 ChkSet() { + return MskSPrm(1); + } + + void Set_0x4C(u32 f) { + mField_0x4C = f; + } + + u32 MskType(u32 mask) const { + return mSrc.mType & mask; + } + void SetType(u32 flag) { + mSrc.mType = flag; + } + void OnType(u32 m) { + mSrc.mType |= m; + } + void OffType(u32 m) { + mSrc.mType &= ~m; + } + u32 MskSPrm(u32 m) const { + return mSrc.mSPrm & m; + } + void SetSPrm(u32 f) { + mSrc.mSPrm = f; + } + void OnSPrm(u32 m) { + mSrc.mSPrm |= m; + } + void OffSPrm(u32 m) { + mSrc.mSPrm &= ~m; + } + u32 MskAtHitSPrm(u32 m) const { + return mAtHitSrc.mSPrm & m; + } + void SetAtHitSPrm(u32 f) { + mAtHitSrc.mSPrm = f; + } + void OnAtHitSPrm(u32 m) { + mAtHitSrc.mSPrm |= m; + } + void OffAtHitSPrm(u32 m) { + mAtHitSrc.mSPrm &= ~m; + } + + const cCcD_SrcGObjTg &GetSrc() const { + return mSrc; + } + void SetAtHitSrc(const cCcD_SrcGObjAt &src) { + mAtHitSrc = src; + } + const cCcD_SrcGObjAt &GetAtHitSrc() const { + return mAtHitSrc; + } + + void Set_0x4B(u8 val) { + mField_0x4B = val; + } + +public: + /* 0x1C */ cCcD_SrcGObjTg mSrc; + /* 0x2C */ mVec3_c mField_0x2C; + /* 0x38 */ mVec3_c mHitPos; + /* 0x44 */ s16 *mShieldFrontRangeYAngle; + /* 0x48 */ s16 mShieldRange; + /* 0x4A */ u8 mField_0x4A; + /* 0x4B */ u8 mField_0x4B; + /* 0x4C */ u32 mField_0x4C; + /* 0x50 */ u32 mField_0x50; + /* 0x54 */ cCcD_ShieldChkCallback mField_0x54; + /* 0x58 */ cCcD_SrcGObjAt mAtHitSrc; + /* 0x6C */ mVec3_c mField_0x6C; + /* 0x78 */ cCcD_HitCallback mField_0x78; +}; + +class cCcD_ObjCo : public cCcD_GAtTgCoCommonBase { +public: + cCcD_ObjCo(); + virtual ~cCcD_ObjCo(); + void Set(const cCcD_SrcGObjCo &); + void SetCoFlag(u32); + void AdjustHitPos(f32, f32); + + void ClrSet() { + OffSPrm(1); + } + u32 ChkSet() { + return MskSPrm(1); + } + u32 MskSPrm(u32 m) const { + return mSrc.mSPrm & m; + } + void SetSPrm(u32 f) { + mSrc.mSPrm = f; + } + void OnSPrm(u32 m) { + mSrc.mSPrm |= m; + } + void OffSPrm(u32 m) { + mSrc.mSPrm &= ~m; + } + + const cCcD_SrcGObjCo &GetSrc() const { + return mSrc; + } + void SetCoHitSrc(const cCcD_SrcGObjCo &src) { + mCoHitSrc = src; + } + +public: + /* 0x1C */ cCcD_SrcGObjCo mSrc; + /* 0x20 */ u32 mGrp; + /* 0x24 */ cCcD_SrcGObjCo mCoHitSrc; + /* 0x28 */ cCcD_HitCallback mField_0x28_callback; +}; + +// Maybe ? +class cCcD_ObjInf { +public: + /* 0x000 */ cCcD_ObjAt mObjAt; + /* 0x05C */ cCcD_ObjTg mObjTg; + /* 0x0D8 */ cCcD_ObjCo mObjCo; +}; + +class cCcD_Obj { +public: + /* 0x000 */ cCcD_ObjAt mAt; + /* 0x05C */ cCcD_ObjTg mTg; + /* 0x0D8 */ cCcD_ObjCo mCo; + /* 0x104 */ cCcD_Stts *mStts; + /* 0x108 */ u32 mField_0x108; + +public: + cCcD_Obj(); + virtual ~cCcD_Obj(); + virtual cCcD_ShapeAttr *GetShapeAttr() = 0; + virtual cCcD_ObjInf *GetGObjInfo(); + void ClrSet(); + void Set(const cCcD_SrcGObj &); + void ClrAtHit(); + void ClrTgHit(); + void ClrCoHit(); + + const mVec3_c &GetAtHitPos() const; + mVec3_c &GetAtHitPos(); + bool GetAtFlag0x2() const; + bool GetAtFlag0x4() const; + bool GetAtFlag0x8() const; + + const mVec3_c &GetTgHitPos() const; + mVec3_c &GetTgHitPos(); + bool GetTgFlag0x4() const; + bool GetTgFlag0x8() const; + + bool ChkAtClawshot() const; + bool ChkAtClawshotDebug() const; + bool ChkAtElectrified() const; + bool ChkAtElectrifiedExtra() const; + bool ChkAtWhippable() const; + bool ChkAtBit24() const; + bool ChkAtArrowStick() const; + bool ChkAtWaterScaleBonk() const; + bool ChkAtSwordBonk() const; + dAcObjBase_c *GetAtActor(); + + bool ChkTgAtHitType(u32) const; + u32 GetTg_0x58() const; + bool ChkTgBit14() const; + u8 GetTgDamage() const; + u16 GetTgDamageFlags() const; + bool ChkTgSkywardStrike() const; + bool ChkTgBit17() const; + bool ChkTgBit18() const; + bool ChkTgBit19() const; + bool ChkTgBit20() const; + bool ChkTgBit23() const; + bool ChkTgBit24() const; + bool ChkTgBit25() const; + u16 GetTgSoundID() const; + s16 GetTg_0x6A() const; + bool ChkTgBit8() const; + u8 GetTg_0x4A() const; + dAcObjBase_c *GetTgActor(); + const mVec3_c &GetTg_0x2C() const; + + dAcObjBase_c *GetCoActor(); + bool ChkCoBit4() const; + + void SetAtFlagsUpper(u32); + bool ChkTgBit1() const; + + void AdjustHitPos(f32, f32); + + static bool fn_80328ad0(dAcObjBase_c *pObj, u32 attype); + + // clang-format off + cCcD_Stts* GetStts() { + return mStts; + } + void SetStts(cCcD_Stts &stts) { mStts = &stts; } + + void SetAtVec(const mVec3_c &vec) { mAt.SetVec(vec); } + + + void OnTgCoFlag(u32 f) { + mTg.OnSPrm(f); + mCo.OnSPrm(f); + } + + void SetTgFlag(u32 flag) { + mTg.SetType(flag); + } + void SetAtFlag(u32 flag) { + mAt.SetSPrm(flag); + } + + void SetTgFlag_0xA(u16 flag) { + mTg.SetFlag_0xA(flag); + } + + bool ChkTgHit() { + return mTg.MskSPrm(1) != 0 && mTg.GetActor() != nullptr; + } + bool ChkAtHit() { + return mAt.MskSPrm(1) != 0 && mAt.GetActor() != nullptr; + } + bool ChkCoHit() { + return mCo.MskSPrm(1) != 0 && mCo.GetActor() != nullptr; + } + + dAcObjBase_c *GetAc() { + if (mStts == nullptr) { + return nullptr; + } else { + return mStts->mpActor; + } + } + + void ClrCoSet() { + mCo.ClrSet(); + } + void ClrAtSet() { + mAt.ClrSet(); + } + void ClrTgSet() { + mTg.ClrSet(); + } + u32 ChkCoSet() { + return mCo.ChkSet(); + } + u32 ChkAtSet() { + return mAt.ChkSet(); + } + u32 ChkTgSet() { + return mTg.ChkSet(); + } + + + bool ChkAtEffCounter() { return mAt.ChkEffCounter(); } + bool ChkTgEffCounter() { return mTg.ChkEffCounter(); } + void ClrAtEffCounter() { mAt.ClrEffCounter(); } + void ClrTgEffCounter() { mTg.ClrEffCounter(); } + void ClrCoEffCounter() { mCo.ClrEffCounter(); } + void SetAtEffCounterTimer() { mAt.SetEffCounterTimer(); } + void SetTgEffCounterTimer() { mTg.SetEffCounterTimer(); } + void SubtractAtEffCounter() { mAt.SubtractEffCounter(); } + void SubtractTgEffCounter() { mTg.SubtractEffCounter(); } + void SubtractCoEffCounter() { mCo.SubtractEffCounter(); } + + void SetTg_0x4C(u32 f) { + mTg.Set_0x4C(f); + } + + void SetAtCallback(cCcD_HitCallback cb) { + mAt.SetCallback(cb); + } + + u32 ChkTgNoAtHitInfSet() const { + return mTg.MskSPrm(0x40); + } + u32 ChkAtNoTgHitInfSet() const { + return mAt.MskSPrm(0x40); + } + u32 ChkCoNoCoHitInfSet() const { + return mCo.MskSPrm(0x800); + } + + // At + + u32 ChkAtNoMass() const { + return mAt.MskSPrm(0x400); + } + u32 GetAtGrp() const { + return mAt.MskSPrm(0x3E); + } + u32 ChkAtNoConHit() const { + return mAt.MskSPrm(0x80); + } + u32 ChkAtStopNoConHit() const { + return mAt.MskSPrm(0x200); + } + u32 ChkAtNoGaurd() const { + return mAt.MskSPrm(0x200000); + } + + // Tg + + u32 GetTgGrp() const { + return mTg.MskSPrm(0x3E); + } + u32 ChkTgNoConHit() const { + return mTg.MskSPrm(0x100); + } + u32 ChkTgStopNoConHit() const { + return mTg.MskSPrm(0x100000); + } + u32 ChkTgShieldFrontRange() const { + return mTg.MskSPrm(0x400); + } + + void SetTg_0x4B(u8 val) { + mTg.Set_0x4B(val); + } + + // Co + + u32 ChkCoSet2() const { + return mCo.MskSPrm(0x800); + } + u32 ChkCoNoCamHit() const { + return mCo.MskSPrm(0x4000); + } + u32 ChkCoSameActorHit() const { + return mCo.MskSPrm(0x1000); + } + + /** + * SET HIT + */ + + // Actor Objs + void SetAtHit(cCcD_Obj *other) { + mAt.SetHitActor(other->GetAc()); + } + void SetTgHit(cCcD_Obj *other) { + mTg.SetHitActor(other->GetAc()); + } + void SetCoHit(cCcD_Obj *other) { + mCo.SetHitActor(other->GetAc()); + } + + // Hit Positions + void SetAtHitPos(mVec3_c &pos) { + mAt.SetHitPos(pos); + } + void SetTgHitPos(mVec3_c &pos) { + mTg.SetHitPos(pos); + } + + /** + * SET SOURCES + */ + + void SetAtTgHitSrc(cCcD_Obj *tg) { + mAt.SetTgHitSrc(tg->mTg.GetSrc()); + } + void SetTgAtHitSrc(cCcD_Obj *at) { + mTg.SetAtHitSrc(at->mAt.GetSrc()); + } + void SetCoCoHitSrc(cCcD_Obj *co) { + mCo.SetCoHitSrc(co->mCo.GetSrc()); + } + + // clang-format on +}; + #endif diff --git a/include/d/col/c/c_cc_s.h b/include/d/col/c/c_cc_s.h index 9eccad82..dea515c7 100644 --- a/include/d/col/c/c_cc_s.h +++ b/include/d/col/c/c_cc_s.h @@ -1,7 +1,20 @@ #ifndef C_CC_S_H #define C_CC_S_H +#include "common.h" +#include "d/a/obj/d_a_obj_base.h" #include "d/col/c/c_cc_d.h" +#include "m/m_mtx.h" +#include "m/m_vec.h" + +/** + * This still seems to be exist, but looks like was heavily revised. + * No more virtual functions + * a couple more entry arrays (a Matrix one and a model one) + * + * This file is largely here to support future changes? + * - dCcS copies and pastes the content. Otherwise the ctor is weird + */ enum WeightType { WeightType_0 = 0, @@ -9,52 +22,53 @@ enum WeightType { WeightType_2 = 2, }; -// class cCcS { -// public: -// /* 0x0000 */ cCcD_Obj *mpObjAt[0x100]; -// /* 0x0400 */ cCcD_Obj *mpObjTg[0x300]; -// /* 0x1000 */ cCcD_Obj *mpObjCo[0x100]; -// /* 0x1400 */ cCcD_Obj *mpObj[0x500]; -// /* 0x2800 */ u16 mObjAtCount; -// /* 0x2802 */ u16 mObjTgCount; -// /* 0x2804 */ u16 mObjCoCount; -// /* 0x2806 */ u16 mObjCount; -// /* 0x2808 */ cCcD_DivideArea mDivideArea; -// /* 0x2848 vtable */ - -// /* 80264A6C */ cCcS(); -// /* 80264A94 */ void Ct(); -// /* 80264B60 */ void Dt(); -// /* 80264B80 */ WeightType GetWt(u8) const; -// /* 80264BA8 */ void Set(cCcD_Obj *); -// /* 80264C5C */ void ClrCoHitInf(); -// /* 80264CF0 */ void ClrTgHitInf(); -// /* 80264D90 */ void ClrAtHitInf(); -// /* 80264E2C */ bool ChkNoHitAtTg(cCcD_Obj *, cCcD_Obj *); -// /* 80264F40 */ void ChkAtTg(); -// /* 8026515C */ bool ChkNoHitCo(cCcD_Obj *, cCcD_Obj *); -// /* 80265230 */ void ChkCo(); -// /* 802653A0 vt[2] */ virtual void CalcTgPlusDmg(cCcD_Obj *, cCcD_Obj *, cCcD_Stts *, cCcD_Stts *); -// /* 802653C8 */ void SetAtTgCommonHitInf(cCcD_Obj *, cCcD_Obj *, cXyz *); -// /* 802655E4 */ void SetCoCommonHitInf(cCcD_Obj *, cXyz *, cCcD_Obj *, cXyz *, f32); -// /* 80265750 vt[3]*/ virtual void SetPosCorrect(cCcD_Obj *, cXyz *, cCcD_Obj *, cXyz *, f32); -// /* 80265BB4 */ void CalcArea(); -// /* 80265CCC */ void Move(); -// /* 80265D30 */ void DrawClear(); -// /* 80265DF8 vt[4] */ virtual void -// SetCoGObjInf(bool, bool, cCcD_GObjInf *, cCcD_GObjInf *, cCcD_Stts *, cCcD_Stts *, cCcD_GStts *, cCcD_GStts *); -// /* 80265DFC vt[5] */ virtual void -// SetAtTgGObjInf(bool, bool, cCcD_Obj *, cCcD_Obj *, cCcD_GObjInf *, cCcD_GObjInf *, cCcD_Stts *, cCcD_Stts *, -// cCcD_GStts *, cCcD_GStts *, cXyz *); -// /* 80265E00 vt[6] */ virtual bool -// ChkNoHitGAtTg(cCcD_GObjInf const *, cCcD_GObjInf const *, cCcD_GStts *, cCcD_GStts *); -// /* 80265E08 vt[7] */ virtual bool -// ChkAtTgHitAfterCross(bool, bool, cCcD_GObjInf const *, cCcD_GObjInf const *, cCcD_Stts *, cCcD_Stts *, cCcD_GStts *, -// cCcD_GStts *); -// /* 80265E10 vt[8] */ virtual bool ChkNoHitGCo(cCcD_Obj *, cCcD_Obj *); -// /* 80030BDC vt[9] */ virtual ~cCcS() {} -// /* 80265E18 vt[10] */ virtual void MoveAfterCheck(); -// /* 80265DF4 vt[11] */ virtual void SetCoGCorrectProc(cCcD_Obj *, cCcD_Obj *); -// }; // Size = 0x284C +class cCcS { +public: + /* 0x0000 */ cCcD_Obj *mpObjAt[0x200]; + /* 0x0800 */ cCcD_Obj *mpObjTg[0x300]; + /* 0x1400 */ cCcD_Obj *mpObjCo[0x200]; + /* 0x1c00 */ cCcD_Obj *mpObj[0x340]; + /* 0x2900 */ UNKTYPE *mpUnk[0x100]; + /* 0x2D00 */ u16 mObjAtCount; + /* 0x2d02 */ u16 mObjTgCount; + /* 0x2D04 */ u16 mObjCoCount; + /* 0x2D06 */ u16 mObjCount; + /* 0x2D08 */ u32 mUnkCount; + /* 0x2D0C */ cCcD_DivideArea mDivideArea; + /* 0x2D4C */ bool mbAreaSet; + /* 0x2D50 */ mMtx_c mAreas[16][2]; // could be a structure? + /* 0x3350 */ int mAreaCount; + + cCcS() {} + + void Ct(); + void Dt(); + + void Set(cCcD_Obj *); + + void ChkCo(mVec3_c *, dAcObjBase_c *); + bool fn_80357c90(mVec3_c *, mVec3_c *, u32, UNKTYPE *); + + // WeightType GetWt(u8) const; + // void ClrCoHitInf(); + // void ClrTgHitInf(); + // void ClrAtHitInf(); + // bool ChkNoHitAtTg(cCcD_Obj *, cCcD_Obj *); + // void ChkAtTg(); + // bool ChkNoHitCo(cCcD_Obj *, cCcD_Obj *); + // void CalcTgPlusDmg(cCcD_Obj *, cCcD_Obj *, cCcD_Stts *, cCcD_Stts *); + // void SetAtTgCommonHitInf(cCcD_Obj *, cCcD_Obj *, cXyz *); + // void SetCoCommonHitInf(cCcD_Obj *, cXyz *, cCcD_Obj *, cXyz *, f32); + // void SetPosCorrect(cCcD_Obj *, cXyz *, cCcD_Obj *, cXyz *, f32); + // void CalcArea(); + // void Move(); + // void DrawClear(); + // void SetCoGObjInf(bool, bool, cCcD_ObjInf *, cCcD_ObjInf *, cCcD_Stts *, cCcD_Stts *, cCcD_GStts *, cCcD_GStts + // *); void SetAtTgGObjInf(bool, bool, cCcD_Obj *, cCcD_Obj *, cCcD_ObjInf *, cCcD_ObjInf *, cCcD_Stts *, + // cCcD_Stts *, cCcD_GStts *, cCcD_GStts *, cXyz *); bool ChkNoHitGAtTg(cCcD_ObjInf const *, cCcD_ObjInf const *, + // cCcD_GStts *, cCcD_GStts *); bool ChkAtTgHitAfterCross(bool, bool, cCcD_ObjInf const *, cCcD_ObjInf const *, + // cCcD_Stts *, cCcD_Stts *, cCcD_GStts *, cCcD_GStts *); bool ChkNoHitGCo(cCcD_Obj *, cCcD_Obj *); ~cCcS() {} void + // MoveAfterCheck(); void SetCoGCorrectProc(cCcD_Obj *, cCcD_Obj *); +}; #endif /* C_CC_S_H */ diff --git a/include/d/col/c/c_m3d.h b/include/d/col/c/c_m3d.h index c148eef3..cf9c3450 100644 --- a/include/d/col/c/c_m3d.h +++ b/include/d/col/c/c_m3d.h @@ -3,7 +3,8 @@ #include "common.h" #include "math.h" -#include "nw4r/math.h" +#include "nw4r/math.h" // IWYU pragma: export +#include "nw4r/types_nw4r.h" class cM3dGAab; class cM3dGCps; @@ -19,64 +20,69 @@ struct cM3d_Range; extern const f32 G_CM3D_F_ABS_MIN; bool cM3d_Len2dSqPntAndSegLine(f32, f32, f32, f32, f32, f32, f32 *, f32 *, f32 *); -bool cM3d_Len3dSqPntAndSegLine(const cM3dGLin *, const nw4r::math::VEC3 *, nw4r::math::VEC3 *, f32 *, f32 *); -f32 cM3d_SignedLenPlaAndPos(const cM3dGPla *, const nw4r::math::VEC3 *); +bool cM3d_Len3dSqPntAndSegLine(const cM3dGLin &, const nw4r::math::VEC3 &, nw4r::math::VEC3 *, f32 *, f32 *); +f32 cM3d_SignedLenPlaAndPos(const cM3dGPla &, const nw4r::math::VEC3 *); void cM3d_CalcPla(const nw4r::math::VEC3 *, const nw4r::math::VEC3 *, const nw4r::math::VEC3 *, nw4r::math::VEC3 *, f32 *); -int cM3d_Check_LinLin(const cM3dGLin *, const cM3dGLin *, f32 *, f32 *); -bool cM3d_Cross_LinPla(const cM3dGLin *, const cM3dGPla *, nw4r::math::VEC3 *, bool, bool); +int cM3d_Check_LinLin(const cM3dGLin &, const cM3dGLin *, f32 *, f32 *); +bool cM3d_Cross_LinPla(const cM3dGLin &, const cM3dGPla *, nw4r::math::VEC3 *, bool, bool); bool cM3d_Cross_MinMaxBoxLine(const nw4r::math::VEC3 *, const nw4r::math::VEC3 *, const nw4r::math::VEC3 *, const nw4r::math::VEC3 *); bool cM3d_InclusionCheckPosIn3PosBox3d( const nw4r::math::VEC3 *, const nw4r::math::VEC3 *, const nw4r::math::VEC3 *, const nw4r::math::VEC3 *, f32 ); -bool cM3d_CrossX_Tri(const cM3dGTri *, const nw4r::math::VEC3 *, f32); -bool cM3d_CrossX_Tri(const cM3dGTri *, const nw4r::math::VEC3 *); -bool cM3d_CrossY_Tri(const cM3dGTri *, const nw4r::math::VEC3 *); +bool cM3d_CrossX_Tri(const cM3dGTri &, const nw4r::math::VEC3 *, f32); +bool cM3d_CrossX_Tri(const cM3dGTri &, const nw4r::math::VEC3 *); +bool cM3d_CrossY_Tri(const cM3dGTri &, const nw4r::math::VEC3 *); bool cM3d_CrossY_Tri_Front(const nw4r::math::VEC3 &, const nw4r::math::VEC3 &, const nw4r::math::VEC3 &, const nw4r::math::VEC3 *); -bool cM3d_CrossY_Tri(const cM3dGTri *, const nw4r::math::VEC3 *, f32 *); -bool cM3d_CrossY_Tri(const cM3dGTri *, const nw4r::math::VEC3 *, f32); -bool cM3d_CrossY_Tri(const cM3dGTri *, const nw4r::math::VEC3 *, const cM3d_Range *, f32 *); -bool cM3d_CrossZ_Tri(const cM3dGTri *, const nw4r::math::VEC3 *, f32); -bool cM3d_CrossZ_Tri(const cM3dGTri *, const nw4r::math::VEC3 *); -bool cM3d_CrossZ_Tri(const cM3dGTri *, const nw4r::math::VEC3 *, f32 *); -bool cM3d_Cross_LinTri(const cM3dGLin *, const cM3dGTri *, nw4r::math::VEC3 *, bool, bool); +bool cM3d_CrossY_Tri(const cM3dGTri &, const nw4r::math::VEC3 *, f32 *); +bool cM3d_CrossY_Tri(const cM3dGTri &, const nw4r::math::VEC3 *, f32); +bool cM3d_CrossY_Tri(const cM3dGTri &, const nw4r::math::VEC3 *, const cM3d_Range *, f32 *); +bool cM3d_CrossZ_Tri(const cM3dGTri &, const nw4r::math::VEC3 *, f32); +bool cM3d_CrossZ_Tri(const cM3dGTri &, const nw4r::math::VEC3 *); +bool cM3d_CrossZ_Tri(const cM3dGTri &, const nw4r::math::VEC3 *, f32 *); +bool cM3d_Cross_LinTri(const cM3dGLin &, const cM3dGTri &, nw4r::math::VEC3 *, bool, bool); bool cM3d_Cross_LinTri( - const cM3dGLin *, const nw4r::math::VEC3 *, const nw4r::math::VEC3 *, const nw4r::math::VEC3 *, const cM3dGPla *, + const cM3dGLin &, const nw4r::math::VEC3 &, const nw4r::math::VEC3 &, const nw4r::math::VEC3 &, const cM3dGPla *, nw4r::math::VEC3 *, bool, bool ); bool cM3d_Cross_LinTri_Easy(const cM3dGTri *, const nw4r::math::VEC3 *); -bool cM3d_Cross_SphPnt(const cM3dGSph *, const nw4r::math::VEC3 *); -bool cM3d_Cross_LinSph(const cM3dGLin *, const cM3dGSph *, nw4r::math::VEC3 *); +bool cM3d_Cross_SphPnt(const cM3dGSph &, const nw4r::math::VEC3 *); +bool cM3d_Cross_LinSph(const cM3dGLin &, const cM3dGSph &, nw4r::math::VEC3 *); bool cM3d_Cross_LinSph_CrossPos(const cM3dGSph &, const cM3dGLin &, nw4r::math::VEC3 *, nw4r::math::VEC3 *); -bool cM3d_Cross_CylSph(const cM3dGCyl *, const cM3dGSph *, f32 *); -bool cM3d_Cross_CylSph(const cM3dGCyl *, const cM3dGSph *, nw4r::math::VEC3 *, f32 *); -bool cM3d_Cross_SphSph(const cM3dGSph *, const cM3dGSph *, f32 *); -bool cM3d_Cross_SphSph(const cM3dGSph *, const cM3dGSph *, f32 *, f32 *); -bool cM3d_Cross_SphSph(const cM3dGSph *, const cM3dGSph *, nw4r::math::VEC3 *); -void cM3d_CalcSphVsTriCrossPoint(const cM3dGSph *, const cM3dGTri *, nw4r::math::VEC3 *); -bool cM3d_Cross_SphTri(const cM3dGSph *, const cM3dGTri *, nw4r::math::VEC3 *, f32 *, nw4r::math::VEC3 *); -bool cM3d_Cross_CylCyl(const cM3dGCyl *, const cM3dGCyl *, f32 *); -bool cM3d_Cross_CylCyl(const cM3dGCyl *, const cM3dGCyl *, nw4r::math::VEC3 *); -bool cM3d_Cross_CylTri(const cM3dGCyl *, const cM3dGTri *, nw4r::math::VEC3 *); -int cM3d_Cross_CylLin(const cM3dGCyl *, const cM3dGLin *, nw4r::math::VEC3 *, nw4r::math::VEC3 *); -int cM3d_Cross_CylPntPnt(const cM3dGCyl *, const nw4r::math::VEC3 *, const nw4r::math::VEC3 *, nw4r::math::VEC3 *, nw4r::math::VEC3 *); -bool cM3d_Cross_CylPnt(const cM3dGCyl *, const nw4r::math::VEC3 *); +bool cM3d_Cross_CylSph(const cM3dGCyl &, const cM3dGSph &, f32 *); +bool cM3d_Cross_CylSph(const cM3dGCyl &, const cM3dGSph &, nw4r::math::VEC3 *, f32 *); +bool cM3d_Cross_SphSph(const cM3dGSph &, const cM3dGSph &, f32 *); +bool cM3d_Cross_SphSph(const cM3dGSph &, const cM3dGSph &, f32 *, f32 *); +bool cM3d_Cross_SphSph(const cM3dGSph &, const cM3dGSph &, nw4r::math::VEC3 *); +void cM3d_CalcSphVsTriCrossPoint(const cM3dGSph &, const cM3dGTri &, nw4r::math::VEC3 *); +bool cM3d_Cross_SphTri(const cM3dGSph &, const cM3dGTri &, nw4r::math::VEC3 *, f32 *, nw4r::math::VEC3 *); +bool cM3d_Cross_CylCyl(const cM3dGCyl &, const cM3dGCyl &, f32 *); +bool cM3d_Cross_CylCyl(const cM3dGCyl &, const cM3dGCyl &, nw4r::math::VEC3 *); +bool cM3d_Cross_CylTri(const cM3dGCyl &, const cM3dGTri &, nw4r::math::VEC3 *); +int cM3d_Cross_CylLin(const cM3dGCyl &, const cM3dGLin &, nw4r::math::VEC3 *, nw4r::math::VEC3 *); +int cM3d_Cross_CylPntPnt(const cM3dGCyl &, const nw4r::math::VEC3 &, const nw4r::math::VEC3 &, nw4r::math::VEC3 *, nw4r::math::VEC3 *); +bool cM3d_Cross_CylPnt(const cM3dGCyl &, const nw4r::math::VEC3 &); +bool cM3d_Cross_CpsCps(const cM3dGCps &, const cM3dGCps &, nw4r::math::VEC3 *, f32 *, f32 *); +bool cM3d_Cross_CpsCyl(const cM3dGCps &, const cM3dGCyl &, nw4r::math::VEC3 *); bool cM3d_Cross_CpsSph_CrossPos(const cM3dGCps &, const cM3dGSph &, const nw4r::math::VEC3 &, nw4r::math::VEC3 *); bool cM3d_Cross_CpsSph(const cM3dGCps &, const cM3dGSph &, nw4r::math::VEC3 *); bool cM3d_Cross_TriTri(const cM3dGTri &, const cM3dGTri &, nw4r::math::VEC3 *); -bool cM3d_Cross_CpsTri(const cM3dGCps &, cM3dGTri, nw4r::math::VEC3 *); +bool cM3d_Cross_CpsTri(const cM3dGCps &, const cM3dGTri &, nw4r::math::VEC3 *); void cM3d_CalcVecZAngle(const nw4r::math::VEC3 &, mAng3_c *); void cM3d_PlaneCrossLineProcWork(f32, f32, f32, f32, f32, f32, f32, f32 *, f32 *); int cM3d_2PlaneCrossLine(const cM3dGPla &, const cM3dGPla &, cM3dGLin *); bool cM3d_3PlaneCrossPos(const cM3dGPla &, const cM3dGPla &, const cM3dGPla &, nw4r::math::VEC3 *); -f32 cM3d_lineVsPosSuisenCross(const cM3dGLin *, const nw4r::math::VEC3 *, nw4r::math::VEC3 *); +f32 cM3d_lineVsPosSuisenCross(const cM3dGLin &, const nw4r::math::VEC3 &, nw4r::math::VEC3 *); f32 cM3d_lineVsPosSuisenCross(const nw4r::math::VEC3 &, const nw4r::math::VEC3 &, const nw4r::math::VEC3 &, nw4r::math::VEC3 *); -bool fn_803354e0(cM3dGUnk *, cM3dGUnk *, nw4r::math::VEC3 *); -bool fn_80336110(cM3dGCyl *, cM3dGUnk *, nw4r::math::VEC3 *); -bool fn_803364e0(cM3dGCyl *, cM3dGUnk *, f32 *); -bool fn_80336d90(cM3dGCps *, cM3dGUnk *, nw4r::math::VEC3 *); -bool fn_80337690(cM3dGUnk *, cM3dGSph *, nw4r::math::VEC3 *); -bool fn_80337780(cM3dGUnk *, cM3dGSph *, f32 *); +bool cM3d_Cross_UnkTri(const cM3dGUnk &, cM3dGTri &, nw4r::math::VEC3 *); +bool cM3d_Cross_CylUnk(const cM3dGCyl &, cM3dGUnk &, nw4r::math::VEC3 *); +bool cM3d_Cross_CylUnk(const cM3dGCyl &, cM3dGUnk &, f32 *); +bool cM3d_Cross_CpsUnk(const cM3dGCps &, cM3dGUnk &, nw4r::math::VEC3 *); +bool cM3d_Cross_UnkSph(const cM3dGUnk &, cM3dGSph &, nw4r::math::VEC3 *); +bool cM3d_Cross_UnkSph(const cM3dGUnk &, cM3dGSph &, f32 *); + +bool cM3d_Normalize(nw4r::math::VEC3 *); +void cM3d_Normalize_Ex(nw4r::math::VEC3 *); inline bool cM3d_IsZero(f32 f) { return fabsf(f) < G_CM3D_F_ABS_MIN; @@ -89,9 +95,9 @@ inline bool cM3d_IsZero_inverted(f32 param_0) { inline void cM3d_InDivPos1(const nw4r::math::VEC3 *pVecA, const nw4r::math::VEC3 *pVecB, f32 pF, nw4r::math::VEC3 *pOut) { - nw4r::math::VEC3 tmp; - VEC3Scale(&tmp, pVecB, pF); - VEC3Add(pOut, &tmp, pVecA); + nw4r::math::VEC3 tmp2; + VEC3Scale(&tmp2, pVecB, pF); + VEC3Add(pOut, &tmp2, pVecA); } inline void cM3d_InDivPos2(const nw4r::math::VEC3 *pVecA, const nw4r::math::VEC3 *pVecB, f32 pF, nw4r::math::VEC3 *pOut) { diff --git a/include/d/col/c/c_m3d_g_aab.h b/include/d/col/c/c_m3d_g_aab.h index 2afb932f..6f32e328 100644 --- a/include/d/col/c/c_m3d_g_aab.h +++ b/include/d/col/c/c_m3d_g_aab.h @@ -5,7 +5,7 @@ #include "d/col/c/c_m3d.h" #include "d/col/c/c_m3d_g_lin.h" #include "d/col/c/c_m3d_g_sph.h" - +#include "m/m_vec.h" // Axis aligned bounding box class cM3dGAab { @@ -23,7 +23,6 @@ class cM3dGAab { bool CrossY(const mVec3_c &) const; bool UnderPlaneYUnder(f32) const; bool TopPlaneYUnder(f32) const; - void SetMinMax(const cM3dGAab &); void SetMin(const mVec3_c &min); void SetMax(const mVec3_c &max); void CalcCenter(mVec3_c &) const; @@ -32,6 +31,11 @@ class cM3dGAab { void Set(const cM3dGSph &); bool Cross(const mVec3_c &) const; + void SetMinMax(const cM3dGAab &aab) { + SetMin(aab.mMin); + SetMax(aab.mMax); + } + void SetMinMax(const mVec3_c &minMax) { SetMin(minMax); SetMax(minMax); @@ -46,6 +50,19 @@ class cM3dGAab { mMax.x = -1000000000.0f; } + const mVec3_c &GetMax() const { + return mMax; + } + mVec3_c &GetMax() { + return mMax; + } + const mVec3_c &GetMin() const { + return mMin; + } + mVec3_c &GetMin() { + return mMin; + } + const mVec3_c *GetMaxP(void) const { return &mMax; } diff --git a/include/d/col/c/c_m3d_g_cps.h b/include/d/col/c/c_m3d_g_cps.h index d700e3bb..ec0c88c2 100644 --- a/include/d/col/c/c_m3d_g_cps.h +++ b/include/d/col/c/c_m3d_g_cps.h @@ -18,7 +18,7 @@ class cM3dGCps : public cM3dGLin { void Set(const mVec3_c &, const mVec3_c &, f32); void SetR(f32 r); void Set_0x1C(f32); - bool fn_80337f30(cM3dGUnk *, mVec3_c *); + bool Cross(cM3dGUnk &, mVec3_c *); bool fn_80337f40(const mVec3_c &) const; f32 GetR() const { diff --git a/include/d/col/c/c_m3d_g_cyl.h b/include/d/col/c/c_m3d_g_cyl.h index c2941280..a5dfa486 100644 --- a/include/d/col/c/c_m3d_g_cyl.h +++ b/include/d/col/c/c_m3d_g_cyl.h @@ -17,14 +17,23 @@ class cM3dGCyl { void SetH(f32); void SetR(f32); - bool fn_803380e0(cM3dGUnk *, mVec3_c *); - bool fn_803380f0(cM3dGUnk *, f32 *); + bool Cross(cM3dGUnk &, mVec3_c *); + bool Cross(cM3dGUnk &, f32 *); bool Cross(const mVec3_c &) const; void Clamp(const mVec3_c &, mVec3_c &) const; const mVec3_c &GetC() const { return mCenter; } + mVec3_c &GetC() { + return mCenter; + } + f32 GetH() const { + return mHeight; + } + f32 GetR() const { + return mRadius; + } }; #endif diff --git a/include/d/col/c/c_m3d_g_lin.h b/include/d/col/c/c_m3d_g_lin.h index 02cea601..8b1d9d46 100644 --- a/include/d/col/c/c_m3d_g_lin.h +++ b/include/d/col/c/c_m3d_g_lin.h @@ -3,14 +3,16 @@ #include "common.h" #include "m/m_vec.h" +#include "nw4r/types_nw4r.h" class cM3dGLin { public: typedef nw4r::math::VEC3 VEC3; typedef EGG::Vector3f Vector3f; - /* 0x00 */ mVec3_c mStart; - /* 0x0C */ mVec3_c mEnd; + // Needs to be mutable for cCcD_CpsAttr::GetPos and cCcD_CpsAttr::GetShapeAccess + /* 0x00 */ mutable mVec3_c mStart; + /* 0x0C */ mutable mVec3_c mEnd; cM3dGLin() {} @@ -32,34 +34,34 @@ class cM3dGLin { mEnd = *pEnd; } - nw4r::math::VEC3 &GetStart() { + mVec3_c &GetStart() { return mStart; } - const nw4r::math::VEC3 &GetStart() const { + const mVec3_c &GetStart() const { return mStart; } - nw4r::math::VEC3 *GetStartP(void) { + mVec3_c *GetStartP(void) { return &mStart; } - const nw4r::math::VEC3 *GetStartP(void) const { + const mVec3_c *GetStartP(void) const { return &mStart; } - nw4r::math::VEC3 &GetEnd() { + mVec3_c &GetEnd() { return mEnd; } - const nw4r::math::VEC3 &GetEnd() const { + const mVec3_c &GetEnd() const { return mEnd; } - nw4r::math::VEC3 *GetEndP(void) { + mVec3_c *GetEndP(void) { return &mEnd; } - const nw4r::math::VEC3 *GetEndP(void) const { + const mVec3_c *GetEndP(void) const { return &mEnd; } }; diff --git a/include/d/col/c/c_m3d_g_pla.h b/include/d/col/c/c_m3d_g_pla.h index cac47fbe..9abe43d8 100644 --- a/include/d/col/c/c_m3d_g_pla.h +++ b/include/d/col/c/c_m3d_g_pla.h @@ -3,6 +3,7 @@ #include "c/c_math.h" #include "d/col/c/c_m3d.h" +#include "m/m_angle.h" #include "m/m_vec.h" // Plane with a normal @@ -36,6 +37,12 @@ class cM3dGPla { const mVec3_c *GetNP() const { return &mNormal; } + mVec3_c &GetN() { + return mNormal; + } + const mVec3_c &GetN() const { + return mNormal; + } f32 GetD() const { return mD; } @@ -46,13 +53,13 @@ class cM3dGPla { return ((-mNormal.x * param_1->x - mNormal.z * param_1->z) - mD) / mNormal.y; } - s32 GetAngleY() const { - return cM::atan2s(mNormal.x, mNormal.z); - } - f32 GetXZDist() const { return EGG::Math::sqrt(mNormal.x * mNormal.x + mNormal.z * mNormal.z); } + + mAng GetAngleY() const { + return cM::atan2s(mNormal.x, mNormal.z); + } }; #endif diff --git a/include/d/col/c/c_m3d_g_sph.h b/include/d/col/c/c_m3d_g_sph.h index 43480a97..0dd60c2e 100644 --- a/include/d/col/c/c_m3d_g_sph.h +++ b/include/d/col/c/c_m3d_g_sph.h @@ -20,14 +20,17 @@ class cM3dGSph { bool Cross(const cM3dGTri *, f32 *, mVec3_c *); void Clamp(const mVec3_c &, mVec3_c &) const; - bool fn_80338750(cM3dGUnk *, mVec3_c *); - bool fn_80338760(cM3dGUnk *, f32 *); + bool Cross(cM3dGUnk &, mVec3_c *); + bool Cross(cM3dGUnk &, f32 *); void SetRatio(f32); const mVec3_c &GetC() const { return mCenter; } + mVec3_c &GetC() { + return mCenter; + } const f32 &GetR() const { return mRadius; diff --git a/include/d/col/c/c_m3d_g_tri.h b/include/d/col/c/c_m3d_g_tri.h index a6402cdc..dc90bbb7 100644 --- a/include/d/col/c/c_m3d_g_tri.h +++ b/include/d/col/c/c_m3d_g_tri.h @@ -3,6 +3,7 @@ #include "common.h" #include "d/col/c/c_m3d_g_pla.h" +#include "m/m_vec.h" class cM3dGTri : public cM3dGPla { typedef nw4r::math::VEC3 VecType; @@ -12,13 +13,23 @@ class cM3dGTri : public cM3dGPla { /* 0x1C */ VecType mB; /* 0x28 */ VecType mC; + const mVec3_c &GetPntA() const { + return *(mVec3_c *)&mA; + } + const mVec3_c &GetPntB() const { + return *(mVec3_c *)&mB; + } + const mVec3_c &GetPntC() const { + return *(mVec3_c *)&mC; + } + cM3dGTri() {} void SetPos(const VecType *, const VecType *, const VecType *); void SetBg(const VecType *, const VecType *, const VecType *, const cM3dGPla *pla); - bool cross(const cM3dGLin *lin, VecType *xyz, bool param_2, bool param_3) const { - return cM3d_Cross_LinTri(lin, this, xyz, param_2, param_3); + bool cross(const cM3dGLin &lin, VecType *xyz, bool param_2, bool param_3) const { + return cM3d_Cross_LinTri(lin, *this, xyz, param_2, param_3); } }; diff --git a/include/d/col/c/c_m3d_g_unk.h b/include/d/col/c/c_m3d_g_unk.h index ea0de359..26533f4b 100644 --- a/include/d/col/c/c_m3d_g_unk.h +++ b/include/d/col/c/c_m3d_g_unk.h @@ -2,10 +2,11 @@ #define C_M3D_G_UNK_H #include "common.h" +#include "d/col/c/c_m3d.h" +#include "d/col/c/c_m3d_g_lin.h" #include "m/m_mtx.h" #include "m/m_vec.h" - struct cM3dGCps; struct cM3dGCyl; struct cM3dGSph; @@ -16,8 +17,7 @@ class cM3dGUnk { /* 0x30 */ mMtx_c mInvMtx; /* 0x60 */ mVec3_c mMin; /* 0x6C */ mVec3_c mMax; - /* 0x78 */ mVec3_c mField_0x78; - /* 0x84 */ mVec3_c mField_0x84; + /* 0x78 */ cM3dGLin mLin; /* 0x90 */ mVec3_c mField_0x90; /* 0x9C */ mVec3_c mField_0x9C; /* 0xA8 */ mVec3_c mField_0xA8; @@ -34,13 +34,13 @@ class cM3dGUnk { void Update(); void GetStartEnd(mVec3_c &, mVec3_c &); - void fn_80338c30(cM3dGCps *, mVec3_c *); - bool fn_80338c40(cM3dGUnk *, mVec3_c *); - bool fn_80338ca0(/* TODO */); - bool fn_80338cb0(cM3dGCyl *, mVec3_c *); - bool fn_80338cc0(cM3dGCyl *, f32 *); - bool fn_80338cd0(cM3dGSph *, mVec3_c *); - bool fn_80338ce0(cM3dGSph *, f32 *); + bool Cross(cM3dGCps &, mVec3_c *); + bool Cross(cM3dGTri &, mVec3_c *); + bool Cross(cM3dGUnk &, mVec3_c *); + bool Cross(cM3dGCyl &, mVec3_c *); + bool Cross(cM3dGCyl &, f32 *); + bool Cross(cM3dGSph &, mVec3_c *); + bool Cross(cM3dGSph &, f32 *); void Set(const mMtx_c &); void Set(const mVec3_c &, const mAng &); diff --git a/include/d/col/cc/d_cc_d.h b/include/d/col/cc/d_cc_d.h index aa760b75..2242323e 100644 --- a/include/d/col/cc/d_cc_d.h +++ b/include/d/col/cc/d_cc_d.h @@ -1,517 +1,89 @@ #ifndef D_CC_D_H #define D_CC_D_H -#include "d/a/d_a_base.h" -#include "d/col/c/c_m3d_g_aab.h" -#include "d/col/c/c_m3d_g_cps.h" -#include "d/col/c/c_m3d_g_cyl.h" -#include "d/col/c/c_m3d_g_sph.h" -#include "d/col/c/c_m3d_g_unk.h" -#include "f/f_base_id.h" +#include "d/col/c/c_cc_d.h" +#include "d/col/c/c_m3d.h" #include "m/m_vec.h" -// Largely modeled off -// https://github.com/zeldaret/tp/blob/main/include/SSystem/SComponent/c_cc_d.h -// https://github.com/zeldaret/tp/blob/main/include/d/cc/d_cc_d.h -// - the SComponent/d split seems to not exist anymore in SS, so we'll just -// go with the d names for this merger of the two - -class dCcD_DivideInfo { -private: - /* 0x00 */ u32 mXDivInfo; - /* 0x04 */ u32 mYDivInfo; - /* 0x08 */ u32 mZDivInfo; - /* 0x0C vtable */ -public: - /* 80328120 */ dCcD_DivideInfo(); - /* 80328130 */ virtual ~dCcD_DivideInfo(); - // void Set(u32, u32, u32); - // bool Chk(dCcD_DivideInfo const &) const; -}; // Size = 0x10 - -class dCcD_DivideArea : public cM3dGAab { -private: - /* 0x18 */ bool mXDiffIsZero; - /* 0x1C */ f32 mScaledXDiff; - /* 0x20 */ f32 mInvScaledXDiff; - /* 0x24 */ bool mYDiffIsZero; - /* 0x28 */ f32 mScaledYDiff; - /* 0x2C */ f32 mInvScaledYDiff; - /* 0x30 */ bool mZDiffIsZero; - /* 0x34 */ f32 mScaledZDiff; - /* 0x38 */ f32 mInvScaledZDiff; - -public: - /* vt at 0x3C */ - dCcD_DivideArea(); - virtual ~dCcD_DivideArea(); - /* 803281c0 */ void SetArea(cM3dGAab const &); - /* 803282d0 */ void CalcDivideInfo(dCcD_DivideInfo *, cM3dGAab const &, u32); - /* 80328470 */ void CalcDivideInfoOverArea(dCcD_DivideInfo *, cM3dGAab const &); -}; // Size = 0x40 - -class dCcD_GAtTgCoCommonBase { -protected: - /* 0x00 */ u32 field_0x00; - /* 0x04 */ s8 mEffCounter; - /* 0x08 */ dAcRef_c mActor; - /* 0x14 */ u32 field_0x14; - -public: - dCcD_GAtTgCoCommonBase(); - virtual ~dCcD_GAtTgCoCommonBase(); - - void resetEffCounter() { - mEffCounter = 0; - } - void resetField0x14() { - field_0x14 = 0; - } - u32 getField0x14() { - return field_0x14; - } - void decreaseCount(); - void unlink(); - dAcBase_c *getActor(); - void setActor(dAcBase_c *); +struct dCcD_SrcCps { + /* 0x00 */ cCcD_SrcGObj mObjInf; + /* 0x44 */ cCcD_SrcCpsAttr mCpsInf; }; -struct dCcD_SrcGAtTgCoCommonBase { - /* 0x0 */ u32 mGFlag; -}; // Size: 0x4 - -struct dCcD_SrcGObjAt { - /* 0x00 */ dCcD_SrcGAtTgCoCommonBase base; - /* 0x04 */ u32 field_0x04; - /* 0x08 */ u32 field_0x08; - /* 0x0C */ u8 mSe; // Sound Effect ID - /* 0x0D */ u8 mHitMark; // Hit Mark particle ID - /* 0x0E */ u8 mSpl; - /* 0x0F */ u8 mMtrl; - /* 0x10 */ u16 field_0x10; - /* 0x12 */ s16 field_0x12; -}; - -struct dCcD_SrcGObjTg { - /* 0x00 */ dCcD_SrcGAtTgCoCommonBase base; - /* 0x04 */ u32 field_0x04; - /* 0x08 */ u16 field_0x08; - /* 0x10 */ u16 field_0x0A; - /* 0x0C */ u16 field_0x0C; - /* 0x0E */ u16 field_0x0E; -}; - -struct dCcD_SrcGObjCo { - /* 0x0 */ dCcD_SrcGAtTgCoCommonBase mBase; -}; - -struct dCcD_SrcGObjInf { - /* 0x00 */ dCcD_SrcGObjAt mGObjAt; - /* 0x14 */ dCcD_SrcGObjTg mGObjTg; - /* 0x24 */ dCcD_SrcGObjCo mGObjCo; -}; - -class dCcD_GObjAt : public dCcD_GAtTgCoCommonBase { -private: - /* 0x1C */ dCcD_SrcGObjAt mSrc; - /* 0x30 */ mVec3_c mHitPos; - /* 0x3C */ mVec3_c mVec; - /* 0x48 */ mVec3_c mRVec; - /* 0x54 */ u8 field_0x4C[0x58 - 0x54]; - /* 0x58 */ u32 field_0x58; - -public: - dCcD_GObjAt(); - virtual ~dCcD_GObjAt(); - - void clearFlag() { - mSrc.field_0x04 = mSrc.field_0x04 & 0xFFFFFFFE; - } - mVec3_c *GetHitPosP() { - return &mHitPos; - } - void SetSomeVec(const mVec3_c &p) { - mVec = p; - } - mVec3_c *GetSomeVec() { - return &mVec; - } - void init(const dCcD_SrcGObjAt *); - void setSomeAtFlags(u32 flags); - void adjustHitPos(f32 dx, f32 dz); -}; - -class dCcD_GObjTg : public dCcD_GAtTgCoCommonBase { -private: - /* 0x1C */ dCcD_SrcGObjTg mSrc; - /* 0x2C */ u8 field_0x2C[0x38 - 0x2C]; - /* 0x38 */ mVec3_c mHitPos; - /* 0x44 */ u32 field_0x44; - /* 0x48 */ u16 field_0x48; - /* 0x4A */ u8 field_0x4A; - /* 0x4B */ u8 field_0x4B; - /* 0x4C */ u32 field_0x4C; - /* 0x50 */ u32 field_0x50; - /* 0x54 */ u32 field_0x54; - /* 0x58 */ u32 field_0x58; - /* 0x5C */ u8 field_0x5C[0x6C - 0x5C]; - /* 0x6C */ mVec3_c field_0x6C; - /* 0x78 */ u32 field_0x78; - -public: - dCcD_GObjTg(); - virtual ~dCcD_GObjTg(); - void clearFlag() { - mSrc.field_0x04 = mSrc.field_0x04 & 0xFFFFFFFE; - } - void setFlag(u32 f) { - mSrc.field_0x04 |= f; - } - void set0x4C(u32 val) { - field_0x4C = val; - } - void setSrcFlag(u32 flag) { - mSrc.base.mGFlag = flag; - } - void setSrc0x0A(u32 flag) { - mSrc.field_0x0A = flag; - } - u32 get0x58() { - return field_0x58; - } - void init(const dCcD_SrcGObjTg *); - void adjustHitPos(f32 dx, f32 dz); -}; - -class dCcD_GObjCo : public dCcD_GAtTgCoCommonBase { -private: - /* 0x1C */ dCcD_SrcGObjCo mSrc; - /* 0x20 */ u32 field_0x20; - /* 0x24 */ u16 field_0x24; - /* 0x28 */ u32 field_0x28; - -public: - dCcD_GObjCo(); - virtual ~dCcD_GObjCo(); - void clearFlag() { - mSrc.mBase.mGFlag = mSrc.mBase.mGFlag & 0xFFFFFFFE; - } - void setFlag(u32 f) { - mSrc.mBase.mGFlag |= f; - } - void init(const dCcD_SrcGObjCo *); - void setSomeAtFlags(u32 flags); - void adjustHitPos(f32 dx, f32 dz); - - void SetGFlag(u32 flag) { - mSrc.mBase.mGFlag = flag; - } -}; - -class dCcD_ShapeAttr { +// Capsule +class dCcD_Cps : public cCcD_Obj, public cCcD_CpsAttr { public: - /* 0x00 */ u8 UNK_0x00[0x18 - 0x00]; - /* 0x18 */ dCcD_DivideInfo field_0x18; - - dCcD_ShapeAttr(); + dCcD_Cps(); + virtual ~dCcD_Cps(); - /* vt 0x08 */ virtual ~dCcD_ShapeAttr(); - /* vt 0x0C */ virtual void dCcD_ShapeAttr_0x0C(); - /* vt 0x10 */ virtual void dCcD_ShapeAttr_0x10(); - /* vt 0x14 */ virtual void dCcD_ShapeAttr_0x14() = 0; - /* vt 0x18 */ virtual void dCcD_ShapeAttr_0x18() = 0; - /* vt 0x18 */ virtual void dCcD_ShapeAttr_0x1C() = 0; - /* vt 0x20 */ virtual void dCcD_ShapeAttr_0x20() = 0; - /* vt 0x24 */ virtual void dCcD_ShapeAttr_0x24() = 0; - /* vt 0x28 */ virtual void dCcD_ShapeAttr_0x28(); // 0x80329110 - /* vt 0x2C */ virtual void dCcD_ShapeAttr_0x2C() = 0; - /* vt 0x30 */ virtual void dCcD_ShapeAttr_0x30() = 0; - /* vt 0x34 */ virtual void dCcD_ShapeAttr_0x34() = 0; - /* vt 0x38 */ virtual void dCcD_ShapeAttr_0x38() = 0; - /* vt 0x3C */ virtual void dCcD_ShapeAttr_0x3C() = 0; - /* vt 0x40 */ virtual mVec3_c *getVirtualCenter(); // 0x80329120 - /* vt 0x44 */ virtual void dCcD_ShapeAttr_0x44() = 0; - /* vt 0x48 */ virtual void dCcD_ShapeAttr_0x48() = 0; - /* vt 0x4C */ virtual void getShapeAccess(); // 0x80329090 - /* vt 0x50 */ virtual void dCcD_ShapeAttr_0x50() = 0; - /* vt 0x54 */ virtual void dCcD_ShapeAttr_0x54(); // 0x803290F0 - /* vt 0x58 */ virtual void dCcD_ShapeAttr_0x58() = 0; + virtual cCcD_ShapeAttr *GetShapeAttr() override; - static mVec3_c m_virtual_center; + void Set(const dCcD_SrcCps &src); + void unknownCalc(); }; -// This is in dAcObjBase_c @ 0x1c0 -struct UnkCCDStruct { - u32 field_0x00; - u32 field_0x04; - u32 field_0x08; - u32 field_0x0C; - /* 0x10 */ mVec3_c field_0x10; - /* 0x1C */ mVec3_c field_0x1C; - /* 0x28 */ mVec3_c posIncrements; - dAcBase_c *field_0x34; - s32 field_0x38; - - UnkCCDStruct(dAcBase_c *); - - void postExecute(); - void reset(); - fBaseID_e getId(); - u32 getSomething(int); - - void setField0x38ToMagicValue() { - field_0x38 = 0xD; - } - - void setField0x38(s32 val) { - field_0x38 = val; - } +struct dCcD_SrcTri { + /* 0x00 */ cCcD_SrcGObj mObjInf; }; -// Object Info -class dCcD_GObjInf { -protected: - /* 0x000 */ dCcD_GObjAt mGObjAt; - /* 0x05C */ dCcD_GObjTg mGObjTg; - /* 0x0D8 */ dCcD_GObjCo mGObjCo; - /* 0x104 */ UnkCCDStruct *field_0x104; - /* 0x108 */ u32 field_0x108; - +class dCcD_Tri : public cCcD_Obj, public cCcD_TriAttr { public: - dCcD_GObjInf(); - /* vt 0x08 */ virtual ~dCcD_GObjInf(); - /* vt 0x0C */ virtual void *dCcD_GObjInf_0x0C() = 0; - /* vt 0x10 */ virtual void dCcD_GObjInf_0x10(); // 0x80328d30 - - void clear(); - void init(const dCcD_SrcGObjInf &src); - static bool weirdConditionCheck(dAcBase_c *ac, u32); - - inline void initUnk(UnkCCDStruct &src) { - field_0x104 = &src; - } - - inline void clearCoFlag() { - mGObjCo.clearFlag(); - } - - void setTgCoFlag(u32 f) { - mGObjTg.setFlag(f); - mGObjCo.setFlag(f); - } - - inline void setSomeDefendValue(u32 val) { - mGObjTg.set0x4C(val); - } - - inline void setAtVec(const mVec3_c &p) { - mGObjAt.SetSomeVec(p); - } - - inline void setTgFlag(u32 flag) { - mGObjTg.setSrcFlag(flag); - } - - inline mVec3_c *getAtVec() { - return mGObjAt.GetSomeVec(); - } - - bool someInteractCheck() { - return ((mGObjTg.getField0x14() & 1) != 0 && mGObjTg.getActor() != nullptr); - } - - void setTgField0x0A(u32 val) { - mGObjTg.setSrc0x0A(val); - } - - void ResetAtHit(); - void ResetTgHit(); - void ResetCoHit(); - - mVec3_c *GetAtHitPosP(); - mVec3_c *GetAtHitPosP2(); + dCcD_Tri(); + virtual ~dCcD_Tri(); - dAcBase_c *GetAtActor(); - bool CheckCollidedMask(u32 mask); - dAcBase_c *GetTgActor(); - dAcBase_c *GetCoActor(); + virtual cCcD_ShapeAttr *GetShapeAttr() override; - void adjustHitPos(f32 dx, f32 dz); + void Set(const dCcD_SrcTri &src); }; -struct dCcD_SrcCylAttr { -public: - /* 0x00 */ f32 mRadius; - /* 0x04 */ f32 mHeight; -}; // Size = 0x8 - -struct dCcD_SrcSphAttr { - /* 0x00 */ f32 mRadius; -}; // Size = 0x4 - -struct dCcD_SrcAabbAttr { - /* 0x00 */ f32 minX, minY, minZ, maxX, maxY, maxZ; -}; // Size = 0x18 - -struct dCcD_SrcUnk1Attr {}; - -class cM3dGUnk1 { -public: - /* 0x00 */ cM3dGCps mCps; - /* 0x28 */ mVec3_c mVirtualCenter; - cM3dGUnk1(); -}; - -class cM3dGUnk2 { -public: +struct dCcD_SrcCyl { + /* 0x00 */ cCcD_SrcGObj mObjInf; + /* 0x40 */ cCcD_SrcCylAttr mCylInf; }; -// Unk1 -class dCcD_ShapeAttr1 : public dCcD_ShapeAttr, public cM3dGUnk1 { +// Cylinder +class dCcD_Cyl : public cCcD_Obj, public cCcD_CylAttr { public: - dCcD_ShapeAttr1(); - - void init(const dCcD_SrcUnk1Attr &); + dCcD_Cyl(); + virtual ~dCcD_Cyl(); - /* vt 0x08 */ virtual ~dCcD_ShapeAttr1(); - /* vt 0x0C */ virtual void dCcD_ShapeAttr_0x0C() override; - /* vt 0x10 */ virtual void dCcD_ShapeAttr_0x10() override; - /* vt 0x14 */ virtual void dCcD_ShapeAttr_0x14() override; - /* vt 0x18 */ virtual void dCcD_ShapeAttr_0x18() override; - /* vt 0x18 */ virtual void dCcD_ShapeAttr_0x1C() override; - /* vt 0x20 */ virtual void dCcD_ShapeAttr_0x20() override; - /* vt 0x24 */ virtual void dCcD_ShapeAttr_0x24() override; - /* vt 0x28 */ virtual void dCcD_ShapeAttr_0x28() override; - /* vt 0x2C */ virtual void dCcD_ShapeAttr_0x2C() override; - /* vt 0x30 */ virtual void dCcD_ShapeAttr_0x30() override; - /* vt 0x34 */ virtual void dCcD_ShapeAttr_0x34() override; - /* vt 0x38 */ virtual void dCcD_ShapeAttr_0x38() override; - /* vt 0x3C */ virtual void dCcD_ShapeAttr_0x3C() override; - /* vt 0x40 */ virtual mVec3_c *getVirtualCenter() override; - /* vt 0x44 */ virtual void dCcD_ShapeAttr_0x44() override; - /* vt 0x48 */ virtual void dCcD_ShapeAttr_0x48() override; - /* vt 0x4C */ virtual void getShapeAccess() override; - /* vt 0x50 */ virtual void dCcD_ShapeAttr_0x50() override; - // /* vt 0x54 */ virtual void dCcD_ShapeAttr_0x54() override; - /* vt 0x58 */ virtual void dCcD_ShapeAttr_0x58() override; + virtual cCcD_ShapeAttr *GetShapeAttr() override; + void Set(const dCcD_SrcCyl &src); + void setCenter(const mVec3_c &); + void moveCenter(const mVec3_c &); }; -// Unk1 -class dCcD_ShapeAttr2 : public dCcD_ShapeAttr, public cM3dGUnk2 { -public: - dCcD_ShapeAttr2(); - - /* vt 0x08 */ virtual ~dCcD_ShapeAttr2(); - /* vt 0x0C */ virtual void dCcD_ShapeAttr_0x0C() override; - /* vt 0x10 */ virtual void dCcD_ShapeAttr_0x10() override; - /* vt 0x14 */ virtual void dCcD_ShapeAttr_0x14() override; - /* vt 0x18 */ virtual void dCcD_ShapeAttr_0x18() override; - /* vt 0x18 */ virtual void dCcD_ShapeAttr_0x1C() override; - /* vt 0x20 */ virtual void dCcD_ShapeAttr_0x20() override; - /* vt 0x24 */ virtual void dCcD_ShapeAttr_0x24() override; - /* vt 0x28 */ virtual void dCcD_ShapeAttr_0x28() override; - /* vt 0x2C */ virtual void dCcD_ShapeAttr_0x2C() override; - /* vt 0x30 */ virtual void dCcD_ShapeAttr_0x30() override; - /* vt 0x34 */ virtual void dCcD_ShapeAttr_0x34() override; - /* vt 0x38 */ virtual void dCcD_ShapeAttr_0x38() override; - /* vt 0x3C */ virtual void dCcD_ShapeAttr_0x3C() override; - // /* vt 0x40 */ virtual mVec3_c *getVirtualCenter() override; - /* vt 0x44 */ virtual void dCcD_ShapeAttr_0x44() override; - /* vt 0x48 */ virtual void dCcD_ShapeAttr_0x48() override; - /* vt 0x4C */ virtual void getShapeAccess() override; - /* vt 0x50 */ virtual void dCcD_ShapeAttr_0x50() override; - // /* vt 0x54 */ virtual void dCcD_ShapeAttr_0x54() override; - /* vt 0x58 */ virtual void dCcD_ShapeAttr_0x58() override; +struct dCcD_SrcSph { + /* 0x00 */ cCcD_SrcGObj mObjInf; + /* 0x40 */ cCcD_SrcSphAttr mSphInf; }; -// Aabb -class dCcD_ShapeAttr5 : public dCcD_ShapeAttr, public cM3dGUnk { +// Sphere +class dCcD_Sph : public cCcD_Obj, public cCcD_SphAttr { public: - dCcD_ShapeAttr5(); + dCcD_Sph(); + virtual ~dCcD_Sph(); - void init(const dCcD_SrcAabbAttr &); - - /* vt 0x08 */ virtual ~dCcD_ShapeAttr5(); - /* vt 0x0C */ virtual void dCcD_ShapeAttr_0x0C() override; - /* vt 0x10 */ virtual void dCcD_ShapeAttr_0x10() override; - /* vt 0x14 */ virtual void dCcD_ShapeAttr_0x14() override; - /* vt 0x18 */ virtual void dCcD_ShapeAttr_0x18() override; - /* vt 0x18 */ virtual void dCcD_ShapeAttr_0x1C() override; - /* vt 0x20 */ virtual void dCcD_ShapeAttr_0x20() override; - /* vt 0x24 */ virtual void dCcD_ShapeAttr_0x24() override; - /* vt 0x28 */ virtual void dCcD_ShapeAttr_0x28() override; - /* vt 0x2C */ virtual void dCcD_ShapeAttr_0x2C() override; - /* vt 0x30 */ virtual void dCcD_ShapeAttr_0x30() override; - /* vt 0x34 */ virtual void dCcD_ShapeAttr_0x34() override; - /* vt 0x38 */ virtual void dCcD_ShapeAttr_0x38() override; - /* vt 0x3C */ virtual void dCcD_ShapeAttr_0x3C() override; - /* vt 0x40 */ virtual mVec3_c *getVirtualCenter() override; - /* vt 0x44 */ virtual void dCcD_ShapeAttr_0x44() override; - /* vt 0x48 */ virtual void dCcD_ShapeAttr_0x48() override; - // /* vt 0x4C */ virtual void getShapeAccess() override; - /* vt 0x50 */ virtual void dCcD_ShapeAttr_0x50() override; - // /* vt 0x54 */ virtual void dCcD_ShapeAttr_0x54() override; - /* vt 0x58 */ virtual void dCcD_ShapeAttr_0x58() override; + virtual cCcD_ShapeAttr *GetShapeAttr() override; + void Set(const dCcD_SrcSph &src); + void setCenter(const mVec3_c &); + void moveCenter(const mVec3_c &); + void setCenterAndAtVec(const mVec3_c &, const mVec3_c &); }; -// Cyl -class dCcD_ShapeAttr3 : public dCcD_ShapeAttr, public cM3dGCyl { -public: - dCcD_ShapeAttr3(); - - void init(const dCcD_SrcCylAttr &); - - /* vt 0x08 */ virtual ~dCcD_ShapeAttr3(); - /* vt 0x0C */ virtual void dCcD_ShapeAttr_0x0C() override; - /* vt 0x10 */ virtual void dCcD_ShapeAttr_0x10() override; - /* vt 0x14 */ virtual void dCcD_ShapeAttr_0x14() override; - /* vt 0x18 */ virtual void dCcD_ShapeAttr_0x18() override; - /* vt 0x18 */ virtual void dCcD_ShapeAttr_0x1C() override; - /* vt 0x20 */ virtual void dCcD_ShapeAttr_0x20() override; - /* vt 0x24 */ virtual void dCcD_ShapeAttr_0x24() override; - /* vt 0x28 */ virtual void dCcD_ShapeAttr_0x28() override; - /* vt 0x2C */ virtual void dCcD_ShapeAttr_0x2C() override; - /* vt 0x30 */ virtual void dCcD_ShapeAttr_0x30() override; - /* vt 0x34 */ virtual void dCcD_ShapeAttr_0x34() override; - /* vt 0x38 */ virtual void dCcD_ShapeAttr_0x38() override; - /* vt 0x3C */ virtual void dCcD_ShapeAttr_0x3C() override; - /* vt 0x40 */ virtual mVec3_c *getVirtualCenter() override; - /* vt 0x44 */ virtual void dCcD_ShapeAttr_0x44() override; - /* vt 0x48 */ virtual void dCcD_ShapeAttr_0x48() override; - /* vt 0x4C */ virtual void getShapeAccess() override; - /* vt 0x50 */ virtual void dCcD_ShapeAttr_0x50() override; - // /* vt 0x54 */ virtual void dCcD_ShapeAttr_0x54() override; - /* vt 0x58 */ virtual void dCcD_ShapeAttr_0x58() override; +struct dCcD_SrcUnk { + /* 0x00 */ cCcD_SrcGObj mObjInf; + /* 0x40 */ cCcD_SrcUnkAttr mUnkInf; }; -// Sph -class dCcD_ShapeAttr4 : public dCcD_ShapeAttr, public cM3dGSph { +class dCcD_Unk : public cCcD_Obj, public cCcD_UnkAttr { public: - dCcD_ShapeAttr4(); + dCcD_Unk(); + virtual ~dCcD_Unk(); - void init(const dCcD_SrcSphAttr &); + virtual cCcD_ShapeAttr *GetShapeAttr() override; - /* vt 0x08 */ virtual ~dCcD_ShapeAttr4(); - /* vt 0x0C */ virtual void dCcD_ShapeAttr_0x0C() override; - /* vt 0x10 */ virtual void dCcD_ShapeAttr_0x10() override; - /* vt 0x14 */ virtual void dCcD_ShapeAttr_0x14() override; - /* vt 0x18 */ virtual void dCcD_ShapeAttr_0x18() override; - /* vt 0x18 */ virtual void dCcD_ShapeAttr_0x1C() override; - /* vt 0x20 */ virtual void dCcD_ShapeAttr_0x20() override; - /* vt 0x24 */ virtual void dCcD_ShapeAttr_0x24() override; - /* vt 0x28 */ virtual void dCcD_ShapeAttr_0x28() override; - /* vt 0x2C */ virtual void dCcD_ShapeAttr_0x2C() override; - /* vt 0x30 */ virtual void dCcD_ShapeAttr_0x30() override; - /* vt 0x34 */ virtual void dCcD_ShapeAttr_0x34() override; - /* vt 0x38 */ virtual void dCcD_ShapeAttr_0x38() override; - /* vt 0x3C */ virtual void dCcD_ShapeAttr_0x3C() override; - /* vt 0x40 */ virtual mVec3_c *getVirtualCenter() override; - /* vt 0x44 */ virtual void dCcD_ShapeAttr_0x44() override; - /* vt 0x48 */ virtual void dCcD_ShapeAttr_0x48() override; - /* vt 0x4C */ virtual void getShapeAccess() override; - /* vt 0x50 */ virtual void dCcD_ShapeAttr_0x50() override; - /* vt 0x54 */ virtual void dCcD_ShapeAttr_0x54() override; - /* vt 0x58 */ virtual void dCcD_ShapeAttr_0x58() override; + void Set(const dCcD_SrcUnk &src); }; #endif diff --git a/include/d/col/cc/d_cc_mass_s.h b/include/d/col/cc/d_cc_mass_s.h new file mode 100644 index 00000000..d6c7db55 --- /dev/null +++ b/include/d/col/cc/d_cc_mass_s.h @@ -0,0 +1,104 @@ + +#include "common.h" +#include "d/a/obj/d_a_obj_base.h" +#include "d/col/c/c_cc_d.h" +#include "m/m_vec.h" + +typedef void (*dCcMassS_ObjCallback)(dAcObjBase_c *, mVec3_c *, u32); + +class dCcMassS_Obj { +private: + /* 0x00 */ cCcD_Obj *mpObj; + /* 0x04 */ u8 mPriority; + /* 0x08 */ dCcMassS_ObjCallback mpCallback; + /* 0x0C */ cCcD_DivideInfo mDivideInfo; + /* 0x1C vtable*/ + +public: + dCcMassS_Obj(); + virtual ~dCcMassS_Obj(); + void Set(cCcD_Obj *p_obj, u8 priority, dCcMassS_ObjCallback callback); + void Clear(); + + cCcD_Obj *GetObj() { + return mpObj; + } + u8 GetPriority() const { + return mPriority; + } + dCcMassS_ObjCallback GetCallback() const { + return mpCallback; + } + cCcD_DivideInfo &GetDivideInfo() { + return mDivideInfo; + } +}; + +class dCcMassS_HitInf { +private: + /* 0x00 */ cCcD_Obj *mpArea; + /* 0x04 */ cCcD_Obj *mpAtObj; + /* 0x08 */ cCcD_Obj *mpCoObj; + /* 0x0C */ f32 mCoHitLen; + /* 0x10 vtable */ +public: + dCcMassS_HitInf(); + virtual ~dCcMassS_HitInf(); + + void ClearPointer(); + void SetAreaHitObj(cCcD_Obj *obj) { + mpArea = obj; + } + void SetCoHitObj(cCcD_Obj *obj) { + mpCoObj = obj; + } + void SetAtHitObj(cCcD_Obj *obj) { + mpAtObj = obj; + } + void SetCoHitLen(f32 len) { + mCoHitLen = len; + } + cCcD_Obj *GetAtHitObj() const { + return mpAtObj; + } +}; + +class dCcMassS_Mng { +public: + /* 0x0000 */ cCcD_DivideArea mDivideArea; + /* 0x0040 */ s32 mMassObjCount; + /* 0x0044 */ dCcMassS_Obj mMassObjs[20]; + /* 0x02C4 */ s32 mMassAreaCount; + /* 0x02C8 */ dCcMassS_Obj mMassAreas[5]; + /* 0x0368 */ cCcD_CylAttr mCylAttr; + /* 0x03A8 */ u8 field_0x3A8; + /* 0x03A9 */ u8 field_0x3A9; + /* 0x03AA */ u8 field_0x3AA; + /* 0x03AB */ u8 mResultCam; + /* 0x03AC */ Vec mCamTopPos; + /* 0x03B8 */ f32 mCamTopDist; + /* 0x03BC */ Vec mCamBottomPos; + /* 0x03C8 */ f32 mCamBottomDist; + /* 0x03CC */ cCcD_CpsAttr mCpsAttr; + /* 0x042C */ cCcD_DivideInfo mDivideInfo; + /* 0x043C vtable */ + +public: + dCcMassS_Mng(); + virtual ~dCcMassS_Mng(); + + void Ct(); + + void SetAttr(f32 radius, f32 height, u8 param_2, u8 param_3); + void Prepare(); + u32 Chk(mVec3_c *p_xyz, dAcObjBase_c **p_actor, dCcMassS_HitInf *p_hitInf); + void Clear(); + + // Not original names, but made distinct for clarity (original was just one `Set) + void SetObj(cCcD_Obj *p_obj, u8 priority); + void SetArea(cCcD_Obj *p_obj, u8 priority, dCcMassS_ObjCallback callback); + + // void SetCam(cM3dGCps const &cps); + // u8 GetResultCam() const; + // void GetCamTopPos(Vec *p_out); +}; diff --git a/include/d/col/cc/d_cc_mgr.h b/include/d/col/cc/d_cc_mgr.h deleted file mode 100644 index 97fd9cfb..00000000 --- a/include/d/col/cc/d_cc_mgr.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef TOSORT_D_CC_MGR_H -#define TOSORT_D_CC_MGR_H - -#include "d/col/cc/d_cc_d.h" - -class ColliderManager { -public: - static ColliderManager *getColliderManager(); - - void addCollider(dCcD_GObjInf *collider); -}; - -#endif diff --git a/include/d/col/cc/d_cc_s.h b/include/d/col/cc/d_cc_s.h new file mode 100644 index 00000000..7b9096a7 --- /dev/null +++ b/include/d/col/cc/d_cc_s.h @@ -0,0 +1,78 @@ +#include "common.h" +#include "d/col/c/c_cc_d.h" +#include "d/col/cc/d_cc_mass_s.h" +#include "m/m_angle.h" +#include "m/m_mtx.h" +#include "m/m_vec.h" + +struct mMtxPair { + mMtx_c mMtx; + mMtx_c mInv; +}; + +class dCcS { +private: + /* 0x0000 */ cCcD_Obj *mpObjAt[0x200]; + /* 0x0800 */ cCcD_Obj *mpObjTg[0x300]; + /* 0x1400 */ cCcD_Obj *mpObjCo[0x200]; + /* 0x1c00 */ cCcD_Obj *mpObj[0x340]; + /* 0x2900 */ UNKTYPE *mpUnk[0x100]; + /* 0x2D00 */ u16 mObjAtCount; + /* 0x2d02 */ u16 mObjTgCount; + /* 0x2D04 */ u16 mObjCoCount; + /* 0x2D06 */ u16 mObjCount; + /* 0x2D08 */ u32 mUnkCount; + /* 0x2D0C */ cCcD_DivideArea mDivideArea; + /* 0x2D4C */ bool mbAreaSet; + /* 0x2D50 */ mMtxPair mAreas[16]; // could be a structure? + /* 0x3350 */ int mAreaCount; + /* 0x3354*/ dCcMassS_Mng mMassMng; + +public: + dCcS(); + virtual ~dCcS(); + + // This is a remnant of cCcS, which dCcS::Ct calls. Idk the correct layout + void Ct_cCcS(); + + void Ct(); + void Dt(); + + static bool ChkRemoveActor(dAcObjBase_c *pActor); + static bool ChkNoHitAtTg(cCcD_Obj *, cCcD_Obj *); + static bool ChkAtTgCommonHitInf(cCcD_Obj *, cCcD_Obj *); + void ChkAtTg(); + + static bool ChkNoHitCo(cCcD_Obj *, cCcD_Obj *); + static void SetCoCommonHitInf(cCcD_Obj *, mVec3_c *, cCcD_Obj *, mVec3_c *, f32); + void ChkCo(); + + static bool ChkSheildFrontRange(cCcD_Obj *, cCcD_Obj *); + static bool ChkShield(cCcD_Obj *, cCcD_Obj *, cCcD_ShieldChkCallback *); + static bool ChkAtTgHitAfterCross(bool, bool, cCcD_Obj *, cCcD_Obj *); + static void SetCoObjInf(bool, bool, cCcD_Obj *, cCcD_Obj *); + static void SetPosCorrect(cCcD_Obj *, mVec3_c *, cCcD_Obj *, mVec3_c *, f32); + static void CalcParticleAngle(cCcD_Obj *, cCcD_Obj *, mAng3_c *, bool); + static void fn_80356fd0(mVec3_c *, cCcD_Obj *, cCcD_Obj *); + static u32 ProcAtTgHitmark(cCcD_Obj *, cCcD_Obj *, mVec3_c *, u32, mVec3_c *); + static void SetAtTgObjInf(bool, bool, cCcD_Obj *, cCcD_Obj *, mVec3_c *, bool); + + bool ChkCamera(mVec3_c &, mVec3_c &, dAcObjBase_c *, dAcObjBase_c *, dAcObjBase_c *, f32); + bool + ChkCameraPoint(const mVec3_c &, const mVec3_c &, mVec3_c &, dAcObjBase_c *, dAcObjBase_c *, dAcObjBase_c *, f32); + + bool ChkCo(const mVec3_c &, dAcObjBase_c *); + bool fn_80357c90(const mVec3_c &, const mVec3_c &, u32, UNKTYPE **); + void Set(cCcD_Obj *); + void MoveAfterCheck(); + void RemoveDeadObj(); + void CalcArea(); + void Move(); + void MassClear(); + void SetArea(mMtx_c *); + void ClearArea(); + void AdjustHitPos(); + + static dCcS *GetInstance(); + static dCcS *sInstance; +}; diff --git a/include/d/col/cc/d_cc_shape_colliders.h b/include/d/col/cc/d_cc_shape_colliders.h deleted file mode 100644 index 44b085b8..00000000 --- a/include/d/col/cc/d_cc_shape_colliders.h +++ /dev/null @@ -1,89 +0,0 @@ -#ifndef D_CC_SHAPE_COLLIDERS_H -#define D_CC_SHAPE_COLLIDERS_H - -#include "d/col/cc/d_cc_d.h" -#include "m/m_vec.h" - -struct dCcD_SrcUnk { - /* 0x00 */ dCcD_SrcGObjInf mObjInf; - /* 0x44 */ dCcD_SrcUnk1Attr mUnk1Inf; -}; // Size: ??? - -class dCcD_Unk1 : public dCcD_GObjInf, public dCcD_ShapeAttr1 { -public: - dCcD_Unk1(); - virtual ~dCcD_Unk1(); - - virtual void *dCcD_GObjInf_0x0C() override; - - void init(const dCcD_SrcUnk &src); - void unknownCalc(); -}; - -struct dCcD_SrcEmpty { - /* 0x00 */ dCcD_SrcGObjInf mObjInf; -}; // Size: 0x40 - -// Not sure what this is, the init function -// doesn't call the shape initializer -class dCcD_Empty : public dCcD_GObjInf, public dCcD_ShapeAttr2 { -public: - dCcD_Empty(); - virtual ~dCcD_Empty(); - - virtual void *dCcD_GObjInf_0x0C() override; - - void init(const dCcD_SrcEmpty &src); -}; - -struct dCcD_SrcCyl { - /* 0x00 */ dCcD_SrcGObjInf mObjInf; - /* 0x40 */ dCcD_SrcCylAttr mCylAttr; -}; // Size: 0x44 - -// Cylinder -class dCcD_Cyl : public dCcD_GObjInf, public dCcD_ShapeAttr3 { -public: - dCcD_Cyl(); - virtual ~dCcD_Cyl(); - - virtual void *dCcD_GObjInf_0x0C() override; - void init(const dCcD_SrcCyl &src); - void setCenter(const mVec3_c &); - void moveCenter(const mVec3_c &); -}; - -struct dCcD_SrcSph { - /* 0x00 */ dCcD_SrcGObjInf mObjInf; - /* 0x40 */ dCcD_SrcSphAttr mSphAttr; -}; // Size: 0x44 - -// Sphere -class dCcD_Sph : public dCcD_GObjInf, public dCcD_ShapeAttr4 { -public: - dCcD_Sph(); - virtual ~dCcD_Sph(); - - virtual void *dCcD_GObjInf_0x0C() override; - void init(const dCcD_SrcSph &src); - void setCenter(const mVec3_c &); - void moveCenter(const mVec3_c &); - void setCenterAndAtVec(const mVec3_c &, const mVec3_c &); -}; - -struct dCcD_SrcAabb { - /* 0x00 */ dCcD_SrcGObjInf mObjInf; - /* 0x40 */ dCcD_SrcAabbAttr mAabbAttr; -}; // Size: 0x58 - -class dCcD_Aabb : public dCcD_GObjInf, public dCcD_ShapeAttr5 { -public: - dCcD_Aabb(); - virtual ~dCcD_Aabb(); - - virtual void *dCcD_GObjInf_0x0C() override; - - void init(const dCcD_SrcAabb &src); -}; - -#endif diff --git a/include/d/d_shadow.h b/include/d/d_shadow.h new file mode 100644 index 00000000..e30b8f2c --- /dev/null +++ b/include/d/d_shadow.h @@ -0,0 +1,9 @@ +#include "m/m3d/m_shadow.h" + +// This is unofficial, idk if this is close, but this is a common shadow extension. +// +class dShadowCircle_c : public m3d::mShadowCircle_c { +public: + dShadowCircle_c() {} + virtual ~dShadowCircle_c() {} +}; diff --git a/include/d/t/d_t_reaction.h b/include/d/t/d_t_reaction.h index 5c2d344e..5c307d2e 100644 --- a/include/d/t/d_t_reaction.h +++ b/include/d/t/d_t_reaction.h @@ -2,7 +2,7 @@ #define D_T_REACTION_H #include "d/a/obj/d_a_obj_base.h" -#include "d/col/cc/d_cc_shape_colliders.h" +#include "d/col/cc/d_cc_d.h" #include "s/s_State.hpp" #include "s/s_StateMgr.hpp" #include "toBeSorted/dowsing_target.h" @@ -36,7 +36,7 @@ class dTgReaction_c : public dAcObjBase_c { return params & 0xFF; } - int getParam0x08() { + u32 getParam0x08() { return (params >> 8) & 0xFF; } diff --git a/include/egg/math/eggMath.h b/include/egg/math/eggMath.h index 32023ac6..ddab706a 100644 --- a/include/egg/math/eggMath.h +++ b/include/egg/math/eggMath.h @@ -2,6 +2,7 @@ #define EGG_MATH_H #include "common.h" +#include "math.h" namespace EGG { diff --git a/include/egg/math/eggMatrix.h b/include/egg/math/eggMatrix.h index c2eb2958..89060283 100644 --- a/include/egg/math/eggMatrix.h +++ b/include/egg/math/eggMatrix.h @@ -5,7 +5,6 @@ #include "egg/math/eggQuat.h" #include "egg/math/eggVector.h" - namespace EGG { struct Matrix34f { diff --git a/include/m/m_angle.h b/include/m/m_angle.h index 8a8450c3..2123277b 100644 --- a/include/m/m_angle.h +++ b/include/m/m_angle.h @@ -1,6 +1,7 @@ #ifndef M_ANGLE_H #define M_ANGLE_H +#include "c/c_math.h" #include "common.h" #include "nw4r/math/math_triangular.h" @@ -9,6 +10,10 @@ struct mAng { mAng(s16 s) : mVal(s) {} mAng(const mAng &other) : mVal(other.mVal) {} + static mAng atan2s(f32 a, f32 b) { + return mAng(cM::atan2s(a, b)); + } + operator s16() const { return mVal; } @@ -25,6 +30,10 @@ struct mAng { mVal += other.mVal; return *this; } + mAng &operator-=(const mAng &other) { + mVal -= other.mVal; + return *this; + } s32 step(s16 target, s32 steps, s16 max, s16 min); diff --git a/include/m/m_mtx.h b/include/m/m_mtx.h index 4288a796..dd4cdf57 100644 --- a/include/m/m_mtx.h +++ b/include/m/m_mtx.h @@ -7,9 +7,9 @@ #include "egg/math/eggMatrix.h" #include "m/m_angle.h" #include "m/m_vec.h" -#include "nw4r/nw4r_types.h" +#include "nw4r/types_nw4r.h" -class mMtx_c { +class mMtx_c : public EGG::Matrix34f { typedef f32 (*MtxRef)[4]; typedef const f32 (*MtxRefConst)[4]; @@ -17,16 +17,6 @@ class mMtx_c { mMtx_c(){}; mMtx_c(f32 xx, f32 xy, f32 xz, f32 xw, f32 yx, f32 yy, f32 yz, f32 yw, f32 zx, f32 zy, f32 zz, f32 zw); - // not sure if this breaks anything but we need a matrix type - // with an inline copy assignment operator - void set(const mMtx_c &r) { - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 4; j++) { - m[i][j] = r.m[i][j]; - } - } - } - operator MtxRef() { return (MtxRef)(this); } @@ -36,15 +26,9 @@ class mMtx_c { operator nw4r::math::MTX34 *() { return (nw4r::math::MTX34 *)(this); } - operator EGG::Matrix34f *() { - return (EGG::Matrix34f *)(this); - } operator nw4r::math::MTX34 &() { return *(nw4r::math::MTX34 *)(this); } - operator EGG::Matrix34f &() { - return *(EGG::Matrix34f *)(this); - } void XrotS(const mAng &angle); ///< Generates a rotation matrix for the X axis with the given angle. void XrotM(const mAng &angle); ///< Rotates the matrix on the X axis by the given angle. @@ -53,15 +37,23 @@ class mMtx_c { void ZrotS(const mAng &angle); ///< Generates a rotation matrix for the Z axis with the given angle. void ZrotM(const mAng &angle); ///< Rotates the matrix on the Z axis by the given angle. - void ZXYrotS(mAng xRot, mAng yRot, - mAng zRot); ///< Generates the matrix on the Y, X and Z axes by the given angles. - void ZXYrotM(mAng xRot, mAng yRot, - mAng zRot); ///< Rotates the matrix on the Y, X and Z axes by the given angles. - void XYZrotS(mAng xRot, mAng yRot, - mAng zRot); ///< Generates the matrix on the Z, Y and X axes by the given angles. - - void XYZrotM(mAng xRot, mAng yRot, - mAng zRot); ///< Rotates the matrix on the Z, Y and X axes by the given angles. + void ZXYrotS( + const mAng &xRot, const mAng &yRot, + const mAng &zRot + ); ///< Generates the matrix on the Y, X and Z axes by the given angles. + void ZXYrotM( + const mAng &xRot, const mAng &yRot, + const mAng &zRot + ); ///< Rotates the matrix on the Y, X and Z axes by the given angles. + void XYZrotS( + const mAng &xRot, const mAng &yRot, + const mAng &zRot + ); ///< Generates the matrix on the Z, Y and X axes by the given angles. + + void XYZrotM( + const mAng &xRot, const mAng &yRot, + const mAng &zRot + ); ///< Rotates the matrix on the Z, Y and X axes by the given angles. void toRot(mAng3_c &out) const; ///< Converts the matrix to a rotation vector. @@ -71,22 +63,6 @@ class mMtx_c { void rot(int, int); // does some werrd operation to rotate the matrix bool quatRelated(); - void SetTranslation(const mVec3_c &t) { - m[0][3] = t.x; - m[1][3] = t.y; - m[2][3] = t.z; - } - -public: - union { - f32 m[3][4]; - struct { - f32 xx, xy, xz, xw; - f32 yx, yy, yz, yw; - f32 zx, zy, zz, zw; - }; - }; - public: static mMtx_c Identity; }; diff --git a/include/m/m_vec.h b/include/m/m_vec.h index 4d6e2db1..f9bf3c48 100644 --- a/include/m/m_vec.h +++ b/include/m/m_vec.h @@ -1,9 +1,13 @@ #ifndef M_VEC_H #define M_VEC_H +#include "c/c_math.h" #include "common.h" #include "egg/math/eggVector.h" #include "m/m_angle.h" +#include "nw4r/types_nw4r.h" + +class mAng; class mVec3_c : public EGG::Vector3f { public: @@ -148,6 +152,12 @@ class mVec3_c : public EGG::Vector3f { return *this; } + mVec3_c operator-(f32 f) const { + return mVec3_c(x - f, y - f, z - f); + } + mVec3_c operator+(f32 f) const { + return mVec3_c(x + f, y + f, z + f); + } mVec3_c &operator-=(f32 f) { x -= f; y -= f; @@ -207,6 +217,17 @@ class mVec3_c : public EGG::Vector3f { void rotY(const mAng &angle); + // ??? + s32 getAngleY() const { + return mAng(cM::atan2s(x, z)); + } + + void CopyTo(nw4r::math::VEC3 *p) { + p->x = x; + p->y = y; + p->z = z; + } + static mVec3_c Zero; static mVec3_c Ex; static mVec3_c Ey; diff --git a/include/nw4r/math/math_arithmetic.h b/include/nw4r/math/math_arithmetic.h index e6ce14d3..b18941f2 100644 --- a/include/nw4r/math/math_arithmetic.h +++ b/include/nw4r/math/math_arithmetic.h @@ -1,5 +1,6 @@ #ifndef NW4R_MATH_ARITHMETIC_H #define NW4R_MATH_ARITHMETIC_H + #include "math.h" #include "nw4r/types_nw4r.h" // IWYU pragma: export #include "rvl/OS.h" // IWYU pragma: export diff --git a/include/nw4r/nw4r_types.h b/include/nw4r/nw4r_types.h deleted file mode 100644 index 5d666e6f..00000000 --- a/include/nw4r/nw4r_types.h +++ /dev/null @@ -1,189 +0,0 @@ -#ifndef NW4R_TYPES_H -#define NW4R_TYPES_H - -namespace nw4r { -namespace ut { -template -struct TextWriterBase; -template -struct TagProcessorBase; - -struct Color; -struct FileStream; - -namespace detail { -struct RuntimeTypeInfo; -} -} // namespace ut - -namespace ef { -struct DrawOrder; -struct DrawInfo; -struct DrawStrategy; -struct DrawStrategyImpl; -struct DrawStrategyBuilder; -struct Effect; -struct EffectSystem; -struct EffectProject; -struct Emitter; -struct EmitterDrawSetting; -struct EmitFormBuilder; -struct ResEmitter; -struct EmitterResource; -struct EmitterForm; -struct EmitterInheritSetting; -struct Particle; -struct ParticleManager; -struct MemoryManager; -struct MemoryManagerBase; -} // namespace ef - -namespace math { -class VEC2; -class VEC3; -class MTX33; -class MTX34; -class AABB; -class FRUSTUM; -} // namespace math - -namespace snd { -struct FxBase; -struct SoundPlayer; -struct SoundHandle; -struct SeqSoundHandle; -struct SoundArchive; -struct SoundArchivePlayer; -struct Sound3DActor; -struct Sound3DListener; -struct Sound3DManager; -struct SoundHandle; -struct StrmSoundHandle; -struct WaveSoundHandle; - -namespace detail { -struct BasicSound; -struct BasicPlayer; -struct ChannelManager; -struct SeqSound; -struct SeqPlayer; -struct MmlParser; -struct MmlSeqTrack; -struct SeqTrack; -struct SeqTrackAllocator; -template -struct SoundInstanceManager; -struct StrmBufferPool; -struct StrmSound; -struct NoteOnCallback; -struct PlayerHeap; -struct SoundArchiveFileReader; -struct SoundThread; -struct WaveSound; -struct StrmPlayer; -struct WsdPlayer; -} // namespace detail -} // namespace snd - -namespace g3d { -struct AnmObjVis; -struct AnmObjVisNode; -struct AnmObjVisOR; -struct AnmObjVisRes; -struct AnmObj; -struct AnmObjChr; -struct FuncObjCalcWorld; -struct AnmScn; -struct AnmScnRes; -struct CameraAnmResult; -struct Draw1Mat1ShpSwap; -struct DrawResMdlReplacement; -struct FogAnmResult; -struct ResFile; -struct ResMdl; -struct ResPltt; -struct ResTex; -struct ResTexSrt; -struct ResMat; -struct ResTexPlttInfo; -struct ResShp; -struct ResFog; -struct ResAnmChr; -struct ResAnmVis; -struct ResAnmClr; -struct ResAnmTexPat; -struct ResAnmTexSrt; -struct ResAnmShp; -struct ResAnmScn; -struct ResAnmFog; -struct ResAnmCamera; -struct ResVtxPos; -struct ResVtxNrm; -struct ResVtxClr; -struct ResVtxTexCoord; -struct ClrAnmResult; -struct TexPatAnmResult; -struct TexSrtAnmResult; -struct ScnMdl1Mat1Shp; -struct TexSrt; -struct TexSrtTypedef; -struct LightObj; -struct LightAnmResult; -struct LightSet; -struct LightSetting; -struct LightSetData; -struct AmbLightObj; -struct AmbLightAnmResult; -struct Fog; -struct ScnRoot; -struct ScnProc; -struct ScnLeaf; -struct ScnObj; -struct ScnRfl; -struct ScnGroup; -struct ScnMdlSimple; -struct ScnMdl; -struct IScnObjGather; -struct IScnObjCallback; - -namespace G3DState { -struct IndMtxOp; -} -} // namespace g3d - -namespace lyt { -struct Size; - -namespace detail { -struct PaneBase; -struct TexCoordAry; -} // namespace detail - -namespace res { -struct Group; -struct Pane; -struct Bounding; -struct AnimationBlock; -struct BinaryFileHeader; -} // namespace res - -struct Group; -struct GroupContainer; -struct Pane; -struct DrawInfo; -struct AnimResource; -struct AnimTransform; -struct AnimTransformBasic; -struct AnimationLink; -struct ResourceAccessor; -struct ArcResourceAccessor; -struct FontRefLink; -struct Material; -struct Layout; -struct Bounding; -struct ResBlockSet; -struct TexMap; -} // namespace lyt -} // namespace nw4r - -#endif diff --git a/include/nw4r/types_nw4r.h b/include/nw4r/types_nw4r.h index f9a31cf2..4123a7f3 100644 --- a/include/nw4r/types_nw4r.h +++ b/include/nw4r/types_nw4r.h @@ -1,5 +1,6 @@ #ifndef NW4R_TYPES_H #define NW4R_TYPES_H + #include "common.h" #define NW4R_BYTEORDER_BIG 0xFEFF diff --git a/include/rvl/OS/OSError.h b/include/rvl/OS/OSError.h index f26db27e..d3150d68 100644 --- a/include/rvl/OS/OSError.h +++ b/include/rvl/OS/OSError.h @@ -1,14 +1,16 @@ #ifndef RVL_SDK_OS_ERROR_H #define RVL_SDK_OS_ERROR_H + #include "__va_arg.h" #include "common.h" + #ifdef __cplusplus extern "C" { #endif // Forward declarations -typedef struct OSContext; +typedef struct OSContext OSContext; #define OSError(...) OSPanic(__FILE__, __LINE__, __VA_ARGS__) #define OSAssert(exp, ...) \ diff --git a/include/s/s_State.hpp b/include/s/s_State.hpp index b407ec4b..76339e3a 100644 --- a/include/s/s_State.hpp +++ b/include/s/s_State.hpp @@ -25,10 +25,8 @@ mStateMgr.getStateID(); \ } -#define UI_STATE_MGR_DECLARE(class_name) \ - sFStateMgr_c mStateMgr; +#define UI_STATE_MGR_DECLARE(class_name) sFStateMgr_c mStateMgr; -#define STATE_MGR(class_name) \ - sFStateMgr_c +#define STATE_MGR(class_name) sFStateMgr_c #endif diff --git a/include/toBeSorted/effects_struct.h b/include/toBeSorted/effects_struct.h index c920f961..847d6e69 100644 --- a/include/toBeSorted/effects_struct.h +++ b/include/toBeSorted/effects_struct.h @@ -18,6 +18,8 @@ class EffectsStruct { mpOwner = owner; } + void remove(bool); + private: u8 field_0x20[0x28 - 0x20]; /* 0x28 */ dBase_c *mpOwner; diff --git a/src/REL/d/a/d_a_bombf.cpp b/src/REL/d/a/d_a_bombf.cpp index 0f9ad7c4..609c3eef 100644 --- a/src/REL/d/a/d_a_bombf.cpp +++ b/src/REL/d/a/d_a_bombf.cpp @@ -1,9 +1,226 @@ #include "d/a/d_a_bombf.h" +#include "common.h" +#include "d/a/d_a_player.h" +#include "d/col/bg/d_bg_s.h" +#include "d/col/bg/d_bg_s_lin_chk.h" +#include "d/flag/sceneflag_manager.h" +#include "m/m_mtx.h" +#include "m/m_vec.h" +#include "toBeSorted/time_area_mgr.h" + SPECIAL_ACTOR_PROFILE(BOMBF, dAcBombf_c, fProfile::BOMBF, 0x129, 0, 4099); STATE_DEFINE(dAcBombf_c, Wait); +bool dAcBombf_c::createHeap() { + nw4r::g3d::ResFile resFile = getOarcResFile("FlowerBomb"); + nw4r::g3d::ResMdl resMdl = resFile.GetResMdl("LeafBomb"); + return mModel.create(resMdl, &heap_allocator, 0x120, 1, nullptr); +} + +int dAcBombf_c::actorCreate() { + mDespawnSceneFlag = (params >> 8) & 0xFF; + field_0x3D4 = (params >> 16) & 0xF; + if (SceneflagManager::sInstance->checkBoolFlag(roomid, mDespawnSceneFlag)) { + return FAILED; + } + + CREATE_ALLOCATOR(dAcBombf_c); + + field_0x3D2 = (params >> 4) & 0xF; + field_0x3D0 = field_0x3D2 == 1; + if (field_0x3D0) { + mModel.setPriorityDraw(0x82, 0x7F); + } + + mStts.SetDefaultRank(); + forwardAccel = -2.0f; + forwardMaxSpeed = -80.0f; + mStateMgr.changeState(StateID_Wait); + boundingBox.Set(mVec3_c(-80.0, -50.0f, -80.0f), mVec3_c(80.0, 60.0f, 80.0f)); + angle = rotation; + if (mDespawnSceneFlag < 0xFF) { + actor_properties = (actor_properties & ~1) | 4; + } + + return SUCCEEDED; +} + +int dAcBombf_c::actorPostCreate() { + // Preamble problem + mMtx_c mtx; + mtx.ZXYrotS(rotation.x, rotation.y, rotation.z); + mVec3_c v; + PSMTXMultVecSR(mtx, mVec3_c::Ey, v); + mVec3_c v3 = position + v * 10.0f; + mVec3_c v4 = position - v * 10.0f; + + if (dBgS_ObjLinChk::LineCross(&v3, &v4, this)) { + position = dBgS_ObjLinChk::GetInstance().GetLinEnd(); + if (rotation.x == 0 && rotation.z == 0 && dBgS_ObjLinChk::ChkGround()) { + cM3dGPla pla; + dBgS::GetInstance()->GetTriPla(dBgS_ObjLinChk::GetInstance(), &pla); + rotation.x = pla.GetAngle(rotation.y); + rotation.z = pla.GetAngle(rotation.y - 0x4000); + } + + if (dBgS::GetInstance()->ChkMoveBG(dBgS_ObjLinChk::GetInstance(), false)) { + field_0x398.SetPolyInfo(dBgS_ObjLinChk::GetInstance()); + actor_properties = (actor_properties & ~1) | 4; + } + mLightingInfo.mLightingCode = dBgS::GetInstance()->GetLightingCode(dBgS_ObjLinChk::GetInstance()); + } + + if (field_0x3D2 == 0 || field_0x3D2 == 2) { + bool b = dTimeAreaMgr_c::sInstance->fn_800B9B60(roomid, position); + if (b) { + mTimeAreaStruct.field_0x00 = 1.0f; + } + if ((b && field_0x3D2 == 2) || (!b && field_0x3D2 == 0)) { + mModel.setScale(0.0001f, 0.0001f, 0.0001f); + if (mBombRef.get() != nullptr) { + mBombRef.get()->mField_0xA50 = 0.0001f; + } + } + } + + updateMatrix(); + mModel.setLocalMtx(mWorldMtx); + regrowBomb(); + if (mBombRef.get() != nullptr) { + mBombRef.get()->mScale.set(0.95f, 0.95f, 0.95f); + } + + return SUCCEEDED; +} + +int dAcBombf_c::doDelete() { + return SUCCEEDED; +} + +int dAcBombf_c::actorExecute() { + if (field_0x3D3 != 0) { + mMtx_c &mtx = mWorldMtx; + mtx.getTranslation(position); + dAcBomb_c *bomb = mBombRef.get(); + if (bomb != nullptr) { + bomb->setTransformFromFlower(mtx); + } + mModel.setLocalMtx(mWorldMtx); + poscopy2 = position; + poscopy3 = position; + field_0x3D3 = 0; + } else { + if (dBgS::GetInstance()->ChkMoveBG(field_0x398, true)) { + dBgS::GetInstance()->MoveBgTransPos(field_0x398, true, &position, &angle, &rotation); + updateMatrix(); + dAcBomb_c *bomb = mBombRef.get(); + if (bomb != nullptr) { + bomb->setTransformFromFlower(mWorldMtx); + } + mModel.setLocalMtx(mWorldMtx); + poscopy2 = position; + poscopy3 = position; + } + } + + mStateMgr.executeState(); + return SUCCEEDED; +} + +int dAcBombf_c::draw() { + if (field_0x3D0 != 0 && (dAcPy_c::LINK->mActionFlagsCont & 0x400000) == 0) { + return SUCCEEDED; + } + drawModelType1(&mModel); + return SUCCEEDED; +} + +void dAcBombf_c::regrowBomb() { + // These params are hell + s8 viewclip_idx = (actor_properties & 1) != 0 ? viewclip_index : -1; + u32 actorParams1; + actorParams1 = 1; + if (field_0x3D0) { + actorParams1 = 2; + } + dAcObjBase_c *ac = dAcObjBase_c::create( + "Bomb", roomid, actorParams1, &position, nullptr, nullptr, 0xFFFFFFFF, 0xFFFF, viewclip_idx + ); + mBombRef.link(static_cast(ac)); + dAcBomb_c *bomb = mBombRef.get(); + if (bomb != nullptr) { + field_0x394 = 0x3C; + bomb->setTransformFromFlower(mWorldMtx); + if ((actor_properties & 1) != 0) { + bomb->actor_properties |= 1; + } + if (field_0x3D4 == 0) { + bomb->mField_0xA44 *= 1.5f; + } + } +} + void dAcBombf_c::initializeState_Wait() {} -void dAcBombf_c::executeState_Wait() {} + +extern "C" void fn_800298B0(u16, mVec3_c *, mVec3_c *, u32, u32, u32, u32, u32); +extern "C" u16 lbl_8057A750; + +void dAcBombf_c::executeState_Wait() { + // Stack problems + if (SceneflagManager::sInstance->checkBoolFlag(roomid, mDespawnSceneFlag)) { + deleteRequest(); + dAcBomb_c *bomb = mBombRef.get(); + if (bomb != nullptr) { + bomb->deleteRequest(); + bomb->mEffect1.remove(true); + bomb->mEffect2.remove(true); + } + return; + } + + f32 scaleFactor = mScale.x; + if (field_0x3D2 == 0 || field_0x3D2 == 2) { + mVec3_c m; + PSMTXMultVecSR(mWorldMtx, mVec3_c::Ey, m); + + mVec3_c m3 = position + (m * 30.0f); + + if (mTimeAreaStruct.check(roomid, m3, 0, 30.0f, 0.1f) && field_0x3D4 != 1) { + if (mTimeAreaStruct.field_0x04 == 1) { + playSound(0xC0A); + } else { + playSound(0xC0B); + } + fn_800298B0(lbl_8057A750, &position, nullptr, 0, 0, 0, 0, 0); + } + + scaleFactor *= mTimeAreaStruct.field_0x00; + if (field_0x3D2 == 2) { + scaleFactor = 1.0f - scaleFactor; + } + scaleFactor = nw4r::ut::Max(scaleFactor, 0.0001f); + mModel.setScale(scaleFactor, scaleFactor, scaleFactor); + } + dAcBomb_c *bomb = mBombRef.get(); + if (bomb != nullptr) { + if (!bomb->mStateMgr.isState(dAcBomb_c::StateID_FlowerWait) && field_0x3D0 == 0) { + mBombRef.unlink(); + field_0x394 = 0x3C; + } + } else { + if (field_0x394 != 0) { + field_0x394--; + } else if (field_0x3D0 == 0 || dAcPy_c::LINK->getSquareDistanceTo(position) > 22500.0f) { + regrowBomb(); + } + } + + bomb = mBombRef.get(); + if (bomb != nullptr) { + bomb->mField_0xA50 = scaleFactor; + } +} + void dAcBombf_c::finalizeState_Wait() {} diff --git a/src/REL/d/a/obj/d_a_obj_mole_soil.cpp b/src/REL/d/a/obj/d_a_obj_mole_soil.cpp index ca3d7762..0999c06a 100644 --- a/src/REL/d/a/obj/d_a_obj_mole_soil.cpp +++ b/src/REL/d/a/obj/d_a_obj_mole_soil.cpp @@ -2,7 +2,6 @@ #include "s/s_Math.h" - SPECIAL_ACTOR_PROFILE(OBJ_MOLE_SOIL, dAcOmoleSoil_c, fProfile::OBJ_MOLE_SOIL, 0x008B, 0, 6); STATE_DEFINE(dAcOmoleSoil_c, Wait); @@ -24,10 +23,6 @@ bool dAcOmoleSoil_c::createHeap() { return true; } -bool intToBool(int a) { - return a; -} - int dAcOmoleSoil_c::create() { CREATE_ALLOCATOR(dAcOmoleSoil_c); diff --git a/src/REL/d/a/obj/d_a_obj_pool_cock.cpp b/src/REL/d/a/obj/d_a_obj_pool_cock.cpp index 04ab8498..78a11035 100644 --- a/src/REL/d/a/obj/d_a_obj_pool_cock.cpp +++ b/src/REL/d/a/obj/d_a_obj_pool_cock.cpp @@ -50,7 +50,7 @@ int dAcOPoolCock_c::actorExecute() { mStateMgr.executeState(); calcVelocity(); position += velocity; - position += mCCdStruct.posIncrements; + position += mStts.mCcMove; updateMatrix(); mMtx_c mdl1Transform; mMtx_c mdl2Transform; diff --git a/src/REL/d/a/obj/d_a_obj_ring.cpp b/src/REL/d/a/obj/d_a_obj_ring.cpp index ffc37dfc..18b8ca1b 100644 --- a/src/REL/d/a/obj/d_a_obj_ring.cpp +++ b/src/REL/d/a/obj/d_a_obj_ring.cpp @@ -39,7 +39,7 @@ int dAcOring_c::actorExecute() { mStateMgr.executeState(); calcVelocity(); position += velocity; - position += mCCdStruct.posIncrements; + position += mStts.mCcMove; updateMatrix(); mModel.setLocalMtx(mWorldMtx); return SUCCEEDED; diff --git a/src/REL/d/a/obj/d_a_obj_spike.cpp b/src/REL/d/a/obj/d_a_obj_spike.cpp index fe74019d..060ed803 100644 --- a/src/REL/d/a/obj/d_a_obj_spike.cpp +++ b/src/REL/d/a/obj/d_a_obj_spike.cpp @@ -1,14 +1,13 @@ #include "d/a/obj/d_a_obj_spike.h" -#include "d/col/cc/d_cc_mgr.h" - +#include "d/col/cc/d_cc_s.h" SPECIAL_ACTOR_PROFILE(OBJ_SPIKE, dAcOspike_c, fProfile::OBJ_SPIKE, 0x1D9, 0, 2); // clang-format off -dCcD_SrcAabb dAcOspike_c::sCcSrc = { - {{{0x400}, 0x2003F, 0, 1, 0, 0, 0, 0, 0}, - {{0xFEB77DFF}, 0x111, 0x06, 0x407, 0, 0}, +dCcD_SrcUnk dAcOspike_c::sCcSrc = { + {{0x400, 0x2003F, {0, 0, 0}, 1, 0, 0, 0, 0}, + {0xFEB77DFF, 0x111, 0x06, 0x407, 0, }, {0}}, {-1.0f, -246.0f, -472.0f, 73.0f, 255.0f, 482.0f}}; // clang-format on @@ -30,15 +29,15 @@ int dAcOspike_c::create() { return FAILED; } - mCCdStruct.setField0x38ToMagicValue(); - mCollision.init(sCcSrc); - mCollision.initUnk(mCCdStruct); + mStts.SetDefaultRank(); + mCollision.Set(sCcSrc); + mCollision.SetStts(mStts); updateMatrix(); mMdl.setLocalMtx(mWorldMtx); mVec3_c tmp; PSMTXMultVecSR(mWorldMtx.m, mVec3_c::Ex, tmp); - mCollision.setAtVec(tmp); + mCollision.SetAtVec(tmp); mMtx_c mtx; mtx.XrotS(rotation.x); @@ -63,7 +62,7 @@ int dAcOspike_c::create() { tmp3.z = copy; } - mCollision.Set(tmp2, tmp3); + mCollision.cM3dGUnk::Set(tmp2, tmp3); mStateMgr.changeState(StateID_Wait); boundingBox.Set(mVec3_c(-10.0f, -250.0f, -480.0f), mVec3_c(80.0f, 260.0f, 490.0f)); return SUCCEEDED; @@ -75,8 +74,8 @@ int dAcOspike_c::doDelete() { int dAcOspike_c::actorExecute() { mStateMgr.executeState(); - mCollision.Set(position, rotation.y); - ColliderManager::getColliderManager()->addCollider(&mCollision); + mCollision.cM3dGUnk::Set(position, rotation.y); + dCcS::GetInstance()->Set(&mCollision); return 1; } diff --git a/src/REL/d/a/obj/d_a_obj_toD3_stone_figure.cpp b/src/REL/d/a/obj/d_a_obj_toD3_stone_figure.cpp index 93fd5c24..9bcff77a 100644 --- a/src/REL/d/a/obj/d_a_obj_toD3_stone_figure.cpp +++ b/src/REL/d/a/obj/d_a_obj_toD3_stone_figure.cpp @@ -1,13 +1,12 @@ #include "d/a/obj/d_a_obj_toD3_stone_figure.h" -#include "d/col/cc/d_cc_mgr.h" +#include "d/col/cc/d_cc_s.h" +#include "d/flag/storyflag_manager.h" #include "toBeSorted/attention.h" #include "toBeSorted/event.h" #include "toBeSorted/event_manager.h" -#include "d/flag/storyflag_manager.h" #include "toBeSorted/scgame.h" - SPECIAL_ACTOR_PROFILE(OBJ_TOD3_STONE, dAcOtoD3StoneFigure_c, fProfile::OBJ_TOD3_STONE, 0x1B3, 0, 0); STATE_DEFINE(dAcOtoD3StoneFigure_c, OneEye); @@ -18,10 +17,40 @@ f32 dAcOtoD3StoneFigure_c::sHeight = 290.0f; // clang-format off dCcD_SrcCyl dAcOtoD3StoneFigure_c::sCcSrc = { - {{{0}, 0, 0, 0, 0, 0, 0, 0, 0}, - {{0xFEB77DFF}, 0x1000111, 0x06, 0x407, 0, 0}, - {0xE9}}, - {dAcOtoD3StoneFigure_c::sRadius, dAcOtoD3StoneFigure_c::sHeight} + { + { + 0, + 0, + { + 0, + 0, + 0 + }, + 0, + 0, + 0, + 0, + 0, + 0 + }, + { + 0xFEB77DFF, + 0x1000111, + { + 0x06, + 0x407 + }, + 0, + 0 + }, + { + 0xE9 + } + }, + { + dAcOtoD3StoneFigure_c::sRadius, + dAcOtoD3StoneFigure_c::sHeight + } }; // clang-format on @@ -42,16 +71,15 @@ int dAcOtoD3StoneFigure_c::create() { } mMdl.setLocalMtx(mWorldMtx); - mCCdStruct.setField0x38ToMagicValue(); - mCollision.init(sCcSrc); - mCollision.initUnk(mCCdStruct); + mStts.SetDefaultRank(); + mCollision.Set(sCcSrc); + mCollision.SetStts(mStts); int zero = 0; mCollision.SetC(position); mCollision.SetR(dAcOtoD3StoneFigure_c::sRadius + zero); mCollision.SetH(dAcOtoD3StoneFigure_c::sHeight + zero); - ColliderManager::getColliderManager()->addCollider(&mCollision); - // mCollision.clearCoFlag(); - mCollision.setTgCoFlag(1); + dCcS::GetInstance()->Set(&mCollision); + mCollision.OnTgCoFlag(1); // ??? f32 a, b, c; @@ -66,7 +94,7 @@ int dAcOtoD3StoneFigure_c::create() { poscopy3.y = b; poscopy3.z = c; // poscopy3 = poscopy2; - mCollision.setSomeDefendValue(0x2000); + mCollision.SetTg_0x4C(0x2000); if (!mIsSkyKeepAlreadyOpen) { mStateMgr.changeState(StateID_OneEye); @@ -83,7 +111,7 @@ int dAcOtoD3StoneFigure_c::doDelete() { int dAcOtoD3StoneFigure_c::actorExecute() { mStateMgr.executeState(); - ColliderManager::getColliderManager()->addCollider(&mCollision); + dCcS::GetInstance()->Set(&mCollision); return SUCCEEDED; } diff --git a/src/REL/d/a/obj/d_a_obj_triforce.cpp b/src/REL/d/a/obj/d_a_obj_triforce.cpp index 91a69637..1754ca41 100644 --- a/src/REL/d/a/obj/d_a_obj_triforce.cpp +++ b/src/REL/d/a/obj/d_a_obj_triforce.cpp @@ -1,16 +1,15 @@ #include "d/a/obj/d_a_obj_triforce.h" #include "c/c_math.h" -#include "d/col/cc/d_cc_mgr.h" +#include "d/col/cc/d_cc_s.h" #include "m/m_vec.h" - SPECIAL_ACTOR_PROFILE(OBJ_TRIFORCE, dAcOtriforce_c, fProfile::OBJ_TRIFORCE, 0x15D, 0, 4); // clang-format off dCcD_SrcSph dAcOtriforce_c::sCcSrc = { - {{{0}, 0, 0, 0, 0, 0, 0, 0, 0}, - {{0xFEB77DFF}, 0x111, 0x06, 0x407, 0, 0}, + {{0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0xFEB77DFF, 0x111, 0x06, 0x407, 0, 0}, {0xE9}}, {150.0f}}; // clang-format on @@ -36,13 +35,13 @@ int dAcOtriforce_c::create() { return FAILED; } - mCCdStruct.setField0x38ToMagicValue(); - mCollision.init(sCcSrc); - mCollision.initUnk(mCCdStruct); - mCollision.clearCoFlag(); + mStts.SetDefaultRank(); + mCollision.Set(sCcSrc); + mCollision.SetStts(mStts); + mCollision.ClrCoSet(); mStartingOffset = cM::rndInt(sStartingOffsetRange); mEffects.init(this); - mCollision.setSomeDefendValue(0x2000); + mCollision.SetTg_0x4C(0x2000); updateMatrix(); mScale.x = sScale; mScale.y = sScale; @@ -66,7 +65,7 @@ int dAcOtriforce_c::actorExecute() { mCollision.SetC(position.x, position.y + 90.0f + zero, position.z); - ColliderManager::getColliderManager()->addCollider(&mCollision); + dCcS::GetInstance()->Set(&mCollision); updateMatrix(); Mtx m; PSMTXScale(m, mScale.x, mScale.y, mScale.z); diff --git a/src/REL/d/t/d_t_reaction.cpp b/src/REL/d/t/d_t_reaction.cpp index b09a86cf..5f982281 100644 --- a/src/REL/d/t/d_t_reaction.cpp +++ b/src/REL/d/t/d_t_reaction.cpp @@ -4,10 +4,9 @@ #include "c/c_math.h" #include "d/a/d_a_player.h" #include "d/a/obj/d_a_obj_item.h" -#include "d/col/cc/d_cc_mgr.h" +#include "d/col/cc/d_cc_s.h" #include "d/flag/sceneflag_manager.h" - SPECIAL_ACTOR_PROFILE(TAG_REACTION, dTgReaction_c, fProfile::TAG_REACTION, 0x0151, 0, 0); STATE_DEFINE(dTgReaction_c, Wait); @@ -19,8 +18,8 @@ const f32 dTgReaction_c::sHeight = 100.0f; // clang-format off dCcD_SrcCyl dTgReaction_c::sCcSrc = { - {{{0}, 0, 0, 0, 0, 0, 0, 0, 0}, - {{0x10000}, 0x213, 0, 0x8, 0x8, 0}, + {{0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0x10000, 0x213, 0, 0x8, 0x8,}, {0xE8}}, {dTgReaction_c::sRadius, dTgReaction_c::sHeight} }; @@ -43,7 +42,7 @@ int dTgReaction_c::create() { return FAILED; } - if (getReactType() != REACT_GUST_BELLOWS) { + if (getReactType() != REACT_UNDERWATER) { if (getSceneFlag() >= 0xFF) { return FAILED; } @@ -74,29 +73,31 @@ int dTgReaction_c::create() { } } - mCCdStruct.setField0x38(0); - mCollision.init(sCcSrc); - mCollision.initUnk(mCCdStruct); + mStts.SetRank(0); + mCollision.Set(sCcSrc); + mCollision.SetStts(mStts); switch (getReactType()) { - case REACT_BONK: - mCollision.setTgFlag(0x80); - mCollision.setTgField0x0A(0); - mCollision.SetR(sCcSrc.mCylAttr.mRadius * mScale.x); - mCollision.SetH(mScale.y * sCcSrc.mCylAttr.mHeight); - break; case REACT_SLINGSHOT: - mCollision.setTgFlag(0x10000); - mCollision.setTgField0x0A(8); - mCollision.SetR(sCcSrc.mCylAttr.mRadius * mScale.x); - mCollision.SetH(mScale.y * sCcSrc.mCylAttr.mHeight); + mCollision.SetTgFlag(0x80); + mCollision.SetTgFlag_0xA(0); + mCollision.SetR(sCcSrc.mCylInf.mRadius * mScale.x); + mCollision.SetH(sCcSrc.mCylInf.mHeight * mScale.y); break; case REACT_GUST_BELLOWS: - mCollision.setTgFlag(0x100000); - mCollision.setTgField0x0A(0); - mCollision.SetR(sCcSrc.mCylAttr.mRadius * mScale.x); - mCollision.SetH(mScale.y * sCcSrc.mCylAttr.mHeight); + mCollision.SetTgFlag(0x10000); + mCollision.SetTgFlag_0xA(8); + mCollision.SetR(sCcSrc.mCylInf.mRadius * mScale.x); + mCollision.SetH(sCcSrc.mCylInf.mHeight * mScale.y); break; + case REACT_UNDERWATER: + mCollision.SetTgFlag(0x100000); + mCollision.SetTgFlag_0xA(0); + mCollision.SetR(sCcSrc.mCylInf.mRadius * mScale.x); + mCollision.SetH(sCcSrc.mCylInf.mHeight * mScale.y); + break; + case REACT_BONK: + case REACT_4: break; } int item = getParam0x10(); @@ -111,8 +112,8 @@ int dTgReaction_c::create() { } mVec3_c dwsOffset; if (!getParam0x14()) { - field_0x4E4 = mScale.y * sCcSrc.mCylAttr.mHeight * 0.5f; - dwsOffset = mVec3_c(0.0f, 0.5f * sCcSrc.mCylAttr.mHeight, 0.0f); + field_0x4E4 = mScale.y * sCcSrc.mCylInf.mHeight * 0.5f; + dwsOffset = mVec3_c(0.0f, sCcSrc.mCylInf.mHeight * 0.5f, 0.0f); } else { dwsOffset = mVec3_c::Zero; } @@ -210,14 +211,14 @@ void dTgReaction_c::checkForBonkItem() { } void dTgReaction_c::checkForBubble() { - if (mCollision.someInteractCheck() && mCollision.CheckCollidedMask(0x100000)) { + if (mCollision.ChkTgHit() && mCollision.ChkTgAtHitType(0x100000)) { if (dAcPy_c::LINK != nullptr && dAcPy_c::LINK->checkFlags0x350(0x40)) { mVec3_c spawnPos = position; dAcObjBase_c::create(fProfile::OBJ_BUBBLE, roomid, 0x4, &spawnPos, nullptr, nullptr, 0xFFFFFFFF); } } mCollision.SetC(position); - ColliderManager::getColliderManager()->addCollider(&mCollision); + dCcS::GetInstance()->Set(&mCollision); } // TODO move this somewhere @@ -230,14 +231,15 @@ T rndRange(T min, T max) { } void dTgReaction_c::checkForSlingBellowsItem() { - if (mCollision.someInteractCheck()) { + if (mCollision.ChkTgHit()) { + u8 p = getParam0x08(); u32 uVar3; - // mVec3_c pos = position; - int p = getParam0x08(); if (p == 0) { uVar3 = 6; + } else if (uVar3 == 0xFF) { + uVar3 = 5; } else { - uVar3 = p == 0xFF ? 5 : 6; + uVar3 = 6; } mVec3_c spawnPos = position; spawnPos.y += field_0x4E4; @@ -248,7 +250,7 @@ void dTgReaction_c::checkForSlingBellowsItem() { onDelete(); } mCollision.SetC(position); - ColliderManager::getColliderManager()->addCollider(&mCollision); + dCcS::GetInstance()->Set(&mCollision); } void dTgReaction_c::onDelete() { diff --git a/src/REL/d/t/d_t_sound_area.cpp b/src/REL/d/t/d_t_sound_area.cpp index f4cf89c6..b6bb0b01 100644 --- a/src/REL/d/t/d_t_sound_area.cpp +++ b/src/REL/d/t/d_t_sound_area.cpp @@ -149,7 +149,7 @@ bool dTgSndAr_c::checkAlg3(const mVec3_c &pos) { unk.Set(b, c, mScale.x * 100.0f); f32 d; - if (cM3d_Len3dSqPntAndSegLine(&unk, &a, &q, &d, nullptr)) { + if (cM3d_Len3dSqPntAndSegLine(unk, a, q, &d, nullptr)) { // At the cylindrical part of the capsule, just check the distance to // the line return d < radius; diff --git a/src/d/a/d_a_base.cpp b/src/d/a/d_a_base.cpp index e629b108..30581cee 100644 --- a/src/d/a/d_a_base.cpp +++ b/src/d/a/d_a_base.cpp @@ -424,7 +424,7 @@ f32 dAcBase_c::getSquareDistToPlayer() { // Some weirdness with the float registers being used // 8002d4b0 void dAcBase_c::updateRoomId(f32 yOffset) { - if (getConnectParent()->profile_name != 701 /* fProfile::PROFILE_NAME_e::ROOM */) { + if (getConnectParent()->profile_name != fProfile::ROOM) { mVec3_c actorPos(position.x, position.y + yOffset, position.z); if (checkCollision(&actorPos)) { diff --git a/src/d/a/obj/d_a_obj_arrow.cpp b/src/d/a/obj/d_a_obj_arrow.cpp new file mode 100644 index 00000000..bf3a7c44 --- /dev/null +++ b/src/d/a/obj/d_a_obj_arrow.cpp @@ -0,0 +1,131 @@ +#include "d/a/obj/d_a_obj_arrow.h" + +#include "c/c_math.h" +#include "d/a/d_a_player.h" +#include "d/col/c/c_cc_d.h" + +SPECIAL_ACTOR_PROFILE(ARROW, dAcArrow_c, fProfile::ARROW, 0x126, 0, 0x80); + +STATE_DEFINE(dAcArrow_c, Wait); +STATE_DEFINE(dAcArrow_c, Move); +STATE_DEFINE(dAcArrow_c, ActorStop); +STATE_DEFINE(dAcArrow_c, BgStop); +STATE_DEFINE(dAcArrow_c, Bound); + +// clang-format off + +cCcD_SrcGObj dAcArrow_c::sCcSrcInf = { + + {0x2000, 0x8BB, 0x15000000, 0, 0, 0, 0, 0, 0}, + {0xFEB75C7F, 0x210, 0, 0x407, 0, 0}, + {0}, +}; + +dCcD_SrcCps dAcArrow_c::sCc1 = { + dAcArrow_c::sCcSrcInf, + {5.0f}, +}; + +const dCcD_SrcSph dAcArrow_c::sCc2 = { + {{0x0, 0x0, 0x0, 0, 0, 0, 0, 0, 0}, + {0x2, 0x211, 0, 0x407, 0, 0}, + {0xC28}}, + {100.0f}, +}; + +// clang-format on + +bool hitCallback(dAcObjBase_c *i_actorA, cCcD_Obj *i_objInfA, dAcObjBase_c *i_actorB, cCcD_Obj *i_objInfB) { + static_cast(i_actorA)->hitCallback(i_objInfA, i_actorB, i_objInfB); + return true; +} + +bool dAcArrow_c::createHeap() { + mResFile = getOarcResFile("Alink"); + nw4r::g3d::ResMdl mdl(nullptr); + if ((mSubType & 0x10) != 0) { + mdl = mResFile.GetResMdl("EquipPachinkoBullet"); + } else { + mdl = mResFile.GetResMdl("EquipArrow"); + } + // ? + bool ok = mModel.create(mdl, &heap_allocator, 0x120); + if (!ok) { + ok = false; + } + return ok; +} + +extern "C" void fn_8025E5E0(void *); + +int dAcArrow_c::create() { + mSubType = params & 0xFF; + CREATE_ALLOCATOR(dAcArrow_c); + + field_0x67C |= 4; + mStts.SetRank(2); + mCcCps.Set(sCc1); + mCcCps.SetStts(mStts); + mCcCps.SetAtFlag(0x2000); + mCcCps.SetAtCallback(::hitCallback); + mCcSph.Set(sCc2); + mCcSph.SetStts(mStts); + + if (mSubType == 0x11) { + mStateMgr.changeState(StateID_Move); + } else { + mStateMgr.changeState(StateID_Wait); + } + + boundingBox.Set(mVec3_c(-6.0f, -6.0f, 0.0f), mVec3_c(6.0f, 6.0f, 110.0f)); + field_0x684 = -1; + field_0x68A = 300; + f32 rnd = cM::rndF(20.0f); + field_0x688 = 50.0f - rnd; + field_0x6A8 = 80.0f; + mDespawnTimer = 10; + fn_8025E5E0(this); + return SUCCEEDED; +} + +dAcArrow_c::~dAcArrow_c() {} + +void dAcArrow_c::hitCallback(cCcD_Obj *i_objInfA, dAcObjBase_c *i_actorB, cCcD_Obj *i_objInfB) {} + +int dAcArrow_c::doDelete() { + // TODO + + return SUCCEEDED; +} + +int dAcArrow_c::actorExecute() { + mStateMgr.executeState(); + + // TODO + + return SUCCEEDED; +} + +int dAcArrow_c::draw() { + return SUCCEEDED; +} + +void dAcArrow_c::initializeState_Wait() {} +void dAcArrow_c::executeState_Wait() {} +void dAcArrow_c::finalizeState_Wait() {} + +void dAcArrow_c::initializeState_Move() {} +void dAcArrow_c::executeState_Move() {} +void dAcArrow_c::finalizeState_Move() {} + +void dAcArrow_c::initializeState_ActorStop() {} +void dAcArrow_c::executeState_ActorStop() {} +void dAcArrow_c::finalizeState_ActorStop() {} + +void dAcArrow_c::initializeState_BgStop() {} +void dAcArrow_c::executeState_BgStop() {} +void dAcArrow_c::finalizeState_BgStop() {} + +void dAcArrow_c::initializeState_Bound() {} +void dAcArrow_c::executeState_Bound() {} +void dAcArrow_c::finalizeState_Bound() {} diff --git a/src/d/a/obj/d_a_obj_bomb.cpp b/src/d/a/obj/d_a_obj_bomb.cpp new file mode 100644 index 00000000..5b9d6b6f --- /dev/null +++ b/src/d/a/obj/d_a_obj_bomb.cpp @@ -0,0 +1,20 @@ +#include "d/a/obj/d_a_obj_bomb.h" + +#include "f/f_base.h" +#include "f/f_profile.h" +#include "f/f_profile_name.h" +#include "s/s_State.hpp" + +SPECIAL_ACTOR_PROFILE(BOMB, dAcBomb_c, fProfile::BOMB, 0x128, 0, 2); + +STATE_DEFINE(dAcBomb_c, Wait); +STATE_DEFINE(dAcBomb_c, FlowerWait); +STATE_DEFINE(dAcBomb_c, Explode); +STATE_DEFINE(dAcBomb_c, Carry); +STATE_DEFINE(dAcBomb_c, WindCarry); + +bool dAcBomb_c::createHeap() {} + +int dAcBomb_c::create() { + return SUCCEEDED; +} diff --git a/src/d/a/obj/d_a_obj_fairy.cpp b/src/d/a/obj/d_a_obj_fairy.cpp index a91d84a2..8d961727 100644 --- a/src/d/a/obj/d_a_obj_fairy.cpp +++ b/src/d/a/obj/d_a_obj_fairy.cpp @@ -2,7 +2,6 @@ #include "d/a/d_a_player.h" - SPECIAL_ACTOR_PROFILE(OBJ_FAIRY, dAcObjFairy_c, fProfile::OBJ_FAIRY, 0x166, 0, 2); STATE_DEFINE(dAcObjFairy_c, Wait); @@ -53,7 +52,8 @@ int dAcObjFairy_c::draw() { if (!isCuring()) { static mQuat_c rot(0.0f, 0.0f, 0.0f, 10.0f); - drawShadow(mShadow, nullptr, mWorldMtx, &rot, -1, -1, -1, -1, -1, position.y - field_0x4B0); + f32 f = field_0x4B0; + drawShadow(mShadow, nullptr, mWorldMtx, &rot, -1, -1, -1, -1, -1, position.y - f); } } @@ -96,14 +96,13 @@ void dAcObjFairy_c::executeState_CatchDemo() { } void dAcObjFairy_c::finalizeState_CatchDemo() { field_0xB89 = 0; - // TODO collision + mObjectActorFlags &= ~0x00000200; } bool dAcObjFairy_c::shouldAvoidLink() const { // TODO shuffles if (dAcPy_c::LINK->isUsingBugnet()) { - const mVec3_c &bugNetPos = dAcPy_c::LINK->getBugNetPos(); - const mVec3_c dist = bugNetPos - position; + mVec3_c dist = dAcPy_c::LINK->getBugNetPos() - position; bool isClose = false; if (dist.mag() < 100.0f && velocity.dot(dist) > 0.0f) { isClose = true; diff --git a/src/d/a/obj/d_a_obj_switch.cpp b/src/d/a/obj/d_a_obj_switch.cpp index 0029e81f..2131d02b 100644 --- a/src/d/a/obj/d_a_obj_switch.cpp +++ b/src/d/a/obj/d_a_obj_switch.cpp @@ -68,13 +68,13 @@ bool dAcOsw_c::createHeap() { nw4r::g3d::ResMdl resMdl = resFile.GetResMdl(SWITCH_TYPES[mSwitchType]); TRY_CREATE(mModel.create(resMdl, &heap_allocator, 0x20, 1, nullptr)); - field_0x5E8 = mScale.x * - (resMdl.GetResNode("base").mNode.ref().VEC3_0x50.x - resMdl.GetResNode("base").mNode.ref().VEC3_0x44.x); + field_0x5E8 = mScale.x * (resMdl.GetResNode("base").mNode.ref().VEC3_0x50.x - + resMdl.GetResNode("base").mNode.ref().VEC3_0x44.x); cBgD_t *dbzData = (cBgD_t *)getOarcDZB(SWITCH_TYPES[mSwitchType], SWITCH_TYPES[mSwitchType]); PLC *plcData = (PLC *)getOarcPLC(SWITCH_TYPES[mSwitchType], SWITCH_TYPES[mSwitchType]); mScale.set(1.0f, 0.8f, 1.0f); updateMatrix(); - field_0x5B8.set(mWorldMtx); + field_0x5B8.copyFrom(mWorldMtx); mModel.setLocalMtx(mWorldMtx); bool set = mCollision.Set(dbzData, plcData, cBgW::MOVE_BG_e, &field_0x5B8, &mScale); @@ -180,7 +180,7 @@ int dAcOsw_c::actorExecute() { } updateMatrix(); - field_0x5B8.set(mWorldMtx); + field_0x5B8.copyFrom(mWorldMtx); mMtx_c tmp; PSMTXTrans(tmp, 0.0f, mButtonCtrl.mElevation, 0.0f); PSMTXConcat(field_0x5B8, tmp, field_0x5B8); diff --git a/src/d/col/bg/d_bg_w.cpp b/src/d/col/bg/d_bg_w.cpp index a8684c23..77695657 100644 --- a/src/d/col/bg/d_bg_w.cpp +++ b/src/d/col/bg/d_bg_w.cpp @@ -492,8 +492,8 @@ void cBgW::RwgLineCheck(int polyIdx, cBgS_LinChk *pLine) { cBgD_Vtx_t *vtxTbl = mpVtxTbl; mVec3_c cross_pos; if (cM3d_Cross_LinTri( - &pLine->mLin, &vtxTbl[triTbl[polyIdx].mVtxIdx0], &vtxTbl[triTbl[polyIdx].mVtxIdx1], - &vtxTbl[triTbl[polyIdx].mVtxIdx2], &mpTri[polyIdx], &cross_pos, pLine->ChkFrontFlag(), + pLine->mLin, vtxTbl[triTbl[polyIdx].mVtxIdx0], vtxTbl[triTbl[polyIdx].mVtxIdx1], + vtxTbl[triTbl[polyIdx].mVtxIdx2], &mpTri[polyIdx], cross_pos, pLine->ChkFrontFlag(), pLine->ChkBackFlag() )) { dBgPc pc = *mpPolyCodes.GetDBgPc(mpBgd->mTriTbl[polyIdx].mId); diff --git a/src/d/col/bg/d_bg_w_time.cpp b/src/d/col/bg/d_bg_w_time.cpp index e68f8456..d61a0b3e 100644 --- a/src/d/col/bg/d_bg_w_time.cpp +++ b/src/d/col/bg/d_bg_w_time.cpp @@ -101,7 +101,7 @@ bool dBgWTime::LineCheck(cBgS_LinChk *pLine) { lin.Set(linStart, linEnd); mVec3_c vec0; mVec3_c vec1; - if (!cM3d_Cross_CylLin(&mCyl, &lin, vec0, vec1)) { + if (!cM3d_Cross_CylLin(mCyl, lin, vec0, vec1)) { return false; } if (!fn_803537a0(&vec0, pLine)) { diff --git a/src/d/col/c/c_cc_d.cpp b/src/d/col/c/c_cc_d.cpp index e69de29b..67140f50 100644 --- a/src/d/col/c/c_cc_d.cpp +++ b/src/d/col/c/c_cc_d.cpp @@ -0,0 +1,1494 @@ +#include "d/col/c/c_cc_d.h" + +#include "common.h" +#include "d/a/obj/d_a_obj_base.h" +#include "d/col/c/c_m3d.h" +#include "d/col/c/c_m3d_g_aab.h" +#include "d/col/c/c_m3d_g_cyl.h" +#include "d/col/c/c_m3d_g_lin.h" +#include "d/col/c/c_m3d_g_unk.h" +#include "egg/math/eggMath.h" +#include "egg/math/eggVector.h" +#include "m/m_angle.h" +#include "m/m_mtx.h" +#include "m/m_vec.h" +#include "nw4r/types_nw4r.h" +#include "rvl/MTX.h" // IWYU pragma: export +#include "s/s_Math.h" + +// Very Hack ?? +static inline bool IsZero(f32 in) { + return fabsf(in) <= EGG::Math::epsilon(); +} +static inline void MtxTransMinusXYZ(mMtx_c &mtx, f32 x, f32 y, f32 z) { + PSMTXTrans(mtx, -x, -y, -z); +} + +mVec3_c cCcD_ShapeAttr::sVirtualCenter = mVec3_c::Zero; + +cCcD_DivideInfo::cCcD_DivideInfo() {} + +cCcD_DivideInfo::~cCcD_DivideInfo() {} + +cCcD_DivideArea::cCcD_DivideArea() {} + +cCcD_DivideArea::~cCcD_DivideArea() {} + +void cCcD_DivideArea::SetArea(cM3dGAab const &aab) { + Set(aab.mMin, aab.mMax); + + mScaledXDiff = 1.0f / 32.0f * (GetMaxP()->x - GetMinP()->x); + mXDiffIsZero = cM3d_IsZero(mScaledXDiff); + if (!mXDiffIsZero) { + mInvScaledXDiff = 1.0f / mScaledXDiff; + } + + mScaledYDiff = 1.0f / 32.0f * (GetMaxP()->y - GetMinP()->y); + mYDiffIsZero = cM3d_IsZero(mScaledYDiff); + if (!mYDiffIsZero) { + mInvScaledYDiff = 1.0f / mScaledYDiff; + } + + mScaledZDiff = 1.0f / 32.0f * (GetMaxP()->z - GetMinP()->z); + mZDiffIsZero = cM3d_IsZero(mScaledZDiff); + if (!mZDiffIsZero) { + mInvScaledZDiff = 1.0f / mScaledZDiff; + } +} + +static const u32 l_base[32] = { + 0x00000001, 0x00000003, 0x00000007, 0x0000000F, 0x0000001F, 0x0000003F, 0x0000007F, 0x000000FF, + 0x000001FF, 0x000003FF, 0x000007FF, 0x00000FFF, 0x00001FFF, 0x00003FFF, 0x00007FFF, 0x0000FFFF, + 0x0001FFFF, 0x0003FFFF, 0x0007FFFF, 0x000FFFFF, 0x001FFFFF, 0x003FFFFF, 0x007FFFFF, 0x00FFFFFF, + 0x01FFFFFF, 0x03FFFFFF, 0x07FFFFFF, 0x0FFFFFFF, 0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF, 0xFFFFFFFF, +}; + +void cCcD_DivideArea::CalcDivideInfo(cCcD_DivideInfo *pDivideInfo, const cM3dGAab &aab) { + u32 xDivInfo, yDivInfo, zDivInfo; + if (!mXDiffIsZero) { + s32 var1 = mInvScaledXDiff * (aab.GetMinP()->x - GetMinP()->x); + s32 var3 = mInvScaledXDiff * (aab.GetMaxP()->x - GetMinP()->x); + if (31 < var3) { + var3 = 31; + } + + xDivInfo = l_base[var3]; + if (0 < var1) { + var1--; + xDivInfo &= ~l_base[var1]; + } + } else { + xDivInfo = 0xFFFFFFFF; + } + + if (!mYDiffIsZero) { + s32 var1 = mInvScaledYDiff * (aab.GetMinP()->y - GetMinP()->y); + s32 var3 = mInvScaledYDiff * (aab.GetMaxP()->y - GetMinP()->y); + if (31 < var3) { + var3 = 31; + } + + yDivInfo = l_base[var3]; + if (0 < var1) { + var1--; + yDivInfo &= ~l_base[var1]; + } + } else { + yDivInfo = 0xFFFFFFFF; + } + + if (!mZDiffIsZero) { + s32 var1 = mInvScaledZDiff * (aab.GetMinP()->z - GetMinP()->z); + s32 var3 = mInvScaledZDiff * (aab.GetMaxP()->z - GetMinP()->z); + if (31 < var3) { + var3 = 31; + } + + zDivInfo = l_base[var3]; + if (0 < var1) { + var1--; + zDivInfo &= ~l_base[var1]; + } + } else { + zDivInfo = 0xFFFFFFFF; + } + + pDivideInfo->Set(xDivInfo, yDivInfo, zDivInfo); +} + +void cCcD_DivideArea::CalcDivideInfoOverArea(cCcD_DivideInfo *pDivideInfo, const cM3dGAab &aab) { + u32 xDivInfo, yDivInfo, zDivInfo; + if (!mXDiffIsZero) { + s32 var1 = mInvScaledXDiff * (aab.GetMinP()->x - GetMinP()->x); + s32 var3 = mInvScaledXDiff * (aab.GetMaxP()->x - GetMinP()->x); + if (var3 < 0 || 31 < var1) { + xDivInfo = 0; + } else { + if (31 < var3) { + var3 = 31; + } + xDivInfo = l_base[var3]; + if (0 < var1) { + var1--; + xDivInfo &= ~l_base[var1]; + } + } + } else { + xDivInfo = 0xFFFFFFFF; + } + + if (!mYDiffIsZero) { + s32 var1 = mInvScaledYDiff * (aab.GetMinP()->y - GetMinP()->y); + s32 var3 = mInvScaledYDiff * (aab.GetMaxP()->y - GetMinP()->y); + if (var3 < 0 || 31 < var1) { + yDivInfo = 0; + } else { + if (31 < var3) { + var3 = 31; + } + yDivInfo = l_base[var3]; + if (0 < var1) { + var1--; + yDivInfo &= ~l_base[var1]; + } + } + } else { + yDivInfo = 0xFFFFFFFF; + } + + if (!mZDiffIsZero) { + s32 var1 = mInvScaledZDiff * (aab.GetMinP()->z - GetMinP()->z); + s32 var3 = mInvScaledZDiff * (aab.GetMaxP()->z - GetMinP()->z); + if (var3 < 0 || 31 < var1) { + zDivInfo = 0; + } else { + if (31 < var3) { + var3 = 31; + } + zDivInfo = l_base[var3]; + if (0 < var1) { + var1--; + zDivInfo &= ~l_base[var1]; + } + } + } else { + zDivInfo = 0xFFFFFFFF; + } + + pDivideInfo->Set(xDivInfo, yDivInfo, zDivInfo); +} + +cCcD_Stts::cCcD_Stts(dAcObjBase_c *pObj) { + mAtApid = 0; + mAtOldApid = 0; + mTgApid = 0; + mTgOldApid = 0; + mRank = 0; + mpActor = pObj; + ClrCcMove(); +} + +void cCcD_Stts::Move() { + mAtOldApid = mAtApid; + mAtApid = 0; + mTgOldApid = mTgApid; + mTgApid = 0; +} + +int cCcD_Stts::GetID() const { + if (mpActor) { + return mpActor->getID(); + } + return 0; +} + +void cCcD_Stts::PlusCcMove(f32 x, f32 y, f32 z) { + if (mField_0x10.x > x) { + mField_0x10.x = x; + } else if (mField_0x1C.x < x) { + mField_0x1C.x = x; + } + + if (mField_0x10.y > y) { + mField_0x10.y = y; + } else if (mField_0x1C.y < y) { + mField_0x1C.y = y; + } + + if (mField_0x10.z > z) { + mField_0x10.z = z; + } else if (mField_0x1C.z < z) { + mField_0x1C.z = z; + } + + mCcMove.x = mField_0x10.x + mField_0x1C.x; + mCcMove.y = mField_0x10.y + mField_0x1C.y; + mCcMove.z = mField_0x10.z + mField_0x1C.z; +} + +void cCcD_Stts::ClrCcMove() { + mField_0x10 = mVec3_c::Zero; + mField_0x1C = mVec3_c::Zero; + mCcMove = mVec3_c::Zero; +} + +static const u32 l_ranks[3] = {75, 90, 100}; + +int cCcD_Stts::GetWeight(int inRank) const { + // Current Rank is highest and in is lowest + // - No effect + if (mRank == 13 || inRank == 0) { + return 0; + } + + // Current Rank is lowest and in is highest + // - Fill effect + if (mRank == 0 || inRank == 13) { + return 100; + } + if (mRank == inRank) { + return 50; + } + if (mRank == 12 || inRank == 1) { + return 0; + } + if (mRank == 1 || inRank == 12) { + return 100; + } + + if (inRank != 12) { + int diff = inRank - mRank; + int idx; + if (diff > 0) { + idx = 3; + if (diff <= 3) { + idx = diff; + } + return l_ranks[idx - 1]; + } else { + idx = 3; + if (-diff <= 3) { + idx = -diff; + } + return 100 - l_ranks[idx - 1]; + } + } + // Shouldnt reach here... + return mRank; +} + +cCcD_GAtTgCoCommonBase::cCcD_GAtTgCoCommonBase() : mHit_cb(nullptr), mEffCounter(0), mAc(), mRPrm(0) {} + +cCcD_GAtTgCoCommonBase::~cCcD_GAtTgCoCommonBase() { + ClrActorInfo(); + mRPrm = 0; + ClrActorInfo(); + SubtractEffCounter(); + mHit_cb = nullptr; +} + +void cCcD_GAtTgCoCommonBase::ClrActorInfo() { + mAc.unlink(); +} + +void cCcD_GAtTgCoCommonBase::SetHitActor(dAcObjBase_c *pActor) { + mRPrm |= 1; + mAc.link(pActor); +} + +dAcObjBase_c *cCcD_GAtTgCoCommonBase::GetActor() { + return mAc.get(); +} + +void cCcD_GAtTgCoCommonBase::SubtractEffCounter() { + if (mEffCounter <= 0) { + return; + } + mEffCounter--; +} + +/////////////////////////////////////////////////////////////////////////////// +// Collision Object +/////////////////////////////////////////////////////////////////////////////// + +cCcD_Obj::cCcD_Obj() : mStts(0), mField_0x108(0) {} + +cCcD_Obj::~cCcD_Obj() { + mStts = 0; +} + +bool cCcD_Obj::fn_80328ad0(dAcObjBase_c *pObj, u32 attype) { + bool ret = false; + if (pObj && pObj->isActorPlayer() && attype == 2) { + ret = true; + } + return ret; +} + +void cCcD_Obj::ClrSet() { + mAt.mSrc.mSPrm &= ~1; + mTg.mSrc.mSPrm &= ~1; + mCo.mSrc.mSPrm &= ~1; +} + +void cCcD_Obj::Set(const cCcD_SrcGObj &src) { + mAt.Set(src.mObjAt); + mTg.Set(src.mObjTg); + mCo.Set(src.mObjCo); +} + +void cCcD_Obj::ClrAtHit() { + mAt.mRPrm = 0; + mAt.ClrActorInfo(); + mAt.SubtractEffCounter(); + mAt.ClrEffCounter(); +} +void cCcD_Obj::ClrTgHit() { + mTg.mRPrm = 0; + mTg.ClrActorInfo(); + mTg.SubtractEffCounter(); + mTg.ClrEffCounter(); +} + +void cCcD_Obj::ClrCoHit() { + mCo.mRPrm = 0; + mCo.ClrActorInfo(); + mCo.SubtractEffCounter(); + mCo.ClrEffCounter(); +} + +const mVec3_c &cCcD_Obj::GetAtHitPos() const { + return mAt.mHitPos; +} + +mVec3_c &cCcD_Obj::GetAtHitPos() { + return mAt.mHitPos; +} + +bool cCcD_Obj::GetAtFlag0x2() const { + return mAt.MskRPrm(2); +} + +bool cCcD_Obj::GetAtFlag0x4() const { + return mAt.MskRPrm(4); +} + +bool cCcD_Obj::GetAtFlag0x8() const { + return mAt.MskRPrm(8); +} + +const mVec3_c &cCcD_Obj::GetTgHitPos() const { + return mTg.mHitPos; +} + +mVec3_c &cCcD_Obj::GetTgHitPos() { + return mTg.mHitPos; +} + +bool cCcD_Obj::GetTgFlag0x4() const { + return mTg.MskRPrm(4); +} + +bool cCcD_Obj::GetTgFlag0x8() const { + return mTg.MskRPrm(0x8); +} + +cCcD_ObjInf *cCcD_Obj::GetGObjInfo() { + return (cCcD_ObjInf *)this; +} + +bool cCcD_Obj::ChkAtClawshot() const { + return mAt.MskTgHitSPrm(0x80000); +} + +bool cCcD_Obj::ChkAtClawshotDebug() const { + return false; +} + +bool cCcD_Obj::ChkAtElectrified() const { + return mAt.MskTgHitSPrm(0x40000); +} + +bool cCcD_Obj::ChkAtElectrifiedExtra() const { + return mAt.MskTgHitSPrm(0x8000000); +} + +bool cCcD_Obj::ChkAtWhippable() const { + return mAt.MskTgHitSPrm(0x800000); +} + +bool cCcD_Obj::ChkAtBit24() const { + return mAt.MskTgHitSPrm(0x1000000); +} + +bool cCcD_Obj::ChkAtArrowStick() const { + return mAt.MskTgHitSPrm(0x2000000); +} + +bool cCcD_Obj::ChkAtWaterScaleBonk() const { + return mAt.MskTgHitSPrm(0x4000000); +} + +bool cCcD_Obj::ChkAtSwordBonk() const { + return mAt.MskTgHitSPrm(0x10000); +} + +dAcObjBase_c *cCcD_Obj::GetAtActor() { + return mAt.GetActor(); +} + +bool cCcD_Obj::ChkTgAtHitType(u32 mask) const { + return mTg.mAtHitSrc.mType & mask; +} + +u32 cCcD_Obj::GetTg_0x58() const { + return mTg.mAtHitSrc.mType; +} + +bool cCcD_Obj::ChkTgBit14() const { + return mTg.MskAtHitSPrm(0x4000); +} + +u8 cCcD_Obj::GetTgDamage() const { + return mTg.mAtHitSrc.mDamage; +} + +u16 cCcD_Obj::GetTgDamageFlags() const { + return mTg.mAtHitSrc.mInfo.mModifier; +} + +bool cCcD_Obj::ChkTgSkywardStrike() const { + return mTg.MskAtHitSPrm(0x10000); +} +bool cCcD_Obj::ChkTgBit17() const { + return mTg.MskAtHitSPrm(0x20000); +} + +bool cCcD_Obj::ChkTgBit18() const { + return mTg.MskAtHitSPrm(0x40000); +} + +bool cCcD_Obj::ChkTgBit19() const { + return mTg.MskAtHitSPrm(0x80000); +} + +bool cCcD_Obj::ChkTgBit23() const { + return mTg.MskAtHitSPrm(0x800000); +} + +bool cCcD_Obj::ChkTgBit20() const { + return mTg.MskAtHitSPrm(0x100000); +} + +bool cCcD_Obj::ChkTgBit24() const { + return mTg.MskAtHitSPrm(0x1000000); +} + +bool cCcD_Obj::ChkTgBit25() const { + return mTg.MskAtHitSPrm(0x2000000); +} + +u16 cCcD_Obj::GetTgSoundID() const { + return mTg.mAtHitSrc.mField_0x10; +} + +s16 cCcD_Obj::GetTg_0x6A() const { + return mTg.mAtHitSrc.mField_0x12; +} + +bool cCcD_Obj::ChkTgBit8() const { + return mTg.MskAtHitSPrm(0x100); +} + +u8 cCcD_Obj::GetTg_0x4A() const { + return mTg.mField_0x4A; +} + +dAcObjBase_c *cCcD_Obj::GetTgActor() { + return mTg.GetActor(); +} + +const mVec3_c &cCcD_Obj::GetTg_0x2C() const { + return mTg.mField_0x2C; +} + +dAcObjBase_c *cCcD_Obj::GetCoActor() { + return mCo.GetActor(); +} + +bool cCcD_Obj::ChkCoBit4() const { + return mCo.mCoHitSrc.mSPrm >> 4 & 1; +} + +void cCcD_Obj::SetAtFlagsUpper(u32 flags) { + mAt.OffSPrm(0x3FF0000); + mAt.OnSPrm(flags); +} + +bool cCcD_Obj::ChkTgBit1() const { + return mTg.MskRPrm(2); +} + +void cCcD_Obj::AdjustHitPos(f32 x, f32 z) { + mAt.AdjustHitPos(x, z); + mTg.AdjustHitPos(x, z); + mCo.AdjustHitPos(x, z); +} + +/////////////////////////////////////////////////////////////////////////////// +// Base Shape Attribute +/////////////////////////////////////////////////////////////////////////////// + +cCcD_ShapeAttr::cCcD_ShapeAttr() {} + +cCcD_ShapeAttr::~cCcD_ShapeAttr() {} + +bool cCcD_ShapeAttr::Calc(const mVec3_c &, const mVec3_c &, mVec3_c *pOut) { + return false; +} + +void cCcD_ShapeAttr::GetShapeAccess(cCcD_ShapeAttr::Shape *pShape) const { + pShape->mField_0x00 = 4; + pShape->mField_0x04 = mVec3_c::Zero; + pShape->mField_0x10 = mVec3_c::Zero; + pShape->mField_0x1C = mVec3_c::Zero; +} + +bool cCcD_ShapeAttr::GetPosBool(mVec3_c *pOut) const { + return false; +} + +bool cCcD_ShapeAttr::CrossAtTg(cCcD_ShapeAttr &shapeAttr, mVec3_c *pOut) { + return false; +} + +bool cCcD_ShapeAttr::CrossCo(cCcD_ShapeAttr &shapeAttr, f32 *pOut) { + return false; +} + +mVec3_c &cCcD_ShapeAttr::GetCoP() { + return sVirtualCenter; +} + +/////////////////////////////////////////////////////////////////////////////// +// Triangle Shape Attribute +/////////////////////////////////////////////////////////////////////////////// + +cCcD_TriAttr::cCcD_TriAttr() {} + +cCcD_TriAttr::~cCcD_TriAttr() {} + +bool cCcD_TriAttr::Calc(const mVec3_c &start, const mVec3_c &end, mVec3_c *pOut) { + bool bVar1 = false; + mVec3_c tmp0, tmp1; + if (!CrossInfLin(start, end, *pOut)) { + bVar1 = true; + + } else { + mVec3_c a = GetPntA() - *pOut; + mVec3_c b = GetPntB() - *pOut; + mVec3_c c = GetPntC() - *pOut; + + mVec3_c a_x_b = a.cross(b); + mVec3_c b_x_c = b.cross(c); + mVec3_c c_x_a = c.cross(a); + + f32 dot0 = a_x_b.dot(b_x_c); + f32 dot1 = b_x_c.dot(c_x_a); + f32 dot2 = c_x_a.dot(a_x_b); + + if (!(dot0 > 0.0f && dot1 > 0.0f && dot2 > 0.0f)) { + if (dot0 <= 0.f && dot1 <= 0.0f && dot2 <= 0.0f) { + bVar1 = true; + } else if (dot0 > 0.0f) { + tmp0 = GetPntA(); + tmp1 = GetPntC(); + } else if (dot1 > 0.0f) { + tmp0 = GetPntA(); + tmp1 = GetPntB(); + } else { + tmp0 = GetPntC(); + tmp1 = GetPntB(); + } + mVec3_c tmp2 = tmp1 - tmp0; + f32 mag = tmp2.squaredLength(); + if (IsZero(mag)) { + bVar1 = true; + } else { + mag = tmp2.dot(*pOut - tmp0) / mag; + f32 scale = mag < 0.0f ? 0.0f : mag > 1.0f ? 1.0f : mag; + tmp2 *= scale; + *pOut = tmp0 + tmp2; + } + } + } + if (bVar1) { + *pOut = (GetPntA() + GetPntB() + GetPntC()) * (1.f / 3.f); + } +} + +bool cCcD_TriAttr::CrossAtTg(cCcD_ShapeAttr &shapeAttr, mVec3_c *pOut) { + return shapeAttr.CrossAtTg(*this, pOut); +} + +bool cCcD_TriAttr::CrossAtTg(cCcD_CpsAttr &cpsAttr, mVec3_c *pOut) { + return cM3d_Cross_CpsTri(cpsAttr, *this, pOut); +} + +bool cCcD_TriAttr::CrossAtTg(cCcD_CylAttr &cylAttr, mVec3_c *pOut) { + return cM3d_Cross_CylTri(cylAttr, *this, pOut); +} + +bool cCcD_TriAttr::CrossAtTg(cCcD_SphAttr &sphAttr, mVec3_c *pOut) { + return cM3d_Cross_SphTri(sphAttr, *this, pOut, nullptr, nullptr); +} + +bool cCcD_TriAttr::CrossAtTg(cCcD_TriAttr &triAttr, mVec3_c *pOut) { + return cM3d_Cross_TriTri(*this, triAttr, pOut); +} + +bool cCcD_TriAttr::CrossAtTg(cCcD_UnkAttr &unkAttr, mVec3_c *pOut) { + return cM3d_Cross_UnkTri(unkAttr, *this, pOut); +} + +bool cCcD_TriAttr::CrossCo(cCcD_ShapeAttr &shapeAttr, f32 *pOut) { + return shapeAttr.CrossCo(*this, pOut); +} + +bool cCcD_TriAttr::CrossCo(cCcD_CpsAttr &cpsAttr, f32 *pOut) { + return false; +} + +bool cCcD_TriAttr::CrossCo(cCcD_TriAttr &triAttr, f32 *pOut) { + return false; +} + +bool cCcD_TriAttr::CrossCo(cCcD_UnkAttr &unkAttr, f32 *pOut) { + return false; +} + +bool cCcD_TriAttr::CrossCo(cCcD_CylAttr &cylAttr, f32 *pOut) { + return false; +} + +bool cCcD_TriAttr::CrossCo(cCcD_SphAttr &sphAttr, f32 *pOut) { + return false; +} + +void cCcD_TriAttr::CalcAabBox() { + mVec3_c a, b, c; + mAab.ClearForMinMax(); + + a = GetPntA(); + mAab.SetMinMax(a); + + b = GetPntB(); + mAab.SetMinMax(b); + + c = GetPntC(); + mAab.SetMinMax(c); +} + +bool cCcD_TriAttr::GetNVec(const mVec3_c &pnt, mVec3_c *pOut) const { + if (getPlaneFunc(pnt) >= 0.f) { + *pOut = GetN(); + } else { + *pOut = GetN(); + PSVECScale(*pOut, *pOut, -1.0f); + } + return true; +} + +void cCcD_TriAttr::GetShapeAccess(cCcD_ShapeAttr::Shape *pShape) const { + pShape->mField_0x00 = SHAPE_TRIANGLE; + pShape->mField_0x04 = GetPntA(); + pShape->mField_0x10 = GetPntB(); + pShape->mField_0x1C = GetPntC(); +} + +void cCcD_TriAttr::GetPos(nw4r::math::VEC3 *pOut) const { + *pOut = GetPntA(); +} + +void cCcD_TriAttr::TranslateXZ(f32 x, f32 z) { + mA.x += x; + mA.z += z; + mB.x += x; + mB.z += z; + mC.x += x; + mC.z += z; +} + +/////////////////////////////////////////////////////////////////////////////// +// Unk Shape Attribute +/////////////////////////////////////////////////////////////////////////////// + +cCcD_UnkAttr::cCcD_UnkAttr() {} + +cCcD_UnkAttr::~cCcD_UnkAttr() {} + +bool cCcD_UnkAttr::Calc(const mVec3_c &start, const mVec3_c &end, mVec3_c *pOut) { + mVec3_c tmp0, tmp1; + const mMtx_c &inv = mInvMtx; + PSMTXMultVec(inv, start, tmp0); + PSMTXMultVec(inv, end, tmp1); + for (int i = 0; i < 3; i++) { + bool tmp0Min = tmp0(i) < mMin(i); + bool tmp0Max = tmp0(i) > mMax(i); + + bool tmp1Min = tmp1(i) < mMin(i); + bool tmp1Max = tmp1(i) > mMax(i); + + if (tmp0Min) { + if (tmp1Max) { + f32 t = (tmp0(i) + tmp1(i)) * 0.5f; + (*pOut)(i) = t < mMin(i) ? mMin(i) : t > mMax(i) ? mMax(i) : t; + + } else { + (*pOut)(i) = mMin(i); + } + } else if (tmp0Max) { + if (tmp1Min) { + f32 t = (tmp0(i) + tmp1(i)) * 0.5f; + (*pOut)(i) = t < mMin(i) ? mMin(i) : t > mMax(i) ? mMax(i) : t; + + } else { + (*pOut)(i) = mMax(i); + } + } else if (tmp1Min) { + (*pOut)(i) = mMin(i); + } else if (tmp1Max) { + (*pOut)(i) = mMax(i); + } else { + (*pOut)(i) = (tmp0(i) + tmp1(i)) * 0.5f; + } + } + PSMTXMultVec(mMtx, *pOut, *pOut); + return true; +} + +bool cCcD_UnkAttr::CrossAtTg(cCcD_ShapeAttr &shapeAttr, mVec3_c *pOut) { + return shapeAttr.CrossAtTg(*this, pOut); +} + +bool cCcD_UnkAttr::CrossAtTg(cCcD_CpsAttr &cpsAttr, mVec3_c *pOut) { + return Cross(cpsAttr, pOut); +} + +bool cCcD_UnkAttr::CrossAtTg(cCcD_TriAttr &triAttr, mVec3_c *pOut) { + return Cross(triAttr, pOut); +} + +bool cCcD_UnkAttr::CrossAtTg(cCcD_UnkAttr &unkAttr, mVec3_c *pOut) { + return Cross(unkAttr, pOut); +} + +bool cCcD_UnkAttr::CrossAtTg(cCcD_CylAttr &cylAttr, mVec3_c *pOut) { + return Cross(cylAttr, pOut); +} + +bool cCcD_UnkAttr::CrossAtTg(cCcD_SphAttr &sphAttr, mVec3_c *pOut) { + return Cross(sphAttr, pOut); +} + +bool cCcD_UnkAttr::CrossCo(cCcD_ShapeAttr &shapeAttr, f32 *pOut) { + return shapeAttr.CrossCo(*this, pOut); +} + +bool cCcD_UnkAttr::CrossCo(cCcD_CpsAttr &cpsAttr, f32 *pOut) { + mVec3_c pos; + if (cM3dGUnk::Cross(cpsAttr, &pos)) { + cpsAttr.SetVirtCenter(&pos); + *pOut = cpsAttr.CrossCoCommon(*this, mField_0xC4); + mField_0xC4 = 0.0f; + } + return false; +} + +bool cCcD_UnkAttr::CrossCo(cCcD_TriAttr &triAttr, f32 *pOut) { + return false; +} + +bool cCcD_UnkAttr::CrossCo(cCcD_UnkAttr &unkAttr, f32 *pOut) { + return false; +} + +bool cCcD_UnkAttr::CrossCo(cCcD_CylAttr &cylAttr, f32 *pOut) { + return cM3dGUnk::Cross(cylAttr, pOut); +} + +bool cCcD_UnkAttr::CrossCo(cCcD_SphAttr &sphAttr, f32 *pOut) { + return cM3dGUnk::Cross(sphAttr, pOut); +} + +void cCcD_UnkAttr::CalcAabBox() { + mAab.ClearForMinMax(); + mVec3_c start, end; + GetStartEnd(start, end); + mMtx_c &mtx = mMtx; + mVec3_c a; + + a = start; + PSMTXMultVec(mtx, a, a); + mAab.SetMinMax(a); + + a = end; + PSMTXMultVec(mtx, a, a); + mAab.SetMinMax(a); + + a.x = start.x; + a.y = start.y; + a.z = end.z; + PSMTXMultVec(mtx, a, a); + mAab.SetMinMax(a); + + a.x = end.x; + a.y = end.y; + a.z = start.z; + PSMTXMultVec(mtx, a, a); + mAab.SetMinMax(a); +} + +bool cCcD_UnkAttr::GetNVec(const mVec3_c &, mVec3_c *pOut) const { + pOut->set(0.f, 0.f, 0.f); + return false; +} + +void cCcD_UnkAttr::GetPos(nw4r::math::VEC3 *pPos) const { + *pPos = mLin.GetStart(); +} + +void cCcD_UnkAttr::Set(const cCcD_SrcUnkAttr &src) { + mVec3_c min = src.getMin(); + mVec3_c max = src.getMax(); + + cM3dGUnk::Set(min, max); +} + +mVec3_c &cCcD_UnkAttr::GetCoP() { + return mVirtCenter; +} + +void cCcD_UnkAttr::TranslateXZ(f32 x, f32 z) { + cM3dGUnk::fn_80338f30(x, z); +} + +/////////////////////////////////////////////////////////////////////////////// +// Capsule Shape Attribute +/////////////////////////////////////////////////////////////////////////////// + +cCcD_CpsAttr::cCcD_CpsAttr() {} + +cCcD_CpsAttr::~cCcD_CpsAttr() {} + +void cCcD_CpsAttr::Set(const cCcD_SrcCpsAttr &src) { + cM3dGCps::SetR(src.mRadius); + // I dont like this + nw4r::math::VEC3 a; + a.z = 0.0f; + a.y = 0.0f; + a.x = 0.0f; + GetEnd() = GetStart() = a; +} + +mVec3_c &cCcD_CpsAttr::GetCoP() { + return mVirtCenter; +} + +bool cCcD_CpsAttr::CrossAtTg(cCcD_ShapeAttr &shapeAttr, mVec3_c *pOut) { + return shapeAttr.CrossAtTg(*this, pOut); +} + +bool cCcD_CpsAttr::CrossCo(cCcD_ShapeAttr &shapeAttr, f32 *pOut) { + return shapeAttr.CrossCo(*this, pOut); +} + +bool cCcD_CpsAttr::CrossCo(cCcD_TriAttr &triAttr, f32 *pOut) { + return false; +} + +void CalcCyl(const cM3dGCyl &cyl, const mVec3_c &start, const mVec3_c &end, mVec3_c *pOut) { + cM3dGLin lin; + mVec3_c pos; + lin.Set(start, end); + + f32 radius = cyl.GetR(); + f32 height = cyl.GetC().y + cyl.GetH(); + + if (cM3d_Cross_CylLin(cyl, lin, *pOut, pos)) { + return; + } + + if (height < start.y && height < end.y) { + pOut->y = height; + } else if (cyl.GetC().y > start.y && cyl.GetC().y > end.y) { + pOut->y = cyl.GetC().y; + } else { + bool startValid = sLib::isInRange(start.y, cyl.GetC().y, height); + bool endValid = sLib::isInRange(end.y, cyl.GetC().y, height); + if (startValid && endValid) { + pOut->y = (start.y + end.y) * 0.5f; + } else if (startValid) { + pOut->y = start.y; + } else { + pOut->y = end.y; + } + } + mVec3_c start_center = start - cyl.GetC(); + f32 start_dist = EGG::Math::sqrt(start_center.x * start_center.x + start_center.z * start_center.z); + + mVec3_c end_center = end - cyl.GetC(); + f32 end_dist = EGG::Math::sqrt(end_center.x * end_center.x + end_center.z * end_center.z); + + if (start_dist < radius) { + if (end_dist < radius) { + pOut->x = (start.x + end.x) * 0.5f; + pOut->z = (start.z + end.z) * 0.5f; + } else { + pOut->x = start.x; + pOut->z = start.z; + } + } else if (end_dist < radius) { + pOut->x = end.x; + pOut->z = end.z; + } else if (start_dist < end_dist) { + start_center.normalize(); + start_center *= radius; + pOut->x = start_center.x + cyl.GetC().x; + pOut->z = start_center.z + cyl.GetC().z; + } else { + end_center.normalize(); + end_center *= radius; + pOut->x = end_center.x + cyl.GetC().x; + pOut->z = end_center.z + cyl.GetC().z; + } +} + +bool cCcD_CpsAttr::Calc(const mVec3_c &start, const mVec3_c &end, mVec3_c *pOut) { + const mVec3_c &startRef = GetStart(); + const mVec3_c &endRef = GetEnd(); + + mMtx_c mtx0; + mVec3_c tmp0 = GetEnd() - GetStart(); + mVec3_c tmp1; + mVec3_c tmp2; + mVec3_c tmp3; + mVec3_c tmp4; + cM3dGCyl cyl; + bool bInverse; + + f32 dist = EGG::Math::sqrt(tmp0.x * tmp0.x + tmp0.z * tmp0.z); + if (IsZero(dist)) { + tmp1 = start; + tmp2 = end; + if (endRef.y > startRef.y) { + tmp3 = startRef; + tmp4 = endRef; + } else { + tmp3 = endRef; + tmp4 = startRef; + } + bInverse = false; + } else { + PSMTXTrans(mtx0, startRef.x, startRef.y, startRef.z); + mtx0.XrotM(mAng::atan2s(-dist, tmp0.y)); + mtx0.YrotM(mAng::atan2s(-tmp0.x, tmp0.z)); + + mMtx_c mtx1; + + MtxTransMinusXYZ(mtx1, startRef.x, startRef.y, startRef.z); + PSMTXConcat(mtx0, mtx1, mtx0); + PSMTXMultVec(mtx0, start, tmp1); + PSMTXMultVec(mtx0, end, tmp2); + tmp3 = GetStart(); + PSMTXMultVec(mtx0, GetEnd(), tmp4); + bInverse = true; + } + tmp3.y -= GetR() * 0.5f; + tmp4.y += GetR() * 0.5f; + cyl.SetC(tmp3, GetR(), tmp4.y - tmp3.y); + CalcCyl(cyl, tmp1, tmp2, pOut); + if (bInverse) { + PSMTXInverse(mtx0, mtx0); + PSMTXMultVec(mtx0, *pOut, *pOut); + } + return true; +} + +bool cCcD_CpsAttr::CrossAtTg(cCcD_CpsAttr &cpsAttr, mVec3_c *pOut) { + return cM3d_Cross_CpsCps(*this, cpsAttr, pOut, nullptr, nullptr); +} + +bool cCcD_CpsAttr::CrossAtTg(cCcD_CylAttr &cylAttr, mVec3_c *pOut) { + return cM3d_Cross_CpsCyl(*this, cylAttr, pOut); +} + +bool cCcD_CpsAttr::CrossAtTg(cCcD_SphAttr &sphAttr, mVec3_c *pOut) { + return cM3d_Cross_CpsSph(*this, sphAttr, pOut); +} + +bool cCcD_CpsAttr::CrossAtTg(cCcD_TriAttr &triAttr, mVec3_c *pOut) { + return cM3d_Cross_CpsTri(*this, triAttr, pOut); +} + +bool cCcD_CpsAttr::CrossAtTg(cCcD_UnkAttr &unkAttr, mVec3_c *pOut) { + return cM3dGCps::Cross(unkAttr, pOut); +} + +void cCcD_CpsAttr::SetVirtCenter(mVec3_c *pOut) { + if (mField_0x20) { + mVirtCenter = *pOut; + mField_0x20 = 0; + } else { + f32 dist = cM3d_lineVsPosSuisenCross(*this, *pOut, &mVirtCenter); + if (dist < 0.f) { + mVirtCenter = GetStart(); + } else if (dist > 1.f) { + mVirtCenter = GetEnd(); + } + } +} + +f32 cCcD_CpsAttr::CrossCoCommon(cCcD_ShapeAttr &attr, f32 r) { + mVec3_c tmp = mVirtCenter - attr.GetCoP(); + f32 mag = (r + mField_0x1C) - EGG::Math::sqrt(tmp.x * tmp.x + tmp.z * tmp.z); + + if (mag < 0.0f) { + mag = 0.0f; + } + Set_0x1C(mRadius); + return mag; +} + +bool cCcD_CpsAttr::CrossCo(cCcD_CpsAttr &cpsAttr, f32 *pOut) { + mVec3_c pos; + if (cM3d_Cross_CpsCps(*this, cpsAttr, &pos, nullptr, nullptr)) { + SetVirtCenter(&pos); + cpsAttr.SetVirtCenter(&pos); + *pOut = CrossCoCommon(cpsAttr, cpsAttr.mField_0x1C); + cpsAttr.Set_0x1C(cpsAttr.GetR()); + return true; + } + return false; +} + +bool cCcD_CpsAttr::CrossCo(cCcD_CylAttr &cylAttr, f32 *pOut) { + mVec3_c pos; + if (cM3d_Cross_CpsCyl(*this, cylAttr, &pos)) { + SetVirtCenter(&pos); + *pOut = CrossCoCommon(cylAttr, cylAttr.GetR()); + return true; + } + return false; +} + +bool cCcD_CpsAttr::CrossCo(cCcD_SphAttr &sphAttr, f32 *pOut) { + mVec3_c pos; + if (cM3d_Cross_CpsSph(*this, sphAttr, &pos)) { + SetVirtCenter(&pos); + *pOut = CrossCoCommon(sphAttr, sphAttr.GetYDist(pos.y)); + + return true; + } + return false; +} + +bool cCcD_CpsAttr::CrossCo(cCcD_UnkAttr &unkAttr, f32 *pOut) { + mVec3_c pos; + if (cM3dGCps::Cross(unkAttr, &pos)) { + SetVirtCenter(&pos); + *pOut = CrossCoCommon(unkAttr, unkAttr.mField_0xC4); + unkAttr.mField_0xC4 = 0.0f; + return true; + } + return false; +} + +void cCcD_CpsAttr::CalcAabBox() { + mAab.ClearForMinMax(); + mAab.SetMinMax(GetStart()); + mAab.SetMinMax(GetEnd()); + mAab.PlusR(GetR()); +} + +bool cCcD_CpsAttr::GetNVec(const mVec3_c ¶m0, mVec3_c *pOut) const { + mVec3_c tmp1; + PSVECSubtract(GetEnd(), GetStart(), tmp1); + f32 sqMag = PSVECDotProduct(tmp1, tmp1); + if (cM3d_IsZero(sqMag)) { + return false; + } + + mVec3_c tmp2; + PSVECSubtract(param0, GetStart(), tmp2); + f32 sqDist = PSVECDotProduct(tmp2, tmp1) / sqMag; + mVec3_c tmp3; + if (sqDist < 0.f) { + tmp3 = GetStart(); + } else if (sqDist > 1.f) { + tmp3 = GetEnd(); + } else { + PSVECScale(tmp1, tmp1, sqDist); + PSVECAdd(tmp1, GetStart(), tmp3); + } + + PSVECSubtract(param0, tmp3, *pOut); + if (cM3d_IsZero(PSVECMag(*pOut))) { + pOut->set(0.f, 0.f, 0.f); + return false; + } else { + PSVECNormalize(*pOut, *pOut); + return true; + } +} + +void cCcD_CpsAttr::GetPos(nw4r::math::VEC3 *pOut) const { + *pOut = GetStart(); +} + +void cCcD_CpsAttr::GetShapeAccess(cCcD_ShapeAttr::Shape *pShape) const { + pShape->mField_0x00 = SHAPE_CAPSULE; + pShape->mField_0x04 = GetStart(); + pShape->mField_0x10 = GetEnd(); + pShape->mField_0x1C.set(GetR(), 0.f, 0.f); +} + +void cCcD_CpsAttr::TranslateXZ(f32 x, f32 z) { + GetStart().x += x; + GetStart().z += z; + + GetEnd().x += x; + GetEnd().z += z; +} + +/////////////////////////////////////////////////////////////////////////////// +// Cylinder Shape Attribute +/////////////////////////////////////////////////////////////////////////////// + +cCcD_CylAttr::cCcD_CylAttr() {} + +cCcD_CylAttr::~cCcD_CylAttr() {} + +void cCcD_CylAttr::Set(const cCcD_SrcCylAttr &src) { + SetR(src.mRadius); + SetH(src.mHeight); + mVec3_c a; + a.z = 0.0f; + a.y = 0.0f; + a.x = 0.0f; + SetC(a); +} + +mVec3_c &cCcD_CylAttr::GetCoP() { + return mCenter; +} + +bool cCcD_CylAttr::Calc(const mVec3_c ¶m0, const mVec3_c ¶m1, mVec3_c *pOut) { + CalcCyl(*this, param0, param1, pOut); + return true; +} + +bool cCcD_CylAttr::CrossAtTg(cCcD_ShapeAttr &shapeAttr, mVec3_c *pOut) { + return shapeAttr.CrossAtTg(*this, pOut); +} + +bool cCcD_CylAttr::CrossAtTg(cCcD_CpsAttr &cpsAttr, mVec3_c *pOut) { + return cM3d_Cross_CpsCyl(cpsAttr, *this, pOut); +} + +bool cCcD_CylAttr::CrossAtTg(cCcD_CylAttr &cylAttr, mVec3_c *pOut) { + return cM3d_Cross_CylCyl(*this, cylAttr, pOut); +} + +bool cCcD_CylAttr::CrossAtTg(cCcD_SphAttr &sphAttr, mVec3_c *pOut) { + f32 f; + return cM3d_Cross_CylSph(*this, sphAttr, pOut, &f); +} + +bool cCcD_CylAttr::CrossAtTg(cCcD_TriAttr &triAttr, mVec3_c *pOut) { + return cM3d_Cross_CylTri(*this, triAttr, pOut); +} + +bool cCcD_CylAttr::CrossAtTg(cCcD_UnkAttr &unkAttr, mVec3_c *pOut) { + return cM3dGCyl::Cross(unkAttr, pOut); +} + +bool cCcD_CylAttr::CrossCo(cCcD_ShapeAttr &shapeAttr, f32 *pOut) { + return shapeAttr.CrossCo(*this, pOut); +} + +bool cCcD_CylAttr::CrossCo(cCcD_TriAttr &triAttr, f32 *pOut) { + return false; +} + +bool cCcD_CylAttr::CrossCo(cCcD_CylAttr &cylAttr, f32 *pOut) { + return cM3d_Cross_CylCyl(*this, cylAttr, pOut); +} + +bool cCcD_CylAttr::CrossCo(cCcD_SphAttr &sphAttr, f32 *pOut) { + return cM3d_Cross_CylSph(*this, sphAttr, pOut); +} + +bool cCcD_CylAttr::CrossCo(cCcD_CpsAttr &cpsAttr, f32 *pOut) { + mVec3_c pos; + if (cM3d_Cross_CpsCyl(cpsAttr, *this, &pos)) { + cpsAttr.SetVirtCenter(&pos); + *pOut = cpsAttr.CrossCoCommon(*this, GetR()); + return true; + } + return false; +} + +bool cCcD_CylAttr::CrossCo(cCcD_UnkAttr &unkAttr, f32 *pOut) { + cM3dGCyl::Cross(unkAttr, pOut); +} + +void cCcD_CylAttr::CalcAabBox() { + mVec3_c max; + mVec3_c min; + min.x = GetC().x - GetR(); + min.y = GetC().y; + min.z = GetC().z - GetR(); + + max.x = GetC().x + GetR(); + max.y = GetC().y + GetH(); + max.z = GetC().z + GetR(); + mAab.Set(min, max); +} + +bool cCcD_CylAttr::GetNVec(const mVec3_c ¶m0, mVec3_c *pOut) const { + mVec3_c vec; + if (GetC().y > param0.y) { + vec = GetC(); + } else if (GetC().y + GetH() < param0.y) { + vec = GetC(); + vec.y = GetC().y + GetH(); + + } else { + vec = GetC(); + vec.y = param0.y; + } + PSVECSubtract(param0, vec, *pOut); + if (cM3d_IsZero(PSVECMag(*pOut))) { + pOut->set(0.f, 0.f, 0.f); + return false; + } else { + PSVECNormalize(*pOut, *pOut); + return true; + } +} + +void cCcD_CylAttr::GetShapeAccess(cCcD_ShapeAttr::Shape *pShape) const { + pShape->mField_0x00 = SHAPE_CYLINDER; + pShape->mField_0x04 = GetC(); + pShape->mField_0x10 = mVec3_c::Zero; + pShape->mField_0x1C.set(GetR(), GetH(), 0.f); +} + +void cCcD_CylAttr::GetPos(nw4r::math::VEC3 *pOut) const { + *pOut = GetC(); +} + +void cCcD_CylAttr::TranslateXZ(f32 x, f32 z) { + GetC().x += x; + GetC().z += z; +} + +/////////////////////////////////////////////////////////////////////////////// +// Sphere Shape Attribute +/////////////////////////////////////////////////////////////////////////////// + +cCcD_SphAttr::cCcD_SphAttr() {} + +cCcD_SphAttr::~cCcD_SphAttr() {} + +void cCcD_SphAttr::Set(const cCcD_SrcSphAttr &src) { + SetR(src.mRadius); + mVec3_c a; + a.z = 0.0f; + a.y = 0.0f; + a.x = 0.0f; + SetC(&a); +} + +mVec3_c &cCcD_SphAttr::GetCoP() { + return mCenter; +} + +bool cCcD_SphAttr::Calc(const mVec3_c ¶m0, const mVec3_c ¶m1, mVec3_c *pOut) { + cM3dGLin lin; + mVec3_c vec; + lin.Set(param0, param1); + + if (!cM3d_Cross_LinSph_CrossPos(*this, lin, pOut, &vec)) { + mVec3_c a = (param0 + param1) * 0.5f; + f32 f; + cM3d_Len3dSqPntAndSegLine(lin, GetC(), &a, &f, nullptr); + a -= GetC(); + a.normalize(); + f32 radius = GetR(); + *pOut = GetC() + a * radius; + } + return true; +} + +bool cCcD_SphAttr::CrossAtTg(cCcD_ShapeAttr &shapeAttr, mVec3_c *pOut) { + return shapeAttr.CrossAtTg(*this, pOut); +} + +bool cCcD_SphAttr::CrossAtTg(cCcD_CpsAttr &cpsAttr, mVec3_c *pOut) { + return cM3d_Cross_CpsSph(cpsAttr, *this, pOut); +} + +bool cCcD_SphAttr::CrossAtTg(cCcD_CylAttr &cylAttr, mVec3_c *pOut) { + f32 f; + return cM3d_Cross_CylSph(cylAttr, *this, pOut, &f); +} + +bool cCcD_SphAttr::CrossAtTg(cCcD_SphAttr &sphAttr, mVec3_c *pOut) { + return cM3d_Cross_SphSph(sphAttr, *this, pOut); +} + +bool cCcD_SphAttr::CrossAtTg(cCcD_TriAttr &triAttr, mVec3_c *pOut) { + return cM3d_Cross_SphTri(*this, triAttr, pOut, nullptr, nullptr); +} + +bool cCcD_SphAttr::CrossAtTg(cCcD_UnkAttr &unkAttr, mVec3_c *pOut) { + return cM3dGSph::Cross(unkAttr, pOut); +} + +bool cCcD_SphAttr::CrossCo(cCcD_ShapeAttr &shapeAttr, f32 *pOut) { + return shapeAttr.CrossCo(*this, pOut); +} + +bool cCcD_SphAttr::CrossCo(cCcD_TriAttr &triAttr, f32 *pOut) { + return false; +} + +bool cCcD_SphAttr::CrossCo(cCcD_CylAttr &cylAttr, f32 *pOut) { + return cM3d_Cross_CylSph(cylAttr, *this, pOut); +} + +bool cCcD_SphAttr::CrossCo(cCcD_SphAttr &sphAttr, f32 *pOut) { + return cM3d_Cross_SphSph(*this, sphAttr, pOut); +} + +bool cCcD_SphAttr::CrossCo(cCcD_CpsAttr &cpsAttr, f32 *pOut) { + mVec3_c pos; + if (cM3d_Cross_CpsSph(cpsAttr, *this, &pos)) { + cpsAttr.SetVirtCenter(&pos); + *pOut = cpsAttr.CrossCoCommon(*this, cM3dGSph::GetYDist(pos.y)); + return true; + } + return false; +} + +bool cCcD_SphAttr::CrossCo(cCcD_UnkAttr &unkAttr, f32 *pOut) { + return cM3dGSph::Cross(unkAttr, pOut); +} + +void cCcD_SphAttr::CalcAabBox() { + mAab.Set(*this); +} + +bool cCcD_SphAttr::GetNVec(const mVec3_c ¶m0, mVec3_c *param1) const { + param1->x = param0.x - GetC().x; + param1->y = param0.y - GetC().y; + param1->z = param0.z - GetC().z; + if (cM3d_IsZero(PSVECMag(*param1))) { + param1->set(0.0f, 0.0f, 0.0f); + return false; + } else { + PSVECNormalize(*param1, *param1); + return true; + } +} + +void cCcD_SphAttr::GetShapeAccess(cCcD_ShapeAttr::Shape *pShape) const { + pShape->mField_0x00 = SHAPE_SPHERE; + pShape->mField_0x04 = GetC(); + pShape->mField_0x10 = mVec3_c::Zero; + pShape->mField_0x1C.set(GetR(), 0.0f, 0.0f); +} + +void cCcD_SphAttr::GetPos(nw4r::math::VEC3 *pPos) const { + *pPos = GetC(); +} + +bool cCcD_SphAttr::GetPosBool(mVec3_c *pPos) const { + *pPos = GetC(); + return true; +} + +void cCcD_SphAttr::TranslateXZ(f32 x, f32 z) { + GetC().x += x; + GetC().z += z; +} + +/////////////////////////////////////////////////////////////////////////////// +// Attack/Defense/Collide Object Info +/////////////////////////////////////////////////////////////////////////////// + +cCcD_ObjAt::cCcD_ObjAt() { + mField_0x58 = 0; +} + +cCcD_ObjAt::~cCcD_ObjAt() {} + +void cCcD_ObjAt::Set(const cCcD_SrcGObjAt &info) { + mEffCounter = 0; + mSrc = info; + mHitPos = mVec3_c::Zero; +} + +void cCcD_ObjAt::SetAtFlag(u32 flag) { + mSrc.mSPrm = mSrc.mSPrm & ~0x3E | flag; +} + +void cCcD_ObjAt::AdjustHitPos(f32 x, f32 z) { + mHitPos.x += x; + mHitPos.z += z; +} + +cCcD_ObjTg::cCcD_ObjTg() + : mShieldFrontRangeYAngle(nullptr), mField_0x4A(0), mField_0x4B(0), mField_0x4C(0), mField_0x50(0), mField_0x54(0), + mField_0x6C(0.f, 0.f, 0.f), mField_0x78(0) {} + +cCcD_ObjTg::~cCcD_ObjTg() {} + +void cCcD_ObjTg::Set(const cCcD_SrcGObjTg &src) { + mEffCounter = 0; + mSrc = src; + mField_0x4C = 0; + mHitPos = mVec3_c::Zero; + mShieldFrontRangeYAngle = nullptr; + mShieldRange = 0x4000; +} + +void cCcD_ObjTg::AdjustHitPos(f32 x, f32 z) { + mHitPos.x += x; + mHitPos.z += z; + + mField_0x6C.x += x; + mField_0x6C.z += z; +} + +cCcD_ObjCo::cCcD_ObjCo() { + mGrp = 0; + mField_0x28_callback = 0; +} + +cCcD_ObjCo::~cCcD_ObjCo() {} + +void cCcD_ObjCo::Set(const cCcD_SrcGObjCo &src) { + mEffCounter = 0; + mSrc = src; + SetCoFlag(mSrc.mSPrm & 0x1e0); +} + +void cCcD_ObjCo::SetCoFlag(u32 flag) { + mSrc.mSPrm = mSrc.mSPrm & ~0x1E0 | flag; + mGrp = (mSrc.mSPrm & 0x1E0) >> 4; +} + +void cCcD_ObjCo::AdjustHitPos(f32, f32) {} diff --git a/src/d/col/c/c_m3d.cpp b/src/d/col/c/c_m3d.cpp index d23860d9..ca55d2da 100644 --- a/src/d/col/c/c_m3d.cpp +++ b/src/d/col/c/c_m3d.cpp @@ -14,6 +14,7 @@ #include "math.h" #include "nw4r/math/math_types.h" #include "rvl/MTX.h" // IWYU pragma: export +#include "rvl/MTX/vec.h" using namespace nw4r::math; using namespace EGG; @@ -145,38 +146,40 @@ bool cM3d_Cross_LinSph_CrossPos(const cM3dGSph &, const cM3dGLin &, VEC3 *, VEC3 // TODO - returns false to satisfy warning return false; } -bool cM3d_Cross_CylSph(const cM3dGCyl *, const cM3dGSph *, f32 *) { +bool cM3d_Cross_CylSph(const cM3dGCyl &, const cM3dGSph &, f32 *) { // TODO - returns false to satisfy warning return false; } -bool cM3d_Cross_CylSph(const cM3dGCyl *, const cM3dGSph *, VEC3 *, f32 *) { +bool cM3d_Cross_CylSph(const cM3dGCyl &, const cM3dGSph &, VEC3 *, f32 *) { // TODO - returns false to satisfy warning return false; } -bool cM3d_Cross_SphSph(const cM3dGSph *, const cM3dGSph *, f32 *) { +bool cM3d_Cross_SphSph(const cM3dGSph &, const cM3dGSph &, f32 *) { // TODO - returns false to satisfy warning return false; } -bool cM3d_Cross_SphSph(const cM3dGSph *, const cM3dGSph *, f32 *, f32 *) { +bool cM3d_Cross_SphSph(const cM3dGSph &, const cM3dGSph &, f32 *, f32 *) { // TODO - returns false to satisfy warning return false; } -bool cM3d_Cross_SphSph(const cM3dGSph *, const cM3dGSph *, VEC3 *) { +bool cM3d_Cross_SphSph(const cM3dGSph &, const cM3dGSph &, VEC3 *) { // TODO - returns false to satisfy warning return false; } -void cM3d_CalcSphVsTriCrossPoint(const cM3dGSph *pSph, const cM3dGTri *pTri, VEC3 *pPnt) { +void cM3d_CalcSphVsTriCrossPoint(const cM3dGSph &pSph, const cM3dGTri &pTri, VEC3 *pPnt) { VEC3 scale, add; - PSVECAdd(pTri->mA, pTri->mB, add); + PSVECAdd(pTri.mA, pTri.mB, add); PSVECScale(add, scale, 0.5f); - f32 mag = VEC3DistSq(&scale, &pSph->GetC()); + const f32 mag = VEC3DistSq(&scale, &pSph.GetC()); if (cM3d_IsZero(mag)) { - *pPnt = pSph->GetC(); + *pPnt = pSph.GetC(); return; } - f32 a = pSph->GetR() / mag; - cM3d_InDivPos2(&pSph->GetC(), &scale, a, pPnt); + const f32 rad = pSph.GetR(); + f32 a = rad / mag; + + cM3d_InDivPos2(&pSph.GetC(), &scale, a, pPnt); } bool cM3d_Cross_SphTri(const cM3dGSph *, const cM3dGTri *, VEC3 *, f32 *, VEC3 *) { // TODO - returns false to satisfy warning @@ -218,7 +221,7 @@ bool cM3d_Cross_TriTri(const cM3dGTri &, const cM3dGTri &, VEC3 *) { // TODO - returns false to satisfy warning return false; } -bool cM3d_Cross_CpsTri(const cM3dGCps &, cM3dGTri, VEC3 *) { +bool cM3d_Cross_CpsTri(const cM3dGCps &, const cM3dGTri &, VEC3 *) { // TODO - returns false to satisfy warning return false; } @@ -232,7 +235,7 @@ bool cM3d_3PlaneCrossPos(const cM3dGPla &, const cM3dGPla &, const cM3dGPla &, V // TODO - returns false to satisfy warning return false; } -f32 cM3d_lineVsPosSuisenCross(const cM3dGLin *, const VEC3 *, VEC3 *) { +f32 cM3d_lineVsPosSuisenCross(const cM3dGLin &, const VEC3 &, VEC3 *) { // TODO - returns 0.0f to satisfy warning return 0.0f; } @@ -240,3 +243,23 @@ f32 cM3d_lineVsPosSuisenCross(const VEC3 &, const VEC3 &, const VEC3 &, VEC3 *) // TODO - returns 0.0f to satisfy warning return 0.0f; } + +bool cM3d_Normalize(nw4r::math::VEC3 *pPnt) { + f32 mag = PSVECMag(*pPnt); + if (cM3d_IsZero(mag)) { + return true; + } + mag = 1.f / mag; + pPnt->x *= mag; + pPnt->y *= mag; + pPnt->z *= mag; + return false; +} + +void cM3d_Normalize_Ex(nw4r::math::VEC3 *pPnt) { + if (cM3d_Normalize(pPnt)) { + pPnt->x = 1.0f; + pPnt->y = 0.0f; + pPnt->z = 0.0f; + } +} diff --git a/src/d/col/c/c_m3d_g_cps.cpp b/src/d/col/c/c_m3d_g_cps.cpp index 82d14480..cb33b19b 100644 --- a/src/d/col/c/c_m3d_g_cps.cpp +++ b/src/d/col/c/c_m3d_g_cps.cpp @@ -26,8 +26,8 @@ void cM3dGCps::Set(const mVec3_c &start, const mVec3_c &end, f32 r) { SetR(r); } -bool cM3dGCps::fn_80337f30(cM3dGUnk *unk, mVec3_c *vec) { - return fn_80336d90(this, unk, vec); +bool cM3dGCps::Cross(cM3dGUnk &unk, mVec3_c *vec) { + return cM3d_Cross_CpsUnk(*this, unk, vec); } bool cM3dGCps::fn_80337f40(const mVec3_c &v) const { @@ -40,7 +40,7 @@ bool cM3dGCps::fn_80337f40(const mVec3_c &v) const { } f32 tmp; mVec3_c tmpv; - if (cM3d_Len3dSqPntAndSegLine(this, v, tmpv, &tmp, nullptr) && tmp <= r2) { + if (cM3d_Len3dSqPntAndSegLine(*this, v, tmpv, &tmp, nullptr) && tmp <= r2) { return true; } return false; diff --git a/src/d/col/c/c_m3d_g_cyl.cpp b/src/d/col/c/c_m3d_g_cyl.cpp index 6a4bfdf6..9399e192 100644 --- a/src/d/col/c/c_m3d_g_cyl.cpp +++ b/src/d/col/c/c_m3d_g_cyl.cpp @@ -27,12 +27,12 @@ void cM3dGCyl::SetR(f32 r) { mRadius = r; } -bool cM3dGCyl::fn_803380e0(cM3dGUnk *unk, mVec3_c *vec) { - return fn_80336110(this, unk, vec); +bool cM3dGCyl::Cross(cM3dGUnk &unk, mVec3_c *vec) { + return cM3d_Cross_CylUnk(*this, unk, vec); } -bool cM3dGCyl::fn_803380f0(cM3dGUnk *unk, f32 *vec) { - return fn_803364e0(this, unk, vec); +bool cM3dGCyl::Cross(cM3dGUnk &unk, f32 *vec) { + return cM3d_Cross_CylUnk(*this, unk, vec); } bool cM3dGCyl::Cross(const mVec3_c &pnt) const { diff --git a/src/d/col/c/c_m3d_g_pla.cpp b/src/d/col/c/c_m3d_g_pla.cpp index 0773ca4a..a9b87fd2 100644 --- a/src/d/col/c/c_m3d_g_pla.cpp +++ b/src/d/col/c/c_m3d_g_pla.cpp @@ -2,6 +2,8 @@ #include "d/col/c/c_m3d_g_pla.h" #include "d/col/c/c_m3d.h" +#include "m/m_angle.h" +#include "m/m_vec.h" bool cM3dGPla::CrossInfLin(const mVec3_c &start, const mVec3_c &end, mVec3_c &out) const { f32 tmp1 = getPlaneFunc(start); @@ -27,11 +29,11 @@ bool cM3dGPla::getCrossYLessD(const mVec3_c &point, f32 *out) const { } mAng cM3dGPla::GetAngle(mAng ang) const { - mAng angleY = GetAngleY(); - // Regswap + mAng angleY = mNormal.getAngleY(); + angleY = angleY - ang; - f32 dist = GetXZDist() * angleY.cos(); - return cM::atan2s(dist, mNormal.y); + + return cM::atan2s(GetXZDist() * angleY.cos(), mNormal.y); } mAng cM3dGPla::GetNegativeAngle(mAng ang) const { diff --git a/src/d/col/c/c_m3d_g_sph.cpp b/src/d/col/c/c_m3d_g_sph.cpp index cc1d1c1d..5f377f98 100644 --- a/src/d/col/c/c_m3d_g_sph.cpp +++ b/src/d/col/c/c_m3d_g_sph.cpp @@ -27,12 +27,12 @@ void cM3dGSph::SetC(f32 x, f32 y, f32 z) { SetC(&c); } -bool cM3dGSph::fn_80338750(cM3dGUnk *pUnk, mVec3_c *pOut) { - return fn_80337690(pUnk, this, pOut); +bool cM3dGSph::Cross(cM3dGUnk &pUnk, mVec3_c *pOut) { + return cM3d_Cross_UnkSph(pUnk, *this, pOut); } -bool cM3dGSph::fn_80338760(cM3dGUnk *pUnk, f32 *pOut) { - return fn_80337780(pUnk, this, pOut); +bool cM3dGSph::Cross(cM3dGUnk &pUnk, f32 *pOut) { + return cM3d_Cross_UnkSph(pUnk, *this, pOut); } f32 cM3dGSph::GetYDist(f32 r) const { @@ -44,7 +44,7 @@ f32 cM3dGSph::GetYDist(f32 r) const { } bool cM3dGSph::Cross(const cM3dGTri *pTri, f32 *p2, mVec3_c *p3) { - return cM3d_Cross_SphTri(this, pTri, nullptr, p2, p3); + return cM3d_Cross_SphTri(*this, *pTri, nullptr, p2, p3); } void cM3dGSph::Clamp(const mVec3_c &in, mVec3_c &out) const { diff --git a/src/d/col/c/c_m3d_g_unk.cpp b/src/d/col/c/c_m3d_g_unk.cpp index c1e5fe04..776a028a 100644 --- a/src/d/col/c/c_m3d_g_unk.cpp +++ b/src/d/col/c/c_m3d_g_unk.cpp @@ -2,12 +2,14 @@ #include "d/col/c/c_m3d.h" #include "d/col/c/c_m3d_g_aab.h" +#include "m/m_vec.h" +#include "nw4r/types_nw4r.h" cM3dGUnk::cM3dGUnk() { mMin.set(0.0f, 0.0f, 0.0f); mMax.set(0.0f, 0.0f, 0.0f); - mField_0x78.set(0.0f, 0.0f, 0.0f); - mField_0x84.set(0.0f, 0.0f, 0.0f); + mLin.GetStart().set(0.0f, 0.0f, 0.0f); + mLin.GetEnd().set(0.0f, 0.0f, 0.0f); mField_0x90.set(0.0f, 0.0f, 0.0f); mField_0x9C.set(0.0f, 0.0f, 0.0f); mField_0xA8.set(0.0f, 0.0f, 0.0f); @@ -22,9 +24,9 @@ void cM3dGUnk::Set(const mVec3_c &vA, const mVec3_c &vB) { mMin = vA; mMax = vB; - mField_0x84 = (mMin + mMax) * 0.5f; - mField_0x90 = mMin - mField_0x84; - mField_0x9C = mMax - mField_0x84; + mLin.GetEnd() = (mMin + mMax) * 0.5f; + mField_0x90 = mMin - mLin.GetEnd(); + mField_0x9C = mMax - mLin.GetEnd(); mField_0xA8 = (mMax - mMin) * 0.5f; Update(); @@ -34,9 +36,9 @@ void cM3dGUnk::Update() { mVec3_c a, b; PSMTXMultVec(mMtx, mMin, a); PSMTXMultVec(mMtx, mMax, b); - mField_0x78.x = (a.x + b.x) * 0.5f; - mField_0x78.y = (a.y + b.y) * 0.5f; - mField_0x78.z = (a.z + b.z) * 0.5f; + mLin.GetStart().x = (a.x + b.x) * 0.5f; + mLin.GetStart().y = (a.y + b.y) * 0.5f; + mLin.GetStart().z = (a.z + b.z) * 0.5f; if (!PSMTXInverse(mMtx, mInvMtx)) { PSMTXIdentity(mInvMtx); } @@ -47,41 +49,41 @@ void cM3dGUnk::GetStartEnd(mVec3_c &start, mVec3_c &end) { end = mMax; } -void cM3dGUnk::fn_80338c30(cM3dGCps *pCps, mVec3_c *pVec) { - fn_80336d90(pCps, this, pVec); +bool cM3dGUnk::Cross(cM3dGCps &pCps, mVec3_c *pVec) { + return cM3d_Cross_CpsUnk(pCps, *this, pVec); } -bool cM3dGUnk::fn_80338c40(cM3dGUnk *pUnk, mVec3_c *pVec) { +bool cM3dGUnk::Cross(cM3dGTri &pUnk, mVec3_c *pVec) { nw4r::math::VEC3 tmp; - if (fn_803354e0(this, pUnk, &tmp)) { + if (cM3d_Cross_UnkTri(*this, pUnk, &tmp)) { *pVec = tmp; return true; } return false; } -bool cM3dGUnk::fn_80338ca0() { +bool cM3dGUnk::Cross(cM3dGUnk &pUnk, mVec3_c *pVec) { return false; } -bool cM3dGUnk::fn_80338cb0(cM3dGCyl *pCyl, mVec3_c *pVec) { - return fn_80336110(pCyl, this, pVec); +bool cM3dGUnk::Cross(cM3dGCyl &pCyl, mVec3_c *pVec) { + return cM3d_Cross_CylUnk(pCyl, *this, pVec); } -bool cM3dGUnk::fn_80338cc0(cM3dGCyl *pCyl, f32 *pF) { - return fn_803364e0(pCyl, this, pF); +bool cM3dGUnk::Cross(cM3dGCyl &pCyl, f32 *pF) { + return cM3d_Cross_CylUnk(pCyl, *this, pF); } -bool cM3dGUnk::fn_80338cd0(cM3dGSph *pSph, mVec3_c *pVec) { - return fn_80337690(this, pSph, pVec); +bool cM3dGUnk::Cross(cM3dGSph &pSph, mVec3_c *pVec) { + return cM3d_Cross_UnkSph(*this, pSph, pVec); } -bool cM3dGUnk::fn_80338ce0(cM3dGSph *pSph, f32 *pF) { - return fn_80337780(this, pSph, pF); +bool cM3dGUnk::Cross(cM3dGSph &pSph, f32 *pF) { + return cM3d_Cross_UnkSph(*this, pSph, pF); } void cM3dGUnk::Set(const mMtx_c &mtx) { - mMtx.set(mtx); + mMtx.copyFrom(mtx); Update(); } @@ -89,7 +91,7 @@ void cM3dGUnk::Set(const mVec3_c &vec, const mAng &ang) { mMtx_c mtx; PSMTXIdentity(mtx); mtx.YrotS(ang); - mtx.SetTranslation(vec); + mtx.setTranslation(vec); Set(mtx); } @@ -127,7 +129,7 @@ void cM3dGUnk::Clamp(const mVec3_c &in, mVec3_c &out) { } void cM3dGUnk::fn_80338f30(f32 f0, f32 f1) { - mMtx.xw += f0; - mMtx.zw += f1; + mMtx(0, 3) += f0; + mMtx(2, 3) += f1; Update(); } diff --git a/src/d/col/cc/d_cc_d.cpp b/src/d/col/cc/d_cc_d.cpp index e7c935eb..3524192f 100644 --- a/src/d/col/cc/d_cc_d.cpp +++ b/src/d/col/cc/d_cc_d.cpp @@ -1,373 +1,92 @@ #include "d/col/cc/d_cc_d.h" -#include "d/a/d_a_base.h" -#include "f/f_base_id.h" +#include "d/col/c/c_cc_d.h" #include "m/m_vec.h" +dCcD_Cps::dCcD_Cps() {} +dCcD_Cps::~dCcD_Cps() {} -inline bool cM3d_IsZero(f32 f); - -mVec3_c dCcD_ShapeAttr::m_virtual_center = mVec3_c::Zero; - -dCcD_DivideInfo::dCcD_DivideInfo() {} -dCcD_DivideInfo::~dCcD_DivideInfo() {} - -dCcD_DivideArea::dCcD_DivideArea() {} -dCcD_DivideArea::~dCcD_DivideArea() {} - -void d_cc_d_float_order() { - 1.0f / 32.0f; - 1.0f; - 0.0f; - FLT_EPSILON; - 1.0f / 3.0f; - 1.0e9f; - -1.0e9f; - -1.0f; - 0.5f; -} - -// Very certain -void dCcD_DivideArea::SetArea(cM3dGAab const &aab) { - Set(aab.mMin, aab.mMax); - - mScaledXDiff = 1.0f / 32.0f * (mMax.x - mMin.x); - mXDiffIsZero = cM3d_IsZero(mScaledXDiff); - if (!mXDiffIsZero) { - mInvScaledXDiff = 1.0f / mScaledXDiff; - } - - mScaledYDiff = 1.0f / 32.0f * (mMax.y - mMin.y); - mYDiffIsZero = cM3d_IsZero(mScaledYDiff); - if (!mYDiffIsZero) { - mInvScaledYDiff = 1.0f / mScaledYDiff; - } - - mScaledZDiff = 1.0f / 32.0f * (mMax.z - mMin.z); - mZDiffIsZero = cM3d_IsZero(mScaledZDiff); - if (!mZDiffIsZero) { - mInvScaledZDiff = 1.0f / mScaledZDiff; - } -} - -inline bool cM3d_IsZero(f32 f) { - return fabsf(f) < FLT_EPSILON; -} - -static u32 const l_base[32] = { - 0x00000001, 0x00000003, 0x00000007, 0x0000000F, 0x0000001F, 0x0000003F, 0x0000007F, 0x000000FF, - 0x000001FF, 0x000003FF, 0x000007FF, 0x00000FFF, 0x00001FFF, 0x00003FFF, 0x00007FFF, 0x0000FFFF, - 0x0001FFFF, 0x0003FFFF, 0x0007FFFF, 0x000FFFFF, 0x001FFFFF, 0x003FFFFF, 0x007FFFFF, 0x00FFFFFF, - 0x01FFFFFF, 0x03FFFFFF, 0x07FFFFFF, 0x0FFFFFFF, 0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF, 0xFFFFFFFF, -}; - -// TODO - -UnkCCDStruct::UnkCCDStruct(dAcBase_c *arg) : field_0x00(0), field_0x04(0), field_0x08(0), field_0x0C(0) { - field_0x38 = 0; - field_0x34 = arg; - reset(); -} - -void UnkCCDStruct::postExecute() { - field_0x04 = field_0x00; - field_0x00 = 0; - field_0x0C = field_0x08; - field_0x08 = 0; -} - -void UnkCCDStruct::reset() { - field_0x10 = mVec3_c::Zero; - field_0x1C = mVec3_c::Zero; - posIncrements = mVec3_c::Zero; -} - -fBaseID_e UnkCCDStruct::getId() { - if (field_0x34 != nullptr) { - return field_0x34->unique_ID; - } - return (fBaseID_e)0; -} - -static u32 const sth[] = {0x4B, 0x5A, 0x64, 0x00}; - -u32 UnkCCDStruct::getSomething(int arg) { - if (field_0x38 == 0x0D || arg == 0) { - return 0; - } - - if (field_0x38 == 0 || arg == 0x0D) { - return 100; - } - - if (field_0x38 == arg) { - return 50; - } - - if (field_0x38 == 0x0C || arg == 0x01) { - return 0; - } - - if (field_0x38 == 1 || arg == 0x0C) { - return 100; - } - - arg = arg - field_0x38; - if (arg > 0) { - return sth[(arg <= 3 ? arg : 3) - 1]; - } else { - return 100 - sth[(-arg <= 3 ? -arg : 3) - 1]; - } -} - -dCcD_GAtTgCoCommonBase::dCcD_GAtTgCoCommonBase() : field_0x00(0), field_0x14(0), mEffCounter(0) {} - -dCcD_GAtTgCoCommonBase::~dCcD_GAtTgCoCommonBase() { - unlink(); - field_0x14 = 0; - unlink(); - decreaseCount(); - field_0x00 = 0; -} - -void dCcD_GAtTgCoCommonBase::unlink() { - mActor.unlink(); -} - -void dCcD_GAtTgCoCommonBase::setActor(dAcBase_c *actor) { - field_0x14 |= 1; - mActor.link(actor); -} - -dAcBase_c *dCcD_GAtTgCoCommonBase::getActor() { - return mActor.get(); -} - -void dCcD_GAtTgCoCommonBase::decreaseCount() { - if (mEffCounter <= 0) { - return; - } - mEffCounter--; -} - -dCcD_GObjInf::dCcD_GObjInf() { - field_0x104 = nullptr; - field_0x108 = 0; -} - -dCcD_GObjInf::~dCcD_GObjInf() { - field_0x104 = nullptr; -} - -bool dCcD_GObjInf::weirdConditionCheck(dAcBase_c *ac, u32 arg) { - return ac != nullptr && ac->isActorPlayer() && arg == 2; +void dCcD_Cps::Set(const dCcD_SrcCps &src) { + cCcD_Obj::Set(src.mObjInf); + cCcD_CpsAttr::Set(src.mCpsInf); } -void dCcD_GObjInf::clear() { - mGObjAt.clearFlag(); - mGObjTg.clearFlag(); - mGObjCo.clearFlag(); +cCcD_ShapeAttr *dCcD_Cps::GetShapeAttr() { + return this; } -void dCcD_GObjInf::init(const dCcD_SrcGObjInf &src) { - mGObjAt.init(&src.mGObjAt); - mGObjTg.init(&src.mGObjTg); - mGObjCo.init(&src.mGObjCo); +void dCcD_Cps::unknownCalc() { + PSVECSubtract(mEnd, mStart, mAt.mVec); } -void dCcD_GObjInf::ResetAtHit() { - mGObjAt.resetField0x14(); - mGObjAt.unlink(); - mGObjAt.decreaseCount(); - mGObjAt.resetEffCounter(); -} - -void dCcD_GObjInf::ResetTgHit() { - mGObjTg.resetField0x14(); - mGObjTg.unlink(); - mGObjTg.decreaseCount(); - mGObjTg.resetEffCounter(); -} +dCcD_Tri::dCcD_Tri() {} +dCcD_Tri::~dCcD_Tri() {} -void dCcD_GObjInf::ResetCoHit() { - mGObjCo.resetField0x14(); - mGObjCo.unlink(); - mGObjCo.decreaseCount(); - mGObjCo.resetEffCounter(); +void dCcD_Tri::Set(const dCcD_SrcTri &src) { + cCcD_Obj::Set(src.mObjInf); } -mVec3_c *dCcD_GObjInf::GetAtHitPosP() { - return mGObjAt.GetHitPosP(); -} - -mVec3_c *dCcD_GObjInf::GetAtHitPosP2() { - return mGObjAt.GetHitPosP(); -} - -void dCcD_GObjInf::dCcD_GObjInf_0x10() {} - -dAcBase_c *dCcD_GObjInf::GetAtActor() { - return mGObjAt.getActor(); +cCcD_ShapeAttr *dCcD_Tri::GetShapeAttr() { + return this; } -bool dCcD_GObjInf::CheckCollidedMask(u32 mask) { - return (mGObjTg.get0x58() & mask); -} +dCcD_Cyl::dCcD_Cyl() {} +dCcD_Cyl::~dCcD_Cyl() {} -dAcBase_c *dCcD_GObjInf::GetTgActor() { - return mGObjTg.getActor(); +void dCcD_Cyl::Set(const dCcD_SrcCyl &src) { + cCcD_Obj::Set(src.mObjInf); + cCcD_CylAttr::Set(src.mCylInf); } -dAcBase_c *dCcD_GObjInf::GetCoActor() { - return mGObjCo.getActor(); +cCcD_ShapeAttr *dCcD_Cyl::GetShapeAttr() { + return this; } -void dCcD_GObjInf::adjustHitPos(f32 dx, f32 dz) { - mGObjAt.adjustHitPos(dx, dz); - mGObjTg.adjustHitPos(dx, dz); - mGObjCo.adjustHitPos(dx, dz); +void dCcD_Cyl::setCenter(const mVec3_c &c) { + SetAtVec(mVec3_c::Zero); + SetC(c); } -/** - * - * Geometric shape colliders - * - */ - -dCcD_ShapeAttr::dCcD_ShapeAttr() {} - -dCcD_ShapeAttr::~dCcD_ShapeAttr() {} - -mVec3_c *dCcD_ShapeAttr::getVirtualCenter() { - return &m_virtual_center; +void dCcD_Cyl::moveCenter(const mVec3_c &c) { + SetAtVec(c - GetC()); + SetC(c); } -dCcD_ShapeAttr2::dCcD_ShapeAttr2() {} -dCcD_ShapeAttr2::~dCcD_ShapeAttr2() {} - -dCcD_ShapeAttr5::dCcD_ShapeAttr5() {} -dCcD_ShapeAttr5::~dCcD_ShapeAttr5() {} +dCcD_Sph::dCcD_Sph() {} +dCcD_Sph::~dCcD_Sph() {} -void dCcD_ShapeAttr5::init(const dCcD_SrcAabbAttr &src) { - Set(mVec3_c(src.minX, src.minY, src.minZ), mVec3_c(src.maxX, src.maxY, src.maxZ)); +void dCcD_Sph::Set(const dCcD_SrcSph &src) { + cCcD_Obj::Set(src.mObjInf); + cCcD_SphAttr::Set(src.mSphInf); } -mVec3_c *dCcD_ShapeAttr5::getVirtualCenter() { - return &mVirtCenter; +void dCcD_Sph::setCenter(const mVec3_c &c) { + SetAtVec(mVec3_c::Zero); + SetC(&c); } -dCcD_ShapeAttr1::dCcD_ShapeAttr1() {} -dCcD_ShapeAttr1::~dCcD_ShapeAttr1() {} - -mVec3_c *dCcD_ShapeAttr1::getVirtualCenter() { - return &mVirtualCenter; +void dCcD_Sph::moveCenter(const mVec3_c &c) { + SetAtVec(c - GetC()); + SetC(&c); } -dCcD_ShapeAttr3::dCcD_ShapeAttr3() {} - -dCcD_ShapeAttr3::~dCcD_ShapeAttr3() {} - -void dCcD_ShapeAttr3::init(const dCcD_SrcCylAttr &src) { - SetR(src.mRadius); - SetH(src.mHeight); - mVec3_c v; - v.z = 0.0f; - v.y = 0.0f; - v.x = 0.0f; - SetC(v); +void dCcD_Sph::setCenterAndAtVec(const mVec3_c &a, const mVec3_c &b) { + SetAtVec(b); + SetC(&a); } -mVec3_c *dCcD_ShapeAttr3::getVirtualCenter() { - return &mCenter; +cCcD_ShapeAttr *dCcD_Sph::GetShapeAttr() { + return this; } -dCcD_ShapeAttr4::dCcD_ShapeAttr4() {} -dCcD_ShapeAttr4::~dCcD_ShapeAttr4() {} +dCcD_Unk::dCcD_Unk() {} +dCcD_Unk::~dCcD_Unk() {} -void dCcD_ShapeAttr4::init(const dCcD_SrcSphAttr &src) { - SetR(src.mRadius); - mVec3_c v; - v.z = 0.0f; - v.y = 0.0f; - v.x = 0.0f; - SetC(v); +void dCcD_Unk::Set(const dCcD_SrcUnk &src) { + cCcD_Obj::Set(src.mObjInf); + cCcD_UnkAttr::Set(src.mUnkInf); } -mVec3_c *dCcD_ShapeAttr4::getVirtualCenter() { - return &mCenter; -} - -/** - * - * At/Tg/Co collider - * - */ - -dCcD_GObjAt::dCcD_GObjAt() { - field_0x58 = 0; +cCcD_ShapeAttr *dCcD_Unk::GetShapeAttr() { + return this; } - -dCcD_GObjAt::~dCcD_GObjAt() {} - -void dCcD_GObjAt::init(const dCcD_SrcGObjAt *src) { - mEffCounter = 0; - mSrc = *src; - mHitPos = mVec3_c::Zero; -} - -void dCcD_GObjAt::setSomeAtFlags(u32 flags) { - mSrc.field_0x04 = mSrc.field_0x04 & 0xFFFFFFC1 | flags; -} - -void dCcD_GObjAt::adjustHitPos(f32 dx, f32 dz) { - mHitPos.x += dx; - mHitPos.z += dz; -} - -dCcD_GObjTg::dCcD_GObjTg() { - field_0x44 = 0; - field_0x4A = 0; - field_0x4B = 0; - field_0x4C = 0; - field_0x50 = 0; - field_0x54 = 0; - field_0x6C.x = 0.0f; - field_0x6C.y = 0.0f; - field_0x6C.z = 0.0f; - field_0x78 = 0; -} - -dCcD_GObjTg::~dCcD_GObjTg() {} - -void dCcD_GObjTg::init(const dCcD_SrcGObjTg *src) { - mEffCounter = 0; - mSrc = *src; - field_0x4C = 0; - mHitPos = mVec3_c::Zero; - field_0x44 = 0; - field_0x48 = 0x4000; -} - -void dCcD_GObjTg::adjustHitPos(f32 dx, f32 dz) { - mHitPos.x += dx; - mHitPos.z += dz; - field_0x6C.x += dx; - field_0x6C.z += dz; -} - -dCcD_GObjCo::dCcD_GObjCo() { - field_0x20 = 0; - field_0x28 = 0; -} - -dCcD_GObjCo::~dCcD_GObjCo() {} - -void dCcD_GObjCo::init(const dCcD_SrcGObjCo *src) { - mEffCounter = 0; - mSrc = *src; - setSomeAtFlags(src->mBase.mGFlag & 0x1E0); -} - -void dCcD_GObjCo::setSomeAtFlags(u32 flags) {} - -void dCcD_GObjCo::adjustHitPos(f32 dx, f32 dz) {} diff --git a/src/d/col/cc/d_cc_mass_s.cpp b/src/d/col/cc/d_cc_mass_s.cpp new file mode 100644 index 00000000..02377e71 --- /dev/null +++ b/src/d/col/cc/d_cc_mass_s.cpp @@ -0,0 +1,276 @@ +#include "d/col/cc/d_cc_mass_s.h" + +#include "common.h" +#include "m/m_vec.h" +#include "rvl/MTX/vec.h" + +/////////////////////////////////////////////////////////////////////////////// +// Obj +/////////////////////////////////////////////////////////////////////////////// + +dCcMassS_Obj::dCcMassS_Obj() {} + +dCcMassS_Obj::~dCcMassS_Obj() {} + +void dCcMassS_Obj::Set(cCcD_Obj *p_obj, u8 priority, dCcMassS_ObjCallback callback) { + mpObj = p_obj; + mPriority = priority; + mpCallback = callback; +} + +void dCcMassS_Obj::Clear() { + mpObj = nullptr; + mPriority = 5; + mpCallback = nullptr; + mDivideInfo.Set(0, 0, 0); +} + +/////////////////////////////////////////////////////////////////////////////// +// Hit Info +/////////////////////////////////////////////////////////////////////////////// + +dCcMassS_HitInf::dCcMassS_HitInf() {} + +dCcMassS_HitInf::~dCcMassS_HitInf() {} + +void dCcMassS_HitInf::ClearPointer() { + mpArea = nullptr; + mpAtObj = nullptr; + mpCoObj = nullptr; + mCoHitLen = 0.0f; +} + +/////////////////////////////////////////////////////////////////////////////// +// Manager +/////////////////////////////////////////////////////////////////////////////// + +dCcMassS_Mng::dCcMassS_Mng() { + Ct(); +} + +dCcMassS_Mng ::~dCcMassS_Mng() {} + +void dCcMassS_Mng::Ct() { + field_0x3AA = 0; + mResultCam = 0; + mCamTopPos.x = 0.0f; + mCamTopPos.y = -1000000000.0f; + mCamTopPos.z = 0.0f; + + mCamBottomPos.x = 0.0f; + mCamBottomPos.y = -1000000000.0f; + mCamBottomPos.z = 0.0f; + + Clear(); +} + +void dCcMassS_Mng::SetAttr(f32 radius, f32 height, u8 param_2, u8 param_3) { + mCylAttr.SetR(radius); + mCylAttr.SetH(height); + field_0x3A8 = param_2; + field_0x3A9 = param_3; +} + +void dCcMassS_Mng::Prepare() { + cM3dGAab aab; + aab.ClearForMinMax(); + + for (dCcMassS_Obj *pObj = mMassObjs; pObj < mMassObjs + mMassObjCount; ++pObj) { + cCcD_ShapeAttr *objShape = pObj->GetObj()->GetShapeAttr(); + objShape->CalcAabBox(); + aab.SetMinMax(objShape->GetWorkAab()); + } + + for (dCcMassS_Obj *pObj = mMassAreas; pObj < mMassAreas + mMassAreaCount; ++pObj) { + cCcD_ShapeAttr *objShape = pObj->GetObj()->GetShapeAttr(); + objShape->CalcAabBox(); + aab.SetMinMax(objShape->GetWorkAab()); + } + + if (field_0x3AA & 1) { + mCpsAttr.CalcAabBox(); + aab.SetMinMax(mCpsAttr.GetWorkAab()); + } + + mDivideArea.SetArea(aab); + for (dCcMassS_Obj *pObj = mMassObjs; pObj < mMassObjs + mMassObjCount; ++pObj) { + cCcD_ShapeAttr *objShape = pObj->GetObj()->GetShapeAttr(); + cCcD_DivideInfo *divideInfo = &pObj->GetDivideInfo(); + mDivideArea.CalcDivideInfo(divideInfo, objShape->GetWorkAab()); + } + + for (dCcMassS_Obj *pObj = mMassAreas; pObj < mMassAreas + mMassAreaCount; ++pObj) { + cCcD_ShapeAttr *objShape = pObj->GetObj()->GetShapeAttr(); + cCcD_DivideInfo *divideInfo = &pObj->GetDivideInfo(); + mDivideArea.CalcDivideInfo(divideInfo, objShape->GetWorkAab()); + } + + if (field_0x3AA & 1) { + mDivideArea.CalcDivideInfo(&mDivideInfo, mCpsAttr.GetWorkAab()); + } + + mCamTopPos.x = 0.0f; + mCamTopPos.y = -1000000000.0f; + mCamTopPos.z = 0.0f; + mCamTopDist = 1000000000.0f; + + mCamBottomPos.x = 0.0f; + mCamBottomPos.y = -1000000000.0f; + mCamBottomPos.z = 0.0f; + mCamBottomDist = 1000000000.0f; +} + +u32 dCcMassS_Mng::Chk(mVec3_c *p_xyz, dAcObjBase_c **p_actor, dCcMassS_HitInf *p_hitInf) { + cCcD_DivideInfo divideInfo; + u32 flagsMaybe = 0; + *p_actor = NULL; + + mCylAttr.SetC(*p_xyz); + mCylAttr.CalcAabBox(); + + mDivideArea.CalcDivideInfoOverArea(÷Info, mCylAttr.GetWorkAab()); + p_hitInf->ClearPointer(); + + if (field_0x3A8 & 8) { + for (dCcMassS_Obj *massObj = mMassAreas; massObj < mMassAreas + mMassAreaCount; ++massObj) { + if (massObj->GetDivideInfo().Chk(divideInfo)) { + cCcD_Obj *obj = massObj->GetObj(); + cCcD_ShapeAttr *objShape = obj->GetShapeAttr(); + f32 f; + if (obj->ChkCoSet() && mCylAttr.CrossCo(*objShape, &f)) { + flagsMaybe |= 4; + *p_actor = obj->GetStts()->GetAc(); + if (p_hitInf != NULL) { + p_hitInf->SetAreaHitObj(obj); + } + + if (massObj->GetCallback() != NULL) { + massObj->GetCallback()(obj->GetStts()->GetAc(), p_xyz, field_0x3A9); + } + } + } + } + } + + for (dCcMassS_Obj *massObj = mMassObjs; massObj < mMassObjs + mMassObjCount; ++massObj) { + if (massObj->GetDivideInfo().Chk(divideInfo)) { + cCcD_Obj *obj = massObj->GetObj(); + cCcD_ShapeAttr *objShape = obj->GetShapeAttr(); + mVec3_c unusedVec; + if (obj->ChkAtSet() && !obj->ChkAtNoMass() && (field_0x3A8 & 1)) { + *p_actor = obj->GetStts()->GetAc(); + } + if (obj->ChkAtSet() && !obj->ChkAtNoMass() && mCylAttr.CrossAtTg(*objShape, &unusedVec) && + (field_0x3A8 & 1)) { + flagsMaybe |= 1; + *p_actor = obj->GetStts()->GetAc(); + if (p_hitInf != NULL) { + p_hitInf->SetAtHitObj(obj); + } + } + + f32 f; + if (obj->ChkCoSet() && mCylAttr.CrossCo(*objShape, &f) && (field_0x3A8 & 2)) { + flagsMaybe |= 2; + *p_actor = obj->GetStts()->GetAc(); + + if (field_0x3A8 & 0x10) { + mVec3_c vec; + PSVECSubtract((*p_actor)->GetPostion(), *p_xyz, vec); + vec.y = 0; + f32 vecMag = PSVECMag(vec); + if (cM3d_IsZero(vecMag)) { + vec.x = 1; + } else { + PSVECScale(vec, vec, f / vecMag); + } + obj->GetStts()->PlusCcMove(vec.x, vec.y, vec.z); + } + + if (p_hitInf != NULL) { + p_hitInf->SetCoHitObj(obj); + p_hitInf->SetCoHitLen(f); + } + } + } + } + + f32 f; + if ((field_0x3AA & 1) && mDivideInfo.Chk(divideInfo) && mCylAttr.CrossCo(mCpsAttr, &f)) { + mResultCam |= 1; + mResultCam |= 1 << (field_0x3A9 + 1); + + if ((mResultCam & 2) || (mResultCam & 8)) { + Vec tmpVec; + f32 plusH = p_xyz->y + mCylAttr.GetH(); + tmpVec.x = p_xyz->x; + tmpVec.y = plusH; + tmpVec.z = p_xyz->z; + + if (mCamTopPos.y < (20.0f + plusH)) { + f32 newCamTopDist = PSVECSquareDistance(&tmpVec, *mCpsAttr.GetStartP()); + if (mCamTopDist > newCamTopDist) { + mCamTopDist = newCamTopDist; + mCamTopPos = tmpVec; + } + } + + if (mCamBottomPos.y < (20.0f + plusH)) { + f32 newCamBottomDist = PSVECSquareDistance(&tmpVec, *mCpsAttr.GetEndP()); + if (mCamBottomDist > newCamBottomDist) { + mCamBottomDist = newCamBottomDist; + mCamBottomPos = tmpVec; + } + } + } + } + + return flagsMaybe; +} + +void dCcMassS_Mng::Clear() { + mMassObjCount = 0; + mMassAreaCount = 0; + + for (int i = 0; i < (s32)ARRAY_LENGTH(mMassObjs); ++i) { + mMassObjs[i].Clear(); + } + + for (int i = 0; i < (s32)ARRAY_LENGTH(mMassAreas); ++i) { + mMassAreas[i].Clear(); + } + + mCylAttr.SetR(0.0f); + mCylAttr.SetH(0.0f); + field_0x3A8 = 0; + field_0x3A9 = 4; +} + +void dCcMassS_Mng::SetObj(cCcD_Obj *p_obj, u8 priority) { + if (mMassObjCount >= (s32)ARRAY_LENGTH(mMassObjs)) { + for (int i = 0; i < (s32)ARRAY_LENGTH(mMassObjs); ++i) { + int prevPrio = mMassObjs[i].GetPriority(); + if (prevPrio > priority || (prevPrio == priority)) { + mMassObjs[i].Set(p_obj, priority, nullptr); + break; + } + } + } else { + mMassObjs[mMassObjCount].Set(p_obj, priority, nullptr); + mMassObjCount++; + } +} + +void dCcMassS_Mng::SetArea(cCcD_Obj *p_obj, u8 priority, dCcMassS_ObjCallback callback) { + if (mMassAreaCount >= (s32)ARRAY_LENGTH(mMassAreas)) { + for (int i = 0; i < (s32)ARRAY_LENGTH(mMassAreas); ++i) { + if (mMassAreas[i].GetPriority() > priority) { + mMassAreas[i].Set(p_obj, priority, callback); + break; + } + } + } else { + mMassAreas[mMassAreaCount].Set(p_obj, priority, callback); + mMassAreaCount++; + } +} diff --git a/src/d/col/cc/d_cc_s.cpp b/src/d/col/cc/d_cc_s.cpp new file mode 100644 index 00000000..8889c876 --- /dev/null +++ b/src/d/col/cc/d_cc_s.cpp @@ -0,0 +1,180 @@ +#include "d/col/cc/d_cc_s.h" + +#include "common.h" +#include "d/a/obj/d_a_obj_base.h" +#include "d/col/c/c_cc_d.h" +#include "d/col/c/c_m3d_g_aab.h" +#include "f/f_base.h" +#include "rvl/MTX/mtx.h" + +dCcS *dCcS::sInstance; + +dCcS *dCcS::GetInstance() { + return sInstance; +} + +void dCcS::Ct_cCcS() { + for (cCcD_Obj **end = mpObjAt + ARRAY_LENGTH(mpObjAt), **obj = mpObjAt; obj < end; ++obj) { + *obj = nullptr; + } + mObjAtCount = 0; + + for (cCcD_Obj **end = mpObjTg + ARRAY_LENGTH(mpObjTg), **obj = mpObjTg; obj < end; ++obj) { + *obj = nullptr; + } + mObjTgCount = 0; + + for (cCcD_Obj **end = mpObjCo + ARRAY_LENGTH(mpObjCo), **obj = mpObjCo; obj < end; ++obj) { + *obj = nullptr; + } + mObjCoCount = 0; + + for (cCcD_Obj **end = mpObj + ARRAY_LENGTH(mpObj), **obj = mpObj; obj < end; ++obj) { + *obj = nullptr; + } + mObjCount = 0; + + for (UNKTYPE **end = mpUnk + ARRAY_LENGTH(mpUnk), **obj = mpUnk; obj < end; ++obj) { + *obj = nullptr; + } + mUnkCount = 0; +} + +dCcS::dCcS() { + sInstance = this; +} + +dCcS::~dCcS() { + sInstance = nullptr; +} + +void dCcS::Ct() { + Ct_cCcS(); + mMassMng.Ct(); + ClearArea(); +} + +void dCcS::Dt() { + Ct_cCcS(); + ClearArea(); +} + +bool dCcS::ChkRemoveActor(dAcObjBase_c *pActor) { + bool ret = false; + if (pActor && (pActor->delete_request || pActor->lifecycle_state == fBase_c::TO_BE_DELETED)) { + ret = true; + } + return ret; +} + +bool dCcS::ChkNoHitAtTg(cCcD_Obj *, cCcD_Obj *) {} + +bool dCcS::ChkAtTgCommonHitInf(cCcD_Obj *, cCcD_Obj *) {} + +void dCcS::ChkAtTg() {} + +bool dCcS::ChkNoHitCo(cCcD_Obj *, cCcD_Obj *) {} + +void dCcS::SetCoCommonHitInf(cCcD_Obj *, mVec3_c *, cCcD_Obj *, mVec3_c *, f32) {} + +void dCcS::ChkCo() {} + +bool dCcS::ChkSheildFrontRange(cCcD_Obj *, cCcD_Obj *) {} + +bool dCcS::ChkShield(cCcD_Obj *, cCcD_Obj *, cCcD_ShieldChkCallback *) {} + +bool dCcS::ChkAtTgHitAfterCross(bool, bool, cCcD_Obj *, cCcD_Obj *) {} + +void dCcS::SetCoObjInf(bool, bool, cCcD_Obj *, cCcD_Obj *) {} + +void dCcS::SetPosCorrect(cCcD_Obj *, mVec3_c *, cCcD_Obj *, mVec3_c *, f32) {} + +void dCcS::CalcParticleAngle(cCcD_Obj *, cCcD_Obj *, mAng3_c *, bool) {} + +void dCcS::fn_80356fd0(mVec3_c *, cCcD_Obj *, cCcD_Obj *) {} + +u32 dCcS::ProcAtTgHitmark(cCcD_Obj *, cCcD_Obj *, mVec3_c *, u32, mVec3_c *) {} + +void dCcS::SetAtTgObjInf(bool, bool, cCcD_Obj *, cCcD_Obj *, mVec3_c *, bool) {} + +bool dCcS::ChkCamera(mVec3_c &, mVec3_c &, dAcObjBase_c *, dAcObjBase_c *, dAcObjBase_c *, f32) {} + +bool dCcS::ChkCameraPoint( + const mVec3_c &, const mVec3_c &, mVec3_c &, dAcObjBase_c *, dAcObjBase_c *, dAcObjBase_c *, f32 +) {} + +bool dCcS::ChkCo(const mVec3_c &, dAcObjBase_c *) {} + +bool dCcS::fn_80357c90(const mVec3_c &, const mVec3_c &, u32, UNKTYPE **) {} + +void dCcS::Set(cCcD_Obj *) {} + +void dCcS::MoveAfterCheck() {} + +void dCcS::RemoveDeadObj() {} + +void dCcS::CalcArea() { + if (mbAreaSet) { + return; + } + + cM3dGAab aab; + aab.ClearForMinMax(); + for (cCcD_Obj **obj = mpObj; obj < mpObj + mObjCount; ++obj) { + cCcD_ShapeAttr *attr = (*obj)->GetShapeAttr(); + attr->CalcAabBox(); + aab.SetMinMax(attr->GetWorkAab()); + } + // TODO +} + +void dCcS::Move() { + RemoveDeadObj(); + CalcArea(); + ChkAtTg(); + ChkCo(); + for (int i = 0; i < mObjTgCount; ++i) { + mpObjTg[i]->SetTg_0x4B(0); + } + MoveAfterCheck(); + AdjustHitPos(); + mObjAtCount = 0; + mObjTgCount = 0; + mObjCoCount = 0; + mObjCount = 0; + mUnkCount = 0; + mbAreaSet = false; + ClearArea(); +} + +void dCcS::MassClear() { + mMassMng.Clear(); +} + +void dCcS::SetArea(mMtx_c *pMtx) { + if (mAreaCount >= 16) { + return; + } + + // non-match: Huh + mAreas[mAreaCount].mInv = mAreas[mAreaCount].mMtx = *pMtx; + + PSMTXInverse(mAreas[mAreaCount].mInv, mAreas[mAreaCount].mInv); + mAreaCount++; +} + +void dCcS::ClearArea() { + mAreaCount = 0; +} + +extern "C" void *STAGE_MANAGER; +extern "C" bool fn_8019A7A0(void *stg, f32 *, f32 *); +void dCcS::AdjustHitPos() { + f32 x, z; + if (STAGE_MANAGER && fn_8019A7A0(STAGE_MANAGER, &x, &z)) { + for (cCcD_Obj **obj = mpObj; obj < mpObj + mObjCount; ++obj) { + (*obj)->AdjustHitPos(x, z); + (*obj)->GetShapeAttr()->TranslateXZ(x, z); + } + } +} diff --git a/src/d/col/cc/d_cc_shape_colliders.cpp b/src/d/col/cc/d_cc_shape_colliders.cpp deleted file mode 100644 index ad53e574..00000000 --- a/src/d/col/cc/d_cc_shape_colliders.cpp +++ /dev/null @@ -1,108 +0,0 @@ -#include "d/col/cc/d_cc_shape_colliders.h" - -#include "d/col/cc/d_cc_d.h" -#include "m/m_vec.h" - - -dCcD_Unk1::dCcD_Unk1() {} -dCcD_Unk1::~dCcD_Unk1() {} - -void dCcD_Unk1::init(const dCcD_SrcUnk &src) { - dCcD_GObjInf::init(src.mObjInf); - dCcD_ShapeAttr1::init(src.mUnk1Inf); -} - -void *dCcD_Unk1::dCcD_GObjInf_0x0C() { - if (this != nullptr) { - return &UNK_0x00; - } - return this; -} - -void dCcD_Unk1::unknownCalc() { - PSVECSubtract(mCps.mEnd, mCps.mStart, *getAtVec()); -} - -dCcD_Empty::dCcD_Empty() {} -dCcD_Empty::~dCcD_Empty() {} - -void dCcD_Empty::init(const dCcD_SrcEmpty &src) { - dCcD_GObjInf::init(src.mObjInf); -} - -void *dCcD_Empty::dCcD_GObjInf_0x0C() { - if (this != nullptr) { - return &UNK_0x00; - } - return this; -} - -dCcD_Cyl::dCcD_Cyl() {} -dCcD_Cyl::~dCcD_Cyl() {} - -void dCcD_Cyl::init(const dCcD_SrcCyl &src) { - dCcD_GObjInf::init(src.mObjInf); - dCcD_ShapeAttr3::init(src.mCylAttr); -} - -void *dCcD_Cyl::dCcD_GObjInf_0x0C() { - if (this != nullptr) { - return &UNK_0x00; - } - return this; -} - -void dCcD_Cyl::setCenter(const mVec3_c &c) { - setAtVec(mVec3_c::Zero); - SetC(c); -} - -void dCcD_Cyl::moveCenter(const mVec3_c &c) { - setAtVec(c - GetC()); - SetC(c); -} - -dCcD_Sph::dCcD_Sph() {} -dCcD_Sph::~dCcD_Sph() {} - -void dCcD_Sph::init(const dCcD_SrcSph &src) { - dCcD_GObjInf::init(src.mObjInf); - dCcD_ShapeAttr4::init(src.mSphAttr); -} - -void dCcD_Sph::setCenter(const mVec3_c &c) { - setAtVec(mVec3_c::Zero); - SetC(&c); -} - -void dCcD_Sph::moveCenter(const mVec3_c &c) { - setAtVec(c - GetC()); - SetC(&c); -} - -void dCcD_Sph::setCenterAndAtVec(const mVec3_c &a, const mVec3_c &b) { - setAtVec(b); - SetC(&a); -} - -void *dCcD_Sph::dCcD_GObjInf_0x0C() { - if (this != nullptr) { - return &UNK_0x00; - } - return this; -} - -dCcD_Aabb::dCcD_Aabb() {} -dCcD_Aabb::~dCcD_Aabb() {} - -void dCcD_Aabb::init(const dCcD_SrcAabb &src) { - dCcD_GObjInf::init(src.mObjInf); - dCcD_ShapeAttr5::init(src.mAabbAttr); -} - -void *dCcD_Aabb::dCcD_GObjInf_0x0C() { - if (this != nullptr) { - return &UNK_0x00; - } - return this; -} diff --git a/src/m/m3d/m_shadow.cpp b/src/m/m3d/m_shadow.cpp index b95c1f44..01e3d932 100644 --- a/src/m/m3d/m_shadow.cpp +++ b/src/m/m3d/m_shadow.cpp @@ -10,7 +10,6 @@ #include "nw4r/g3d/g3d_scnmdlsmpl.h" #include "nw4r/g3d/g3d_state.h" - // All of this is completely made up, as we don't have symbols for this TU // (contrary to the rest of m3d and most of nw4r::g3d) @@ -362,7 +361,7 @@ void mShadow_c::drawAllShadows() { GXSetCullMode(GX_CULL_BACK); GXSetDither(0); GXSetClipMode(GX_CLIP_DISABLE); - GXLoadPosMtxImm(mMtx_c::Identity.m, 0); + GXLoadPosMtxImm(mMtx_c::Identity, 0); GXSetCurrentMtx(0); Mtx44 mtx; C_MTXOrtho(mtx, 0.0f, wid, 0.0f, wid, 0.0f, 1.0f); @@ -484,7 +483,7 @@ bool mShadowChild_c::addMdl(scnLeaf_c &mdl, const mQuat_c &quat) { if (mdl.getType() == 0) { mdl.getLocalMtx(mtx); } else { - mtx.set(static_cast(mdl).mMtx); + mtx.copyFrom(static_cast(mdl).mMtx); } // TODO this copy is a bit weird (reads members in a different order) @@ -614,7 +613,7 @@ void mCustomShadow_c::calc(mMtx_c mtx, mMtx_c &mtx2) { // TODO some shuffles mVec3_c trans; - mtx2.set(mMtx); + mtx2.copyFrom(mMtx); mVec3_c offset(0.0f, 0.0f, 0.0f); offset.y = field_0x48; PSMTXMultVec(mtx2, offset, trans); diff --git a/src/m/m_angle.cpp b/src/m/m_angle.cpp index 5ec73aa3..77319d48 100644 --- a/src/m/m_angle.cpp +++ b/src/m/m_angle.cpp @@ -1,4 +1,5 @@ #include "m/m_angle.h" + #include "math.h" /** 80575c08 */ diff --git a/tools/decompctx.py b/tools/decompctx.py index a857b8a2..184d4bcd 100644 --- a/tools/decompctx.py +++ b/tools/decompctx.py @@ -21,7 +21,7 @@ include_dirs = [ os.path.join(root_dir, "include"), # Add additional include directories here - os.path.join(root_dir, "src"), + os.path.join(root_dir, "src"), os.path.join(root_dir, "src", "PowerPC_EABI_Support", "MetroTRK"), os.path.join( root_dir, "src", "PowerPC_EABI_Support", "MSL", "MSL_C", "MSL_Common", "Include" From f509c053e5a085d7caf586a2de628429540b15c4 Mon Sep 17 00:00:00 2001 From: robojumper Date: Wed, 6 Nov 2024 02:12:16 +0100 Subject: [PATCH 04/10] Small d/lyt fix (#90) --- config/SOUE01/symbols.txt | 4 ++-- include/d/lyt/d_lyt_do_button.h | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 8c9ad4ef..fe824d86 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -4771,7 +4771,7 @@ __dt__30sFStateFct_c<14dLytDobutton_c>Fv = .text:0x800D8EA0; // type:function si __dt__83sStateMgr_c<14dLytDobutton_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x800D8F10; // type:function size:0xA0 __dt__53sFStateMgr_c<14dLytDobutton_c,20sStateMethodUsr_FI_c>Fv = .text:0x800D8FB0; // type:function size:0xA4 remove__20dLytMeterContainer_cFv = .text:0x800D9060; // type:function size:0x16C -fn_800D91D0 = .text:0x800D91D0; // type:function size:0xE4 +__dt__14dLytDobutton_cFv = .text:0x800D91D0; // type:function size:0xE4 fn_800D92C0 = .text:0x800D92C0; // type:function size:0x48 fn_800D9310 = .text:0x800D9310; // type:function size:0xD8 fn_800D93F0 = .text:0x800D93F0; // type:function size:0x1F0 @@ -4811,7 +4811,7 @@ getLyt__18dLytMeter2Button_cFv = .text:0x800DA520; // type:function size:0x8 getPane__18dLytMeter2Button_cFv = .text:0x800DA530; // type:function size:0x8 getName__18dLytMeter1Button_cCFv = .text:0x800DA540; // type:function size:0x8 getLyt__18dLytMeter1Button_cFv = .text:0x800DA550; // type:function size:0x8 -__dt__14dLytDobutton_cFv = .text:0x800DA560; // type:function size:0x8 +getPane__18dLytMeter1Button_cFv = .text:0x800DA560; // type:function size:0x8 changeState__89sStateMgr_c<20dLytMeterEventSkip_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x800DA570; // type:function size:0x10 changeState__92sStateMgr_c<23dLytMeterGanbariGauge_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x800DA580; // type:function size:0x10 changeState__84sStateMgr_c<15dLytMeterRupy_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x800DA590; // type:function size:0x10 diff --git a/include/d/lyt/d_lyt_do_button.h b/include/d/lyt/d_lyt_do_button.h index f5889433..349230a0 100644 --- a/include/d/lyt/d_lyt_do_button.h +++ b/include/d/lyt/d_lyt_do_button.h @@ -10,7 +10,9 @@ class dLytDobutton_c { dLytDobutton_c() : mStateMgr(*this, sStateID::null) { sInstance = this; } - virtual ~dLytDobutton_c() {} + virtual ~dLytDobutton_c() { + sInstance = nullptr; + } bool init(m2d::ResAccIf_c *resAcc); bool remove(); From c235e32d9513e87ce45c8dc04add547b764957f7 Mon Sep 17 00:00:00 2001 From: Elijah Thomas <42302100+elijah-thomas774@users.noreply.github.com> Date: Wed, 6 Nov 2024 16:36:17 -0500 Subject: [PATCH 05/10] d_a_obj_tumble_weed mostly done (#88) * mostly done * Update d_t_tumble_weed.cpp * remove cM::calcTimer * just regswap on adjustSpeed * Create inlines for angle between vectors * name data symbols --------- Co-authored-by: robojumper --- .../rels/d_a_obj_tumble_weedNP/splits.txt | 3 + .../rels/d_a_obj_tumble_weedNP/symbols.txt | 82 ++-- config/SOUE01/rels/d_t_gekotagNP/symbols.txt | 2 +- config/SOUE01/rels/d_t_touchNP/symbols.txt | 2 +- .../SOUE01/rels/d_t_tumble_weedNP/symbols.txt | 2 +- config/SOUE01/symbols.txt | 21 +- include/c/c_math.h | 7 +- include/d/a/d_a_player.h | 2 +- include/d/a/obj/d_a_obj_base.h | 10 +- include/d/a/obj/d_a_obj_tumble_weed.h | 76 +++- include/d/col/bg/d_bg_pc.h | 12 + include/d/col/bg/d_bg_s_acch.h | 4 + include/d/col/c/c_cc_d.h | 40 +- include/d/col/c/c_m3d_g_pla.h | 4 +- include/d/col/c/c_m3d_g_sph.h | 4 + include/d/t/d_t_tumble_weed.h | 6 +- include/egg/math/eggQuat.h | 51 +-- include/egg/math/eggVector.h | 11 +- include/m/m_angle.h | 45 +- include/m/m_mtx.h | 13 + include/m/m_quat.h | 6 + include/m/m_vec.h | 13 +- include/s/s_Math.h | 8 + src/REL/d/a/obj/d_a_obj_tumble_weed.cpp | 396 +++++++++++++++++- src/REL/d/t/d_t_gekotag.cpp | 7 +- src/REL/d/t/d_t_touch.cpp | 6 +- src/REL/d/t/d_t_tumble_weed.cpp | 20 +- src/d/a/obj/d_a_obj_switch.cpp | 5 +- src/d/col/c/c_m3d_g_pla.cpp | 2 +- src/d/tg/d_t_switch.cpp | 8 +- src/egg/math/eggMatrix.cpp | 110 ++--- src/egg/math/eggQuat.cpp | 34 +- src/m/m3d/m_shadow.cpp | 4 +- src/m/m_angle.cpp | 2 +- 34 files changed, 804 insertions(+), 214 deletions(-) diff --git a/config/SOUE01/rels/d_a_obj_tumble_weedNP/splits.txt b/config/SOUE01/rels/d_a_obj_tumble_weedNP/splits.txt index d9ebe488..50a2ad1e 100644 --- a/config/SOUE01/rels/d_a_obj_tumble_weedNP/splits.txt +++ b/config/SOUE01/rels/d_a_obj_tumble_weedNP/splits.txt @@ -17,3 +17,6 @@ REL/global_destructor_chain.c: REL/d/a/obj/d_a_obj_tumble_weed.cpp: .text start:0x000000F0 end:0x00002278 .ctors start:0x00000000 end:0x00000004 + .rodata start:0x00000000 end:0x000000AC + .data start:0x00000000 end:0x0000024C + .bss start:0x00000008 end:0x000000A0 diff --git a/config/SOUE01/rels/d_a_obj_tumble_weedNP/symbols.txt b/config/SOUE01/rels/d_a_obj_tumble_weedNP/symbols.txt index e1176470..1d94b1d8 100644 --- a/config/SOUE01/rels/d_a_obj_tumble_weedNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_tumble_weedNP/symbols.txt @@ -4,42 +4,42 @@ _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 dAcOTumbleWeed_c_classInit__Fv = .text:0x000000F0; // type:function size:0x118 -fn_475_210 = .text:0x00000210; // type:function size:0x58 +__dt__15dShadowCircle_cFv = .text:0x00000210; // type:function size:0x58 scope:weak __dt__29sFState_c<16dAcOTumbleWeed_c>Fv = .text:0x00000270; // type:function size:0x58 __dt__32sFStateFct_c<16dAcOTumbleWeed_c>Fv = .text:0x000002D0; // type:function size:0x6C __dt__85sStateMgr_c<16dAcOTumbleWeed_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000340; // type:function size:0xA0 __dt__55sFStateMgr_c<16dAcOTumbleWeed_c,20sStateMethodUsr_FI_c>Fv = .text:0x000003E0; // type:function size:0xA4 -fn_475_490 = .text:0x00000490; // type:function size:0x80 -fn_475_510 = .text:0x00000510; // type:function size:0x1D8 +createHeap__16dAcOTumbleWeed_cFv = .text:0x00000490; // type:function size:0x80 +actorCreate__16dAcOTumbleWeed_cFv = .text:0x00000510; // type:function size:0x1D8 changeState__85sStateMgr_c<16dAcOTumbleWeed_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x000006F0; // type:function size:0x10 -fn_475_700 = .text:0x00000700; // type:function size:0x8 -fn_475_710 = .text:0x00000710; // type:function size:0x8 -fn_475_720 = .text:0x00000720; // type:function size:0x314 +actorPostCreate__16dAcOTumbleWeed_cFv = .text:0x00000700; // type:function size:0x8 +doDelete__16dAcOTumbleWeed_cFv = .text:0x00000710; // type:function size:0x8 +actorExecute__16dAcOTumbleWeed_cFv = .text:0x00000720; // type:function size:0x314 executeState__85sStateMgr_c<16dAcOTumbleWeed_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000A40; // type:function size:0x10 -fn_475_A50 = .text:0x00000A50; // type:function size:0x1C -fn_475_A70 = .text:0x00000A70; // type:function size:0xE4 +calcTimer__4sLibFPUs_Us = .text:0x00000A50; // type:function size:0x1C +draw__16dAcOTumbleWeed_cFv = .text:0x00000A70; // type:function size:0xE4 initializeState_Wait__16dAcOTumbleWeed_cFv = .text:0x00000B60; // type:function size:0xC executeState_Wait__16dAcOTumbleWeed_cFv = .text:0x00000B70; // type:function size:0xD4 finalizeState_Wait__16dAcOTumbleWeed_cFv = .text:0x00000C50; // type:function size:0x4 initializeState_Slope__16dAcOTumbleWeed_cFv = .text:0x00000C60; // type:function size:0x4 executeState_Slope__16dAcOTumbleWeed_cFv = .text:0x00000C70; // type:function size:0xA0 finalizeState_Slope__16dAcOTumbleWeed_cFv = .text:0x00000D10; // type:function size:0x4 -fn_475_D20 = .text:0x00000D20; // type:function size:0x118 -fn_475_E40 = .text:0x00000E40; // type:function size:0x1C -fn_475_E60 = .text:0x00000E60; // type:function size:0x11C -fn_475_F80 = .text:0x00000F80; // type:function size:0x6C -fn_475_FF0 = .text:0x00000FF0; // type:function size:0x58 -fn_475_1050 = .text:0x00001050; // type:function size:0x6C -fn_475_10C0 = .text:0x000010C0; // type:function size:0x684 -fn_475_1750 = .text:0x00001750; // type:function size:0x58 -fn_475_17B0 = .text:0x000017B0; // type:function size:0x1A8 -fn_475_1960 = .text:0x00001960; // type:function size:0x68 -fn_475_19D0 = .text:0x000019D0; // type:function size:0xA0 -fn_475_1A70 = .text:0x00001A70; // type:function size:0x88 -fn_475_1B00 = .text:0x00001B00; // type:function size:0x4C -fn_475_1B50 = .text:0x00001B50; // type:function size:0xD0 -fn_475_1C20 = .text:0x00001C20; // type:function size:0x1C -fn_475_1C40 = .text:0x00001C40; // type:function size:0xAC +checkBreak__16dAcOTumbleWeed_cFv = .text:0x00000D20; // type:function size:0x118 +fn_475_E40__16dAcOTumbleWeed_cCFv = .text:0x00000E40; // type:function size:0x1C +checkSlope__16dAcOTumbleWeed_cFv = .text:0x00000E60; // type:function size:0x11C +checkCollect__16dAcOTumbleWeed_cFv = .text:0x00000F80; // type:function size:0x6C +checkInvalidGround__16dAcOTumbleWeed_cCFv = .text:0x00000FF0; // type:function size:0x58 +doBreak__16dAcOTumbleWeed_cFv = .text:0x00001050; // type:function size:0x6C +calcMatrix__16dAcOTumbleWeed_cFv = .text:0x000010C0; // type:function size:0x684 +adjustAngle__16dAcOTumbleWeed_cFv = .text:0x00001750; // type:function size:0x58 +adjustSpeed__16dAcOTumbleWeed_cFv = .text:0x000017B0; // type:function size:0x1A8 +tumbleBounceMaybe__16dAcOTumbleWeed_cFv = .text:0x00001960; // type:function size:0x68 +adjustTimeScale__16dAcOTumbleWeed_cFv = .text:0x000019D0; // type:function size:0xA0 +adjustTumble__16dAcOTumbleWeed_cFRC7mVec3_c = .text:0x00001A70; // type:function size:0x88 +setWind__16dAcOTumbleWeed_cFRC7mVec3_c = .text:0x00001B00; // type:function size:0x4C +calcWind__16dAcOTumbleWeed_cFv = .text:0x00001B50; // type:function size:0xD0 +calcTimer__4sLibFPUc_Uc = .text:0x00001C20; // type:function size:0x1C +getPosition__16dAcOTumbleWeed_cCFv = .text:0x00001C40; // type:function size:0xAC __dt__16dAcOTumbleWeed_cFv = .text:0x00001CF0; // type:function size:0x10C getStateID__85sStateMgr_c<16dAcOTumbleWeed_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x00001E00; // type:function size:0x10 build__32sFStateFct_c<16dAcOTumbleWeed_c>FRC12sStateIDIf_c = .text:0x00001E10; // type:function size:0x60 @@ -69,19 +69,21 @@ lbl_475_rodata_5C = .rodata:0x0000005C; // type:object size:0x4 data:float lbl_475_rodata_60 = .rodata:0x00000060; // type:object size:0x4 data:float lbl_475_rodata_64 = .rodata:0x00000064; // type:object size:0x48 data:float g_profile_OBJ_TUMBLE_WEED = .data:0x00000000; // type:object size:0x10 data:4byte -lbl_475_data_10 = .data:0x00000010; // type:object size:0x2C -lbl_475_data_3C = .data:0x0000003C; // type:object size:0x10 -lbl_475_data_4C = .data:0x0000004C; // type:object size:0x24 -lbl_475_data_70 = .data:0x00000070; // type:object size:0x80 -lbl_475_data_F0 = .data:0x000000F0; // type:object size:0x30 -lbl_475_data_120 = .data:0x00000120; // type:object size:0x30 -lbl_475_data_150 = .data:0x00000150; // type:object size:0x18 -lbl_475_data_168 = .data:0x00000168; // type:object size:0x18 -lbl_475_data_180 = .data:0x00000180; // type:object size:0x98 -lbl_475_data_218 = .data:0x00000218; // type:object size:0x34 -__global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global -lbl_475_bss_8 = .bss:0x00000008; // type:object size:0x10 data:4byte -lbl_475_bss_18 = .bss:0x00000018; // type:object size:0x40 data:4byte -lbl_475_bss_58 = .bss:0x00000058; // type:object size:0x30 data:4byte -lbl_475_bss_88 = .bss:0x00000088; // type:object size:0x8 data:byte -lbl_475_bss_90 = .bss:0x00000090; // type:object size:0x10 data:float +sSphSrc__16dAcOTumbleWeed_c = .data:0x00000010; // type:object size:0x2C +lbl_475_data_3C = .data:0x0000003C; // type:object size:0x10 scope:local +lbl_475_data_4C = .data:0x0000004C; // type:object size:0x24 scope:local +__vt__16dAcOTumbleWeed_c = .data:0x00000070; // type:object size:0x80 +__vt__55sFStateMgr_c<16dAcOTumbleWeed_c,20sStateMethodUsr_FI_c> = .data:0x000000F0; // type:object size:0x30 +__vt__85sStateMgr_c<16dAcOTumbleWeed_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x00000120; // type:object size:0x30 +__vt__32sFStateFct_c<16dAcOTumbleWeed_c> = .data:0x00000150; // type:object size:0x14 +__vt__29sFState_c<16dAcOTumbleWeed_c> = .data:0x00000168; // type:object size:0x18 +__vt__15dShadowCircle_c = .data:0x00000180; // type:object size:0xC +lbl_475_data_18C = .data:0x0000018C; // type:object size:0x8C +__vt__31sFStateID_c<16dAcOTumbleWeed_c> = .data:0x00000218; // type:object size:0x34 +__global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global data:4byte +lbl_475_bss_8 = .bss:0x00000008; // type:object size:0xC data:4byte +StateID_Wait__16dAcOTumbleWeed_c = .bss:0x00000018; // type:object size:0x30 data:4byte +lbl_475_bss_40 = .bss:0x00000048; // type:object size:0xC scope:local data:4byte +StateID_Slope__16dAcOTumbleWeed_c = .bss:0x00000058; // type:object size:0x30 data:4byte +@GUARD@draw__16dAcOTumbleWeed_cFv@shadowRot = .bss:0x00000088; // type:object size:0x1 scope:local data:byte +@LOCAL@draw__16dAcOTumbleWeed_cFv@shadowRot = .bss:0x00000090; // type:object size:0x10 scope:local data:float diff --git a/config/SOUE01/rels/d_t_gekotagNP/symbols.txt b/config/SOUE01/rels/d_t_gekotagNP/symbols.txt index 5eb85e03..77fdf8d6 100644 --- a/config/SOUE01/rels/d_t_gekotagNP/symbols.txt +++ b/config/SOUE01/rels/d_t_gekotagNP/symbols.txt @@ -21,7 +21,7 @@ initializeState_Wait__10dTgGekoTagFv = .text:0x00000660; // type:function size:0 executeState_Wait__10dTgGekoTagFv = .text:0x00000670; // type:function size:0x4 finalizeState_Wait__10dTgGekoTagFv = .text:0x00000680; // type:function size:0x4 doExecute__10dTgGekoTagFv = .text:0x00000690; // type:function size:0x1A8 -calcTimer__2cMFPUs_Us = .text:0x00000840; // type:function size:0x1C +calcTimer__4sLibFPUs_Us = .text:0x00000840; // type:function size:0x1C __dt__10dTgGekoTagFv = .text:0x00000860; // type:function size:0xE0 getStateID__79sStateMgr_c<10dTgGekoTag,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x00000940; // type:function size:0x10 build__26sFStateFct_c<10dTgGekoTag>FRC12sStateIDIf_c = .text:0x00000950; // type:function size:0x60 diff --git a/config/SOUE01/rels/d_t_touchNP/symbols.txt b/config/SOUE01/rels/d_t_touchNP/symbols.txt index d5104afe..213edde5 100644 --- a/config/SOUE01/rels/d_t_touchNP/symbols.txt +++ b/config/SOUE01/rels/d_t_touchNP/symbols.txt @@ -17,7 +17,7 @@ executeState__80sStateMgr_c<11dTgTouchTag,20sStateMethodUsr_FI_c,12sFStateFct_c, 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 +calcTimer__4sLibFPUs_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 diff --git a/config/SOUE01/rels/d_t_tumble_weedNP/symbols.txt b/config/SOUE01/rels/d_t_tumble_weedNP/symbols.txt index 5f46264d..eed1849c 100644 --- a/config/SOUE01/rels/d_t_tumble_weedNP/symbols.txt +++ b/config/SOUE01/rels/d_t_tumble_weedNP/symbols.txt @@ -14,7 +14,7 @@ changeState__84sStateMgr_c<15dTgTumbleWeed_c,20sStateMethodUsr_FI_c,12sFStateFct doDelete__15dTgTumbleWeed_cFv = .text:0x00000490; // type:function size:0x8 actorExecute__15dTgTumbleWeed_cFv = .text:0x000004A0; // type:function size:0x48 executeState__84sStateMgr_c<15dTgTumbleWeed_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x000004F0; // type:function size:0x10 -decr__FPUs = .text:0x00000500; // type:function size:0x1C +calcTimer__4sLibFPUs_Us = .text:0x00000500; // type:function size:0x1C draw__15dTgTumbleWeed_cFv = .text:0x00000520; // type:function size:0x8 initializeState_AreaOut__15dTgTumbleWeed_cFv = .text:0x00000530; // type:function size:0x4 executeState_AreaOut__15dTgTumbleWeed_cFv = .text:0x00000540; // type:function size:0xA0 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index fe824d86..6433a981 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -1418,13 +1418,13 @@ fn_80037A30 = .text:0x80037A30; // type:function size:0xCC fn_80037B00 = .text:0x80037B00; // type:function size:0x20 fn_80037B20 = .text:0x80037B20; // type:function size:0x4C fn_80037B70 = .text:0x80037B70; // type:function size:0x1D4 -calcTimer__2cMFPUs_Us = .text:0x80037D50; // type:function size:0x1C +calcTimer__4sLibFPUs_Us = .text:0x80037D50; // type:function size:0x1C fn_80037D70 = .text:0x80037D70; // type:function size:0x158 fn_80037ED0 = .text:0x80037ED0; // type:function size:0x14 fn_80037EF0 = .text:0x80037EF0; // type:function size:0xA4 fn_80037FA0 = .text:0x80037FA0; // type:function size:0x220 fn_800381C0 = .text:0x800381C0; // type:function size:0x2F0 -calcTimer__2cMFPUc_Uc = .text:0x800384B0; // type:function size:0x1C +calcTimer__4sLibFPUc_Uc = .text:0x800384B0; // type:function size:0x1C fn_800384D0 = .text:0x800384D0; // type:function size:0x64 fn_80038540 = .text:0x80038540; // type:function size:0x108 fn_80038650 = .text:0x80038650; // type:function size:0x144 @@ -43853,7 +43853,20 @@ PARTICLE_RESOURCE_ID_MAPPING_721_ = .sdata2:0x8057A952; // type:object size:0x8 PARTICLE_RESOURCE_ID_MAPPING_725_ = .sdata2:0x8057A95A; // type:object size:0x2 data:2byte PARTICLE_RESOURCE_ID_MAPPING_726_ = .sdata2:0x8057A95C; // type:object size:0x1A data:2byte PARTICLE_RESOURCE_ID_MAPPING_739_ = .sdata2:0x8057A976; // type:object size:0x2 data:2byte -PARTICLE_RESOURCE_ID_MAPPING_740_ = .sdata2:0x8057A978; // type:object size:0x1C data:2byte +PARTICLE_RESOURCE_ID_MAPPING_740_ = .sdata2:0x8057A978; // type:object size:0x2 data:2byte +PARTICLE_RESOURCE_ID_MAPPING_741_ = .sdata2:0x8057A97A; // type:object size:0x2 data:2byte +PARTICLE_RESOURCE_ID_MAPPING_742_ = .sdata2:0x8057A97C; // type:object size:0x2 data:2byte +PARTICLE_RESOURCE_ID_MAPPING_743_ = .sdata2:0x8057A97E; // type:object size:0x2 data:2byte +PARTICLE_RESOURCE_ID_MAPPING_744_ = .sdata2:0x8057A980; // type:object size:0x2 data:2byte +PARTICLE_RESOURCE_ID_MAPPING_745_ = .sdata2:0x8057A982; // type:object size:0x2 data:2byte +PARTICLE_RESOURCE_ID_MAPPING_746_ = .sdata2:0x8057A984; // type:object size:0x2 data:2byte +PARTICLE_RESOURCE_ID_MAPPING_747_ = .sdata2:0x8057A986; // type:object size:0x2 data:2byte +PARTICLE_RESOURCE_ID_MAPPING_748_ = .sdata2:0x8057A988; // type:object size:0x2 data:2byte +PARTICLE_RESOURCE_ID_MAPPING_749_ = .sdata2:0x8057A98A; // type:object size:0x2 data:2byte +PARTICLE_RESOURCE_ID_MAPPING_750_ = .sdata2:0x8057A98C; // type:object size:0x2 data:2byte +PARTICLE_RESOURCE_ID_MAPPING_751_ = .sdata2:0x8057A98E; // type:object size:0x2 data:2byte +PARTICLE_RESOURCE_ID_MAPPING_752_ = .sdata2:0x8057A990; // type:object size:0x2 data:2byte +PARTICLE_RESOURCE_ID_MAPPING_753_ = .sdata2:0x8057A992; // type:object size:0x2 data:2byte PARTICLE_RESOURCE_ID_MAPPING_754_ = .sdata2:0x8057A994; // type:object size:0x18 data:2byte PARTICLE_RESOURCE_ID_MAPPING_766_ = .sdata2:0x8057A9AC; // type:object size:0x2 data:2byte PARTICLE_RESOURCE_ID_MAPPING_767_ = .sdata2:0x8057A9AE; // type:object size:0x2 data:2byte @@ -45917,7 +45930,7 @@ lbl_8057CD8C = .sdata2:0x8057CD8C; // type:object size:0x4 data:float sHalfCircleDeg__4mAng = .sdata2:0x8057CD90; // type:object size:0x4 data:float sAngToDeg__4mAng = .sdata2:0x8057CD94; // type:object size:0x4 data:float sAngToRad__4mAng = .sdata2:0x8057CD98; // type:object size:0x4 data:float -NotSure__4mAng = .sdata2:0x8057CD9C; // type:object size:0x4 data:float +sAngToNorm__4mAng = .sdata2:0x8057CD9C; // type:object size:0x4 data:float sDegToRad__4mAng = .sdata2:0x8057CDA0; // type:object size:0x4 data:float sDegToAng__4mAng = .sdata2:0x8057CDA4; // type:object size:0x4 data:float sRadToAng__4mAng = .sdata2:0x8057CDA8; // type:object size:0x4 data:float diff --git a/include/c/c_math.h b/include/c/c_math.h index 9c051d65..8b95bf71 100644 --- a/include/c/c_math.h +++ b/include/c/c_math.h @@ -12,11 +12,8 @@ f32 rndF(f32 max); f32 rndFX(f32 amp); template -T calcTimer(T *value) { - if (*(T *)value != 0) { - *value = *value - 1; - } - return *value; +inline T minMaxLimit(T val, T min, T max) { + return (T)((T)val < (T)min ? (T)min : ((T)val > (T)max ? (T)max : (T)val)); } } // namespace cM diff --git a/include/d/a/d_a_player.h b/include/d/a/d_a_player.h index adfa8a3e..57471a06 100644 --- a/include/d/a/d_a_player.h +++ b/include/d/a/d_a_player.h @@ -179,7 +179,7 @@ class dAcPy_c : public dAcObjBase_c { /* vt 0x284 */ virtual bool isUsingBugnet() const; /* vt 0x288 */ virtual const mVec3_c &getBugNetPos() const; /* vt 0x28C */ virtual void isUsingBugnet1(); - /* vt 0x290 */ virtual void bugNetCollectTreasure(); + /* vt 0x290 */ virtual void bugNetCollectTreasure(u32 itemId); /* vt 0x294 */ virtual void somethingSwitchDials(); /* vt 0x298 */ virtual void vt_0x298(); /* vt 0x29C */ virtual void getDieLargeDamageDir(); diff --git a/include/d/a/obj/d_a_obj_base.h b/include/d/a/obj/d_a_obj_base.h index 97d0e5ed..c492dfdb 100644 --- a/include/d/a/obj/d_a_obj_base.h +++ b/include/d/a/obj/d_a_obj_base.h @@ -4,6 +4,7 @@ #include "d/a/d_a_base.h" #include "d/col/c/c_cc_d.h" #include "d/col/c/c_m3d_g_aab.h" +#include "egg/math/eggMath.h" #include "m/m3d/m_shadow.h" #include "m/m3d/m_smdl.h" #include "m/m_angle.h" @@ -11,7 +12,6 @@ #include "m/m_vec.h" #include "m/types_m.h" - // Size: 0xA8 struct ActorCarryStruct { /* 0x00 */ fLiNdBa_c actorLink; @@ -89,6 +89,14 @@ class dAcObjBase_c : public dAcBase_c { return angle; } + f32 getVelocityMag() const { + return fabsf(nw4r::math::VEC3LenSq(velocity)); + } + + bool isStopped() const { + return getVelocityMag() <= EGG::Math::epsilon(); + } + // could be their own thing? /* 8002de40 */ static void *getOarcFile(const char *oarcName, const char *fileName); /* 8002de60 */ static void *getOarcSubEntry(const char *oarcName, const char *fileName); diff --git a/include/d/a/obj/d_a_obj_tumble_weed.h b/include/d/a/obj/d_a_obj_tumble_weed.h index ccbb2681..21cefe41 100644 --- a/include/d/a/obj/d_a_obj_tumble_weed.h +++ b/include/d/a/obj/d_a_obj_tumble_weed.h @@ -1,20 +1,90 @@ #ifndef D_A_OBJ_TUMBLE_WEED_H #define D_A_OBJ_TUMBLE_WEED_H +#include "common.h" #include "d/a/obj/d_a_obj_base.h" +#include "d/col/bg/d_bg_s_acch.h" +#include "d/col/cc/d_cc_d.h" +#include "d/d_shadow.h" +#include "m/m3d/m_smdl.h" +#include "m/m_mtx.h" +#include "m/m_quat.h" +#include "m/m_vec.h" +#include "nw4r/g3d/g3d_resfile.h" #include "s/s_State.hpp" -#include "s/s_StateMgr.hpp" +#include "toBeSorted/dowsing_target.h" +#include "toBeSorted/time_area_mgr.h" class dAcOTumbleWeed_c : public dAcObjBase_c { public: - dAcOTumbleWeed_c() : mStateMgr(*this, sStateID::null) {} + dAcOTumbleWeed_c() : mDowsingTarget(this, DowsingTarget::SLOT_NONE), mStateMgr(*this, sStateID::null) {} virtual ~dAcOTumbleWeed_c() {} + virtual int doDelete() override; + virtual int draw() override; + virtual bool createHeap() override; + virtual int actorCreate() override; + virtual int actorPostCreate() override; + virtual int actorExecute() override; + + bool checkCollect(); + bool checkBreak(); + void doBreak(); + + void adjustTimeScale(); + void adjustTumble(const mVec3_c &dir); + void calcWind(); + mVec3_c getPosition() const; + void calcMatrix(); + + void adjustAngle(); + void adjustSpeed(); + void tumbleBounceMaybe(); + + void setWind(const mVec3_c &); + + bool checkSlope(); + + bool fn_475_E40() const; + bool checkInvalidGround() const; + + // Look at `isStopped` in dAcObjBase. This may be a diff inline + f32 getWindMag() const { + return fabsf(nw4r::math::VEC3LenSq(mWind)); + } + bool isWindStop() const { + return getWindMag() <= EGG::Math::epsilon(); + } + STATE_FUNC_DECLARE(dAcOTumbleWeed_c, Wait); STATE_FUNC_DECLARE(dAcOTumbleWeed_c, Slope); private: - /* 0x??? */ STATE_MGR_DECLARE(dAcOTumbleWeed_c); + /* 0x330 */ nw4r::g3d::ResFile mResFile; + /* 0x334 */ m3d::smdl_c mMdl; + /* 0x350 */ dShadowCircle_c mShdw; + /* 0x358 */ dCcD_Sph mSph; + /* 0x4A8 */ dBgS_AcchCir mAcchCir; + /* 0x504 */ dBgS_ObjAcch mObjAcch; + /* 0x8B4 */ DowsingTarget mDowsingTarget; + /* 0x8D4 */ STATE_MGR_DECLARE(dAcOTumbleWeed_c); + /* 0x910 */ mQuat_c mField_0x910; + /* 0x920 */ TimeAreaStruct mTimeArea; + /* 0x92C */ mMtx_c mShadowMtx; + /* 0x95C */ mVec3_c mWind; + /* 0x968 */ mVec3_c mField_0x968; + /* 0x974 */ f32 mField_0x974; + /* 0x978 */ f32 mField_0x978; + /* 0x97C */ f32 mField_0x97C; + /* 0x980 */ f32 mField_0x980; + /* 0x984 */ f32 mSpeedTarget; + /* 0x988 */ u16 mTumbleTimer; + /* 0x98A */ u8 mWindTimer; + /* 0x98B */ u8 mField_0x98B; + /* 0x98C */ u8 mField_0x98C; + /* 0x98D */ bool mbOnGround; + + static dCcD_SrcSph sSphSrc; }; #endif diff --git a/include/d/col/bg/d_bg_pc.h b/include/d/col/bg/d_bg_pc.h index 55e2a5cd..23a60965 100644 --- a/include/d/col/bg/d_bg_pc.h +++ b/include/d/col/bg/d_bg_pc.h @@ -27,6 +27,18 @@ enum dBgPc_ECode { /* 0x80000000 */ CODE_UNUSED_8000_0000 = 0x80000000, }; +enum dBgPc_Attribute { + POLY_ATTR_NORMAL = 0, + POLY_ATTR_SLOPE = 1, + POLY_ATTR_LAVA = 7, + POLY_ATTR_SAND_SHALLOW = 9, + POLY_ATTR_SAND_MED = 10, + POLY_ATTR_SAND_DEEP_INSTANT = 11, + POLY_ATTR_WATER = 12, + POLY_ATTR_DAMAGE = 13, + POLY_ATTR_SLOPE_RUN = 15, + POLY_ATTR_SAND_DEEP_SLOW = 16, +}; class dBgPc { public: void setCode(sBgPc &); diff --git a/include/d/col/bg/d_bg_s_acch.h b/include/d/col/bg/d_bg_s_acch.h index 15b6325d..d24402f3 100644 --- a/include/d/col/bg/d_bg_s_acch.h +++ b/include/d/col/bg/d_bg_s_acch.h @@ -488,6 +488,10 @@ class dBgS_Acch : public cBgS_Chk, public dBgS_Chk { return mFlags & GROUND_HIT; } + dBgS_GndChk &GetGnd() { + return mGnd; + } + public: /* 0x040 */ u32 mFlags; /* 0x044 */ mVec3_c *mpPos; diff --git a/include/d/col/c/c_cc_d.h b/include/d/col/c/c_cc_d.h index 3a1796b1..fe7723ec 100644 --- a/include/d/col/c/c_cc_d.h +++ b/include/d/col/c/c_cc_d.h @@ -308,6 +308,10 @@ class cCcD_Stts { dAcObjBase_c *GetAc() { return mpActor; } + + const mVec3_c &GetCcMove() const { + return mCcMove; + } }; struct cCcD_SrcGObjTgInfo { @@ -323,6 +327,36 @@ struct cCcD_SrcGObjTg { /* 0x0E */ u16 mField_0x0E; }; +enum cCcD_AtType_e { + /* 0x 0000 0001 */ AT_TYPE_0x1 = (1 << 0), + /* 0x 0000 0002 */ AT_TYPE_0x2 = (1 << 1), + /* 0x 0000 0004 */ AT_TYPE_0x4 = (1 << 2), + /* 0x 0000 0008 */ AT_TYPE_0x8 = (1 << 3), + /* 0x 0000 0010 */ AT_TYPE_0x10 = (1 << 4), + /* 0x 0000 0020 */ AT_TYPE_0x20 = (1 << 5), + /* 0x 0000 0040 */ AT_TYPE_0x40 = (1 << 6), + /* 0x 0000 0080 */ AT_TYPE_0x80 = (1 << 7), + /* 0x 0000 0100 */ AT_TYPE_0x100 = (1 << 8), + /* 0x 0000 0200 */ AT_TYPE_0x200 = (1 << 9), + /* 0x 0000 0400 */ AT_TYPE_0x400 = (1 << 10), + /* 0x 0000 0800 */ AT_TYPE_0x800 = (1 << 11), + /* 0x 0000 1000 */ AT_TYPE_0x1000 = (1 << 12), + /* 0x 0000 2000 */ AT_TYPE_0x2000 = (1 << 13), + /* 0x 0000 4000 */ AT_TYPE_0x4000 = (1 << 14), + /* 0x 0000 8000 */ AT_TYPE_0x8000 = (1 << 15), + /* 0x 0001 0000 */ AT_TYPE_0x10000 = (1 << 16), + /* 0x 0002 0000 */ AT_TYPE_0x20000 = (1 << 17), + /* 0x 0004 0000 */ AT_TYPE_0x40000 = (1 << 18), + /* 0x 0008 0000 */ AT_TYPE_0x80000 = (1 << 19), + /* 0x 0010 0000 */ AT_TYPE_0x100000 = (1 << 20), + /* 0x 0020 0000 */ AT_TYPE_0x200000 = (1 << 21), + /* 0x 0040 0000 */ AT_TYPE_0x400000 = (1 << 22), + /* 0x 0080 0000 */ AT_TYPE_0x800000 = (1 << 23), + /* 0x 0100 0000 */ AT_TYPE_BUGNET = (1 << 24), + /* 0x 0200 0000 */ AT_TYPE_0x2000000 = (1 << 25), + /* 0x 0400 0000 */ AT_TYPE_0x4000000 = (1 << 26), + /* 0x 0800 0000 */ AT_TYPE_0x8000000 = (1 << 27), +}; enum cCcD_AtModifiers_e { /* 0x 0000 0001 */ AT_MOD_FIRE = (1 << 0), /* 0x 0000 0002 */ AT_MOD_0x2 = (1 << 1), @@ -758,13 +792,13 @@ class cCcD_Obj { } bool ChkTgHit() { - return mTg.MskSPrm(1) != 0 && mTg.GetActor() != nullptr; + return mTg.MskRPrm(1) != 0 && mTg.GetActor() != nullptr; } bool ChkAtHit() { - return mAt.MskSPrm(1) != 0 && mAt.GetActor() != nullptr; + return mAt.MskRPrm(1) != 0 && mAt.GetActor() != nullptr; } bool ChkCoHit() { - return mCo.MskSPrm(1) != 0 && mCo.GetActor() != nullptr; + return mCo.MskRPrm(1) != 0 && mCo.GetActor() != nullptr; } dAcObjBase_c *GetAc() { diff --git a/include/d/col/c/c_m3d_g_pla.h b/include/d/col/c/c_m3d_g_pla.h index 9abe43d8..b7e6d602 100644 --- a/include/d/col/c/c_m3d_g_pla.h +++ b/include/d/col/c/c_m3d_g_pla.h @@ -57,8 +57,8 @@ class cM3dGPla { return EGG::Math::sqrt(mNormal.x * mNormal.x + mNormal.z * mNormal.z); } - mAng GetAngleY() const { - return cM::atan2s(mNormal.x, mNormal.z); + s32 GetAngleY() const { + return mAng(cM::atan2s(mNormal.x, mNormal.z)); } }; diff --git a/include/d/col/c/c_m3d_g_sph.h b/include/d/col/c/c_m3d_g_sph.h index 0dd60c2e..8be04f83 100644 --- a/include/d/col/c/c_m3d_g_sph.h +++ b/include/d/col/c/c_m3d_g_sph.h @@ -16,6 +16,10 @@ class cM3dGSph { void SetR(f32); void SetC(f32, f32, f32); + void SetC(const mVec3_c &p) { + SetC(&p); + } + f32 GetYDist(f32) const; bool Cross(const cM3dGTri *, f32 *, mVec3_c *); void Clamp(const mVec3_c &, mVec3_c &) const; diff --git a/include/d/t/d_t_tumble_weed.h b/include/d/t/d_t_tumble_weed.h index ae343f17..9dc5f39e 100644 --- a/include/d/t/d_t_tumble_weed.h +++ b/include/d/t/d_t_tumble_weed.h @@ -1,10 +1,9 @@ #ifndef D_T_TUMBLE_WEED_H #define D_T_TUMBLE_WEED_H +#include "d/a/obj/d_a_obj_tumble_weed.h" #include "d/t/d_tg.h" -#include "f/f_list_nd.h" #include "s/s_State.hpp" -#include "s/s_StateMgr.hpp" class dTgTumbleWeed_c : public dTg_c { public: @@ -29,8 +28,7 @@ class dTgTumbleWeed_c : public dTg_c { u16 tumbleweedTimer; u16 padding; u16 windTimer; - // TODO dAcObjTumbleWeed - dAcRef_c childTumbleweed; + dAcRef_c childTumbleweed; u16 someField; }; diff --git a/include/egg/math/eggQuat.h b/include/egg/math/eggQuat.h index c7642e79..df67e10d 100644 --- a/include/egg/math/eggQuat.h +++ b/include/egg/math/eggQuat.h @@ -4,31 +4,32 @@ #include "common.h" #include "egg/math/eggVector.h" - namespace EGG { -struct Quatf : public Vector3f { +struct Quatf { Quatf() {} - Quatf(f32 f, Vector3f v) : w(f), Vector3f(v) {} - Quatf(f32 f, f32 x, f32 y, f32 z) : w(f), Vector3f(Vector3f(x, y, z)) {} + Quatf(f32 f, const Vector3f &v) : w(f), v(v) {} + Quatf(f32 f, f32 x, f32 y, f32 z) : w(f), v(Vector3f(x, y, z)) {} ~Quatf() {} friend Quatf operator*(const Quatf &q, const Vector3f &vec) { - Vector3f crossed = q.cross(vec); + Vector3f crossed = q.v.cross(vec); Vector3f scaled = vec * q.w; - Quatf ret = Quatf(-q.Vector3f::dot(vec), crossed + scaled); + Quatf ret = Quatf(-q.v.dot(vec), crossed + scaled); return ret; } - // TODO: Implement - friend Quatf operator*(const Quatf &u, const Quatf &v) { - Vector3f cross = u.cross(v); - Vector3f v_mul_w = u.w * v; - Vector3f u_mul_w = v.w * v; - Vector3f added_2 = u_mul_w + (cross + v_mul_w); - Quatf out = Quatf(u.w * v.w - u.Vector3f::dot(v), added_2); - return out; - }; + friend Quatf operator*(const Quatf &lhs, const Quatf &rhs) { + Vector3f cross = lhs.v.cross(rhs.v); + + Vector3f scaledRhs = lhs.w * rhs.v; + Vector3f tmp0 = cross + scaledRhs; + + Vector3f scaledLhs = rhs.w * lhs.v; + Vector3f tmp1 = tmp0 + scaledLhs; + + return Quatf(lhs.w * rhs.w - lhs.v.dot(rhs.v), tmp1); + } /* 8049b390 */ void set(f32 fw, f32 fx, f32 fy, f32 fz); /* */ void set(f32 f, const Vector3f &vec); @@ -47,27 +48,17 @@ struct Quatf : public Vector3f { /* */ void makeVectorRotationLimit(Vector3f &, Vector3f &, f32); /* 8049bbb0 */ void makeVectorRotation(Vector3f &, Vector3f &); - f32 dot(const Quatf &q) const { - return w * w + q.x * q.x + q.y * q.y + q.z * q.z; - } - f32 length() const { - return Math::sqrt(dot(*this)); - } void multScalar(f32 s) { w *= s; - x *= s; - y *= s; - z *= s; + v.x *= s; + v.y *= s; + v.z *= s; } void setUnit() { set(1.0f, 0.0f, 0.0f, 0.0f); } - // union { - // Vector3f v; - // struct { - // f32 x, y, z; - // }; - // }; + + Vector3f v; f32 w; }; diff --git a/include/egg/math/eggVector.h b/include/egg/math/eggVector.h index c54e6f0d..b0ac18c4 100644 --- a/include/egg/math/eggVector.h +++ b/include/egg/math/eggVector.h @@ -5,7 +5,6 @@ #include "egg/math/eggMath.h" #include "nw4r/math.h" - namespace EGG { struct Vector3f : public nw4r::math::VEC3 { @@ -28,11 +27,11 @@ struct Vector3f : public nw4r::math::VEC3 { } friend Vector3f operator*(f32 f, const Vector3f &v) { - return v.operator*(f); + return Vector3f(v.x * f, v.y * f, v.z * f); } // __pl__Q23EGG8Vector3fCFRCQ23EGG8Vector3f - Vector3f operator+(const Vector3f &v) { + Vector3f operator+(const Vector3f &v) const { return Vector3f(x + v.x, y + v.y, z + v.z); } @@ -96,6 +95,12 @@ struct Vector3f : public nw4r::math::VEC3 { multScalar(1.0f / f); } + f32 angle(const Vector3f &v) const { + f32 a = dot(v); + f32 b = cross(v).length(); + return EGG::Math::abs(EGG::Math::atan2(b, a)); + } + // dot__Q23EGG8Vector3fCFRCQ23EGG8Vector3f f32 dot(const Vector3f &v) const { return x * v.x + y * v.y + z * v.z; diff --git a/include/m/m_angle.h b/include/m/m_angle.h index 2123277b..5500de1c 100644 --- a/include/m/m_angle.h +++ b/include/m/m_angle.h @@ -3,6 +3,8 @@ #include "c/c_math.h" #include "common.h" +#include "m/m_vec.h" +#include "math.h" #include "nw4r/math/math_triangular.h" struct mAng { @@ -13,6 +15,9 @@ struct mAng { static mAng atan2s(f32 a, f32 b) { return mAng(cM::atan2s(a, b)); } + static mAng fromVec(const mVec3_c &other) { + return mAng(cM::atan2s(other.x, other.z)); + } operator s16() const { return mVal; @@ -47,15 +52,53 @@ struct mAng { s16 mVal; + f32 degree() const { + return (360.0f / 65536.0f) * mVal; + } + static mAng fromDeg(f32 deg) { return deg * sDegToAng; } + static s16 angle(const mVec3_c &a, const mVec3_c &b) { + f32 rads = a.angle(b); + return fromRad(rads); + } + + f32 radian() const { + return ((2.f * M_PI) / 65536.0f) * mVal; + } + static s16 fromRad(f32 rad) { + return rad * sRadToAng; + } + + static f32 rad2deg(f32 rad) { + return rad * (360.f / (2.f * M_PI)); + } + static f32 deg2rad(f32 deg) { + return deg * ((2.f * M_PI) / 360.f); + } + static s16 deg2short(f32 deg) { + return deg * (65536.0f / 360.0f); + } + static f32 short2deg(s16 angle) { + return (360.0f / 65536.0f) * angle; + } + static f32 short2rad(s16 angle) { + return ((2.f * M_PI) / 65536.0f) * angle; + } + static f32 short2norm(s16 angle) { + return 3.0517578E-5f * angle; + } + static s16 rad2short(f32 rad) { + return rad * (65536.0f / (2.f * M_PI)); + } + private: static const f32 sHalfCircleDeg; static const f32 sAngToDeg; static const f32 sAngToRad; - static const f32 NotSure; + static const f32 sAngToNorm; static const f32 sDegToRad; static const f32 sDegToAng; static const f32 sRadToAng; diff --git a/include/m/m_mtx.h b/include/m/m_mtx.h index dd4cdf57..e3dabf65 100644 --- a/include/m/m_mtx.h +++ b/include/m/m_mtx.h @@ -8,6 +8,7 @@ #include "m/m_angle.h" #include "m/m_vec.h" #include "nw4r/types_nw4r.h" +#include "rvl/MTX/mtx.h" class mMtx_c : public EGG::Matrix34f { typedef f32 (*MtxRef)[4]; @@ -63,6 +64,18 @@ class mMtx_c : public EGG::Matrix34f { void rot(int, int); // does some werrd operation to rotate the matrix bool quatRelated(); + void trans(const mVec3_c &v) { + PSMTXTrans(*this, v.x, v.y, v.z); + } + void trans(f32 x, f32 y, f32 z) { + PSMTXTrans(*this, x, y, z); + } + + mMtx_c &operator+=(const mMtx_c &rhs) { + PSMTXConcat(*this, rhs, *this); + return *this; + } + public: static mMtx_c Identity; }; diff --git a/include/m/m_quat.h b/include/m/m_quat.h index 10f0e9cf..cf845858 100644 --- a/include/m/m_quat.h +++ b/include/m/m_quat.h @@ -8,6 +8,12 @@ class mQuat_c : public EGG::Quatf { public: mQuat_c() {} mQuat_c(f32 x, f32 y, f32 z, f32 w) : EGG::Quatf(w, x, y, z) {} + mQuat_c &operator=(const EGG::Quatf &rhs) { + v = rhs.v; + w = rhs.w; + return *this; + } + void fn_802F2780(const mQuat_c &other); }; diff --git a/include/m/m_vec.h b/include/m/m_vec.h index f9bf3c48..4e21dafc 100644 --- a/include/m/m_vec.h +++ b/include/m/m_vec.h @@ -3,9 +3,11 @@ #include "c/c_math.h" #include "common.h" +#include "egg/math/eggMath.h" #include "egg/math/eggVector.h" -#include "m/m_angle.h" +#include "nw4r/math/math_types.h" #include "nw4r/types_nw4r.h" +#include "rvl/MTX/vec.h" class mAng; @@ -217,17 +219,16 @@ class mVec3_c : public EGG::Vector3f { void rotY(const mAng &angle); - // ??? - s32 getAngleY() const { - return mAng(cM::atan2s(x, z)); - } - void CopyTo(nw4r::math::VEC3 *p) { p->x = x; p->y = y; p->z = z; } + s16 ang() const { + return cM::atan2s(x * x, z * z); + } + static mVec3_c Zero; static mVec3_c Ex; static mVec3_c Ey; diff --git a/include/s/s_Math.h b/include/s/s_Math.h index 52a173ca..ecaab38a 100644 --- a/include/s/s_Math.h +++ b/include/s/s_Math.h @@ -22,6 +22,14 @@ void addCalcScaled(float *value, float stepSize, float maxStep); int absDiff(short a1, short a2); BOOL chaseUC(u8 *value, u8 target, u8 stepSize); +template +T calcTimer(T *val) { + if (*val != 0) { + *val -= 1; + } + return *val; +} + } // namespace sLib #endif diff --git a/src/REL/d/a/obj/d_a_obj_tumble_weed.cpp b/src/REL/d/a/obj/d_a_obj_tumble_weed.cpp index 7b5d55f8..2ac29f47 100644 --- a/src/REL/d/a/obj/d_a_obj_tumble_weed.cpp +++ b/src/REL/d/a/obj/d_a_obj_tumble_weed.cpp @@ -1,13 +1,403 @@ #include "d/a/obj/d_a_obj_tumble_weed.h" +#include "c/c_math.h" +#include "common.h" +#include "d/a/d_a_player.h" +#include "d/a/obj/d_a_obj_base.h" +#include "d/col/bg/d_bg_s.h" +#include "d/col/bg/d_bg_s_gnd_chk.h" +#include "d/col/c/c_cc_d.h" +#include "d/col/c/c_m3d_g_pla.h" +#include "d/col/cc/d_cc_d.h" +#include "d/col/cc/d_cc_s.h" +#include "egg/math/eggMath.h" +#include "egg/math/eggQuat.h" +#include "f/f_base.h" +#include "m/m_angle.h" +#include "m/m_mtx.h" +#include "m/m_quat.h" +#include "m/m_vec.h" +#include "nw4r/math/math_triangular.h" +#include "rvl/MTX/mtx.h" +#include "rvl/MTX/vec.h" +#include "s/s_Math.h" +#include "toBeSorted/dowsing_target.h" + +void float_ordering() { + const f32 arr[] = {5.f, 15.f, 7.f, 0.5f, 0.1f}; +} + SPECIAL_ACTOR_PROFILE(OBJ_TUMBLE_WEED, dAcOTumbleWeed_c, fProfile::OBJ_TUMBLE_WEED, 0x243, 0, 2); STATE_DEFINE(dAcOTumbleWeed_c, Wait); STATE_DEFINE(dAcOTumbleWeed_c, Slope); -void dAcOTumbleWeed_c::initializeState_Wait() {} -void dAcOTumbleWeed_c::executeState_Wait() {} +dCcD_SrcSph dAcOTumbleWeed_c::sSphSrc = { + /* mObjInf */ + {/* mObjAt */ {0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0}, + /* mObjTg */ {0xFFB77FFF, 0x111, {8, 0x40F}, 0, 0}, + /* mObjCo */ {0xE9}}, + /* mSphInf */ + {60.f}, +}; + +bool dAcOTumbleWeed_c::createHeap() { + mResFile = getOarcResFile("GrassRollDry"); + TRY_CREATE(mMdl.create(mResFile.GetResMdl("GrassRollDry"), &heap_allocator, 0x120, 1, nullptr)); + return true; +} + +int dAcOTumbleWeed_c::actorCreate() { + CREATE_ALLOCATOR(dAcOTumbleWeed_c); + + mObjAcch.Set(this, 1, &mAcchCir); + mAcchCir.SetWall(20.f, 60.f); + mObjAcch.OffClrSpeedY(); + mObjAcch.SetGndThinCellingOff(); + + mStts.SetRank(3); + + mSph.Set(sSphSrc); + mSph.SetStts(mStts); + + mDowsingTarget.initialize(DowsingTarget::SLOT_TREASURE, 0, nullptr, 0.0f); + mDowsingTarget.doRegister(); + + forwardAccel = -2.f; + forwardMaxSpeed = -40.f; + + mField_0x974 = 0.0f; + mField_0x98B = true; + + mWind = mVec3_c::Zero; + + mSpeedTarget = cM::rndFX(2.5f) + 15.f; + mField_0x978 = cM::rndF(40.f); + mField_0x97C = cM::rndFX(0.25f) + 1.f; + mTumbleTimer = (150); + + mField_0x910.set(1.f, 0.f, 0.f, 0.f); + mScale.set(1.f, 1.f, 1.f); + + mStateMgr.changeState(StateID_Wait); + + boundingBox.Set(mVec3_c(-50.f, -20.f, -50.f), mVec3_c(50.f, 60.f, 50.f)); + + return SUCCEEDED; +} + +int dAcOTumbleWeed_c::actorPostCreate() { + return SUCCEEDED; +} + +int dAcOTumbleWeed_c::doDelete() { + return SUCCEEDED; +} + +extern "C" void fn_800247D0(void *, mVec3_c, f32); +extern "C" UNKWORD BLUR_AND_PALETTE_MGR; + +int dAcOTumbleWeed_c::actorExecute() { + if (!mField_0x98C && !isStopped()) { + mField_0x968 = velocity; + mField_0x968.y = 0.0f; + mField_0x968.normalize(); + mField_0x98C = true; + } + + mStateMgr.executeState(); + calcWind(); + + sLib::chase(&mField_0x980, 1.f, 0.1f); + fn_800247D0(&BLUR_AND_PALETTE_MGR, mField_0x968, mField_0x980); + + calcVelocity(); + position += velocity; + position += mStts.GetCcMove(); + + mObjAcch.CrrPos(*dBgS::GetInstance()); + mField_0x974 += position.y - mOldPosition.y; + if (checkCollect()) { + dAcPy_c::LINK->bugNetCollectTreasure(0xA3 /* TODO(Item Id) ITEM_TUMBLEWEED */); + FUN_8002dcd0(); + return SUCCEEDED; + } + if (checkBreak()) { + doBreak(); + return SUCCEEDED; + } + + if (mSph.ChkTgHit() && mSph.ChkTgAtHitType(AT_TYPE_0x10000 | AT_TYPE_0x200)) { + mField_0x974 = 0.f; + adjustTumble(mSph.GetTg_0x2C() * 0.06f); + } + adjustTimeScale(); + + // TODO(mObjectActorFlags) + if (mObjectActorFlags & 0x2) { + // Weak function not being placed right + if (sLib::calcTimer(&mTumbleTimer) == 0) { + FUN_8002dcd0(); + return SUCCEEDED; + } + } else { + mTumbleTimer = 150; + } + mSph.SetC(getPosition()); + mSph.SetR(mScale.x * 60.f); + dCcS::GetInstance()->Set(&mSph); + updateMatrix(); + calcMatrix(); + playSoundEffect1(0xC2C); // TODO(Sound Id) + mMdl.setLocalMtx(mWorldMtx); + mMdl.setScale(mScale); + mMdl.calc(false); + + return SUCCEEDED; +} + +int dAcOTumbleWeed_c::draw() { + drawModelType1(&mMdl); + + static mQuat_c shadowRot(0.f, 30.f, 0.f, 50.f); + if (0.f < mScale.x) { + drawShadow(mShdw, nullptr, mShadowMtx, &shadowRot, -1, -1, -1, -1, -1, position.y - mObjAcch.GetGroundH()); + } + + return SUCCEEDED; +} + +void dAcOTumbleWeed_c::initializeState_Wait() { + mbOnGround = false; +} + +void dAcOTumbleWeed_c::executeState_Wait() { + if (mObjAcch.ChkGroundLanding() && !mbOnGround) { + tumbleBounceMaybe(); + return; + } + + if (!mObjAcch.ChkGndHit()) { + return; + } + + velocity.y = 0.f; + mField_0x974 = 0.f; + if (checkSlope()) { + mStateMgr.changeState(StateID_Slope); + } else { + adjustSpeed(); + if (forwardSpeed < 0.1f) { + mField_0x98B = false; + sLib::chase(&forwardSpeed, 0.f, 0.05f); + } + } +} + void dAcOTumbleWeed_c::finalizeState_Wait() {} + void dAcOTumbleWeed_c::initializeState_Slope() {} -void dAcOTumbleWeed_c::executeState_Slope() {} + +void dAcOTumbleWeed_c::executeState_Slope() { + if (mObjAcch.ChkGroundLanding() && !mbOnGround) { + tumbleBounceMaybe(); + return; + } + + if (!mObjAcch.ChkGndHit()) { + return; + } + + velocity.y = 0.f; + adjustAngle(); + adjustSpeed(); + if (!checkSlope()) { + mStateMgr.changeState(StateID_Wait); + } +} + void dAcOTumbleWeed_c::finalizeState_Slope() {} + +bool dAcOTumbleWeed_c::checkBreak() { + if (mObjAcch.ChkWallHit(nullptr) && forwardSpeed > 5.f) { + return true; + } + + if (mSph.ChkTgHit() && !mSph.ChkTgAtHitType(AT_TYPE_BUGNET)) { + return true; + } + + if (mObjAcch.ChkGndHit() && mField_0x974 < -300.f) { + return true; + } + + if (fn_475_E40()) { + return true; + } + + if (mObjAcch.ChkGndHit() && checkInvalidGround()) { + return true; + } + + return false; +} + +bool dAcOTumbleWeed_c::fn_475_E40() const { + return mField_0x974 < -10000.f; +} + +bool dAcOTumbleWeed_c::checkSlope() { + cM3dGPla pla; + dBgS::GetInstance()->GetTriPla(mObjAcch.mGnd, &pla); + + mAng ang = mAng::angle(mVec3_c::Ey, pla.GetN()); + return sLib::absDiff(ang, 0) > mAng::deg2short(1); +} + +bool dAcOTumbleWeed_c::checkCollect() { + return mSph.ChkTgHit() && mSph.ChkTgAtHitType(AT_TYPE_BUGNET) ? true : false; +} + +bool dAcOTumbleWeed_c::checkInvalidGround() const { + u32 code = dBgS::GetInstance()->GetSpecialCode(mObjAcch.mGnd); + + return code == POLY_ATTR_LAVA || code == POLY_ATTR_SAND_MED || code == POLY_ATTR_SAND_DEEP_INSTANT || + code == POLY_ATTR_SAND_DEEP_SLOW; +} + +extern "C" u16 PARTICLE_RESOURCE_ID_MAPPING_743_; +extern "C" void fn_800298B0(u16, mVec3_c *, mAng3_c *, u32, u32, u32, u32, u32); + +void dAcOTumbleWeed_c::doBreak() { + playSound(0xC2D); // TODO(Sound Id) + mVec3_c pos = getPosition(); + fn_800298B0(PARTICLE_RESOURCE_ID_MAPPING_743_, &pos, nullptr, 0, 0, 0, 0, 0); + deleteRequest(); +} + +void dAcOTumbleWeed_c::calcMatrix() { + if (mField_0x98B) { + f32 vel_mag = PSVECMag(velocity); + f32 f1 = mAng(vel_mag * (mField_0x978 + 200.f)).radian(); + f32 f2 = mAng(vel_mag * 182.0f * 0.2f).radian(); + f32 f0 = mAng(angle.y - rotation.y).radian(); + + mQuat_c q0, q1, q2, q3; + q1.setAxisRotation(mVec3_c::Ey, f0); + q0.setAxisRotation(mVec3_c::Ey, -f0); + q3.setAxisRotation(mVec3_c::Ex, f1); + q2.setAxisRotation(mVec3_c::Ey, f2); + + mField_0x910 = q1 * q3 * q2 * q0 * mField_0x910; + } + + mMtx_c mtx0, mtx1, mtx2; + mShadowMtx.copyFrom(mWorldMtx); + mtx1.trans(getPosition() - position); + mShadowMtx += mtx1; + mtx0.fromQuat(mField_0x910); + mtx2.trans(0.f, 40.f, 0.f); + mWorldMtx += mtx2; + mWorldMtx += mtx0; +} + +void dAcOTumbleWeed_c::adjustAngle() { + cM3dGPla pla; + dBgS::GetInstance()->GetTriPla(mObjAcch.mGnd, &pla); + mVec3_c vel = velocity; // ok? + angle.y = mAng::fromVec(velocity); +} + +void dAcOTumbleWeed_c::adjustSpeed() { + cM3dGPla pla; + + // BUG + // the ground angle calculation happens before retrieving the grounds normal + // this is probably hard to notice due to the little effect it has. + // Effect: + // Tumbleweed slows to the target much quicker than intended + // Tumbleweed speeds to the target + 5.0f much quicker than intended + mAng gndAngle = mAng::angle(mVec3_c::Ey, pla.GetN()); + + dBgS::GetInstance()->GetTriPla(mObjAcch.mGnd, &pla); + + f32 speedStep = 0.5f; + f32 step = gndAngle.cos() * speedStep; + + // Flat Ground or not in the direction of the slope + // Slows down + if (gndAngle < mAng::deg2short(1) || + sLib::absDiff(cM::atan2s(pla.GetN().x, pla.GetN().z), GetAngle().y) > mAng::deg2short(90)) { + sLib::chase(&forwardSpeed, mSpeedTarget, step); + } + // Sloped Ground and in the direction of the slope + // Speeds up + else { + forwardSpeed = cM::minMaxLimit(forwardSpeed + step, mSpeedTarget, mSpeedTarget + 5.0f); + } +} + +void dAcOTumbleWeed_c::tumbleBounceMaybe() { + velocity.y *= -0.75f; + forwardSpeed *= 0.9f; + + if (forwardSpeed < 15.f) { + forwardSpeed = mSpeedTarget; + } + + mbOnGround = false; + if (velocity.y < 5.f) { + velocity.y = 0.f; + mbOnGround = true; + } +} + +void dAcOTumbleWeed_c::adjustTimeScale() { + mTimeArea.check(getRoomId(), GetPostion(), 0, 30.f, 0.1f); + if (0.f < mTimeArea.getDistMaybe()) { + sLib::chase(&mScale.y, 0.f, 0.07f); + mScale.z = mScale.y; + mScale.x = mScale.y; + } else { + sLib::chase(&mScale.y, 1.f, 0.07f); + mScale.z = mScale.y; + mScale.x = mScale.y; + } +} + +void dAcOTumbleWeed_c::adjustTumble(const mVec3_c &dir) { + mField_0x98B = true; + + velocity.x += dir.x; + velocity.z += dir.z; + + forwardSpeed = mField_0x97C * EGG::Math::sqrt(velocity.x * velocity.x + velocity.z * velocity.z); + angle.y = mAng::fromVec(dir); +} + +void dAcOTumbleWeed_c::setWind(const mVec3_c &wind) { + mWind = wind; + mWindTimer = cM::rndInt(10); +} + +void dAcOTumbleWeed_c::calcWind() { + if (!isWindStop() && sLib::calcTimer(&mWindTimer) == 0) { + velocity.y = cM::rndFX(3.0f) + 15.f; + forwardSpeed = cM::rndFX(5.0f) + 15.f; + + mWind = mVec3_c::Zero; + mField_0x980 = 0.f; + } +} + +mVec3_c dAcOTumbleWeed_c::getPosition() const { + mMtx_c mtx; + mVec3_c vec; + mtx.ZXYrotS(rotation.x, rotation.y, rotation.z); + PSMTXMultVecSR(mtx, mVec3_c::Ey, vec); + return position + vec * 40.f; +} + +void float_ordering2() { + const f32 arr[] = {30.f, 0.07f, 20.f, -10000.f, 5.f}; +} diff --git a/src/REL/d/t/d_t_gekotag.cpp b/src/REL/d/t/d_t_gekotag.cpp index 32df5084..0d18f69d 100644 --- a/src/REL/d/t/d_t_gekotag.cpp +++ b/src/REL/d/t/d_t_gekotag.cpp @@ -1,13 +1,12 @@ #include "d/t/d_t_gekotag.h" -#include "c/c_math.h" #include "common.h" #include "d/a/d_a_player.h" #include "d/a/e/d_a_e_geko.h" #include "d/a/obj/d_a_obj_base.h" -#include "f/f_base.h" #include "f/f_profile_name.h" #include "m/m_angle.h" +#include "s/s_Math.h" #pragma explicit_zero_data on static u32 initialRotX = 0; @@ -60,8 +59,8 @@ void dTgGekoTag::executeState_Wait() { void dTgGekoTag::finalizeState_Wait() {} void dTgGekoTag::doExecute() { - cM::calcTimer(&mTimer2); - if (cM::calcTimer(&mTimer1) != 0) { + sLib::calcTimer(&mTimer2); + if (sLib::calcTimer(&mTimer1) != 0) { return; } diff --git a/src/REL/d/t/d_t_touch.cpp b/src/REL/d/t/d_t_touch.cpp index 352f2f54..ac23f2fb 100644 --- a/src/REL/d/t/d_t_touch.cpp +++ b/src/REL/d/t/d_t_touch.cpp @@ -1,9 +1,9 @@ #include "d/t/d_t_touch.h" #include "c/c_math.h" -#include "toBeSorted/area_math.h" #include "d/flag/sceneflag_manager.h" - +#include "s/s_Math.h" +#include "toBeSorted/area_math.h" SPECIAL_ACTOR_PROFILE(TOUCH_TAG, dTgTouchTag, fProfile::TOUCH_TAG, 0x028E, 0, 0); @@ -59,7 +59,7 @@ void dTgTouchTag::executeState_Wait() { actor = static_cast(fManager_c::searchBaseByProfName(ACTIVATORS[mActivatorIndex], actor)); } - if (cM::calcTimer(&mFlagTimer) == 0) { + if (sLib::calcTimer(&mFlagTimer) == 0) { if (mZoneFlag != 0xFF && SceneflagManager::sInstance->checkBoolFlag(roomid, mZoneFlag)) { SceneflagManager::sInstance->unsetFlag(roomid, mZoneFlag); } diff --git a/src/REL/d/t/d_t_tumble_weed.cpp b/src/REL/d/t/d_t_tumble_weed.cpp index 7e3bd710..9c5cc926 100644 --- a/src/REL/d/t/d_t_tumble_weed.cpp +++ b/src/REL/d/t/d_t_tumble_weed.cpp @@ -1,7 +1,7 @@ #include "d/t/d_t_tumble_weed.h" -#include "c/c_math.h" #include "m/m_vec.h" +#include "s/s_Math.h" SPECIAL_ACTOR_PROFILE(TUMBLE_WEED_TAG, dTgTumbleWeed_c, fProfile::TUMBLE_WEED_TAG, 0x0244, 0, 0); @@ -17,32 +17,23 @@ int dTgTumbleWeed_c::create() { return SUCCEEDED; } -u16 decr(u16 *num); - int dTgTumbleWeed_c::doDelete() { return SUCCEEDED; } int dTgTumbleWeed_c::actorExecute() { mStateMgr.executeState(); - decr(&tumbleweedTimer); + sLib::calcTimer(&tumbleweedTimer); return SUCCEEDED; } -u16 decr(u16 *num) { - if (*num != 0) { - (*num)--; - } - return *num; -} - int dTgTumbleWeed_c::draw() { return SUCCEEDED; } void dTgTumbleWeed_c::initializeState_AreaOut() {} void dTgTumbleWeed_c::executeState_AreaOut() { - if (decr(&windTimer) == 0) { + if (sLib::calcTimer(&windTimer) == 0) { windTimer = 0x96; if (shouldDoWind()) { mStateMgr.changeState(StateID_Wind); @@ -63,7 +54,7 @@ void dTgTumbleWeed_c::executeState_AreaIn() { } tumbleweedTimer = 600; } - if (decr(&windTimer) == 0) { + if (sLib::calcTimer(&windTimer) == 0) { windTimer = 0x96; if (shouldDoWind()) { mStateMgr.changeState(StateID_Wind); @@ -76,12 +67,11 @@ void dTgTumbleWeed_c::executeState_AreaIn() { } void dTgTumbleWeed_c::finalizeState_AreaIn() {} -extern "C" void fn_475_1B00(fBase_c *, mVec3_c &); void dTgTumbleWeed_c::initializeState_Wind() { mVec3_c vec; getWind(&vec); if (childTumbleweed.get() != nullptr) { - fn_475_1B00(childTumbleweed.get(), vec); + childTumbleweed.get()->setWind(vec); } } diff --git a/src/d/a/obj/d_a_obj_switch.cpp b/src/d/a/obj/d_a_obj_switch.cpp index 2131d02b..4c3e6ec3 100644 --- a/src/d/a/obj/d_a_obj_switch.cpp +++ b/src/d/a/obj/d_a_obj_switch.cpp @@ -1,12 +1,11 @@ #include "d/a/obj/d_a_obj_switch.h" -#include "c/c_math.h" #include "d/a/d_a_player.h" #include "d/col/bg/d_bg_s.h" #include "d/col/bg/d_bg_w.h" +#include "d/flag/sceneflag_manager.h" #include "nw4r/g3d/g3d_resfile.h" #include "s/s_Math.h" -#include "d/flag/sceneflag_manager.h" SPECIAL_ACTOR_PROFILE(OBJ_SW, dAcOsw_c, fProfile::OBJ_SW, 0x12B, 0, 0x1002); @@ -269,7 +268,7 @@ void dAcOsw_c::executeState_OffWait() { if (field_0x5F1 != 0) { field_0x5F3 = 1; } - if (mSwitchType != 1 && cM::calcTimer(&field_0x5EC) == 0 && field_0x5F3 == 0) { + if (mSwitchType != 1 && sLib::calcTimer(&field_0x5EC) == 0 && field_0x5F3 == 0) { mStateMgr.changeState(StateID_Off); } } diff --git a/src/d/col/c/c_m3d_g_pla.cpp b/src/d/col/c/c_m3d_g_pla.cpp index a9b87fd2..77baea9d 100644 --- a/src/d/col/c/c_m3d_g_pla.cpp +++ b/src/d/col/c/c_m3d_g_pla.cpp @@ -29,7 +29,7 @@ bool cM3dGPla::getCrossYLessD(const mVec3_c &point, f32 *out) const { } mAng cM3dGPla::GetAngle(mAng ang) const { - mAng angleY = mNormal.getAngleY(); + mAng angleY = GetAngleY(); angleY = angleY - ang; diff --git a/src/d/tg/d_t_switch.cpp b/src/d/tg/d_t_switch.cpp index f7c1141b..c7f400da 100644 --- a/src/d/tg/d_t_switch.cpp +++ b/src/d/tg/d_t_switch.cpp @@ -1,8 +1,8 @@ #include "d/t/d_t_switch.h" -#include "c/c_math.h" -#include "toBeSorted/event.h" #include "d/flag/sceneflag_manager.h" +#include "s/s_Math.h" +#include "toBeSorted/event.h" #include "toBeSorted/scgame.h" @@ -144,7 +144,7 @@ void dTgSw_c::initializeState_On() { mTimer = 4; } void dTgSw_c::executeState_On() { - if (cM::calcTimer(&mTimer) == 0) { + if (sLib::calcTimer(&mTimer) == 0) { mStateMgr.changeState(StateID_OffWait); } } @@ -173,7 +173,7 @@ void dTgSw_c::executeState_Off() { mActorEvent.scheduleEvent(event, 0); return; } - if (cM::calcTimer(&mTimer) == 0) { + if (sLib::calcTimer(&mTimer) == 0) { if (mThird2 == 1) { resetAllSwitches(); } else if (mThird2 != 2) { diff --git a/src/egg/math/eggMatrix.cpp b/src/egg/math/eggMatrix.cpp index dd171848..93108411 100644 --- a/src/egg/math/eggMatrix.cpp +++ b/src/egg/math/eggMatrix.cpp @@ -126,15 +126,15 @@ void Matrix34f::makeST(const Vector3f &s, const Vector3f &t) { } void Matrix34f::makeSQT(const Vector3f &s, const Quatf &q, const Vector3f &t) { - f32 yy = 2.0f * q.y * q.y; - f32 zz = 2.0f * q.z * q.z; - f32 xx = 2.0f * q.x * q.x; - f32 xy = 2.0f * q.x * q.y; - f32 xz = 2.0f * q.x * q.z; - f32 yz = 2.0f * q.y * q.z; - f32 wz = 2.0f * q.w * q.z; - f32 wx = 2.0f * q.w * q.x; - f32 wy = 2.0f * q.w * q.y; + f32 yy = 2.0f * q.v.y * q.v.y; + f32 zz = 2.0f * q.v.z * q.v.z; + f32 xx = 2.0f * q.v.x * q.v.x; + f32 xy = 2.0f * q.v.x * q.v.y; + f32 xz = 2.0f * q.v.x * q.v.z; + f32 yz = 2.0f * q.v.y * q.v.z; + f32 wz = 2.0f * q.w * q.v.z; + f32 wx = 2.0f * q.w * q.v.x; + f32 wy = 2.0f * q.w * q.v.y; m[0][0] = s.x * (1.0f - yy - zz); m[0][1] = s.y * (xy - wz); @@ -154,15 +154,15 @@ void Matrix34f::makeSQT(const Vector3f &s, const Quatf &q, const Vector3f &t) { } void Matrix34f::makeQT(const Quatf &q, const Vector3f &t) { - f32 yy = 2.0f * q.y * q.y; - f32 zz = 2.0f * q.z * q.z; - f32 xx = 2.0f * q.x * q.x; - f32 xy = 2.0f * q.x * q.y; - f32 xz = 2.0f * q.x * q.z; - f32 yz = 2.0f * q.y * q.z; - f32 wz = 2.0f * q.w * q.z; - f32 wx = 2.0f * q.w * q.x; - f32 wy = 2.0f * q.w * q.y; + f32 yy = 2.0f * q.v.y * q.v.y; + f32 zz = 2.0f * q.v.z * q.v.z; + f32 xx = 2.0f * q.v.x * q.v.x; + f32 xy = 2.0f * q.v.x * q.v.y; + f32 xz = 2.0f * q.v.x * q.v.z; + f32 yz = 2.0f * q.v.y * q.v.z; + f32 wz = 2.0f * q.w * q.v.z; + f32 wx = 2.0f * q.w * q.v.x; + f32 wy = 2.0f * q.w * q.v.y; m[0][0] = 1.0f - yy - zz; m[0][1] = xy - wz; @@ -182,15 +182,15 @@ void Matrix34f::makeQT(const Quatf &q, const Vector3f &t) { } void Matrix34f::makeQ(const Quatf &q) { - f32 yy = 2.0f * q.y * q.y; - f32 zz = 2.0f * q.z * q.z; - f32 xx = 2.0f * q.x * q.x; - f32 xy = 2.0f * q.x * q.y; - f32 xz = 2.0f * q.x * q.z; - f32 yz = 2.0f * q.y * q.z; - f32 wz = 2.0f * q.w * q.z; - f32 wx = 2.0f * q.w * q.x; - f32 wy = 2.0f * q.w * q.y; + f32 yy = 2.0f * q.v.y * q.v.y; + f32 zz = 2.0f * q.v.z * q.v.z; + f32 xx = 2.0f * q.v.x * q.v.x; + f32 xy = 2.0f * q.v.x * q.v.y; + f32 xz = 2.0f * q.v.x * q.v.z; + f32 yz = 2.0f * q.v.y * q.v.z; + f32 wz = 2.0f * q.w * q.v.z; + f32 wx = 2.0f * q.w * q.v.x; + f32 wy = 2.0f * q.w * q.v.y; m[0][0] = 1.0f - yy - zz; m[0][1] = xy - wz; @@ -240,17 +240,17 @@ void Matrix34f::makeT(const Vector3f &t) { } void Matrix34f::fromQuat(const Quatf &q) { - m[0][0] = 1.0f - (2 * q.y * q.y) - (2.0f * q.z * q.z); - m[0][1] = (2.0f * q.x * q.y) - (2.0f * q.w * q.z); - m[0][2] = (2.0f * q.x * q.z) + (2.0f * q.w * q.y); + m[0][0] = 1.0f - (2 * q.v.y * q.v.y) - (2.0f * q.v.z * q.v.z); + m[0][1] = (2.0f * q.v.x * q.v.y) - (2.0f * q.w * q.v.z); + m[0][2] = (2.0f * q.v.x * q.v.z) + (2.0f * q.w * q.v.y); - m[1][0] = (2.0f * q.x * q.y) + (2.0f * q.w * q.z); - m[1][1] = 1.0f - (2.0f * q.x * q.x) - (2.0f * q.z * q.z); - m[1][2] = (2.0f * q.y * q.z) - (2.0f * q.w * q.x); + m[1][0] = (2.0f * q.v.x * q.v.y) + (2.0f * q.w * q.v.z); + m[1][1] = 1.0f - (2.0f * q.v.x * q.v.x) - (2.0f * q.v.z * q.v.z); + m[1][2] = (2.0f * q.v.y * q.v.z) - (2.0f * q.w * q.v.x); - m[2][0] = (2.0f * q.x * q.z) - (2.0f * q.w * q.y); - m[2][1] = (2.0f * q.y * q.z) + (2.0f * q.w * q.x); - m[2][2] = 1.0f - (2.0f * q.x * q.x) - (2.0f * q.y * q.y); + m[2][0] = (2.0f * q.v.x * q.v.z) - (2.0f * q.w * q.v.y); + m[2][1] = (2.0f * q.v.y * q.v.z) + (2.0f * q.w * q.v.x); + m[2][2] = 1.0f - (2.0f * q.v.x * q.v.x) - (2.0f * q.v.y * q.v.y); m[2][3] = 0.0f; m[1][3] = 0.0f; @@ -298,38 +298,38 @@ void Matrix34f::toQuat(Quatf &q) const { switch (tempMax) { case 0: q.w = Math::sqrt(temp0); - q.x = (0.25f / q.w) * (m[2][1] - m[1][2]); - q.y = (0.25f / q.w) * (m[0][2] - m[2][0]); - q.z = (0.25f / q.w) * (m[1][0] - m[0][1]); + q.v.x = (0.25f / q.w) * (m[2][1] - m[1][2]); + q.v.y = (0.25f / q.w) * (m[0][2] - m[2][0]); + q.v.z = (0.25f / q.w) * (m[1][0] - m[0][1]); break; case 1: - q.x = Math::sqrt(temp1); - q.w = (0.25f / q.x) * (m[2][1] - m[1][2]); - q.y = (0.25f / q.x) * (m[0][1] + m[1][0]); - q.z = (0.25f / q.x) * (m[0][2] + m[2][0]); + q.v.x = Math::sqrt(temp1); + q.w = (0.25f / q.v.x) * (m[2][1] - m[1][2]); + q.v.y = (0.25f / q.v.x) * (m[0][1] + m[1][0]); + q.v.z = (0.25f / q.v.x) * (m[0][2] + m[2][0]); break; case 2: - q.y = Math::sqrt(temp2); - q.w = (0.25f / q.y) * (m[0][2] - m[2][0]); - q.z = (0.25f / q.y) * (m[1][2] + m[2][1]); - q.x = (0.25f / q.y) * (m[1][0] + m[0][1]); + q.v.y = Math::sqrt(temp2); + q.w = (0.25f / q.v.y) * (m[0][2] - m[2][0]); + q.v.z = (0.25f / q.v.y) * (m[1][2] + m[2][1]); + q.v.x = (0.25f / q.v.y) * (m[1][0] + m[0][1]); break; case 3: - q.z = Math::sqrt(temp3); - q.w = (0.25f / q.z) * (m[1][0] - m[0][1]); - q.x = (0.25f / q.z) * (m[2][0] + m[0][2]); - q.y = (0.25f / q.z) * (m[2][1] + m[1][2]); + q.v.z = Math::sqrt(temp3); + q.w = (0.25f / q.v.z) * (m[1][0] - m[0][1]); + q.v.x = (0.25f / q.v.z) * (m[2][0] + m[0][2]); + q.v.y = (0.25f / q.v.z) * (m[2][1] + m[1][2]); break; default: break; } if (q.w < 0.0f) { q.w = -q.w; - q.x = -q.x; - q.y = -q.y; - q.z = -q.z; + q.v.x = -q.v.x; + q.v.y = -q.v.y; + q.v.z = -q.v.z; } - q.multScalar(Math::inv(q.length())); + q.multScalar(Math::inv(Math::sqrt(q.w * q.w + q.v.dot(q.v)))); } void Matrix34f::slerpTo(const Matrix34f &m2, Matrix34f &out, f32 t) const { diff --git a/src/egg/math/eggQuat.cpp b/src/egg/math/eggQuat.cpp index 0a735a78..0ccb90b1 100644 --- a/src/egg/math/eggQuat.cpp +++ b/src/egg/math/eggQuat.cpp @@ -5,9 +5,9 @@ namespace EGG { /* 8049b390 */ void Quatf::set(f32 fw, f32 fx, f32 fy, f32 fz) { w = fw; - x = fx; - y = fy; - z = fz; + v.x = fx; + v.y = fy; + v.z = fz; } void Quatf::set(f32 fw, const Vector3f &vec) { @@ -30,9 +30,9 @@ void Quatf::setRPY(const EGG::Vector3f &rpy) { const f32 sy_cp = sy * cp; w = (cy_cp * cr) + (sy_sp * sr); - x = (cy_cp * sr) - (sy_sp * cr); - y = (cy_sp * cr) + (sy_cp * sr); - z = (sy_cp * cr) - (cy_sp * sr); + v.x = (cy_cp * sr) - (sy_sp * cr); + v.y = (cy_sp * cr) + (sy_cp * sr); + v.z = (sy_cp * cr) - (cy_sp * sr); } /* NOT IN SS */ @@ -84,7 +84,7 @@ void Quatf::setAxisRotation(const Vector3f &axis, f32 rot) { /* 8049b450 */ f32 Quatf::norm() { - return w * w + Vector3f::dot(*this); + return w * w + v.dot(v); } /* 8049b480 */ @@ -99,7 +99,7 @@ void Quatf::normalise() { Quatf Quatf::conjugate() { Quatf q; q.w = w; - (Vector3f &)q = -1.0f * *this; + q.v = -1.0f * v; return q; } @@ -109,7 +109,7 @@ Vector3f Quatf::rotateVector(const Vector3f &vec) { conj = conjugate(); mult = *this * vec; mult = mult * conj; - return (mult); + return (mult.v); } // /* NOT IN SS */ @@ -122,7 +122,7 @@ Vector3f Quatf::rotateVector(const Vector3f &vec) { /* 8049b800 */ void Quatf::slerpTo(const Quatf &q2, f32 t, Quatf &out) const { - f32 dot = x * q2.x + y * q2.y + z * q2.z + w * q2.w; + f32 dot = v.x * q2.v.x + v.y * q2.v.y + v.z * q2.v.z + w * q2.w; if (dot > 1.0f) { dot = 1.0f; @@ -156,9 +156,9 @@ void Quatf::slerpTo(const Quatf &q2, f32 t, Quatf &out) const { b = -b; } - out.x = a * x + b * q2.x; - out.y = a * y + b * q2.y; - out.z = a * z + b * q2.z; + out.v.x = a * v.x + b * q2.v.x; + out.v.y = a * v.y + b * q2.v.y; + out.v.z = a * v.z + b * q2.v.z; out.w = a * w + b * q2.w; } @@ -166,7 +166,7 @@ void Quatf::slerpTo(const Quatf &q2, f32 t, Quatf &out) const { void Quatf::limitSlerpTo(const Quatf &q2, f32 t, f32 t2, Quatf &out) const { t2 *= 0.5f; - f32 dot = x * q2.x + y * q2.y + z * q2.z + w * q2.w; + f32 dot = v.x * q2.v.x + v.y * q2.v.y + v.z * q2.v.z + w * q2.w; if (dot > 1.0f) { dot = 1.0f; @@ -204,9 +204,9 @@ void Quatf::limitSlerpTo(const Quatf &q2, f32 t, f32 t2, Quatf &out) const { b = -b; } - out.x = a * x + b * q2.x; - out.y = a * y + b * q2.y; - out.z = a * z + b * q2.z; + out.v.x = a * v.x + b * q2.v.x; + out.v.y = a * v.y + b * q2.v.y; + out.v.z = a * v.z + b * q2.v.z; out.w = a * w + b * q2.w; } diff --git a/src/m/m3d/m_shadow.cpp b/src/m/m3d/m_shadow.cpp index 01e3d932..a5a0b010 100644 --- a/src/m/m3d/m_shadow.cpp +++ b/src/m/m3d/m_shadow.cpp @@ -488,7 +488,7 @@ bool mShadowChild_c::addMdl(scnLeaf_c &mdl, const mQuat_c &quat) { // TODO this copy is a bit weird (reads members in a different order) mQuat_c q = quat; - PSMTXMultVec(mtx.m, q, q); + PSMTXMultVec(mtx.m, q.v, q.v); if (mNumLeaves == 0) { mQuat = q; @@ -501,7 +501,7 @@ bool mShadowChild_c::addMdl(scnLeaf_c &mdl, const mQuat_c &quat) { bool mShadowChild_c::setGeom(const GXTexObj *texObj, const mMtx_c &mtx, const mQuat_c &quat) { mQuat = quat; - PSMTXMultVec(mtx.m, mQuat, mQuat); + PSMTXMultVec(mtx.m, mQuat.v, mQuat.v); if (texObj == nullptr) { mTexObj = *mShadow_c::sTexObj; } else { diff --git a/src/m/m_angle.cpp b/src/m/m_angle.cpp index 77319d48..fe53b0c1 100644 --- a/src/m/m_angle.cpp +++ b/src/m/m_angle.cpp @@ -8,7 +8,7 @@ mAng3_c mAng3_c::Zero = mAng3_c(0, 0, 0); const f32 mAng::sHalfCircleDeg = 360.0f / 2; const f32 mAng::sAngToDeg = 360.0f / (1 << 16); const f32 mAng::sAngToRad = 2 * M_PI / (1 << 16); -const f32 mAng::NotSure = 2.0f / (1 << 16); +const f32 mAng::sAngToNorm = 2.0f / (1 << 16); const f32 mAng::sDegToRad = M_PI / 180.0f; const f32 mAng::sDegToAng = (1 << 16) / 360.0f; const f32 mAng::sRadToAng = (1 << 16) / (2 * M_PI); From 9334796eef3caa2c9ff0bc9c6cfca0677a269a04 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Wed, 6 Nov 2024 16:42:00 -0500 Subject: [PATCH 06/10] fix ninja diff --- config/SOUE01/symbols.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 6433a981..0b1714bb 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -32898,12 +32898,12 @@ lbl_80524170 = .data:0x80524170; // type:object size:0x18 lbl_80524188 = .data:0x80524188; // type:object size:0x31C __vt__30sFStateID_c<15dLytBirdGauge_c> = .data:0x805244A4; // type:object size:0x34 __vt__34sFStateID_c<19dLytBirdGaugeMain_c> = .data:0x805244D8; // type:object size:0x34 -lbl_80524510 = .data:0x80524510; // type:object size:0x18 -lbl_80524528 = .data:0x80524528; // type:object size:0xC -lbl_80524534 = .data:0x80524534; // type:object size:0x18 -lbl_8052454C = .data:0x8052454C; // type:object size:0x18 -lbl_80524564 = .data:0x80524564; // type:object size:0xC -lbl_80524570 = .data:0x80524570; // type:object size:0x14 +lbl_80524510 = .data:0x80524510; // type:object size:0x15 data:string +lbl_80524528 = .data:0x80524528; // type:object size:0xB data:string +lbl_80524534 = .data:0x80524534; // type:object size:0x16 data:string +lbl_8052454C = .data:0x8052454C; // type:object size:0x17 data:string +lbl_80524564 = .data:0x80524564; // type:object size:0xA data:string +lbl_80524570 = .data:0x80524570; // type:object size:0x12 data:string __vt__14dLytSkyGauge_c = .data:0x80524584; // type:object size:0x34 __vt__18dLytSkyGaugeMain_c = .data:0x805245B8; // type:object size:0xC __vt__57sFStateMgr_c<18dLytSkyGaugeMain_c,20sStateMethodUsr_FI_c> = .data:0x805245C8; // type:object size:0x30 From aaf88fa648557435a2af5c4bc1436507c2b0042c Mon Sep 17 00:00:00 2001 From: robojumper Date: Wed, 6 Nov 2024 22:43:27 +0100 Subject: [PATCH 07/10] Clean up special item drop mgr (#87) * Clean up special item drop mgr * Progress * Mostly matching * Docs --- config/SOUE01/rels/d_t_reactionNP/symbols.txt | 2 +- config/SOUE01/splits.txt | 3 + config/SOUE01/symbols.txt | 20 +- include/c/c_math.h | 9 +- include/d/a/d_a_player.h | 2 +- include/d/a/obj/d_a_obj_item.h | 2 + include/toBeSorted/special_item_drop_mgr.h | 20 +- src/REL/d/a/obj/d_a_obj_toD3_stone_figure.cpp | 4 +- src/REL/d/t/d_t_reaction.cpp | 18 +- src/d/a/d_a_base.cpp | 5 +- src/toBeSorted/special_item_drop_mgr.cpp | 550 ++++++++++++++++-- 11 files changed, 548 insertions(+), 87 deletions(-) diff --git a/config/SOUE01/rels/d_t_reactionNP/symbols.txt b/config/SOUE01/rels/d_t_reactionNP/symbols.txt index 626c688f..370e3284 100644 --- a/config/SOUE01/rels/d_t_reactionNP/symbols.txt +++ b/config/SOUE01/rels/d_t_reactionNP/symbols.txt @@ -24,7 +24,7 @@ checkForSlingBellowsItem__13dTgReaction_cFv = .text:0x00000C50; // type:function onDelete__13dTgReaction_cFv = .text:0x00000D60; // type:function size:0x44 fn_578_DB0 = .text:0x00000DB0; // type:function size:0xB4 spawnHearts__13dTgReaction_cFlRC7mVec3_cl4mAng = .text:0x00000E70; // type:function size:0x184 -rndRange<4mAng>__F4mAng4mAng_4mAng = .text:0x00001000; // type:function size:0xA4 +rndRange<4mAng>__2cMF4mAng4mAng_4mAng = .text:0x00001000; // type:function size:0xA4 __dt__13dTgReaction_cFv = .text:0x000010B0; // type:function size:0xD8 getStateID__82sStateMgr_c<13dTgReaction_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x00001190; // type:function size:0x10 build__29sFStateFct_c<13dTgReaction_c>FRC12sStateIDIf_c = .text:0x000011A0; // type:function size:0x60 diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index ff362c43..e14eb5f1 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -207,7 +207,10 @@ d/flag/flag_managers.cpp: toBeSorted/special_item_drop_mgr.cpp: .text start:0x800C7B60 end:0x800C82B0 + .rodata start:0x804E4CC8 end:0x804E4EE0 + .data start:0x80511C50 end:0x80511C60 .sbss start:0x80575438 end:0x80575440 + .sdata2 start:0x805799B8 end:0x80579AD0 d/lyt/meter/d_lyt_meter.cpp: .text start:0x800C8950 end:0x800DF8A8 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 0b1714bb..9d424c41 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -4416,12 +4416,12 @@ Timekeeper__doCount = .text:0x800C7A20; // type:function size:0x130 fn_800C7B50 = .text:0x800C7B50; // type:function size:0x8 __ct__18SpecialItemDropMgrFv = .text:0x800C7B60; // type:function size:0x14 SpecialItemDropMgr__ctor = .text:0x800C7B80; // type:function size:0x30 -fn_800C7BB0__FP18SpecialItemDropMgri = .text:0x800C7BB0; // type:function size:0x150 -fn_800C7D00__FP18SpecialItemDropMgri = .text:0x800C7D00; // type:function size:0x1C -fn_800C7D20__FP18SpecialItemDropMgri = .text:0x800C7D20; // type:function size:0x1C -giveSpecialDropItem__FP18SpecialItemDropMgriiP7mVec3_ciPsi = .text:0x800C7D40; // type:function size:0x1A8 -spawnSpecialDropItem__FP18SpecialItemDropMgriiP7mVec3_ciPs = .text:0x800C7EF0; // type:function size:0x2D8 -fn_800C81D0__Fsss = .text:0x800C81D0; // type:function size:0x98 +fn_800C7BB0__18SpecialItemDropMgrFi = .text:0x800C7BB0; // type:function size:0x150 +shouldTryExtraHearts__18SpecialItemDropMgrFi = .text:0x800C7D00; // type:function size:0x1C +shouldTryExtraRupees__18SpecialItemDropMgrFi = .text:0x800C7D20; // type:function size:0x1C +giveSpecialDropItem__18SpecialItemDropMgrFiiP7mVec3_ci4mAngl = .text:0x800C7D40; // type:function size:0x1A8 +spawnSpecialDropItem__18SpecialItemDropMgrFiiP7mVec3_ci4mAng = .text:0x800C7EF0; // type:function size:0x2D8 +rndRange<4mAng>__2cMF4mAng4mAng_4mAng = .text:0x800C81D0; // type:function size:0x98 __dt__18SpecialItemDropMgrFv = .text:0x800C8270; // type:function size:0x40 isShortNegative = .text:0x800C82B0; // type:function size:0x18 0x3FFFMask = .text:0x800C82D0; // type:function size:0x18 @@ -13546,7 +13546,7 @@ fn_80251940 = .text:0x80251940; // type:function size:0xA8 AcItem__getCurrentOffset = .text:0x802519F0; // type:function size:0xA0 AcItem__getPositionOffset = .text:0x80251A90; // type:function size:0x5C fn_80251AF0 = .text:0x80251AF0; // type:function size:0x78 -AcItem__checkFlag = .text:0x80251B70; // type:function size:0x128 +checkFlag__9dAcItem_cFUl = .text:0x80251B70; // type:function size:0x128 AcItem__setFlag = .text:0x80251CA0; // type:function size:0xC0 AcItem__checkFlagForItem = .text:0x80251D60; // type:function size:0x34 AcItem__checkItemFlag = .text:0x80251DA0; // type:function size:0x48 @@ -28233,7 +28233,7 @@ lbl_804E4CB8 = .rodata:0x804E4CB8; // type:object size:0x10 data:float lbl_804E4CC8 = .rodata:0x804E4CC8; // type:object size:0x10 lbl_804E4CD8 = .rodata:0x804E4CD8; // type:object size:0x1B0 lbl_804E4E88 = .rodata:0x804E4E88; // type:object size:0x20 data:4byte -SPECIAL_ITEM_ARRAY = .rodata:0x804E4EA8; // type:object size:0x38 +SPECIAL_ITEM_ARRAY = .rodata:0x804E4EA8; // type:object size:0x32 btn1BrlanMap = .rodata:0x804E4EE0; // type:object size:0x18 scope:local data:4byte lbl_804E4EF8 = .rodata:0x804E4EF8; // type:object size:0x18 data:4byte lbl_804E4F10 = .rodata:0x804E4F10; // type:object size:0x110 data:4byte @@ -31041,7 +31041,7 @@ lbl_80511C00 = .data:0x80511C00; // type:object size:0x10 lbl_80511C10 = .data:0x80511C10; // type:object size:0x10 lbl_80511C20 = .data:0x80511C20; // type:object size:0x10 Timekeeper__vtable = .data:0x80511C30; // type:object size:0x20 -SpecialItemDropMgr__vtable = .data:0x80511C50; // type:object size:0x10 +__vt__18SpecialItemDropMgr = .data:0x80511C50; // type:object size:0xC lbl_80511C60 = .data:0x80511C60; // type:object size:0x14 lbl_80511C74 = .data:0x80511C74; // type:object size:0xC lbl_80511C80 = .data:0x80511C80; // type:object size:0x1C @@ -39954,7 +39954,7 @@ lbl_80575418 = .sbss:0x80575418; // type:object size:0x8 lbl_80575420 = .sbss:0x80575420; // type:object size:0x8 data:byte lbl_80575428 = .sbss:0x80575428; // type:object size:0x8 data:byte lbl_80575430 = .sbss:0x80575430; // type:object size:0x8 data:4byte -SpecialItemDropMgr__sInstance = .sbss:0x80575438; // type:object size:0x8 data:4byte +sInstance__18SpecialItemDropMgr = .sbss:0x80575438; // type:object size:0x4 data:4byte FOR_LOADED_PARTICLES = .sbss:0x80575440; // type:object size:0x8 data:4byte sInstance__20dLytMeterContainer_c = .sbss:0x80575448; // type:object size:0x8 data:4byte lbl_80575450 = .sbss:0x80575450; // type:object size:0x8 data:4byte diff --git a/include/c/c_math.h b/include/c/c_math.h index 8b95bf71..ee21fe0d 100644 --- a/include/c/c_math.h +++ b/include/c/c_math.h @@ -11,7 +11,14 @@ int rndInt(int max); f32 rndF(f32 max); f32 rndFX(f32 amp); -template +template +T rndRange(T min, T max) { + f32 r = cM::rndF(max - min); + f32 m = min; + m += r; + return m; +} + inline T minMaxLimit(T val, T min, T max) { return (T)((T)val < (T)min ? (T)min : ((T)val > (T)max ? (T)max : (T)val)); } diff --git a/include/d/a/d_a_player.h b/include/d/a/d_a_player.h index 57471a06..666a5365 100644 --- a/include/d/a/d_a_player.h +++ b/include/d/a/d_a_player.h @@ -99,7 +99,7 @@ class dAcPy_c : public dAcObjBase_c { /* vt 0x144 */ virtual void setActorLinkToSomething(); /* vt 0x148 */ virtual void applyDamageWithIFrames(); /* vt 0x14C */ virtual void vt_0x14C(); - /* vt 0x150 */ virtual void hasLessThanQuarterHealth(); + /* vt 0x150 */ virtual bool hasLessThanQuarterHealth(bool); /* vt 0x154 */ virtual void vt_0x154(); /* vt 0x158 */ virtual void vt_0x158(); /* vt 0x15C */ virtual void vt_0x15C(); diff --git a/include/d/a/obj/d_a_obj_item.h b/include/d/a/obj/d_a_obj_item.h index 4a2cf494..fc0cb063 100644 --- a/include/d/a/obj/d_a_obj_item.h +++ b/include/d/a/obj/d_a_obj_item.h @@ -12,6 +12,8 @@ class dAcItem_c : public dAcObjBase_c { static void spawnItem(u16 item, u32 room, const mVec3_c &pos, const mAng3_c &rot, u32 params, u32 arg); static void spawnDrop(u16 item, u32 room, const mVec3_c &pos, const mAng3_c &rot); + + static u32 checkFlag(u32 flag); }; #endif diff --git a/include/toBeSorted/special_item_drop_mgr.h b/include/toBeSorted/special_item_drop_mgr.h index 492f0725..8132cff0 100644 --- a/include/toBeSorted/special_item_drop_mgr.h +++ b/include/toBeSorted/special_item_drop_mgr.h @@ -2,6 +2,7 @@ #define SPECIAL_ITEM_DROP_MGR_H #include "common.h" +#include "m/m_angle.h" #include "m/m_vec.h" class SpecialItemDropMgr { @@ -9,16 +10,15 @@ class SpecialItemDropMgr { static SpecialItemDropMgr *sInstance; SpecialItemDropMgr(); - static int fn_800C7BB0(SpecialItemDropMgr *mgr, int specialItemId); - static short fn_800C7D00(SpecialItemDropMgr *mgr, int specialItemId); - static short fn_800C7D20(SpecialItemDropMgr *mgr, int specialItemId); - static int giveSpecialDropItem( - SpecialItemDropMgr *mgr, int specialItemId, int roomid, mVec3_c *pos, int subtype, s16 *rot, s32 unused - ); - static bool - spawnSpecialDropItem(SpecialItemDropMgr *mgr, int specialItemId, int roomid, mVec3_c *pos, int subtype, s16 *rot); - static void fn_800C81D0(s16, s16, s16); - ~SpecialItemDropMgr(); + virtual ~SpecialItemDropMgr() {} + + static SpecialItemDropMgr *create(); + + int fn_800C7BB0(int specialItemId); + bool shouldTryExtraHearts(int specialItemId); + bool shouldTryExtraRupees(int specialItemId); + int giveSpecialDropItem(int specialItemId, int roomid, mVec3_c *pos, int subtype, mAng rot, s32 unused); + bool spawnSpecialDropItem(int specialItemId, int roomid, mVec3_c *pos, int subtype, mAng rot); }; #endif diff --git a/src/REL/d/a/obj/d_a_obj_toD3_stone_figure.cpp b/src/REL/d/a/obj/d_a_obj_toD3_stone_figure.cpp index 9bcff77a..67e875e3 100644 --- a/src/REL/d/a/obj/d_a_obj_toD3_stone_figure.cpp +++ b/src/REL/d/a/obj/d_a_obj_toD3_stone_figure.cpp @@ -1,6 +1,7 @@ #include "d/a/obj/d_a_obj_toD3_stone_figure.h" #include "d/col/cc/d_cc_s.h" +#include "d/a/obj/d_a_obj_item.h" #include "d/flag/storyflag_manager.h" #include "toBeSorted/attention.h" #include "toBeSorted/event.h" @@ -163,7 +164,6 @@ void dAcOtoD3StoneFigure_c::doInteraction(s32 arg) { } } -extern "C" s32 AcItem__checkFlag(s32); bool dAcOtoD3StoneFigure_c::hasStoneOfTrials() const { - return AcItem__checkFlag(0xB4); + return dAcItem_c::checkFlag(0xB4); } diff --git a/src/REL/d/t/d_t_reaction.cpp b/src/REL/d/t/d_t_reaction.cpp index 5f982281..5e0db3ac 100644 --- a/src/REL/d/t/d_t_reaction.cpp +++ b/src/REL/d/t/d_t_reaction.cpp @@ -221,25 +221,17 @@ void dTgReaction_c::checkForBubble() { dCcS::GetInstance()->Set(&mCollision); } -// TODO move this somewhere -template -T rndRange(T min, T max) { - f32 r = cM::rndF(max - min); - f32 m = min; - m += r; - return m; -} - void dTgReaction_c::checkForSlingBellowsItem() { if (mCollision.ChkTgHit()) { u8 p = getParam0x08(); u32 uVar3; if (p == 0) { uVar3 = 6; - } else if (uVar3 == 0xFF) { - uVar3 = 5; } else { uVar3 = 6; + if ((int)p == 0xFF) { + uVar3 = 5; + } } mVec3_c spawnPos = position; spawnPos.y += field_0x4E4; @@ -287,9 +279,7 @@ bool dTgReaction_c::spawnHearts(s32 params, const mVec3_c &pos, s32 arg, mAng an tmp2 = mAng(tmp2 / 2); for (int i = 0; i < numHearts; i++) { - // Note: This is a (presumably templated) rndRange function - // that takes and returns a struct mAng - mAng offset = rndRange(-tmp2, tmp2); + mAng offset = cM::rndRange(-tmp2, tmp2); ang.y = mAng(step) + offset; if (arg == 5) { dAcItem_c::spawnItem(/* HEART */ 0x6, roomid, pos, ang, 0xFFFFFFFF, 1); diff --git a/src/d/a/d_a_base.cpp b/src/d/a/d_a_base.cpp index 30581cee..cf0f361d 100644 --- a/src/d/a/d_a_base.cpp +++ b/src/d/a/d_a_base.cpp @@ -243,9 +243,8 @@ u32 dAcBase_c::itemDroppingAndGivingRelated(mVec3_c *spawnPos, int subtype) { u32 param2Copy = params2; params2 = param2Copy | 0xFF000000; // mAng3_c rot = {}; - s16 rot = 0; - return SpecialItemDropMgr::giveSpecialDropItem( - SpecialItemDropMgr::sInstance, param2Copy >> 0x18, roomid, spawnPos, subtype, &rot, -1 + return SpecialItemDropMgr::sInstance->giveSpecialDropItem( + param2Copy >> 0x18, roomid, spawnPos, subtype, 0, -1 ); } diff --git a/src/toBeSorted/special_item_drop_mgr.cpp b/src/toBeSorted/special_item_drop_mgr.cpp index 25940a21..7d4c8613 100644 --- a/src/toBeSorted/special_item_drop_mgr.cpp +++ b/src/toBeSorted/special_item_drop_mgr.cpp @@ -1,51 +1,514 @@ #include "toBeSorted/special_item_drop_mgr.h" +#include "c/c_lib.h" +#include "c/c_math.h" +#include "common.h" #include "d/a/d_a_player.h" -#include "m/m_Angle.h" +#include "d/a/obj/d_a_obj_item.h" +#include "m/m_angle.h" #include "m/m_vec.h" SpecialItemDropMgr *SpecialItemDropMgr::sInstance = nullptr; -extern "C" short targetAngleY(mVec3_c *, mVec3_c *); -extern "C" int rndInt(int); -extern "C" void spawnItem1(s16 itemid, u32 roomid, mVec3_c *pos, mAng3_c *rot, u32 param2, u32 unk); -extern "C" void spawnItem2(s16 itemid, u32 roomid, mVec3_c *pos, mAng3_c *rot, u32 param2, u32 unk); -extern "C" void spawnItem3(s16 itemid, u32 roomid, mVec3_c *pos, mAng3_c *rot, u32 param2, u32 unk); -extern "C" void spawnItem4(s16 itemid, u32 roomid, mVec3_c *pos, mAng3_c *rot, u32 param2, u32 unk); -extern "C" void spawnItem5(s16 itemid, u32 roomid, mVec3_c *pos, mAng3_c *rot, u32 param2, u32 unk); -extern "C" void spawnItem6(s16 itemid, u32 roomid, mVec3_c *pos, mAng3_c *rot, u32 param2, u32 unk); -extern "C" void spawnItem7(s16 itemid, u32 roomid, mVec3_c *pos, mAng3_c *rot, u32 param2, u32 unk); -extern "C" void spawnItem8(s16 itemid, u32 roomid, mVec3_c *pos, mAng3_c *rot, u32 param2, u32 unk); -extern "C" void spawnItem9(s16 itemid, u32 roomid, mVec3_c *pos, mAng3_c *rot, u32 param2, u32 unk); +extern "C" void spawnItem1(u32 itemid, u32 roomid, mVec3_c *pos, mAng3_c *rot, u32 param2, u32 unk); +extern "C" void spawnItem2(u32 itemid, u32 roomid, mVec3_c *pos, mAng3_c *rot, u32 param2, u32 unk); +extern "C" void spawnItem3(u32 itemid, u32 roomid, mVec3_c *pos, mAng3_c *rot, u32 param2, u32 unk); +extern "C" void spawnItem4(u32 itemid, u32, u32 param2); +extern "C" void spawnItem5(u32 itemid, u32 roomid, mVec3_c *pos, mAng3_c *rot, u32 param2, u32 unk); +extern "C" void spawnItem6(u32 itemid, u32 roomid, mVec3_c *pos, mAng3_c *rot, u32 param2, u32 unk); +extern "C" void spawnItem7(u32 itemid, u32 roomid, mVec3_c *pos, mAng3_c *rot, u32 param2, u32 unk); +extern "C" void spawnItem8(u32 itemid, u32 roomid, mVec3_c *pos, mAng3_c *rot, void *, void *, u32 param2, u32 unk); +extern "C" void spawnItem9(u32 itemid, u32 roomid, mVec3_c *pos, mAng3_c *rot); // 800c7b80 SpecialItemDropMgr::SpecialItemDropMgr() { SpecialItemDropMgr::sInstance = this; } +SpecialItemDropMgr *SpecialItemDropMgr::create() { + return new SpecialItemDropMgr(); +} + +struct DropEntry { + /* 0x0 */ u8 mEntryIndex; + /* 0x1 */ u8 mDropChance; +}; + +struct DropList { + /* 0x0 */ u16 mLen; + /* 0x2 */ u16 mFlags; + /* 0x4 */ const DropEntry *mpEntries; +}; + +static const DropEntry e01[] = { + {0x01, 20}, + {0x03, 40}, + {0x04, 10}, +}; + +static const DropEntry e02[] = { + {0x01, 20}, + {0x03, 10}, + {0x04, 40}, +}; + +static const DropEntry e03[] = { + {0x01, 20}, + {0x04, 25}, + {0x05, 25}, +}; + +static const DropEntry e04[] = { + {0x01, 100}, +}; + +static const DropEntry e05[] = { + {0x01, 60}, + {0x02, 10}, +}; + +static const DropEntry e06[] = { + {0x02, 100}, +}; + +static const DropEntry e07[] = { + {0x03, 40}, + {0x04, 10}, +}; + +static const DropEntry e08[] = { + {0x03, 50}, + {0x04, 40}, + {0x05, 10}, +}; + +static const DropEntry e09[] = { + {0x04, 70}, + {0x05, 30}, +}; + +static const DropEntry e10[] = { + {0x06, 100}, +}; + +static const DropEntry e11[] = { + {0x08, 100}, +}; + +static const DropEntry e12[] = { + {0x0A, 100}, +}; + +static const DropEntry e13[] = { + {0x0B, 100}, +}; + +static const DropEntry e14[] = { + {0x0C, 100}, +}; + +static const DropEntry e15[] = { + {0x0D, 100}, +}; + +static const DropEntry e16[] = { + {0x03, 7}, + {0x04, 3}, +}; + +static const DropEntry e17[] = { + {0x01, 7}, + {0x03, 3}, +}; + +static const DropEntry e18[] = { + {0x03, 100}, +}; + +static const DropEntry e19[] = { + {0x04, 100}, +}; + +static const DropEntry e20[] = { + {0x05, 100}, +}; + +static const DropEntry e21[] = { + {0x0E, 100}, +}; + +static const DropEntry e22[] = { + {0x0F, 100}, +}; + +static const DropEntry e23[] = { + {0x03, 60}, + {0x04, 30}, + {0x0F, 10}, +}; + +static const DropEntry e24[] = { + {0x03, 30}, + {0x04, 30}, + {0x05, 20}, + {0x0F, 20}, +}; + +static const DropEntry e25[] = { + {0x10, 100}, +}; + +static const DropEntry e26[] = { + {0x12, 100}, +}; + +static const DropEntry e27[] = { + {0x13, 100}, +}; + +static const DropEntry e28[] = { + {0x14, 100}, +}; + +static const DropEntry e29[] = { + {0x10, 10}, +}; + +static const DropEntry e30[] = { + {0x0B, 100}, +}; + +static const DropEntry e31[] = { + {0x01, 100}, +}; + +static const DropEntry e32[] = { + {0x01, 12}, +}; + +static const DropEntry e33[] = { + {0x01, 35}, +}; + +static const DropEntry e34[] = { + {0x16, 30}, + {0x15, 10}, + {0x02, 20}, + {0x01, 20}, +}; + +static const DropEntry e35[] = { + {0x15, 100}, +}; + +static const DropEntry e36[] = { + {0x16, 100}, +}; + +static const DropEntry e37[] = { + {0x01, 20}, + {0x03, 30}, + {0x04, 15}, +}; + +static const DropEntry e38[] = { + {0x04, 30}, + {0x05, 5}, + {0x03, 45}, +}; + +static const DropEntry e39[] = { + {0x01, 10}, +}; + +static const DropEntry e40[] = { + {0x03, 10}, + {0x04, 5}, +}; + +static const DropEntry e41[] = { + {0x17, 100}, +}; + +static const DropEntry e42[] = { + {0x01, 20}, +}; + +static const DropEntry e44[] = { + {0x01, 7}, +}; + +static const DropEntry e45[] = { + {0x03, 14}, + {0x04, 6}, +}; + +static const DropEntry e46[] = { + {0x01, 7}, + {0x03, 13}, +}; + +static const DropEntry e47[] = { + {0x18, 100}, +}; + +static const DropEntry e48[] = { + {0x01, 7}, +}; + +static const DropEntry e49[] = { + {0x01, 14}, +}; + +static const DropEntry e50[] = { + {0x01, 50}, +}; + +static const DropEntry e51[] = { + {0x0B, 20}, + {0x03, 20}, + {0x04, 10}, +}; + +static const DropEntry e52[] = { + {0x0A, 60}, + {0x01, 20}, + {0x04, 20}, +}; + +static const DropEntry e53[] = { + {0x08, 20}, + {0x0A, 20}, + {0x0B, 20}, + {0x03, 10}, + {0x04, 5}, +}; + +#define FLAG_EXTRA_HEARTS 1 +#define FLAG_EXTRA_RUPEES 2 + +#define FLAG_EXTRA_ALL (FLAG_EXTRA_HEARTS | FLAG_EXTRA_RUPEES) + +static const DropList sList[] = { + {0, 0, nullptr}, + {3, FLAG_EXTRA_ALL, e01}, + {3, FLAG_EXTRA_ALL, e02}, + {3, FLAG_EXTRA_ALL, e03}, + {1, FLAG_EXTRA_ALL, e04}, + {2, FLAG_EXTRA_ALL, e05}, + {1, FLAG_EXTRA_ALL, e06}, + {2, FLAG_EXTRA_ALL, e07}, + {3, FLAG_EXTRA_ALL, e08}, + {2, FLAG_EXTRA_ALL, e09}, + {1, 0, e10}, + {1, 0, e11}, + {1, 0, e12}, + {1, 0, e13}, + {1, 0, e14}, + {1, 0, e15}, + {2, FLAG_EXTRA_ALL, e16}, + {2, FLAG_EXTRA_ALL, e17}, + {1, 0, e18}, + {1, 0, e19}, + {1, 0, e20}, + {1, 0, e21}, + {1, 0, e22}, + {3, FLAG_EXTRA_ALL, e23}, + {4, FLAG_EXTRA_ALL, e24}, + {1, 0, e25}, + {1, 0, e26}, + {1, 0, e27}, + {1, 0, e28}, + {1, 0, e29}, + {1, 0, e30}, + {1, FLAG_EXTRA_ALL, e31}, + {1, FLAG_EXTRA_ALL, e32}, + {1, FLAG_EXTRA_ALL, e33}, + {4, FLAG_EXTRA_ALL, e34}, + {1, 0, e35}, + {1, 0, e36}, + {3, FLAG_EXTRA_ALL, e37}, + {3, FLAG_EXTRA_ALL, e38}, + {1, 0, e39}, + {2, 0, e40}, + {1, 0, e41}, + {1, FLAG_EXTRA_HEARTS, e42}, + {0, 0, nullptr}, + {1, FLAG_EXTRA_HEARTS, e44}, + {2, FLAG_EXTRA_ALL, e45}, + {2, FLAG_EXTRA_ALL, e46}, + {1, 0, e47}, + {1, FLAG_EXTRA_HEARTS, e48}, + {1, FLAG_EXTRA_HEARTS, e49}, + {1, 0, e50}, + {3, FLAG_EXTRA_ALL, e51}, + {3, 0, e52}, + {5, FLAG_EXTRA_RUPEES, e53}, +}; + +struct LowHealthReplacement { + s32 mOriginalIdx; + s32 mReplacementIndex; +}; + +const LowHealthReplacement LOW_HEALTH_REPLACEMENTS[] = { + { + 0x10, 0x11, + }, + { + 0x1E, 0x1F, + }, + { + 0x2B, 0x2C, + }, + { + 0x2D, 0x2E, + }, +}; + // TODO: Convert to enum once work on items has started -int SPECIAL_ITEM_ARRAY[28] = {0, 6, 6, 2, 3, 4, 0x2b, 0x28, 0x29, 7, 8, 0x39, 0, 0, - 0x1c, 0xa5, 58, 59, 183, 184, 185, 72, 72, 1, 34, 0, 0, 0}; -int RAND_RUPEE_ARRAY[4] = {2, 3, 4, 0}; +static const u16 SPECIAL_ITEM_ARRAY[] = { + 0, // None + 6, // Heart + 6, // Heart + 2, // Green Rupee + 3, // Blue Rupee + 4, // Red Rupee + 0x2b, // Farore Tear + 0x28, // 5 Bombs + 0x29, // 10 Bombs + 7, // Single Arrow + 8, // Bundle Arrows + 0x39, // 5 Deku Seeds + 0, // None + 0, // None + 0x1c, // ET Key Piece + 0xa5, // Eldin Ore + 58, // ??? + 59, // ??? + 183, // ??? + 184, // ??? + 185, // ??? + 72, // Fairy + 72, // Fairy + 1, // Small Key + 34, // Rupoor +}; + +static const u32 sNumDropEntries = 0x36; +static const struct { + u16 mNumEntries; + const DropList *mList; +} sDropTable = { + 0x36, + sList, +}; + +static const u16 RAND_RUPEE_ARRAY[] = {2, 3, 4}; + +extern "C" int getCurrentBowType(); +extern "C" int getCurrentSlingshotType(); +extern "C" bool isHeroMode(); // 800c7bb0 -int fn_800C7BB0(SpecialItemDropMgr *mgr, int specialItemId) {} +int SpecialItemDropMgr::fn_800C7BB0(int specialItemId) { + const DropList *list = &sDropTable.mList[specialItemId]; + const DropEntry *e = list->mpEntries; + int random = cM::rndInt(100); + + int acc = 0; + + for (int i = 0; i < list->mLen; i++) { + int entryIdx = e->mEntryIndex; + int weight = e->mDropChance; + + if (entryIdx == 9 || entryIdx == 10) { + if (getCurrentBowType() == 0) { + // No arrows until you get the Bow + weight = 0; + } + } else if (entryIdx == 11) { + if (getCurrentSlingshotType() == 0) { + // No seeds until you get the Slingshot + weight = 0; + } + } else if (specialItemId != 0x27 && (entryIdx == 1 || entryIdx == 2) && isHeroMode()) { + // Hearts generally don't drop on Hero Mode unless it's a special kind of heart (which?) + weight = 0; + } else if ((entryIdx == 7 || entryIdx == 8) && !dAcItem_c::checkFlag(/* Bomb Bag */ 92)) { + // Bombs won't drop until you get the Bomb Bag + weight = 0; + } -// 800c7d00 -short fn_800C7D00(SpecialItemDropMgr *mgr, int specialItemId) {} + if (weight != 0) { + int x = 0x1E / weight; + acc += weight; + if (x != 0) { + int tmp = x <= 3 ? x : 3; + if (random % tmp != 0) { + return 0; + } + } + + if (random < acc) { + return entryIdx; + } + } + e++; + } + + return 0; +} + +bool SpecialItemDropMgr::shouldTryExtraHearts(int specialItemId) { + return sDropTable.mList[specialItemId].mFlags & FLAG_EXTRA_HEARTS; +} +bool SpecialItemDropMgr::shouldTryExtraRupees(int specialItemId) { + return sDropTable.mList[specialItemId].mFlags & FLAG_EXTRA_RUPEES; +} -// 800c7d20 -short fn_800C7D20(SpecialItemDropMgr *mgr, int specialItemId) {} +extern "C" bool adventurePouchCountItem(u32 itemId); // 800c7d40 -int giveSpecialDropItem( - SpecialItemDropMgr *mgr, int specialItemId, int roomid, mVec3_c *pos, int subtype, s16 *rot, s32 unused -) {} +int SpecialItemDropMgr::giveSpecialDropItem( + int specialItemId, int roomid, mVec3_c *pos, int subtype, mAng rot, s32 unused +) { + if (specialItemId == 0xFF) { + return 0; + } + + for (u32 i = 0; i < 4; i++) { + const LowHealthReplacement &entry = LOW_HEALTH_REPLACEMENTS[i]; + if (specialItemId == entry.mOriginalIdx && dAcPy_c::LINK->hasLessThanQuarterHealth(false)) { + specialItemId = entry.mReplacementIndex; + break; + } + } + + bool ret = spawnSpecialDropItem(specialItemId, roomid, pos, subtype, rot); + if (shouldTryExtraHearts(specialItemId)) { + for (u32 i = 0; i < adventurePouchCountItem(/* HEART_MEDAL */ 100); i++) { + bool ok = spawnSpecialDropItem(0x27, roomid, pos, subtype, rot); + ret |= ok; + } + } + + if (shouldTryExtraRupees(specialItemId)) { + for (u32 i = 0; + i < adventurePouchCountItem(/* RUPEE_MEDAL */ 101) + adventurePouchCountItem(/* CURSED_MEDAL */ 104); + i++) { + bool ok = spawnSpecialDropItem(0x28, roomid, pos, subtype, rot); + ret |= ok; + } + } + + return ret; +} // 800c7ef0 // Very unmatching. Just here as a starting point -bool spawnSpecialDropItem(SpecialItemDropMgr *mgr, int specialItemId, int roomid, mVec3_c *pos, int subtype, s16 *rot) { - u32 unk = fn_800C7BB0(mgr, specialItemId); +bool SpecialItemDropMgr::spawnSpecialDropItem(int specialItemId, int roomid, mVec3_c *pos, int subtype, mAng rot) { + s32 unk = fn_800C7BB0(specialItemId); if (unk == 0) { return false; } @@ -61,31 +524,31 @@ bool spawnSpecialDropItem(SpecialItemDropMgr *mgr, int specialItemId, int roomid itemCount = 2; } - s16 currentRot; - s16 tempOther; - u16 itemid = SPECIAL_ITEM_ARRAY[unk]; + mAng currentRot; + mAng tempOther; + u32 itemid = SPECIAL_ITEM_ARRAY[unk]; mAng3_c itemRot(0, 0, 0); if (subtype == 2 || subtype == 6) { - currentRot = *rot; + currentRot = rot; tempOther = -0xe39; } else { - currentRot = targetAngleY(&(dAcPy_c::LINK->position), pos); + currentRot = cLib::targetAngleY(dAcPy_c::LINK->position, *pos); tempOther = -0x8000; currentRot += 0x4000; } - s16 angleDecrement = tempOther / itemCount; + // This angle code is annoying. d_t_reaction has similar code + s32 angleDecrement = tempOther / itemCount; tempOther = angleDecrement / 2; currentRot += tempOther; - tempOther /= 2; + tempOther = tempOther / 2; - for (s8 currentItemIndex = 0; currentItemIndex < itemCount; currentItemIndex++) { - s16 out; - SpecialItemDropMgr::fn_800C81D0(out, tempOther, -tempOther); + for (int currentItemIndex = 0; currentItemIndex < itemCount; currentItemIndex++) { + mAng out = cM::rndRange(tempOther, -tempOther); itemRot.y = currentRot + out; - if (unk < 15) { - itemid = RAND_RUPEE_ARRAY[rndInt(3)]; + if (unk >= 12 && unk < 14) { + itemid = RAND_RUPEE_ARRAY[cM::rndInt(3)]; spawnItem1(itemid, roomid, pos, &itemRot, 0xFFFFFFFF, 0); } else if (subtype == 2) { spawnItem2(itemid, roomid, pos, &itemRot, 0xFFFFFFFF, 0); @@ -93,7 +556,7 @@ bool spawnSpecialDropItem(SpecialItemDropMgr *mgr, int specialItemId, int roomid if (subtype == 1) { spawnItem3(itemid, roomid, pos, &itemRot, 0xFFFFFFFF, 0); } else if (subtype == 4) { - spawnItem4(itemid, roomid, pos, &itemRot, 0xFFFFFFFF, 0); + spawnItem4(itemid, 0, 0xFFFFFFFF); } else if (subtype == 3) { spawnItem5(itemid, roomid, pos, &itemRot, 0xFFFFFFFF, 0); } else if (subtype == 5) { @@ -101,18 +564,15 @@ bool spawnSpecialDropItem(SpecialItemDropMgr *mgr, int specialItemId, int roomid } else if (subtype == 6) { spawnItem7(itemid, roomid, pos, &itemRot, 0xFFFFFFFF, 0); } else if (subtype == 7) { - spawnItem8(itemid, roomid, pos, &itemRot, 0xFFFFFFFF, 0); + spawnItem8(itemid, roomid, pos, &itemRot, nullptr, nullptr, 0xFFFFFFFF, 0); } else { - spawnItem9(itemid, roomid, pos, &itemRot, 0xFFFFFFFF, 0); + spawnItem9(itemid, roomid, pos, &itemRot); } } - currentRot -= angleDecrement; + currentRot.mVal -= angleDecrement; } return true; } -// 800c81d0 -void fn_800C81D0(s16, s16, s16){}; - // 800c8270 -SpecialItemDropMgr::~SpecialItemDropMgr() {} +// SpecialItemDropMgr::~SpecialItemDropMgr() {} From 25f6797ab86700fa301423e003f32d770845d0e1 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Wed, 6 Nov 2024 16:47:58 -0500 Subject: [PATCH 08/10] oops --- include/c/c_math.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/include/c/c_math.h b/include/c/c_math.h index ee21fe0d..f9e6309a 100644 --- a/include/c/c_math.h +++ b/include/c/c_math.h @@ -11,7 +11,7 @@ int rndInt(int max); f32 rndF(f32 max); f32 rndFX(f32 amp); -template +template T rndRange(T min, T max) { f32 r = cM::rndF(max - min); f32 m = min; @@ -19,6 +19,7 @@ T rndRange(T min, T max) { return m; } +template inline T minMaxLimit(T val, T min, T max) { return (T)((T)val < (T)min ? (T)min : ((T)val > (T)max ? (T)max : (T)val)); } From d3d4bd253ce9eb259df2a09543eaf341c17f579b Mon Sep 17 00:00:00 2001 From: robojumper Date: Wed, 6 Nov 2024 23:19:40 +0100 Subject: [PATCH 09/10] Some large functions in d_tag_processor (#86) * d_tag_processor WIP * Progress * Unconst * Fix switch command (thanks Roeming!) * Match a random text related file instead * More progress * More progress * No missing breaks * Some repair * Some repair and shuffling * More repair * a bit better * a bit better 2 * what a switch order * Closer unrolling * Minor cleanup * Fix accidental cases * More fixes * even better * More fixes * Down to regswaps * Some renames * Review feedback * cleanup more sdata2 values and eventFlowTextProcessingRelated match --------- Co-authored-by: elijah-thomas774 --- config/SOUE01/splits.txt | 20 +- config/SOUE01/symbols.txt | 144 ++--- configure.py | 2 + include/d/d_tag_processor.h | 148 +++++ include/d/d_textunk.h | 118 ++++ include/d/lyt/d_textbox.h | 16 +- include/libms/commonlib.h | 5 + include/libms/flowfile.h | 5 + include/libms/libms.h | 5 + include/libms/msgfile.h | 5 + include/nw4r/lyt/lyt_pane.h | 4 + src/d/d_tag_processor.cpp | 1061 +++++++++++++++++++++++++++++++++++ src/d/d_textunk.cpp | 188 +++++++ 13 files changed, 1644 insertions(+), 77 deletions(-) create mode 100644 include/d/d_tag_processor.h create mode 100644 include/d/d_textunk.h create mode 100644 src/d/d_tag_processor.cpp create mode 100644 src/d/d_textunk.cpp diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index e14eb5f1..c01b2398 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -192,9 +192,22 @@ d/lyt/d_window.cpp: .data start:0x80510820 end:0x805108B0 .sdata2 start:0x805797F0 end:0x805797F8 -d/d_text_writer.cpp: +d/d_textunk.cpp: + .text start:0x800B1890 end:0x800B20DC + .ctors start:0x804DB6D0 end:0x804DB6D4 + .data start:0x805108C8 end:0x805108D8 + .sdata start:0x805722D8 end:0x805722E0 + .sbss start:0x805753B0 end:0x805753B8 + .sdata2 start:0x805797F8 end:0x80579848 + .bss start:0x805A6F70 end:0x805A7730 + +d/d_tag_processor.cpp: .text start:0x800B35C0 end:0x800B9274 .ctors start:0x804DB6D4 end:0x804DB6D8 + .rodata start:0x804E4C34 end:0x804E4C50 + .data start:0x805108E8 end:0x805109A0 + .sdata2 start:0x8057986C end:0x805798D0 + .bss start:0x805A7730 end:0x805A78B8 toBeSorted/time_area_mgr.cpp: .text start:0x800B9280 end:0x800BB2A0 @@ -347,8 +360,11 @@ d/lyt/d_lyt_msg_window_select_btn.cpp: .text start:0x8011C8D0 end:0x80120988 .ctors start:0x804DB73C end:0x804DB740 +d/lyt/d_lyt_msg_window_base.cpp: + .text start:0x80120A20 end:0x80120A98 + d/lyt/d_lyt_msg_window_talk.cpp: - .text start:0x80120A20 end:0x801223C8 + .text start:0x80120AA0 end:0x801223C8 .ctors start:0x804DB740 end:0x804DB744 d/lyt/d_lyt_msg_window_link.cpp: diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 9d424c41..3338776c 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -3783,7 +3783,7 @@ syncAnmFrame__Q23d2d14AnmGroupBase_cFv = .text:0x800AC910; // type:function size setForward__Q23d2d14AnmGroupBase_cFv = .text:0x800AC920; // type:function size:0x14 setBackward__Q23d2d14AnmGroupBase_cFv = .text:0x800AC940; // type:function size:0x14 fn_800AC960 = .text:0x800AC960; // type:function size:0x4C -init__Q23d2d9AnmGroupsFPQ23d2d10AnmGroup_cPQ23d2d15LytBrlanMappingUlPQ23m2d10ResAccIf_cPQ23d2d8Layout_c = .text:0x800AC9B0; // type:function size:0x80 +init__Q23d2d9AnmGroupsFPQ23d2d10AnmGroup_cPCQ23d2d15LytBrlanMappingUlPQ23m2d10ResAccIf_cPQ23d2d8Layout_c = .text:0x800AC9B0; // type:function size:0x80 remove__Q23d2d9AnmGroupsFv = .text:0x800ACA30; // type:function size:0x64 draw__Q23d2d9LytBase_cFv = .text:0x800ACAA0; // type:function size:0x18 fn_800ACAC0 = .text:0x800ACAC0; // type:function size:0x5C @@ -3868,25 +3868,25 @@ UpdateSize__9dWindow_cFP10dTextBox_cf = .text:0x800B1670; // type:function size: GetRuntimeTypeInfo__Q34nw4r3lyt6WindowCFv = .text:0x800B17B0; // type:function size:0x8 scope:weak __dt__9dWindow_cFv = .text:0x800B17C0; // type:function size:0x58 __dt__Q34nw4r3lyt19ArcResourceAccessorFv = .text:0x800B1820; // type:function size:0x6C scope:weak -fn_800B1890 = .text:0x800B1890; // type:function size:0x40 -fn_800B18D0 = .text:0x800B18D0; // type:function size:0x4D4 -fn_800B1DB0 = .text:0x800B1DB0; // type:function size:0x15C -fn_800B1F10 = .text:0x800B1F10; // type:function size:0x34 -fn_800B1F50 = .text:0x800B1F50; // type:function size:0x8 -fn_800B1F60 = .text:0x800B1F60; // type:function size:0x4 -fn_800B1F70 = .text:0x800B1F70; // type:function size:0x4C -fn_800B1FC0 = .text:0x800B1FC0; // type:function size:0x8 -fn_800B1FD0 = .text:0x800B1FD0; // type:function size:0x8 -fn_800B1FE0 = .text:0x800B1FE0; // type:function size:0x8 -fn_800B1FF0 = .text:0x800B1FF0; // type:function size:0x8 -fn_800B2000 = .text:0x800B2000; // type:function size:0x8 -fn_800B2010 = .text:0x800B2010; // type:function size:0x8 -fn_800B2020 = .text:0x800B2020; // type:function size:0x8 -fn_800B2030 = .text:0x800B2030; // type:function size:0x8 -fn_800B2040 = .text:0x800B2040; // type:function size:0x8 -fn_800B2050 = .text:0x800B2050; // type:function size:0x40 -fn_800B2090 = .text:0x800B2090; // type:function size:0x40 -fn_800B20D0 = .text:0x800B20D0; // type:function size:0xC +__dt__12UnkTextThingFv = .text:0x800B1890; // type:function size:0x40 +__ct__12UnkTextThingFv = .text:0x800B18D0; // type:function size:0x4D4 +destroy__12UnkTextThingFv = .text:0x800B1DB0; // type:function size:0x15C +fn_800B1F10__12UnkTextThingFv = .text:0x800B1F10; // type:function size:0x34 +allocUnk__12UnkTextThingFUli = .text:0x800B1F50; // type:function size:0x8 +destroyUnk__12UnkTextThingFPv = .text:0x800B1F60; // type:function size:0x4 +fn_800B1F70__12UnkTextThingFv = .text:0x800B1F70; // type:function size:0x4C +fn_800B1FC0__12UnkTextThingFv = .text:0x800B1FC0; // type:function size:0x8 +fn_800B1FD0__12UnkTextThingFv = .text:0x800B1FD0; // type:function size:0x8 +fn_800B1FE0__12UnkTextThingFv = .text:0x800B1FE0; // type:function size:0x8 +fn_800B1FF0__12UnkTextThingFv = .text:0x800B1FF0; // type:function size:0x8 +fn_800B2000__12UnkTextThingFv = .text:0x800B2000; // type:function size:0x8 +fn_800B2010__12UnkTextThingFv = .text:0x800B2010; // type:function size:0x8 +fn_800B2020__12UnkTextThingFv = .text:0x800B2020; // type:function size:0x8 +fn_800B2030__12UnkTextThingFv = .text:0x800B2030; // type:function size:0x8 +fn_800B2040__12UnkTextThingFv = .text:0x800B2040; // type:function size:0x8 +destroyMsg__12UnkTextThingFP8MsbtInfo = .text:0x800B2050; // type:function size:0x40 +destroyFlow__12UnkTextThingFP8MsbfInfo = .text:0x800B2090; // type:function size:0x40 +__sinit_\d_textunk_cpp = .text:0x800B20D0; // type:function size:0xC scope:local LytMsgWindowUnk__ctor = .text:0x800B20E0; // type:function size:0x48 fn_800B2130 = .text:0x800B2130; // type:function size:0x370 textAdvancingRelated = .text:0x800B24A0; // type:function size:0x5FC @@ -3900,69 +3900,69 @@ fn_800B32E0 = .text:0x800B32E0; // type:function size:0x84 drawTextBlur = .text:0x800B3370; // type:function size:0x138 fn_800B34B0 = .text:0x800B34B0; // type:function size:0x40 fn_800B34F0 = .text:0x800B34F0; // type:function size:0xD0 -TextManager__ctor = .text:0x800B35C0; // type:function size:0x260 -fn_800B3820 = .text:0x800B3820; // type:function size:0x58 +__ct__15dTagProcessor_cFv = .text:0x800B35C0; // type:function size:0x260 +__dt__15dTagProcessor_cFv = .text:0x800B3820; // type:function size:0x58 fn_800B3880 = .text:0x800B3880; // type:function size:0x8C -eventFlowTextProcessingRelated = .text:0x800B3910; // type:function size:0x980 +eventFlowTextProcessingRelated__15dTagProcessor_cFP10dTextBox_cPCwPwUlPUl = .text:0x800B3910; // type:function size:0x980 fn_800B4290 = .text:0x800B4290; // type:function size:0x5AC -TextManager__Process = .text:0x800B4840; // type:function size:0x10 -TextManager__CalcRect = .text:0x800B4850; // type:function size:0x4 -TextManager__ProcessTags = .text:0x800B4860; // type:function size:0x78C -fn_800B4FF0 = .text:0x800B4FF0; // type:function size:0x274 -TextManager__setColor = .text:0x800B5270; // type:function size:0x214 -TextManager__setScale = .text:0x800B5490; // type:function size:0x5C -TextManager__setFramesLeftOnPause = .text:0x800B54F0; // type:function size:0xC -fn_800B5500 = .text:0x800B5500; // type:function size:0x18 -fn_800B5520 = .text:0x800B5520; // type:function size:0x14 -fn_800B5540 = .text:0x800B5540; // type:function size:0x28 -fn_800B5570 = .text:0x800B5570; // type:function size:0x110 -fn_800B5680 = .text:0x800B5680; // type:function size:0x1DC -fn_800B5860 = .text:0x800B5860; // type:function size:0x1C0 -fn_800B5A20 = .text:0x800B5A20; // type:function size:0x3AC -fn_800B5DD0 = .text:0x800B5DD0; // type:function size:0x1FC -fn_800B5FD0 = .text:0x800B5FD0; // type:function size:0x10C -fn_800B60E0 = .text:0x800B60E0; // type:function size:0x24 -fn_800B6110 = .text:0x800B6110; // type:function size:0x24 -fn_800B6140 = .text:0x800B6140; // type:function size:0x14 -fn_800B6160 = .text:0x800B6160; // type:function size:0x8 -fn_800B6170 = .text:0x800B6170; // type:function size:0x14 -fn_800B6190 = .text:0x800B6190; // type:function size:0x1C -fn_800B61B0 = .text:0x800B61B0; // type:function size:0x18 -fn_800B61D0 = .text:0x800B61D0; // type:function size:0x64 -TextManager__changeScale = .text:0x800B6240; // type:function size:0xDC -fn_800B6320 = .text:0x800B6320; // type:function size:0x12C -fn_800B6450 = .text:0x800B6450; // type:function size:0x340 +Process__15dTagProcessor_cFUsPQ34nw4r2ut15PrintContext = .text:0x800B4840; // type:function size:0x10 +CalcRect__15dTagProcessor_cFPQ34nw4r2ut4RectUsPQ34nw4r2ut15PrintContext = .text:0x800B4850; // type:function size:0x4 +ProcessTags__15dTagProcessor_cFPQ34nw4r2ut4RectUsPQ34nw4r2ut15PrintContext = .text:0x800B4860; // type:function size:0x78C +fn_800B4FF0__15dTagProcessor_cFPQ34nw4r2ut4RectPQ34nw4r2ut15PrintContextUcPw = .text:0x800B4FF0; // type:function size:0x274 +setColor__15dTagProcessor_cFPQ34nw4r2ut4RectPQ34nw4r2ut15PrintContextUcPw = .text:0x800B5270; // type:function size:0x214 +setScale__15dTagProcessor_cFPQ34nw4r2ut4RectPQ34nw4r2ut15PrintContextUcPw = .text:0x800B5490; // type:function size:0x5C +setFramesLeftOnPause__15dTagProcessor_cFPQ34nw4r2ut4RectPQ34nw4r2ut15PrintContextUcPw = .text:0x800B54F0; // type:function size:0xC +fn_800B5500__15dTagProcessor_cFUcPw = .text:0x800B5500; // type:function size:0x18 +fn_800B5520__15dTagProcessor_cFPw = .text:0x800B5520; // type:function size:0x14 +fn_800B5540__15dTagProcessor_cFPw = .text:0x800B5540; // type:function size:0x28 +writeHeroname__15dTagProcessor_cFPwPll = .text:0x800B5570; // type:function size:0x110 +writeItem__15dTagProcessor_cFPwPwPll = .text:0x800B5680; // type:function size:0x1DC +writeStringArg__15dTagProcessor_cFPwPwPll = .text:0x800B5860; // type:function size:0x1C0 +writeNumericArg__15dTagProcessor_cFPwPwPll = .text:0x800B5A20; // type:function size:0x3AC +fn_800B5DD0__15dTagProcessor_cFPwPwPll = .text:0x800B5DD0; // type:function size:0x1FC +fn_800B5FD0__15dTagProcessor_cFUlPwPl = .text:0x800B5FD0; // type:function size:0x10C +fn_800B60E0__15dTagProcessor_cFUcPw = .text:0x800B60E0; // type:function size:0x24 +fn_800B6110__15dTagProcessor_cFUcPw = .text:0x800B6110; // type:function size:0x24 +fn_800B6140__15dTagProcessor_cFUcPw = .text:0x800B6140; // type:function size:0x14 +playSound__15dTagProcessor_cFUcPw = .text:0x800B6160; // type:function size:0x8 +fn_800B6170__15dTagProcessor_cFUcPw = .text:0x800B6170; // type:function size:0x14 +fn_800B6190__15dTagProcessor_cFUcPw = .text:0x800B6190; // type:function size:0x1C +fn_800B61B0__15dTagProcessor_cFUcPw = .text:0x800B61B0; // type:function size:0x18 +fn_800B61D0__15dTagProcessor_cFPQ34nw4r2ut4RectPQ34nw4r2ut15PrintContextUcPw = .text:0x800B61D0; // type:function size:0x64 +changeScale__15dTagProcessor_cFPQ34nw4r2ut4RectPQ34nw4r2ut15PrintContextb = .text:0x800B6240; // type:function size:0xDC +writeIcon__15dTagProcessor_cFP10dTextBox_cPwf = .text:0x800B6320; // type:function size:0x12C +fn_800B6450__15dTagProcessor_cFPQ34nw4r2ut4RectPQ34nw4r2ut15PrintContextUcPw = .text:0x800B6450; // type:function size:0x340 fn_800B6790 = .text:0x800B6790; // type:function size:0x750 -fn_800B6EE0 = .text:0x800B6EE0; // type:function size:0x1E8 +makeSpaceForIconMaybe__15dTagProcessor_cFPQ34nw4r2ut4RectPQ34nw4r2ut15PrintContextPw = .text:0x800B6EE0; // type:function size:0x1E8 fn_800B70D0 = .text:0x800B70D0; // type:function size:0x3A4 somethingWithScrapperAndMusic = .text:0x800B7480; // type:function size:0xB8 -fn_800B7540 = .text:0x800B7540; // type:function size:0x250 -fn_800B7790 = .text:0x800B7790; // type:function size:0xD8 -symbolToFontIdx = .text:0x800B7870; // type:function size:0x10 +restoreColor__15dTagProcessor_cFPQ34nw4r2ut15PrintContextUc = .text:0x800B7540; // type:function size:0x250 +writeTextNormal__15dTagProcessor_cFPCwPwPlUcl = .text:0x800B7790; // type:function size:0xD8 +symbolToFontIdx__15dTagProcessor_cFl = .text:0x800B7870; // type:function size:0x10 fn_800B7880 = .text:0x800B7880; // type:function size:0x210 fn_800B7A90 = .text:0x800B7A90; // type:function size:0x9C fn_800B7B30 = .text:0x800B7B30; // type:function size:0x46C -TextManager__setStringArg = .text:0x800B7FA0; // type:function size:0xA0 -fn_800B8040 = .text:0x800B8040; // type:function size:0x1F0 +setStringArg__15dTagProcessor_cFPCwl = .text:0x800B7FA0; // type:function size:0xA0 +fn_800B8040__15dTagProcessor_cFScUl = .text:0x800B8040; // type:function size:0x1F0 fn_800B8230 = .text:0x800B8230; // type:function size:0x10C fn_800B8340 = .text:0x800B8340; // type:function size:0x18C fn_800B84D0 = .text:0x800B84D0; // type:function size:0x8C fn_800B8560 = .text:0x800B8560; // type:function size:0x54 fn_800B85C0 = .text:0x800B85C0; // type:function size:0x290 -fn_800B8850 = .text:0x800B8850; // type:function size:0x38 -TextManager__getTextCommands = .text:0x800B8890; // type:function size:0x38 -TextManager__process0xFCommand = .text:0x800B88D0; // type:function size:0xC -fn_800B88E0 = .text:0x800B88E0; // type:function size:0x30 -fn_800B8910 = .text:0x800B8910; // type:function size:0x1C -fn_800B8930 = .text:0x800B8930; // type:function size:0x30 -fn_800B8960 = .text:0x800B8960; // type:function size:0xD8 -fn_800B8A40 = .text:0x800B8A40; // type:function size:0x10 -TextManager__setNumericArg0 = .text:0x800B8A50; // type:function size:0xC -TextManager__setNumericArgs = .text:0x800B8A60; // type:function size:0xDC +getNumLines__15dTagProcessor_cFl = .text:0x800B8850; // type:function size:0x38 +getTextCommand__15dTagProcessor_cFwPCwPUcPlPPw = .text:0x800B8890; // type:function size:0x38 +process0xFCommand__15dTagProcessor_cFwPCwPl = .text:0x800B88D0; // type:function size:0xC +tick0x830__15dTagProcessor_cFv = .text:0x800B88E0; // type:function size:0x30 +resetSomething__15dTagProcessor_cFv = .text:0x800B8910; // type:function size:0x1C +tickPauseFrame__15dTagProcessor_cFv = .text:0x800B8930; // type:function size:0x30 +resetSomeFloats__15dTagProcessor_cFv = .text:0x800B8960; // type:function size:0xD8 +getFloat__15dTagProcessor_cFl = .text:0x800B8A40; // type:function size:0x10 +setNumericArg0__15dTagProcessor_cFl = .text:0x800B8A50; // type:function size:0xC +setNumericArgs__15dTagProcessor_cFPCll = .text:0x800B8A60; // type:function size:0xDC fn_800B8B40 = .text:0x800B8B40; // type:function size:0x4C fn_800B8B90 = .text:0x800B8B90; // type:function size:0x4C fn_800B8BE0 = .text:0x800B8BE0; // type:function size:0x34 -TextManager__sinit = .text:0x800B8C20; // type:function size:0x654 +__sinit_\d_tag_processor_cpp = .text:0x800B8C20; // type:function size:0x654 scope:local __ct__14dTimeAreaMgr_cFv = .text:0x800B9280; // type:function size:0xF0 __dt__19dTimeAreaMgrProcA_cFv = .text:0x800B9370; // type:function size:0x58 __dt__19dTimeAreaMgrProcB_cFv = .text:0x800B93D0; // type:function size:0x58 @@ -30989,12 +30989,12 @@ lbl_8051078C = .data:0x8051078C; // type:object size:0xC lbl_80510798 = .data:0x80510798; // type:object size:0x88 __vt__9dWindow_c = .data:0x80510820; // type:object size:0x8C __vt__Q23d2d10ResAccIf_c = .data:0x805108B0; // type:object size:0x18 -lbl_805108C8 = .data:0x805108C8; // type:object size:0x10 +__vt__12UnkTextThing = .data:0x805108C8; // type:object size:0xC lbl_805108D8 = .data:0x805108D8; // type:object size:0x10 lbl_805108E8 = .data:0x805108E8; // type:object size:0x10 lbl_805108F8 = .data:0x805108F8; // type:object size:0x14 data:string jumptable_8051090C = .data:0x8051090C; // type:object size:0x80 scope:local -lbl_8051098C = .data:0x8051098C; // type:object size:0x14 +__vt__15dTagProcessor_c = .data:0x8051098C; // type:object size:0x14 lbl_805109A0 = .data:0x805109A0; // type:object size:0x20 lbl_805109C0 = .data:0x805109C0; // type:object size:0x20 lbl_805109E0 = .data:0x805109E0; // type:object size:0x88 @@ -37965,7 +37965,7 @@ lbl_805722BC = .sdata:0x805722BC; // type:object size:0x4 lbl_805722C0 = .sdata:0x805722C0; // type:object size:0x4 data:wstring lbl_805722C4 = .sdata:0x805722C4; // type:object size:0x8 lbl_805722CC = .sdata:0x805722CC; // type:object size:0xC -lbl_805722D8 = .sdata:0x805722D8; // type:object size:0x8 +lbl_805722D8 = .sdata:0x805722D8; // type:object size:0x1 lbl_805722E0 = .sdata:0x805722E0; // type:object size:0x8 lbl_805722E8 = .sdata:0x805722E8; // type:object size:0x8 lbl_805722F0 = .sdata:0x805722F0; // type:object size:0x4 data:4byte @@ -39932,7 +39932,7 @@ lbl_80575398 = .sbss:0x80575398; // type:object size:0x8 data:byte SCRAPPER_PICKUP_TARGET = .sbss:0x805753A0; // type:object size:0x8 data:4byte lbl_805753A8 = .sbss:0x805753A8; // type:object size:0x1 data:byte lbl_805753AC = .sbss:0x805753AC; // type:object size:0x4 data:4byte -lbl_805753B0 = .sbss:0x805753B0; // type:object size:0x8 data:4byte +sInstance__12UnkTextThing = .sbss:0x805753B0; // type:object size:0x4 data:4byte lbl_805753B8 = .sbss:0x805753B8; // type:object size:0x1 data:byte lbl_805753BC = .sbss:0x805753BC; // type:object size:0x4 data:4byte sInstance__14dTimeAreaMgr_c = .sbss:0x805753C0; // type:object size:0x4 data:4byte @@ -48338,7 +48338,7 @@ lbl_805A6340 = .bss:0x805A6340; // type:object size:0x30 data:4byte eventFlowTextStringMaybe1 = .bss:0x805A6370; // type:object size:0x400 eventFlowTextStringMaybe2 = .bss:0x805A6770; // type:object size:0x400 eventFlowTextStringMaybe3 = .bss:0x805A6B70; // type:object size:0x400 -eventFlowTextStringMaybe4 = .bss:0x805A6F70; // type:object size:0x7C0 +textThing = .bss:0x805A6F70; // type:object size:0x7C0 FontColors1 = .bss:0x805A7730; // type:object size:0xC4 data:byte FontColors2 = .bss:0x805A77F4; // type:object size:0xC4 data:byte lbl_805A78B8 = .bss:0x805A78B8; // type:object size:0xC diff --git a/configure.py b/configure.py index 1a158930..8d264269 100644 --- a/configure.py +++ b/configure.py @@ -365,6 +365,8 @@ def nw4rLib(lib_name, objects, extra_cflags=[]): Object(NonMatching, "d/lyt/d2d.cpp"), Object(NonMatching, "d/lyt/d_textbox.cpp"), Object(Matching, "d/lyt/d_window.cpp"), + Object(Matching, "d/d_textunk.cpp"), + Object(NonMatching, "d/d_tag_processor.cpp"), Object(NonMatching, "d/lyt/meter/d_lyt_meter.cpp"), Object(NonMatching, "d/lyt/meter/d_lyt_meter_unk.cpp"), Object(NonMatching, "d/lyt/meter/d_lyt_meter_a_btn.cpp"), diff --git a/include/d/d_tag_processor.h b/include/d/d_tag_processor.h new file mode 100644 index 00000000..c68ad2f1 --- /dev/null +++ b/include/d/d_tag_processor.h @@ -0,0 +1,148 @@ +#ifndef D_TAG_PROCESSOR_H +#define D_TAG_PROCESSOR_H + +#include "d/lyt/d_textbox.h" +#include "nw4r/ut/ut_TagProcessorBase.h" +#include "nw4r/ut/ut_TextWriterBase.h" + +// inofficial name +// size: 0xEF4 +class dTagProcessor_c : public nw4r::ut::TagProcessorBase { +public: + dTagProcessor_c(); + virtual ~dTagProcessor_c(); + + void + eventFlowTextProcessingRelated(dTextBox_c *textBox, const wchar_t *src, wchar_t *dest, u32 destLen, u32 *pOutLen); + + virtual nw4r::ut::Operation Process(u16 ch, nw4r::ut::PrintContext *ctx) override; + virtual nw4r::ut::Operation CalcRect(nw4r::ut::Rect *rect, u16 ch, nw4r::ut::PrintContext *ctx) override; + + nw4r::ut::Operation ProcessTags(nw4r::ut::Rect *rect, u16 ch, nw4r::ut::PrintContext *ctx); + + void changeScale(nw4r::ut::Rect *rect, nw4r::ut::PrintContext *ctx, bool); + wchar_t *writeItem(wchar_t *dest, wchar_t *src, s32 *, s32); + wchar_t *writeStringArg(wchar_t *dest, wchar_t *src, s32 *, s32); + wchar_t *writeNumericArg(wchar_t *dest, wchar_t *src, s32 *, s32); + void fn_800B4FF0(nw4r::ut::Rect *rect, nw4r::ut::PrintContext *ctx, u8 cmdLen, wchar_t *ptr); + void fn_800B6450(nw4r::ut::Rect *rect, nw4r::ut::PrintContext *ctx, u8 cmdLen, wchar_t *ptr); + void makeSpaceForIconMaybe(nw4r::ut::Rect *rect, nw4r::ut::PrintContext *ctx, wchar_t *ptr); + void fn_800B61D0(nw4r::ut::Rect *rect, nw4r::ut::PrintContext *ctx, u8 cmdLen, wchar_t *ptr); + void setFramesLeftOnPause(nw4r::ut::Rect *rect, nw4r::ut::PrintContext *ctx, u8 cmdLen, wchar_t *ptr); + void fn_800B5500(u8 cmdLen, wchar_t *ptr); + void fn_800B5540(wchar_t *ptr); + void fn_800B60E0(u8 cmdLen, wchar_t *ptr); + void fn_800B6110(u8 cmdLen, wchar_t *ptr); + void fn_800B6140(u8 cmdLen, wchar_t *ptr); + void playSound(u8 cmdLen, wchar_t *ptr); + void fn_800B6170(u8 cmdLen, wchar_t *ptr); + void fn_800B6190(u8 cmdLen, wchar_t *ptr); + void fn_800B61B0(u8 cmdLen, wchar_t *ptr); + void setColor(nw4r::ut::Rect *rect, nw4r::ut::PrintContext *ctx, u8 cmdLen, wchar_t *ptr); + void restoreColor(nw4r::ut::PrintContext *ctx, u8 windowType); + void setScale(nw4r::ut::Rect *rect, nw4r::ut::PrintContext *ctx, u8 cmdLen, wchar_t *ptr); + + u8 symbolToFontIdx(s32 s); + void setStringArg(const wchar_t *arg, s32 index); + + static s32 getNumLines(s32 arg); + + static void getTextCommand(wchar_t _0xe, const wchar_t *src, u8 *outCmdLen, s32 *outCmd, wchar_t **outEndPtr); + static void process0xFCommand(wchar_t _0xf, const wchar_t *src, s32 *outCmd); + + static f32 fn_800B8040(s8, u32); + wchar_t *fn_800B5FD0(u32, wchar_t *, s32 *); + wchar_t *writeTextNormal(const wchar_t *src, wchar_t *dest, s32 *, u8 cmdLen, s32); + wchar_t *writeHeroname(wchar_t *dest, s32 *, s32); + wchar_t *fn_800B5DD0(wchar_t *dest, wchar_t *src, s32 *, s32); + void fn_800B5520(wchar_t *src); + void writeIcon(dTextBox_c *textBox, wchar_t *cmd, f32); + char fn_800B7880(u32); + void fn_800B70D0(nw4r::ut::TextWriterBase *, nw4r::ut::PrintContext *ctx, u16 c, s32); + + void resetSomething(); + void resetSomeFloats(); + void setNumericArg0(s32 arg); + void setNumericArgs(const s32 *args, s32 numArgs); + f32 getFloat(s32 i); + s32 tickPauseFrame(); + s32 tick0x830(); + +private: + /* 0x004 */ dTextBox_c *field_0x004; + /* 0x008 */ wchar_t field_0x008[4][256]; + /* 0x808 */ wchar_t field_0x808[4]; + /* 0x810 */ f32 field_0x810; + /* 0x814 */ f32 field_0x814; + /* 0x818 */ f32 field_0x818; + /* 0x81C */ s32 field_0x81C; + /* 0x820 */ s32 field_0x820; + /* 0x824 */ s32 field_0x824; + /* 0x828 */ s32 field_0x828; + /* 0x82C */ s32 field_0x82C; + /* 0x830 */ s32 field_0x830; + /* 0x834 */ s32 mPauseFramesLeft; + /* 0x838 */ s32 field_0x838; + /* 0x83C */ s32 field_0x83C; + /* 0x840 */ s32 field_0x840; + /* 0x844 */ s32 field_0x844; + /* 0x848 */ s32 field_0x848; + /* 0x84C */ s32 field_0x84C; + /* 0x850 */ s32 field_0x850; + /* 0x854 */ s32 field_0x854; + /* 0x858 */ s32 field_0x858; + /* 0x85C */ s32 field_0x85C; + /* 0x860 */ s32 field_0x860; + /* 0x864 */ s32 field_0x864; + /* 0x868 */ s32 field_0x868; + /* 0x86C */ s32 field_0x86C; + /* 0x870 */ s32 field_0x870; + /* 0x874 */ s32 field_0x874; + /* 0x878 */ s32 field_0x878; + /* 0x87C */ s32 field_0x87C; + /* 0x880 */ s32 field_0x880; + /* 0x884 */ s32 field_0x884; + /* 0x888 */ s32 field_0x888; + /* 0x88C */ s32 field_0x88C; + /* 0x890 */ s32 field_0x890; + /* 0x894 */ s32 field_0x894; + /* 0x898 */ s32 field_0x898; + /* 0x89C */ s32 mNumericArgs[10]; + /* 0x8C4 */ s32 mNumericArgsCopy[10]; + /* 0x8EC */ s32 field_0x8EC; + /* 0x8EC */ s32 field_0x8F0; + /* 0x8F4 */ s32 field_0x8F4; + /* 0x8F8 */ s32 field_0x8F8; + /* 0x8FC */ s32 field_0x8FC; + /* 0x900 */ s32 field_0x900; + /* 0x904 */ f32 field_0x904; + /* 0x908 */ f32 field_0x908; + /* 0x90C */ u8 field_0x90C; + /* 0x90D */ u8 field_0x90D; + /* 0x90E */ u8 field_0x90E; + /* 0x90F */ u8 field_0x90F[4]; + /* 0x914 */ f32 field_0x914[0x32]; + /* 0x9DC */ s32 mCommandInsert; + /* 0x9E0 */ wchar_t mStringArgs[8][64]; + /* 0xDE0 */ u8 field_0xDE0[0xEE0 - 0xDE0]; + /* 0xEE0 */ u8 field_0xEE0; + /* 0xEE1 */ u8 field_0xEE1; + /* 0xEE2 */ u8 field_0xEE2; + /* 0xEE3 */ u8 field_0xEE3; + /* 0xEE4 */ u8 field_0xEE4; + /* 0xEE5 */ u8 field_0xEE5; + /* 0xEE6 */ u8 field_0xEE6; + /* 0xEE7 */ u8 field_0xEE7; + /* 0xEE8 */ u8 field_0xEE8; + /* 0xEE9 */ u8 field_0xEE9; + /* 0xEEA */ u8 field_0xEEA; + /* 0xEEB */ u8 field_0xEEB; + /* 0xEEC */ u8 field_0xEEC; + /* 0xEED */ u8 field_0xEED; + /* 0xEEE */ u8 field_0xEEE; + /* 0xEEF */ u8 field_0xEEF; + /* 0xEF0 */ u8 field_0xEF0; + /* 0xEF1 */ u8 field_0xEF1; +}; + +#endif diff --git a/include/d/d_textunk.h b/include/d/d_textunk.h new file mode 100644 index 00000000..3860c81b --- /dev/null +++ b/include/d/d_textunk.h @@ -0,0 +1,118 @@ +#ifndef D_TEXTUNK_H +#define D_TEXTUNK_H + +#include "common.h" +#include "libms/flowfile.h" +#include "libms/msgfile.h" +#include "nw4r/ut/ut_Color.h" +#include "sized_string.h" + +class UnkTextThing { +public: + UnkTextThing(); + virtual ~UnkTextThing() {} + + void destroy(); + + inline static f32 getField0x758() { + if (sInstance != nullptr) { + return sInstance->field_0x758; + } + return 0.0f; + } + + inline static f32 getField0x768() { + if (sInstance != nullptr) { + return sInstance->field_0x768; + } + return 0.0f; + } + + inline static f32 getField0x76C() { + if (sInstance != nullptr) { + return sInstance->field_0x76C; + } + return 0.0f; + } + + inline static f32 getFn800B1F70() { + if (sInstance != nullptr) { + return sInstance->fn_800B1F70(); + } + return 1.0f; + } + + inline static f32 getFn800B1F10() { + return sInstance->fn_800B1F10(); + } + +private: + static UnkTextThing *sInstance; + + void *allocUnk(size_t size, int align); + void destroyUnk(void *thing); + void destroyFlow(MsbfInfo *flow); + void destroyMsg(MsbtInfo *msg); + + f32 fn_800B1F10(); + f32 fn_800B1F70(); + f32 fn_800B1FC0(); + f32 fn_800B1FD0(); + f32 fn_800B1FE0(); + f32 fn_800B1FF0(); + f32 fn_800B2000(); + f32 fn_800B2010(); + f32 fn_800B2020(); + f32 fn_800B2030(); + f32 fn_800B2040(); + + /* 0x004 */ SizedString<0x80> field_0x004; + /* 0x084 */ SizedString<0x80> field_0x084; + /* 0x104 */ SizedString<0x80> field_0x104; + /* 0x184 */ void *field_buf0[82]; + /* 0x2CC */ void *field_buf4[23]; + /* 0x328 */ void *field_buf1[80]; + /* 0x468 */ MsbtInfo *field_buf2[82]; + /* 0x5B0 */ MsbtInfo *field_buf5[23]; + /* 0x60C */ MsbfInfo *field_buf3[80]; + /* 0x74C */ void *field_0x74C; + /* 0x750 */ void *field_0x750; + /* 0x754 */ f32 field_0x754; + /* 0x758 */ f32 field_0x758; + /* 0x75C */ f32 field_0x75C; + /* 0x760 */ f32 field_0x760; + /* 0x764 */ f32 field_0x764; + /* 0x768 */ f32 field_0x768; + /* 0x76C */ f32 field_0x76C; + /* 0x770 */ f32 field_0x770; + /* 0x774 */ f32 field_0x774; + /* 0x778 */ f32 field_0x778; + /* 0x77C */ f32 field_0x77C; + /* 0x780 */ f32 field_0x780; + /* 0x784 */ f32 field_0x784; + /* 0x788 */ f32 field_0x788; + /* 0x78C */ f32 field_0x78C; + /* 0x790 */ f32 field_0x790; + /* 0x794 */ s16 field_0x794; + /* 0x796 */ s16 field_0x796; + /* 0x798 */ UNKWORD field_0x798; + /* 0x79C */ UNKWORD field_0x79C; + /* 0x7A0 */ UNKWORD field_0x7A0; + /* 0x7A4 */ s16 field_0x7A4; + /* 0x7A6 */ s16 field_0x7A6; + /* 0x7A8 */ s16 field_0x7A8; + /* 0x7AA */ s16 field_0x7AA; + /* 0x7AC */ s16 field_0x7AC; + /* 0x7AE */ s16 field_0x7AE; + /* 0x7B0 */ s16 field_0x7B0; + /* 0x7B2 */ bool field_0x7B2; + /* 0x7B3 */ bool field_0x7B3; + /* 0x7B4 */ bool field_0x7B4; + /* 0x7B5 */ bool field_0x7B5; + /* 0x7B6 */ bool field_0x7B6; + /* 0x7B6 */ bool field_0x7B7; + /* 0x7B8 */ nw4r::ut::Color field_0x7B8; + /* 0x7BC */ nw4r::ut::Color field_0x7BC; +}; + +#endif diff --git a/include/d/lyt/d_textbox.h b/include/d/lyt/d_textbox.h index 768cd1ed..653aafb3 100644 --- a/include/d/lyt/d_textbox.h +++ b/include/d/lyt/d_textbox.h @@ -27,6 +27,14 @@ class dTextBox_c : public nw4r::lyt::TextBox { nw4r::lyt::TextBox::SetScale(value); } + void set0x1F8(u8 val) { + field_0x1F8 = val; + } + + f32 getMyScale() const { + return mScale; + } + static inline f32 GetTranslateX1() { if (lbl_805753B0 != nullptr) { return GetTranslateX1_(); @@ -46,11 +54,13 @@ class dTextBox_c : public nw4r::lyt::TextBox { private: void MySetScale(const nw4r::math::VEC2 &value); - d2d::LytBase_c *mpLytBase; - u8 field_0x108[0x118 - 0x108]; + /* 0x104 */ d2d::LytBase_c *mpLytBase; + /* 0x108 */ u8 field_0x108[0x118 - 0x108]; /* 0x118 */ nw4r::math::VEC2 mTextScale; /* 0x120 */ f32 mScale; - u8 field_0x124[0x204 - 0x124]; + /* 0x124 */ u8 field_0x124[0x1F8 - 0x124]; + /* 0x1F8 */ u8 field_0x1F8; + /* 0x1F9 */ u8 field_0x1F9[0x204 - 0x1F9]; }; #endif diff --git a/include/libms/commonlib.h b/include/libms/commonlib.h index b99702b6..13e8bcc1 100644 --- a/include/libms/commonlib.h +++ b/include/libms/commonlib.h @@ -1,3 +1,6 @@ +#ifndef LIBMS_COMMONLIB_H +#define LIBMS_COMMONLIB_H + #include "common.h" #ifdef __cplusplus @@ -49,3 +52,5 @@ int LMSi_GetHashTableIndexFromLabel(const char *label, int tableSize); #ifdef __cplusplus } #endif + +#endif diff --git a/include/libms/flowfile.h b/include/libms/flowfile.h index a017cf1d..9bc47790 100644 --- a/include/libms/flowfile.h +++ b/include/libms/flowfile.h @@ -1,3 +1,6 @@ +#ifndef LIBMS_FLOWFILE_H +#define LIBMS_FLOWFILE_H + #include "common.h" #ifdef __cplusplus @@ -28,3 +31,5 @@ const unsigned short *LMS_GetBranchPoints(struct MsbfInfo *info, int index); #ifdef __cplusplus } #endif + +#endif diff --git a/include/libms/libms.h b/include/libms/libms.h index a83faed3..86345e16 100644 --- a/include/libms/libms.h +++ b/include/libms/libms.h @@ -1,3 +1,6 @@ +#ifndef LIBMS_LIBMS_H +#define LIBMS_LIBMS_H + #include "common.h" #ifdef __cplusplus @@ -15,3 +18,5 @@ void LMSi_MemCopy(char *p1, const char *p2, int n); #ifdef __cplusplus } #endif + +#endif diff --git a/include/libms/msgfile.h b/include/libms/msgfile.h index c866e0f7..50121699 100644 --- a/include/libms/msgfile.h +++ b/include/libms/msgfile.h @@ -1,3 +1,6 @@ +#ifndef LIBMS_MSGFILE_H +#define LIBMS_MSGFILE_H + #include "common.h" #ifdef __cplusplus @@ -22,3 +25,5 @@ struct MsbtAttrInfo *LMS_GetAttribute(struct MsbtInfo *info, int index); #ifdef __cplusplus } #endif + +#endif diff --git a/include/nw4r/lyt/lyt_pane.h b/include/nw4r/lyt/lyt_pane.h index a711b1b0..2e1d63ae 100644 --- a/include/nw4r/lyt/lyt_pane.h +++ b/include/nw4r/lyt/lyt_pane.h @@ -84,6 +84,10 @@ class Pane : detail::PaneBase { mAlpha = value; } + u8 GetGlobalAlpha() const { + return mGlbAlpha; + } + const Size &GetSize() const { return mSize; } diff --git a/src/d/d_tag_processor.cpp b/src/d/d_tag_processor.cpp new file mode 100644 index 00000000..eccf7481 --- /dev/null +++ b/src/d/d_tag_processor.cpp @@ -0,0 +1,1061 @@ +#include "d/d_tag_processor.h" + +#include "common.h" +#include "d/d_font_manager.h" +#include "d/d_textunk.h" +#include "nw4r/lyt/lyt_types.h" +#include "nw4r/ut/ut_CharWriter.h" +#include "nw4r/ut/ut_Color.h" +#include "nw4r/ut/ut_Font.h" +#include "nw4r/ut/ut_Rect.h" +#include "nw4r/ut/ut_TagProcessorBase.h" +#include "nw4r/ut/ut_TextWriterBase.h" +#include "sized_string.h" +#include "toBeSorted/file_manager.h" + +#include + +nw4r::ut::Color FontColors1[] = { + nw4r::ut::Color(0xff, 0x4b, 0x32, 0xff), + nw4r::ut::Color(0xff, 0x4b, 0x32, 0xff), + nw4r::ut::Color(0xfa, 0xaf, 0x05, 0xff), + nw4r::ut::Color(0xdc, 0xf5, 0xfa, 0xff), + nw4r::ut::Color(0x91, 0xff, 0x6e, 0xff), + nw4r::ut::Color(0xff, 0xbe, 0x1e, 0xff), + nw4r::ut::Color(0xeb, 0xc8, 0xff, 0xff), + nw4r::ut::Color(0x14, 0xd7, 0x46, 0xff), + nw4r::ut::Color(0x19, 0xa5, 0xeb, 0xff), + nw4r::ut::Color(0xf0, 0x3c, 0x1e, 0xff), + nw4r::ut::Color(0xc8, 0xc8, 0xc8, 0xff), + nw4r::ut::Color(0xfa, 0xaf, 0x05, 0xff), + nw4r::ut::Color(0x32, 0x23, 0x46, 0xff), + nw4r::ut::Color(), + nw4r::ut::Color(0xed, 0xe2, 0xd0, 0xff), + nw4r::ut::Color(0xf6, 0xf6, 0xde, 0xff), + nw4r::ut::Color(0xe6, 0xe6, 0xa0, 0xff), + nw4r::ut::Color(0xe8, 0xad, 0x55, 0xff), + nw4r::ut::Color(0xff, 0xfa, 0xe6, 0xff), + nw4r::ut::Color(0xf5, 0xf2, 0xeb, 0xff), + nw4r::ut::Color(0x64, 0x5f, 0x69, 0xff), + nw4r::ut::Color(0x5e, 0x51, 0x46, 0xff), + nw4r::ut::Color(0xed, 0xe2, 0xd0, 0xff), + nw4r::ut::Color(), + nw4r::ut::Color(0xfa, 0xf6, 0xe7, 0xff), + nw4r::ut::Color(0xff, 0xff, 0xff, 0xff), + nw4r::ut::Color(0x4c, 0x32, 0x0f, 0xff), + nw4r::ut::Color(), + nw4r::ut::Color(), + nw4r::ut::Color(), + nw4r::ut::Color(0xed, 0xe2, 0xd0, 0xff), + nw4r::ut::Color(0xed, 0xe2, 0xd0, 0xff), + nw4r::ut::Color(0xed, 0xe2, 0xd0, 0xff), + nw4r::ut::Color(0xed, 0xe2, 0xd0, 0xff), + nw4r::ut::Color(), + nw4r::ut::Color(0xf6, 0xf2, 0xea, 0xff), + nw4r::ut::Color(0xed, 0xe2, 0xd0, 0xff), + nw4r::ut::Color(0xed, 0xe2, 0xd0, 0xff), + nw4r::ut::Color(), + nw4r::ut::Color(), + nw4r::ut::Color(0xff, 0xff, 0xff, 0xff), + nw4r::ut::Color(), + nw4r::ut::Color(0xed, 0xe2, 0xd0, 0xff), + nw4r::ut::Color(0x20, 0x20, 0x20, 0xff), + nw4r::ut::Color(0x74, 0x6d, 0x5c, 0xff), + nw4r::ut::Color(), + nw4r::ut::Color(), + nw4r::ut::Color(), + nw4r::ut::Color(), +}; + +nw4r::ut::Color FontColors2[] = { + nw4r::ut::Color(0xff, 0x4b, 0x32, 0xff), + nw4r::ut::Color(0xcd, 0x4b, 0x32, 0xff), + nw4r::ut::Color(0xff, 0xe6, 0x8c, 0xff), + nw4r::ut::Color(0x7d, 0xc3, 0xff, 0xff), + nw4r::ut::Color(0x64, 0xc8, 0x41, 0xff), + nw4r::ut::Color(0xff, 0xbe, 0x1e, 0xff), + nw4r::ut::Color(0x91, 0x5f, 0xff, 0xff), + nw4r::ut::Color(0xaf, 0xe6, 0x2d, 0xff), + nw4r::ut::Color(0xb4, 0xe6, 0xff, 0xff), + nw4r::ut::Color(0xff, 0x91, 0x78, 0xff), + nw4r::ut::Color(0xe6, 0xe6, 0xc8, 0xff), + nw4r::ut::Color(0xff, 0xe6, 0x8c, 0xff), + nw4r::ut::Color(0x50, 0x4b, 0x5f, 0xff), + nw4r::ut::Color(), + nw4r::ut::Color(0xca, 0xaf, 0x81, 0xff), + nw4r::ut::Color(0xe7, 0xd7, 0xed, 0xff), + nw4r::ut::Color(0xa5, 0x96, 0x6e, 0xff), + nw4r::ut::Color(0xb5, 0x52, 0x2e, 0xff), + nw4r::ut::Color(0xff, 0xfa, 0xe6, 0xff), + nw4r::ut::Color(0xe1, 0xc8, 0x9b, 0xff), + nw4r::ut::Color(0x55, 0x50, 0x5a, 0xff), + nw4r::ut::Color(0x35, 0x2d, 0x27, 0xff), + nw4r::ut::Color(0xca, 0xaf, 0x81, 0xff), + nw4r::ut::Color(), + nw4r::ut::Color(0xe3, 0xcc, 0x8f, 0xff), + nw4r::ut::Color(0xff, 0xff, 0xff, 0xff), + nw4r::ut::Color(0x3a, 0x25, 0x09, 0xff), + nw4r::ut::Color(), + nw4r::ut::Color(), + nw4r::ut::Color(), + nw4r::ut::Color(0xca, 0xaf, 0x81, 0xff), + nw4r::ut::Color(0xca, 0xaf, 0x81, 0xff), + nw4r::ut::Color(0xca, 0xaf, 0x81, 0xff), + nw4r::ut::Color(0xca, 0xaf, 0x81, 0xff), + nw4r::ut::Color(), + nw4r::ut::Color(0xe1, 0xc7, 0x9b, 0xff), + nw4r::ut::Color(0xca, 0xaf, 0x81, 0xff), + nw4r::ut::Color(0xca, 0xaf, 0x81, 0xff), + nw4r::ut::Color(), + nw4r::ut::Color(), + nw4r::ut::Color(0xff, 0xff, 0xff, 0xff), + nw4r::ut::Color(), + nw4r::ut::Color(0xca, 0xaf, 0x81, 0xff), + nw4r::ut::Color(0x20, 0x20, 0x20, 0xff), + nw4r::ut::Color(0x4b, 0x47, 0x3f, 0xff), + nw4r::ut::Color(), + nw4r::ut::Color(), + nw4r::ut::Color(), + nw4r::ut::Color(), +}; + +dTagProcessor_c::dTagProcessor_c() { + field_0x82C = -1; + field_0x828 = -1; + field_0x90E = 0; + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 256; j++) { + field_0x008[i][j] = 0; + } + field_0x808[i] = 0; + field_0x90F[i] = 0; + } + + field_0x904 = 0.0f; + field_0x908 = 0.0f; + resetSomething(); + field_0x830 = -1; + mPauseFramesLeft = 0; + field_0x838 = 0; + field_0x83C = 0; + field_0x840 = 0; + field_0x844 = 0; + field_0x848 = 0; + field_0x84C = 0; + field_0x850 = 0; + field_0x87C = 0; + field_0x854 = 0; + field_0x858 = 0; + field_0x85C = 0; + field_0x860 = 0; + field_0x880 = 0; + field_0x864 = 0; + field_0x868 = 0; + field_0x884 = 0; + field_0x86C = 0; + field_0x870 = 0; + field_0x894 = 0; + field_0x874 = 0; + field_0x878 = 0xffffffff; + field_0x898 = 0; + field_0x888 = 0; + field_0x88C = 0; + field_0x824 = 0; + field_0x890 = 0; + field_0x8FC = -1; + field_0x900 = -1; + resetSomeFloats(); + field_0x81C = 0; + field_0x820 = 0; + setNumericArg0(0); + mNumericArgsCopy[1] = 0; + mNumericArgsCopy[2] = 0; + mNumericArgsCopy[0] = 0; + mNumericArgsCopy[3] = 0; + mNumericArgsCopy[4] = 0; + mNumericArgsCopy[5] = 0; + mNumericArgsCopy[6] = 0; + mNumericArgsCopy[7] = 0; + mNumericArgsCopy[8] = 0; + mNumericArgsCopy[9] = 0; + field_0x8EC = 0; + field_0x8F0 = 0; + field_0x8F4 = 0; + field_0x8F8 = 0; + + field_0xEE5 = 0; + field_0xEE6 = 0; + field_0xEE7 = 0; + field_0xEE8 = 0; + field_0xEE9 = 0; + field_0xEEA = 0; + field_0xEEB = 0; + field_0xEEC = 0; + field_0xEED = 0; + field_0xEEE = 0; + field_0xEEF = 0; + field_0xEE0 = 0; + field_0xEE1 = 0; + field_0xEE2 = 0; + field_0xEE3 = 0; + field_0xEE4 = 0; + field_0x004 = nullptr; + field_0x90C = 0x24; + field_0x90D = 4; + field_0xEF0 = 0; + field_0xEF1 = 0; +} + +dTagProcessor_c::~dTagProcessor_c() {} + +struct StackThing { + wchar_t us[4]; +}; + +void dTagProcessor_c::eventFlowTextProcessingRelated( + dTextBox_c *textBox, const wchar_t *src, wchar_t *dest, u32 destLen, u32 *pOutLen +) { + s32 state3 = 0; + s32 state4 = 0; + + s32 state1 = -1; + s32 state2 = -1; + + // FPR regswap between float1 and float2 + f32 float1, float2; + float2 = float1 = fn_800B8040(0, field_0x90C); + + if (textBox != nullptr) { + float1 *= textBox->getMyScale(); + resetSomeFloats(); + textBox->set0x1F8(0); + } + + s32 local_b4 = 0; + + StackThing x = {0x000E, 0x0F0F, 0x0F0F, 0x0002}; + wchar_t *writePtr = dest; + if (textBox != nullptr) { + writePtr += 5; + dest[0] = x.us[0]; + dest[1] = x.us[1]; + dest[2] = x.us[2]; + dest[3] = x.us[3]; + dest[4] = mCommandInsert; + } + + StackThing yTmp; + StackThing y = {0x000E, 0x0F0F, 0x0F0E, 0x0001}; + + do { + wchar_t c = *src; + if (c == nullptr) { + if (textBox != nullptr) { + mCommandInsert++; + } + *writePtr = '\0'; + goto end; + } + + if (c == 0xE) { + u8 cmdLen = 0; + s32 cmd = 0; + wchar_t *endPtr = nullptr; + getTextCommand(c, src + 1, &cmdLen, &cmd, &endPtr); + bool bVar3 = false; + switch (cmd) { + case 0x0F0F0F0F: + if (state4 != 0 && field_0x90E != 0) { + const wchar_t *t = src; + u32 len = (cmdLen / 2) + 1; + for (int i = 0; i < len; i++) { + field_0x008[field_0x90E - 1][local_b4] = *(t++); + if (field_0x90E - 1 < 4) { + field_0x808[field_0x90E - 1]++; + } + local_b4++; + } + } else { + const wchar_t *t = src; + u32 len = (cmdLen / 2) + 1; + for (int i = 0; i < len; i++) { + *(writePtr++) = *(t++); + } + } + break; + case 0x10000: { + const u8 *endPtrU8 = (const u8 *)endPtr; + u8 a = endPtrU8[0]; + u8 b = endPtrU8[1]; + switch (a) { + case 0: state2 = 0; break; + case 1: state1 = 0; break; + } + field_0x90F[0] = b; + yTmp = y; + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 256; j++) { + if (j < 4) { + field_0x008[i][j] = yTmp.us[j]; + } else { + field_0x008[i][j] = 0; + } + } + field_0x808[i] = 4; + } + state3 = 1; + bVar3 = true; + } break; + case 0x10001: { + const u8 *endPtrU8 = (const u8 *)endPtr; + u8 a = endPtrU8[0]; + u8 b = endPtrU8[1]; + switch (a) { + case 0: state2 = 1; break; + case 1: state1 = 1; break; + } + field_0x90F[1] = b; + state3 = 2; + bVar3 = true; + } break; + case 0x10002: { + const u8 *endPtrU8 = (const u8 *)endPtr; + u8 a = endPtrU8[0]; + u8 b = endPtrU8[1]; + switch (a) { + case 0: state2 = 2; break; + case 1: state1 = 2; break; + } + field_0x90F[2] = b; + state3 = 3; + bVar3 = true; + } break; + case 0x10003: { + const u8 *endPtrU8 = (const u8 *)endPtr; + u8 a = endPtrU8[0]; + u8 b = endPtrU8[1]; + switch (a) { + case 0: state2 = 3; break; + case 1: state1 = 3; break; + } + field_0x90F[3] = b; + state3 = 4; + bVar3 = true; + } break; + case 0x10008: + if (textBox != nullptr) { + float1 = fn_800B8040(((u8 *)endPtr)[0], field_0x90C); + float1 *= textBox->getMyScale(); + } + writePtr = writeTextNormal(src, writePtr, &local_b4, cmdLen, state4); + break; + case 0x30000: { + if (textBox != nullptr) { + float2 = float1; + float1 *= UnkTextThing::getField0x768(); + float1 *= textBox->getMyScale(); + } + writePtr = writeTextNormal(src, writePtr, &local_b4, cmdLen, state4); + } break; + case 0x10010: fn_800B5520(endPtr); break; + case 0x20004: + if (textBox != nullptr) { + writeIcon(textBox, endPtr, float1); + } + writePtr = writeTextNormal(src, writePtr, &local_b4, cmdLen, state4); + break; + case 0x20000: writePtr = writeHeroname(writePtr, &local_b4, state4); break; + case 0x20001: writePtr = writeItem(writePtr, endPtr, &local_b4, state4); break; + case 0x20002: writePtr = writeStringArg(writePtr, endPtr, &local_b4, state4); break; + case 0x20003: writePtr = writeNumericArg(writePtr, endPtr, &local_b4, state4); break; + + case 0x30004: writePtr = fn_800B5DD0(writePtr, endPtr, &local_b4, state4); break; + case 0x30001: + field_0xEF1 = 1; + writePtr = writeTextNormal(src, writePtr, &local_b4, cmdLen, state4); + break; + + default: writePtr = writeTextNormal(src, writePtr, &local_b4, cmdLen, state4); break; + } + + if (bVar3) { + field_0x82C = state1; + state4 = 1; + field_0x828 = state2; + field_0x90E = state3; + local_b4 = field_0x808[state3 - 1]; + } + src += (cmdLen / 2) + 1; + } else if (c == 0xF) { + s32 tmp = 0; + process0xFCommand(c, src + 1, &tmp); + if (tmp == 0x30000) { + float1 = float2; + } + writePtr[0] = src[0]; + writePtr[1] = src[1]; + writePtr[2] = src[2]; + writePtr += 3; + src += 3; + } else if (state4 != 0 && field_0x90E != 0) { + // Note: Return ignored here + fn_800B5FD0(c, &field_0x008[field_0x90E - 1][local_b4], &local_b4); + src++; + // This looks like an inline tbh + if (field_0x90E - 1 < 4) { + field_0x808[field_0x90E - 1]++; + } + } else { + if (textBox != nullptr) { + if (c == 10) { + *writePtr = c; + src++; + writePtr++; + mCommandInsert++; + s32 i10 = getNumLines(field_0x90C); + if (mCommandInsert % i10 == 0) { + float1 = fn_800B8040(0, field_0x90C); + float1 *= textBox->getMyScale(); + } + if (textBox != nullptr) { + wchar_t *buf = (wchar_t *)&x; + writePtr[0] = buf[0]; + writePtr[1] = buf[1]; + writePtr[2] = buf[2]; + writePtr[3] = buf[3]; + writePtr[4] = mCommandInsert; + writePtr += 5; + } + } else { + const nw4r::ut::Font *fnt = textBox->GetFont(); + field_0x914[mCommandInsert] += float1 * fnt->GetCharWidth(*src) + textBox->GetCharSpace(); + writePtr = fn_800B5FD0(*src, writePtr, nullptr); + src++; + } + + } else { + writePtr = fn_800B5FD0(c, writePtr, nullptr); + src++; + } + } + + } while (destLen > writePtr - dest); + + dest[destLen - 1] = 0; +end: + if (pOutLen != nullptr) { + *pOutLen = writePtr - dest; + } +} + +nw4r::ut::Operation dTagProcessor_c::Process(u16 ch, nw4r::ut::PrintContext *ctx) { + return ProcessTags(nullptr, ch, ctx); +} + +nw4r::ut::Operation dTagProcessor_c::CalcRect(nw4r::ut::Rect *rect, u16 ch, nw4r::ut::PrintContext *ctx) { + return ProcessTags(rect, ch, ctx); +} + +nw4r::ut::Operation dTagProcessor_c::ProcessTags(nw4r::ut::Rect *rect, u16 ch, nw4r::ut::PrintContext *ctx) { + if (ch != 0x0E) { + if (ch != 0x0F) { + if (rect != nullptr) { + return nw4r::ut::TagProcessorBase::CalcRect(rect, ch, ctx); + } else { + return nw4r::ut::TagProcessorBase::Process(ch, ctx); + } + } else { + s32 cmd = 0; + process0xFCommand(ch, ctx->str, &cmd); + if (cmd == 0x30000) { + changeScale(rect, ctx, true); + } + ctx->str += 2; + return nw4r::ut::OPERATION_DEFAULT; + } + } + + u8 cmdLen = 0; + s32 cmd = 0; + wchar_t *endPtr = nullptr; + getTextCommand(ch, ctx->str, &cmdLen, &cmd, &endPtr); + switch (cmd) { + case 0x10000: + ctx->str += cmdLen / 2; + ctx->str += field_0x808[0]; + return nw4r::ut::OPERATION_DEFAULT; + case 0x10001: + ctx->str += cmdLen / 2; + ctx->str += field_0x808[1]; + return nw4r::ut::OPERATION_DEFAULT; + case 0x10002: + ctx->str += cmdLen / 2; + ctx->str += field_0x808[2]; + return nw4r::ut::OPERATION_DEFAULT; + case 0x10003: + ctx->str += cmdLen / 2; + ctx->str += field_0x808[3]; + return nw4r::ut::OPERATION_DEFAULT; + case 0x0F0F0F0F: fn_800B4FF0(rect, ctx, cmdLen, endPtr); break; + case 0x0F0F0F0E: field_0xEE2 = 1; break; + case 0x3: + if (field_0xEE1 == 0) { + setColor(rect, ctx, cmdLen, endPtr); + } + break; + case 0x2: setScale(rect, ctx, cmdLen, endPtr); break; + case 0x10004: + // Pause + if (rect == nullptr && field_0xEE1 == 0) { + if (field_0xEED == 0 && field_0x8F0 == field_0x838) { + setFramesLeftOnPause(rect, ctx, cmdLen, endPtr); + field_0xEED = 1; + field_0x838++; + } + field_0x8F0++; + } + break; + case 0x10005: + if (rect == nullptr && field_0xEE1 == 0) { + if (field_0xEEE == 0 && field_0x8F4 == field_0x83C) { + fn_800B5500(cmdLen, endPtr); + field_0xEEE = 1; + field_0x83C++; + } + field_0x8F4++; + } + break; + case 0x10007: + if (rect == nullptr && field_0xEE1 == 0) { + if (field_0xEE5 == 0 && mNumericArgsCopy[3] == field_0x87C) { + fn_800B60E0(cmdLen, endPtr); + field_0xEE5 = 1; + field_0x87C++; + } + mNumericArgsCopy[3]++; + } + break; + case 0x10008: fn_800B61D0(rect, ctx, cmdLen, endPtr); break; + case 0x30000: changeScale(rect, ctx, false); break; + case 0x10009: + if (rect == nullptr && field_0xEE1 == 0) { + if (field_0xEE6 == 0 && mNumericArgsCopy[4] == field_0x880) { + fn_800B6110(cmdLen, endPtr); + field_0xEE6 = 1; + field_0x880++; + } + mNumericArgsCopy[4]++; + } + break; + case 0x1000A: + if (rect == nullptr && field_0xEE1 == 0) { + if (field_0xEE7 == 0 && mNumericArgsCopy[5] == field_0x884) { + fn_800B6140(cmdLen, endPtr); + field_0xEE7 = 1; + field_0x884++; + } + mNumericArgsCopy[5]++; + } + break; + case 0x1000B: + // Sound + if (rect == nullptr && field_0xEE1 == 0) { + if (field_0xEE8 == 0 && mNumericArgsCopy[6] == field_0x888) { + playSound(cmdLen, endPtr); + field_0xEE8 = 1; + field_0x888++; + } + mNumericArgsCopy[6]++; + } + break; + case 0x1000C: + // "entrypoint" + if (rect == nullptr && field_0xEE1 == 0) { + if (field_0xEEA == 0 && mNumericArgsCopy[8] == field_0x890) { + fn_800B6170(cmdLen, endPtr); + field_0xEEA = 1; + field_0x890++; + } + mNumericArgsCopy[8]++; + } + break; + case 0x1000D: + if (rect == nullptr && field_0xEE1 == 0) { + if (field_0xEEB == 0 && mNumericArgsCopy[9] == field_0x894) { + fn_800B6190(cmdLen, endPtr); + field_0xEEB = 1; + field_0x894++; + } + mNumericArgsCopy[9]++; + } + break; + case 0x1000E: + if (rect == nullptr && field_0xEE1 == 0) { + if (field_0xEEC == 0 && field_0x8EC == field_0x898) { + fn_800B61B0(cmdLen, endPtr); + field_0xEEC = 1; + field_0x898++; + } + field_0x8EC++; + } + break; + case 0x20004: + if (field_0xEE3 != 0) { + if (rect == nullptr) { + fn_800B6450(rect, ctx, cmdLen, endPtr); + } else { + makeSpaceForIconMaybe(rect, ctx, endPtr); + } + } + break; + case 0x10011: + if (rect == nullptr && field_0xEE1 == 0) { + if (field_0xEEF == 0 && field_0x8F8 == field_0x840) { + fn_800B5540(endPtr); + field_0xEEF = 1; + field_0x840++; + } + field_0x8F8++; + } + break; + } + ctx->str += cmdLen / 2; + return nw4r::ut::OPERATION_DEFAULT; +} + +void dTagProcessor_c::fn_800B4FF0(nw4r::ut::Rect *rect, nw4r::ut::PrintContext *ctx, u8 cmdLen, wchar_t *ptr) { + if (field_0x90C != 22 && field_0x90C != 30 && field_0xEE0 != 0) { + int arg = ptr[0]; + nw4r::lyt::Size textBoxSize = field_0x004->GetSize(); + nw4r::lyt::Size fontSize = field_0x004->GetFontSize(); + int i1 = getNumLines(field_0x90C); + if (arg % i1 == 0 && field_0x90C != 31 && field_0x90C != 8) { + int u = 0; + int v = 0; + for (int i = arg; i < arg + getNumLines(field_0x90C) && i < 0x32; i++) { + f32 f6 = getFloat(i); + if (f6 > 0.0f) { + v++; + if (u != 0) { + v += u; + u = 0; + } + } else { + u++; + } + } + + // Unfortunately, the code then proceeds to access + // some global text stuff at 0x805753b0, which is + // completely hidden in the Ghidra decompiler, apparently + // because the results aren't used? + + if (u < getNumLines(field_0x90C)) { + f32 w1 = fontSize.width * 0.5f; + f32 h1 = fontSize.height * 0.5f; + if (!(w1 < UnkTextThing::getField0x758())) { + w1 = UnkTextThing::getField0x758(); + } + if (!(h1 < UnkTextThing::getField0x758())) { + h1 = UnkTextThing::getField0x758(); + } + + f32 f7 = (fontSize.height + field_0x004->GetLineSpace()) * 0.5f * (getNumLines(field_0x90C) - v); + field_0x814 = ctx->writer->GetCursorY(); + field_0x818 = ctx->y; + field_0xEE4 = 1; + if (f7 > 0.0f) { + ctx->writer->SetCursorY(ctx->writer->GetCursorY() + f7); + field_0x810 = f7; + } + } + } + + f32 f7 = getFloat(arg); + f32 f8 = (textBoxSize.width - f7) * 0.5f; + if ((field_0x90C < 6 || field_0x90C >= 9) && field_0x90C != 30) { + f8 = 0.0f; + } + if (f8 > 0.0f) { + ctx->writer->SetCursorX(ctx->writer->GetCursorX() + f8); + } + } +} + +void dTagProcessor_c::setColor(nw4r::ut::Rect *rect, nw4r::ut::PrintContext *ctx, u8 cmdLen, wchar_t *buf) { + u16 cmd = buf[0]; + if (cmd == 0xFFFF) { + restoreColor(ctx, field_0x90C); + return; + } + nw4r::ut::Color c1 = FontColors1[cmd & 0xFFFF]; + nw4r::ut::Color c2 = FontColors2[cmd & 0xFFFF]; + if (cmd == 0) { + if (field_0x90C == 2) { + c1.r = 0xFF; + c1.g = 0x6E; + c1.b = 0x64; + c2.r = 0xFF; + c2.g = 0x6E; + c2.b = 0x64; + } else if (field_0x90C == 7) { + c1.r = 0xE6; + c1.g = 0x4B; + c1.b = 0x32; + c2.r = 0xE6; + c2.g = 0x4B; + c2.b = 0x32; + } + } else if (cmd == 1) { + if (field_0x90C == 2) { + c1.r = 0xF5; + c1.g = 0x64; + c1.b = 0x5A; + c2.r = 0xC8; + c2.g = 0x64; + c2.b = 0x5A; + } else if (field_0x90C == 7) { + c1.r = 0xB4; + c1.g = 0x50; + c1.b = 0x50; + c2.r = 0x8C; + c2.g = 0x40; + c2.b = 0x40; + } + } else if (cmd == 3 && field_0x90C >= 2 && field_0x90C < 5) { + c1.r = 0x50; + c1.g = 0xE6; + c1.b = 0xFA; + c2.r = 0xC8; + c2.g = 0xE6; + c2.b = 0xF5; + } + + u8 u5 = 0xFF; + if (field_0x004 != nullptr) { + u5 = field_0x004->GetGlobalAlpha(); + } + + c2.a = u5; + c1.a = u5; + ctx->writer->SetGradationMode(nw4r::ut::CharWriter::GRADMODE_V); + ctx->writer->SetTextColor(c1, c2); +} + +void dTagProcessor_c::setScale(nw4r::ut::Rect *rect, nw4r::ut::PrintContext *ctx, u8 cmdLen, wchar_t *buf) { + u16 scale = buf[0]; + if (scale == 0) { + scale = 50; + } + f32 x = scale / 100.0f; + f32 y = scale / 100.0f; + ctx->writer->SetScale(x, y); +} + +void dTagProcessor_c::setFramesLeftOnPause( + nw4r::ut::Rect *rect, nw4r::ut::PrintContext *ctx, u8 cmdLen, wchar_t *ptr +) { + mPauseFramesLeft = ptr[0]; +} + +void dTagProcessor_c::fn_800B5500(u8 cmdLen, wchar_t *ptr) { + u16 val = ptr[0]; + if (field_0x830 == -1) { + field_0x830 = val; + } +} + +void dTagProcessor_c::fn_800B5520(wchar_t *src) { + field_0x81C = ((u32 *)src)[0]; + field_0x820 = ((u32 *)src)[1]; +} + +wchar_t *dTagProcessor_c::writeHeroname(wchar_t *dest, s32 *outArg, s32 arg) { + if (FileManager::sInstance->getHeroname()[0] != '\0') { + for (int i = 0; FileManager::sInstance->getHeroname()[i] != '\0'; i++) { + if (arg != 0 && field_0x90E != 0) { + wchar_t c = FileManager::sInstance->getHeroname()[i]; + fn_800B5FD0(c, &field_0x008[field_0x90E - 1][*outArg], outArg); + if (field_0x90E - 1 < 4) { + field_0x808[field_0x90E - 1]++; + } + } else { + dest = fn_800B5FD0(FileManager::sInstance->getHeroname()[i], dest, nullptr); + } + } + } + return dest; +} + +void dTagProcessorDataStuff() { + SizedString<32> s; + s.sprintf("NAME_ITEM_%03d"); + s.sprintf("lang:word:%03d:%02d"); +} + +void dTagProcessor_c::fn_800B60E0(u8 cmdLen, wchar_t *ptr) { + field_0x844 = *((u8 *)ptr); + field_0x848 = *((u8 *)ptr + 1); + field_0x84C = *((u8 *)ptr + 2); + field_0x850 = *((u8 *)ptr + 3); +} +void dTagProcessor_c::fn_800B6110(u8 cmdLen, wchar_t *ptr) { + field_0x854 = *((u8 *)ptr); + field_0x858 = *((u8 *)ptr + 1); + field_0x85C = *((u8 *)ptr + 2); + field_0x860 = *((u8 *)ptr + 3); +} +void dTagProcessor_c::fn_800B6140(u8 cmdLen, wchar_t *ptr) { + field_0x864 = ptr[0]; + field_0x868 = ptr[1]; +} +void dTagProcessor_c::playSound(u8 cmdLen, wchar_t *ptr) {} +void dTagProcessor_c::fn_800B6170(u8 cmdLen, wchar_t *ptr) { + field_0x8FC = ptr[0]; + field_0x900 = ptr[1]; +} +void dTagProcessor_c::fn_800B6190(u8 cmdLen, wchar_t *ptr) { + field_0x86C = *((char *)ptr); + field_0x870 = *((char *)ptr + 1); +} +void dTagProcessor_c::fn_800B61B0(u8 cmdLen, wchar_t *ptr) { + field_0x874 = *((char *)ptr); + field_0x878 = *((s16 *)((char *)ptr + 1)); +} + +void dTagProcessor_c::fn_800B61D0(nw4r::ut::Rect *rect, nw4r::ut::PrintContext *ctx, u8 cmdLen, wchar_t *ptr) { + f32 scale = fn_800B8040(*(char *)ptr, field_0x90C); + if (field_0x004 != nullptr) { + scale *= field_0x004->getMyScale(); + } + ctx->writer->SetScale(scale, scale); +} + +void dTagProcessor_c::changeScale(nw4r::ut::Rect *rect, nw4r::ut::PrintContext *ctx, bool direct) { + f32 scale; + f32 posY; + + if (direct) { + scale = field_0x904; + posY = field_0x908; + } else { + field_0x904 = ctx->writer->GetScaleV(); + field_0x908 = ctx->writer->GetCursorY(); + scale = field_0x904 * UnkTextThing::getField0x768(); + posY = field_0x908 - ctx->writer->GetFontAscent() * UnkTextThing::getField0x76C(); + } + + ctx->writer->SetCursorY(posY); + ctx->writer->SetScale(scale, scale); +} + +void dTagProcessor_c::makeSpaceForIconMaybe(nw4r::ut::Rect *rect, nw4r::ut::PrintContext *ctx, wchar_t *ptr) { + nw4r::ut::Font *f = dFontMng_c::getFont(4); + u32 c3 = fn_800B7880(*(u8 *)ptr); + nw4r::ut::TextWriterBase copy = *ctx->writer; + f32 charWidth = f->GetCharWidth(c3); + fn_800B70D0(©, ctx, c3, 0xFF); + ctx->writer->MoveCursorX(charWidth * copy.GetScaleH()); + + f32 cursorX = ctx->writer->GetCursorX(); + rect->left = rect->left > cursorX ? cursorX : rect->left; + rect->right = rect->right < cursorX ? cursorX : rect->right; +} + +void dTagProcessor_c::restoreColor(nw4r::ut::PrintContext *ctx, u8 windowType) { + if (field_0xEE2 != 0) { + windowType = 1; + } + int colorIndex; + switch (windowType) { + case 2: colorIndex = 15; break; + case 3: colorIndex = 16; break; + case 4: colorIndex = 17; break; + case 5: colorIndex = 19; break; + case 6: colorIndex = 20; break; + case 7: colorIndex = 21; break; + case 8: colorIndex = 22; break; + case 9: colorIndex = 24; break; + case 11: colorIndex = 25; break; + case 12: colorIndex = 26; break; + case 13: colorIndex = 30; break; + case 17: colorIndex = 31; break; + case 18: colorIndex = 32; break; + case 19: colorIndex = 43; break; + case 20: colorIndex = 33; break; + case 22: colorIndex = 35; break; + case 23: colorIndex = 36; break; + case 24: colorIndex = 37; break; + case 27: colorIndex = 40; break; + case 29: colorIndex = 42; break; + case 30: colorIndex = 44; break; + case 31: colorIndex = 18; break; + default: colorIndex = 14; break; + } + + nw4r::ut::Color c1 = FontColors1[colorIndex & 0xFFFF]; + nw4r::ut::Color c2 = FontColors2[colorIndex & 0xFFFF]; + + if (windowType == 7) { + c2.a = 0xC8; + } else if (windowType == 12) { + c2.a = 0xFF; + } else if (windowType == 13) { + c2.a = 0xC8; + } + + u8 u5 = 0xFF; + if (field_0x004 != nullptr) { + u5 = field_0x004->GetGlobalAlpha(); + } + + c1.a = c1.a * u5 / 255.0f; + c2.a = c2.a * u5 / 255.0f; + ctx->writer->SetGradationMode(nw4r::ut::CharWriter::GRADMODE_V); + ctx->writer->SetTextColor(c1, c2); +} + +wchar_t *dTagProcessor_c::writeTextNormal(const wchar_t *src, wchar_t *dest, s32 *pArg, u8 cmdLen, s32 arg) { + if (arg != 0 && field_0x90E != 0) { + for (u32 i = 0; i < (cmdLen / 2 + 1); i++) { + field_0x008[field_0x90E - 1][*pArg] = *(src++); + if (field_0x90E - 1 < 4) { + field_0x808[field_0x90E - 1]++; + } + (*pArg)++; + } + } else { + memcpy(dest, src, cmdLen + 2); + dest += (cmdLen / 2 + 1); + } + + return dest; +} + +u8 dTagProcessor_c::symbolToFontIdx(s32 s) { + static const u8 alphabet[] = " !\"#$%&\'()*+,)+-/0123456789"; + return alphabet[s]; +} + +void dTagProcessor_c::setStringArg(const wchar_t *arg, s32 index) { + for (int i = 0; i < 0x40; i++) { + mStringArgs[index][i] = arg[i]; + } +} + +f32 dTagProcessor_c::fn_800B8040(s8 factor, u32 windowType) { + // Fun little recursion here + f32 f1 = UnkTextThing::getFn800B1F70(); + if (windowType == 6) { + f32 f2 = fn_800B8040(0, 0); + f32 f3 = fn_800B8040(factor, 0); + return f1 * ((f3 / f2) * 0.93f); + } else if (windowType == 7) { + f32 f2 = fn_800B8040(0, 0); + f32 f3 = fn_800B8040(factor, 0); + return f1 * ((f3 / f2) * 0.9f); + } else if (windowType == 9) { + f32 f2 = fn_800B8040(0, 0); + f32 f3 = fn_800B8040(factor, 0); + return f1 * ((f3 / f2) * 0.68f); + } else if (windowType == 30) { + f32 f2 = fn_800B8040(0, 0); + f32 f3 = fn_800B8040(factor, 0); + return f1 * ((f3 / f2) * 0.9f); + } else if (windowType == 34) { + f32 f2 = fn_800B8040(0, 0); + f32 f3 = fn_800B8040(factor, 0); + return f1 * ((f3 / f2) * 0.86f); + } else { + f32 x; + switch (factor) { + case -2: x = 0.55f; break; + case -1: x = 0.68f; break; + case -0: x = 0.8f; break; + case 1: x = 0.95f; break; + case 2: + x = 1.1f; + break; + // @bug: No default, so uninitialized is possible + } + x *= UnkTextThing::getFn800B1F10(); + return x * f1; + } +} + +s32 dTagProcessor_c::getNumLines(s32 arg) { + if (arg >= 6 && arg < 8) { + return 4; + } else if (arg == 9) { + return 2; + } else if (arg == 30) { + return 2; + } + return 4; +} + +void dTagProcessor_c::getTextCommand( + wchar_t _0xe, const wchar_t *src, u8 *outCmdLen, s32 *outCmd, wchar_t **outEndPtr +) { + *outCmdLen = src[2] + 6; + *outCmd = *(s32 *)src; + if (*outCmdLen > 6) { + *outEndPtr = (wchar_t *)src + 3; + } else { + *outEndPtr = nullptr; + } +} + +void dTagProcessor_c::process0xFCommand(wchar_t _0xf, const wchar_t *src, s32 *outCmd) { + *outCmd = *(s32 *)src; +} + +s32 dTagProcessor_c::tick0x830() { + if (field_0x830 >= 0) { + field_0x830--; + } + if (field_0x830 < -1) { + field_0x830 = -1; + } + return field_0x830; +} + +void dTagProcessor_c::resetSomething() { + field_0x810 = 0.0f; + field_0x818 = 0.0f; + field_0x814 = 0.0f; + field_0xEE4 = 0; +} + +s32 dTagProcessor_c::tickPauseFrame() { + if (mPauseFramesLeft > 0) { + mPauseFramesLeft--; + } + if (mPauseFramesLeft < 0) { + mPauseFramesLeft = 0; + } + return mPauseFramesLeft; +} + +void dTagProcessor_c::resetSomeFloats() { + for (int i = 0; i < 0x32; i++) { + field_0x914[i] = 0.0f; + } + mCommandInsert = 0; +} + +f32 dTagProcessor_c::getFloat(s32 i) { + return field_0x914[i]; +} + +void dTagProcessor_c::setNumericArg0(s32 arg) { + mNumericArgs[0] = arg; + mNumericArgsCopy[0] = arg; +} + +void dTagProcessor_c::setNumericArgs(const s32 *args, s32 numArgs) { + // Holy unrolling, Batman! + for (int i = 0; i < numArgs; i++) { + mNumericArgs[i] = args[i]; + } +} diff --git a/src/d/d_textunk.cpp b/src/d/d_textunk.cpp new file mode 100644 index 00000000..49cbc58f --- /dev/null +++ b/src/d/d_textunk.cpp @@ -0,0 +1,188 @@ +#include "d/d_textunk.h" + +#include "common.h" +#include "nw4r/ut/ut_Color.h" + +UnkTextThing textThing; +UnkTextThing *UnkTextThing::sInstance; + +// UnkTextThing::~UnkTextThing() {} +UnkTextThing::UnkTextThing() { + sInstance = this; + + field_0x754 = 0.0f; + field_0x758 = 12.0f; + field_0x75C = 0.04f; + field_0x760 = 0.22f; + field_0x764 = 42.0f; + field_0x768 = 0.8f; + field_0x76C = 0.3f; + + field_0x7B3 = false; + field_0x798 = 0; + field_0x79C = 0; + field_0x7A0 = 0; + + field_0x770 = 80.0f; + field_0x774 = 30.0f; + field_0x796 = 3; + field_0x778 = 10.0f; + field_0x780 = 8.0f; + field_0x77C = 8.0f; + field_0x784 = 6.0f; + + field_0x7A4 = 0xB6; + field_0x7A6 = 0x16C; + + for (int i = 0; i < 82; i++) { + field_buf0[i] = 0; + field_buf2[i] = 0; + } + + for (int i = 0; i < 23; i++) { + field_buf4[i] = 0; + field_buf5[i] = 0; + } + + for (int i = 0; i < 80; i++) { + field_buf1[i] = 0; + field_buf3[i] = 0; + } + + field_0x74C = 0; + field_0x750 = 0; + + field_0x7B4 = false; + field_0x7B5 = false; + + field_0x004 = ""; + field_0x084 = ""; + field_0x104 = ""; + + field_0x7B6 = 0; + + field_0x7A8 = 0; + field_0x788 = 0.45; + field_0x78C = -5.0f; + field_0x7AE = 4; + field_0x7B7 = 0; + field_0x7AA = 5; + field_0x7AC = 15; + field_0x7B0 = 0; + field_0x7B2 = false; + + // Weird init order + field_0x7B8.a = 0; + field_0x7B8.b = 0; + field_0x7B8.g = 0; + field_0x7B8.r = 0; + field_0x7BC.a = 0; + field_0x7BC.b = 0; + field_0x7BC.g = 0; + field_0x7BC.r = 0; + + field_0x790 = -1.0f; + field_0x794 = 100.0f; +} + +void UnkTextThing::destroy() { + for (int i = 0; i < 82; i++) { + if (field_buf0[i] != nullptr) { + destroyUnk(field_buf0[i]); + field_buf0[i] = nullptr; + } + + if (field_buf2[i] != nullptr) { + destroyMsg(field_buf2[i]); + field_buf2[i] = nullptr; + } + } + + for (int i = 0; i < 23; i++) { + if (field_buf4[i] != nullptr) { + destroyUnk(field_buf4[i]); + field_buf4[i] = nullptr; + } + + if (field_buf5[i] != nullptr) { + destroyMsg(field_buf5[i]); + field_buf5[i] = nullptr; + } + } + + for (int i = 0; i < 80; i++) { + if (field_buf1[i] != nullptr) { + destroyUnk(field_buf1[i]); + field_buf1[i] = nullptr; + } + + if (field_buf3[i] != nullptr) { + destroyFlow(field_buf3[i]); + field_buf3[i] = nullptr; + } + } + + if (field_0x74C != nullptr) { + destroyUnk(field_0x74C); + field_0x74C = nullptr; + } + + if (field_0x750 != nullptr) { + destroyUnk(field_0x750); + field_0x750 = nullptr; + } +} + +f32 UnkTextThing::fn_800B1F10() { + return field_0x794 / 100.0f; +} + +void *UnkTextThing::allocUnk(size_t size, int align) { + return nullptr; +} +void UnkTextThing::destroyUnk(void *_thing) {} + +f32 UnkTextThing::fn_800B1F70() { + f32 v = fn_800B1FC0(); + v *= fn_800B1FE0(); + return v; +} +f32 UnkTextThing::fn_800B1FC0() { + return 1.0f; +} +f32 UnkTextThing::fn_800B1FD0() { + return 0.9f; +} +f32 UnkTextThing::fn_800B1FE0() { + return 1.0f; +} +f32 UnkTextThing::fn_800B1FF0() { + return 0.0f; +} +f32 UnkTextThing::fn_800B2000() { + return 0.0f; +} +f32 UnkTextThing::fn_800B2010() { + return -1.0f; +} +f32 UnkTextThing::fn_800B2020() { + return 0.0f; +} +f32 UnkTextThing::fn_800B2030() { + return 0.0f; +} +f32 UnkTextThing::fn_800B2040() { + return 0.0f; +} + +void UnkTextThing::destroyMsg(MsbtInfo *msg) { + field_0x7B6 = true; + LMS_CloseMessage(msg); + field_0x7B6 = false; +} + +void UnkTextThing::destroyFlow(MsbfInfo *flow) { + field_0x7B6 = true; + LMS_CloseFlow(flow); + field_0x7B6 = false; +} From e9ab25fe265116d518e4d989b9328b075fe19e86 Mon Sep 17 00:00:00 2001 From: robojumper Date: Thu, 7 Nov 2024 18:26:18 +0100 Subject: [PATCH 10/10] dAcOtrapRock1_c OK (#93) * dAcOtrapRock1_c but it's angles again * dAcOtrapRock1_c OK (thanks LagoLunatic and Zeldex!) --- .../rels/d_a_obj_trap_rock_1NP/splits.txt | 3 + .../rels/d_a_obj_trap_rock_1NP/symbols.txt | 42 +++--- configure.py | 2 +- include/d/a/obj/d_a_obj_trap_rock_1.h | 21 ++- src/REL/d/a/obj/d_a_obj_trap_rock_1.cpp | 131 +++++++++++++++++- 5 files changed, 172 insertions(+), 27 deletions(-) diff --git a/config/SOUE01/rels/d_a_obj_trap_rock_1NP/splits.txt b/config/SOUE01/rels/d_a_obj_trap_rock_1NP/splits.txt index c99391f0..c98b145f 100644 --- a/config/SOUE01/rels/d_a_obj_trap_rock_1NP/splits.txt +++ b/config/SOUE01/rels/d_a_obj_trap_rock_1NP/splits.txt @@ -17,3 +17,6 @@ REL/global_destructor_chain.c: REL/d/a/obj/d_a_obj_trap_rock_1.cpp: .text start:0x000000F0 end:0x00001118 .ctors start:0x00000000 end:0x00000004 + .rodata start:0x00000000 end:0x00000024 + .data start:0x00000000 end:0x0000028C + .bss start:0x00000008 end:0x000000D8 diff --git a/config/SOUE01/rels/d_a_obj_trap_rock_1NP/symbols.txt b/config/SOUE01/rels/d_a_obj_trap_rock_1NP/symbols.txt index 63e3f53b..6046f3f9 100644 --- a/config/SOUE01/rels/d_a_obj_trap_rock_1NP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_trap_rock_1NP/symbols.txt @@ -8,13 +8,13 @@ __dt__28sFState_c<15dAcOtrapRock1_c>Fv = .text:0x000001C0; // type:function size __dt__31sFStateFct_c<15dAcOtrapRock1_c>Fv = .text:0x00000220; // type:function size:0x6C __dt__84sStateMgr_c<15dAcOtrapRock1_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000290; // type:function size:0xA0 __dt__54sFStateMgr_c<15dAcOtrapRock1_c,20sStateMethodUsr_FI_c>Fv = .text:0x00000330; // type:function size:0xA4 -AcOtrapRock__initModels = .text:0x000003E0; // type:function size:0xE0 -AcOtrapRock__init = .text:0x000004C0; // type:function size:0x178 +createHeap__15dAcOtrapRock1_cFv = .text:0x000003E0; // type:function size:0xE0 +create__15dAcOtrapRock1_cFv = .text:0x000004C0; // type:function size:0x178 changeState__84sStateMgr_c<15dAcOtrapRock1_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x00000640; // type:function size:0x10 -fn_261_650 = .text:0x00000650; // type:function size:0x8 -AcOtrapRock__update = .text:0x00000660; // type:function size:0x5C +doDelete__15dAcOtrapRock1_cFv = .text:0x00000650; // type:function size:0x8 +actorExecute__15dAcOtrapRock1_cFv = .text:0x00000660; // type:function size:0x5C executeState__84sStateMgr_c<15dAcOtrapRock1_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x000006C0; // type:function size:0x10 -AcOtrapRock__draw = .text:0x000006D0; // type:function size:0x28 +draw__15dAcOtrapRock1_cFv = .text:0x000006D0; // type:function size:0x28 initializeState_TrapWait__15dAcOtrapRock1_cFv = .text:0x00000700; // type:function size:0x4 executeState_TrapWait__15dAcOtrapRock1_cFv = .text:0x00000710; // type:function size:0x74 finalizeState_TrapWait__15dAcOtrapRock1_cFv = .text:0x00000790; // type:function size:0x4 @@ -46,20 +46,20 @@ isSameName__30sFStateID_c<15dAcOtrapRock1_c>CFPCc = .text:0x00001090; // type:fu _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_261_rodata_0 = .rodata:0x00000000; // type:object size:0xC data:float -lbl_261_rodata_C = .rodata:0x0000000C; // type:object size:0x4 data:float -lbl_261_rodata_10 = .rodata:0x00000010; // type:object size:0x4 data:float -lbl_261_rodata_18 = .rodata:0x00000018; // type:object size:0xC -g_profile_OBJ_TRAP_ROCK_1 = .data:0x00000000; // type:object size:0x50 data:4byte -lbl_261_data_50 = .data:0x00000050; // type:object size:0x20 -lbl_261_data_70 = .data:0x00000070; // type:object size:0x80 -lbl_261_data_F0 = .data:0x000000F0; // type:object size:0x30 -lbl_261_data_120 = .data:0x00000120; // type:object size:0x30 -lbl_261_data_150 = .data:0x00000150; // type:object size:0x18 -lbl_261_data_168 = .data:0x00000168; // type:object size:0xF0 -lbl_261_data_258 = .data:0x00000258; // type:object size:0x34 +lbl_261_rodata_0 = .rodata:0x00000000; // type:object size:0xC scope:local data:float +lbl_261_rodata_C = .rodata:0x0000000C; // type:object size:0x4 scope:local data:float +lbl_261_rodata_10 = .rodata:0x00000010; // type:object size:0x4 scope:local data:float +lbl_261_rodata_18 = .rodata:0x00000018; // type:object size:0xC scope:local +g_profile_OBJ_TRAP_ROCK_1 = .data:0x00000000; // type:object size:0x10 data:4byte +lbl_261_data_50 = .data:0x00000050; // type:object size:0x20 scope:local +__vt__15dAcOtrapRock1_c = .data:0x00000070; // type:object size:0x80 +__vt__54sFStateMgr_c<15dAcOtrapRock1_c,20sStateMethodUsr_FI_c> = .data:0x000000F0; // type:object size:0x30 +__vt__84sStateMgr_c<15dAcOtrapRock1_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x00000120; // type:object size:0x30 +__vt__31sFStateFct_c<15dAcOtrapRock1_c> = .data:0x00000150; // type:object size:0x14 +__vt__28sFState_c<15dAcOtrapRock1_c> = .data:0x00000168; // type:object size:0x18 +__vt__30sFStateID_c<15dAcOtrapRock1_c> = .data:0x00000258; // type:object size:0x34 __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global -lbl_261_bss_8 = .bss:0x00000008; // type:object size:0x10 data:4byte -lbl_261_bss_18 = .bss:0x00000018; // type:object size:0x40 data:4byte -lbl_261_bss_58 = .bss:0x00000058; // type:object size:0x40 data:4byte -lbl_261_bss_98 = .bss:0x00000098; // type:object size:0x40 data:4byte +lbl_261_bss_8 = .bss:0x00000008; // type:object size:0xC scope:local data:4byte +StateID_TrapWait__15dAcOtrapRock1_c = .bss:0x00000018; // type:object size:0x30 data:4byte +StateID_TrapAction__15dAcOtrapRock1_c = .bss:0x00000058; // type:object size:0x30 data:4byte +StateID_TrapReturn__15dAcOtrapRock1_c = .bss:0x00000098; // type:object size:0x30 data:4byte diff --git a/configure.py b/configure.py index 8d264269..138e74bd 100644 --- a/configure.py +++ b/configure.py @@ -1670,7 +1670,7 @@ def nw4rLib(lib_name, objects, extra_cflags=[]): Rel( NonMatching, "d_a_obj_trap_bird_wood", "REL/d/a/obj/d_a_obj_trap_bird_wood.cpp" ), - Rel(NonMatching, "d_a_obj_trap_rock_1", "REL/d/a/obj/d_a_obj_trap_rock_1.cpp"), + Rel(Matching, "d_a_obj_trap_rock_1", "REL/d/a/obj/d_a_obj_trap_rock_1.cpp"), Rel( NonMatching, "d_a_obj_treasure_island", diff --git a/include/d/a/obj/d_a_obj_trap_rock_1.h b/include/d/a/obj/d_a_obj_trap_rock_1.h index 70afce36..c0da852e 100644 --- a/include/d/a/obj/d_a_obj_trap_rock_1.h +++ b/include/d/a/obj/d_a_obj_trap_rock_1.h @@ -2,6 +2,9 @@ #define D_A_OBJ_TRAP_ROCK_1_H #include "d/a/obj/d_a_obj_base.h" +#include "d/col/bg/d_bg_w.h" +#include "m/m3d/m_smdl.h" +#include "nw4r/g3d/g3d_resfile.h" #include "s/s_State.hpp" #include "s/s_StateMgr.hpp" @@ -10,12 +13,28 @@ class dAcOtrapRock1_c : public dAcObjBase_c { dAcOtrapRock1_c() : mStateMgr(*this, sStateID::null) {} virtual ~dAcOtrapRock1_c() {} + virtual bool createHeap() override; + virtual int create() override; + virtual int doDelete() override; + virtual int actorExecute() override; + virtual int draw() override; + STATE_FUNC_DECLARE(dAcOtrapRock1_c, TrapWait); STATE_FUNC_DECLARE(dAcOtrapRock1_c, TrapAction); STATE_FUNC_DECLARE(dAcOtrapRock1_c, TrapReturn); private: - /* 0x??? */ STATE_MGR_DECLARE(dAcOtrapRock1_c); + /* 0x300 */ nw4r::g3d::ResFile mResFile; + /* 0x334 */ m3d::smdl_c mMdl; + /* 0x350 */ dBgW mBgW; + /* 0x560 */ STATE_MGR_DECLARE(dAcOtrapRock1_c); + /* 0x59C */ u8 mActivationSceneFlag; + /* 0x59D */ u8 mReturnSceneFlag; + /* 0x59E */ s16 field_0x59E; + /* 0x5A0 */ s16 field_0x5A0; + /* 0x5A2 */ s16 field_0x5A2; + /* 0x5A4 */ u8 mFrameCounter; + /* 0x5A5 */ s8 field_0x5A5; }; #endif diff --git a/src/REL/d/a/obj/d_a_obj_trap_rock_1.cpp b/src/REL/d/a/obj/d_a_obj_trap_rock_1.cpp index cc314e45..91edc841 100644 --- a/src/REL/d/a/obj/d_a_obj_trap_rock_1.cpp +++ b/src/REL/d/a/obj/d_a_obj_trap_rock_1.cpp @@ -1,17 +1,140 @@ #include "d/a/obj/d_a_obj_trap_rock_1.h" +#include "d/col/bg/d_bg_s.h" +#include "d/flag/sceneflag_manager.h" +#include "m/m_vec.h" +#include "nw4r/math/math_arithmetic.h" +#include "s/s_Math.h" + SPECIAL_ACTOR_PROFILE(OBJ_TRAP_ROCK_1, dAcOtrapRock1_c, fProfile::OBJ_TRAP_ROCK_1, 0x26B, 0, 2); STATE_DEFINE(dAcOtrapRock1_c, TrapWait); STATE_DEFINE(dAcOtrapRock1_c, TrapAction); STATE_DEFINE(dAcOtrapRock1_c, TrapReturn); +bool dAcOtrapRock1_c::createHeap() { + mResFile = getOarcResFile("TrapRockRoll"); + nw4r::g3d::ResMdl m = mResFile.GetResMdl("TrapRockRoll"); + + TRY_CREATE(mMdl.create(m, &heap_allocator, 0x120)); + mMdl.setPriorityDraw(0x1C, 0x09); + void *dzb = getOarcFile("TrapRockRoll", "dzb/TrapRockRoll.dzb"); + void *plc = getOarcFile("TrapRockRoll", "dat/TrapRockRoll.plc"); + updateMatrix(); + return !mBgW.Set((cBgD_t *)dzb, (PLC *)plc, cBgW::MOVE_BG_e, &mWorldMtx, nullptr); +} + +int dAcOtrapRock1_c::create() { + mActivationSceneFlag = params & 0xFF; + mReturnSceneFlag = (params >> 8) & 0xFF; + CREATE_ALLOCATOR(dAcOtrapRock1_c); + + mBgW.SetCrrFunc(dBgS_MoveBGProc_Typical); + dBgS::GetInstance()->Regist(&mBgW, this); + forwardAccel = 0.0f; + forwardMaxSpeed = -40.0f; + mStateMgr.changeState(StateID_TrapWait); + mVec3_c min, max; + mMdl.getBounds(&min, &max); + static mVec3_c offset = mVec3_c(50.0f, 50.0f, 50.0f); + min -= offset; + max += offset; + boundingBox.Set(min, max); + + return SUCCEEDED; +} + +int dAcOtrapRock1_c::doDelete() { + return SUCCEEDED; +} + +int dAcOtrapRock1_c::actorExecute() { + mStateMgr.executeState(); + updateMatrix(); + mMdl.setLocalMtx(mWorldMtx); + mBgW.Move(); + return SUCCEEDED; +} + +int dAcOtrapRock1_c::draw() { + drawModelType1(&mMdl); + return SUCCEEDED; +} + void dAcOtrapRock1_c::initializeState_TrapWait() {} -void dAcOtrapRock1_c::executeState_TrapWait() {} +void dAcOtrapRock1_c::executeState_TrapWait() { + if (SceneflagManager::sInstance->checkBoolFlag(roomid, mActivationSceneFlag)) { + mStateMgr.changeState(StateID_TrapAction); + } +} void dAcOtrapRock1_c::finalizeState_TrapWait() {} -void dAcOtrapRock1_c::initializeState_TrapAction() {} -void dAcOtrapRock1_c::executeState_TrapAction() {} +void dAcOtrapRock1_c::initializeState_TrapAction() { + mFrameCounter = 0; + field_0x59E = 0x2000; + field_0x5A0 = 0x2000; + field_0x5A5 = 1; + field_0x5A2 = 0x2D8; + playSound(0xB0E); +} + +void dAcOtrapRock1_c::executeState_TrapAction() { + if (SceneflagManager::sInstance->checkBoolFlag(roomid, mReturnSceneFlag)) { + mStateMgr.changeState(StateID_TrapReturn); + } else if (field_0x59E == 0 || mFrameCounter > 4) { + // After 5 frames, move rotation.x to 0x4000, then stay until return + bool reachedPoint = sLib::chaseAngle(&rotation.x.mVal, 0x4000, 0x14); + if (reachedPoint) { + return; + } + } else { + f32 ratio; + if (mFrameCounter == 0 && rotation.x < 0x4000) { + ratio = 0.1f; + } else { + f32 b = field_0x5A0; + f32 r = (rotation.x - 0x4000) / b; + ratio = nw4r::math::FAbs(r); + } + if (ratio > 1.0f) { + ratio = 1.0f; + } + else if (ratio < 0.1f) { + ratio = 0.1f; + } + s16 newAng = field_0x5A5 * (1.0f - ratio) * field_0x5A2; + static const u16 sSomeValue = 0x3C; + if (field_0x5A5 > 0) { + if ((u16)newAng <= sSomeValue - 1) { + newAng = sSomeValue; + } + } else if ((u16)(newAng + sSomeValue - 1) <= sSomeValue - 1) { + newAng = -sSomeValue; + } + + rotation.x += (int)newAng; + if (field_0x59E > 0 && rotation.x > field_0x59E + 0x4000 || + field_0x59E < 0 && rotation.x < field_0x59E + 0x4000) { + rotation.x = field_0x59E + 0x4000; + u8 r6 = field_0x5A5; + field_0x5A5 = r6 - (r6 * 2); + field_0x5A0 = field_0x59E; + field_0x59E = field_0x59E - (field_0x59E * 2); + if (mFrameCounter >= 1) { + field_0x59E = field_0x59E >> 1; + field_0x5A2 = field_0x5A2 >> 2; + } else { + field_0x5A2 = field_0x5A2 * 2 / 3; + } + mFrameCounter++; + } + } +} void dAcOtrapRock1_c::finalizeState_TrapAction() {} void dAcOtrapRock1_c::initializeState_TrapReturn() {} -void dAcOtrapRock1_c::executeState_TrapReturn() {} +void dAcOtrapRock1_c::executeState_TrapReturn() { + bool reachedReturnPoint = sLib::chaseAngle(&rotation.x.mVal, 0, 0x222); + if (reachedReturnPoint) { + mStateMgr.changeState(StateID_TrapWait); + } +} void dAcOtrapRock1_c::finalizeState_TrapReturn() {}