mirror of
https://github.com/zeldaret/ss
synced 2026-07-26 22:41:43 -04:00
porgress
This commit is contained in:
@@ -8,10 +8,12 @@
|
||||
#include "d/a/npc/d_a_npc_ce_friend.h"
|
||||
#include "d/a/npc/d_a_npc_ce_lady.h"
|
||||
#include "d/a/obj/d_a_obj_base.h"
|
||||
#include "d/col/bg/d_bg_pc.h"
|
||||
#include "d/col/bg/d_bg_s.h"
|
||||
#include "d/col/bg/d_bg_s_gnd_chk.h"
|
||||
#include "d/col/bg/d_bg_s_lin_chk.h"
|
||||
#include "d/col/c/c_cc_d.h"
|
||||
#include "d/col/c/c_m3d_g_tri.h"
|
||||
#include "d/col/c/c_m3d_g_pla.h"
|
||||
#include "d/col/cc/d_cc_d.h"
|
||||
#include "d/col/cc/d_cc_s.h"
|
||||
#include "d/d_linkage.h"
|
||||
@@ -22,18 +24,45 @@
|
||||
#include "f/f_base.h"
|
||||
#include "f/f_profile_name.h"
|
||||
#include "m/m_angle.h"
|
||||
#include "m/m_mtx.h"
|
||||
#include "m/m_quat.h"
|
||||
#include "m/m_vec.h"
|
||||
#include "math.h"
|
||||
#include "nw4r/g3d/res/g3d_resfile.h"
|
||||
#include "nw4r/math/math_arithmetic.h"
|
||||
#include "rvl/MTX/mtxvec.h"
|
||||
#include "rvl/MTX/vec.h"
|
||||
#include "s/s_Math.h"
|
||||
#include "toBeSorted/attention.h"
|
||||
#include "toBeSorted/d_emitter.h"
|
||||
#include "toBeSorted/event_manager.h"
|
||||
#include "toBeSorted/special_item_drop_mgr.h"
|
||||
|
||||
// Begin HIO
|
||||
// Pattern based on TP naming sceme class_HIOParam/class_Param_c
|
||||
struct dAcOBarrel_c_HIOParam {
|
||||
f32 _0;
|
||||
f32 _1;
|
||||
f32 _2;
|
||||
f32 _3;
|
||||
f32 _4;
|
||||
f32 _5;
|
||||
s16 _6;
|
||||
f32 _7;
|
||||
s16 _8;
|
||||
f32 _9;
|
||||
f32 _10;
|
||||
s16 _12;
|
||||
f32 _11;
|
||||
f32 _13;
|
||||
};
|
||||
struct dAcOBarrel_c_Param_c {
|
||||
static const dAcOBarrel_c_HIOParam m;
|
||||
};
|
||||
const dAcOBarrel_c_HIOParam dAcOBarrel_c_Param_c::m = {2.5f, 10.f, 7.f, 0.125f, 0.2f, 0.2f, 0x5A00,
|
||||
15.f, 0x0500, 0.8f, 10.f, 0x0300, 0.8f, 5.f};
|
||||
// End HIO
|
||||
|
||||
// Data Floats
|
||||
f32 sFloats1(1.f);
|
||||
|
||||
SPECIAL_ACTOR_PROFILE(OBJ_BARREL, dAcOBarrel_c, fProfile::OBJ_BARREL, 0x239, 0, 3);
|
||||
@@ -48,7 +77,7 @@ STATE_DEFINE(dAcOBarrel_c, Water2);
|
||||
STATE_DEFINE(dAcOBarrel_c, Explode);
|
||||
STATE_DEFINE(dAcOBarrel_c, KrakenBorn);
|
||||
STATE_DEFINE(dAcOBarrel_c, Rebirth);
|
||||
|
||||
namespace {
|
||||
static dCcD_SrcCyl sSrcCyl = {
|
||||
{
|
||||
/* mObjAt */ {AT_TYPE_PHYSICS, 0x10013, {0, 0, 0}, 4, 0, 0, 0, 0, 0},
|
||||
@@ -73,6 +102,7 @@ static dCcD_SrcSph sSrcSph = {
|
||||
},
|
||||
{55.f}
|
||||
};
|
||||
} // namespace
|
||||
|
||||
static const char *sBarrelResFile[] = {
|
||||
"Barrel", // Normal
|
||||
@@ -99,6 +129,12 @@ bool dAcOBarrel_c::createHeap() {
|
||||
return true;
|
||||
}
|
||||
|
||||
void dummy_func() {
|
||||
struct f {
|
||||
f32 a;
|
||||
} a = {2.f};
|
||||
}
|
||||
|
||||
int dAcOBarrel_c::actorCreate() {
|
||||
field_0xE18 = getFromParams(12, 0xFF);
|
||||
mBrokenFlag = getFromParams(20, 0xFF);
|
||||
@@ -138,9 +174,9 @@ int dAcOBarrel_c::actorCreate() {
|
||||
field_0xDEC = mAng::Zero();
|
||||
quat_0xD50.set(1.f, 0.f, 0.f, 0.f);
|
||||
mScale.set(1.f, 1.f, 1.f);
|
||||
quat_0xD70.set(1.f, 0.f, 0.f, 0.f);
|
||||
quat_0xD80.set(1.f, 0.f, 0.f, 0.f);
|
||||
quat_0xD90.set(1.f, 0.f, 0.f, 0.f);
|
||||
quat_0xD80.set(1.f, 0.f, 0.f, 0.f);
|
||||
quat_0xD70.set(1.f, 0.f, 0.f, 0.f);
|
||||
quat_0xDA0.set(1.f, 0.f, 0.f, 0.f);
|
||||
|
||||
if (isType_0()) {
|
||||
@@ -156,7 +192,7 @@ int dAcOBarrel_c::actorCreate() {
|
||||
field_0xE02 = true;
|
||||
mQuat_c qz, qx;
|
||||
qx.setAxisRotation(mVec3_c::Ex, mRotation.x.radian());
|
||||
qz.setAxisRotation(mVec3_c::Ez, mRotation.x.radian());
|
||||
qz.setAxisRotation(mVec3_c::Ez, mRotation.z.radian());
|
||||
quat_0xD80 = qx * qz;
|
||||
|
||||
mRotation.x = mAng::Zero();
|
||||
@@ -168,13 +204,13 @@ int dAcOBarrel_c::actorCreate() {
|
||||
return FAILED;
|
||||
}
|
||||
|
||||
if (mType == 3) {
|
||||
if (mType == Kraken) {
|
||||
mStateMgr.changeState(StateID_KrakenBorn);
|
||||
} else {
|
||||
mStateMgr.changeState(StateID_Wait);
|
||||
getLinkage().set(0x24, 51.f, 0.f, 0.f, nullptr);
|
||||
}
|
||||
updateMatrix();
|
||||
updateMtx();
|
||||
getLinkage().bushTpFunc(mObjAcch);
|
||||
|
||||
mBoundingBox.Set(mVec3_c(-55.f, -10.f, -55.f), mVec3_c(55.f, 150.f, 55.f));
|
||||
@@ -353,7 +389,7 @@ void dAcOBarrel_c::executeState_Wait() {
|
||||
if (mObjAcch.ChkGroundLanding() && !field_0xE0E) {
|
||||
fn_293_37B0();
|
||||
if (mVelocity.y > 0.f) {
|
||||
dJEffManager_c::spawnGroundEffect(mPosition, mPolyAttr0, mPolyAttr1, mVelocity, 0, 1.f, field_0x1B0);
|
||||
dJEffManager_c::spawnGroundEffect(mPosition, mPolyAttr0, mPolyAttr1, field_0x1B4, 0, 1.f, field_0x1B0);
|
||||
}
|
||||
|
||||
if (field_0xE0A) {
|
||||
@@ -448,13 +484,16 @@ void dAcOBarrel_c::initializeState_GrabUp() {
|
||||
// This entire function seems goofy
|
||||
mVec3_c v = mVec3_c::Ey;
|
||||
MTXMultVecSR(mWorldMtx, v, v);
|
||||
mAng rotX = mAng::fromRad(v.angle(mVec3_c::Ex));
|
||||
bool z = rotX > 0x4000;
|
||||
|
||||
mAng rotX = mAng::fromRad(v.angle(mVec3_c::Ex));
|
||||
mAng rotY = dAcPy_c::GetLink()->mRotation.y - mRotation.y;
|
||||
|
||||
bool z = rotX > 0x4000;
|
||||
|
||||
mQuat_c qy, qz;
|
||||
qy.setAxisRotation(mVec3_c::Ey, mAng::short2rad(sLib::absDiff(rotY, 0) > 0x4000 ? rotY += 0x8000 : rotY));
|
||||
qy.setAxisRotation(
|
||||
mVec3_c::Ey, mAng::short2rad(rotY.absDiff(0) > mAng::deg2short(90.f) ? rotY += mAng::deg2short(180.f) : rotY)
|
||||
);
|
||||
qz.setAxisRotation(mVec3_c::Ez, mAng::short2rad(z ? 0x4000 : -0x4000));
|
||||
|
||||
quat_0xD60 = qy * qz;
|
||||
@@ -525,6 +564,11 @@ void dAcOBarrel_c::executeState_GrabPut() {
|
||||
mStateMgr.changeState(StateID_Wait);
|
||||
}
|
||||
}
|
||||
void dumb_rodata_ordering() {
|
||||
struct {
|
||||
f32 a;
|
||||
} a = {-0.f};
|
||||
}
|
||||
void dAcOBarrel_c::finalizeState_GrabPut() {
|
||||
field_0xE02 = false;
|
||||
quat_0xD80 = quat_0xD50;
|
||||
@@ -535,13 +579,11 @@ void dAcOBarrel_c::finalizeState_GrabPut() {
|
||||
}
|
||||
mCyl.OnAtSet();
|
||||
}
|
||||
|
||||
void dAcOBarrel_c::initializeState_Slope() {
|
||||
mVec3_c vz_out;
|
||||
cM3dGTri tri;
|
||||
cM3dGPla tri;
|
||||
dBgS::GetInstance()->GetTriPla(mObjAcch.GetGnd(), &tri);
|
||||
|
||||
if (checkSlower(EGG::Math<f32>::epsilon())) {
|
||||
if (isSpeedStopped()) {
|
||||
mAngle.y = tri.GetAngleY();
|
||||
mSpeed = 5.f;
|
||||
}
|
||||
@@ -551,8 +593,8 @@ void dAcOBarrel_c::initializeState_Slope() {
|
||||
mAng ang(mAng::abs(mAngle.y - field_0xDEE));
|
||||
field_0xDF0 = nw4r::math::FSqrt(ang.degree2() / 180.f) * 910.f;
|
||||
|
||||
MTXMultVecSR(mWorldMtx, -mVec3_c::Ez, vz_out);
|
||||
field_0xDEA = vz_out.atan2sX_Z();
|
||||
mVec3_c v = mWorldMtx.multVecSR(-mVec3_c::Ez);
|
||||
field_0xDEA = mAng::fromVec(v);
|
||||
|
||||
field_0xE09 = false;
|
||||
|
||||
@@ -592,7 +634,7 @@ void dAcOBarrel_c::executeState_Slope() {
|
||||
|
||||
fn_293_3560();
|
||||
|
||||
if (checkSlower(EGG::Math<f32>::epsilon())) {
|
||||
if (isSpeedStopped(EGG::Math<f32>::epsilon())) {
|
||||
field_0xE00 = false;
|
||||
} else if (field_0xE02) {
|
||||
field_0xE00 = fn_293_4F80();
|
||||
@@ -809,3 +851,361 @@ void dAcOBarrel_c::finalizeState_Rebirth() {
|
||||
setActorProperty(AC_PROP_0x1);
|
||||
mStts.SetRank(9);
|
||||
}
|
||||
|
||||
void dAcOBarrel_c::fn_293_30D0() {
|
||||
if (isSpeedStopped() && field_0xDFC == 0) {
|
||||
if (field_0xE05 && mCeFriend.isLinked()) {
|
||||
dAcNpcCeFriend_c *pFriend = mCeFriend.get();
|
||||
if (pFriend && pFriend->fn_11_2A40()) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
AttentionManager *pAttnMgr = AttentionManager::GetInstance();
|
||||
if (mYOffset >= 0.f) {
|
||||
pAttnMgr->addPickUpTarget(*this, 120.f);
|
||||
pAttnMgr->addUnk3Target(*this, 1, 500.f, -200.f, 200.f);
|
||||
}
|
||||
}
|
||||
|
||||
void dAcOBarrel_c::fn_293_31B0() {
|
||||
cM3dGPla pla;
|
||||
dBgS::GetInstance()->GetTriPla(mObjAcch.GetGnd(), &pla);
|
||||
|
||||
mAng nrmAngle = mAng::fromRad(field_0xDBC.angle(pla.GetN()));
|
||||
if (nrmAngle > mAng::deg2short(75)) {
|
||||
field_0xE06 = true;
|
||||
}
|
||||
|
||||
field_0xDBC = pla.GetN();
|
||||
|
||||
mVelocity += pla.GetN() * 7.f;
|
||||
mVelocity.y = pla.getCrossY_NonIsZero(&mVelocity);
|
||||
|
||||
mSpeed = nw4r::math::FSqrt(mVelocity.squareMagXZ());
|
||||
mSpeed = cM::minMaxLimit(mSpeed, -20.f, 20.f);
|
||||
|
||||
if (mAng::fromVec(pla.GetN()).absDiff(mAngle.y) < 0x2000) {
|
||||
sLib::addCalcAngle(mAngle.y.ref(), pla.GetAngleY(), 5, 0x71C, 0x100);
|
||||
} else {
|
||||
mAngle.y = mAng::fromVec(mVelocity);
|
||||
}
|
||||
|
||||
if (!isSpeedStopped()) {
|
||||
mAng ang = pla.GetAngleY();
|
||||
mAng target = ang - 0x8000;
|
||||
mVec3_c v = mWorldMtx.multVecSR(-mVec3_c::Ez);
|
||||
|
||||
field_0xDEA = mAng::fromVec(v);
|
||||
if (target.absDiff(field_0xDEA) > 0x4000) {
|
||||
target = ang;
|
||||
} else {
|
||||
target = ang - 0x8000;
|
||||
}
|
||||
if (field_0xE00 && field_0xE02) {
|
||||
field_0xE01 = fn_293_4ED0();
|
||||
target -= field_0xDEA;
|
||||
sLib::addCalcAngle(field_0xDEC.ref(), target, 10, mAng::deg2short(5), 0x100);
|
||||
}
|
||||
|
||||
mQuat_c q;
|
||||
q.setAxisRotation(mVec3_c::Ey, field_0xDEC.radian());
|
||||
quat_0xD70.slerpTo(q, 0.3f, quat_0xD70);
|
||||
}
|
||||
if (field_0xE09) {
|
||||
quat_0xD70.set(1.f, 0.f, 0.f, 0.f);
|
||||
}
|
||||
}
|
||||
|
||||
void dAcOBarrel_c::fn_293_3560() {
|
||||
f32 f = field_0xE11 == 3 ? 0.2f : 0.125f;
|
||||
|
||||
cM3dGPla pla;
|
||||
dBgS::GetInstance()->GetTriPla(mObjAcch.GetGnd(), &pla);
|
||||
|
||||
mAng nrmAngle = mAng::fromRad(mVec3_c::Ey.angle(pla.GetN()));
|
||||
|
||||
f *= nrmAngle.cos();
|
||||
if (nrmAngle < mAng::deg2short(5) || mAng::fromVec(pla.GetN()).absDiff(mAngle.y) > 0x4000) {
|
||||
if (!field_0xE00) {
|
||||
f *= 8.f;
|
||||
}
|
||||
sLib::chase(&mSpeed, 0.f, f + getYOffset() * -0.05f);
|
||||
} else {
|
||||
if (!field_0xE00) {
|
||||
if (mStateMgr.isState(StateID_Slope)) {
|
||||
f = -f * 2.f - 1.5f;
|
||||
} else {
|
||||
f *= -8.f;
|
||||
}
|
||||
}
|
||||
mSpeed = cM::minMaxLimit(mSpeed + f, 0.f, 30.f);
|
||||
}
|
||||
}
|
||||
|
||||
void dAcOBarrel_c::fn_293_37B0() {}
|
||||
|
||||
void dAcOBarrel_c::updateMtx() {}
|
||||
|
||||
void dAcOBarrel_c::fn_293_3DB0() {}
|
||||
|
||||
void dAcOBarrel_c::fn_293_4200() {}
|
||||
|
||||
bool dAcOBarrel_c::fn_293_45A0() {
|
||||
if (field_0xE06) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Amos -> Armos. A Barrel hitting a Armos will break it
|
||||
if (mCyl.ChkAtHit()) {
|
||||
if (mCyl.GetAtFlag0x2() || mCyl.GetAtFlag0x4() || mCyl.GetAtActor()->mProfileName == fProfile::E_AM) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (mObjAcch.ChkWallHit(nullptr)) {
|
||||
if (mAng(mAcchCir.GetWallAngleY()).absDiff(mAngle.y) > mAng::deg2short(70) && mSpeed > 5.f) {
|
||||
return true;
|
||||
}
|
||||
if (mStateMgr.isState(StateID_GrabPut) && dAcPy_c::GetLink()->checkCurrentAction(/* PUT_DOWN_MEDIUM */ 0x42)) {
|
||||
mVec3_c put = mVec3_c::Ez * 50.f;
|
||||
put.rotY(mAcchCir.GetWallAngleY());
|
||||
|
||||
mVec3_c end = mPosition + put;
|
||||
if (dBgS_ObjLinChk::LineCross(&mPosition, &end, this)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (mCyl.ChkTgHit() &&
|
||||
mCyl.ChkTgAtHitType(AT_TYPE_SWORD | AT_TYPE_BOMB | AT_TYPE_DAMAGE | AT_TYPE_BUBBLE | AT_TYPE_0x800000)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (mCyl.ChkTgHit() && mCyl.ChkTgAtHitType(AT_TYPE_PHYSICS)) {
|
||||
if (mCyl.GetTgActor()->mProfileName == fProfile::OBJ_STEP_STATUE ||
|
||||
mCyl.GetTgActor()->mProfileName == fProfile::OBJ_PUSH_BLOCK) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// Unreachable condition due to first check
|
||||
if (mCyl.ChkTgHit() && mCyl.ChkTgAtHitType(AT_TYPE_DAMAGE)) {
|
||||
if (mCyl.GetTgActor()->mProfileName == fProfile::E_BC) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!mObjAcch.ChkGndHit()) {
|
||||
if (mCyl.ChkCoHit() && !getLinkage().checkState(dLinkage_c::STATE_ACTIVE) &&
|
||||
mCyl.GetCoActor()->mTargetFiRelated == 4 && mSpeed > 0.f) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (mType == Explode && (mStateMgr.isState(StateID_Water) || mStateMgr.isState(StateID_Water2))) {
|
||||
if (mCyl.ChkCoHit()) {
|
||||
dAcObjBase_c *pActor = mCyl.GetCoActor();
|
||||
if (pActor->isPlayer() || pActor->mProfileName == fProfile::OBJ_TIME_BOAT) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (mObjAcch.ChkGndHit() && mYOffset >= 0.f) {
|
||||
if ((!isType_0() && field_0xDD8.y < -500.f) || (isType_0() && field_0xDD8.y < -1000.f)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return fn_293_4CE0();
|
||||
}
|
||||
|
||||
bool dAcOBarrel_c::fn_293_4A90(const mAng &ang) {
|
||||
f32 rad;
|
||||
s32 diff;
|
||||
cM3dGPla tri;
|
||||
dBgS::GetInstance()->GetTriPla(mObjAcch.GetGnd(), &tri);
|
||||
|
||||
rad = mVec3_c::Ey.angle(tri.GetN());
|
||||
return ang < mAng::fromRad(rad).absDiff(0);
|
||||
}
|
||||
|
||||
bool dAcOBarrel_c::fn_293_4BC0() {
|
||||
int code = dBgS::GetInstance()->GetSpecialCode(mObjAcch.GetGnd());
|
||||
return code == POLY_ATTR_LAVA || code == POLY_ATTR_SAND_MED || code == POLY_ATTR_SAND_DEEP_INSTANT ||
|
||||
code == POLY_ATTR_SAND_DEEP_SLOW;
|
||||
}
|
||||
|
||||
bool dAcOBarrel_c::fn_293_4C20() const {
|
||||
int code = dBgS::GetInstance()->GetSpecialCode(mObjAcch.GetGnd());
|
||||
return code == POLY_ATTR_LAVA;
|
||||
}
|
||||
|
||||
bool dAcOBarrel_c::fn_293_4C60() {
|
||||
f32 f = mPosition.y - 51.f;
|
||||
if (mType == Type2) {
|
||||
f = mPosition.y + 51.f * mAng(0); // eh this works
|
||||
}
|
||||
|
||||
return mObjAcch.ChkWaterHit() && f < mObjAcch.GetWtrGroundH();
|
||||
}
|
||||
|
||||
bool dAcOBarrel_c::fn_293_4CE0() const {
|
||||
return field_0xDD8.y < -10000.f;
|
||||
}
|
||||
|
||||
bool dAcOBarrel_c::fn_293_4D00() {
|
||||
return (
|
||||
!getLinkage().checkState(dLinkage_c::STATE_ACTIVE) // ensure not Linked
|
||||
&& mStateMgr.isState(StateID_Wait) // Must be on normal ground
|
||||
&& !field_0xE02 && !field_0xE08 //
|
||||
&& mYOffset >= 0.f //
|
||||
&& mObjAcch.ChkGndHit() && dBgS::GetInstance()->ChkMoveBG(mObjAcch.GetGnd(), true) //
|
||||
&& isSpeedStopped() && isVerticalSpeedStopped() // No Movement XZ or Y
|
||||
&& !fn_293_4A90(mAng::deg2short(0.09f)) // Perfectly Flat Ground
|
||||
);
|
||||
}
|
||||
|
||||
bool dAcOBarrel_c::fn_293_4ED0() const {
|
||||
mVec3_c up = mVec3_c::Ey, v;
|
||||
mWorldMtx.multVecSR(up);
|
||||
|
||||
mQuat_c q;
|
||||
q.setAxisRotation(up, DEG_TO_RAD(1));
|
||||
|
||||
mMtx_c m;
|
||||
m.fromQuat(q);
|
||||
|
||||
m.multVecSR(mVelocity, v);
|
||||
return (v.y - mVelocity.y) > 0.f;
|
||||
}
|
||||
|
||||
bool dAcOBarrel_c::fn_293_4F80() {
|
||||
mVec3_c up = mVec3_c::Ey;
|
||||
mWorldMtx.multVecSR(up);
|
||||
|
||||
f32 rad = up.angle(mVelocity);
|
||||
mAng ang = mAng::fromRad(rad);
|
||||
return mAng::deg2short(75.f) < ang && ang < (mAng::deg2short(105.005f));
|
||||
}
|
||||
|
||||
bool dAcOBarrel_c::fn_293_50B0() {
|
||||
return (
|
||||
field_0xE00 && field_0xE02 && mSpeed > 15.f && getXZAngleToPlayer().absDiff(mAngle.y) <= mAng::deg2short(60)
|
||||
);
|
||||
}
|
||||
|
||||
void dAcOBarrel_c::fn_293_5150() {
|
||||
mVec3_c v = mPosition;
|
||||
v.y += field_0xE02 ? 25.f : 50.f;
|
||||
mVec3_c scale(0.75f, 0.75f, 0.75f);
|
||||
|
||||
if (mType == Explode) {
|
||||
mTimeArea.check(mRoomID, mPosition, 0, 0.f, 0.1f);
|
||||
|
||||
f32 scaleTarget = getFromParams(8, 0x3) == 0 ? 2.5f : 1.f;
|
||||
scale *= scaleTarget;
|
||||
|
||||
if (isWithinPlayerRadius(5800.f)) {
|
||||
if (mScale.y == 0.f) {
|
||||
if (!field_0xE0C) {
|
||||
dJEffManager_c::spawnEffect(
|
||||
PARTICLE_RESOURCE_ID_MAPPING_465_, v, nullptr, &scale, nullptr, nullptr, 0, 0
|
||||
);
|
||||
startSound(SE_TIMESLIP_TIMESLIP);
|
||||
field_0xE0C = true;
|
||||
}
|
||||
} else {
|
||||
field_0xE0C = false;
|
||||
}
|
||||
sLib::chase(&mScale.y, scaleTarget, scaleTarget * 0.2f);
|
||||
} else {
|
||||
if (mScale.y == scaleTarget) {
|
||||
if (!field_0xE0D) {
|
||||
dJEffManager_c::spawnEffect(
|
||||
PARTICLE_RESOURCE_ID_MAPPING_465_, v, nullptr, &scale, nullptr, nullptr, 0, 0
|
||||
);
|
||||
startSound(SE_TIMESLIP_TIMESLIP_REV);
|
||||
field_0xE0D = true;
|
||||
}
|
||||
} else {
|
||||
field_0xE0D = false;
|
||||
}
|
||||
sLib::chase(&mScale.y, 0.f, 0.2f);
|
||||
}
|
||||
|
||||
mScale.x = mScale.z = mScale.y;
|
||||
}
|
||||
}
|
||||
void dAcOBarrel_c::fn_293_5360() {
|
||||
if (!field_0xE03) {
|
||||
static const s16 s = 0x2000;
|
||||
field_0xE03 = fn_8002eff0(120.f, s, &mCyl, 10.f, -10.f);
|
||||
}
|
||||
|
||||
if (!field_0xE04 && !field_0xE05) {
|
||||
fn_293_54D0();
|
||||
|
||||
if (field_0xE03 && dAcPy_c::GetLink()->checkFlags0x350(0x2000)) {
|
||||
field_0xE03 = false;
|
||||
|
||||
if (field_0xDFC != 0) {
|
||||
fn_293_4200();
|
||||
} else if (mType == Explode) {
|
||||
fn_293_4200();
|
||||
|
||||
} else {
|
||||
fn_293_5440();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void dAcOBarrel_c::fn_293_5440() {
|
||||
field_0xDB0 = dAcPy_c::GetLink()->mVelocity;
|
||||
field_0xDB0.y = 0.f;
|
||||
field_0xDB0.normalize();
|
||||
field_0xDF8.setF(1820.f);
|
||||
field_0xDFA.setF(2730.f);
|
||||
field_0xDFC = 90;
|
||||
}
|
||||
|
||||
void dAcOBarrel_c::fn_293_54D0() {
|
||||
if (0 != sLib::calcTimer(&field_0xDFC)) {
|
||||
mMtx_c m;
|
||||
|
||||
mVec3_c vy = mVec3_c::Ey, vx = mVec3_c::Ex;
|
||||
mQuat_c qplayer1, qplayer0;
|
||||
|
||||
qplayer0.setAxisRotation(field_0xDB0, mAng(field_0xDF4.sin() * field_0xDF8).radian());
|
||||
field_0xDF4 += mAng::deg2short(12);
|
||||
if (mAng::abs(field_0xDF4) < mAng::deg2short(12)) {
|
||||
field_0xDF8 *= dAcOBarrel_c_Param_c::m._11;
|
||||
}
|
||||
|
||||
m.makeRotationFromVecs(mVec3_c::Ez, field_0xDB0, 1.f);
|
||||
m.multVecSR(vx);
|
||||
|
||||
qplayer1.setAxisRotation(vx, mAng(field_0xDF6.sin() * field_0xDFA).radian());
|
||||
field_0xDF6 += mAng::deg2short(20);
|
||||
if (mAng::abs(field_0xDF6) < mAng::deg2short(20)) {
|
||||
field_0xDFA *= dAcOBarrel_c_Param_c::m._9;
|
||||
}
|
||||
|
||||
quat_0xDA0 = qplayer0 * qplayer1;
|
||||
|
||||
} else {
|
||||
mQuat_c q;
|
||||
q.set(1.f, 0.f, 0.f, 0.f);
|
||||
quat_0xDA0.slerpTo(q, 0.2f, quat_0xDA0);
|
||||
}
|
||||
}
|
||||
|
||||
void dAcOBarrel_c::fn_293_5850(f32 *, bool) {}
|
||||
|
||||
void dAcOBarrel_c::fn_293_58C0() {}
|
||||
|
||||
void dAcOBarrel_c::fn_293_5910() {}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#include "d/a/obj/d_a_obj_chair.h"
|
||||
|
||||
#include "common.h"
|
||||
#include "d/a/d_a_base.h"
|
||||
#include "d/a/d_a_item.h"
|
||||
#include "d/a/d_a_player.h"
|
||||
#include "d/a/obj/d_a_obj_base.h"
|
||||
@@ -160,7 +161,7 @@ int dAcOChair_c::actorExecute() {
|
||||
|
||||
if (!isBench()) {
|
||||
if (isChairTypeIdk0() && !checkObjectProperty(OBJ_PROP_0x8000)) {
|
||||
if (sLib::absDiff(getRotation().y, getXZAngleToPlayer()) > 910) {
|
||||
if (mRotation.y.absDiff(getXZAngleToPlayer()) > mAng::deg2short(5)) {
|
||||
getRotation().y = getXZAngleToPlayer();
|
||||
}
|
||||
}
|
||||
@@ -174,7 +175,7 @@ int dAcOChair_c::actorExecute() {
|
||||
mMdl.calc(false);
|
||||
} else {
|
||||
if (isChairTypeIdk0() && !checkObjectProperty(OBJ_PROP_0x8000)) {
|
||||
if (sLib::absDiff(getRotation().y, getXZAngleToPlayer()) > 910) {
|
||||
if (mRotation.y.absDiff(getXZAngleToPlayer()) > mAng::deg2short(5)) {
|
||||
getRotation().y = getXZAngleToPlayer();
|
||||
}
|
||||
}
|
||||
@@ -197,7 +198,7 @@ int dAcOChair_c::draw() {
|
||||
void dAcOChair_c::initializeState_Wait() {}
|
||||
|
||||
void dAcOChair_c::executeState_Wait() {
|
||||
const f32 height_diff = mPosition.y - dAcPy_c::GetLink()->mPosition.y;
|
||||
const f32 height_diff = getHeightDifference(dAcPy_c::GetLinkR());
|
||||
if (!isBench() || (50.f < height_diff && height_diff < 60.f)) {
|
||||
if (field_0xB1A && field_0xB1B) {
|
||||
if (dAcPy_c::GetLink()->checkActionFlagsCont(0x1000)) {
|
||||
@@ -207,12 +208,13 @@ void dAcOChair_c::executeState_Wait() {
|
||||
return;
|
||||
}
|
||||
if (field_0xB1C && mChairType == CHAIR_E) {
|
||||
const f32 mag = (mChairPos - mPositionCopy2).squareMagXZ();
|
||||
if (mag < 10000.f) {
|
||||
if (mChairPos.squareDistanceToXZ(mPositionCopy2) < 10000.f) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
AttentionManager::GetInstance()->addSitTarget(*this, isBench() ? 0 : 3, 120.f);
|
||||
AttentionManager::GetInstance()->addSitTarget(
|
||||
*this, 120.f, isBench() ? AttentionManager::FLAGS_0 : AttentionManager::FLAGS_3
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -164,8 +164,7 @@ void dAcOGrave_c::executeState_Wait() {
|
||||
mAnmMatClr.setRate(1.f, 0);
|
||||
}
|
||||
}
|
||||
mAng ang = getXZAngleToPlayer();
|
||||
s32 diff = sLib::absDiff(ang, mRotation.y);
|
||||
s32 diff = getXZAngleToPlayer().absDiff(mRotation.y);
|
||||
if (field_0x7F6) {
|
||||
mOrigPos2 = mPosition;
|
||||
vecCylCalc(mOrigPos2, mAngle.y, dAcPy_c::sPushRelatedConstant);
|
||||
|
||||
@@ -626,7 +626,7 @@ void dAcOtubo_c::attemptDestroy() {
|
||||
return;
|
||||
}
|
||||
|
||||
if (mObjAcch.ChkWallHit(nullptr) && sLib::absDiff(mAcchCir.GetWallAngleY(), mAngle.y) > mAng::deg2short(70.f)) {
|
||||
if (mObjAcch.ChkWallHit(nullptr) && mAng(mAcchCir.GetWallAngleY()).absDiff(mAngle.y) > mAng::deg2short(70.f)) {
|
||||
attemptDestroyOnWall();
|
||||
mAngle.y = mAcchCir.GetWallAngleY();
|
||||
mSpeed *= 0.5f;
|
||||
@@ -672,7 +672,7 @@ void dAcOtubo_c::attemptDestroy() {
|
||||
}
|
||||
|
||||
void dAcOtubo_c::attemptDestroyOnWall(const u32 ¶m0, const bool ¶m1) {
|
||||
if (param1 && sLib::absDiff(mAcchCir.GetWallAngleY(), mAngle.y) > mAng::deg2short(70.f) && 15.f < mSpeed) {
|
||||
if (param1 && mAng(mAcchCir.GetWallAngleY()).absDiff(mAngle.y) > mAng::deg2short(70.f) && 15.f < mSpeed) {
|
||||
destroy();
|
||||
}
|
||||
}
|
||||
@@ -746,8 +746,7 @@ void dAcOtubo_c::adjustAngle() {
|
||||
mSpeed = nw4r::math::FSqrt(mVelocity.x * mVelocity.x + mVelocity.z * mVelocity.z);
|
||||
mSpeed = cM::minMaxLimit(mSpeed, -30.f, 30.f);
|
||||
|
||||
mAng a = mAng::fromVec(pla.GetN()); // Probably mean to be angle from Ey
|
||||
if (sLib::absDiff(a, mAngle.y) < mAng::deg2short(90.f)) {
|
||||
if (mAng::fromVec(pla.GetN()).absDiff(mAngle.y) < mAng::deg2short(90.f)) {
|
||||
sLib::addCalcAngle(mAngle.y.ref(), pla.GetAngleY(), 5, 0x71C, 0x100);
|
||||
} else {
|
||||
mAngle.y = mAng::fromVec(mVelocity);
|
||||
@@ -761,8 +760,7 @@ void dAcOtubo_c::adjustSpeed() {
|
||||
mAng gndAngle = mAng::fromRad(mVec3_c::Ey.angle(pla.GetN()));
|
||||
step *= gndAngle.cos();
|
||||
|
||||
if (gndAngle < mAng::deg2short(5) ||
|
||||
sLib::absDiff(cM::atan2s(pla.mNormal.x, pla.mNormal.z), mAngle.y) > mAng::deg2short(90)) {
|
||||
if (gndAngle < mAng::deg2short(5) || mAng::fromVec(pla.GetN()).absDiff(mAngle.y) > mAng::deg2short(90)) {
|
||||
f32 stepSize = mYOffset;
|
||||
sLib::chase(&mSpeed, 0.f, step + stepSize * -0.05f);
|
||||
} else {
|
||||
@@ -777,10 +775,10 @@ void dAcOtubo_c::adjustSpeed() {
|
||||
|
||||
bool dAcOtubo_c::checkSlope() {
|
||||
cM3dGPla pla;
|
||||
dBgS::GetInstance()->GetTriPla(mObjAcch.mGnd, &pla);
|
||||
dBgS::GetInstance()->GetTriPla(mObjAcch.GetGnd(), &pla);
|
||||
mAng gndAngle = mAng::fromRad(mVec3_c::Ey.angle(pla.GetN()));
|
||||
|
||||
return sLib::absDiff(gndAngle, 0) > mAng::deg2short(5);
|
||||
return gndAngle.absDiff(0) > mAng::deg2short(5);
|
||||
}
|
||||
|
||||
bool dAcOtubo_c::fn_272_3660() {
|
||||
|
||||
@@ -94,7 +94,7 @@ int dAcOTumbleWeed_c::doDelete() {
|
||||
}
|
||||
|
||||
int dAcOTumbleWeed_c::actorExecute() {
|
||||
if (!field_0x98C && !checkStopped()) {
|
||||
if (!field_0x98C && !isFullyStopped()) {
|
||||
field_0x968 = mVelocity;
|
||||
field_0x968.y = 0.0f;
|
||||
field_0x968.normalize();
|
||||
@@ -246,7 +246,7 @@ bool dAcOTumbleWeed_c::checkSlope() {
|
||||
dBgS::GetInstance()->GetTriPla(mObjAcch.mGnd, &pla);
|
||||
|
||||
mAng ang = mAng::fromRad(mVec3_c::Ey.angle(pla.GetN()));
|
||||
return sLib::absDiff(ang, 0) > mAng::deg2short(1);
|
||||
return ang.absDiff(0) > mAng::deg2short(1);
|
||||
}
|
||||
|
||||
bool dAcOTumbleWeed_c::checkCollect() {
|
||||
@@ -311,15 +311,14 @@ void dAcOTumbleWeed_c::adjustSpeed() {
|
||||
// Tumbleweed speeds to the target + 5.0f much quicker than intended
|
||||
mAng gndAngle = mAng::fromRad(mVec3_c::Ey.angle(pla.GetN()));
|
||||
|
||||
dBgS::GetInstance()->GetTriPla(mObjAcch.mGnd, &pla);
|
||||
dBgS::GetInstance()->GetTriPla(mObjAcch.GetGnd(), &pla);
|
||||
|
||||
f32 speedStep = 0.5f;
|
||||
f32 step = gndAngle.cos() * speedStep;
|
||||
|
||||
// Flat Ground or not in the direction of the slope
|
||||
// Slows down
|
||||
if (gndAngle < mAng::deg2short(1) ||
|
||||
sLib::absDiff(cM::atan2s(pla.GetN().x, pla.GetN().z), getAngle().y) > mAng::deg2short(90)) {
|
||||
if (gndAngle < mAng::deg2short(1) || mAng::fromVec(pla.GetN()).absDiff(mAngle.y) > mAng::deg2short(90)) {
|
||||
sLib::chase(&mSpeed, mSpeedTarget, step);
|
||||
}
|
||||
// Sloped Ground and in the direction of the slope
|
||||
|
||||
@@ -128,12 +128,9 @@ int dAcOFairy_c::create() {
|
||||
}
|
||||
mPreventCatchAfterSpawnTimer = 45;
|
||||
|
||||
if (isWithinPlayerRadius(200.0f)) {
|
||||
s16 ang = mVelocity.atan2sX_Z();
|
||||
if (sLib::absDiff(getXZAngleToPlayer(), ang) < 0x2000) {
|
||||
mVelocity.rotY(0x8000);
|
||||
mAngle.y += 0x8000;
|
||||
}
|
||||
if (isWithinPlayerRadius(200.0f) && getXZAngleToPlayer().absDiff(mAng::fromVec(mVelocity)) < 0x2000) {
|
||||
mVelocity.rotY(0x8000);
|
||||
mAngle.y += 0x8000;
|
||||
}
|
||||
|
||||
mModel.setAnm("PutFairy_fly", m3d::PLAY_MODE_4, 0.0f);
|
||||
@@ -461,7 +458,8 @@ void dAcOFairy_c::executeState_CureStart() {
|
||||
}
|
||||
} else {
|
||||
calcCurePosition(50.0f, 50.0f);
|
||||
s32 diff = sLib::absDiff(mCureAngle, 0);
|
||||
|
||||
s32 diff = mCureAngle.absDiff(0);
|
||||
if (diff < mCureAngularSpeed && mCurePosYOffset == 50.0f) {
|
||||
mStateMgr.changeState(StateID_Cure);
|
||||
}
|
||||
@@ -627,7 +625,7 @@ f32 dAcOFairy_c::randMaxSpeedY() const {
|
||||
}
|
||||
|
||||
bool dAcOFairy_c::shouldAvoidLink() const {
|
||||
return isWithinPlayerRadius(150.0f) && sLib::absDiff(mAngle.y, getXZAngleToPlayer()) < 0x2000;
|
||||
return isWithinPlayerRadius(150.0f) && mAngle.y.absDiff(getXZAngleToPlayer()) < 0x2000;
|
||||
}
|
||||
|
||||
bool dAcOFairy_c::isMovingAwayFromOrigY() const {
|
||||
|
||||
@@ -443,7 +443,7 @@ void AttentionManager::addPickUpTarget(dAcObjBase_c &actor, f32 field_0x14) {
|
||||
addTarget(actor, pickUpTarget, 0, nullptr);
|
||||
}
|
||||
|
||||
void AttentionManager::addSitTarget(dAcObjBase_c &actor, u32 flags, f32 field_0x14) {
|
||||
void AttentionManager::addSitTarget(dAcObjBase_c &actor, f32 field_0x14, AttentionManager::Flags_e flags) {
|
||||
static InteractionTargetDef sitTarget = {0, 2, 0, SIT, 2, 0.0f, 60.0f, 0.0f, -75.0f, 75.0f, 20.0f, 1.0f};
|
||||
sitTarget.interactFlags = flags;
|
||||
sitTarget.field_0x14 = field_0x14;
|
||||
|
||||
Reference in New Issue
Block a user