This commit is contained in:
swekka
2025-12-06 22:22:44 +01:00
parent c603e323d3
commit 81abbf0bc7
2 changed files with 37 additions and 29 deletions
+9 -4
View File
@@ -12,6 +12,11 @@
class dAcOpaint_c : public dAcObjBase_c {
public:
enum Subtype {
Batreaux = 0,
Groose = 1,
};
dAcOpaint_c() : mStateMgr(*this, sStateID::null) {}
virtual ~dAcOpaint_c() {}
@@ -35,12 +40,12 @@ private:
/* 0x568 */ STATE_MGR_DECLARE(dAcOpaint_c);
/* 0x5A4 */ mAng mRotationZRelated;
/* 0x5A6 */ mAng mRotationZOffset;
/* 0x5A8 */ s8 field_0x5A8;
/* 0x5A8 */ s8 mPaintingOffsetTimer;
/* 0x5A9 */ u8 mSubtype;
/* 0x5AA */ bool field_0x5AA;
/* 0x5AA */ bool mPaintingSwayed;
static mAng rotationZRelated0;
static mAng rotationZRelated1;
static mAng rotationZRelatedBatreaux;
static mAng rotationZRelatedGroose;
static const f32 lbl_613_rodata_2C;
};
+28 -25
View File
@@ -10,15 +10,14 @@
#include "m/m_vec.h"
#include "nw4r/g3d/res/g3d_resfile.h"
#include "nw4r/g3d/res/g3d_resmdl.h"
#include "rvl/MTX/mtx.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::rotationZRelated0 = mAng::d2s(35.0025f);
mAng dAcOpaint_c::rotationZRelated1 = mAng::d2s(40.0015f);
mAng dAcOpaint_c::rotationZRelatedBatreaux = mAng::d2s(35.0025f);
mAng dAcOpaint_c::rotationZRelatedGroose = mAng::d2s(40.0015f);
bool dAcOpaint_c::createHeap() {
const char *oarcName = getOarcName();
@@ -36,15 +35,15 @@ bool dAcOpaint_c::createHeap() {
int dAcOpaint_c::create() {
if (getFromParams(0, 3) == 0) {
mSubtype = 0;
mSubtype = Batreaux;
} else {
mSubtype = 1;
mSubtype = Groose;
}
dAcObjBase_c::updateMatrix();
CREATE_ALLOCATOR(dAcOpaint_c);
mMdl.setLocalMtx(mWorldMtx);
dBgS::GetInstance()->Regist(&mBgW, this);
field_0x5AA = false;
mPaintingSwayed = false;
mStateMgr.changeState(StateID_Wait);
return SUCCEEDED;
}
@@ -75,19 +74,19 @@ void dAcOpaint_c::executeState_Wait() {
mVec3_c deltaPosition = dAcPy_c::GetLink()->mPosition - mPosition;
f32 distance = deltaPosition.absXZ();
if (1000.f - distance > 0.f) {
if (distance < _a + 700.f && !field_0x5AA) {
if (mSubtype == 0) {
mRotationZRelated = rotationZRelated0;
if (distance < _a + 700.f && !mPaintingSwayed) {
if (mSubtype == Batreaux) {
mRotationZRelated = rotationZRelatedBatreaux;
} else {
mRotationZRelated = rotationZRelated1;
mRotationZRelated = rotationZRelatedGroose;
}
field_0x5AA = true;
mPaintingSwayed = true;
startSound(SE_Paint_LOOSE);
}
field_0x5A8 = 3;
mPaintingOffsetTimer = 3;
mPosition.y += 10.f;
if (field_0x5AA) {
if (mPaintingSwayed) {
mRotationZOffset = mAng(0x100);
}
}
@@ -98,10 +97,10 @@ void dAcOpaint_c::executeState_Wait() {
mRotation.z = mRotation.z + mRotationZOffset;
if (field_0x5A8 > 0) {
field_0x5A8--;
} else if (field_0x5A8 != -1) {
field_0x5A8 = 0xFF;
if (mPaintingOffsetTimer > 0) {
mPaintingOffsetTimer--;
} else if (mPaintingOffsetTimer != -1) {
mPaintingOffsetTimer = -1;
mPosition.y -= 10.f;
}
}
@@ -109,16 +108,20 @@ void dAcOpaint_c::executeState_Wait() {
void dAcOpaint_c::finalizeState_Wait() {}
void dAcOpaint_c::updateMatrix() {
PSMTXTrans(mWorldMtx, mPosition.x, mPosition.y, mPosition.z);
mWorldMtx.transS(mPosition);
mWorldMtx.XrotM(mRotation.x);
mWorldMtx.YrotM(mRotation.y);
mMtx_c mtx;
PSMTXTrans(mtx, 100.0f, 100.0f, 0.0f);
PSMTXConcat(mWorldMtx, mtx, mWorldMtx);
mtx.transS(100.0f, 100.0f, 0.0f);
mWorldMtx += mtx;
mWorldMtx.ZrotM(mRotation.z);
mMtx_c mtx2;
PSMTXTrans(mtx2, -100.0f, -100.0f, 0.0f);
PSMTXConcat(mWorldMtx, mtx2, mWorldMtx);
mtx2.transS(-100.0f, -100.0f, 0.0f);
mWorldMtx += mtx2;
mMdl.setLocalMtx(mWorldMtx);
}
@@ -130,8 +133,8 @@ const char *dAcOpaint_c::getOarcName() {
const char *dAcOpaint_c::getModelName() {
switch (mSubtype) {
case 0: return "PaintA";
case 1: return "PaintB";
default: return nullptr;
case Batreaux: return "PaintA";
case Groose: return "PaintB";
default: return nullptr;
}
}