Skip to content

Commit e4640bd

Browse files
Merge pull request #282 from swekka/d_a_obj_paint
d_a_obj_paint OK
2 parents b31386a + 25ae370 commit e4640bd

File tree

4 files changed

+195
-31
lines changed

4 files changed

+195
-31
lines changed

config/SOUE01/rels/d_a_obj_paintNP/symbols.txt

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,24 @@ _unresolved = .text:0x00000060; // type:function size:0x4 scope:global
44
__register_global_object = .text:0x00000070; // type:function size:0x1C scope:global
55
__destroy_global_chain = .text:0x00000090; // type:function size:0x54 scope:global
66
dAcOpaint_c_classInit__Fv = .text:0x000000F0; // type:function size:0xD8
7-
fn_613_1D0 = .text:0x000001D0; // type:function size:0x58
7+
__dt__15dShadowCircle_cFv = .text:0x000001D0; // type:function size:0x58
88
__dt__24sFState_c<11dAcOpaint_c>Fv = .text:0x00000230; // type:function size:0x58
99
__dt__27sFStateFct_c<11dAcOpaint_c>Fv = .text:0x00000290; // type:function size:0x6C
1010
__dt__80sStateMgr_c<11dAcOpaint_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000300; // type:function size:0xA0
1111
__dt__50sFStateMgr_c<11dAcOpaint_c,20sStateMethodUsr_FI_c>Fv = .text:0x000003A0; // type:function size:0xA4
12-
AcOpaint__initModels = .text:0x00000450; // type:function size:0xE0
13-
AcOpaint__init = .text:0x00000530; // type:function size:0xBC
12+
createHeap__11dAcOpaint_cFv = .text:0x00000450; // type:function size:0xE0
13+
create__11dAcOpaint_cFv = .text:0x00000530; // type:function size:0xBC
1414
changeState__80sStateMgr_c<11dAcOpaint_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x000005F0; // type:function size:0x10
15-
fn_613_600 = .text:0x00000600; // type:function size:0x8
16-
AcOpaint__update = .text:0x00000610; // type:function size:0x50
15+
doDelete__11dAcOpaint_cFv = .text:0x00000600; // type:function size:0x8
16+
actorExecute__11dAcOpaint_cFv = .text:0x00000610; // type:function size:0x50
1717
executeState__80sStateMgr_c<11dAcOpaint_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000660; // type:function size:0x10
18-
AcOpaint__draw = .text:0x00000670; // type:function size:0xB0
18+
draw__11dAcOpaint_cFv = .text:0x00000670; // type:function size:0xB0
1919
initializeState_Wait__11dAcOpaint_cFv = .text:0x00000720; // type:function size:0x4
2020
executeState_Wait__11dAcOpaint_cFv = .text:0x00000730; // type:function size:0x234
2121
finalizeState_Wait__11dAcOpaint_cFv = .text:0x00000970; // type:function size:0x4
22-
AcOpaint__updateMatrix = .text:0x00000980; // type:function size:0xC4
23-
AcOpaint__getOarcName = .text:0x00000A50; // type:function size:0xC
24-
AcOpaint__getModelName = .text:0x00000A60; // type:function size:0x38
22+
updateMatrix__11dAcOpaint_cFv = .text:0x00000980; // type:function size:0xC4
23+
getOarcName__11dAcOpaint_cFv = .text:0x00000A50; // type:function size:0xC
24+
getModelName__11dAcOpaint_cFv = .text:0x00000A60; // type:function size:0x38
2525
__dt__11dAcOpaint_cFv = .text:0x00000AA0; // type:function size:0xE8
2626
getStateID__80sStateMgr_c<11dAcOpaint_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x00000B90; // type:function size:0x10
2727
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
4444
_ctors = .ctors:0x00000000; // type:label scope:global
4545
_dtors = .dtors:0x00000000; // type:label scope:global
4646
__destroy_global_chain_reference = .dtors:0x00000000; // type:object size:0x4 scope:global
47-
lbl_613_rodata_0 = .rodata:0x00000000; // type:object size:0x4 data:float
48-
lbl_613_rodata_4 = .rodata:0x00000004; // type:object size:0x2C align:4 data:float
47+
lbl_613_rodata_0 = .rodata:0x00000000; // type:object size:0x4 scope:local data:float
48+
lbl_613_rodata_4 = .rodata:0x00000004; // type:object size:0x2C scope:local align:4 data:float
4949
g_profile_OBJ_PAINT = .data:0x00000000; // type:object size:0x10 data:4byte
50-
lbl_613_data_10 = .data:0x00000010; // type:object size:0x19 data:string
51-
lbl_613_data_2C = .data:0x0000002C; // type:object size:0x6 data:string
52-
lbl_613_data_34 = .data:0x00000034; // type:object size:0x7 data:string
53-
lbl_613_data_3C = .data:0x0000003C; // type:object size:0x7 data:string
54-
AcOpaint__vtable = .data:0x00000048; // type:object size:0x80
55-
lbl_613_data_C8 = .data:0x000000C8; // type:object size:0x30
56-
lbl_613_data_F8 = .data:0x000000F8; // type:object size:0x30
57-
lbl_613_data_128 = .data:0x00000128; // type:object size:0x18
58-
lbl_613_data_140 = .data:0x00000140; // type:object size:0x18
59-
lbl_613_data_158 = .data:0x00000158; // type:object size:0x4C
60-
lbl_613_data_1A4 = .data:0x000001A4; // type:object size:0x34
50+
lbl_613_data_10 = .data:0x00000010; // type:object size:0x19 scope:local data:string
51+
lbl_613_data_2C = .data:0x0000002C; // type:object size:0x6 scope:local data:string
52+
lbl_613_data_34 = .data:0x00000034; // type:object size:0x7 scope:local data:string
53+
lbl_613_data_3C = .data:0x0000003C; // type:object size:0x7 scope:local data:string
54+
__vt__11dAcOpaint_c = .data:0x00000048; // type:object size:0x80
55+
__vt__50sFStateMgr_c<11dAcOpaint_c,20sStateMethodUsr_FI_c> = .data:0x000000C8; // type:object size:0x30
56+
__vt__80sStateMgr_c<11dAcOpaint_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x000000F8; // type:object size:0x30
57+
lbl_613_data_128 = .data:0x00000128; // type:object size:0x18 scope:local
58+
lbl_613_data_140 = .data:0x00000140; // type:object size:0x18 scope:local
59+
lbl_613_data_158 = .data:0x00000158; // type:object size:0x4C scope:local
60+
__vt__26sFStateID_c<11dAcOpaint_c> = .data:0x000001A4; // type:object size:0x34
6161
__global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global
62-
lbl_613_bss_8 = .bss:0x00000008; // type:object size:0x10 data:2byte
63-
AcOpaint__StateID_Wait = .bss:0x00000018; // type:object size:0x30 data:4byte
64-
lbl_613_bss_48 = .bss:0x00000048; // type:object size:0x2 data:2byte
65-
lbl_613_bss_4C = .bss:0x0000004C; // type:object size:0x2 data:2byte
66-
lbl_613_bss_4E = .bss:0x0000004E; // type:object size:0x1 data:byte
67-
lbl_613_bss_50 = .bss:0x00000050; // type:object size:0x10 align:4 data:float
62+
lbl_613_bss_8 = .bss:0x00000008; // type:object size:0x10 scope:local data:2byte
63+
AcOpaint__StateID_Wait = .bss:0x00000018; // type:object size:0x30 scope:local data:4byte
64+
lbl_613_bss_48 = .bss:0x00000048; // type:object size:0x2 scope:local data:2byte
65+
lbl_613_bss_4C = .bss:0x0000004C; // type:object size:0x2 scope:local data:2byte
66+
lbl_613_bss_4E = .bss:0x0000004E; // type:object size:0x1 scope:local data:byte
67+
lbl_613_bss_50 = .bss:0x00000050; // type:object size:0x10 scope:local align:4 data:float

