mirror of
https://github.com/TwilitRealm/dusklight
synced 2026-08-14 19:59:45 -04:00
Merge branch 'main' into 26-02-27-allocator-isolation
This commit is contained in:
+274
-179
@@ -1,16 +1,16 @@
|
||||
/**
|
||||
* @file d_a_obj_syRock.cpp
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#include "d/dolzel_rel.h" // IWYU pragma: keep
|
||||
|
||||
#include "d/actor/d_a_obj_syRock.h"
|
||||
#include "d/actor/d_a_obj_eff.h"
|
||||
#include "d/d_bg_w.h"
|
||||
#include "d/d_com_inf_game.h"
|
||||
#include "f_op/f_op_kankyo_mng.h"
|
||||
#include "SSystem/SComponent/c_math.h"
|
||||
#include "d/d_s_play.h"
|
||||
|
||||
typedef void (daSyRock_c::*actionFunc)();
|
||||
|
||||
class daSyRock_HIO_c : public mDoHIO_entry_c {
|
||||
public:
|
||||
@@ -19,56 +19,103 @@ public:
|
||||
|
||||
void genMessage(JORMContext*);
|
||||
|
||||
/* 0x04 */ f32 mShakeAmplitude; // "揺れ強さ" "Shake strength" | Slider
|
||||
/* 0x08 */ f32 mShakeXOscillationAngle; // "振幅X" "Amplitude X" | Slider
|
||||
/* 0x0C */ f32 mShakeZOscillationAngle; // "振幅Z" "Amplitude Z" | Slider
|
||||
/* 0x10 */ f32 mShakeDamping; // "揺れ減衰" "Shake damping" | Slider
|
||||
/* 0x14 */ f32 mShakeMaxDecay; // "最大減衰量" "Maximum decay" | Slider
|
||||
/* 0x18 */ f32 mShakeMinDecay; // "最小減衰量" "Minimum decay" | Slider
|
||||
/* 0x1C */ f32 mFallAcceleration; // "落下速度" "Fall speed" | Slider
|
||||
/* 0x20 */ f32 mMaxFallSpeed; // "最大落下速度" "Maximum falling speed" | Slider
|
||||
/* 0x24 */ u8 mWaitFrames; // "wait time" | Slider (unused)
|
||||
/* 0x25 */ u8 mShockStrength; // "振動" "Vibration" | Combo Box
|
||||
/* "強さ1" "Strength 1"
|
||||
"強さ2" "Strength 2"
|
||||
"強さ3" "Strength 3"
|
||||
"強さ4" "Strength 4"
|
||||
"強さ5" "Strength 5"
|
||||
"強さ6" "Strength 6"
|
||||
"強さ7" "Strength 7"
|
||||
"強さ8" "Strength 8" */
|
||||
/* 0x28 */ f32 mEffectScale; // "eff scale" | Slider
|
||||
/* 0x2C */ f32 mFallWaterBouyancy; // "sink speed" | Slider
|
||||
/* 0x30 */ f32 mMaxWaterPillarRange; // "renge" | "Range" | Slider
|
||||
/* 0x04 */ f32 mShakeAmplitude;
|
||||
/* 0x08 */ f32 mShakeXOscAngQuantum;
|
||||
/* 0x0C */ f32 mShakeZOscAngQuantum;
|
||||
/* 0x10 */ f32 mShakeDampingScale;
|
||||
/* 0x14 */ f32 mShakeMaxDecay;
|
||||
/* 0x18 */ f32 mShakeMinDecay;
|
||||
/* 0x1C */ f32 mFallAcceleration;
|
||||
/* 0x20 */ f32 mMaxFallSpeed;
|
||||
/* 0x24 */ u8 mWaitFrames;
|
||||
/* 0x25 */ u8 mVibModePower;
|
||||
/* 0x28 */ f32 mEffScale;
|
||||
/* 0x2C */ f32 mFallWaterBouyancy;
|
||||
/* 0x30 */ f32 mRange; // Maximum horizontal distance a d_a_obj_waterPillar instance may be from the current syRock instance in order for the two to be associated
|
||||
};
|
||||
|
||||
typedef void (daSyRock_c::*actionFunc)();
|
||||
|
||||
static daSyRock_HIO_c l_HIO;
|
||||
|
||||
dCcD_SrcCyl daSyRock_c::mCcDCyl = {mCcDObjInfo};
|
||||
|
||||
daSyRock_HIO_c::daSyRock_HIO_c() {
|
||||
mShakeAmplitude = 450.0f;
|
||||
mShakeXOscillationAngle = 90.0f;
|
||||
mShakeZOscillationAngle = 45.0f;
|
||||
mShakeDamping = 1.0f / 20.0f;
|
||||
mShakeXOscAngQuantum = 90.0f;
|
||||
mShakeZOscAngQuantum = 45.0f;
|
||||
mShakeDampingScale = 1.0f / 20.0f;
|
||||
mShakeMaxDecay = 5.0f;
|
||||
mShakeMinDecay = 1.0f / 10.0f;
|
||||
mFallAcceleration = 10.0f;
|
||||
mMaxFallSpeed = 200.0f;
|
||||
mWaitFrames = 30;
|
||||
mEffectScale = 4.0f;
|
||||
mShockStrength = 4;
|
||||
mEffScale = 4.0f;
|
||||
mVibModePower = VIBMODE_S_POWER4;
|
||||
mFallWaterBouyancy = 3.0f;
|
||||
mMaxWaterPillarRange = 5.0f;
|
||||
mRange = 5.0f;
|
||||
}
|
||||
|
||||
#if DEBUG
|
||||
void daSyRock_HIO_c::genMessage(JORMContext* mctx) {
|
||||
/* ==== Falling ==== */
|
||||
mctx->genLabel("\n==== 落下 ====", 0);
|
||||
// Wait time
|
||||
mctx->genSlider("wait time", &mWaitFrames, 0, 0xFF);
|
||||
// Fall speed
|
||||
mctx->genSlider("落下速度", &mFallAcceleration, 0.0f, 100.0f);
|
||||
// Maximum fall speed
|
||||
mctx->genSlider("最大落下速度", &mMaxFallSpeed, 0.1f, 500.0f);
|
||||
// Effect scale
|
||||
mctx->genSlider("eff scale", &mEffScale, 0.1f, 20.0f);
|
||||
|
||||
/* ==== Shaking ==== */
|
||||
mctx->genLabel("\n==== 揺れ ====", 0);
|
||||
// Shaking intensity
|
||||
mctx->genSlider("揺れ強さ", &mShakeAmplitude, 0.0f, 10000.0f);
|
||||
// Z Amplitude
|
||||
mctx->genSlider("振幅Z", &mShakeZOscAngQuantum, 0.0f, 180.0f);
|
||||
// X Amplitude
|
||||
mctx->genSlider("振幅X", &mShakeXOscAngQuantum, 0.0f, 180.0f);
|
||||
// Shake damping
|
||||
mctx->genSlider("揺れ減衰", &mShakeDampingScale, 0.0f, 1.0f);
|
||||
// Maximum damping amount
|
||||
mctx->genSlider("最大減衰量", &mShakeMaxDecay, 0.0f, 100.0f);
|
||||
// Minimum damping amount
|
||||
mctx->genSlider("最小減衰量", &mShakeMinDecay, 0.0f, 100.0f);
|
||||
|
||||
/* Vibration */
|
||||
mctx->startComboBox("振動", &mVibModePower);
|
||||
// Strength 1
|
||||
mctx->genComboBoxItem("強さ1", VIBMODE_S_POWER1);
|
||||
// Strength 2
|
||||
mctx->genComboBoxItem("強さ2", VIBMODE_S_POWER2);
|
||||
// Strength 3
|
||||
mctx->genComboBoxItem("強さ3", VIBMODE_S_POWER3);
|
||||
// Strength 4
|
||||
mctx->genComboBoxItem("強さ4", VIBMODE_S_POWER4);
|
||||
// Strength 5
|
||||
mctx->genComboBoxItem("強さ5", VIBMODE_S_POWER5);
|
||||
// Strength 6
|
||||
mctx->genComboBoxItem("強さ6", VIBMODE_S_POWER6);
|
||||
// Strength 7
|
||||
mctx->genComboBoxItem("強さ7", VIBMODE_S_POWER7);
|
||||
// Strength 8
|
||||
mctx->genComboBoxItem("強さ8", VIBMODE_S_POWER8);
|
||||
mctx->endComboBox();
|
||||
|
||||
/* ==== For Testing Purposes ==== */
|
||||
mctx->genLabel("\n==== テスト用 ====", 0);
|
||||
// Range
|
||||
mctx->genSlider("renge", &mRange, 0.1f, 20.0f);
|
||||
// Sink speed
|
||||
mctx->genSlider("sink speed", &mFallWaterBouyancy, 0.1f, 20.0f);
|
||||
}
|
||||
#endif
|
||||
|
||||
void daSyRock_c::setBaseMtx() {
|
||||
mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z);
|
||||
mDoMtx_stack_c::ZXYrotM(0, shape_angle.y, shape_angle.z);
|
||||
mDoMtx_stack_c::ZXYrotM(mShakeXZAngleOffset.x, mShakeXZAngleOffset.y, mShakeXZAngleOffset.z);
|
||||
mDoMtx_stack_c::transM(mUnderwaterRotatedStalactiteOffset.x, mUnderwaterRotatedStalactiteOffset.y, mUnderwaterRotatedStalactiteOffset.z);
|
||||
mDoMtx_stack_c::ZXYrotM(mShakeAngOffset.x, mShakeAngOffset.y, mShakeAngOffset.z);
|
||||
mDoMtx_stack_c::transM(mUnderwaterOffset.x, mUnderwaterOffset.y, mUnderwaterOffset.z);
|
||||
|
||||
mpModels[mIsUnbroken]->setBaseScale(scale);
|
||||
|
||||
@@ -81,20 +128,22 @@ int daSyRock_c::CreateHeap() {
|
||||
J3DModelData* modelData = static_cast<J3DModelData*>(dComIfG_getObjectRes("syourock", 4));
|
||||
JUT_ASSERT(271, modelData != NULL);
|
||||
mpModels[0] = mDoExt_J3DModel__create(modelData, 1 << 19, 0x11000084);
|
||||
|
||||
if(!mpModels[0])
|
||||
|
||||
if (!mpModels[0]) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
modelData = static_cast<J3DModelData*>(dComIfG_getObjectRes("syourock", 5));
|
||||
JUT_ASSERT(282, modelData != NULL);
|
||||
mpModels[1] = mDoExt_J3DModel__create(modelData, 1 << 19, 0x11000084);
|
||||
|
||||
if(!mpModels[1])
|
||||
if (!mpModels[1]) {
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
mpBrokenCollision = JKR_NEW dBgW;
|
||||
|
||||
if(!mpBrokenCollision || mpBrokenCollision->Set(static_cast<cBgD_t*>(dComIfG_getObjectRes("syourock", 9)), 1, &mBgMtx)) {
|
||||
if (!mpBrokenCollision || mpBrokenCollision->Set(static_cast<cBgD_t*>(dComIfG_getObjectRes("syourock", 9)), 1, &mBgMtx)) {
|
||||
mpBrokenCollision = NULL;
|
||||
return 0;
|
||||
}
|
||||
@@ -112,58 +161,76 @@ dCcD_SrcGObjInf const daSyRock_c::mCcDObjInfo = {
|
||||
cPhs_Step daSyRock_c::create() {
|
||||
fopAcM_ct(this, daSyRock_c);
|
||||
|
||||
if(getArg0() == TRUE) {
|
||||
mpWaterPillar = static_cast<daWtPillar_c*>(fopAcIt_Judge(searchWaterPillar, this));
|
||||
// Check if an associated water pillar should be searched for
|
||||
if (getArg0() == TRUE) {
|
||||
mpWaterPillar = static_cast<daWtPillar_c*>(fopAcM_Search(searchWaterPillar, this));
|
||||
|
||||
if(!mpWaterPillar)
|
||||
if (!mpWaterPillar) {
|
||||
return cPhs_INIT_e;
|
||||
}
|
||||
}
|
||||
|
||||
cPhs_Step bgCreatePhaseProcess;
|
||||
|
||||
const cPhs_Step requestedPhaseProcess = static_cast<cPhs_Step>(dComIfG_resLoad(&mPhase, "syourock"));
|
||||
if(requestedPhaseProcess == cPhs_COMPLEATE_e) {
|
||||
const cPhs_Step bgCreatePhaseProcess = static_cast<cPhs_Step>(MoveBGCreate("syourock", 0x8, dBgS_MoveBGProc_TypicalRotY, 0x2100, NULL));
|
||||
if(bgCreatePhaseProcess == cPhs_ERROR_e)
|
||||
if (requestedPhaseProcess == cPhs_COMPLEATE_e) {
|
||||
if (MoveBGCreate("syourock", 0x8, dBgS_MoveBGProc_TypicalRotY, 0x2100, NULL) == cPhs_ERROR_e) {
|
||||
return cPhs_ERROR_e;
|
||||
}
|
||||
|
||||
mAcchCir.SetWall(150.0f, 150.0f);
|
||||
mAcch.Set(¤t.pos, &old.pos, this, 0x1, &mAcchCir, &speed, NULL, NULL);
|
||||
mAcch.Set(fopAcM_GetPosition_p(this),
|
||||
fopAcM_GetOldPosition_p(this),
|
||||
this, 0x1, &mAcchCir,
|
||||
fopAcM_GetSpeed_p(this),
|
||||
NULL, NULL);
|
||||
mAcch.SetWaterCheckOffset(10000.0f);
|
||||
mShakeOscillationAngleStep = 0;
|
||||
mShakeXZAngleOffset.setall(0);
|
||||
|
||||
mShakeXOscillationAngle = mShakeZOscillationAngle = mShakeAmplitude = 0.0f;
|
||||
mShakeMinDecay = mShakeMaxDecay = mShakeDamping = 0.0f;
|
||||
mUnderwaterRotatedStalactiteOffset.setall(0.0f);
|
||||
mShakeOscAngStep = 0;
|
||||
|
||||
mShakeAngOffset.x = 0;
|
||||
mShakeAngOffset.y = 0;
|
||||
mShakeAngOffset.z = 0;
|
||||
|
||||
mShakeAmplitude = 0.0f;
|
||||
mShakeZOscAngQuantum = 0.0f;
|
||||
mShakeXOscAngQuantum = 0.0f;
|
||||
|
||||
mShakeDampingScale = 0.0f;
|
||||
mShakeMaxDecay = 0.0f;
|
||||
mShakeMinDecay = 0.0f;
|
||||
|
||||
mUnderwaterOffset.x = 0.0f;
|
||||
mUnderwaterOffset.y = 0.0f;
|
||||
mUnderwaterOffset.z = 0.0f;
|
||||
|
||||
mStts.Init(0xFF, 0xFF, this);
|
||||
mUnbrokenCylinderCollider.Set(mCcDCyl);
|
||||
mUnbrokenCylinderCollider.SetStts(&mStts);
|
||||
mUnbrokenCylinderCollider.OffAtSetBit();
|
||||
mUnbrokenCollider.Set(mCcDCyl);
|
||||
mUnbrokenCollider.SetStts(&mStts);
|
||||
mUnbrokenCollider.OffAtSetBit();
|
||||
|
||||
const u32 wasBrokenSwitchNo = getSwBit1();
|
||||
if(dComIfGs_isSwitch(wasBrokenSwitchNo, fopAcM_GetHomeRoomNo(this))) {
|
||||
if (fopAcM_isSwitch(this, getSwBit1())) {
|
||||
mIsUnbroken = false;
|
||||
mUnbrokenCylinderCollider.OffCoSetBit();
|
||||
if(mpBrokenCollision && mpBrokenCollision->ChkUsed()) {
|
||||
mUnbrokenCollider.OffCoSetBit();
|
||||
if (mpBrokenCollision && mpBrokenCollision->ChkUsed()) {
|
||||
dComIfG_Bgsp().Release(mpBrokenCollision);
|
||||
mpBrokenCollision->Move();
|
||||
}
|
||||
|
||||
// Snap already broken stalactite to its appropriate location and set its mode accordingly
|
||||
setFallStat();
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
mIsUnbroken = true;
|
||||
|
||||
if(mpBgW)
|
||||
if (mpBgW)
|
||||
dComIfG_Bgsp().Release(mpBgW);
|
||||
|
||||
if(mpBrokenCollision) {
|
||||
|
||||
if (mpBrokenCollision) {
|
||||
dComIfG_Bgsp().Regist(mpBrokenCollision, this);
|
||||
mpBrokenCollision->Move();
|
||||
}
|
||||
|
||||
mDropAutomaticallySwitchNo = getSwBit2();
|
||||
mAutoDropSwNo = getSwBit2();
|
||||
init_modeWait();
|
||||
|
||||
}
|
||||
@@ -172,28 +239,34 @@ cPhs_Step daSyRock_c::create() {
|
||||
fopAcM_SetMtx(this, mpModels[mIsUnbroken]->getBaseTRMtx());
|
||||
fopAcM_setCullSizeBox2(this, mpModels[mIsUnbroken]->getModelData());
|
||||
setBaseMtx();
|
||||
|
||||
#if DEBUG
|
||||
l_HIO.entryHIO("鍾乳石"); // "Stalactite"
|
||||
#endif
|
||||
}
|
||||
|
||||
return requestedPhaseProcess;
|
||||
}
|
||||
|
||||
void daSyRock_c::setFallStat() {
|
||||
mpWaterPillar = static_cast<daWtPillar_c*>(fopAcIt_Judge(searchWaterPillar, this));
|
||||
if(mpWaterPillar) {
|
||||
mpWaterPillar = static_cast<daWtPillar_c*>(fopAcM_Search(searchWaterPillar, this));
|
||||
if (mpWaterPillar) {
|
||||
OS_REPORT("== 下に水柱あり ==\n"); // "== Water pillar below =="
|
||||
|
||||
mpWaterPillar->onRockFlag();
|
||||
mMode = MODE_MOVE;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
OS_REPORT("== 下に水柱無し ==\n"); // "== No water pillar below =="
|
||||
|
||||
mAcch.CrrPos(dComIfG_Bgsp());
|
||||
|
||||
if(mAcch.ChkWaterHit()) {
|
||||
if(mAcch.m_wtr.GetHeight() - mAcch.GetGroundH() >= 200.0f) {
|
||||
mUnderwaterRotatedStalactiteOffset.x = 150.0f;
|
||||
if (mAcch.ChkWaterHit()) {
|
||||
if (mAcch.m_wtr.GetHeight() - mAcch.GetGroundH() >= 200.0f) {
|
||||
mUnderwaterOffset.x = 150.0f;
|
||||
shape_angle.z = 0x4000;
|
||||
}
|
||||
current.pos.y = mAcch.GetGroundH();
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
current.pos.y = mAcch.GetGroundH();
|
||||
}
|
||||
|
||||
@@ -208,37 +281,37 @@ int daSyRock_c::Execute(Mtx** i_mtx) {
|
||||
|
||||
*i_mtx = &mpModels[mIsUnbroken]->getBaseTRMtx();
|
||||
|
||||
mInWaterPreviousFrame = mAcch.ChkWaterIn();
|
||||
mInWaterPrevFrame = mAcch.ChkWaterIn() != false;
|
||||
setBaseMtx();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
void daSyRock_c::move() {
|
||||
static actionFunc mode_proc[] = {
|
||||
static const actionFunc mode_proc[] = {
|
||||
&daSyRock_c::modeWait, &daSyRock_c::modeDropInit,
|
||||
&daSyRock_c::modeDrop, &daSyRock_c::modeSink,
|
||||
&daSyRock_c::modeMove, &daSyRock_c::modeDropEnd
|
||||
};
|
||||
(this->*mode_proc[mMode])();
|
||||
|
||||
(this->*mode_proc[mMode])();
|
||||
|
||||
mShakeXZAngleOffset.x = mShakeAmplitude * cM_ssin(mShakeOscillationAngleStep * cM_deg2s(mShakeXOscillationAngle));
|
||||
mShakeXZAngleOffset.z = mShakeAmplitude * cM_scos(mShakeOscillationAngleStep * cM_deg2s(mShakeZOscillationAngle));
|
||||
mShakeAngOffset.x = mShakeAmplitude * cM_ssin(mShakeOscAngStep * cM_deg2s(mShakeXOscAngQuantum));
|
||||
mShakeAngOffset.z = mShakeAmplitude * cM_scos(mShakeOscAngStep * cM_deg2s(mShakeZOscAngQuantum));
|
||||
|
||||
cLib_addCalc(&mShakeAmplitude, 0.0f, mShakeDamping, mShakeMaxDecay, mShakeMinDecay);
|
||||
cLib_addCalc(&mShakeAmplitude, 0.0f, mShakeDampingScale, mShakeMaxDecay, mShakeMinDecay);
|
||||
|
||||
mShakeOscillationAngleStep++;
|
||||
mShakeOscAngStep++;
|
||||
|
||||
mUnbrokenCylinderCollider.SetR(150.0f);
|
||||
mUnbrokenCylinderCollider.SetH(680.0f);
|
||||
mUnbrokenCollider.SetR(150.0f + oREG_F(0));
|
||||
mUnbrokenCollider.SetH(680.0f + oREG_F(1));
|
||||
|
||||
cXyz currentPos = current.pos;
|
||||
currentPos.y -= 250.0f;
|
||||
currentPos.y -= 250.0f + oREG_F(2);
|
||||
|
||||
mUnbrokenCylinderCollider.SetC(currentPos);
|
||||
mUnbrokenCollider.SetC(currentPos);
|
||||
|
||||
dComIfG_Ccsp()->Set(&mUnbrokenCylinderCollider);
|
||||
dComIfG_Ccsp()->Set(&mUnbrokenCollider);
|
||||
}
|
||||
|
||||
void daSyRock_c::init_modeWait() {
|
||||
@@ -246,77 +319,84 @@ void daSyRock_c::init_modeWait() {
|
||||
}
|
||||
|
||||
void daSyRock_c::modeWait() {
|
||||
if(mDropAutomaticallySwitchNo != 0xFF && dComIfGs_isSwitch(mDropAutomaticallySwitchNo, fopAcM_GetHomeRoomNo(this))) {
|
||||
if (mAutoDropSwNo != 0xFF && fopAcM_isSwitch(this, mAutoDropSwNo)) {
|
||||
field_0x779 = 0;
|
||||
if(getEvetID() != 0xFF){
|
||||
if (getEvetID() != 0xFF) {
|
||||
orderEvent(getEvetID(), 0xFF, 1);
|
||||
} else {
|
||||
eventStart();
|
||||
}
|
||||
return;
|
||||
}
|
||||
else if(mUnbrokenCylinderCollider.ChkTgHit()) {
|
||||
if(mUnbrokenCylinderCollider.GetTgHitGObj()->GetAtType() == AT_TYPE_BOMB) {
|
||||
|
||||
if (mUnbrokenCollider.ChkTgHit()) {
|
||||
dCcD_GObjInf* tgHitGObj = mUnbrokenCollider.GetTgHitGObj();
|
||||
if (tgHitGObj->GetAtType() == AT_TYPE_BOMB) {
|
||||
field_0x779 = 0;
|
||||
if(getEvetID() != 0xFF)
|
||||
if (getEvetID() != 0xFF) {
|
||||
orderEvent(getEvetID(), 0xFF, 1);
|
||||
else {
|
||||
} else {
|
||||
eventStart();
|
||||
}
|
||||
}
|
||||
mUnbrokenCylinderCollider.ClrTgHit();
|
||||
mUnbrokenCollider.ClrTgHit();
|
||||
}
|
||||
}
|
||||
|
||||
bool daSyRock_c::eventStart() {
|
||||
// field_0x779 is always 0 when eventStart() is called (see modeWait())
|
||||
if(!field_0x779)
|
||||
if (!field_0x779) {
|
||||
init_modeDropInit();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void daSyRock_c::init_modeDropInit() {
|
||||
fopAcM_seStartCurrent(this, Z2SE_OBJ_STALAC_BREAK, 0);
|
||||
mDoAud_seStart(Z2SE_OBJ_STALAC_BREAK, ¤t.pos, 0,
|
||||
dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
|
||||
|
||||
mUnbrokenCylinderCollider.OffCoSetBit();
|
||||
mUnbrokenCylinderCollider.OffTgSetBit();
|
||||
mUnbrokenCollider.OffCoSetBit();
|
||||
mUnbrokenCollider.OffTgSetBit();
|
||||
|
||||
mWaitFrames = 0;
|
||||
|
||||
mpWaterPillar = static_cast<daWtPillar_c*>(fopAcIt_Judge(searchWaterPillar, this));
|
||||
mpWaterPillar = static_cast<daWtPillar_c*>(fopAcM_Search(searchWaterPillar, this));
|
||||
|
||||
mMode = MODE_DROP_INIT;
|
||||
}
|
||||
|
||||
void daSyRock_c::modeDropInit() {
|
||||
if(mWaitFrames)
|
||||
if (mWaitFrames) {
|
||||
mWaitFrames--;
|
||||
else
|
||||
} else {
|
||||
init_modeDrop();
|
||||
}
|
||||
}
|
||||
|
||||
void* daSyRock_c::searchWaterPillar(void* i_proc, void* i_this) {
|
||||
daSyRock_c* const syRock = static_cast<daSyRock_c*>(i_this);
|
||||
daWtPillar_c* const wtPillar = static_cast<daWtPillar_c*>(i_proc);
|
||||
|
||||
if(wtPillar && fopAcM_IsActor(wtPillar) && fopAcM_GetProfName(wtPillar) == PROC_Obj_WaterPillar) {
|
||||
const cXyz vectorToWaterPillar = fopAcM_GetPosition(syRock) - fopAcM_GetPosition(wtPillar);
|
||||
const f32 horizontalDistanceToWaterPillar = sqrtf(vectorToWaterPillar.getMagXZ());
|
||||
|
||||
if(horizontalDistanceToWaterPillar <= l_HIO.mMaxWaterPillarRange)
|
||||
if (wtPillar && fopAcM_IsActor(wtPillar) && fopAcM_GetProfName(wtPillar) == PROC_Obj_WaterPillar) {
|
||||
const cXyz vectorFromWaterPillar = syRock->current.pos - wtPillar->current.pos;
|
||||
const f32 horizontalDistanceToWaterPillar = vectorFromWaterPillar.absXZ();
|
||||
|
||||
if (horizontalDistanceToWaterPillar <= l_HIO.mRange) {
|
||||
return wtPillar;
|
||||
else
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void daSyRock_c::init_modeDrop() {
|
||||
gravity = -l_HIO.mFallAcceleration;
|
||||
maxFallSpeed = -l_HIO.mMaxFallSpeed;
|
||||
speedF = 0.0f;
|
||||
fopAcM_SetGravity(this, -l_HIO.mFallAcceleration);
|
||||
fopAcM_SetMaxFallSpeed(this, -l_HIO.mMaxFallSpeed);
|
||||
fopAcM_SetSpeedF(this, 0.0f);
|
||||
|
||||
if(mpBrokenCollision) {
|
||||
if (mpBrokenCollision) {
|
||||
dComIfG_Bgsp().Release(mpBrokenCollision);
|
||||
mpBrokenCollision->Move();
|
||||
}
|
||||
@@ -327,7 +407,7 @@ void daSyRock_c::init_modeDrop() {
|
||||
|
||||
const cXyz particlePos = current.pos;
|
||||
dComIfGp_particle_set(0x8616, &particlePos, NULL, NULL);
|
||||
mUnbrokenCylinderCollider.OnAtSetBit();
|
||||
mUnbrokenCollider.OnAtSetBit();
|
||||
mMode = MODE_DROP;
|
||||
}
|
||||
|
||||
@@ -338,20 +418,22 @@ void daSyRock_c::modeDrop() {
|
||||
}
|
||||
|
||||
void daSyRock_c::init_modeSink() {
|
||||
gravity = -l_HIO.mFallAcceleration + l_HIO.mFallWaterBouyancy;
|
||||
speed.y = cLib_minMaxLimit(speed.y, -15.0f, 13.0f);
|
||||
fopAcM_SetGravity(this, -l_HIO.mFallAcceleration + l_HIO.mFallWaterBouyancy);
|
||||
speed.y = cLib_minMaxLimit(speed.y, -15.0f - oREG_F(7), 13.0f + oREG_F(8));
|
||||
|
||||
if(!mpWaterPillar)
|
||||
mUnderwaterRotatedStalactiteOffset.x = 150.0f;
|
||||
if (!mpWaterPillar) {
|
||||
mUnderwaterOffset.x = 150.0f;
|
||||
}
|
||||
|
||||
mMode = MODE_SINK;
|
||||
}
|
||||
|
||||
void daSyRock_c::modeSink() {
|
||||
if(!mpWaterPillar)
|
||||
if (!mpWaterPillar) {
|
||||
cLib_addCalcAngleS(&shape_angle.z, 0x4000, 1, 0x444, 1);
|
||||
}
|
||||
|
||||
speed.y = cLib_minMaxLimit(speed.y, -15.0f, 13.0f);
|
||||
speed.y = cLib_minMaxLimit(speed.y, -15.0f - oREG_F(7), 13.0f + oREG_F(8));
|
||||
|
||||
fopAcM_posMoveF(this, mStts.GetCCMoveP());
|
||||
mAcch.CrrPos(dComIfG_Bgsp());
|
||||
@@ -360,24 +442,25 @@ void daSyRock_c::modeSink() {
|
||||
}
|
||||
|
||||
void daSyRock_c::init_modeMove() {
|
||||
fopAcM_seStartCurrent(this, Z2SE_OBJ_STALAC_LAND_WATER, 0);
|
||||
mDoAud_seStart(Z2SE_OBJ_STALAC_LAND_WATER, ¤t.pos, 0,
|
||||
dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
|
||||
|
||||
if(mpBgW)
|
||||
if (mpBgW) {
|
||||
dComIfG_Bgsp().Regist(mpBgW, this);
|
||||
}
|
||||
|
||||
mpWaterPillar->onRockFlag();
|
||||
|
||||
mShakeAmplitude = l_HIO.mShakeAmplitude;
|
||||
mShakeZOscillationAngle = l_HIO.mShakeZOscillationAngle;
|
||||
mShakeXOscillationAngle = l_HIO.mShakeXOscillationAngle;
|
||||
mShakeDamping = l_HIO.mShakeDamping;
|
||||
mShakeZOscAngQuantum = l_HIO.mShakeZOscAngQuantum;
|
||||
mShakeXOscAngQuantum = l_HIO.mShakeXOscAngQuantum;
|
||||
mShakeDampingScale = l_HIO.mShakeDampingScale;
|
||||
mShakeMaxDecay = l_HIO.mShakeMaxDecay;
|
||||
mShakeMinDecay = l_HIO.mShakeMinDecay;
|
||||
|
||||
mUnbrokenCylinderCollider.OffAtSetBit();
|
||||
mUnbrokenCollider.OffAtSetBit();
|
||||
|
||||
const u32 swBit = getSwBit1();
|
||||
dComIfGs_onSwitch(swBit, fopAcM_GetHomeRoomNo(this));
|
||||
fopAcM_onSwitch(this, getSwBit1());
|
||||
|
||||
mMode = MODE_MOVE;
|
||||
}
|
||||
@@ -387,12 +470,12 @@ void daSyRock_c::modeMove() {
|
||||
|
||||
current.pos = mpWaterPillar->getPos();
|
||||
current.pos.y -= 50.0f;
|
||||
|
||||
if(mpWaterPillar->isRockYure()) {
|
||||
|
||||
if (mpWaterPillar->isRockYure()) {
|
||||
mShakeAmplitude = l_HIO.mShakeAmplitude;
|
||||
mShakeZOscillationAngle = l_HIO.mShakeZOscillationAngle;
|
||||
mShakeXOscillationAngle = l_HIO.mShakeXOscillationAngle;
|
||||
mShakeDamping = l_HIO.mShakeDamping;
|
||||
mShakeZOscAngQuantum = l_HIO.mShakeZOscAngQuantum;
|
||||
mShakeXOscAngQuantum = l_HIO.mShakeXOscAngQuantum;
|
||||
mShakeDampingScale = l_HIO.mShakeDampingScale;
|
||||
mShakeMaxDecay = l_HIO.mShakeMaxDecay;
|
||||
mShakeMinDecay = l_HIO.mShakeMinDecay;
|
||||
|
||||
@@ -401,72 +484,77 @@ void daSyRock_c::modeMove() {
|
||||
}
|
||||
|
||||
BOOL daSyRock_c::chkWaterLineIn() {
|
||||
return mAcch.m_wtr.GetHeight() > current.pos.y + 150.0f;
|
||||
const f32 waterHeight = mAcch.m_wtr.GetHeight();
|
||||
return waterHeight > current.pos.y + 150.0f;
|
||||
}
|
||||
|
||||
void daSyRock_c::bgCheck() {
|
||||
// Note stack ordering issues arise if fopAcM_seStartCurrent() is used instead of mDoAud_seStart()
|
||||
const u32 hitGround = mAcch.ChkGroundHit() ? TRUE : FALSE;
|
||||
const u32 hitWater = mAcch.ChkWaterHit() ? TRUE : FALSE;
|
||||
const u32 inWater = mAcch.ChkWaterIn() ? TRUE : FALSE;
|
||||
const bool hitGround = mAcch.ChkGroundHit();
|
||||
const bool hitWater = mAcch.ChkWaterHit();
|
||||
const bool inWater = mAcch.ChkWaterIn();
|
||||
bool inWaterPillar = false;
|
||||
|
||||
if(mMode == MODE_DROP) {
|
||||
if(mpWaterPillar) {
|
||||
const f32 waterPillarHeight = mpWaterPillar->getPillarHeight();
|
||||
const f32 waterPillarVerticalPos = fopAcM_GetPosition(mpWaterPillar).y;
|
||||
if(waterPillarVerticalPos + waterPillarHeight - 50.0f >= current.pos.y)
|
||||
if (mMode == MODE_DROP) {
|
||||
if (mpWaterPillar) {
|
||||
const f32 pillarTop = mpWaterPillar->getPillarHeight() + mpWaterPillar->current.pos.y - 50.0f;
|
||||
if (pillarTop >= current.pos.y) {
|
||||
inWaterPillar = true;
|
||||
}
|
||||
|
||||
const f32 waterHeight = mAcch.m_wtr.GetHeight();
|
||||
if(hitWater) {
|
||||
const f32 verticalSpeed = speed.y;
|
||||
|
||||
if(chkWaterLineIn())
|
||||
init_modeSink();
|
||||
|
||||
if(inWater && !mInWaterPreviousFrame) {
|
||||
cXyz currentRockPos = current.pos;
|
||||
currentRockPos.y = waterHeight;
|
||||
fopKyM_createWpillar(¤tRockPos, l_HIO.mEffectScale, 3);
|
||||
|
||||
if(verticalSpeed < -15.0f)
|
||||
fopAcM_seStart(this, Z2SE_OBJ_FALL_WATER_M, 0);
|
||||
else
|
||||
mDoAud_seStart(Z2SE_OBJ_STALAC_LAND_WATER, ¤t.pos, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
|
||||
}
|
||||
}
|
||||
|
||||
if(inWaterPillar)
|
||||
init_modeMove();
|
||||
}
|
||||
const f32 waterHeight = mAcch.m_wtr.GetHeight();
|
||||
if (hitWater) {
|
||||
const f32 verticalSpeed = speed.y;
|
||||
|
||||
if(hitGround) {
|
||||
if(!hitWater && !mpWaterPillar) {
|
||||
mDoAud_seStart(Z2SE_OBJ_STALAC_LAND, ¤t.pos, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
|
||||
daObjEff::Act_c::make_land_smoke(¤t.pos, l_HIO.mEffectScale);
|
||||
if (chkWaterLineIn()) {
|
||||
init_modeSink();
|
||||
}
|
||||
|
||||
if (inWater && !mInWaterPrevFrame) {
|
||||
cXyz currentRockPos(current.pos);
|
||||
currentRockPos.y = waterHeight;
|
||||
|
||||
fopKyM_createWpillar(¤tRockPos, l_HIO.mEffScale, 3);
|
||||
|
||||
if (verticalSpeed < -15.0f) {
|
||||
fopAcM_seStart(this, Z2SE_OBJ_FALL_WATER_M, 0);
|
||||
} else {
|
||||
mDoAud_seStart(Z2SE_OBJ_STALAC_LAND_WATER, ¤t.pos, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(mpWaterPillar)
|
||||
if (inWaterPillar) {
|
||||
init_modeMove();
|
||||
else
|
||||
}
|
||||
}
|
||||
|
||||
if (hitGround) {
|
||||
if (!hitWater && !mpWaterPillar) {
|
||||
mDoAud_seStart(Z2SE_OBJ_STALAC_LAND, ¤t.pos, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
|
||||
daObjEff::Act_c::make_land_smoke(¤t.pos, l_HIO.mEffScale);
|
||||
}
|
||||
|
||||
if (mpWaterPillar) {
|
||||
init_modeMove();
|
||||
} else {
|
||||
init_modeDropEnd();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void daSyRock_c::init_modeDropEnd() {
|
||||
if(!mAcch.ChkWaterIn()) {
|
||||
dComIfGp_getVibration().StartShock(l_HIO.mShockStrength, 0xF, cXyz(0.0f, 1.0f, 0.0f));
|
||||
if (!mAcch.ChkWaterIn()) {
|
||||
dComIfGp_getVibration().StartShock(l_HIO.mVibModePower, 0xF, cXyz(0.0f, 1.0f, 0.0f));
|
||||
}
|
||||
|
||||
if(mpBgW)
|
||||
if (mpBgW) {
|
||||
dComIfG_Bgsp().Regist(mpBgW, this);
|
||||
}
|
||||
|
||||
mUnbrokenCylinderCollider.OffAtSetBit();
|
||||
mUnbrokenCollider.OffAtSetBit();
|
||||
|
||||
const u32 switchBitIndex = getSwBit1();
|
||||
dComIfGs_onSwitch(switchBitIndex, fopAcM_GetHomeRoomNo(this));
|
||||
fopAcM_onSwitch(this, getSwBit1());
|
||||
|
||||
mMode = MODE_DROP_END;
|
||||
}
|
||||
@@ -476,9 +564,9 @@ void daSyRock_c::modeDropEnd() {
|
||||
}
|
||||
|
||||
int daSyRock_c::Draw() {
|
||||
g_env_light.settingTevStruct(0x10, fopAcM_GetPosition_p(this), &tevStr);
|
||||
g_env_light.settingTevStruct(0x10, ¤t.pos, &tevStr);
|
||||
g_env_light.setLightTevColorType_MAJI(mpModels[mIsUnbroken], &tevStr);
|
||||
|
||||
|
||||
dComIfGd_setListBG();
|
||||
mDoExt_modelUpdateDL(mpModels[mIsUnbroken]);
|
||||
dComIfGd_setList();
|
||||
@@ -489,15 +577,19 @@ int daSyRock_c::Draw() {
|
||||
int daSyRock_c::Delete() {
|
||||
dComIfG_resDelete(&mPhase, "syourock");
|
||||
|
||||
if(mpBrokenCollision && mpBrokenCollision->ChkUsed())
|
||||
if (mpBrokenCollision && mpBrokenCollision->ChkUsed()) {
|
||||
dComIfG_Bgsp().Release(mpBrokenCollision);
|
||||
}
|
||||
|
||||
#if DEBUG
|
||||
l_HIO.removeHIO();
|
||||
#endif
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int daSyRock_Draw(daSyRock_c* i_this) {
|
||||
return i_this->Draw();
|
||||
return 1;
|
||||
return i_this->MoveBGDraw();
|
||||
}
|
||||
|
||||
static int daSyRock_Execute(daSyRock_c* i_this) {
|
||||
@@ -505,11 +597,14 @@ static int daSyRock_Execute(daSyRock_c* i_this) {
|
||||
}
|
||||
|
||||
static int daSyRock_Delete(daSyRock_c* i_this) {
|
||||
fopAcM_RegisterDeleteID(i_this, "daSyRock");
|
||||
return i_this->MoveBGDelete();
|
||||
}
|
||||
|
||||
static int daSyRock_Create(fopAc_ac_c* i_this) {
|
||||
return static_cast<daSyRock_c*>(i_this)->create();
|
||||
daSyRock_c* const actor = static_cast<daSyRock_c*>(i_this);
|
||||
fopAcM_RegisterCreateID(i_this, "daSyRock");
|
||||
return actor->create();
|
||||
}
|
||||
|
||||
static actor_method_class l_daSyRock_Method = {
|
||||
|
||||
Reference in New Issue
Block a user