From 1e29b7940c336147849d32b4c20943277d028fd0 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sun, 16 Nov 2025 01:13:40 -0500 Subject: [PATCH] states finished --- .../SOUE01/rels/d_a_obj_barrelNP/symbols.txt | 58 ++-- include/d/a/obj/d_a_obj_barrel.h | 28 +- include/d/col/c/c_cc_d.h | 3 - include/toBeSorted/special_item_drop_mgr.h | 6 +- src/REL/d/a/obj/d_a_obj_barrel.cpp | 305 ++++++++++++++++-- src/REL/d/a/obj/d_a_obj_tubo.cpp | 8 +- 6 files changed, 341 insertions(+), 67 deletions(-) diff --git a/config/SOUE01/rels/d_a_obj_barrelNP/symbols.txt b/config/SOUE01/rels/d_a_obj_barrelNP/symbols.txt index 0f3f601b..ded4524c 100644 --- a/config/SOUE01/rels/d_a_obj_barrelNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_barrelNP/symbols.txt @@ -4,24 +4,24 @@ _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 dAcOBarrel_c_classInit__Fv = .text:0x000000F0; // type:function size:0x16C -fn_293_260 = .text:0x00000260; // type:function size:0x58 +__dt__15dShadowCircle_cFv = .text:0x00000260; // type:function size:0x58 __dt__25sFState_c<12dAcOBarrel_c>Fv = .text:0x000002C0; // type:function size:0x58 __dt__28sFStateFct_c<12dAcOBarrel_c>Fv = .text:0x00000320; // type:function size:0x6C __dt__81sStateMgr_c<12dAcOBarrel_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000390; // type:function size:0xA0 __dt__51sFStateMgr_c<12dAcOBarrel_c,20sStateMethodUsr_FI_c>Fv = .text:0x00000430; // type:function size:0xA4 -fn_293_4E0 = .text:0x000004E0; // type:function size:0x5C +__dt__14dWaterEffect_cFv = .text:0x000004E0; // type:function size:0x5C createHeap__12dAcOBarrel_cFv = .text:0x00000540; // type:function size:0xAC -fn_293_5F0 = .text:0x000005F0; // type:function size:0x5B0 +actorCreate__12dAcOBarrel_cFv = .text:0x000005F0; // type:function size:0x5B0 changeState__81sStateMgr_c<12dAcOBarrel_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x00000BA0; // type:function size:0x10 -fn_293_BB0 = .text:0x00000BB0; // type:function size:0x248 -fn_293_E00 = .text:0x00000E00; // type:function size:0x8 -fn_293_E10 = .text:0x00000E10; // type:function size:0x3F4 +actorPostCreate__12dAcOBarrel_cFv = .text:0x00000BB0; // type:function size:0x248 +doDelete__12dAcOBarrel_cFv = .text:0x00000E00; // type:function size:0x8 +actorExecute__12dAcOBarrel_cFv = .text:0x00000E10; // type:function size:0x3F4 executeState__81sStateMgr_c<12dAcOBarrel_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00001210; // type:function size:0x10 getStateID__81sStateMgr_c<12dAcOBarrel_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x00001220; // type:function size:0x10 -fn_293_1230 = .text:0x00001230; // type:function size:0xA0 -fn_293_12D0 = .text:0x000012D0; // type:function size:0x70 -fn_293_1340 = .text:0x00001340; // type:function size:0x9C -fn_293_13E0 = .text:0x000013E0; // type:function size:0xE8 +registerInEvent__12dAcOBarrel_cFv = .text:0x00001230; // type:function size:0xA0 +unkVirtFunc_0x6C__12dAcOBarrel_cFv = .text:0x000012D0; // type:function size:0x70 +doInteraction__12dAcOBarrel_cFl = .text:0x00001340; // type:function size:0x9C +draw__12dAcOBarrel_cFv = .text:0x000013E0; // type:function size:0xE8 initializeState_Wait__12dAcOBarrel_cFv = .text:0x000014D0; // type:function size:0x18 executeState_Wait__12dAcOBarrel_cFv = .text:0x000014F0; // type:function size:0x35C finalizeState_Wait__12dAcOBarrel_cFv = .text:0x00001850; // type:function size:0x4 @@ -54,30 +54,30 @@ initializeState_Rebirth__12dAcOBarrel_cFv = .text:0x00002DC0; // type:function s executeState_Rebirth__12dAcOBarrel_cFv = .text:0x00002F70; // type:function size:0xE8 fn_293_3060 = .text:0x00003060; // type:function size:0x1C finalizeState_Rebirth__12dAcOBarrel_cFv = .text:0x00003080; // type:function size:0x4C -fn_293_30D0 = .text:0x000030D0; // type:function size:0xE0 -fn_293_31B0 = .text:0x000031B0; // type:function size:0x3B0 -fn_293_3560 = .text:0x00003560; // type:function size:0x24C -fn_293_37B0 = .text:0x000037B0; // type:function size:0x26C +fn_293_30D0__12dAcOBarrel_cFv = .text:0x000030D0; // type:function size:0xE0 +fn_293_31B0__12dAcOBarrel_cFv = .text:0x000031B0; // type:function size:0x3B0 +fn_293_3560__12dAcOBarrel_cFv = .text:0x00003560; // type:function size:0x24C +fn_293_37B0__12dAcOBarrel_cFv = .text:0x000037B0; // type:function size:0x26C fn_293_3A20 = .text:0x00003A20; // type:function size:0x384 -fn_293_3DB0 = .text:0x00003DB0; // type:function size:0x44C -fn_293_4200 = .text:0x00004200; // type:function size:0x39C -fn_293_45A0 = .text:0x000045A0; // type:function size:0x4E4 -fn_293_4A90 = .text:0x00004A90; // type:function size:0x12C -fn_293_4BC0 = .text:0x00004BC0; // type:function size:0x58 +fn_293_3DB0__12dAcOBarrel_cFv = .text:0x00003DB0; // type:function size:0x44C +fn_293_4200__12dAcOBarrel_cFv = .text:0x00004200; // type:function size:0x39C +fn_293_45A0__12dAcOBarrel_cFv = .text:0x000045A0; // type:function size:0x4E4 +fn_293_4A90__12dAcOBarrel_cFRC4mAng = .text:0x00004A90; // type:function size:0x12C +fn_293_4BC0__12dAcOBarrel_cFv = .text:0x00004BC0; // type:function size:0x58 fn_293_4C20 = .text:0x00004C20; // type:function size:0x40 -fn_293_4C60 = .text:0x00004C60; // type:function size:0x78 +fn_293_4C60__12dAcOBarrel_cFv = .text:0x00004C60; // type:function size:0x78 fn_293_4CE0 = .text:0x00004CE0; // type:function size:0x1C -fn_293_4D00 = .text:0x00004D00; // type:function size:0x1C4 -fn_293_4ED0 = .text:0x00004ED0; // type:function size:0xA8 -fn_293_4F80 = .text:0x00004F80; // type:function size:0x130 -fn_293_50B0 = .text:0x000050B0; // type:function size:0x98 -fn_293_5150 = .text:0x00005150; // type:function size:0x208 -fn_293_5360 = .text:0x00005360; // type:function size:0xDC +fn_293_4D00__12dAcOBarrel_cFv = .text:0x00004D00; // type:function size:0x1C4 +fn_293_4ED0__12dAcOBarrel_cFv = .text:0x00004ED0; // type:function size:0xA8 +fn_293_4F80__12dAcOBarrel_cFv = .text:0x00004F80; // type:function size:0x130 +fn_293_50B0__12dAcOBarrel_cFv = .text:0x000050B0; // type:function size:0x98 +fn_293_5150__12dAcOBarrel_cFv = .text:0x00005150; // type:function size:0x208 +fn_293_5360__12dAcOBarrel_cFv = .text:0x00005360; // type:function size:0xDC fn_293_5440 = .text:0x00005440; // type:function size:0x8C fn_293_54D0 = .text:0x000054D0; // type:function size:0x380 -fn_293_5850 = .text:0x00005850; // type:function size:0x70 -fn_293_58C0 = .text:0x000058C0; // type:function size:0x50 -fn_293_5910 = .text:0x00005910; // type:function size:0xC0 +fn_293_5850__12dAcOBarrel_cFPfb = .text:0x00005850; // type:function size:0x70 +fn_293_58C0__12dAcOBarrel_cFv = .text:0x000058C0; // type:function size:0x50 +fn_293_5910__12dAcOBarrel_cFv = .text:0x00005910; // type:function size:0xC0 __dt__12dAcOBarrel_cFv = .text:0x000059D0; // type:function size:0x164 build__28sFStateFct_c<12dAcOBarrel_c>FRC12sStateIDIf_c = .text:0x00005B40; // type:function size:0x60 dispose__28sFStateFct_c<12dAcOBarrel_c>FRP10sStateIf_c = .text:0x00005BA0; // type:function size:0xC diff --git a/include/d/a/obj/d_a_obj_barrel.h b/include/d/a/obj/d_a_obj_barrel.h index 40eb2cbf..418670ba 100644 --- a/include/d/a/obj/d_a_obj_barrel.h +++ b/include/d/a/obj/d_a_obj_barrel.h @@ -10,6 +10,7 @@ #include "d/d_shadow.h" #include "d/flag/sceneflag_manager.h" #include "m/m3d/m_smdl.h" +#include "m/m_angle.h" #include "m/m_quat.h" #include "m/m_vec.h" #include "nw4r/g3d/res/g3d_resfile.h" @@ -46,6 +47,9 @@ public: /** fn_293_30D0 */ void fn_293_30D0(); + /** fn_293_31B0 */ + void fn_293_31B0(); + /** fn_293_3560 */ void fn_293_3560(); @@ -79,6 +83,9 @@ public: /** fn_293_4ED0 */ bool fn_293_4ED0(); + /** fn_293_4F80 */ + bool fn_293_4F80(); + /** fn_293_50B0 */ bool fn_293_50B0(); @@ -88,6 +95,9 @@ public: /** fn_293_5360 */ void fn_293_5360(); + /** fn_293_5850 */ + void fn_293_5850(f32 *, bool); + /** fn_293_58C0 */ void fn_293_58C0(); @@ -132,7 +142,8 @@ private: /* 0xC7C */ TimeAreaStruct mTimeArea; /* 0xC88 */ dAcRef_c mCeLady; /* 0xC94 */ dAcRef_c mCeFriend; - /* 0xCA0 */ u8 _CA0[0xD08 - 0xCA0]; + /* 0xCA0 */ EffectsStruct mEmitter0; + /* 0xCD4 */ EffectsStruct mEmitter1; /* 0xD08 */ dWaterEffect_c mWaterEffect; /* 0xD70 */ mQuat_c quat_0xD50; /* 0xD70 */ mQuat_c quat_0xD60; @@ -142,13 +153,17 @@ private: /* 0xDA0 */ mQuat_c quat_0xDA0; /* 0xDB0 */ u8 _DB0[0xDBC - 0xDB0]; /* 0xDBC */ mVec3_c field_0xDBC; - /* 0xDC8 */ u8 _DC8[0xDD4 - 0xDC8]; + /* 0xDC8 */ mVec3_c field_0xDC8; /* 0xDD4 */ f32 field_0xDD4; /* 0xDD8 */ mVec3_c field_0xDD8; /* 0xDE4 */ mAng3_c field_0xDE4; - /* 0xDEE */ u8 _DEA[0xDEC - 0xDEA]; - /* 0xDEC */ u16 field_0xDEC; - /* 0xDEE */ u8 _DEE[0xE00 - 0xDEE]; + /* 0xDEA */ mAng field_0xDEA; + /* 0xDEC */ mAng field_0xDEC; + /* 0xDEE */ mAng field_0xDEE; + /* 0xDF0 */ mAng field_0xDF0; + /* 0xDF2 */ mAng field_0xDF2; + /* 0xDF4 */ u8 _DF4[0xDFE - 0xDF4]; + /* 0xDF4 */ u16 field_0xDFE; /* 0xE00 */ bool field_0xE00; //< Can Damage ? /* 0xE01 */ bool field_0xE01; /* 0xE02 */ bool field_0xE02; @@ -158,7 +173,7 @@ private: /* 0xE06 */ bool field_0xE06; /* 0xE07 */ bool field_0xE07; /* 0xE08 */ bool field_0xE08; - /* 0xE09 */ bool field_0xE09; + /* 0xE09 */ bool field_0xE09; //< for OBJ_VSD Present /* 0xE0A */ bool field_0xE0A; /* 0xE0B */ bool field_0xE0B; /* 0xE0C */ bool field_0xE0C; @@ -175,6 +190,7 @@ private: /* 0xE17 */ u8 field_0xE17; /* 0xE18 */ u8 field_0xE18; /* 0xE19 */ u8 mBrokenFlag; + /* 0xE1C */ s32 mDropItem; }; #endif diff --git a/include/d/col/c/c_cc_d.h b/include/d/col/c/c_cc_d.h index 998fb161..73be114a 100644 --- a/include/d/col/c/c_cc_d.h +++ b/include/d/col/c/c_cc_d.h @@ -913,9 +913,6 @@ public: void OnAtSet() { mAt.OnSPrm(1); } - void OffAtSet() { - mAt.OffSPrm(1); - } u32 ChkAtNoMass() const { return mAt.MskSPrm(0x400); } diff --git a/include/toBeSorted/special_item_drop_mgr.h b/include/toBeSorted/special_item_drop_mgr.h index 2744cee9..7a7d43b4 100644 --- a/include/toBeSorted/special_item_drop_mgr.h +++ b/include/toBeSorted/special_item_drop_mgr.h @@ -17,9 +17,9 @@ enum SpecialItemDropTable { SPECIAL_ITEM_8, SPECIAL_ITEM_9, SPECIAL_ITEM_10, - SPECIAL_ITEM_11, - SPECIAL_ITEM_12, - SPECIAL_ITEM_13, + SPECIAL_ITEM_10BOMBS, + SPECIAL_ITEM_ARROWS, + SPECIAL_ITEM_SEEDS, // ... }; diff --git a/src/REL/d/a/obj/d_a_obj_barrel.cpp b/src/REL/d/a/obj/d_a_obj_barrel.cpp index 102cad5f..6f2c41d2 100644 --- a/src/REL/d/a/obj/d_a_obj_barrel.cpp +++ b/src/REL/d/a/obj/d_a_obj_barrel.cpp @@ -3,6 +3,7 @@ #include "c/c_math.h" #include "common.h" #include "d/a/d_a_base.h" +#include "d/a/d_a_item.h" #include "d/a/d_a_player.h" #include "d/a/npc/d_a_npc_ce_friend.h" #include "d/a/npc/d_a_npc_ce_lady.h" @@ -10,11 +11,14 @@ #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_tri.h" #include "d/col/cc/d_cc_d.h" #include "d/col/cc/d_cc_s.h" #include "d/d_linkage.h" +#include "d/d_rumble.h" #include "d/flag/sceneflag_manager.h" #include "d/snd/d_snd_wzsound.h" +#include "egg/math/eggMath.h" #include "f/f_base.h" #include "f/f_profile_name.h" #include "m/m_angle.h" @@ -23,10 +27,12 @@ #include "nw4r/g3d/res/g3d_resfile.h" #include "nw4r/math/math_arithmetic.h" #include "rvl/MTX/mtxvec.h" +#include "rvl/MTX/vec.h" #include "s/s_Math.h" #include "toBeSorted/attention.h" #include "toBeSorted/d_emitter.h" #include "toBeSorted/event_manager.h" +#include "toBeSorted/special_item_drop_mgr.h" f32 sFloats1(1.f); @@ -129,7 +135,7 @@ int dAcOBarrel_c::actorCreate() { mMaxSpeed = -40.f; field_0xDD8.y = 0.f; - field_0xDEC = 0; + field_0xDEC = mAng::Zero(); quat_0xD50.set(1.f, 0.f, 0.f, 0.f); mScale.set(1.f, 1.f, 1.f); quat_0xD70.set(1.f, 0.f, 0.f, 0.f); @@ -143,8 +149,8 @@ int dAcOBarrel_c::actorCreate() { mCyl.SetAtGrp(0x10); } - /* field_0xCC8 = this */ - /* field_0xCFC = this */ + mEmitter0.init(this); + mEmitter1.init(this); if (mRotation.x != 0 || mRotation.z != 0) { field_0xE02 = true; @@ -393,7 +399,7 @@ void dAcOBarrel_c::executeState_Wait() { holdSoundWithFloatParam(SE_Barrel_ROLL_LV, mSpeed); mCyl.OnAtSet(); } else { - mCyl.OffAtSet(); + mCyl.ClrAtSet(); } } @@ -457,7 +463,7 @@ void dAcOBarrel_c::initializeState_GrabUp() { } mCyl.SetCo_0x400(); - mCyl.OffAtSet(); + mCyl.ClrAtSet(); if (field_0xE04) { field_0xE15 = 10; @@ -495,7 +501,7 @@ void dAcOBarrel_c::executeState_GrabUp() { } void dAcOBarrel_c::finalizeState_GrabUp() { mCyl.ClrCo_0x400(); - mCyl.OffAtSet(); + mCyl.ClrAtSet(); field_0xE02 = true; } @@ -530,21 +536,276 @@ void dAcOBarrel_c::finalizeState_GrabPut() { mCyl.OnAtSet(); } -void dAcOBarrel_c::initializeState_Slope() {} -void dAcOBarrel_c::executeState_Slope() {} -void dAcOBarrel_c::finalizeState_Slope() {} -void dAcOBarrel_c::initializeState_Water() {} -void dAcOBarrel_c::executeState_Water() {} -void dAcOBarrel_c::finalizeState_Water() {} -void dAcOBarrel_c::initializeState_Water2() {} -void dAcOBarrel_c::executeState_Water2() {} -void dAcOBarrel_c::finalizeState_Water2() {} -void dAcOBarrel_c::initializeState_Explode() {} -void dAcOBarrel_c::executeState_Explode() {} +void dAcOBarrel_c::initializeState_Slope() { + mVec3_c vz_out; + cM3dGTri tri; + dBgS::GetInstance()->GetTriPla(mObjAcch.GetGnd(), &tri); + + if (checkSlower(EGG::Math::epsilon())) { + mAngle.y = tri.GetAngleY(); + mSpeed = 5.f; + } + field_0xDEE = tri.GetAngleY(); + field_0xDEE -= mAngle.y; + + mAng ang(mAng::abs(mAngle.y - field_0xDEE)); + field_0xDF0 = nw4r::math::FSqrt(ang.degree2() / 180.f) * 910.f; + + MTXMultVecSR(mWorldMtx, -mVec3_c::Ez, vz_out); + field_0xDEA = vz_out.atan2sX_Z(); + + field_0xE09 = false; + + if (dBgS_ObjGndChk::CheckPos(mPosition + mVec3_c::Ey * 100.f)) { + const dAcObjBase_c *pObj = dBgS::GetInstance()->GetActorPointer(dBgS_ObjGndChk::GetInstance()); + if (dBgS::GetInstance()->ChkMoveBG(dBgS_ObjGndChk::GetInstance(), true)) { + if (pObj && pObj->mProfileName == fProfile::OBJ_VSD) { + field_0xE09 = true; + quat_0xD70.set(1.f, 0.f, 0.f, 0.f); + } + } + } +} +void dAcOBarrel_c::executeState_Slope() { + if (mObjAcch.ChkGroundLanding() && !field_0xE0E) { + fn_293_37B0(); + dJEffManager_c::spawnGroundEffect(mPosition, mPolyAttr0, mPolyAttr1, mVelocity, 0, 1.f, field_0x1B0); + startSound(SE_Barrel_ROLL_GROUND); + } else if (mObjAcch.ChkGndHit()) { + field_0xDD8.y = 0.f; + mVelocity.y = 0.f; + fn_293_30D0(); + + if (field_0xE02) { + fn_293_31B0(); + } else { + fn_293_58C0(); + mVec3_c v = field_0xDBC; + v.rotY(-mRotation.y); + + if (field_0xE09) { + v = mVec3_c::Ey; + } + + quat_0xD70.Set(mVec3_c::Ey, v); + } + + fn_293_3560(); + + if (checkSlower(EGG::Math::epsilon())) { + field_0xE00 = false; + } else if (field_0xE02) { + field_0xE00 = fn_293_4F80(); + } + + if (!field_0xE08 && !isType_0() && mYOffset < 0.f && fn_293_4BC0()) { + mSpeed = 0.f; + field_0xE00 = false; + fn_293_5910(); + } + + if (mSpeed > 0.f && field_0xE02) { + holdSoundWithFloatParam(SE_Barrel_ROLL_LV, mSpeed); + mCyl.OnAtSet(); + } else { + mCyl.ClrAtSet(); + } + + if (!field_0xE08 && !isType_0() && checkYOffsetField_0x100()) { + killNoItemDrop(); + return; + } + + if (!fn_293_4A90(mAng::deg2short(1))) { + mStateMgr.changeState(StateID_Wait); + return; + } + } + + if (fn_293_4C60()) { + mStateMgr.changeState(StateID_Water); + } else if (getLinkage().checkConnection(dLinkage_c::CONNECTION_1)) { + mStateMgr.changeState(StateID_GrabUp); + } +} +void dAcOBarrel_c::finalizeState_Slope() { + field_0xE09 = false; +} + +void dAcOBarrel_c::initializeState_Water() { + field_0xDE4.x = cM::rndInt(0x100) + 0x900; + field_0xDF2 = cM::rndInt(0x100) + 0x1000; + + mAcceleration *= 0.25f; + mVelocity.y *= 0.25f; + + mStts.SetRank(9); + + field_0xE16 = 120; + + startSound(SE_Barrel_ROLL_FLOAT); + startSound(SE_O_FALL_WATER_M); +} +void dAcOBarrel_c::executeState_Water() { + if (mType == dAcOBarrel_c::Type2 && 0 == sLib::calcTimer(&field_0xE16)) { + mVelocity.y = nw4r::ut::Max(mVelocity.y + mAcceleration * 0.2f, mMaxSpeed * 0.2f); + + if (mObjAcch.ChkGndHit()) { + fn_293_4200(); + } + } else { + fn_293_5850(&sFloats1, true); + + if (mScale.y > 0.f) { + mWaterEffect.execute(mObjAcch.GetWtrGroundH(), mObjAcch.GetGroundH()); + } + + if (mType != dAcOBarrel_c::Type2 && nw4r::math::FAbs(field_0xDD8.z + mAcceleration) < 0.1f && + nw4r::math::FAbs(mVelocity.y + mAcceleration) < 0.1f) { + mStateMgr.changeState(StateID_Water2); + } else if (!fn_293_4C60()) { + mStateMgr.changeState(StateID_Wait); + } + } +} +void dAcOBarrel_c::finalizeState_Water() { + field_0xDF2 = mAng::Zero(); +} + +void dAcOBarrel_c::initializeState_Water2() { + mVelocity.y = cM::rndFX(0.1f) + 0.2f; + field_0xDF2 = cM::rndInt(0x50) + 0x300; + field_0xDE4.x = cM::rndInt(0x100) + 0x400; +} +void dAcOBarrel_c::executeState_Water2() { + static f32 sFloat = 1.f; + fn_293_5850(&sFloat, false); + if (mScale.y > 0.f) { + mWaterEffect.execute(mObjAcch.GetWtrGroundH(), mObjAcch.GetGroundH()); + } + if (!fn_293_4C60()) { + mStateMgr.changeState(StateID_Wait); + } +} +void dAcOBarrel_c::finalizeState_Water2() { + field_0xDF2 = mAng::Zero(); +} + +void dAcOBarrel_c::initializeState_Explode() { + setActorProperty(AC_PROP_0x4); + mSpeed = 0.f; + mVelocity = mVec3_c::Zero; + mAcceleration = 0.f; + + mSph.ClrTgSet(); + mSph.ClrCoSet(); + mSph.OnAtSet(); + + field_0xE13 = 5; + + f32 dist = mPosition.squareDistance(dAcPy_c::GetLink()->mPosition); + if (dist < 400.f * 400.f) { + dRumble_c::start(dRumble_c::sRumblePreset1, dRumble_c::FLAG_SLOT0 | dRumble_c::FLAG_ACTIVE); + } else if (dist < 800.f * 800.f) { + dRumble_c::start(dRumble_c::sRumblePreset3, dRumble_c::FLAG_SLOT0 | dRumble_c::FLAG_ACTIVE); + } +} +void dAcOBarrel_c::executeState_Explode() { + if (0 == sLib::calcTimer(&field_0xE13)) { + if (field_0xE07) { + itemDroppingAndGivingRelated(nullptr, 0); + } + deleteRequest(); + } +} void dAcOBarrel_c::finalizeState_Explode() {} -void dAcOBarrel_c::initializeState_KrakenBorn() {} -void dAcOBarrel_c::executeState_KrakenBorn() {} + +void dAcOBarrel_c::initializeState_KrakenBorn() { + mSpeed = 30.f; + mCyl.OffAtGrp(0x2); + + field_0xE00 = true; + field_0xE02 = true; +} +void dAcOBarrel_c::executeState_KrakenBorn() { + if (mObjAcch.ChkGroundLanding()) { + fn_293_37B0(); + dJEffManager_c::spawnGroundEffect(mPosition, mPolyAttr0, mPolyAttr1, mVelocity, 0, 1.f, field_0x1B0); + startSound(SE_Barrel_ROLL_GROUND); + } else if (mObjAcch.ChkGndHit()) { + field_0xDD8.y = 0.f; + mVelocity.y = 0.f; + if (mSpeed > 0.f) { + holdSoundWithFloatParam(SE_Barrel_ROLL_LV, mSpeed); + } + } + + if (fn_293_4C60()) { + deleteRequest(); + } +} void dAcOBarrel_c::finalizeState_KrakenBorn() {} -void dAcOBarrel_c::initializeState_Rebirth() {} -void dAcOBarrel_c::executeState_Rebirth() {} -void dAcOBarrel_c::finalizeState_Rebirth() {} + +void dAcOBarrel_c::initializeState_Rebirth() { + SpecialItemDropMgr::GetInstance()->giveSpecialDropItem( + getParams2UpperByte(), mRoomID, &mPosition, 0, mRotation.y, -1 + ); + field_0xDC8 = mPosition; + mpPosition = &field_0xDC8; + mRotation = mRotationCopy; + quat_0xD90.set(1.f, 0.f, 0.f, 0.f); + quat_0xD70.set(1.f, 0.f, 0.f, 0.f); + quat_0xD80.set(1.f, 0.f, 0.f, 0.f); + quat_0xDA0.set(1.f, 0.f, 0.f, 0.f); + + mSpeed = 0.f; + mVelocity.y = 0.f; + field_0xDD8.y = 0.f; + + mCyl.ClrCoSet(); + mCyl.ClrTgSet(); + getLinkage().fn_80050EA0(this); + + mStts.SetRank(0); + setObjectProperty(OBJ_PROP_0x200); + + switch (getParams2UpperByte()) { + case SPECIAL_ITEM_10BOMBS: mDropItem = 2; break; + case SPECIAL_ITEM_ARROWS: mDropItem = 0; break; + case SPECIAL_ITEM_SEEDS: mDropItem = 1; break; + } + + field_0xDFE = 150; + unsetActorProperty(AC_PROP_0x1); +} +void dAcOBarrel_c::executeState_Rebirth() { + field_0xDD8.y = 0.f; + + // Why?? + mPosition.set(mPositionCopy.x, mPositionCopy.y, mPositionCopy.z); + mOldPosition.set(mPositionCopy.x, mPositionCopy.y, mPositionCopy.z); + + u8 count = 0xFF; + switch (mDropItem) { + case 2: count = dAcItem_c::getTotalBombCount(); break; + case 0: count = dAcItem_c::getTotalArrowCount(); break; + case 1: count = dAcItem_c::getTotalSeedCount(); break; + } + + if (checkObjectProperty(OBJ_PROP_0x2) && count <= 3) { + if (0 == sLib::calcTimer(&field_0xDFE)) { + mStateMgr.changeState(StateID_Wait); + } + } else { + field_0xDFE = 150; + } +} +void dAcOBarrel_c::finalizeState_Rebirth() { + mCyl.OnCoSet(); + mCyl.OnTgSet(); + field_0xE02 = false; + mpPosition = &mPosition; + unsetObjectProperty(OBJ_PROP_0x200); + setActorProperty(AC_PROP_0x1); + mStts.SetRank(9); +} diff --git a/src/REL/d/a/obj/d_a_obj_tubo.cpp b/src/REL/d/a/obj/d_a_obj_tubo.cpp index cd277f3a..71864c03 100644 --- a/src/REL/d/a/obj/d_a_obj_tubo.cpp +++ b/src/REL/d/a/obj/d_a_obj_tubo.cpp @@ -407,10 +407,10 @@ void dAcOtubo_c::initializeState_Rebirth() { int item_drop_table = getParams2UpperByte(); switch (item_drop_table) { - default: break; - case SPECIAL_ITEM_11: field_0x9FC = 2; break; - case SPECIAL_ITEM_12: field_0x9FC = 0; break; - case SPECIAL_ITEM_13: field_0x9FC = 1; break; + default: break; + case SPECIAL_ITEM_10BOMBS: field_0x9FC = 2; break; + case SPECIAL_ITEM_ARROWS: field_0x9FC = 0; break; + case SPECIAL_ITEM_SEEDS: field_0x9FC = 1; break; } mTimer_0x9E8 = 150; unsetActorProperty(AC_PROP_0x1);