configure.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2592,7 +2592,7 @@ def MatchingFor(*versions):
25922592
Rel(
25932593
NonMatching, "d_a_obj_oct_grass_leaf", "REL/d/a/obj/d_a_obj_oct_grass_leaf.cpp"
25942594
),
2595-
Rel(NonMatching, "d_a_obj_paint", "REL/d/a/obj/d_a_obj_paint.cpp"),
2595+
Rel(Matching, "d_a_obj_paint", "REL/d/a/obj/d_a_obj_paint.cpp"),
25962596
Rel(Matching, "d_a_obj_pinwheel", "REL/d/a/obj/d_a_obj_pinwheel.cpp"),
25972597
Rel(NonMatching, "d_a_obj_pipe", "REL/d/a/obj/d_a_obj_pipe.cpp"),
25982598
Rel(NonMatching, "d_a_obj_piston", "REL/d/a/obj/d_a_obj_piston.cpp"),

include/d/a/obj/d_a_obj_paint.h

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,51 @@
22
#define D_A_OBJ_PAINT_H
33

44
#include "d/a/obj/d_a_obj_base.h"
5+
#include "d/col/bg/d_bg_w.h"
6+
#include "d/d_shadow.h"
7+
#include "m/m3d/m_smdl.h"
8+
#include "m/m_angle.h"
9+
#include "nw4r/g3d/res/g3d_resfile.h"
510
#include "s/s_State.hpp"
611
#include "s/s_StateMgr.hpp"
712

