Merge pull request #282 from swekka/d_a_obj_paint

d_a_obj_paint OK
This commit is contained in:
Elijah Thomas
2025-12-06 17:28:09 -05:00
committed by GitHub
4 changed files with 195 additions and 31 deletions
+28 -28
View File
@@ -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
+1 -1
View File
@@ -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"),
+34 -1
View File
@@ -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
+132 -1
View File
@@ -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;
}
}