mirror of
https://github.com/zeldaret/ss
synced 2026-07-29 07:32:47 -04:00
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user