813
class dAcOpaint_c : public dAcObjBase_c {
914
public:
15+
enum Subtype {
16+
Batreaux = 0,
17+
Groose = 1,
18+
};
19+
1020
dAcOpaint_c() : mStateMgr(*this, sStateID::null) {}
1121
virtual ~dAcOpaint_c() {}
1222

23+
virtual bool createHeap() override;
24+
virtual int create() override;
25+
virtual int doDelete() override;
26+
virtual int actorExecute() override;
27+
virtual int draw() override;
28+
1329
STATE_FUNC_DECLARE(dAcOpaint_c, Wait);
1430

1531
private:
16-
/* 0x??? */ STATE_MGR_DECLARE(dAcOpaint_c);
32+
void updateMatrix();
33+
const char *getOarcName();
34+
const char *getModelName();
35+
36+
/* 0x330 */ nw4r::g3d::ResFile mResFile;
37+
/* 0x334 */ m3d::smdl_c mMdl;
38+
/* 0x350 */ dShadowCircle_c mShadow;
39+
/* 0x358 */ dBgW mBgW;
40+
/* 0x568 */ STATE_MGR_DECLARE(dAcOpaint_c);
41+
/* 0x5A4 */ mAng mPaintingTilt;
42+
/* 0x5A6 */ mAng mTilt;
43+
/* 0x5A8 */ s8 mPaintingOffsetTimer;
44+
/* 0x5A9 */ u8 mSubtype;
45+
/* 0x5AA */ bool mPaintingSwayed;
46+
47+
static mAng paintingTiltBatreaux;
48+
static mAng paintingTiltGroose;
49+
static const f32 lbl_613_rodata_2C;
1750
};
1851

1952
#endif

src/REL/d/a/obj/d_a_obj_paint.cpp

Lines changed: 132 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,140 @@
11
#include "d/a/obj/d_a_obj_paint.h"
22

3+
#include "d/a/d_a_player.h"
4+
#include "d/a/obj/d_a_obj_base.h"
5+
#include "d/col/bg/d_bg_s.h"
6+
#include "d/snd/d_snd_wzsound.h"
7+
#include "f/f_base.h"
8+
#include "m/m_mtx.h"
9+
#include "m/m_quat.h"
10+
#include "m/m_vec.h"
11+
#include "nw4r/g3d/res/g3d_resfile.h"
12+
#include "nw4r/g3d/res/g3d_resmdl.h"
13+
#include "toBeSorted/arc_managers/oarc_manager.h"
14+
315
SPECIAL_ACTOR_PROFILE(OBJ_PAINT, dAcOpaint_c, fProfile::OBJ_PAINT, 0x163, 0, 0);
416

517
STATE_DEFINE(dAcOpaint_c, Wait);
618

