Merge branch 'main' into 26-02-27-allocator-isolation

This commit is contained in:
PJB3005
2026-03-05 00:15:09 +01:00
5530 changed files with 252979 additions and 26830 deletions
+274 -179
View File
@@ -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(&current.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, &current.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, &current.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(&currentRockPos, 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, &current.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, &current.pos, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
daObjEff::Act_c::make_land_smoke(&current.pos, l_HIO.mEffectScale);
if (chkWaterLineIn()) {
init_modeSink();
}
if (inWater && !mInWaterPrevFrame) {
cXyz currentRockPos(current.pos);
currentRockPos.y = waterHeight;
fopKyM_createWpillar(&currentRockPos, 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, &current.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, &current.pos, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
daObjEff::Act_c::make_land_smoke(&current.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, &current.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 = {