diff --git a/config/SOUE01/rels/d_a_obj_paintNP/symbols.txt b/config/SOUE01/rels/d_a_obj_paintNP/symbols.txt index 44476abe..713e3efe 100644 --- a/config/SOUE01/rels/d_a_obj_paintNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_paintNP/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 dAcOpaint_c_classInit__Fv = .text:0x000000F0; // type:function size:0xD8 -fn_613_1D0 = .text:0x000001D0; // type:function size:0x58 +__dt__15dShadowCircle_cFv = .text:0x000001D0; // type:function size:0x58 __dt__24sFState_c<11dAcOpaint_c>Fv = .text:0x00000230; // type:function size:0x58 __dt__27sFStateFct_c<11dAcOpaint_c>Fv = .text:0x00000290; // type:function size:0x6C __dt__80sStateMgr_c<11dAcOpaint_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000300; // type:function size:0xA0 __dt__50sFStateMgr_c<11dAcOpaint_c,20sStateMethodUsr_FI_c>Fv = .text:0x000003A0; // type:function size:0xA4 -AcOpaint__initModels = .text:0x00000450; // type:function size:0xE0 -AcOpaint__init = .text:0x00000530; // type:function size:0xBC +createHeap__11dAcOpaint_cFv = .text:0x00000450; // type:function size:0xE0 +create__11dAcOpaint_cFv = .text:0x00000530; // type:function size:0xBC changeState__80sStateMgr_c<11dAcOpaint_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x000005F0; // type:function size:0x10 -fn_613_600 = .text:0x00000600; // type:function size:0x8 -AcOpaint__update = .text:0x00000610; // type:function size:0x50 +doDelete__11dAcOpaint_cFv = .text:0x00000600; // type:function size:0x8 +actorExecute__11dAcOpaint_cFv = .text:0x00000610; // type:function size:0x50 executeState__80sStateMgr_c<11dAcOpaint_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000660; // type:function size:0x10 -AcOpaint__draw = .text:0x00000670; // type:function size:0xB0 +draw__11dAcOpaint_cFv = .text:0x00000670; // type:function size:0xB0 initializeState_Wait__11dAcOpaint_cFv = .text:0x00000720; // type:function size:0x4 executeState_Wait__11dAcOpaint_cFv = .text:0x00000730; // type:function size:0x234 finalizeState_Wait__11dAcOpaint_cFv = .text:0x00000970; // type:function size:0x4 -AcOpaint__updateMatrix = .text:0x00000980; // type:function size:0xC4 -AcOpaint__getOarcName = .text:0x00000A50; // type:function size:0xC -AcOpaint__getModelName = .text:0x00000A60; // type:function size:0x38 +updateMatrix__11dAcOpaint_cFv = .text:0x00000980; // type:function size:0xC4 +getOarcName__11dAcOpaint_cFv = .text:0x00000A50; // type:function size:0xC +getModelName__11dAcOpaint_cFv = .text:0x00000A60; // type:function size:0x38 __dt__11dAcOpaint_cFv = .text:0x00000AA0; // type:function size:0xE8 getStateID__80sStateMgr_c<11dAcOpaint_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x00000B90; // type:function size:0x10 build__27sFStateFct_c<11dAcOpaint_c>FRC12sStateIDIf_c = .text:0x00000BA0; // type:function size:0x60 @@ -44,24 +44,24 @@ isSameName__26sFStateID_c<11dAcOpaint_c>CFPCc = .text:0x00000EE0; // type:functi _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_613_rodata_0 = .rodata:0x00000000; // type:object size:0x4 data:float -lbl_613_rodata_4 = .rodata:0x00000004; // type:object size:0x2C align:4 data:float +lbl_613_rodata_0 = .rodata:0x00000000; // type:object size:0x4 scope:local data:float +lbl_613_rodata_4 = .rodata:0x00000004; // type:object size:0x2C scope:local align:4 data:float g_profile_OBJ_PAINT = .data:0x00000000; // type:object size:0x10 data:4byte -lbl_613_data_10 = .data:0x00000010; // type:object size:0x19 data:string -lbl_613_data_2C = .data:0x0000002C; // type:object size:0x6 data:string -lbl_613_data_34 = .data:0x00000034; // type:object size:0x7 data:string -lbl_613_data_3C = .data:0x0000003C; // type:object size:0x7 data:string -AcOpaint__vtable = .data:0x00000048; // type:object size:0x80 -lbl_613_data_C8 = .data:0x000000C8; // type:object size:0x30 -lbl_613_data_F8 = .data:0x000000F8; // type:object size:0x30 -lbl_613_data_128 = .data:0x00000128; // type:object size:0x18 -lbl_613_data_140 = .data:0x00000140; // type:object size:0x18 -lbl_613_data_158 = .data:0x00000158; // type:object size:0x4C -lbl_613_data_1A4 = .data:0x000001A4; // type:object size:0x34 +lbl_613_data_10 = .data:0x00000010; // type:object size:0x19 scope:local data:string +lbl_613_data_2C = .data:0x0000002C; // type:object size:0x6 scope:local data:string +lbl_613_data_34 = .data:0x00000034; // type:object size:0x7 scope:local data:string +lbl_613_data_3C = .data:0x0000003C; // type:object size:0x7 scope:local data:string +__vt__11dAcOpaint_c = .data:0x00000048; // type:object size:0x80 +__vt__50sFStateMgr_c<11dAcOpaint_c,20sStateMethodUsr_FI_c> = .data:0x000000C8; // type:object size:0x30 +__vt__80sStateMgr_c<11dAcOpaint_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x000000F8; // type:object size:0x30 +lbl_613_data_128 = .data:0x00000128; // type:object size:0x18 scope:local +lbl_613_data_140 = .data:0x00000140; // type:object size:0x18 scope:local +lbl_613_data_158 = .data:0x00000158; // type:object size:0x4C scope:local +__vt__26sFStateID_c<11dAcOpaint_c> = .data:0x000001A4; // type:object size:0x34 __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global -lbl_613_bss_8 = .bss:0x00000008; // type:object size:0x10 data:2byte -AcOpaint__StateID_Wait = .bss:0x00000018; // type:object size:0x30 data:4byte -lbl_613_bss_48 = .bss:0x00000048; // type:object size:0x2 data:2byte -lbl_613_bss_4C = .bss:0x0000004C; // type:object size:0x2 data:2byte -lbl_613_bss_4E = .bss:0x0000004E; // type:object size:0x1 data:byte -lbl_613_bss_50 = .bss:0x00000050; // type:object size:0x10 align:4 data:float +lbl_613_bss_8 = .bss:0x00000008; // type:object size:0x10 scope:local data:2byte +AcOpaint__StateID_Wait = .bss:0x00000018; // type:object size:0x30 scope:local data:4byte +lbl_613_bss_48 = .bss:0x00000048; // type:object size:0x2 scope:local data:2byte +lbl_613_bss_4C = .bss:0x0000004C; // type:object size:0x2 scope:local data:2byte +lbl_613_bss_4E = .bss:0x0000004E; // type:object size:0x1 scope:local data:byte +lbl_613_bss_50 = .bss:0x00000050; // type:object size:0x10 scope:local align:4 data:float diff --git a/configure.py b/configure.py index b26fcbfa..77d24674 100644 --- a/configure.py +++ b/configure.py @@ -2592,7 +2592,7 @@ config.libs = [ Rel( NonMatching, "d_a_obj_oct_grass_leaf", "REL/d/a/obj/d_a_obj_oct_grass_leaf.cpp" ), - Rel(NonMatching, "d_a_obj_paint", "REL/d/a/obj/d_a_obj_paint.cpp"), + Rel(Matching, "d_a_obj_paint", "REL/d/a/obj/d_a_obj_paint.cpp"), Rel(Matching, "d_a_obj_pinwheel", "REL/d/a/obj/d_a_obj_pinwheel.cpp"), Rel(NonMatching, "d_a_obj_pipe", "REL/d/a/obj/d_a_obj_pipe.cpp"), Rel(NonMatching, "d_a_obj_piston", "REL/d/a/obj/d_a_obj_piston.cpp"), diff --git a/include/d/a/obj/d_a_obj_paint.h b/include/d/a/obj/d_a_obj_paint.h index 8041faf2..e614f139 100644 --- a/include/d/a/obj/d_a_obj_paint.h +++ b/include/d/a/obj/d_a_obj_paint.h @@ -2,18 +2,51 @@ #define D_A_OBJ_PAINT_H #include "d/a/obj/d_a_obj_base.h" +#include "d/col/bg/d_bg_w.h" +#include "d/d_shadow.h" +#include "m/m3d/m_smdl.h" +#include "m/m_angle.h" +#include "nw4r/g3d/res/g3d_resfile.h" #include "s/s_State.hpp" #include "s/s_StateMgr.hpp" class dAcOpaint_c : public dAcObjBase_c { public: + enum Subtype { + Batreaux = 0, + Groose = 1, + }; + dAcOpaint_c() : mStateMgr(*this, sStateID::null) {} virtual ~dAcOpaint_c() {} + virtual bool createHeap() override; + virtual int create() override; + virtual int doDelete() override; + virtual int actorExecute() override; + virtual int draw() override; + STATE_FUNC_DECLARE(dAcOpaint_c, Wait); private: - /* 0x??? */ STATE_MGR_DECLARE(dAcOpaint_c); + void updateMatrix(); + const char *getOarcName(); + const char *getModelName(); + + /* 0x330 */ nw4r::g3d::ResFile mResFile; + /* 0x334 */ m3d::smdl_c mMdl; + /* 0x350 */ dShadowCircle_c mShadow; + /* 0x358 */ dBgW mBgW; + /* 0x568 */ STATE_MGR_DECLARE(dAcOpaint_c); + /* 0x5A4 */ mAng mPaintingTilt; + /* 0x5A6 */ mAng mTilt; + /* 0x5A8 */ s8 mPaintingOffsetTimer; + /* 0x5A9 */ u8 mSubtype; + /* 0x5AA */ bool mPaintingSwayed; + + static mAng paintingTiltBatreaux; + static mAng paintingTiltGroose; + static const f32 lbl_613_rodata_2C; }; #endif diff --git a/src/REL/d/a/obj/d_a_obj_paint.cpp b/src/REL/d/a/obj/d_a_obj_paint.cpp index 9b74a0db..883bfdf8 100644 --- a/src/REL/d/a/obj/d_a_obj_paint.cpp +++ b/src/REL/d/a/obj/d_a_obj_paint.cpp @@ -1,9 +1,140 @@ #include "d/a/obj/d_a_obj_paint.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/snd/d_snd_wzsound.h" +#include "f/f_base.h" +#include "m/m_mtx.h" +#include "m/m_quat.h" +#include "m/m_vec.h" +#include "nw4r/g3d/res/g3d_resfile.h" +#include "nw4r/g3d/res/g3d_resmdl.h" +#include "toBeSorted/arc_managers/oarc_manager.h" + SPECIAL_ACTOR_PROFILE(OBJ_PAINT, dAcOpaint_c, fProfile::OBJ_PAINT, 0x163, 0, 0); STATE_DEFINE(dAcOpaint_c, Wait); +mAng dAcOpaint_c::paintingTiltBatreaux = mAng::d2s(35.0025f); +mAng dAcOpaint_c::paintingTiltGroose = mAng::d2s(40.0015f); + +bool dAcOpaint_c::createHeap() { + const char *oarcName = getOarcName(); + const char *modelName = getModelName(); + void *data = getOarcResFile(oarcName); + mResFile = nw4r::g3d::ResFile(data); + nw4r::g3d::ResMdl mdl = mResFile.GetResMdl(modelName); + TRY_CREATE(mMdl.create(mdl, &mAllocator, 0x120, 1, nullptr)); + + void *dzb = OarcManager::GetInstance()->getDzbFromArc(oarcName, modelName); + void *plc = OarcManager::GetInstance()->getPlcFromArc(oarcName, modelName); + TRY_CREATE(!mBgW.Set((cBgD_t *)dzb, (PLC *)plc, 1, &mWorldMtx, &mScale)); + return SUCCEEDED; +} + +int dAcOpaint_c::create() { + if (getFromParams(0, 3) == 0) { + mSubtype = Batreaux; + } else { + mSubtype = Groose; + } + dAcObjBase_c::updateMatrix(); + CREATE_ALLOCATOR(dAcOpaint_c); + mMdl.setLocalMtx(mWorldMtx); + dBgS::GetInstance()->Regist(&mBgW, this); + mPaintingSwayed = false; + mStateMgr.changeState(StateID_Wait); + return SUCCEEDED; +} + +int dAcOpaint_c::doDelete() { + return SUCCEEDED; +} + +int dAcOpaint_c::actorExecute() { + mStateMgr.executeState(); + updateMatrix(); + mBgW.Move(); + return SUCCEEDED; +} + +int dAcOpaint_c::draw() { + drawModelType1(&mMdl); + static mQuat_c rot(0.0f, 0.0f, 0.0f, 100.0f); + fn_8002edb0(mShadow, mMdl, &rot, -1, -1, 0.0f); + return SUCCEEDED; +} + void dAcOpaint_c::initializeState_Wait() {} -void dAcOpaint_c::executeState_Wait() {} + +void dAcOpaint_c::executeState_Wait() { + s32 _a = 0; + if (dAcPy_c::GetLink() != nullptr && dAcPy_c::GetLink()->checkFlags0x350(0x2000)) { + mVec3_c deltaPosition = dAcPy_c::GetLink()->mPosition - mPosition; + f32 distance = deltaPosition.absXZ(); + if (1000.f - distance > 0.f) { + if (distance < _a + 700.f && !mPaintingSwayed) { + if (mSubtype == Batreaux) { + mPaintingTilt = paintingTiltBatreaux; + } else { + mPaintingTilt = paintingTiltGroose; + } + mPaintingSwayed = true; + startSound(SE_Paint_LOOSE); + } + mPaintingOffsetTimer = 3; + mPosition.y += 10.f; + + if (mPaintingSwayed) { + mTilt = mAng(0x100); + } + } + } + + mTilt -= mAng((mRotation.z - mPaintingTilt) * (0.03f + (0.01f * _a))); + mTilt *= 0.89f + (0.01f * _a); + + mRotation.z = mRotation.z + mTilt; + + if (mPaintingOffsetTimer > 0) { + mPaintingOffsetTimer--; + } else if (mPaintingOffsetTimer != -1) { + mPaintingOffsetTimer = -1; + mPosition.y -= 10.f; + } +} + void dAcOpaint_c::finalizeState_Wait() {} + +void dAcOpaint_c::updateMatrix() { + mWorldMtx.transS(mPosition); + mWorldMtx.XrotM(mRotation.x); + mWorldMtx.YrotM(mRotation.y); + + mMtx_c mtx; + mtx.transS(100.0f, 100.0f, 0.0f); + + mWorldMtx += mtx; + mWorldMtx.ZrotM(mRotation.z); + + mMtx_c mtx2; + mtx2.transS(-100.0f, -100.0f, 0.0f); + mWorldMtx += mtx2; + + mMdl.setLocalMtx(mWorldMtx); +} + +const float dAcOpaint_c::lbl_613_rodata_2C = 1000.f; + +const char *dAcOpaint_c::getOarcName() { + return "Paint"; +} + +const char *dAcOpaint_c::getModelName() { + switch (mSubtype) { + case Batreaux: return "PaintA"; + case Groose: return "PaintB"; + default: return nullptr; + } +}