19+
mAng dAcOpaint_c::paintingTiltBatreaux = mAng::d2s(35.0025f);
20+
mAng dAcOpaint_c::paintingTiltGroose = mAng::d2s(40.0015f);
21+
22+
bool dAcOpaint_c::createHeap() {
23+
const char *oarcName = getOarcName();
24+
const char *modelName = getModelName();
25+
void *data = getOarcResFile(oarcName);
26+
mResFile = nw4r::g3d::ResFile(data);
27+
nw4r::g3d::ResMdl mdl = mResFile.GetResMdl(modelName);
28+
TRY_CREATE(mMdl.create(mdl, &mAllocator, 0x120, 1, nullptr));
29+
30+
void *dzb = OarcManager::GetInstance()->getDzbFromArc(oarcName, modelName);
31+
void *plc = OarcManager::GetInstance()->getPlcFromArc(oarcName, modelName);
32+
TRY_CREATE(!mBgW.Set((cBgD_t *)dzb, (PLC *)plc, 1, &mWorldMtx, &mScale));
33+
return SUCCEEDED;
34+
}
35+
36+
int dAcOpaint_c::create() {
37+
if (getFromParams(0, 3) == 0) {
38+
mSubtype = Batreaux;
39+
} else {
40+
mSubtype = Groose;
41+
}
42+
dAcObjBase_c::updateMatrix();
43+
CREATE_ALLOCATOR(dAcOpaint_c);
44+
mMdl.setLocalMtx(mWorldMtx);
45+
dBgS::GetInstance()->Regist(&mBgW, this);
46+
mPaintingSwayed = false;
47+
mStateMgr.changeState(StateID_Wait);
48+
return SUCCEEDED;
49+
}
50+
51+
int dAcOpaint_c::doDelete() {
52+
return SUCCEEDED;
53+
}
54+
55+
int dAcOpaint_c::actorExecute() {
56+
mStateMgr.executeState();
57+
updateMatrix();
58+
mBgW.Move();
59+
return SUCCEEDED;
60+
}
61+
62+
int dAcOpaint_c::draw() {
63+
drawModelType1(&mMdl);
64+
static mQuat_c rot(0.0f, 0.0f, 0.0f, 100.0f);
65+
fn_8002edb0(mShadow, mMdl, &rot, -1, -1, 0.0f);
66+
return SUCCEEDED;
67+
}
68+
769
void dAcOpaint_c::initializeState_Wait() {}
8-
void dAcOpaint_c::executeState_Wait() {}
70+
71+
void dAcOpaint_c::executeState_Wait() {
72+
s32 _a = 0;
73+
if (dAcPy_c::GetLink() != nullptr && dAcPy_c::GetLink()->checkFlags0x350(0x2000)) {
74+
mVec3_c deltaPosition = dAcPy_c::GetLink()->mPosition - mPosition;
75+
f32 distance = deltaPosition.absXZ();
76+
if (1000.f - distance > 0.f) {
77+
if (distance < _a + 700.f && !mPaintingSwayed) {
78+
if (mSubtype == Batreaux) {
79+
mPaintingTilt = paintingTiltBatreaux;
80+
} else {
81+
mPaintingTilt = paintingTiltGroose;
82+
}
83+
mPaintingSwayed = true;
84+
startSound(SE_Paint_LOOSE);
85+
}
86+
mPaintingOffsetTimer = 3;
87+
mPosition.y += 10.f;
88+
89+
if (mPaintingSwayed) {
90+
mTilt = mAng(0x100);
91+
}
92+
}
93+
}
94+
95+
mTilt -= mAng((mRotation.z - mPaintingTilt) * (0.03f + (0.01f * _a)));
96+
mTilt *= 0.89f + (0.01f * _a);
97+
98+
mRotation.z = mRotation.z + mTilt;
99+
100+
if (mPaintingOffsetTimer > 0) {
101+
mPaintingOffsetTimer--;
102+
} else if (mPaintingOffsetTimer != -1) {
103+
mPaintingOffsetTimer = -1;
104+
mPosition.y -= 10.f;
105+
}
106+
}
107+
9108
void dAcOpaint_c::finalizeState_Wait() {}
109+
110+
void dAcOpaint_c::updateMatrix() {
111+
mWorldMtx.transS(mPosition);
112+
mWorldMtx.XrotM(mRotation.x);
113+
mWorldMtx.YrotM(mRotation.y);
114+
115+
mMtx_c mtx;
116+
mtx.transS(100.0f, 100.0f, 0.0f);
117+
118+
mWorldMtx += mtx;
119+
mWorldMtx.ZrotM(mRotation.z);
120+
121+
mMtx_c mtx2;
122+
mtx2.transS(-100.0f, -100.0f, 0.0f);
123+
mWorldMtx += mtx2;
124+
125+
mMdl.setLocalMtx(mWorldMtx);
126+
}
127+
128+
const float dAcOpaint_c::lbl_613_rodata_2C = 1000.f;
129+
130+
const char *dAcOpaint_c::getOarcName() {
131+
return "Paint";
132+
}
133+
134+
const char *dAcOpaint_c::getModelName() {
135+
switch (mSubtype) {
136+
case Batreaux: return "PaintA";
137+
case Groose: return "PaintB";
138+
default: return nullptr;
139+
}
140+
}

0 commit comments

Comments
 (0)