From 412700b1833c0569740cc980e2f86ec36d6f813b Mon Sep 17 00:00:00 2001 From: user Date: Sun, 22 Mar 2026 14:32:10 +0100 Subject: [PATCH 01/15] Start `daEnSnakeBlock_c` It compiles, but doesn't match. Also doesn't include any of the child classes. --- include/game/bases/d_a_en_snake_block.hpp | 141 ++++ slices/d_enemiesNP.json | 9 + .../d_enemiesNP/bases/d_a_en_snake_block.cpp | 646 ++++++++++++++++++ 3 files changed, 796 insertions(+) create mode 100644 include/game/bases/d_a_en_snake_block.hpp create mode 100644 source/d_enemiesNP/bases/d_a_en_snake_block.cpp diff --git a/include/game/bases/d_a_en_snake_block.hpp b/include/game/bases/d_a_en_snake_block.hpp new file mode 100644 index 00000000..e060c988 --- /dev/null +++ b/include/game/bases/d_a_en_snake_block.hpp @@ -0,0 +1,141 @@ +#pragma once +#include +#include +#include +#include + +class dBg_ctr_c { +public: + dActor_c *mpActor; + u8 mPad1[0x9c]; + mVec2_c m_a0; + mVec2_c m_ac; + u8 mPad2[0xc]; + short *m_bc; + u8 mPad4[0x8]; + int m_c8; + u32 mFlags; + int m_d0; + u8 mpPad5[0x8]; + bool m_dc; + u8 mpPad6[3]; + int m_e0; + + void release(); +}; + +class daEnSnakeBlock_c : public dEn_c { +public: + // @unofficial + class dBlock_c { + public: + dBlock_c(); + virtual ~dBlock_c(); + + void createMdl(dHeapAllocator_c *alloc); + void doDelete(); + + void calcAnm(); + void setAnmClr(const char *name); + + void draw(mVec3_c pos); + + void initBgCtr(daEnSnakeBlock_c *parent, mVec3_c *blockPos, int unused); + void calcBgCtr(); + + void setFallCollapse(); + void calcCollapse1(u8 *travelInfo); + + static void callBackF(dActor_c *, dActor_c *); + static void callBackH(dActor_c *, dActor_c *); + static void callBackW(dActor_c *, dActor_c *, u8); + + nw4r::g3d::ResFile mResFile; + m3d::mdl_c mModel; + m3d::anmMatClr_c mAnmClr; + nw4r::g3d::ResAnmTexSrt mResTexSrt; + m3d::anmTexSrt_c mAnmTexSrt; + + mVec3_c mPos; + mVec3_c mSpeed; + mVec3_c mLastPos; + + dBg_ctr_c mBgCtr; + int mTravelInfoIdx; + daEnSnakeBlock_c *mpOwner; + + short _1B4; + }; + + // @unofficial + class dCtrlBlock_c : public dBlock_c { + public: + dCtrlBlock_c(); + virtual ~dCtrlBlock_c(); + + bool calcPos(u8 *travelInfo); + bool calcTravelPos(u8 *travelInfo); + + int mSnakeSpeedIdx; + }; + + daEnSnakeBlock_c(); + ~daEnSnakeBlock_c(); + + int create(); + int doDelete(); + int execute(); + int draw(); + + void deleteReady(); + + void initBlock(); + void initBlockPath(); + + void calcAnm(); + void createMdl(); + void deleteBlock(); + + void setStopState(); + + void calcBgCtr(); + void initTravelInfo(); + + void setBlockPos(); + void setActorPos(); + + bool chkCollapseDelete(); ///< Returns if the Tail is below the screen edge (meaning the collapse has ended, and the actor can be deleted) + bool chkOffScreen(); ///< Returns if the Snake Block is far past the right edge of the screen (used to delete it) + + dHeapAllocator_c mAllocator; + + dCtrlBlock_c mHead; + dCtrlBlock_c mTail; + dBlock_c mBlocks[20]; + + int mBlockNum; + u8 *mpTravelInfo; + int mTravelInfoIdx; + short mShakeTime; + + sStateID_c *mpStopState; + int mSnakeType; ///< Used for custom snake types + int mCollapse2Idx; + int mCreateAnmBlockIdx; + int mCreateAnmBlockNum; + u8 _pad[4]; + + static float sc_snakeSpeeds[3]; + static sStateID_c *sc_stopStates; + static mVec2_c sc_ctrlPosMods[5]; + static int sc_glbSnakeNum; + static mVec2_c sc_collapseSpeeds[5]; + + STATE_FUNC_DECLARE(daEnSnakeBlock_c, Wait); + STATE_FUNC_DECLARE(daEnSnakeBlock_c, Move); + STATE_FUNC_DECLARE(daEnSnakeBlock_c, Shake); + STATE_FUNC_DECLARE(daEnSnakeBlock_c, Stop); + STATE_FUNC_DECLARE(daEnSnakeBlock_c, Collapse1); + STATE_FUNC_DECLARE(daEnSnakeBlock_c, Collapse2); + STATE_FUNC_DECLARE(daEnSnakeBlock_c, Collapse3); +}; diff --git a/slices/d_enemiesNP.json b/slices/d_enemiesNP.json index 195d39c6..942b3aca 100644 --- a/slices/d_enemiesNP.json +++ b/slices/d_enemiesNP.json @@ -34,6 +34,15 @@ "memoryRanges": { ".text": "0x0-0x70" } + }, + { + "source": "d_enemiesNP/bases/d_a_en_snake_block.cpp", + "compilerFlags": "", + "memoryRanges": { + ".text": "0x103a50-0x106960", + ".data": "0x33680-0x33b90", + ".bss": "0x9f30-0xa178" + } } ] } diff --git a/source/d_enemiesNP/bases/d_a_en_snake_block.cpp b/source/d_enemiesNP/bases/d_a_en_snake_block.cpp new file mode 100644 index 00000000..e321d915 --- /dev/null +++ b/source/d_enemiesNP/bases/d_a_en_snake_block.cpp @@ -0,0 +1,646 @@ +#include +#include +#include + +#include +#include +#include +#include + +ACTOR_PROFILE(EN_SNAKEBLOCK, daEnSnakeBlock_c, 0) + +STATE_DEFINE(daEnSnakeBlock_c, Wait); +STATE_DEFINE(daEnSnakeBlock_c, Move); + +daEnSnakeBlock_c::daEnSnakeBlock_c() {} +daEnSnakeBlock_c::dBlock_c::dBlock_c() {} +daEnSnakeBlock_c::dCtrlBlock_c::dCtrlBlock_c() {} + + +static float daEnSnakeBlock_c::sc_snakeSpeeds[3] = { + 0.5f, 1.0f, 1.4f +}; + +static sStateID_c * daEnSnakeBlock_c::sc_stopStates[4] = { + StateID_Stop, StateID_Collapse1, StateID_Collapse2, StateID_Collapse3 +}; + +static mVec2_c daEnSnakeBlock_c::sc_ctrlPosMods[5]; +static int daEnSnakeBlock_c::sc_glbSnakeNum = 0; +static mVec2_c daEnSnakeBlock_c::sc_collapseSpeeds[5]; + +int daEnSnakeBlock_c::create() { + if (sc_glbSnakeNum >= 1 && (((mParam >> 0xC) & 0xFF) != 0)) { + deleteRequest(); + return NOT_READY; + } + + sc_glbSnakeNum++; + mBlockNum = (mParam & 0xF) + 2; + mSnakeType = (mParam >> 20) & 1; + + initBlock(); + initBlockPath(); + setStopState(); + + changeState(StateID_Wait); + + return SUCCEEDED; +} + +int daEnSnakeBlock_c::execute() { + mStateMgr.executeState(); + + calcAnm(); + setActorPos(); + calcBgCtr(); + + if (chkOffScreen()) { + deleteActor(0); + } + + return SUCCEEDED; +} + +int daEnSnakeBlock_c::draw() { + mVec3_c offset = mVec3_c(0.0f, 0.0f, 0.0f); + + if (mShakeTime > 0) { + offset.x = 0.0f + sc_snakeSpeeds[(mShakeTime >> 1) & 1]; + } + + mHead.draw(offset); + mTail.draw(offset); + for (int i = 0; i < mBlockNum; i++) { + mBlocks[i].draw(offset); + } + + return SUCCEEDED; +} + +void daEnSnakeBlock_c::deleteReady() { } + +int daEnSnakeBlock_c::doDelete() { + if (mAllocator.mpHeap != mAllocatorDummyHeap_c::getInstance()) { + deleteBlock(); + } + + sc_glbSnakeNum--; + if (sc_glbSnakeNum < 0) { + sc_glbSnakeNum = 0; + } + + return SUCCEEDED; +} + +void daEnSnakeBlock_c::initBlock() { + mAllocator.createFrmHeapToCurrent(-1, mHeap::g_gameHeaps[0], nullptr, 0x20, mHeap::OPT_NONE); + createMdl(); + initTravelInfo(); + mAllocator.adjustFrmHeapRestoreCurrent(); +} + +void daEnSnakeBlock_c::initBlockPath() { + sRailInfoData *rail = dRail_c::getRailInfoP((mParam >> 4) & 0xF); + dCdFile_c *file = dCd_c::m_instance->getFileP(dScStage_c::m_instance->mCurrFile); + + sRailNodeData *node = &file->mpRailNodes[rail->mNodeIdx + ((mParam >> 12) & 0xFF)]; + + float f1 = node->mX + (mBlockNum * 16.0f); + float f2 = node->mY - 8.0f; + mVec3_c head_pos = mVec3_c(f1, f2, 1516.0f); + mHead.initBgCtr(this, &head_pos, (mParam >> 20) & 1); + + mVec3_c mid_pos; + for (int i = 0; i < mBlockNum; i++) { + mid_pos.set(f1, f2, 1500.0f); + mBlocks[i].initBgCtr(this, &mid_pos, (mParam >> 20) & 1); + f1 -= 16.0f; + } + + mVec3_c tail_pos = mVec3_c(f1, f2, 1516.0f); + mTail.initBgCtr(this, &tail_pos, (mParam >> 20) & 1); + + mHead.mTravelInfoIdx = mBlockNum + 1; + mTail.mTravelInfoIdx = 1; + + // Note: Value 3 is out of bounds + mHead.mSnakeSpeedIdx = (mParam >> 8) & 3; + mTail.mSnakeSpeedIdx = (mParam >> 8) & 3; +} + +void daEnSnakeBlock_c::calcAnm() { + mHead.calcAnm(); + mTail.calcAnm(); + + for (int i = 0; i < mBlockNum; i++) { + mBlocks[i].calcAnm(); + } +} + +void daEnSnakeBlock_c::createMdl() { + mHead.createMdl(&mAllocator); + mTail.createMdl(&mAllocator); + + for (int i = 0; i < mBlockNum; i++) { + mBlocks[i].createMdl(&mAllocator); + } +} + +void daEnSnakeBlock_c::deleteBlock() { + mHead.doDelete(); + mTail.doDelete(); + + for (int i = 0; i < mBlockNum; i++) { + mBlocks[i].doDelete(); + } +} + +void daEnSnakeBlock_c::setStopState() { + mpStopState = &sc_stopStates[mParam >> 0x1c]; +} + +void daEnSnakeBlock_c::calcBgCtr() { + mHead.calcBgCtr(); + mTail.calcBgCtr(); + + mTail.mBgCtr.mFlags |= 1; + + for (int i = 0; i < mBlockNum; i++) { + mBlocks[i].calcBgCtr(); + } +} + +void daEnSnakeBlock_c::initTravelInfo() { + sRailInfoData *rail = dRail_c::getRailInfoP((mParam >> 4) & 0xF); + dCdFile_c *file = dCd_c::m_instance->getFileP(dScStage_c::m_instance->mCurrFile); + + sRailNodeData *node = &file->mpRailNodes[rail->mNodeIdx + ((mParam >> 12) & 0xFF)]; + + u32 dist = 0; + u32 start_idx = (mParam >> 12) & 0xFF; + for (int i = start_idx; i < (rail->mCount - 1); i++) { + sRailNodeData * next_node = node + 1; + s16 dx = abs((next_node->mX >> 4) - (node->mX >> 4)); + s16 dy = abs((next_node->mY >> 4) - (node->mY >> 4)); + dist += dx + dy; + node = next_node; + } + + mTravelInfoIdx = dist; + mpTravelInfo = new u8[dist + 2]; + + int i11 = 1; + for (; start_idx < rail->mCount; start_idx++) { + sRailNodeData * next_node = node + 1; + s16 i8 = (next_node->mX >> 4) - (node->mX >> 4); + s16 i7 = (next_node->mY >> 4) - (node->mY >> 4); + + s32 i4 = abs(i8); + s32 i13 = (s16)i4; + i4 = abs(i7); + i4 = (s16)i4; + + u8 b5 = 0; + u8 b6 = 0; + + if (i8 < 1) { + if (i8 < 0) { + b5 = 3; + } + } else { + b5 = 4; + } + + if (i7 < 0) { + b6 = 1; + } else if (i7 > 0) { + b6 = 2; + } + + i7 = 0; + if (i4 < i13) { + i8 = 0; + if (i4 > 0) { + if (i4 > 8) { + bool b2 = false; + if ((i4 > -1) && (i4 < 0x7FFFFFFF)) { + b2 = true; + } + + if (b2) { + u32 u15 = ((u32)(i4 - 1)) >> 3; + + if (u15 > 0) { + do { + u32 idx = i11 + i7; + i7 += 0x10; + i8 += 8; + + mpTravelInfo[idx ] = b5; + mpTravelInfo[idx + 1] = b5; + mpTravelInfo[idx + 2] = b5; + mpTravelInfo[idx + 3] = b5; + mpTravelInfo[idx + 4] = b5; + mpTravelInfo[idx + 5] = b5; + mpTravelInfo[idx + 6] = b5; + mpTravelInfo[idx + 7] = b5; + mpTravelInfo[idx + 8] = b5; + mpTravelInfo[idx + 9] = b5; + mpTravelInfo[idx + 10] = b5; + mpTravelInfo[idx + 11] = b5; + mpTravelInfo[idx + 12] = b5; + mpTravelInfo[idx + 13] = b5; + mpTravelInfo[idx + 14] = b5; + mpTravelInfo[idx + 15] = b5; + + u15--; + } while (u15 != 0); + } + } + int i9 = i4 - i8; + if (i9 > 0) { + while (i9 != 0) { + int i8 = i11 + i7; + i7 += 2; + mpTravelInfo[i8] = b5; + mpTravelInfo[i8 + 1] = b5; + } + } + } + i13 -= i4; + i4 = 0; + if (i13 > 0) { + if (i13 > 8) { + bool b2 = false; + if ((i13 > -1) && (i13 < 0x7FFFFFFF)) { + b2 = true; + } + if (b2) { + int u15 = (i13 - 1) >> 3; + if (u15 > 0) { + while (u15 != 0) { + int i8 = i11 + i7; + i7 += 8; + i4 += 8; + mpTravelInfo[i8] = b5; + mpTravelInfo[i8 + 1] = b5; + mpTravelInfo[i8 + 2] = b5; + mpTravelInfo[i8 + 3] = b5; + mpTravelInfo[i8 + 4] = b5; + mpTravelInfo[i8 + 5] = b5; + mpTravelInfo[i8 + 6] = b5; + mpTravelInfo[i8 + 7] = b5; + u15--; + } + } + } + } + i8 = i13 - i4; + if (i4 < i13) { + do { + i4 = i11 + i7; + i7++; + mpTravelInfo[i4] = b5; + i8--; + } while (i8 != 0); + } + } + } + } else { + i8 = 0; + if (i13 > 0) { + if (i13 > 8) { + bool b2 = false; + if ((i13 > -1) && (i13 < 0x7FFFFFFF)) { + b2 = true; + } + if (b2) { + u32 u15 = ((u32)(i13 - 1)) >> 3; + if (u15 > 0) { + do { + int i9 = i11 + i7; + i7 += 16; + i8 += 8; + mpTravelInfo[i9 ] = b5; + mpTravelInfo[i9 + 1] = b5; + mpTravelInfo[i9 + 2] = b5; + mpTravelInfo[i9 + 3] = b5; + mpTravelInfo[i9 + 4] = b5; + mpTravelInfo[i9 + 5] = b5; + mpTravelInfo[i9 + 6] = b5; + mpTravelInfo[i9 + 7] = b5; + mpTravelInfo[i9 + 8] = b5; + mpTravelInfo[i9 + 9] = b5; + mpTravelInfo[i9 + 10] = b5; + mpTravelInfo[i9 + 11] = b5; + mpTravelInfo[i9 + 12] = b5; + mpTravelInfo[i9 + 13] = b5; + mpTravelInfo[i9 + 14] = b5; + mpTravelInfo[i9 + 15] = b5; + u15--; + } while (u15 != 0); + } + } + int i9 = i13 - i8; + if (i8 < i13) { + while (i9 != 0) { + i8 = i11 + i7; + i7 += 2; + mpTravelInfo[i8] = b5; + mpTravelInfo[i8 + 1] = b5; + i9--; + } + } + } + } + i4 -= i13; + i13 = 0; + if (i4 > 0) { + if (i4 > 8) { + bool b2 = false; + if ((i4 > -1) && (i4 < 0x7FFFFFFF)) { + b2 = true; + } + + if (b2) { + u32 u15 = (u32)(i4 - 1) >> 3; + if (u15 > 0) { + while (u15 != 0) { + i8 = i11 + i7; + i7 += 8; + i13 += 8; + mpTravelInfo[i8] = b6; + mpTravelInfo[i8 + 1] = b6; + mpTravelInfo[i8 + 2] = b6; + mpTravelInfo[i8 + 3] = b6; + mpTravelInfo[i8 + 4] = b6; + mpTravelInfo[i8 + 5] = b6; + mpTravelInfo[i8 + 6] = b6; + mpTravelInfo[i8 + 7] = b6; + u15--; + } + } + } + } + + i8 = i4 - i13; + if (i8 > 0) { + while (i8 != 0) { + i4 = i11 + i7; + i7++; + i8--; + mpTravelInfo[i4] = b6; + } + } + } + } + + node += 1; + i11 += i7; + } + + mpTravelInfo[0] = 0; + mpTravelInfo[dist + 1] = 0; +} + +void daEnSnakeBlock_c::setBlockPos() { + for (int i = 0; i < mBlockNum - 1; i++) { + dBlock_c &a = mBlocks[mBlockNum - 1 - i]; + dBlock_c &b = mBlocks[mBlockNum - 2 - i]; + + b.mPos = a.mPos; + } + + mBlocks[0].mPos = mVec3_c(mHead.mPos, 1500.0f); +} + +void daEnSnakeBlock_c::setActorPos() { + mPos = mVec3_c(mHead.mPos, 1500.0f); +} + +bool daEnSnakeBlock_c::chkCollapseDelete() { + return mTail.mPos.y < (dBgParameter_c::ms_Instance_p->mPos.y - dBgParameter_c::ms_Instance_p->mSize.y) - 16.0f; +} + +bool daEnSnakeBlock_c::chkOffScreen() { + if (mStateMgr.getStateID() == &StateID_Wait) { + return false; + } + return ( + dBgParameter_c::ms_Instance_p->mPos.x + + dBgParameter_c::ms_Instance_p->mSize.x + 512.0f + <= mPos.x + ); +} + +void daEnSnakeBlock_c::initializeState_Wait() {} +void daEnSnakeBlock_c::finalizeState_Wait() {} +void daEnSnakeBlock_c::executeState_Wait() {} + +void daEnSnakeBlock_c::initializeState_Move() { + mHead.setAnmClr("create"); + mHead.mAnmClr.setRate(0.0f, 0); + mHead.mAnmClr.setFrame(25.0f, 0); + mTail.setAnmClr("ridden"); + + mBlocks[0].setAnmClr("create"); + for (int i = 0; i < mBlockNum; i++) { + mBlocks[i].setAnmClr("ridden"); + } + + mHead.mLastPos = mHead.mPos; + mTail.mLastPos = mTail.mPos; + + mCreateAnmBlockIdx = 0; + float f = mHead.mAnmClr.getFrameMax(0); + mCreateAnmBlockNum = f / (16.0f / sc_snakeSpeeds[mParam >> 8 & 0xF]); +} +void daEnSnakeBlock_c::finalizeState_Move() {} +void daEnSnakeBlock_c::executeState_Move() { + bool b3 = mHead.calcPos(mpTravelInfo); + bool b4 = mTail.calcPos(mpTravelInfo); + bool b5 = false; + bool b6 = false; + + if (b3 || b4) { + b5 = mHead.calcTravelPos(mpTravelInfo); + b6 = mTail.calcTravelPos(mpTravelInfo); + + dAudio::SoundEffectID_t(SE_OBJ_SNAKE_BLOCK).playMapSound(mPos, 0); + + setBlockPos(); + mCreateAnmBlockIdx++; + if (mCreateAnmBlockNum < mCreateAnmBlockIdx) { + mCreateAnmBlockIdx = mCreateAnmBlockNum; + } + + int frame_idx = 0; + int frame_delta = (int)(16.0f / sc_snakeSpeeds[(mParam >> 8) & 0xF]); + + for (int i = 0; i < mCreateAnmBlockIdx; i++) { + mBlocks[i].setAnmClr("create"); + mBlocks[i].mAnmClr.setFrame(frame_idx, 0); + frame_idx += frame_delta; + } + } + + if (b5 || b6) { + if (mpStopState->isEqual(StateID_Stop)) { + changeState(StateID_Stop); + } else { + changeState(StateID_Shake); + } + } +} + +void daEnSnakeBlock_c::initializeState_Shake() { + mHead.setAnmClr("ridden"); + mHead.mAnmClr.setRate(0.0f, 0); + mTail.setAnmClr("ridden"); + mTail.mAnmClr.setRate(0.0f, 0); + + for (int i = 0; i < mBlockNum; i++) { + mBlocks[i].setAnmClr("ridden"); + mBlocks[i].mAnmClr.setRate(0.0f, 0); + } + + mShakeTime = 60; +} +void daEnSnakeBlock_c::finalizeState_Shake() {} +void daEnSnakeBlock_c::executeState_Shake() { + if (--mShakeTime == 0) { + changeState(*mpStopState); + } +} + +void daEnSnakeBlock_c::initializeState_Stop() { + mHead.setAnmClr("ridden"); + mHead.mAnmClr.setRate(0.0f, 0); + mTail.setAnmClr("ridden"); + mTail.mAnmClr.setRate(0.0f, 0); + + for (int i = 0; i < mBlockNum; i++) { + mBlocks[i].setAnmClr("ridden"); + mBlocks[i].mAnmClr.setRate(0.0f, 0); + } +} +void daEnSnakeBlock_c::finalizeState_Stop() {} +void daEnSnakeBlock_c::executeState_Stop() {} + +void daEnSnakeBlock_c::initializeState_Collapse1() { + static float floats[] = { + 0.0f, 0.0f, 1.0f, 3.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f + }; + + mHead.mLastPos = mHead.mPos; + mTail.mLastPos = mTail.mPos; + for (int i = 0; i < mBlockNum; i++) { + mBlocks[i].mLastPos = mBlocks[i].mPos; + } + int prev_idx = mHead.mTravelInfoIdx; + for (int i = 0; i < mBlockNum; i++) { + mBlocks[i].mTravelInfoIdx = prev_idx; + prev_idx--; + } + mTail.mTravelInfoIdx = prev_idx; + + mVec3_c collapse_speed = mVec3_c(sc_collapseSpeeds[mpTravelInfo[mTravelInfoIdx]], 0.0f); + mHead.mSpeed = collapse_speed; + mTail.mSpeed = collapse_speed; + for (int i = 0; i < mBlockNum; i++) { + mBlocks[i].mSpeed = collapse_speed; + } +} +void daEnSnakeBlock_c::finalizeState_Collapse1() {} +void daEnSnakeBlock_c::executeState_Collapse1() { + mHead.calcCollapse1(mpTravelInfo); + mTail.calcCollapse1(mpTravelInfo); + for (int i = 0; i < mBlockNum; i++) { + mBlocks[i].calcCollapse1(mpTravelInfo); + } + + if (chkCollapseDelete()) { + deleteActor(1); + } +} + +void daEnSnakeBlock_c::initializeState_Collapse2() { + mCollapse2Idx = 0; + mHead.mSpeed = mVec3_c(0.0f, 0.0f, 0.0f); + mTail.mSpeed = mVec3_c(0.0f, 0.0f, 0.0f); + for (int i = 0; i < mBlockNum; i++) { + mBlocks[i].mSpeed = mVec3_c(0.0f, 0.0f, 0.0f); + } +} +void daEnSnakeBlock_c::finalizeState_Collapse2() {} +void daEnSnakeBlock_c::executeState_Collapse2() { + if (mHead.mBgCtr.m_dc) { + mHead.mBgCtr.release(); + } + mHead.setFallCollapse(); + mHead.mPos += mHead.mSpeed; + + if (mCollapse2Idx > mBlockNum * 8) { + if (mTail.mBgCtr.m_dc) { + mTail.mBgCtr.release(); + } + mTail.setFallCollapse(); + mTail.mPos += mTail.mSpeed; + } + + int i5 = mCollapse2Idx >> 3; + int i6 = mBlockNum - 1; + if (i5 > i6) { + i5 = i6; + } + + for (int i = 0; i <= i5; i++) { + dBlock_c * block = &mBlocks[i]; + block->mBgCtr.release(); //< double release? + if (block->mBgCtr.m_dc) { + block->mBgCtr.release(); + } + block->setFallCollapse(); + block->mPos += block->mSpeed; + } + + mCollapse2Idx++; + if (chkCollapseDelete()) { + deleteActor(1); + } +} + +void daEnSnakeBlock_c::initializeState_Collapse3() { + mHead.mSpeed = mVec3_c(0.0f, 0.0f, 0.0f); + mTail.mSpeed = mVec3_c(0.0f, 0.0f, 0.0f); + for (int i = 0; i < mBlockNum; i++) { + mBlocks[i].mSpeed = mVec3_c(0.0f, 0.0f, 0.0f); + } +} +void daEnSnakeBlock_c::finalizeState_Collapse3() {} +void daEnSnakeBlock_c::executeState_Collapse3() { + if (mHead.mBgCtr.m_dc) { + mHead.mBgCtr.release(); + } + mHead.setFallCollapse(); + mHead.mPos += mHead.mSpeed; + + if (mTail.mBgCtr.m_dc) { + mTail.mBgCtr.release(); + } + mTail.setFallCollapse(); + mTail.mPos += mTail.mSpeed; + + for (int i = 0; i < mBlockNum; i++) { + if (mBlocks[i].mBgCtr.m_dc) { + mBlocks[i].mBgCtr.release(); + } + mBlocks[i].setFallCollapse(); + mBlocks[i].mPos += mBlocks[i].mSpeed; + } + + if (chkCollapseDelete()) { + deleteActor(1); + } +} From ef8738d30a0cb2a97ade90a25ceb02241cceca90 Mon Sep 17 00:00:00 2001 From: user Date: Sun, 22 Mar 2026 20:22:25 +0100 Subject: [PATCH 02/15] Add remaining functions, fix compile Still not matching, but at least it compiles properly now --- include/game/bases/d_a_en_snake_block.hpp | 25 ++- .../d_enemiesNP/bases/d_a_en_snake_block.cpp | 198 ++++++++++++++++-- syms.txt | 7 + 3 files changed, 205 insertions(+), 25 deletions(-) diff --git a/include/game/bases/d_a_en_snake_block.hpp b/include/game/bases/d_a_en_snake_block.hpp index e060c988..b381a93f 100644 --- a/include/game/bases/d_a_en_snake_block.hpp +++ b/include/game/bases/d_a_en_snake_block.hpp @@ -22,6 +22,10 @@ class dBg_ctr_c { int m_e0; void release(); + void entry(); + void set(dActor_c *, float, float, float, float, void *, void *, void *, int, int, void *); + void calc(); + void setOfs(float, float, float, float, void *); }; class daEnSnakeBlock_c : public dEn_c { @@ -30,7 +34,7 @@ class daEnSnakeBlock_c : public dEn_c { class dBlock_c { public: dBlock_c(); - virtual ~dBlock_c(); + virtual ~dBlock_c() {} void createMdl(dHeapAllocator_c *alloc); void doDelete(); @@ -38,7 +42,7 @@ class daEnSnakeBlock_c : public dEn_c { void calcAnm(); void setAnmClr(const char *name); - void draw(mVec3_c pos); + void draw(mVec3_c *pos); void initBgCtr(daEnSnakeBlock_c *parent, mVec3_c *blockPos, int unused); void calcBgCtr(); @@ -71,7 +75,7 @@ class daEnSnakeBlock_c : public dEn_c { class dCtrlBlock_c : public dBlock_c { public: dCtrlBlock_c(); - virtual ~dCtrlBlock_c(); + virtual ~dCtrlBlock_c() {} bool calcPos(u8 *travelInfo); bool calcTravelPos(u8 *travelInfo); @@ -80,14 +84,13 @@ class daEnSnakeBlock_c : public dEn_c { }; daEnSnakeBlock_c(); - ~daEnSnakeBlock_c(); + virtual ~daEnSnakeBlock_c() {} - int create(); - int doDelete(); - int execute(); - int draw(); - - void deleteReady(); + virtual int create(); + virtual int doDelete(); + virtual int execute(); + virtual int draw(); + virtual void deleteReady(); void initBlock(); void initBlockPath(); @@ -126,7 +129,7 @@ class daEnSnakeBlock_c : public dEn_c { u8 _pad[4]; static float sc_snakeSpeeds[3]; - static sStateID_c *sc_stopStates; + static sStateID_c *sc_stopStates[4]; static mVec2_c sc_ctrlPosMods[5]; static int sc_glbSnakeNum; static mVec2_c sc_collapseSpeeds[5]; diff --git a/source/d_enemiesNP/bases/d_a_en_snake_block.cpp b/source/d_enemiesNP/bases/d_a_en_snake_block.cpp index e321d915..e049512f 100644 --- a/source/d_enemiesNP/bases/d_a_en_snake_block.cpp +++ b/source/d_enemiesNP/bases/d_a_en_snake_block.cpp @@ -5,29 +5,199 @@ #include #include #include +#include #include ACTOR_PROFILE(EN_SNAKEBLOCK, daEnSnakeBlock_c, 0) STATE_DEFINE(daEnSnakeBlock_c, Wait); STATE_DEFINE(daEnSnakeBlock_c, Move); +STATE_DEFINE(daEnSnakeBlock_c, Shake); +STATE_DEFINE(daEnSnakeBlock_c, Stop); +STATE_DEFINE(daEnSnakeBlock_c, Collapse1); +STATE_DEFINE(daEnSnakeBlock_c, Collapse2); +STATE_DEFINE(daEnSnakeBlock_c, Collapse3); + +float daEnSnakeBlock_c::sc_snakeSpeeds[3] = { + 0.5f, 1.0f, 1.4f +}; + +sStateID_c * daEnSnakeBlock_c::sc_stopStates[4] = { + &StateID_Stop, &StateID_Collapse1, &StateID_Collapse2, &StateID_Collapse3 +}; + +int daEnSnakeBlock_c::sc_glbSnakeNum = 0; + +mVec2_c daEnSnakeBlock_c::sc_ctrlPosMods[5] = { + mVec2_c(0.0f, 0.0f), + mVec2_c(0.0f, 0.0f), + mVec2_c(0.0f, 0.0f), + mVec2_c(0.0f, 0.0f), + mVec2_c(0.0f, 0.0f) +}; +mVec2_c daEnSnakeBlock_c::sc_collapseSpeeds[5] = { + mVec2_c(0.0f, 0.0f), + mVec2_c(0.0f, 0.0f), + mVec2_c(0.0f, 0.0f), + mVec2_c(0.0f, 0.0f), + mVec2_c(0.0f, 0.0f) +}; + daEnSnakeBlock_c::daEnSnakeBlock_c() {} daEnSnakeBlock_c::dBlock_c::dBlock_c() {} daEnSnakeBlock_c::dCtrlBlock_c::dCtrlBlock_c() {} +void daEnSnakeBlock_c::dBlock_c::createMdl(dHeapAllocator_c * alloc) { + mResFile = dResMng_c::m_instance->getRes("block_snake_ice", "g3d/block_snake_ice.brres"); -static float daEnSnakeBlock_c::sc_snakeSpeeds[3] = { - 0.5f, 1.0f, 1.4f -}; + nw4r::g3d::ResMdl mdl = mResFile.GetResMdl("block_snake_ice"); + mModel.create(mdl, alloc, 0x32c, 1); + dActor_c::setSoftLight_MapObj(mModel); -static sStateID_c * daEnSnakeBlock_c::sc_stopStates[4] = { - StateID_Stop, StateID_Collapse1, StateID_Collapse2, StateID_Collapse3 -}; + mResTexSrt = mResFile.GetResAnmTexSrt("block_snake_ice"); + mAnmTexSrt.create(mdl, mResTexSrt, alloc, nullptr, 1); + mAnmTexSrt.setAnm(mModel, mResTexSrt, 0, m3d::FORWARD_LOOP); + mModel.setAnm(mAnmTexSrt, 0.0f); + mAnmTexSrt.setRate(1.0f, 0); + + nw4r::g3d::ResAnmClr res_anmclr = mResFile.GetResAnmClr("ridden"); + mAnmClr.setAnm(mModel, res_anmclr, 0, m3d::FORWARD_ONCE); + mModel.setAnm(mAnmClr); + mAnmClr.setRate(0.0f, 0); +} + +void daEnSnakeBlock_c::dBlock_c::doDelete() { + mModel.remove(); + mAnmClr.remove(); + mAnmTexSrt.remove(); +} + +void daEnSnakeBlock_c::dBlock_c::calcAnm() { + mAnmClr.play(); + mAnmTexSrt.play(); +} + +void daEnSnakeBlock_c::dBlock_c::setAnmClr(const char * name) { + nw4r::g3d::ResAnmClr res = mResFile.GetResAnmClr(name); + mAnmClr.setAnm(mModel, res, 0, m3d::FORWARD_ONCE); + mModel.setAnm(mAnmClr); + mAnmClr.setRate(1.0f, 0); +} + +void daEnSnakeBlock_c::dBlock_c::draw(mVec3_c * pos) { + mVec3_c a = mPos + *pos; + dActor_c::changePosAngle(&a, nullptr, 1); + + nw4r::math::MTX34 b; + PSMTXTrans(b, a.x, a.y, a.z); + mModel.setLocalMtx(&b); + + mVec3_c one = mVec3_c(1.0f, 1.0f, 1.0f); + mModel.setScale(one); + mModel.calc(false); + mModel.entry(); +} + +void daEnSnakeBlock_c::dBlock_c::initBgCtr(daEnSnakeBlock_c * owner, mVec3_c * pos, int _unused) { + mPos = *pos; + if (mpOwner == nullptr) { + mpOwner = owner; + } -static mVec2_c daEnSnakeBlock_c::sc_ctrlPosMods[5]; -static int daEnSnakeBlock_c::sc_glbSnakeNum = 0; -static mVec2_c daEnSnakeBlock_c::sc_collapseSpeeds[5]; + mVec2_c diff = mVec2_c(mPos) - mVec2_c(mpOwner->mPos); + + mBgCtr.set(mpOwner, diff.x - 8.0f, diff.y + 8.0f, diff.x + 8.0f, diff.y - 8.0f, + callBackF, callBackH, callBackW, 1, 0, nullptr + ); + // The unused flag was probably used to set the collision to icy before they + // decided to always make it icy. + /* if (_unused) { */ + mBgCtr.mFlags = 4; + /* } */ + mBgCtr.entry(); +} + +void daEnSnakeBlock_c::dBlock_c::calcBgCtr() { + mVec2_c diff = mVec2_c(mPos) - mVec2_c(mpOwner->mPos); + mBgCtr.setOfs(diff.x - 8.0f, diff.y + 8.0f, diff.x + 8.0f, diff.y - 8.0f, nullptr); + mBgCtr.mFlags |= 2; + mBgCtr.calc(); +} + +void daEnSnakeBlock_c::dBlock_c::setFallCollapse() { + mSpeed.y -= 0.1875f; + if (mSpeed.y < -4.0f) { + mSpeed.y = -4.0f; + } +} + +void daEnSnakeBlock_c::dBlock_c::calcCollapse1(u8 *travelInfo) { + static mVec2_c floats[] = { + mVec2_c(0.0f, 0.0f), + mVec2_c(0.0f, 2.0f), + mVec2_c(0.0f, -2.0f), + mVec2_c(-2.0f, 0.0f), + mVec2_c(2.0f, 0.0f) + }; + + if (mBgCtr.m_dc) { + mBgCtr.release(); + } + + u32 info = travelInfo[mTravelInfoIdx]; + if (info == 0) { + setFallCollapse(); + mPos += mSpeed; + } else { + mVec2_c x = mVec2_c(mPos) + floats[info]; + mPos.x = x.x; + mPos.y = x.y; + if ((mPos - mLastPos).xzLen() >= 16.0f) { + mLastPos = mPos; + mTravelInfoIdx += 1; + } + } +} + +void daEnSnakeBlock_c::dBlock_c::callBackF(dActor_c * self, dActor_c * other) { + bool x = false; + if (other->mKind == dActor_c::STAGE_ACTOR_PLAYER) { + x = true; + } else if ((other->mKind == dActor_c::STAGE_ACTOR_YOSHI) && (*other->getPlrNo() != -1)) { + x = true; + } + daEnSnakeBlock_c* y = (daEnSnakeBlock_c *)self; + if (x && (y->mStateMgr.getStateID() == &StateID_Wait)) { + y->changeState(StateID_Move); + } +} + +void daEnSnakeBlock_c::dBlock_c::callBackH(dActor_c * self, dActor_c * other) {} +void daEnSnakeBlock_c::dBlock_c::callBackW(dActor_c * self, dActor_c * other, unsigned char x) {} + +bool daEnSnakeBlock_c::dCtrlBlock_c::calcPos(u8 *travelInfo) { + mVec2_c pos_mod = sc_ctrlPosMods[travelInfo[mTravelInfoIdx]]; + mPos.x += sc_snakeSpeeds[mSnakeSpeedIdx] * pos_mod.x; + mPos.y += sc_snakeSpeeds[mSnakeSpeedIdx] * pos_mod.y; + + return (std::fabs(mPos.x - mLastPos.x) >= 16.0f) || (std::fabs(mPos.y - mLastPos.y) >= 16.0f); +} + +bool daEnSnakeBlock_c::dCtrlBlock_c::calcTravelPos(u8 *travelInfo) { + mVec2_c x = sc_ctrlPosMods[travelInfo[mTravelInfoIdx]]; + mTravelInfoIdx++; + x.x *= 16.0f; + x.y *= 16.0f; + x += mVec2_c(mLastPos); + + mPos.x = x.x; + mPos.y = x.y; + mLastPos.x = x.x; + mLastPos.y = x.y; + + return travelInfo[mTravelInfoIdx] == 0; +} int daEnSnakeBlock_c::create() { if (sc_glbSnakeNum >= 1 && (((mParam >> 0xC) & 0xFF) != 0)) { @@ -63,16 +233,16 @@ int daEnSnakeBlock_c::execute() { } int daEnSnakeBlock_c::draw() { - mVec3_c offset = mVec3_c(0.0f, 0.0f, 0.0f); + mVec3_c offset = mVec3_c::Zero; if (mShakeTime > 0) { offset.x = 0.0f + sc_snakeSpeeds[(mShakeTime >> 1) & 1]; } - mHead.draw(offset); - mTail.draw(offset); + mHead.draw(&offset); + mTail.draw(&offset); for (int i = 0; i < mBlockNum; i++) { - mBlocks[i].draw(offset); + mBlocks[i].draw(&offset); } return SUCCEEDED; @@ -157,7 +327,7 @@ void daEnSnakeBlock_c::deleteBlock() { } void daEnSnakeBlock_c::setStopState() { - mpStopState = &sc_stopStates[mParam >> 0x1c]; + mpStopState = sc_stopStates[mParam >> 0x1c]; } void daEnSnakeBlock_c::calcBgCtr() { diff --git a/syms.txt b/syms.txt index 69365d8c..2e46f91f 100644 --- a/syms.txt +++ b/syms.txt @@ -699,3 +699,10 @@ smc_SCORE_Y__11dScoreMng_c=0x8042CF6C c_CASTLE_ID__10dCsvData_c=0x8042D24C c_START_ID__10dCsvData_c=0x8042D264 c_PLAYNUM_DIGIT__14dGameDisplay_c=0x8042DE90 +GetResAnmClr__Q34nw4r3g3d7ResFileCFPCc=0x8023a2d0 +release__9dBg_ctr_cFv=0x8007f950 +GetResAnmTexSrt__Q34nw4r3g3d7ResFileCFPCc=0x8023a3b0 +setOfs__9dBg_ctr_cFffffPv=0x8007fbf0 +calc__9dBg_ctr_cFv=0x8007fda0 +entry__9dBg_ctr_cFv=0x8007f900 +set__9dBg_ctr_cFP8dActor_cffffPvPvPviiPv=0x8007fa40 From 6d8f001dca8b9d9c088fc799f95ecfeb89263b30 Mon Sep 17 00:00:00 2001 From: RootCubed Date: Sun, 22 Mar 2026 21:36:07 +0100 Subject: [PATCH 03/15] Mark slice as non-matching and add check in prepare_objdiff.py --- prepare_objdiff.py | 7 +++++++ slices/d_enemiesNP.json | 2 -- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/prepare_objdiff.py b/prepare_objdiff.py index 05c08d93..908d66d5 100644 --- a/prepare_objdiff.py +++ b/prepare_objdiff.py @@ -106,6 +106,13 @@ def get_dtk(tag: str) -> str: '.sdata2': 'bss', } +# Step 0: Verify that the built binaries match by running progress.py silently +ret_code = subprocess.run(['python', 'progress.py', '--verify-bin'], stdout=subprocess.DEVNULL).returncode + +if ret_code != 0: + print_err('Verification of binaries failed. Did you forget to add "nonMatching": true to the slice?') + sys.exit() + # Step 1: Get DTK, load slices and symbols dtk_path = get_dtk('v1.8.0') diff --git a/slices/d_enemiesNP.json b/slices/d_enemiesNP.json index 942b3aca..514a285a 100644 --- a/slices/d_enemiesNP.json +++ b/slices/d_enemiesNP.json @@ -30,14 +30,12 @@ "slices": [ { "source": "runtime/rel_init.cpp", - "compilerFlags": "", "memoryRanges": { ".text": "0x0-0x70" } }, { "source": "d_enemiesNP/bases/d_a_en_snake_block.cpp", - "compilerFlags": "", "memoryRanges": { ".text": "0x103a50-0x106960", ".data": "0x33680-0x33b90", From 19e1e0d0699199af3b3d1e29ce6b34323249f6ce Mon Sep 17 00:00:00 2001 From: RootCubed Date: Sun, 22 Mar 2026 21:38:02 +0100 Subject: [PATCH 04/15] Actually mark it as non-matching --- slices/d_enemiesNP.json | 1 + 1 file changed, 1 insertion(+) diff --git a/slices/d_enemiesNP.json b/slices/d_enemiesNP.json index 514a285a..8b8eb6da 100644 --- a/slices/d_enemiesNP.json +++ b/slices/d_enemiesNP.json @@ -36,6 +36,7 @@ }, { "source": "d_enemiesNP/bases/d_a_en_snake_block.cpp", + "nonMatching": true, "memoryRanges": { ".text": "0x103a50-0x106960", ".data": "0x33680-0x33b90", From 383d06713baff3140c47821a8ef8386de68afd10 Mon Sep 17 00:00:00 2001 From: RootCubed Date: Mon, 23 Mar 2026 16:45:18 +0100 Subject: [PATCH 05/15] Add constructor for m3d::anm... classes --- include/game/mLib/m_3d/anm_mat_clr.hpp | 3 +- include/game/mLib/m_3d/anm_tex_pat.hpp | 3 +- include/game/mLib/m_3d/anm_tex_srt.hpp | 3 +- source/dol/mLib/m_3d/anm_mat_clr.cpp | 38 +++++++++++++------------- source/dol/mLib/m_3d/anm_tex_pat.cpp | 36 ++++++++++++------------ source/dol/mLib/m_3d/anm_tex_srt.cpp | 38 +++++++++++++------------- 6 files changed, 62 insertions(+), 59 deletions(-) diff --git a/include/game/mLib/m_3d/anm_mat_clr.hpp b/include/game/mLib/m_3d/anm_mat_clr.hpp index d5aec51e..48d42481 100644 --- a/include/game/mLib/m_3d/anm_mat_clr.hpp +++ b/include/game/mLib/m_3d/anm_mat_clr.hpp @@ -6,6 +6,7 @@ namespace m3d { class anmMatClr_c : public banm_c { public: + anmMatClr_c() : mpChildren(nullptr) {} virtual ~anmMatClr_c(); virtual void remove(); virtual void play(); @@ -38,6 +39,6 @@ namespace m3d { void setFrmCtrlDefault(nw4r::g3d::ResAnmClr &anmClr, m3d::playMode_e playMode); }; - child_c *children; + child_c *mpChildren; }; } diff --git a/include/game/mLib/m_3d/anm_tex_pat.hpp b/include/game/mLib/m_3d/anm_tex_pat.hpp index 982340cf..01cf7ac7 100644 --- a/include/game/mLib/m_3d/anm_tex_pat.hpp +++ b/include/game/mLib/m_3d/anm_tex_pat.hpp @@ -6,6 +6,7 @@ namespace m3d { class anmTexPat_c : public banm_c { public: + anmTexPat_c() : mpChildren(nullptr) {} virtual ~anmTexPat_c(); virtual void remove(); virtual void play(); @@ -38,6 +39,6 @@ namespace m3d { void setFrmCtrlDefault(nw4r::g3d::ResAnmTexPat &anmTexPat, m3d::playMode_e playMode); }; - child_c *children; + child_c *mpChildren; }; } diff --git a/include/game/mLib/m_3d/anm_tex_srt.hpp b/include/game/mLib/m_3d/anm_tex_srt.hpp index f2b7c7ab..3b69bdd0 100644 --- a/include/game/mLib/m_3d/anm_tex_srt.hpp +++ b/include/game/mLib/m_3d/anm_tex_srt.hpp @@ -6,6 +6,7 @@ namespace m3d { class anmTexSrt_c : public banm_c { public: + anmTexSrt_c() : mpChildren(nullptr) {} virtual ~anmTexSrt_c(); virtual void remove(); virtual void play(); @@ -38,6 +39,6 @@ namespace m3d { void setFrmCtrlDefault(nw4r::g3d::ResAnmTexSrt &anmTexSrt, m3d::playMode_e playMode); }; - child_c *children; + child_c *mpChildren; }; } diff --git a/source/dol/mLib/m_3d/anm_mat_clr.cpp b/source/dol/mLib/m_3d/anm_mat_clr.cpp index 0bc16cc8..bfcb457f 100644 --- a/source/dol/mLib/m_3d/anm_mat_clr.cpp +++ b/source/dol/mLib/m_3d/anm_mat_clr.cpp @@ -84,11 +84,11 @@ bool m3d::anmMatClr_c::create(nw4r::g3d::ResMdl mdl, nw4r::g3d::ResAnmClr anmClr } mpObj = nw4r::g3d::AnmObjMatClrOverride::Construct(&mAllocator, nullptr, mdl, count); - children = (m3d::anmMatClr_c::child_c *) MEMAllocFromAllocator(&mAllocator, nw4r::ut::RoundUp(count * sizeof(child_c), 0x20)); + mpChildren = (m3d::anmMatClr_c::child_c *) MEMAllocFromAllocator(&mAllocator, nw4r::ut::RoundUp(count * sizeof(child_c), 0x20)); nw4r::g3d::AnmObjMatClrOverride *matClrOverride = nw4r::g3d::G3dObj::DynamicCast(mpObj); - child_c *child = &children[0]; + child_c *child = &mpChildren[0]; for (int i = 0; i < count; i++) { new(child) child_c(); if (!child->create(mdl, anmClr, &mAllocator, nullptr)) { @@ -112,12 +112,12 @@ m3d::anmMatClr_c::~anmMatClr_c() { void m3d::anmMatClr_c::remove() { nw4r::g3d::AnmObjMatClrOverride *matClr = nw4r::g3d::G3dObj::DynamicCast(mpObj); - if (matClr != nullptr && children != nullptr) { + if (matClr != nullptr && mpChildren != nullptr) { int count = matClr->Size(); for (int i = 0; i < count; i++) { - children[i].remove(); + mpChildren[i].remove(); } - children = nullptr; + mpChildren = nullptr; } banm_c::remove(); } @@ -125,15 +125,15 @@ void m3d::anmMatClr_c::remove() { void m3d::anmMatClr_c::setAnm(m3d::bmdl_c &mdl, nw4r::g3d::ResAnmClr clr, long idx, m3d::playMode_e playMode) { nw4r::g3d::AnmObjMatClrOverride *matClr = nw4r::g3d::G3dObj::DynamicCast(mpObj); matClr->Detach(idx); - children[idx].setAnm(mdl, clr, playMode); - nw4r::g3d::AnmObjMatClrRes *clrRes = nw4r::g3d::G3dObj::DynamicCast(children[idx].getObj()); + mpChildren[idx].setAnm(mdl, clr, playMode); + nw4r::g3d::AnmObjMatClrRes *clrRes = nw4r::g3d::G3dObj::DynamicCast(mpChildren[idx].getObj()); matClr->Attach(idx, clrRes); } void m3d::anmMatClr_c::releaseAnm(long idx) { nw4r::g3d::AnmObjMatClrOverride *matClr = nw4r::g3d::G3dObj::DynamicCast(mpObj); matClr->Detach(idx); - children[idx].releaseAnm(); + mpChildren[idx].releaseAnm(); } void m3d::anmMatClr_c::play() { @@ -145,43 +145,43 @@ void m3d::anmMatClr_c::play() { } void m3d::anmMatClr_c::play(long idx) { - if (children[idx].IsBound()) { - children[idx].play(); + if (mpChildren[idx].IsBound()) { + mpChildren[idx].play(); } } float m3d::anmMatClr_c::getFrame(long idx) const { - return children[idx].getFrame(); + return mpChildren[idx].getFrame(); } void m3d::anmMatClr_c::setFrame(float frame, long idx) { - children[idx].setFrame(frame); + mpChildren[idx].setFrame(frame); } float m3d::anmMatClr_c::getRate(long idx) const { - return children[idx].getRate(); + return mpChildren[idx].getRate(); } void m3d::anmMatClr_c::setRate(float rate, long idx) { - children[idx].setRate(rate); + mpChildren[idx].setRate(rate); } bool m3d::anmMatClr_c::isStop(long idx) const { - return children[idx].isStop(); + return mpChildren[idx].isStop(); } bool m3d::anmMatClr_c::checkFrame(float frame, long idx) const { - return children[idx].checkFrame(frame); + return mpChildren[idx].checkFrame(frame); } void m3d::anmMatClr_c::setPlayMode(m3d::playMode_e playMode, long idx) { - children[idx].mPlayMode = playMode; + mpChildren[idx].mPlayMode = playMode; } float m3d::anmMatClr_c::getFrameMax(long idx) const { - return children[idx].mFrameMax; + return mpChildren[idx].mFrameMax; } float m3d::anmMatClr_c::getFrameStart(long idx) const { - return children[idx].mFrameStart; + return mpChildren[idx].mFrameStart; } diff --git a/source/dol/mLib/m_3d/anm_tex_pat.cpp b/source/dol/mLib/m_3d/anm_tex_pat.cpp index 87efc838..d070001a 100644 --- a/source/dol/mLib/m_3d/anm_tex_pat.cpp +++ b/source/dol/mLib/m_3d/anm_tex_pat.cpp @@ -85,11 +85,11 @@ bool m3d::anmTexPat_c::create(nw4r::g3d::ResMdl mdl, nw4r::g3d::ResAnmTexPat anm } mpObj = nw4r::g3d::AnmObjTexPatOverride::Construct(&mAllocator, nullptr, mdl, count); - children = (m3d::anmTexPat_c::child_c *) MEMAllocFromAllocator(&mAllocator, nw4r::ut::RoundUp(count * sizeof(child_c), 0x20)); + mpChildren = (m3d::anmTexPat_c::child_c *) MEMAllocFromAllocator(&mAllocator, nw4r::ut::RoundUp(count * sizeof(child_c), 0x20)); nw4r::g3d::AnmObjTexPatOverride *texPatOverride = nw4r::g3d::G3dObj::DynamicCast(mpObj); - child_c *child = &children[0]; + child_c *child = &mpChildren[0]; for (int i = 0; i < count; i++) { new(child) child_c(); if (!child->create(mdl, anmTexPat, &mAllocator, nullptr)) { @@ -113,12 +113,12 @@ m3d::anmTexPat_c::~anmTexPat_c() { void m3d::anmTexPat_c::remove() { nw4r::g3d::AnmObjTexPatOverride *texPat = nw4r::g3d::G3dObj::DynamicCast(mpObj); - if (texPat != nullptr && children != nullptr) { + if (texPat != nullptr && mpChildren != nullptr) { int count = texPat->Size(); for (int i = 0; i < count; i++) { - children[i].remove(); + mpChildren[i].remove(); } - children = nullptr; + mpChildren = nullptr; } banm_c::remove(); } @@ -126,15 +126,15 @@ void m3d::anmTexPat_c::remove() { void m3d::anmTexPat_c::setAnm(m3d::bmdl_c &mdl, nw4r::g3d::ResAnmTexPat anmTexPat, long idx, m3d::playMode_e playMode) { nw4r::g3d::AnmObjTexPatOverride *texPat = nw4r::g3d::G3dObj::DynamicCast(mpObj); texPat->Detach(idx); - children[idx].setAnm(mdl, anmTexPat, playMode); - nw4r::g3d::AnmObjTexPatRes *texPatRes = nw4r::g3d::G3dObj::DynamicCast(children[idx].getObj()); + mpChildren[idx].setAnm(mdl, anmTexPat, playMode); + nw4r::g3d::AnmObjTexPatRes *texPatRes = nw4r::g3d::G3dObj::DynamicCast(mpChildren[idx].getObj()); texPat->Attach(idx, texPatRes); } void m3d::anmTexPat_c::releaseAnm(long idx) { nw4r::g3d::AnmObjTexPatOverride *texPat = nw4r::g3d::G3dObj::DynamicCast(mpObj); texPat->Detach(idx); - children[idx].releaseAnm(); + mpChildren[idx].releaseAnm(); } void m3d::anmTexPat_c::play() { @@ -146,39 +146,39 @@ void m3d::anmTexPat_c::play() { } void m3d::anmTexPat_c::play(long idx) { - if (children[idx].IsBound()) { - children[idx].play(); + if (mpChildren[idx].IsBound()) { + mpChildren[idx].play(); } } float m3d::anmTexPat_c::getFrame(long idx) const { - return children[idx].getFrame(); + return mpChildren[idx].getFrame(); } void m3d::anmTexPat_c::setFrame(float frame, long idx) { - children[idx].setFrame(frame); + mpChildren[idx].setFrame(frame); } float m3d::anmTexPat_c::getRate(long idx) const { - return children[idx].getRate(); + return mpChildren[idx].getRate(); } void m3d::anmTexPat_c::setRate(float rate, long idx) { - children[idx].setRate(rate); + mpChildren[idx].setRate(rate); } bool m3d::anmTexPat_c::isStop(long idx) const { - return children[idx].isStop(); + return mpChildren[idx].isStop(); } bool m3d::anmTexPat_c::checkFrame(float frame, long idx) const { - return children[idx].checkFrame(frame); + return mpChildren[idx].checkFrame(frame); } void m3d::anmTexPat_c::setPlayMode(m3d::playMode_e mode, long idx) { - children[idx].mPlayMode = mode; + mpChildren[idx].mPlayMode = mode; } float m3d::anmTexPat_c::getFrameMax(long idx) const { - return children[idx].mFrameMax; + return mpChildren[idx].mFrameMax; } diff --git a/source/dol/mLib/m_3d/anm_tex_srt.cpp b/source/dol/mLib/m_3d/anm_tex_srt.cpp index 991d26af..4c220fee 100644 --- a/source/dol/mLib/m_3d/anm_tex_srt.cpp +++ b/source/dol/mLib/m_3d/anm_tex_srt.cpp @@ -93,15 +93,15 @@ bool m3d::anmTexSrt_c::create(nw4r::g3d::ResMdl mdl, nw4r::g3d::ResAnmTexSrt anm return false; } - children = (m3d::anmTexSrt_c::child_c *) MEMAllocFromAllocator(&mAllocator, nw4r::ut::RoundUp(count * sizeof(child_c), 0x20)); - if (children == nullptr) { + mpChildren = (m3d::anmTexSrt_c::child_c *) MEMAllocFromAllocator(&mAllocator, nw4r::ut::RoundUp(count * sizeof(child_c), 0x20)); + if (mpChildren == nullptr) { remove(); return false; } nw4r::g3d::AnmObjTexSrtOverride *texSrtOverride = nw4r::g3d::G3dObj::DynamicCast(mpObj); - child_c *child = &children[0]; + child_c *child = &mpChildren[0]; for (int i = 0; i < count; i++) { new(child) child_c(); if (!child->create(mdl, anmTexSrt, &mAllocator, nullptr)) { @@ -126,12 +126,12 @@ m3d::anmTexSrt_c::~anmTexSrt_c() { void m3d::anmTexSrt_c::remove() { nw4r::g3d::AnmObjTexSrtOverride *texSrt = nw4r::g3d::G3dObj::DynamicCast(mpObj); - if (texSrt != nullptr && children != nullptr) { + if (texSrt != nullptr && mpChildren != nullptr) { int count = texSrt->Size(); for (int i = 0; i < count; i++) { - children[i].remove(); + mpChildren[i].remove(); } - children = nullptr; + mpChildren = nullptr; } banm_c::remove(); } @@ -139,15 +139,15 @@ void m3d::anmTexSrt_c::remove() { void m3d::anmTexSrt_c::setAnm(m3d::bmdl_c &mdl, nw4r::g3d::ResAnmTexSrt anmTexSrt, long idx, m3d::playMode_e playMode) { nw4r::g3d::AnmObjTexSrtOverride *texSrt = nw4r::g3d::G3dObj::DynamicCast(mpObj); texSrt->Detach(idx); - children[idx].setAnm(mdl, anmTexSrt, playMode); - nw4r::g3d::AnmObjTexSrtRes *texSrtRes = nw4r::g3d::G3dObj::DynamicCast(children[idx].getObj()); + mpChildren[idx].setAnm(mdl, anmTexSrt, playMode); + nw4r::g3d::AnmObjTexSrtRes *texSrtRes = nw4r::g3d::G3dObj::DynamicCast(mpChildren[idx].getObj()); texSrt->Attach(idx, texSrtRes); } void m3d::anmTexSrt_c::releaseAnm(long idx) { nw4r::g3d::AnmObjTexSrtOverride *texSrt = nw4r::g3d::G3dObj::DynamicCast(mpObj); texSrt->Detach(idx); - children[idx].releaseAnm(); + mpChildren[idx].releaseAnm(); } void m3d::anmTexSrt_c::play() { @@ -159,39 +159,39 @@ void m3d::anmTexSrt_c::play() { } void m3d::anmTexSrt_c::play(long idx) { - if (children[idx].IsBound()) { - children[idx].play(); + if (mpChildren[idx].IsBound()) { + mpChildren[idx].play(); } } float m3d::anmTexSrt_c::getFrame(long idx) const { - return children[idx].getFrame(); + return mpChildren[idx].getFrame(); } void m3d::anmTexSrt_c::setFrame(float frame, long idx) { - children[idx].setFrame(frame); + mpChildren[idx].setFrame(frame); } float m3d::anmTexSrt_c::getRate(long idx) const { - return children[idx].getRate(); + return mpChildren[idx].getRate(); } void m3d::anmTexSrt_c::setRate(float rate, long idx) { - children[idx].setRate(rate); + mpChildren[idx].setRate(rate); } bool m3d::anmTexSrt_c::isStop(long idx) const { - return children[idx].isStop(); + return mpChildren[idx].isStop(); } void m3d::anmTexSrt_c::setPlayMode(m3d::playMode_e mode, long idx) { - children[idx].mPlayMode = mode; + mpChildren[idx].mPlayMode = mode; } float m3d::anmTexSrt_c::getFrameMax(long idx) const { - return children[idx].mFrameMax; + return mpChildren[idx].mFrameMax; } void m3d::anmTexSrt_c::setFrameStart(float frame, long idx) { - children[idx].mFrameStart = frame; + mpChildren[idx].mFrameStart = frame; } From d0edde9bb1b66d792460e449410962a92e3fad3c Mon Sep 17 00:00:00 2001 From: RootCubed Date: Mon, 23 Mar 2026 16:45:33 +0100 Subject: [PATCH 06/15] daEnSnakeBlock_c 78% matching --- include/game/bases/d_a_en_snake_block.hpp | 49 +-- slices/d_enemiesNP.json | 2 +- .../d_enemiesNP/bases/d_a_en_snake_block.cpp | 313 +++++++++--------- 3 files changed, 191 insertions(+), 173 deletions(-) diff --git a/include/game/bases/d_a_en_snake_block.hpp b/include/game/bases/d_a_en_snake_block.hpp index b381a93f..b4e1f44d 100644 --- a/include/game/bases/d_a_en_snake_block.hpp +++ b/include/game/bases/d_a_en_snake_block.hpp @@ -14,12 +14,16 @@ class dBg_ctr_c { short *m_bc; u8 mPad4[0x8]; int m_c8; + int m_cc; u32 mFlags; - int m_d0; + int m_d4; u8 mpPad5[0x8]; - bool m_dc; - u8 mpPad6[3]; - int m_e0; + bool m_e0; + u8 m_e1; + u8 m_e2; + + dBg_ctr_c(); + ~dBg_ctr_c(); void release(); void entry(); @@ -33,8 +37,8 @@ class daEnSnakeBlock_c : public dEn_c { // @unofficial class dBlock_c { public: - dBlock_c(); - virtual ~dBlock_c() {} + dBlock_c() : mpOwner(nullptr), m_1b4(0) {} + virtual ~dBlock_c() { mBgCtr.release(); } void createMdl(dHeapAllocator_c *alloc); void doDelete(); @@ -42,17 +46,17 @@ class daEnSnakeBlock_c : public dEn_c { void calcAnm(); void setAnmClr(const char *name); - void draw(mVec3_c *pos); + void draw(const mVec3_c &pos); - void initBgCtr(daEnSnakeBlock_c *parent, mVec3_c *blockPos, int unused); + void initBgCtr(daEnSnakeBlock_c *parent, mVec3_c &blockPos, int unused); void calcBgCtr(); void setFallCollapse(); - void calcCollapse1(u8 *travelInfo); + void calcCollapse1(s8 *travelInfo); - static void callBackF(dActor_c *, dActor_c *); - static void callBackH(dActor_c *, dActor_c *); - static void callBackW(dActor_c *, dActor_c *, u8); + static void callBackF(dActor_c *self, dActor_c *other); + static void callBackH(dActor_c *self, dActor_c *other); + static void callBackW(dActor_c *self, dActor_c *other, u8); nw4r::g3d::ResFile mResFile; m3d::mdl_c mModel; @@ -68,22 +72,22 @@ class daEnSnakeBlock_c : public dEn_c { int mTravelInfoIdx; daEnSnakeBlock_c *mpOwner; - short _1B4; + short m_1b4; }; // @unofficial class dCtrlBlock_c : public dBlock_c { public: - dCtrlBlock_c(); - virtual ~dCtrlBlock_c() {} + dCtrlBlock_c() {} + virtual ~dCtrlBlock_c() { mBgCtr.release(); } - bool calcPos(u8 *travelInfo); - bool calcTravelPos(u8 *travelInfo); + bool calcPos(s8 *travelInfo); + bool calcTravelPos(s8 *travelInfo); int mSnakeSpeedIdx; }; - daEnSnakeBlock_c(); + daEnSnakeBlock_c() : mpTravelInfo(nullptr), mTravelInfoIdx(0), mShakeTime(0) {} virtual ~daEnSnakeBlock_c() {} virtual int create(); @@ -110,14 +114,16 @@ class daEnSnakeBlock_c : public dEn_c { bool chkCollapseDelete(); ///< Returns if the Tail is below the screen edge (meaning the collapse has ended, and the actor can be deleted) bool chkOffScreen(); ///< Returns if the Snake Block is far past the right edge of the screen (used to delete it) + dCtrlBlock_c *getHeadBlock() { return &mCtrlBlock[0]; } + dCtrlBlock_c *getTailBlock() { return &mCtrlBlock[1]; } + dHeapAllocator_c mAllocator; - dCtrlBlock_c mHead; - dCtrlBlock_c mTail; + dCtrlBlock_c mCtrlBlock[2]; dBlock_c mBlocks[20]; int mBlockNum; - u8 *mpTravelInfo; + s8 *mpTravelInfo; int mTravelInfoIdx; short mShakeTime; @@ -132,7 +138,6 @@ class daEnSnakeBlock_c : public dEn_c { static sStateID_c *sc_stopStates[4]; static mVec2_c sc_ctrlPosMods[5]; static int sc_glbSnakeNum; - static mVec2_c sc_collapseSpeeds[5]; STATE_FUNC_DECLARE(daEnSnakeBlock_c, Wait); STATE_FUNC_DECLARE(daEnSnakeBlock_c, Move); diff --git a/slices/d_enemiesNP.json b/slices/d_enemiesNP.json index 8b8eb6da..d903fce2 100644 --- a/slices/d_enemiesNP.json +++ b/slices/d_enemiesNP.json @@ -2,7 +2,7 @@ "meta": { "fileName": "d_enemiesNP.rel", "type": "REL", - "defaultCompilerFlags": "-sdata 0 -sdata2 0 -proc gekko -fp hard -O4,p -char signed -rtti off -enum int -Cpp_exceptions off -ipa file -enc SJIS", + "defaultCompilerFlags": "-sdata 0 -sdata2 0 -proc gekko -fp hard -O4,p -inline noauto -char signed -rtti off -enum int -Cpp_exceptions off -ipa file -enc SJIS", "moduleNum": 3, "baseAddr": "809A2D90", "sections": { diff --git a/source/d_enemiesNP/bases/d_a_en_snake_block.cpp b/source/d_enemiesNP/bases/d_a_en_snake_block.cpp index e049512f..e0039eba 100644 --- a/source/d_enemiesNP/bases/d_a_en_snake_block.cpp +++ b/source/d_enemiesNP/bases/d_a_en_snake_block.cpp @@ -8,47 +8,31 @@ #include #include -ACTOR_PROFILE(EN_SNAKEBLOCK, daEnSnakeBlock_c, 0) - -STATE_DEFINE(daEnSnakeBlock_c, Wait); -STATE_DEFINE(daEnSnakeBlock_c, Move); -STATE_DEFINE(daEnSnakeBlock_c, Shake); -STATE_DEFINE(daEnSnakeBlock_c, Stop); -STATE_DEFINE(daEnSnakeBlock_c, Collapse1); -STATE_DEFINE(daEnSnakeBlock_c, Collapse2); -STATE_DEFINE(daEnSnakeBlock_c, Collapse3); - -float daEnSnakeBlock_c::sc_snakeSpeeds[3] = { - 0.5f, 1.0f, 1.4f -}; - -sStateID_c * daEnSnakeBlock_c::sc_stopStates[4] = { - &StateID_Stop, &StateID_Collapse1, &StateID_Collapse2, &StateID_Collapse3 -}; +ACTOR_PROFILE(EN_SNAKEBLOCK, daEnSnakeBlock_c, 0); int daEnSnakeBlock_c::sc_glbSnakeNum = 0; mVec2_c daEnSnakeBlock_c::sc_ctrlPosMods[5] = { mVec2_c(0.0f, 0.0f), - mVec2_c(0.0f, 0.0f), - mVec2_c(0.0f, 0.0f), - mVec2_c(0.0f, 0.0f), - mVec2_c(0.0f, 0.0f) -}; -mVec2_c daEnSnakeBlock_c::sc_collapseSpeeds[5] = { - mVec2_c(0.0f, 0.0f), - mVec2_c(0.0f, 0.0f), - mVec2_c(0.0f, 0.0f), - mVec2_c(0.0f, 0.0f), - mVec2_c(0.0f, 0.0f) + mVec2_c(0.0f, 1.0f), + mVec2_c(0.0f, -1.0f), + mVec2_c(-1.0f, 0.0f), + mVec2_c(1.0f, 0.0f) }; +float daEnSnakeBlock_c::sc_snakeSpeeds[3] = { + 0.5f, 1.0f, 1.4f +}; -daEnSnakeBlock_c::daEnSnakeBlock_c() {} -daEnSnakeBlock_c::dBlock_c::dBlock_c() {} -daEnSnakeBlock_c::dCtrlBlock_c::dCtrlBlock_c() {} +STATE_DEFINE(daEnSnakeBlock_c, Wait); +STATE_DEFINE(daEnSnakeBlock_c, Move); +STATE_DEFINE(daEnSnakeBlock_c, Shake); +STATE_DEFINE(daEnSnakeBlock_c, Collapse1); +STATE_DEFINE(daEnSnakeBlock_c, Collapse2); +STATE_DEFINE(daEnSnakeBlock_c, Collapse3); +STATE_DEFINE(daEnSnakeBlock_c, Stop); -void daEnSnakeBlock_c::dBlock_c::createMdl(dHeapAllocator_c * alloc) { +void daEnSnakeBlock_c::dBlock_c::createMdl(dHeapAllocator_c *alloc) { mResFile = dResMng_c::m_instance->getRes("block_snake_ice", "g3d/block_snake_ice.brres"); nw4r::g3d::ResMdl mdl = mResFile.GetResMdl("block_snake_ice"); @@ -62,6 +46,7 @@ void daEnSnakeBlock_c::dBlock_c::createMdl(dHeapAllocator_c * alloc) { mAnmTexSrt.setRate(1.0f, 0); nw4r::g3d::ResAnmClr res_anmclr = mResFile.GetResAnmClr("ridden"); + mAnmClr.create(mdl, res_anmclr, alloc, nullptr, 1); mAnmClr.setAnm(mModel, res_anmclr, 0, m3d::FORWARD_ONCE); mModel.setAnm(mAnmClr); mAnmClr.setRate(0.0f, 0); @@ -78,19 +63,18 @@ void daEnSnakeBlock_c::dBlock_c::calcAnm() { mAnmTexSrt.play(); } -void daEnSnakeBlock_c::dBlock_c::setAnmClr(const char * name) { +void daEnSnakeBlock_c::dBlock_c::setAnmClr(const char *name) { nw4r::g3d::ResAnmClr res = mResFile.GetResAnmClr(name); mAnmClr.setAnm(mModel, res, 0, m3d::FORWARD_ONCE); mModel.setAnm(mAnmClr); mAnmClr.setRate(1.0f, 0); } -void daEnSnakeBlock_c::dBlock_c::draw(mVec3_c * pos) { - mVec3_c a = mPos + *pos; +void daEnSnakeBlock_c::dBlock_c::draw(const mVec3_c &pos) { + mVec3_c a = mPos + pos; dActor_c::changePosAngle(&a, nullptr, 1); - nw4r::math::MTX34 b; - PSMTXTrans(b, a.x, a.y, a.z); + mMtx_c b = mMtx_c::createTrans(a); mModel.setLocalMtx(&b); mVec3_c one = mVec3_c(1.0f, 1.0f, 1.0f); @@ -99,40 +83,44 @@ void daEnSnakeBlock_c::dBlock_c::draw(mVec3_c * pos) { mModel.entry(); } -void daEnSnakeBlock_c::dBlock_c::initBgCtr(daEnSnakeBlock_c * owner, mVec3_c * pos, int _unused) { - mPos = *pos; +void daEnSnakeBlock_c::dBlock_c::initBgCtr(daEnSnakeBlock_c *owner, mVec3_c &blockPos, int _unused) { + mVec3_c pos = blockPos; + mPos = pos; if (mpOwner == nullptr) { mpOwner = owner; } - mVec2_c diff = mVec2_c(mPos) - mVec2_c(mpOwner->mPos); + float dx = mPos.x - mpOwner->mPos.x; + float dy = mPos.y - mpOwner->mPos.y; - mBgCtr.set(mpOwner, diff.x - 8.0f, diff.y + 8.0f, diff.x + 8.0f, diff.y - 8.0f, + mBgCtr.set(mpOwner, dx - 8.0f, dy + 8.0f, dx + 8.0f, dy - 8.0f, callBackF, callBackH, callBackW, 1, 0, nullptr ); + mBgCtr.mFlags = 0; // The unused flag was probably used to set the collision to icy before they // decided to always make it icy. /* if (_unused) { */ - mBgCtr.mFlags = 4; + mBgCtr.mFlags |= 4; /* } */ mBgCtr.entry(); } void daEnSnakeBlock_c::dBlock_c::calcBgCtr() { - mVec2_c diff = mVec2_c(mPos) - mVec2_c(mpOwner->mPos); - mBgCtr.setOfs(diff.x - 8.0f, diff.y + 8.0f, diff.x + 8.0f, diff.y - 8.0f, nullptr); + float dx = mPos.x - mpOwner->mPos.x; + float dy = mPos.y - mpOwner->mPos.y; + mBgCtr.setOfs(dx - 8.0f, dy + 8.0f, dx + 8.0f, dy - 8.0f, nullptr); mBgCtr.mFlags |= 2; mBgCtr.calc(); } void daEnSnakeBlock_c::dBlock_c::setFallCollapse() { - mSpeed.y -= 0.1875f; + mSpeed.y += -0.1875f; if (mSpeed.y < -4.0f) { mSpeed.y = -4.0f; } } -void daEnSnakeBlock_c::dBlock_c::calcCollapse1(u8 *travelInfo) { +void daEnSnakeBlock_c::dBlock_c::calcCollapse1(s8 *travelInfo) { static mVec2_c floats[] = { mVec2_c(0.0f, 0.0f), mVec2_c(0.0f, 2.0f), @@ -141,66 +129,79 @@ void daEnSnakeBlock_c::dBlock_c::calcCollapse1(u8 *travelInfo) { mVec2_c(2.0f, 0.0f) }; - if (mBgCtr.m_dc) { + if (mBgCtr.m_e2) { mBgCtr.release(); } - u32 info = travelInfo[mTravelInfoIdx]; + u8 info = travelInfo[mTravelInfoIdx]; if (info == 0) { setFallCollapse(); mPos += mSpeed; } else { - mVec2_c x = mVec2_c(mPos) + floats[info]; - mPos.x = x.x; - mPos.y = x.y; - if ((mPos - mLastPos).xzLen() >= 16.0f) { + mPos.x += floats[info].x; + mPos.y += floats[info].y; + mVec2_c diff(mPos.x - mLastPos.x, mPos.y - mLastPos.y); + if (diff.length() >= 16.0f) { mLastPos = mPos; - mTravelInfoIdx += 1; + mTravelInfoIdx++; } } } -void daEnSnakeBlock_c::dBlock_c::callBackF(dActor_c * self, dActor_c * other) { +void daEnSnakeBlock_c::dBlock_c::callBackF(dActor_c *self, dActor_c *other) { + daEnSnakeBlock_c *y = (daEnSnakeBlock_c *) self; + bool x = false; if (other->mKind == dActor_c::STAGE_ACTOR_PLAYER) { x = true; - } else if ((other->mKind == dActor_c::STAGE_ACTOR_YOSHI) && (*other->getPlrNo() != -1)) { + } else if (other->mKind == dActor_c::STAGE_ACTOR_YOSHI && *other->getPlrNo() != -1) { x = true; } - daEnSnakeBlock_c* y = (daEnSnakeBlock_c *)self; - if (x && (y->mStateMgr.getStateID() == &StateID_Wait)) { + + if (x && y->isState(StateID_Wait)) { y->changeState(StateID_Move); } } -void daEnSnakeBlock_c::dBlock_c::callBackH(dActor_c * self, dActor_c * other) {} -void daEnSnakeBlock_c::dBlock_c::callBackW(dActor_c * self, dActor_c * other, unsigned char x) {} +void daEnSnakeBlock_c::dBlock_c::callBackH(dActor_c *self, dActor_c *other) {} +void daEnSnakeBlock_c::dBlock_c::callBackW(dActor_c *self, dActor_c *other, u8 x) {} -bool daEnSnakeBlock_c::dCtrlBlock_c::calcPos(u8 *travelInfo) { - mVec2_c pos_mod = sc_ctrlPosMods[travelInfo[mTravelInfoIdx]]; - mPos.x += sc_snakeSpeeds[mSnakeSpeedIdx] * pos_mod.x; - mPos.y += sc_snakeSpeeds[mSnakeSpeedIdx] * pos_mod.y; +bool daEnSnakeBlock_c::dCtrlBlock_c::calcPos(s8 *travelInfo) { + // int inf = travelInfo[mTravelInfoIdx]; + float speed = sc_snakeSpeeds[mSnakeSpeedIdx]; + mVec2_c v( + speed * sc_ctrlPosMods[travelInfo[mTravelInfoIdx]].x, + speed * sc_ctrlPosMods[travelInfo[mTravelInfoIdx]].y + ); + mPos.x += v.x; + mPos.y += v.y; - return (std::fabs(mPos.x - mLastPos.x) >= 16.0f) || (std::fabs(mPos.y - mLastPos.y) >= 16.0f); + if (std::fabs(mPos.x - mLastPos.x) >= 16.0f || std::fabs(mPos.y - mLastPos.y) >= 16.0f) { + return true; + } + return false; } -bool daEnSnakeBlock_c::dCtrlBlock_c::calcTravelPos(u8 *travelInfo) { - mVec2_c x = sc_ctrlPosMods[travelInfo[mTravelInfoIdx]]; - mTravelInfoIdx++; - x.x *= 16.0f; - x.y *= 16.0f; - x += mVec2_c(mLastPos); +bool daEnSnakeBlock_c::dCtrlBlock_c::calcTravelPos(s8 *travelInfo) { + mVec2_c newPos; + newPos.x = sc_ctrlPosMods[travelInfo[mTravelInfoIdx]].x; + newPos.y = sc_ctrlPosMods[travelInfo[mTravelInfoIdx]].y; + + float x = mLastPos.x + newPos.x * 16.0f; + float y = mLastPos.y + newPos.y * 16.0f; + + mLastPos.z = mPos.z; - mPos.x = x.x; - mPos.y = x.y; - mLastPos.x = x.x; - mLastPos.y = x.y; + mPos.x = x; + mPos.y = y; + mLastPos.x = x; + mLastPos.y = y; - return travelInfo[mTravelInfoIdx] == 0; + return travelInfo[++mTravelInfoIdx] == 0; } int daEnSnakeBlock_c::create() { - if (sc_glbSnakeNum >= 1 && (((mParam >> 0xC) & 0xFF) != 0)) { + if (sc_glbSnakeNum > 0 && (((mParam >> 0xC) & 0xFF) != 0)) { deleteRequest(); return NOT_READY; } @@ -233,16 +234,16 @@ int daEnSnakeBlock_c::execute() { } int daEnSnakeBlock_c::draw() { - mVec3_c offset = mVec3_c::Zero; + mVec3_c offset(0.0f, 0.0f, 0.0f); if (mShakeTime > 0) { - offset.x = 0.0f + sc_snakeSpeeds[(mShakeTime >> 1) & 1]; + offset.x += sc_snakeSpeeds[(mShakeTime >> 1) & 1]; } - mHead.draw(&offset); - mTail.draw(&offset); + getHeadBlock()->draw(offset); + getTailBlock()->draw(offset); for (int i = 0; i < mBlockNum; i++) { - mBlocks[i].draw(&offset); + mBlocks[i].draw(offset); } return SUCCEEDED; @@ -279,29 +280,29 @@ void daEnSnakeBlock_c::initBlockPath() { float f1 = node->mX + (mBlockNum * 16.0f); float f2 = node->mY - 8.0f; mVec3_c head_pos = mVec3_c(f1, f2, 1516.0f); - mHead.initBgCtr(this, &head_pos, (mParam >> 20) & 1); + getHeadBlock()->initBgCtr(this, head_pos, (mParam >> 20) & 1); mVec3_c mid_pos; for (int i = 0; i < mBlockNum; i++) { mid_pos.set(f1, f2, 1500.0f); - mBlocks[i].initBgCtr(this, &mid_pos, (mParam >> 20) & 1); + mBlocks[i].initBgCtr(this, mid_pos, (mParam >> 20) & 1); f1 -= 16.0f; } mVec3_c tail_pos = mVec3_c(f1, f2, 1516.0f); - mTail.initBgCtr(this, &tail_pos, (mParam >> 20) & 1); + getTailBlock()->initBgCtr(this, tail_pos, (mParam >> 20) & 1); - mHead.mTravelInfoIdx = mBlockNum + 1; - mTail.mTravelInfoIdx = 1; + getHeadBlock()->mTravelInfoIdx = mBlockNum + 1; + getTailBlock()->mTravelInfoIdx = 1; // Note: Value 3 is out of bounds - mHead.mSnakeSpeedIdx = (mParam >> 8) & 3; - mTail.mSnakeSpeedIdx = (mParam >> 8) & 3; + getHeadBlock()->mSnakeSpeedIdx = (mParam >> 8) & 3; + getTailBlock()->mSnakeSpeedIdx = (mParam >> 8) & 3; } void daEnSnakeBlock_c::calcAnm() { - mHead.calcAnm(); - mTail.calcAnm(); + getHeadBlock()->calcAnm(); + getTailBlock()->calcAnm(); for (int i = 0; i < mBlockNum; i++) { mBlocks[i].calcAnm(); @@ -309,8 +310,8 @@ void daEnSnakeBlock_c::calcAnm() { } void daEnSnakeBlock_c::createMdl() { - mHead.createMdl(&mAllocator); - mTail.createMdl(&mAllocator); + getHeadBlock()->createMdl(&mAllocator); + getTailBlock()->createMdl(&mAllocator); for (int i = 0; i < mBlockNum; i++) { mBlocks[i].createMdl(&mAllocator); @@ -318,23 +319,27 @@ void daEnSnakeBlock_c::createMdl() { } void daEnSnakeBlock_c::deleteBlock() { - mHead.doDelete(); - mTail.doDelete(); + getHeadBlock()->doDelete(); + getTailBlock()->doDelete(); for (int i = 0; i < mBlockNum; i++) { mBlocks[i].doDelete(); } } +sStateID_c *daEnSnakeBlock_c::sc_stopStates[4] = { + &StateID_Stop, &StateID_Collapse1, &StateID_Collapse2, &StateID_Collapse3 +}; + void daEnSnakeBlock_c::setStopState() { mpStopState = sc_stopStates[mParam >> 0x1c]; } void daEnSnakeBlock_c::calcBgCtr() { - mHead.calcBgCtr(); - mTail.calcBgCtr(); + getHeadBlock()->calcBgCtr(); + getTailBlock()->calcBgCtr(); - mTail.mBgCtr.mFlags |= 1; + getTailBlock()->mBgCtr.mFlags |= 1; for (int i = 0; i < mBlockNum; i++) { mBlocks[i].calcBgCtr(); @@ -358,7 +363,7 @@ void daEnSnakeBlock_c::initTravelInfo() { } mTravelInfoIdx = dist; - mpTravelInfo = new u8[dist + 2]; + mpTravelInfo = new s8[dist + 2]; int i11 = 1; for (; start_idx < rail->mCount; start_idx++) { @@ -582,15 +587,15 @@ void daEnSnakeBlock_c::setBlockPos() { b.mPos = a.mPos; } - mBlocks[0].mPos = mVec3_c(mHead.mPos, 1500.0f); + mBlocks[0].mPos = mVec3_c(getHeadBlock()->mPos, 1500.0f); } void daEnSnakeBlock_c::setActorPos() { - mPos = mVec3_c(mHead.mPos, 1500.0f); + mPos = mVec3_c(getHeadBlock()->mPos, 1500.0f); } bool daEnSnakeBlock_c::chkCollapseDelete() { - return mTail.mPos.y < (dBgParameter_c::ms_Instance_p->mPos.y - dBgParameter_c::ms_Instance_p->mSize.y) - 16.0f; + return getTailBlock()->mPos.y < (dBgParameter_c::ms_Instance_p->mPos.y - dBgParameter_c::ms_Instance_p->mSize.y) - 16.0f; } bool daEnSnakeBlock_c::chkOffScreen() { @@ -609,33 +614,33 @@ void daEnSnakeBlock_c::finalizeState_Wait() {} void daEnSnakeBlock_c::executeState_Wait() {} void daEnSnakeBlock_c::initializeState_Move() { - mHead.setAnmClr("create"); - mHead.mAnmClr.setRate(0.0f, 0); - mHead.mAnmClr.setFrame(25.0f, 0); - mTail.setAnmClr("ridden"); + getHeadBlock()->setAnmClr("create"); + getHeadBlock()->mAnmClr.setRate(0.0f, 0); + getHeadBlock()->mAnmClr.setFrame(25.0f, 0); + getTailBlock()->setAnmClr("ridden"); mBlocks[0].setAnmClr("create"); for (int i = 0; i < mBlockNum; i++) { mBlocks[i].setAnmClr("ridden"); } - mHead.mLastPos = mHead.mPos; - mTail.mLastPos = mTail.mPos; + getHeadBlock()->mLastPos = getHeadBlock()->mPos; + getTailBlock()->mLastPos = getTailBlock()->mPos; mCreateAnmBlockIdx = 0; - float f = mHead.mAnmClr.getFrameMax(0); + float f = getHeadBlock()->mAnmClr.getFrameMax(0); mCreateAnmBlockNum = f / (16.0f / sc_snakeSpeeds[mParam >> 8 & 0xF]); } void daEnSnakeBlock_c::finalizeState_Move() {} void daEnSnakeBlock_c::executeState_Move() { - bool b3 = mHead.calcPos(mpTravelInfo); - bool b4 = mTail.calcPos(mpTravelInfo); + bool b3 = getHeadBlock()->calcPos(mpTravelInfo); + bool b4 = getTailBlock()->calcPos(mpTravelInfo); bool b5 = false; bool b6 = false; if (b3 || b4) { - b5 = mHead.calcTravelPos(mpTravelInfo); - b6 = mTail.calcTravelPos(mpTravelInfo); + b5 = getHeadBlock()->calcTravelPos(mpTravelInfo); + b6 = getTailBlock()->calcTravelPos(mpTravelInfo); dAudio::SoundEffectID_t(SE_OBJ_SNAKE_BLOCK).playMapSound(mPos, 0); @@ -665,10 +670,10 @@ void daEnSnakeBlock_c::executeState_Move() { } void daEnSnakeBlock_c::initializeState_Shake() { - mHead.setAnmClr("ridden"); - mHead.mAnmClr.setRate(0.0f, 0); - mTail.setAnmClr("ridden"); - mTail.mAnmClr.setRate(0.0f, 0); + getHeadBlock()->setAnmClr("ridden"); + getHeadBlock()->mAnmClr.setRate(0.0f, 0); + getTailBlock()->setAnmClr("ridden"); + getTailBlock()->mAnmClr.setRate(0.0f, 0); for (int i = 0; i < mBlockNum; i++) { mBlocks[i].setAnmClr("ridden"); @@ -685,10 +690,10 @@ void daEnSnakeBlock_c::executeState_Shake() { } void daEnSnakeBlock_c::initializeState_Stop() { - mHead.setAnmClr("ridden"); - mHead.mAnmClr.setRate(0.0f, 0); - mTail.setAnmClr("ridden"); - mTail.mAnmClr.setRate(0.0f, 0); + getHeadBlock()->setAnmClr("ridden"); + getHeadBlock()->mAnmClr.setRate(0.0f, 0); + getTailBlock()->setAnmClr("ridden"); + getTailBlock()->mAnmClr.setRate(0.0f, 0); for (int i = 0; i < mBlockNum; i++) { mBlocks[i].setAnmClr("ridden"); @@ -699,33 +704,41 @@ void daEnSnakeBlock_c::finalizeState_Stop() {} void daEnSnakeBlock_c::executeState_Stop() {} void daEnSnakeBlock_c::initializeState_Collapse1() { + static mVec2_c sc_collapseSpeeds[5] = { + mVec2_c(0.0f, 0.0f), + mVec2_c(0.0f, 0.0f), + mVec2_c(0.0f, 0.0f), + mVec2_c(0.0f, 0.0f), + mVec2_c(0.0f, 0.0f) + }; + static float floats[] = { 0.0f, 0.0f, 1.0f, 3.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f }; - mHead.mLastPos = mHead.mPos; - mTail.mLastPos = mTail.mPos; + getHeadBlock()->mLastPos = getHeadBlock()->mPos; + getTailBlock()->mLastPos = getTailBlock()->mPos; for (int i = 0; i < mBlockNum; i++) { mBlocks[i].mLastPos = mBlocks[i].mPos; } - int prev_idx = mHead.mTravelInfoIdx; + int prev_idx = getHeadBlock()->mTravelInfoIdx; for (int i = 0; i < mBlockNum; i++) { mBlocks[i].mTravelInfoIdx = prev_idx; prev_idx--; } - mTail.mTravelInfoIdx = prev_idx; + getTailBlock()->mTravelInfoIdx = prev_idx; mVec3_c collapse_speed = mVec3_c(sc_collapseSpeeds[mpTravelInfo[mTravelInfoIdx]], 0.0f); - mHead.mSpeed = collapse_speed; - mTail.mSpeed = collapse_speed; + getHeadBlock()->mSpeed = collapse_speed; + getTailBlock()->mSpeed = collapse_speed; for (int i = 0; i < mBlockNum; i++) { mBlocks[i].mSpeed = collapse_speed; } } void daEnSnakeBlock_c::finalizeState_Collapse1() {} void daEnSnakeBlock_c::executeState_Collapse1() { - mHead.calcCollapse1(mpTravelInfo); - mTail.calcCollapse1(mpTravelInfo); + getHeadBlock()->calcCollapse1(mpTravelInfo); + getTailBlock()->calcCollapse1(mpTravelInfo); for (int i = 0; i < mBlockNum; i++) { mBlocks[i].calcCollapse1(mpTravelInfo); } @@ -737,26 +750,26 @@ void daEnSnakeBlock_c::executeState_Collapse1() { void daEnSnakeBlock_c::initializeState_Collapse2() { mCollapse2Idx = 0; - mHead.mSpeed = mVec3_c(0.0f, 0.0f, 0.0f); - mTail.mSpeed = mVec3_c(0.0f, 0.0f, 0.0f); + getHeadBlock()->mSpeed = mVec3_c(0.0f, 0.0f, 0.0f); + getTailBlock()->mSpeed = mVec3_c(0.0f, 0.0f, 0.0f); for (int i = 0; i < mBlockNum; i++) { mBlocks[i].mSpeed = mVec3_c(0.0f, 0.0f, 0.0f); } } void daEnSnakeBlock_c::finalizeState_Collapse2() {} void daEnSnakeBlock_c::executeState_Collapse2() { - if (mHead.mBgCtr.m_dc) { - mHead.mBgCtr.release(); + if (getHeadBlock()->mBgCtr.m_e2) { + getHeadBlock()->mBgCtr.release(); } - mHead.setFallCollapse(); - mHead.mPos += mHead.mSpeed; + getHeadBlock()->setFallCollapse(); + getHeadBlock()->mPos += getHeadBlock()->mSpeed; if (mCollapse2Idx > mBlockNum * 8) { - if (mTail.mBgCtr.m_dc) { - mTail.mBgCtr.release(); + if (getTailBlock()->mBgCtr.m_e2) { + getTailBlock()->mBgCtr.release(); } - mTail.setFallCollapse(); - mTail.mPos += mTail.mSpeed; + getTailBlock()->setFallCollapse(); + getTailBlock()->mPos += getTailBlock()->mSpeed; } int i5 = mCollapse2Idx >> 3; @@ -768,7 +781,7 @@ void daEnSnakeBlock_c::executeState_Collapse2() { for (int i = 0; i <= i5; i++) { dBlock_c * block = &mBlocks[i]; block->mBgCtr.release(); //< double release? - if (block->mBgCtr.m_dc) { + if (block->mBgCtr.m_e2) { block->mBgCtr.release(); } block->setFallCollapse(); @@ -782,28 +795,28 @@ void daEnSnakeBlock_c::executeState_Collapse2() { } void daEnSnakeBlock_c::initializeState_Collapse3() { - mHead.mSpeed = mVec3_c(0.0f, 0.0f, 0.0f); - mTail.mSpeed = mVec3_c(0.0f, 0.0f, 0.0f); + getHeadBlock()->mSpeed = mVec3_c(0.0f, 0.0f, 0.0f); + getTailBlock()->mSpeed = mVec3_c(0.0f, 0.0f, 0.0f); for (int i = 0; i < mBlockNum; i++) { mBlocks[i].mSpeed = mVec3_c(0.0f, 0.0f, 0.0f); } } void daEnSnakeBlock_c::finalizeState_Collapse3() {} void daEnSnakeBlock_c::executeState_Collapse3() { - if (mHead.mBgCtr.m_dc) { - mHead.mBgCtr.release(); + if (getHeadBlock()->mBgCtr.m_e2) { + getHeadBlock()->mBgCtr.release(); } - mHead.setFallCollapse(); - mHead.mPos += mHead.mSpeed; + getHeadBlock()->setFallCollapse(); + getHeadBlock()->mPos += getHeadBlock()->mSpeed; - if (mTail.mBgCtr.m_dc) { - mTail.mBgCtr.release(); + if (getTailBlock()->mBgCtr.m_e2) { + getTailBlock()->mBgCtr.release(); } - mTail.setFallCollapse(); - mTail.mPos += mTail.mSpeed; + getTailBlock()->setFallCollapse(); + getTailBlock()->mPos += getTailBlock()->mSpeed; for (int i = 0; i < mBlockNum; i++) { - if (mBlocks[i].mBgCtr.m_dc) { + if (mBlocks[i].mBgCtr.m_e2) { mBlocks[i].mBgCtr.release(); } mBlocks[i].setFallCollapse(); From 34691fa93f9170bb8738651a6f92e5ae20e42dd4 Mon Sep 17 00:00:00 2001 From: RootCubed Date: Tue, 24 Mar 2026 23:01:32 +0100 Subject: [PATCH 07/15] `daEnSnakeBlock_c` 84% matching --- include/game/bases/d_a_en_snake_block.hpp | 17 +- .../d_enemiesNP/bases/d_a_en_snake_block.cpp | 149 +++++++++--------- 2 files changed, 88 insertions(+), 78 deletions(-) diff --git a/include/game/bases/d_a_en_snake_block.hpp b/include/game/bases/d_a_en_snake_block.hpp index b4e1f44d..6a1ee79c 100644 --- a/include/game/bases/d_a_en_snake_block.hpp +++ b/include/game/bases/d_a_en_snake_block.hpp @@ -17,7 +17,9 @@ class dBg_ctr_c { int m_cc; u32 mFlags; int m_d4; - u8 mpPad5[0x8]; + u8 mpPad5[0x4]; + bool m_dc; + u8 mpPad6[0x3]; bool m_e0; u8 m_e1; u8 m_e2; @@ -54,6 +56,19 @@ class daEnSnakeBlock_c : public dEn_c { void setFallCollapse(); void calcCollapse1(s8 *travelInfo); + void setCreate() { setAnmClr("create"); } + void setRidden() { setAnmClr("ridden"); } + mVec3_c getPos() const { return mPos; } + void setSpeed(float x, float y, float z) { mSpeed.set(x, y, z); } + void resetSpeed() { mSpeed.set(0.0f, 0.0f, 0.0f); } + void process() { + if (mBgCtr.m_dc) { + mBgCtr.release(); + } + setFallCollapse(); + mPos += mSpeed; + } + static void callBackF(dActor_c *self, dActor_c *other); static void callBackH(dActor_c *self, dActor_c *other); static void callBackW(dActor_c *self, dActor_c *other, u8); diff --git a/source/d_enemiesNP/bases/d_a_en_snake_block.cpp b/source/d_enemiesNP/bases/d_a_en_snake_block.cpp index e0039eba..deda9e49 100644 --- a/source/d_enemiesNP/bases/d_a_en_snake_block.cpp +++ b/source/d_enemiesNP/bases/d_a_en_snake_block.cpp @@ -580,33 +580,37 @@ void daEnSnakeBlock_c::initTravelInfo() { } void daEnSnakeBlock_c::setBlockPos() { + dBlock_c *prev = &mBlocks[mBlockNum - 2]; + dBlock_c *curr = &mBlocks[mBlockNum - 1]; for (int i = 0; i < mBlockNum - 1; i++) { - dBlock_c &a = mBlocks[mBlockNum - 1 - i]; - dBlock_c &b = mBlocks[mBlockNum - 2 - i]; + mVec3_c tmp(prev->getPos().x, prev->getPos().y, 1500.0f); + curr->mPos = tmp; - b.mPos = a.mPos; + curr--; + prev--; } - mBlocks[0].mPos = mVec3_c(getHeadBlock()->mPos, 1500.0f); + mVec3_c tmp(getHeadBlock()->getPos().x, getHeadBlock()->getPos().y, 1500.0f); + mBlocks[0].mPos = tmp; } void daEnSnakeBlock_c::setActorPos() { - mPos = mVec3_c(getHeadBlock()->mPos, 1500.0f); + mPos.x = getHeadBlock()->getPos().x; + mPos.y = getHeadBlock()->getPos().y; + mPos.z = 1500.0f; } bool daEnSnakeBlock_c::chkCollapseDelete() { - return getTailBlock()->mPos.y < (dBgParameter_c::ms_Instance_p->mPos.y - dBgParameter_c::ms_Instance_p->mSize.y) - 16.0f; + mVec3_c pos = getTailBlock()->mPos; + return pos.y < dBgParameter_c::ms_Instance_p->yEnd() - 16.0f; } bool daEnSnakeBlock_c::chkOffScreen() { - if (mStateMgr.getStateID() == &StateID_Wait) { + if (isState(StateID_Wait)) { return false; } - return ( - dBgParameter_c::ms_Instance_p->mPos.x + - dBgParameter_c::ms_Instance_p->mSize.x + 512.0f - <= mPos.x - ); + + return mPos.x >= dBgParameter_c::ms_Instance_p->xEnd() + 512.0f; } void daEnSnakeBlock_c::initializeState_Wait() {} @@ -614,22 +618,24 @@ void daEnSnakeBlock_c::finalizeState_Wait() {} void daEnSnakeBlock_c::executeState_Wait() {} void daEnSnakeBlock_c::initializeState_Move() { - getHeadBlock()->setAnmClr("create"); + getHeadBlock()->setCreate(); getHeadBlock()->mAnmClr.setRate(0.0f, 0); getHeadBlock()->mAnmClr.setFrame(25.0f, 0); - getTailBlock()->setAnmClr("ridden"); + getTailBlock()->setRidden(); - mBlocks[0].setAnmClr("create"); - for (int i = 0; i < mBlockNum; i++) { - mBlocks[i].setAnmClr("ridden"); + mBlocks[0].setCreate(); + for (int i = 1; i < mBlockNum; i++) { + dBlock_c &curr = mBlocks[i]; + curr.setRidden(); } + int snakeSpeed = 16.0f / sc_snakeSpeeds[mParam >> 8 & 0x3]; + getHeadBlock()->mLastPos = getHeadBlock()->mPos; getTailBlock()->mLastPos = getTailBlock()->mPos; mCreateAnmBlockIdx = 0; - float f = getHeadBlock()->mAnmClr.getFrameMax(0); - mCreateAnmBlockNum = f / (16.0f / sc_snakeSpeeds[mParam >> 8 & 0xF]); + mCreateAnmBlockNum = getHeadBlock()->mAnmClr.getFrameMax(0) / snakeSpeed; } void daEnSnakeBlock_c::finalizeState_Move() {} void daEnSnakeBlock_c::executeState_Move() { @@ -646,16 +652,17 @@ void daEnSnakeBlock_c::executeState_Move() { setBlockPos(); mCreateAnmBlockIdx++; - if (mCreateAnmBlockNum < mCreateAnmBlockIdx) { + if (mCreateAnmBlockIdx > mCreateAnmBlockNum) { mCreateAnmBlockIdx = mCreateAnmBlockNum; } int frame_idx = 0; - int frame_delta = (int)(16.0f / sc_snakeSpeeds[(mParam >> 8) & 0xF]); + int frame_delta = (int)(16.0f / sc_snakeSpeeds[(mParam >> 8) & 0x3]); for (int i = 0; i < mCreateAnmBlockIdx; i++) { - mBlocks[i].setAnmClr("create"); - mBlocks[i].mAnmClr.setFrame(frame_idx, 0); + dBlock_c &curr = mBlocks[i]; + curr.setAnmClr("create"); + curr.mAnmClr.setFrame(frame_idx, 0); frame_idx += frame_delta; } } @@ -676,8 +683,9 @@ void daEnSnakeBlock_c::initializeState_Shake() { getTailBlock()->mAnmClr.setRate(0.0f, 0); for (int i = 0; i < mBlockNum; i++) { - mBlocks[i].setAnmClr("ridden"); - mBlocks[i].mAnmClr.setRate(0.0f, 0); + dBlock_c &curr = mBlocks[i]; + curr.setAnmClr("ridden"); + curr.mAnmClr.setRate(0.0f, 0); } mShakeTime = 60; @@ -696,8 +704,9 @@ void daEnSnakeBlock_c::initializeState_Stop() { getTailBlock()->mAnmClr.setRate(0.0f, 0); for (int i = 0; i < mBlockNum; i++) { - mBlocks[i].setAnmClr("ridden"); - mBlocks[i].mAnmClr.setRate(0.0f, 0); + dBlock_c &curr = mBlocks[i]; + curr.setAnmClr("ridden"); + curr.mAnmClr.setRate(0.0f, 0); } } void daEnSnakeBlock_c::finalizeState_Stop() {} @@ -706,8 +715,8 @@ void daEnSnakeBlock_c::executeState_Stop() {} void daEnSnakeBlock_c::initializeState_Collapse1() { static mVec2_c sc_collapseSpeeds[5] = { mVec2_c(0.0f, 0.0f), - mVec2_c(0.0f, 0.0f), - mVec2_c(0.0f, 0.0f), + mVec2_c(1.0f, 3.0f), + mVec2_c(0.0f, -1.0f), mVec2_c(0.0f, 0.0f), mVec2_c(0.0f, 0.0f) }; @@ -719,20 +728,24 @@ void daEnSnakeBlock_c::initializeState_Collapse1() { getHeadBlock()->mLastPos = getHeadBlock()->mPos; getTailBlock()->mLastPos = getTailBlock()->mPos; for (int i = 0; i < mBlockNum; i++) { - mBlocks[i].mLastPos = mBlocks[i].mPos; + dBlock_c &curr = mBlocks[i]; + curr.mLastPos = curr.mPos; } + int prev_idx = getHeadBlock()->mTravelInfoIdx; for (int i = 0; i < mBlockNum; i++) { - mBlocks[i].mTravelInfoIdx = prev_idx; + dBlock_c &curr = mBlocks[i]; + curr.mTravelInfoIdx = prev_idx; prev_idx--; } getTailBlock()->mTravelInfoIdx = prev_idx; - mVec3_c collapse_speed = mVec3_c(sc_collapseSpeeds[mpTravelInfo[mTravelInfoIdx]], 0.0f); - getHeadBlock()->mSpeed = collapse_speed; - getTailBlock()->mSpeed = collapse_speed; + mVec2_c collapse_speed = sc_collapseSpeeds[mpTravelInfo[mTravelInfoIdx]]; + getHeadBlock()->setSpeed(collapse_speed.x, collapse_speed.y, 0.0f); + getTailBlock()->setSpeed(collapse_speed.x, collapse_speed.y, 0.0f); for (int i = 0; i < mBlockNum; i++) { - mBlocks[i].mSpeed = collapse_speed; + dBlock_c &curr = mBlocks[i]; + curr.setSpeed(collapse_speed.x, collapse_speed.y, 0.0f); } } void daEnSnakeBlock_c::finalizeState_Collapse1() {} @@ -750,42 +763,30 @@ void daEnSnakeBlock_c::executeState_Collapse1() { void daEnSnakeBlock_c::initializeState_Collapse2() { mCollapse2Idx = 0; - getHeadBlock()->mSpeed = mVec3_c(0.0f, 0.0f, 0.0f); - getTailBlock()->mSpeed = mVec3_c(0.0f, 0.0f, 0.0f); + getHeadBlock()->resetSpeed(); + getTailBlock()->resetSpeed(); for (int i = 0; i < mBlockNum; i++) { - mBlocks[i].mSpeed = mVec3_c(0.0f, 0.0f, 0.0f); + dBlock_c &curr = mBlocks[i]; + curr.resetSpeed(); } } void daEnSnakeBlock_c::finalizeState_Collapse2() {} void daEnSnakeBlock_c::executeState_Collapse2() { - if (getHeadBlock()->mBgCtr.m_e2) { - getHeadBlock()->mBgCtr.release(); - } - getHeadBlock()->setFallCollapse(); - getHeadBlock()->mPos += getHeadBlock()->mSpeed; + mCtrlBlock[0].process(); if (mCollapse2Idx > mBlockNum * 8) { - if (getTailBlock()->mBgCtr.m_e2) { - getTailBlock()->mBgCtr.release(); - } - getTailBlock()->setFallCollapse(); - getTailBlock()->mPos += getTailBlock()->mSpeed; + mCtrlBlock[1].process(); } int i5 = mCollapse2Idx >> 3; - int i6 = mBlockNum - 1; - if (i5 > i6) { - i5 = i6; + if (i5 > mBlockNum - 1) { + i5 = mBlockNum - 1; } - for (int i = 0; i <= i5; i++) { - dBlock_c * block = &mBlocks[i]; - block->mBgCtr.release(); //< double release? - if (block->mBgCtr.m_e2) { - block->mBgCtr.release(); - } - block->setFallCollapse(); - block->mPos += block->mSpeed; + for (int i = 0; i < i5 + 1; i++) { + dBlock_c &curr = mBlocks[i]; + curr.mBgCtr.release(); + curr.process(); } mCollapse2Idx++; @@ -795,32 +796,26 @@ void daEnSnakeBlock_c::executeState_Collapse2() { } void daEnSnakeBlock_c::initializeState_Collapse3() { - getHeadBlock()->mSpeed = mVec3_c(0.0f, 0.0f, 0.0f); - getTailBlock()->mSpeed = mVec3_c(0.0f, 0.0f, 0.0f); + getHeadBlock()->resetSpeed(); + getTailBlock()->resetSpeed(); + for (int i = 0; i < mBlockNum; i++) { - mBlocks[i].mSpeed = mVec3_c(0.0f, 0.0f, 0.0f); + dBlock_c &curr = mBlocks[i]; + curr.resetSpeed(); } } void daEnSnakeBlock_c::finalizeState_Collapse3() {} void daEnSnakeBlock_c::executeState_Collapse3() { - if (getHeadBlock()->mBgCtr.m_e2) { - getHeadBlock()->mBgCtr.release(); - } - getHeadBlock()->setFallCollapse(); - getHeadBlock()->mPos += getHeadBlock()->mSpeed; - - if (getTailBlock()->mBgCtr.m_e2) { - getTailBlock()->mBgCtr.release(); - } - getTailBlock()->setFallCollapse(); - getTailBlock()->mPos += getTailBlock()->mSpeed; + mCtrlBlock[0].process(); + mCtrlBlock[1].process(); for (int i = 0; i < mBlockNum; i++) { - if (mBlocks[i].mBgCtr.m_e2) { - mBlocks[i].mBgCtr.release(); + dBlock_c &curr = mBlocks[i]; + if (curr.mBgCtr.m_dc) { + curr.mBgCtr.release(); } - mBlocks[i].setFallCollapse(); - mBlocks[i].mPos += mBlocks[i].mSpeed; + curr.setFallCollapse(); + curr.mPos += curr.mSpeed; } if (chkCollapseDelete()) { From 3b5696ccdc5344886b84265a7835405229d548eb Mon Sep 17 00:00:00 2001 From: RootCubed Date: Wed, 25 Mar 2026 12:16:05 +0100 Subject: [PATCH 08/15] `daEnSnakeBlock_c` 95% matching --- include/game/bases/d_a_en_snake_block.hpp | 10 +- slices/d_enemiesNP.json | 1 + .../d_enemiesNP/bases/d_a_en_snake_block.cpp | 321 +++++------------- 3 files changed, 101 insertions(+), 231 deletions(-) diff --git a/include/game/bases/d_a_en_snake_block.hpp b/include/game/bases/d_a_en_snake_block.hpp index 6a1ee79c..10bd5f66 100644 --- a/include/game/bases/d_a_en_snake_block.hpp +++ b/include/game/bases/d_a_en_snake_block.hpp @@ -59,6 +59,7 @@ class daEnSnakeBlock_c : public dEn_c { void setCreate() { setAnmClr("create"); } void setRidden() { setAnmClr("ridden"); } mVec3_c getPos() const { return mPos; } + void setPos(mVec3_c pos) { mPos = pos; } void setSpeed(float x, float y, float z) { mSpeed.set(x, y, z); } void resetSpeed() { mSpeed.set(0.0f, 0.0f, 0.0f); } void process() { @@ -149,10 +150,17 @@ class daEnSnakeBlock_c : public dEn_c { int mCreateAnmBlockNum; u8 _pad[4]; - static float sc_snakeSpeeds[3]; + ACTOR_PARAM_CONFIG(RailStartIdx, 12, 8); + + static const float sc_unk1; + static const float sc_unk2; + static const float sc_snakeSpeeds[3]; + static const float sc_snakeSpeeds2[3]; + static const float sc_snakeDir[2]; static sStateID_c *sc_stopStates[4]; static mVec2_c sc_ctrlPosMods[5]; static int sc_glbSnakeNum; + static int sc_filler[]; STATE_FUNC_DECLARE(daEnSnakeBlock_c, Wait); STATE_FUNC_DECLARE(daEnSnakeBlock_c, Move); diff --git a/slices/d_enemiesNP.json b/slices/d_enemiesNP.json index d903fce2..daa6923c 100644 --- a/slices/d_enemiesNP.json +++ b/slices/d_enemiesNP.json @@ -39,6 +39,7 @@ "nonMatching": true, "memoryRanges": { ".text": "0x103a50-0x106960", + ".rodata": "0x72a0-0x7310", ".data": "0x33680-0x33b90", ".bss": "0x9f30-0xa178" } diff --git a/source/d_enemiesNP/bases/d_a_en_snake_block.cpp b/source/d_enemiesNP/bases/d_a_en_snake_block.cpp index deda9e49..e7fa1afa 100644 --- a/source/d_enemiesNP/bases/d_a_en_snake_block.cpp +++ b/source/d_enemiesNP/bases/d_a_en_snake_block.cpp @@ -10,7 +10,10 @@ ACTOR_PROFILE(EN_SNAKEBLOCK, daEnSnakeBlock_c, 0); -int daEnSnakeBlock_c::sc_glbSnakeNum = 0; +const float daEnSnakeBlock_c::sc_unk1 = -0.1875f; +const float daEnSnakeBlock_c::sc_unk2 = -4.0f; + +int daEnSnakeBlock_c::sc_filler[12] = {0}; mVec2_c daEnSnakeBlock_c::sc_ctrlPosMods[5] = { mVec2_c(0.0f, 0.0f), @@ -20,9 +23,7 @@ mVec2_c daEnSnakeBlock_c::sc_ctrlPosMods[5] = { mVec2_c(1.0f, 0.0f) }; -float daEnSnakeBlock_c::sc_snakeSpeeds[3] = { - 0.5f, 1.0f, 1.4f -}; +int daEnSnakeBlock_c::sc_glbSnakeNum = 0; STATE_DEFINE(daEnSnakeBlock_c, Wait); STATE_DEFINE(daEnSnakeBlock_c, Move); @@ -36,7 +37,7 @@ void daEnSnakeBlock_c::dBlock_c::createMdl(dHeapAllocator_c *alloc) { mResFile = dResMng_c::m_instance->getRes("block_snake_ice", "g3d/block_snake_ice.brres"); nw4r::g3d::ResMdl mdl = mResFile.GetResMdl("block_snake_ice"); - mModel.create(mdl, alloc, 0x32c, 1); + mModel.create(mdl, alloc, 0x32c, 1, nullptr); dActor_c::setSoftLight_MapObj(mModel); mResTexSrt = mResFile.GetResAnmTexSrt("block_snake_ice"); @@ -129,7 +130,7 @@ void daEnSnakeBlock_c::dBlock_c::calcCollapse1(s8 *travelInfo) { mVec2_c(2.0f, 0.0f) }; - if (mBgCtr.m_e2) { + if (mBgCtr.m_dc) { mBgCtr.release(); } @@ -166,6 +167,18 @@ void daEnSnakeBlock_c::dBlock_c::callBackF(dActor_c *self, dActor_c *other) { void daEnSnakeBlock_c::dBlock_c::callBackH(dActor_c *self, dActor_c *other) {} void daEnSnakeBlock_c::dBlock_c::callBackW(dActor_c *self, dActor_c *other, u8 x) {} +const float daEnSnakeBlock_c::sc_snakeSpeeds2[3] = { + 0.5f, 1.0f, 1.4f +}; + +const float daEnSnakeBlock_c::sc_snakeSpeeds[3] = { + 0.5f, 1.0f, 1.4f +}; + +const float daEnSnakeBlock_c::sc_snakeDir[2] = { + 1.0f, -1.0f +}; + bool daEnSnakeBlock_c::dCtrlBlock_c::calcPos(s8 *travelInfo) { // int inf = travelInfo[mTravelInfoIdx]; float speed = sc_snakeSpeeds[mSnakeSpeedIdx]; @@ -237,7 +250,7 @@ int daEnSnakeBlock_c::draw() { mVec3_c offset(0.0f, 0.0f, 0.0f); if (mShakeTime > 0) { - offset.x += sc_snakeSpeeds[(mShakeTime >> 1) & 1]; + offset.x += sc_snakeDir[(mShakeTime >> 1) & 1]; } getHeadBlock()->draw(offset); @@ -275,22 +288,30 @@ void daEnSnakeBlock_c::initBlockPath() { sRailInfoData *rail = dRail_c::getRailInfoP((mParam >> 4) & 0xF); dCdFile_c *file = dCd_c::m_instance->getFileP(dScStage_c::m_instance->mCurrFile); - sRailNodeData *node = &file->mpRailNodes[rail->mNodeIdx + ((mParam >> 12) & 0xFF)]; + sRailNodeData *node = &file->mpRailNodes[ACTOR_PARAM(RailStartIdx)]; + node = &node[rail->mNodeIdx]; - float f1 = node->mX + (mBlockNum * 16.0f); - float f2 = node->mY - 8.0f; - mVec3_c head_pos = mVec3_c(f1, f2, 1516.0f); - getHeadBlock()->initBgCtr(this, head_pos, (mParam >> 20) & 1); + bool icy = (mParam >> 20) & 1; - mVec3_c mid_pos; - for (int i = 0; i < mBlockNum; i++) { - mid_pos.set(f1, f2, 1500.0f); - mBlocks[i].initBgCtr(this, mid_pos, (mParam >> 20) & 1); - f1 -= 16.0f; + float nodeX = node->mX; + float nodeY = node->mY; + float x = nodeX + mBlockNum * 16.0f + 8.0f; + float y = -nodeY - 8.0f; + + mVec3_c headPos(x, y, 1516.0f); + + getHeadBlock()->initBgCtr(this, headPos, icy); + + if (mBlockNum > 0) { + for (int i = 0; i < mBlockNum; i++) { + mVec3_c midPos(x, y, 1500.0f); + mBlocks[i].initBgCtr(this, midPos, icy); + x -= 16.0f; + } } - mVec3_c tail_pos = mVec3_c(f1, f2, 1516.0f); - getTailBlock()->initBgCtr(this, tail_pos, (mParam >> 20) & 1); + mVec3_c tailPos = mVec3_c(x, y, 1516.0f); + getTailBlock()->initBgCtr(this, tailPos, icy); getHeadBlock()->mTravelInfoIdx = mBlockNum + 1; getTailBlock()->mTravelInfoIdx = 1; @@ -350,229 +371,68 @@ void daEnSnakeBlock_c::initTravelInfo() { sRailInfoData *rail = dRail_c::getRailInfoP((mParam >> 4) & 0xF); dCdFile_c *file = dCd_c::m_instance->getFileP(dScStage_c::m_instance->mCurrFile); - sRailNodeData *node = &file->mpRailNodes[rail->mNodeIdx + ((mParam >> 12) & 0xFF)]; + sRailNodeData *node = &file->mpRailNodes[rail->mNodeIdx]; - u32 dist = 0; - u32 start_idx = (mParam >> 12) & 0xFF; - for (int i = start_idx; i < (rail->mCount - 1); i++) { - sRailNodeData * next_node = node + 1; - s16 dx = abs((next_node->mX >> 4) - (node->mX >> 4)); - s16 dy = abs((next_node->mY >> 4) - (node->mY >> 4)); + int dist = 0; + int startIdx = ACTOR_PARAM(RailStartIdx); + int endIdx = rail->mCount - 1; + + for (int i = startIdx; i < endIdx; i++) { + s16 dx = abs((node[i + 1].mX >> 4) - (node[i].mX >> 4)); + s16 dy = abs((node[i + 1].mY >> 4) - (node[i].mY >> 4)); dist += dx + dy; - node = next_node; } mTravelInfoIdx = dist; mpTravelInfo = new s8[dist + 2]; - int i11 = 1; - for (; start_idx < rail->mCount; start_idx++) { - sRailNodeData * next_node = node + 1; - s16 i8 = (next_node->mX >> 4) - (node->mX >> 4); - s16 i7 = (next_node->mY >> 4) - (node->mY >> 4); + int currIdx = 1; + for (int i11 = startIdx; i11 < rail->mCount - 1; i11++) { + s16 dx = (node[i11 + 1].mX >> 4) - (node[i11].mX >> 4); + s16 dy = (node[i11 + 1].mY >> 4) - (node[i11].mY >> 4); - s32 i4 = abs(i8); - s32 i13 = (s16)i4; - i4 = abs(i7); - i4 = (s16)i4; + int dx_ = (s16) abs(dx); + int dy_ = (s16) abs(dy); - u8 b5 = 0; - u8 b6 = 0; + u8 ti0 = 0; + u8 ti1 = 0; - if (i8 < 1) { - if (i8 < 0) { - b5 = 3; - } - } else { - b5 = 4; + if (dx > 0) { + ti0 = 4; + } else if (dx < 0) { + ti0 = 3; } - if (i7 < 0) { - b6 = 1; - } else if (i7 > 0) { - b6 = 2; + if (dy < 0) { + ti1 = 1; + } else if (dy > 0) { + ti1 = 2; } - i7 = 0; - if (i4 < i13) { - i8 = 0; - if (i4 > 0) { - if (i4 > 8) { - bool b2 = false; - if ((i4 > -1) && (i4 < 0x7FFFFFFF)) { - b2 = true; - } - - if (b2) { - u32 u15 = ((u32)(i4 - 1)) >> 3; - - if (u15 > 0) { - do { - u32 idx = i11 + i7; - i7 += 0x10; - i8 += 8; - - mpTravelInfo[idx ] = b5; - mpTravelInfo[idx + 1] = b5; - mpTravelInfo[idx + 2] = b5; - mpTravelInfo[idx + 3] = b5; - mpTravelInfo[idx + 4] = b5; - mpTravelInfo[idx + 5] = b5; - mpTravelInfo[idx + 6] = b5; - mpTravelInfo[idx + 7] = b5; - mpTravelInfo[idx + 8] = b5; - mpTravelInfo[idx + 9] = b5; - mpTravelInfo[idx + 10] = b5; - mpTravelInfo[idx + 11] = b5; - mpTravelInfo[idx + 12] = b5; - mpTravelInfo[idx + 13] = b5; - mpTravelInfo[idx + 14] = b5; - mpTravelInfo[idx + 15] = b5; - - u15--; - } while (u15 != 0); - } - } - int i9 = i4 - i8; - if (i9 > 0) { - while (i9 != 0) { - int i8 = i11 + i7; - i7 += 2; - mpTravelInfo[i8] = b5; - mpTravelInfo[i8 + 1] = b5; - } - } - } - i13 -= i4; - i4 = 0; - if (i13 > 0) { - if (i13 > 8) { - bool b2 = false; - if ((i13 > -1) && (i13 < 0x7FFFFFFF)) { - b2 = true; - } - if (b2) { - int u15 = (i13 - 1) >> 3; - if (u15 > 0) { - while (u15 != 0) { - int i8 = i11 + i7; - i7 += 8; - i4 += 8; - mpTravelInfo[i8] = b5; - mpTravelInfo[i8 + 1] = b5; - mpTravelInfo[i8 + 2] = b5; - mpTravelInfo[i8 + 3] = b5; - mpTravelInfo[i8 + 4] = b5; - mpTravelInfo[i8 + 5] = b5; - mpTravelInfo[i8 + 6] = b5; - mpTravelInfo[i8 + 7] = b5; - u15--; - } - } - } - } - i8 = i13 - i4; - if (i4 < i13) { - do { - i4 = i11 + i7; - i7++; - mpTravelInfo[i4] = b5; - i8--; - } while (i8 != 0); - } - } + int count = 0; + if (dx_ <= dy_) { + for (int i = 0; i < dx_; i++) { + mpTravelInfo[currIdx + i * 2] = ti0; + mpTravelInfo[currIdx + i * 2 + 1] = ti1; + count += 2; + } + for (int i = 0; i < dy_ - dx_; i++) { + mpTravelInfo[currIdx + i] = ti1; + count++; } } else { - i8 = 0; - if (i13 > 0) { - if (i13 > 8) { - bool b2 = false; - if ((i13 > -1) && (i13 < 0x7FFFFFFF)) { - b2 = true; - } - if (b2) { - u32 u15 = ((u32)(i13 - 1)) >> 3; - if (u15 > 0) { - do { - int i9 = i11 + i7; - i7 += 16; - i8 += 8; - mpTravelInfo[i9 ] = b5; - mpTravelInfo[i9 + 1] = b5; - mpTravelInfo[i9 + 2] = b5; - mpTravelInfo[i9 + 3] = b5; - mpTravelInfo[i9 + 4] = b5; - mpTravelInfo[i9 + 5] = b5; - mpTravelInfo[i9 + 6] = b5; - mpTravelInfo[i9 + 7] = b5; - mpTravelInfo[i9 + 8] = b5; - mpTravelInfo[i9 + 9] = b5; - mpTravelInfo[i9 + 10] = b5; - mpTravelInfo[i9 + 11] = b5; - mpTravelInfo[i9 + 12] = b5; - mpTravelInfo[i9 + 13] = b5; - mpTravelInfo[i9 + 14] = b5; - mpTravelInfo[i9 + 15] = b5; - u15--; - } while (u15 != 0); - } - } - int i9 = i13 - i8; - if (i8 < i13) { - while (i9 != 0) { - i8 = i11 + i7; - i7 += 2; - mpTravelInfo[i8] = b5; - mpTravelInfo[i8 + 1] = b5; - i9--; - } - } - } + for (int i = 0; i < dy_; i++) { + mpTravelInfo[currIdx + i * 2] = ti0; + mpTravelInfo[currIdx + i * 2 + 1] = ti1; + count += 2; } - i4 -= i13; - i13 = 0; - if (i4 > 0) { - if (i4 > 8) { - bool b2 = false; - if ((i4 > -1) && (i4 < 0x7FFFFFFF)) { - b2 = true; - } - - if (b2) { - u32 u15 = (u32)(i4 - 1) >> 3; - if (u15 > 0) { - while (u15 != 0) { - i8 = i11 + i7; - i7 += 8; - i13 += 8; - mpTravelInfo[i8] = b6; - mpTravelInfo[i8 + 1] = b6; - mpTravelInfo[i8 + 2] = b6; - mpTravelInfo[i8 + 3] = b6; - mpTravelInfo[i8 + 4] = b6; - mpTravelInfo[i8 + 5] = b6; - mpTravelInfo[i8 + 6] = b6; - mpTravelInfo[i8 + 7] = b6; - u15--; - } - } - } - } - - i8 = i4 - i13; - if (i8 > 0) { - while (i8 != 0) { - i4 = i11 + i7; - i7++; - i8--; - mpTravelInfo[i4] = b6; - } - } + for (int i = 0; i < dx_ - dy_; i++) { + mpTravelInfo[currIdx + i] = ti1; + count++; } } - node += 1; - i11 += i7; + currIdx += count; } mpTravelInfo[0] = 0; @@ -582,16 +442,21 @@ void daEnSnakeBlock_c::initTravelInfo() { void daEnSnakeBlock_c::setBlockPos() { dBlock_c *prev = &mBlocks[mBlockNum - 2]; dBlock_c *curr = &mBlocks[mBlockNum - 1]; + mVec3_c tmp; for (int i = 0; i < mBlockNum - 1; i++) { - mVec3_c tmp(prev->getPos().x, prev->getPos().y, 1500.0f); - curr->mPos = tmp; + tmp.x = prev->getPos().x; + tmp.y = prev->getPos().y; + tmp.z = 1500.0f; + curr->setPos(tmp); curr--; prev--; } - mVec3_c tmp(getHeadBlock()->getPos().x, getHeadBlock()->getPos().y, 1500.0f); - mBlocks[0].mPos = tmp; + tmp.x = getHeadBlock()->getPos().x; + tmp.y = getHeadBlock()->getPos().y; + tmp.z = 1500.0f; + mBlocks[0].setPos(tmp); } void daEnSnakeBlock_c::setActorPos() { @@ -721,10 +586,6 @@ void daEnSnakeBlock_c::initializeState_Collapse1() { mVec2_c(0.0f, 0.0f) }; - static float floats[] = { - 0.0f, 0.0f, 1.0f, 3.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f - }; - getHeadBlock()->mLastPos = getHeadBlock()->mPos; getTailBlock()->mLastPos = getTailBlock()->mPos; for (int i = 0; i < mBlockNum; i++) { From cf6485c4b406b8a8ff16f2afc6fc4e51eb3707ad Mon Sep 17 00:00:00 2001 From: RootCubed Date: Wed, 25 Mar 2026 18:43:45 +0100 Subject: [PATCH 09/15] `daEnSnakeBlock_c` 98% matching --- include/game/bases/d_a_en_snake_block.hpp | 6 +- .../d_enemiesNP/bases/d_a_en_snake_block.cpp | 122 ++++++++++-------- 2 files changed, 69 insertions(+), 59 deletions(-) diff --git a/include/game/bases/d_a_en_snake_block.hpp b/include/game/bases/d_a_en_snake_block.hpp index 10bd5f66..41ff695a 100644 --- a/include/game/bases/d_a_en_snake_block.hpp +++ b/include/game/bases/d_a_en_snake_block.hpp @@ -133,6 +133,8 @@ class daEnSnakeBlock_c : public dEn_c { dCtrlBlock_c *getHeadBlock() { return &mCtrlBlock[0]; } dCtrlBlock_c *getTailBlock() { return &mCtrlBlock[1]; } + int getBlockCount() const { return mBlockNum; } + dHeapAllocator_c mAllocator; dCtrlBlock_c mCtrlBlock[2]; @@ -152,8 +154,8 @@ class daEnSnakeBlock_c : public dEn_c { ACTOR_PARAM_CONFIG(RailStartIdx, 12, 8); - static const float sc_unk1; - static const float sc_unk2; + static const float sc_FallAccel; + static const float sc_FallMaxSpeed; static const float sc_snakeSpeeds[3]; static const float sc_snakeSpeeds2[3]; static const float sc_snakeDir[2]; diff --git a/source/d_enemiesNP/bases/d_a_en_snake_block.cpp b/source/d_enemiesNP/bases/d_a_en_snake_block.cpp index e7fa1afa..7e935f77 100644 --- a/source/d_enemiesNP/bases/d_a_en_snake_block.cpp +++ b/source/d_enemiesNP/bases/d_a_en_snake_block.cpp @@ -10,8 +10,8 @@ ACTOR_PROFILE(EN_SNAKEBLOCK, daEnSnakeBlock_c, 0); -const float daEnSnakeBlock_c::sc_unk1 = -0.1875f; -const float daEnSnakeBlock_c::sc_unk2 = -4.0f; +const float daEnSnakeBlock_c::sc_FallAccel = -0.1875f; +const float daEnSnakeBlock_c::sc_FallMaxSpeed = -4.0f; int daEnSnakeBlock_c::sc_filler[12] = {0}; @@ -115,9 +115,9 @@ void daEnSnakeBlock_c::dBlock_c::calcBgCtr() { } void daEnSnakeBlock_c::dBlock_c::setFallCollapse() { - mSpeed.y += -0.1875f; - if (mSpeed.y < -4.0f) { - mSpeed.y = -4.0f; + mSpeed.y += sc_FallAccel; + if (mSpeed.y < sc_FallMaxSpeed) { + mSpeed.y = sc_FallMaxSpeed; } } @@ -180,14 +180,11 @@ const float daEnSnakeBlock_c::sc_snakeDir[2] = { }; bool daEnSnakeBlock_c::dCtrlBlock_c::calcPos(s8 *travelInfo) { - // int inf = travelInfo[mTravelInfoIdx]; + mVec2_c v = sc_ctrlPosMods[travelInfo[mTravelInfoIdx]]; + float speed = sc_snakeSpeeds[mSnakeSpeedIdx]; - mVec2_c v( - speed * sc_ctrlPosMods[travelInfo[mTravelInfoIdx]].x, - speed * sc_ctrlPosMods[travelInfo[mTravelInfoIdx]].y - ); - mPos.x += v.x; - mPos.y += v.y; + mPos.x += speed * v.x; + mPos.y += speed * v.y; if (std::fabs(mPos.x - mLastPos.x) >= 16.0f || std::fabs(mPos.y - mLastPos.y) >= 16.0f) { return true; @@ -203,14 +200,15 @@ bool daEnSnakeBlock_c::dCtrlBlock_c::calcTravelPos(s8 *travelInfo) { float x = mLastPos.x + newPos.x * 16.0f; float y = mLastPos.y + newPos.y * 16.0f; - mLastPos.z = mPos.z; - mPos.x = x; mPos.y = y; mLastPos.x = x; mLastPos.y = y; - return travelInfo[++mTravelInfoIdx] == 0; + mLastPos.z = mPos.z; + + mTravelInfoIdx++; + return travelInfo[mTravelInfoIdx] == 0; } int daEnSnakeBlock_c::create() { @@ -288,13 +286,13 @@ void daEnSnakeBlock_c::initBlockPath() { sRailInfoData *rail = dRail_c::getRailInfoP((mParam >> 4) & 0xF); dCdFile_c *file = dCd_c::m_instance->getFileP(dScStage_c::m_instance->mCurrFile); - sRailNodeData *node = &file->mpRailNodes[ACTOR_PARAM(RailStartIdx)]; - node = &node[rail->mNodeIdx]; + sRailNodeData *node = &file->mpRailNodes[rail->mNodeIdx]; + node = &node[ACTOR_PARAM(RailStartIdx)]; bool icy = (mParam >> 20) & 1; - float nodeX = node->mX; - float nodeY = node->mY; + float nodeX = node[0].mX; + float nodeY = node[0].mY; float x = nodeX + mBlockNum * 16.0f + 8.0f; float y = -nodeY - 8.0f; @@ -302,11 +300,15 @@ void daEnSnakeBlock_c::initBlockPath() { getHeadBlock()->initBgCtr(this, headPos, icy); + dBlock_c *curr = mBlocks; + int i = 0; if (mBlockNum > 0) { - for (int i = 0; i < mBlockNum; i++) { + while (i < mBlockNum) { mVec3_c midPos(x, y, 1500.0f); - mBlocks[i].initBgCtr(this, midPos, icy); + curr->initBgCtr(this, midPos, icy); x -= 16.0f; + curr++; + i++; } } @@ -387,48 +389,53 @@ void daEnSnakeBlock_c::initTravelInfo() { mpTravelInfo = new s8[dist + 2]; int currIdx = 1; - for (int i11 = startIdx; i11 < rail->mCount - 1; i11++) { - s16 dx = (node[i11 + 1].mX >> 4) - (node[i11].mX >> 4); - s16 dy = (node[i11 + 1].mY >> 4) - (node[i11].mY >> 4); + for (int i = startIdx; i < rail->mCount - 1; i++) { + s16 dx = (node[i + 1].mX >> 4) - (node[i].mX >> 4); + s16 dy = (node[i + 1].mY >> 4) - (node[i].mY >> 4); int dx_ = (s16) abs(dx); int dy_ = (s16) abs(dy); - u8 ti0 = 0; - u8 ti1 = 0; + s8 initialDir = 0; + s8 secondDir = 0; if (dx > 0) { - ti0 = 4; + initialDir = 4; } else if (dx < 0) { - ti0 = 3; + initialDir = 3; } if (dy < 0) { - ti1 = 1; + secondDir = 1; } else if (dy > 0) { - ti1 = 2; + secondDir = 2; } int count = 0; if (dx_ <= dy_) { - for (int i = 0; i < dx_; i++) { - mpTravelInfo[currIdx + i * 2] = ti0; - mpTravelInfo[currIdx + i * 2 + 1] = ti1; + for (int j = 0; j < dx_; j++) { + int idx = currIdx + count; + mpTravelInfo[idx] = initialDir; + mpTravelInfo[idx + 1] = secondDir; count += 2; } - for (int i = 0; i < dy_ - dx_; i++) { - mpTravelInfo[currIdx + i] = ti1; + int rest = dy_ - dx_; + for (int j = 0; j < rest; j++) { + int idx = currIdx + count; count++; + mpTravelInfo[idx] = secondDir; } } else { - for (int i = 0; i < dy_; i++) { - mpTravelInfo[currIdx + i * 2] = ti0; - mpTravelInfo[currIdx + i * 2 + 1] = ti1; + for (int j = 0; j < dy_; j++) { + int idx = currIdx + count; + mpTravelInfo[idx] = initialDir; + mpTravelInfo[idx + 1] = secondDir; count += 2; } - for (int i = 0; i < dx_ - dy_; i++) { - mpTravelInfo[currIdx + i] = ti1; + for (int j = 0; j < dx_ - dy_; j++) { + int idx = currIdx + count; count++; + mpTravelInfo[idx] = secondDir; } } @@ -466,8 +473,7 @@ void daEnSnakeBlock_c::setActorPos() { } bool daEnSnakeBlock_c::chkCollapseDelete() { - mVec3_c pos = getTailBlock()->mPos; - return pos.y < dBgParameter_c::ms_Instance_p->yEnd() - 16.0f; + return getTailBlock()->getPos().y < dBgParameter_c::ms_Instance_p->yEnd() - 16.0f; } bool daEnSnakeBlock_c::chkOffScreen() { @@ -494,11 +500,11 @@ void daEnSnakeBlock_c::initializeState_Move() { curr.setRidden(); } - int snakeSpeed = 16.0f / sc_snakeSpeeds[mParam >> 8 & 0x3]; - getHeadBlock()->mLastPos = getHeadBlock()->mPos; getTailBlock()->mLastPos = getTailBlock()->mPos; + int snakeSpeed = 16.0f / sc_snakeSpeeds[mParam >> 8 & 0x3]; + mCreateAnmBlockIdx = 0; mCreateAnmBlockNum = getHeadBlock()->mAnmClr.getFrameMax(0) / snakeSpeed; } @@ -521,14 +527,14 @@ void daEnSnakeBlock_c::executeState_Move() { mCreateAnmBlockIdx = mCreateAnmBlockNum; } - int frame_idx = 0; - int frame_delta = (int)(16.0f / sc_snakeSpeeds[(mParam >> 8) & 0x3]); + int snakeSpeed = 16.0f / sc_snakeSpeeds[mParam >> 8 & 0x3]; + int frame = 0; for (int i = 0; i < mCreateAnmBlockIdx; i++) { dBlock_c &curr = mBlocks[i]; curr.setAnmClr("create"); - curr.mAnmClr.setFrame(frame_idx, 0); - frame_idx += frame_delta; + curr.mAnmClr.setFrame(frame, 0); + frame += snakeSpeed; } } @@ -588,23 +594,25 @@ void daEnSnakeBlock_c::initializeState_Collapse1() { getHeadBlock()->mLastPos = getHeadBlock()->mPos; getTailBlock()->mLastPos = getTailBlock()->mPos; - for (int i = 0; i < mBlockNum; i++) { + for (int i = 0; i < getBlockCount(); i++) { dBlock_c &curr = mBlocks[i]; curr.mLastPos = curr.mPos; } - int prev_idx = getHeadBlock()->mTravelInfoIdx; - for (int i = 0; i < mBlockNum; i++) { - dBlock_c &curr = mBlocks[i]; - curr.mTravelInfoIdx = prev_idx; - prev_idx--; + dBlock_c *curr2 = getHeadBlock(); + int prevIdx = curr2->mTravelInfoIdx; + for (u32 i = 0; i < getBlockCount(); i++) { + curr2 = &mBlocks[i]; + curr2->mTravelInfoIdx = prevIdx; + prevIdx--; } - getTailBlock()->mTravelInfoIdx = prev_idx; + getTailBlock()->mTravelInfoIdx = prevIdx; - mVec2_c collapse_speed = sc_collapseSpeeds[mpTravelInfo[mTravelInfoIdx]]; + int idx = mpTravelInfo[mTravelInfoIdx]; + mVec2_c collapse_speed = sc_collapseSpeeds[idx]; getHeadBlock()->setSpeed(collapse_speed.x, collapse_speed.y, 0.0f); getTailBlock()->setSpeed(collapse_speed.x, collapse_speed.y, 0.0f); - for (int i = 0; i < mBlockNum; i++) { + for (u32 i = 0; i < getBlockCount(); i++) { dBlock_c &curr = mBlocks[i]; curr.setSpeed(collapse_speed.x, collapse_speed.y, 0.0f); } From c60f66307691153f977fefac0a4fc7cf85accccb Mon Sep 17 00:00:00 2001 From: RootCubed Date: Wed, 25 Mar 2026 21:35:22 +0100 Subject: [PATCH 10/15] `daEnSnakeBlock_c`: 1 function remaining --- alias_db.txt | 13 +++ include/game/bases/d_a_en_snake_block.hpp | 6 +- slices/d_enemiesNP.json | 1 + .../d_enemiesNP/bases/d_a_en_snake_block.cpp | 92 ++++++++++--------- syms.txt | 16 ++-- 5 files changed, 71 insertions(+), 57 deletions(-) diff --git a/alias_db.txt b/alias_db.txt index 602c5e85..8679d401 100644 --- a/alias_db.txt +++ b/alias_db.txt @@ -739,3 +739,16 @@ R_2_5_4180 = g_profile_DEMO_MESSAGE R_2_5_72e0 = g_profile_LETTER_WINDOW R_2_5_1a7f8 = g_profile_DUMMY_ACTOR R_2_5_27460 = g_profile_LASTACTOR_STAGE +R_3_1_70 = __register_global_object +R_3_1_780 = getPlrNo__8dActor_cFv +R_3_1_2700 = finalUpdate__12dBaseActor_cFv +R_3_1_2710 = GetActorType__12dBaseActor_cFv +R_3_1_2720 = funsuiMoveX__8dActor_cFv +R_3_1_2730 = setCarryFall__8dActor_cFP8dActor_ci +R_3_1_2740 = isSpinLiftUpEnable__8dActor_cFv +R_3_1_2750 = vf68__8dActor_cFP9dBg_ctr_c +R_3_1_2760 = isFunsui__5dEn_cCFv +R_3_1_2770 = endFunsui__5dEn_cFv +R_3_1_2780 = beginFunsui__5dEn_cFv +R_3_1_2790 = calcBoyonScale__5dEn_cFv +R_3_1_33e0 = isQuakeDamage__5dEn_cFv diff --git a/include/game/bases/d_a_en_snake_block.hpp b/include/game/bases/d_a_en_snake_block.hpp index 41ff695a..26f17181 100644 --- a/include/game/bases/d_a_en_snake_block.hpp +++ b/include/game/bases/d_a_en_snake_block.hpp @@ -56,8 +56,6 @@ class daEnSnakeBlock_c : public dEn_c { void setFallCollapse(); void calcCollapse1(s8 *travelInfo); - void setCreate() { setAnmClr("create"); } - void setRidden() { setAnmClr("ridden"); } mVec3_c getPos() const { return mPos; } void setPos(mVec3_c pos) { mPos = pos; } void setSpeed(float x, float y, float z) { mSpeed.set(x, y, z); } @@ -133,8 +131,6 @@ class daEnSnakeBlock_c : public dEn_c { dCtrlBlock_c *getHeadBlock() { return &mCtrlBlock[0]; } dCtrlBlock_c *getTailBlock() { return &mCtrlBlock[1]; } - int getBlockCount() const { return mBlockNum; } - dHeapAllocator_c mAllocator; dCtrlBlock_c mCtrlBlock[2]; @@ -162,7 +158,7 @@ class daEnSnakeBlock_c : public dEn_c { static sStateID_c *sc_stopStates[4]; static mVec2_c sc_ctrlPosMods[5]; static int sc_glbSnakeNum; - static int sc_filler[]; + static const int scSnakeSoundID; STATE_FUNC_DECLARE(daEnSnakeBlock_c, Wait); STATE_FUNC_DECLARE(daEnSnakeBlock_c, Move); diff --git a/slices/d_enemiesNP.json b/slices/d_enemiesNP.json index daa6923c..8d1809b4 100644 --- a/slices/d_enemiesNP.json +++ b/slices/d_enemiesNP.json @@ -39,6 +39,7 @@ "nonMatching": true, "memoryRanges": { ".text": "0x103a50-0x106960", + ".ctors": "0x228-0x22c", ".rodata": "0x72a0-0x7310", ".data": "0x33680-0x33b90", ".bss": "0x9f30-0xa178" diff --git a/source/d_enemiesNP/bases/d_a_en_snake_block.cpp b/source/d_enemiesNP/bases/d_a_en_snake_block.cpp index 7e935f77..d85658f1 100644 --- a/source/d_enemiesNP/bases/d_a_en_snake_block.cpp +++ b/source/d_enemiesNP/bases/d_a_en_snake_block.cpp @@ -13,26 +13,6 @@ ACTOR_PROFILE(EN_SNAKEBLOCK, daEnSnakeBlock_c, 0); const float daEnSnakeBlock_c::sc_FallAccel = -0.1875f; const float daEnSnakeBlock_c::sc_FallMaxSpeed = -4.0f; -int daEnSnakeBlock_c::sc_filler[12] = {0}; - -mVec2_c daEnSnakeBlock_c::sc_ctrlPosMods[5] = { - mVec2_c(0.0f, 0.0f), - mVec2_c(0.0f, 1.0f), - mVec2_c(0.0f, -1.0f), - mVec2_c(-1.0f, 0.0f), - mVec2_c(1.0f, 0.0f) -}; - -int daEnSnakeBlock_c::sc_glbSnakeNum = 0; - -STATE_DEFINE(daEnSnakeBlock_c, Wait); -STATE_DEFINE(daEnSnakeBlock_c, Move); -STATE_DEFINE(daEnSnakeBlock_c, Shake); -STATE_DEFINE(daEnSnakeBlock_c, Collapse1); -STATE_DEFINE(daEnSnakeBlock_c, Collapse2); -STATE_DEFINE(daEnSnakeBlock_c, Collapse3); -STATE_DEFINE(daEnSnakeBlock_c, Stop); - void daEnSnakeBlock_c::dBlock_c::createMdl(dHeapAllocator_c *alloc) { mResFile = dResMng_c::m_instance->getRes("block_snake_ice", "g3d/block_snake_ice.brres"); @@ -167,6 +147,24 @@ void daEnSnakeBlock_c::dBlock_c::callBackF(dActor_c *self, dActor_c *other) { void daEnSnakeBlock_c::dBlock_c::callBackH(dActor_c *self, dActor_c *other) {} void daEnSnakeBlock_c::dBlock_c::callBackW(dActor_c *self, dActor_c *other, u8 x) {} +mVec2_c daEnSnakeBlock_c::sc_ctrlPosMods[5] = { + mVec2_c(0.0f, 0.0f), + mVec2_c(0.0f, 1.0f), + mVec2_c(0.0f, -1.0f), + mVec2_c(-1.0f, 0.0f), + mVec2_c(1.0f, 0.0f) +}; + +int daEnSnakeBlock_c::sc_glbSnakeNum = 0; + +STATE_DEFINE(daEnSnakeBlock_c, Wait); +STATE_DEFINE(daEnSnakeBlock_c, Move); +STATE_DEFINE(daEnSnakeBlock_c, Shake); +STATE_DEFINE(daEnSnakeBlock_c, Collapse1); +STATE_DEFINE(daEnSnakeBlock_c, Collapse2); +STATE_DEFINE(daEnSnakeBlock_c, Collapse3); +STATE_DEFINE(daEnSnakeBlock_c, Stop); + const float daEnSnakeBlock_c::sc_snakeSpeeds2[3] = { 0.5f, 1.0f, 1.4f }; @@ -180,11 +178,14 @@ const float daEnSnakeBlock_c::sc_snakeDir[2] = { }; bool daEnSnakeBlock_c::dCtrlBlock_c::calcPos(s8 *travelInfo) { - mVec2_c v = sc_ctrlPosMods[travelInfo[mTravelInfoIdx]]; - float speed = sc_snakeSpeeds[mSnakeSpeedIdx]; - mPos.x += speed * v.x; - mPos.y += speed * v.y; + + mVec2_c newPos; + newPos.x = sc_ctrlPosMods[travelInfo[mTravelInfoIdx]].x; + newPos.y = sc_ctrlPosMods[travelInfo[mTravelInfoIdx]].y; + + mPos.x += speed * newPos.x; + mPos.y += speed * newPos.y; if (std::fabs(mPos.x - mLastPos.x) >= 16.0f || std::fabs(mPos.y - mLastPos.y) >= 16.0f) { return true; @@ -197,15 +198,10 @@ bool daEnSnakeBlock_c::dCtrlBlock_c::calcTravelPos(s8 *travelInfo) { newPos.x = sc_ctrlPosMods[travelInfo[mTravelInfoIdx]].x; newPos.y = sc_ctrlPosMods[travelInfo[mTravelInfoIdx]].y; - float x = mLastPos.x + newPos.x * 16.0f; - float y = mLastPos.y + newPos.y * 16.0f; - - mPos.x = x; - mPos.y = y; - mLastPos.x = x; - mLastPos.y = y; + mPos.x = mLastPos.x + newPos.x * 16.0f; + mPos.y = mLastPos.y + newPos.y * 16.0f; - mLastPos.z = mPos.z; + mLastPos = mPos; mTravelInfoIdx++; return travelInfo[mTravelInfoIdx] == 0; @@ -489,15 +485,15 @@ void daEnSnakeBlock_c::finalizeState_Wait() {} void daEnSnakeBlock_c::executeState_Wait() {} void daEnSnakeBlock_c::initializeState_Move() { - getHeadBlock()->setCreate(); + getHeadBlock()->setAnmClr("create"); getHeadBlock()->mAnmClr.setRate(0.0f, 0); getHeadBlock()->mAnmClr.setFrame(25.0f, 0); - getTailBlock()->setRidden(); + getTailBlock()->setAnmClr("ridden"); - mBlocks[0].setCreate(); + mBlocks[0].setAnmClr("create"); for (int i = 1; i < mBlockNum; i++) { dBlock_c &curr = mBlocks[i]; - curr.setRidden(); + curr.setAnmClr("ridden"); } getHeadBlock()->mLastPos = getHeadBlock()->mPos; @@ -510,6 +506,7 @@ void daEnSnakeBlock_c::initializeState_Move() { } void daEnSnakeBlock_c::finalizeState_Move() {} void daEnSnakeBlock_c::executeState_Move() { + dBlock_c *curr; bool b3 = getHeadBlock()->calcPos(mpTravelInfo); bool b4 = getTailBlock()->calcPos(mpTravelInfo); bool b5 = false; @@ -519,7 +516,7 @@ void daEnSnakeBlock_c::executeState_Move() { b5 = getHeadBlock()->calcTravelPos(mpTravelInfo); b6 = getTailBlock()->calcTravelPos(mpTravelInfo); - dAudio::SoundEffectID_t(SE_OBJ_SNAKE_BLOCK).playMapSound(mPos, 0); + dAudio::SoundEffectID_t(scSnakeSoundID).playMapSound(mPos, 0); setBlockPos(); mCreateAnmBlockIdx++; @@ -527,13 +524,16 @@ void daEnSnakeBlock_c::executeState_Move() { mCreateAnmBlockIdx = mCreateAnmBlockNum; } + curr = mBlocks; + int frame; int snakeSpeed = 16.0f / sc_snakeSpeeds[mParam >> 8 & 0x3]; - int frame = 0; + int i = 0; + frame = 0; - for (int i = 0; i < mCreateAnmBlockIdx; i++) { - dBlock_c &curr = mBlocks[i]; - curr.setAnmClr("create"); - curr.mAnmClr.setFrame(frame, 0); + for (; i < mCreateAnmBlockIdx; i++) { + curr->setAnmClr("create"); + curr->mAnmClr.setFrame(frame, 0); + curr++; frame += snakeSpeed; } } @@ -594,14 +594,14 @@ void daEnSnakeBlock_c::initializeState_Collapse1() { getHeadBlock()->mLastPos = getHeadBlock()->mPos; getTailBlock()->mLastPos = getTailBlock()->mPos; - for (int i = 0; i < getBlockCount(); i++) { + for (int i = 0; (int) i < mBlockNum; i++) { dBlock_c &curr = mBlocks[i]; curr.mLastPos = curr.mPos; } dBlock_c *curr2 = getHeadBlock(); int prevIdx = curr2->mTravelInfoIdx; - for (u32 i = 0; i < getBlockCount(); i++) { + for (u32 i = 0; (int) i < mBlockNum; i++) { // [fake match] curr2 = &mBlocks[i]; curr2->mTravelInfoIdx = prevIdx; prevIdx--; @@ -612,7 +612,7 @@ void daEnSnakeBlock_c::initializeState_Collapse1() { mVec2_c collapse_speed = sc_collapseSpeeds[idx]; getHeadBlock()->setSpeed(collapse_speed.x, collapse_speed.y, 0.0f); getTailBlock()->setSpeed(collapse_speed.x, collapse_speed.y, 0.0f); - for (u32 i = 0; i < getBlockCount(); i++) { + for (u32 i = 0; (int) i < mBlockNum; i++) { // [fake match] dBlock_c &curr = mBlocks[i]; curr.setSpeed(collapse_speed.x, collapse_speed.y, 0.0f); } @@ -691,3 +691,5 @@ void daEnSnakeBlock_c::executeState_Collapse3() { deleteActor(1); } } + +const int daEnSnakeBlock_c::scSnakeSoundID = SE_OBJ_SNAKE_BLOCK; diff --git a/syms.txt b/syms.txt index 2e46f91f..d89a296f 100644 --- a/syms.txt +++ b/syms.txt @@ -82,6 +82,13 @@ checkWall__5dBc_cFPC7mVec3_cPC7mVec3_cPfUcUcPP8dActor_c=0x80075FD0 checkWaterDepth__5dBc_cFffUcUcPf=0x80076530 checkWireNet__5dBc_cFffUc=0x800767F0 setWaterInWave__5dBg_cFffUc=0x80078410 +__ct__9dBg_ctr_cFv=0x8007F7A0 +__dt__9dBg_ctr_cFv=0x8007F810 +entry__9dBg_ctr_cFv=0x8007F900 +release__9dBg_ctr_cFv=0x8007F950 +set__9dBg_ctr_cFP8dActor_cffffPvPvPviiPv=0x8007FA40 +setOfs__9dBg_ctr_cFffffPv=0x8007FBF0 +calc__9dBg_ctr_cFv=0x8007FDA0 __dt__Q23m3d9capture_cFv=0x80088FD0 isCyuukanStart__10dCyuukan_cFiUcUc=0x8008F000 __ct__Q24dDvd8loader_cFv=0x8008F140 @@ -362,6 +369,8 @@ SinFIdx__Q24nw4r4mathFf=0x80237D10 CosFIdx__Q24nw4r4mathFf=0x80237D80 GetResMdl__Q34nw4r3g3d7ResFileCFPCc=0x80239F70 GetResAnmChr__Q34nw4r3g3d7ResFileCFPCc=0x8023A1F0 +GetResAnmClr__Q34nw4r3g3d7ResFileCFPCc=0x8023A2D0 +GetResAnmTexSrt__Q34nw4r3g3d7ResFileCFPCc=0x8023A3B0 Bind__Q34nw4r3g3d7ResFileFQ34nw4r3g3d7ResFile=0x8023A490 Init__Q34nw4r3g3d7ResFileFv=0x8023A6D0 CheckRevision__Q34nw4r3g3d7ResFileCFv=0x8023A9A0 @@ -699,10 +708,3 @@ smc_SCORE_Y__11dScoreMng_c=0x8042CF6C c_CASTLE_ID__10dCsvData_c=0x8042D24C c_START_ID__10dCsvData_c=0x8042D264 c_PLAYNUM_DIGIT__14dGameDisplay_c=0x8042DE90 -GetResAnmClr__Q34nw4r3g3d7ResFileCFPCc=0x8023a2d0 -release__9dBg_ctr_cFv=0x8007f950 -GetResAnmTexSrt__Q34nw4r3g3d7ResFileCFPCc=0x8023a3b0 -setOfs__9dBg_ctr_cFffffPv=0x8007fbf0 -calc__9dBg_ctr_cFv=0x8007fda0 -entry__9dBg_ctr_cFv=0x8007f900 -set__9dBg_ctr_cFP8dActor_cffffPvPvPviiPv=0x8007fa40 From bb73a7bfeaf8329d8d538f0dfcffa9adeb6ec537 Mon Sep 17 00:00:00 2001 From: RootCubed Date: Sun, 29 Mar 2026 15:42:31 +0200 Subject: [PATCH 11/15] `daEnSnakeBlock_c` down to regswaps --- include/game/bases/d_a_en_snake_block.hpp | 14 +++ .../d_enemiesNP/bases/d_a_en_snake_block.cpp | 89 +++++++++++-------- 2 files changed, 65 insertions(+), 38 deletions(-) diff --git a/include/game/bases/d_a_en_snake_block.hpp b/include/game/bases/d_a_en_snake_block.hpp index 26f17181..8c843053 100644 --- a/include/game/bases/d_a_en_snake_block.hpp +++ b/include/game/bases/d_a_en_snake_block.hpp @@ -101,6 +101,14 @@ class daEnSnakeBlock_c : public dEn_c { int mSnakeSpeedIdx; }; + enum TravelDir_e { + TRAVEL_DIR_NONE, + TRAVEL_DIR_UP, + TRAVEL_DIR_DOWN, + TRAVEL_DIR_LEFT, + TRAVEL_DIR_RIGHT + }; + daEnSnakeBlock_c() : mpTravelInfo(nullptr), mTravelInfoIdx(0), mShakeTime(0) {} virtual ~daEnSnakeBlock_c() {} @@ -131,6 +139,12 @@ class daEnSnakeBlock_c : public dEn_c { dCtrlBlock_c *getHeadBlock() { return &mCtrlBlock[0]; } dCtrlBlock_c *getTailBlock() { return &mCtrlBlock[1]; } + s8 setInfo(ulong idx, TravelDir_e dir) { + s8 prev = mpTravelInfo[idx]; + mpTravelInfo[idx] = dir; + return prev; + } + dHeapAllocator_c mAllocator; dCtrlBlock_c mCtrlBlock[2]; diff --git a/source/d_enemiesNP/bases/d_a_en_snake_block.cpp b/source/d_enemiesNP/bases/d_a_en_snake_block.cpp index d85658f1..b28f2456 100644 --- a/source/d_enemiesNP/bases/d_a_en_snake_block.cpp +++ b/source/d_enemiesNP/bases/d_a_en_snake_block.cpp @@ -366,80 +366,93 @@ void daEnSnakeBlock_c::calcBgCtr() { } void daEnSnakeBlock_c::initTravelInfo() { + s16 dx_abs; + s16 dy_abs; + s16 dx; + s16 dy; + int i1; + int i2; + ulong dist; + int endIdx; + int startIdx; + ulong currIdx; + TravelDir_e xDir; + TravelDir_e yDir; + ulong count; sRailInfoData *rail = dRail_c::getRailInfoP((mParam >> 4) & 0xF); dCdFile_c *file = dCd_c::m_instance->getFileP(dScStage_c::m_instance->mCurrFile); - sRailNodeData *node = &file->mpRailNodes[rail->mNodeIdx]; + sRailNodeData *node = file->mpRailNodes + rail->mNodeIdx; + + dist = 0; + startIdx = ACTOR_PARAM(RailStartIdx); + endIdx = rail->mCount - 1; - int dist = 0; - int startIdx = ACTOR_PARAM(RailStartIdx); - int endIdx = rail->mCount - 1; + for (i1 = startIdx; i1 < endIdx; i1++) { + dx = abs((node[i1 + 1].mX >> 4) - (node[i1].mX >> 4)); + dy = abs((node[i1 + 1].mY >> 4) - (node[i1].mY >> 4)); - for (int i = startIdx; i < endIdx; i++) { - s16 dx = abs((node[i + 1].mX >> 4) - (node[i].mX >> 4)); - s16 dy = abs((node[i + 1].mY >> 4) - (node[i].mY >> 4)); dist += dx + dy; } mTravelInfoIdx = dist; mpTravelInfo = new s8[dist + 2]; - int currIdx = 1; - for (int i = startIdx; i < rail->mCount - 1; i++) { - s16 dx = (node[i + 1].mX >> 4) - (node[i].mX >> 4); - s16 dy = (node[i + 1].mY >> 4) - (node[i].mY >> 4); + currIdx = 1; + for (i2 = startIdx; i2 < rail->mCount - 1; i2++) { + dx = (node[i2 + 1].mX >> 4) - (node[i2].mX >> 4); + dy = (node[i2 + 1].mY >> 4) - (node[i2].mY >> 4); - int dx_ = (s16) abs(dx); - int dy_ = (s16) abs(dy); + dx_abs = abs(dx); + dy_abs = abs(dy); - s8 initialDir = 0; - s8 secondDir = 0; + xDir = TRAVEL_DIR_NONE; + yDir = TRAVEL_DIR_NONE; if (dx > 0) { - initialDir = 4; + xDir = TRAVEL_DIR_RIGHT; } else if (dx < 0) { - initialDir = 3; + xDir = TRAVEL_DIR_LEFT; } if (dy < 0) { - secondDir = 1; + yDir = TRAVEL_DIR_UP; } else if (dy > 0) { - secondDir = 2; + yDir = TRAVEL_DIR_DOWN; } - int count = 0; - if (dx_ <= dy_) { - for (int j = 0; j < dx_; j++) { - int idx = currIdx + count; - mpTravelInfo[idx] = initialDir; - mpTravelInfo[idx + 1] = secondDir; + count = 0; + if (dx_abs <= dy_abs) { + for (int j = 0; j < dx_abs; j++) { + ulong idx = currIdx + count; + setInfo(idx, xDir); + setInfo(idx + 1, yDir); count += 2; } - int rest = dy_ - dx_; - for (int j = 0; j < rest; j++) { - int idx = currIdx + count; + for (int j = 0; j < dy_abs - dx_abs; j++) { + ulong idx = currIdx + count; + setInfo(idx, yDir); count++; - mpTravelInfo[idx] = secondDir; } } else { - for (int j = 0; j < dy_; j++) { - int idx = currIdx + count; - mpTravelInfo[idx] = initialDir; - mpTravelInfo[idx + 1] = secondDir; + for (int j = 0; j < dy_abs; j++) { + ulong idx = currIdx + count; + setInfo(idx, xDir); + setInfo(idx + 1, yDir); count += 2; } - for (int j = 0; j < dx_ - dy_; j++) { - int idx = currIdx + count; + for (int j = 0; j < dx_abs - dy_abs; j++) { + ulong idx = currIdx + count; + setInfo(idx, xDir); count++; - mpTravelInfo[idx] = secondDir; } } currIdx += count; } - mpTravelInfo[0] = 0; - mpTravelInfo[dist + 1] = 0; + setInfo(0, TRAVEL_DIR_NONE); + setInfo(dist + 1, TRAVEL_DIR_NONE); } void daEnSnakeBlock_c::setBlockPos() { From 546671f8632f3f65edd67a32666854b09fe86cfc Mon Sep 17 00:00:00 2001 From: RootCubed Date: Fri, 3 Apr 2026 18:21:11 +0200 Subject: [PATCH 12/15] Closest match I can get, the regswap persists... --- include/game/bases/d_a_en_snake_block.hpp | 7 +- include/game/bases/d_cd.hpp | 5 +- .../d_enemiesNP/bases/d_a_en_snake_block.cpp | 76 +++++++++---------- 3 files changed, 39 insertions(+), 49 deletions(-) diff --git a/include/game/bases/d_a_en_snake_block.hpp b/include/game/bases/d_a_en_snake_block.hpp index 8c843053..513a5927 100644 --- a/include/game/bases/d_a_en_snake_block.hpp +++ b/include/game/bases/d_a_en_snake_block.hpp @@ -139,12 +139,6 @@ class daEnSnakeBlock_c : public dEn_c { dCtrlBlock_c *getHeadBlock() { return &mCtrlBlock[0]; } dCtrlBlock_c *getTailBlock() { return &mCtrlBlock[1]; } - s8 setInfo(ulong idx, TravelDir_e dir) { - s8 prev = mpTravelInfo[idx]; - mpTravelInfo[idx] = dir; - return prev; - } - dHeapAllocator_c mAllocator; dCtrlBlock_c mCtrlBlock[2]; @@ -162,6 +156,7 @@ class daEnSnakeBlock_c : public dEn_c { int mCreateAnmBlockNum; u8 _pad[4]; + ACTOR_PARAM_CONFIG(RailIdx, 4, 4); ACTOR_PARAM_CONFIG(RailStartIdx, 12, 8); static const float sc_FallAccel; diff --git a/include/game/bases/d_cd.hpp b/include/game/bases/d_cd.hpp index f692bc1a..09a6a3c1 100644 --- a/include/game/bases/d_cd.hpp +++ b/include/game/bases/d_cd.hpp @@ -99,9 +99,8 @@ class dCd_c { static void deleteInstance(); dCdFile_c *getFileP(int idx) { - dCdFile_c *course = &mFiles[idx]; - if (course->mpAreas != nullptr) { - return course; + if (mFiles[idx].mpAreas != nullptr) { + return &mFiles[idx]; } return nullptr; } diff --git a/source/d_enemiesNP/bases/d_a_en_snake_block.cpp b/source/d_enemiesNP/bases/d_a_en_snake_block.cpp index b28f2456..288b6f08 100644 --- a/source/d_enemiesNP/bases/d_a_en_snake_block.cpp +++ b/source/d_enemiesNP/bases/d_a_en_snake_block.cpp @@ -279,7 +279,7 @@ void daEnSnakeBlock_c::initBlock() { } void daEnSnakeBlock_c::initBlockPath() { - sRailInfoData *rail = dRail_c::getRailInfoP((mParam >> 4) & 0xF); + sRailInfoData *rail = dRail_c::getRailInfoP(ACTOR_PARAM(RailIdx)); dCdFile_c *file = dCd_c::m_instance->getFileP(dScStage_c::m_instance->mCurrFile); sRailNodeData *node = &file->mpRailNodes[rail->mNodeIdx]; @@ -366,31 +366,26 @@ void daEnSnakeBlock_c::calcBgCtr() { } void daEnSnakeBlock_c::initTravelInfo() { - s16 dx_abs; - s16 dy_abs; + sRailInfoData *rail = dRail_c::getRailInfoP(ACTOR_PARAM(RailIdx)); + dCdFile_c *cdFile = dCd_c::m_instance->getFileP(dScStage_c::m_instance->mCurrFile); + sRailNodeData *node = cdFile->mpRailNodes + rail->mNodeIdx; + s16 dx; s16 dy; - int i1; - int i2; - ulong dist; - int endIdx; - int startIdx; - ulong currIdx; - TravelDir_e xDir; - TravelDir_e yDir; - ulong count; - sRailInfoData *rail = dRail_c::getRailInfoP((mParam >> 4) & 0xF); - dCdFile_c *file = dCd_c::m_instance->getFileP(dScStage_c::m_instance->mCurrFile); + s16 dx_abs; + s16 dy_abs; - sRailNodeData *node = file->mpRailNodes + rail->mNodeIdx; + ulong dist = 0; - dist = 0; - startIdx = ACTOR_PARAM(RailStartIdx); - endIdx = rail->mCount - 1; + int i; + int startIdx = ACTOR_PARAM(RailStartIdx); + int endIdx = rail->mCount - 1; - for (i1 = startIdx; i1 < endIdx; i1++) { - dx = abs((node[i1 + 1].mX >> 4) - (node[i1].mX >> 4)); - dy = abs((node[i1 + 1].mY >> 4) - (node[i1].mY >> 4)); + for (i = startIdx; i < endIdx; i++) { + sRailNodeData *curr = node + i; + sRailNodeData *next = node + i + 1; + dx = abs((next->mX >> 4) - (curr->mX >> 4)); + dy = abs((next->mY >> 4) - (curr->mY >> 4)); dist += dx + dy; } @@ -398,16 +393,16 @@ void daEnSnakeBlock_c::initTravelInfo() { mTravelInfoIdx = dist; mpTravelInfo = new s8[dist + 2]; - currIdx = 1; - for (i2 = startIdx; i2 < rail->mCount - 1; i2++) { - dx = (node[i2 + 1].mX >> 4) - (node[i2].mX >> 4); - dy = (node[i2 + 1].mY >> 4) - (node[i2].mY >> 4); + ulong currIdx = 1; + for (int i = startIdx; i < rail->mCount - 1; i++) { + dx = (node[i + 1].mX >> 4) - (node[i].mX >> 4); + dy = (node[i + 1].mY >> 4) - (node[i].mY >> 4); dx_abs = abs(dx); dy_abs = abs(dy); - xDir = TRAVEL_DIR_NONE; - yDir = TRAVEL_DIR_NONE; + TravelDir_e xDir = TRAVEL_DIR_NONE; + TravelDir_e yDir = TRAVEL_DIR_NONE; if (dx > 0) { xDir = TRAVEL_DIR_RIGHT; @@ -421,29 +416,30 @@ void daEnSnakeBlock_c::initTravelInfo() { yDir = TRAVEL_DIR_DOWN; } - count = 0; + ulong count = 0; + ulong idx; if (dx_abs <= dy_abs) { for (int j = 0; j < dx_abs; j++) { - ulong idx = currIdx + count; - setInfo(idx, xDir); - setInfo(idx + 1, yDir); + idx = currIdx + count; + mpTravelInfo[idx] = xDir; + mpTravelInfo[idx + 1] = yDir; count += 2; } for (int j = 0; j < dy_abs - dx_abs; j++) { - ulong idx = currIdx + count; - setInfo(idx, yDir); + idx = currIdx + count; + mpTravelInfo[idx] = yDir; count++; } } else { for (int j = 0; j < dy_abs; j++) { - ulong idx = currIdx + count; - setInfo(idx, xDir); - setInfo(idx + 1, yDir); + idx = currIdx + count; + mpTravelInfo[idx] = xDir; + mpTravelInfo[idx + 1] = yDir; count += 2; } for (int j = 0; j < dx_abs - dy_abs; j++) { - ulong idx = currIdx + count; - setInfo(idx, xDir); + idx = currIdx + count; + mpTravelInfo[idx] = xDir; count++; } } @@ -451,8 +447,8 @@ void daEnSnakeBlock_c::initTravelInfo() { currIdx += count; } - setInfo(0, TRAVEL_DIR_NONE); - setInfo(dist + 1, TRAVEL_DIR_NONE); + mpTravelInfo[0] = TRAVEL_DIR_NONE; + mpTravelInfo[dist + 1] = TRAVEL_DIR_NONE; } void daEnSnakeBlock_c::setBlockPos() { From dc1d3f438abdf1e617a390a030b6c955282c579c Mon Sep 17 00:00:00 2001 From: RootCubed Date: Mon, 6 Apr 2026 10:21:28 +0200 Subject: [PATCH 13/15] `daEnSnakeBlock_c` matched and linked --- include/game/bases/d_cd.hpp | 5 +++-- slices/d_enemiesNP.json | 1 - source/d_enemiesNP/bases/d_a_en_snake_block.cpp | 11 ++++++----- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/include/game/bases/d_cd.hpp b/include/game/bases/d_cd.hpp index 09a6a3c1..66dc9556 100644 --- a/include/game/bases/d_cd.hpp +++ b/include/game/bases/d_cd.hpp @@ -99,8 +99,9 @@ class dCd_c { static void deleteInstance(); dCdFile_c *getFileP(int idx) { - if (mFiles[idx].mpAreas != nullptr) { - return &mFiles[idx]; + dCdFile_c *file = &mFiles[idx]; + if (file->mpAreas != nullptr) { + return file; } return nullptr; } diff --git a/slices/d_enemiesNP.json b/slices/d_enemiesNP.json index 8d1809b4..7aef7093 100644 --- a/slices/d_enemiesNP.json +++ b/slices/d_enemiesNP.json @@ -36,7 +36,6 @@ }, { "source": "d_enemiesNP/bases/d_a_en_snake_block.cpp", - "nonMatching": true, "memoryRanges": { ".text": "0x103a50-0x106960", ".ctors": "0x228-0x22c", diff --git a/source/d_enemiesNP/bases/d_a_en_snake_block.cpp b/source/d_enemiesNP/bases/d_a_en_snake_block.cpp index 288b6f08..b2534cbd 100644 --- a/source/d_enemiesNP/bases/d_a_en_snake_block.cpp +++ b/source/d_enemiesNP/bases/d_a_en_snake_block.cpp @@ -377,11 +377,10 @@ void daEnSnakeBlock_c::initTravelInfo() { ulong dist = 0; - int i; int startIdx = ACTOR_PARAM(RailStartIdx); - int endIdx = rail->mCount - 1; + u16 railCount = rail->mCount; - for (i = startIdx; i < endIdx; i++) { + for (int i = startIdx; i < railCount - 1; i++) { sRailNodeData *curr = node + i; sRailNodeData *next = node + i + 1; dx = abs((next->mX >> 4) - (curr->mX >> 4)); @@ -395,8 +394,10 @@ void daEnSnakeBlock_c::initTravelInfo() { ulong currIdx = 1; for (int i = startIdx; i < rail->mCount - 1; i++) { - dx = (node[i + 1].mX >> 4) - (node[i].mX >> 4); - dy = (node[i + 1].mY >> 4) - (node[i].mY >> 4); + sRailNodeData *curr = node + i; + sRailNodeData *next = node + i + 1; + dx = (next->mX >> 4) - (curr->mX >> 4); + dy = (next->mY >> 4) - (curr->mY >> 4); dx_abs = abs(dx); dy_abs = abs(dy); From 062d2ac7538e1a1b66fe20593aa651c6fac73095 Mon Sep 17 00:00:00 2001 From: RootCubed Date: Mon, 6 Apr 2026 11:33:24 +0200 Subject: [PATCH 14/15] some initial cleanup --- include/game/bases/d_a_en_snake_block.hpp | 59 ++--- include/game/bases/d_bg_ctr.hpp | 37 +++ .../d_enemiesNP/bases/d_a_en_snake_block.cpp | 213 +++++++++--------- syms.txt | 4 +- 4 files changed, 166 insertions(+), 147 deletions(-) create mode 100644 include/game/bases/d_bg_ctr.hpp diff --git a/include/game/bases/d_a_en_snake_block.hpp b/include/game/bases/d_a_en_snake_block.hpp index 513a5927..4c9fa3fb 100644 --- a/include/game/bases/d_a_en_snake_block.hpp +++ b/include/game/bases/d_a_en_snake_block.hpp @@ -1,39 +1,10 @@ #pragma once #include +#include #include #include #include -class dBg_ctr_c { -public: - dActor_c *mpActor; - u8 mPad1[0x9c]; - mVec2_c m_a0; - mVec2_c m_ac; - u8 mPad2[0xc]; - short *m_bc; - u8 mPad4[0x8]; - int m_c8; - int m_cc; - u32 mFlags; - int m_d4; - u8 mpPad5[0x4]; - bool m_dc; - u8 mpPad6[0x3]; - bool m_e0; - u8 m_e1; - u8 m_e2; - - dBg_ctr_c(); - ~dBg_ctr_c(); - - void release(); - void entry(); - void set(dActor_c *, float, float, float, float, void *, void *, void *, int, int, void *); - void calc(); - void setOfs(float, float, float, float, void *); -}; - class daEnSnakeBlock_c : public dEn_c { public: // @unofficial @@ -42,13 +13,13 @@ class daEnSnakeBlock_c : public dEn_c { dBlock_c() : mpOwner(nullptr), m_1b4(0) {} virtual ~dBlock_c() { mBgCtr.release(); } - void createMdl(dHeapAllocator_c *alloc); + void createMdl(mAllocator_c *allocator); void doDelete(); void calcAnm(); void setAnmClr(const char *name); - void draw(const mVec3_c &pos); + void draw(const mVec3_c &offset); void initBgCtr(daEnSnakeBlock_c *parent, mVec3_c &blockPos, int unused); void calcBgCtr(); @@ -58,19 +29,18 @@ class daEnSnakeBlock_c : public dEn_c { mVec3_c getPos() const { return mPos; } void setPos(mVec3_c pos) { mPos = pos; } - void setSpeed(float x, float y, float z) { mSpeed.set(x, y, z); } - void resetSpeed() { mSpeed.set(0.0f, 0.0f, 0.0f); } - void process() { + void releaseBgCtr() { if (mBgCtr.m_dc) { mBgCtr.release(); } - setFallCollapse(); + } + void updatePos() { mPos += mSpeed; } - static void callBackF(dActor_c *self, dActor_c *other); - static void callBackH(dActor_c *self, dActor_c *other); - static void callBackW(dActor_c *self, dActor_c *other, u8); + static dBg_ctr_c::CallbackF callBackF; + static dBg_ctr_c::CallbackH callBackH; + static dBg_ctr_c::CallbackW callBackW; nw4r::g3d::ResFile mResFile; m3d::mdl_c mModel; @@ -136,8 +106,8 @@ class daEnSnakeBlock_c : public dEn_c { bool chkCollapseDelete(); ///< Returns if the Tail is below the screen edge (meaning the collapse has ended, and the actor can be deleted) bool chkOffScreen(); ///< Returns if the Snake Block is far past the right edge of the screen (used to delete it) - dCtrlBlock_c *getHeadBlock() { return &mCtrlBlock[0]; } - dCtrlBlock_c *getTailBlock() { return &mCtrlBlock[1]; } + dCtrlBlock_c &getHeadBlock() { return mCtrlBlock[0]; } + dCtrlBlock_c &getTailBlock() { return mCtrlBlock[1]; } dHeapAllocator_c mAllocator; @@ -156,15 +126,18 @@ class daEnSnakeBlock_c : public dEn_c { int mCreateAnmBlockNum; u8 _pad[4]; + ACTOR_PARAM_CONFIG(Param_00, 0, 4); ACTOR_PARAM_CONFIG(RailIdx, 4, 4); + ACTOR_PARAM_CONFIG(Param_08, 8, 2); + ACTOR_PARAM_CONFIG(Param_0c, 12, 8); ACTOR_PARAM_CONFIG(RailStartIdx, 12, 8); + ACTOR_PARAM_CONFIG(Param_14, 20, 1); + ACTOR_PARAM_CONFIG(StopState, 28, 4); static const float sc_FallAccel; static const float sc_FallMaxSpeed; static const float sc_snakeSpeeds[3]; static const float sc_snakeSpeeds2[3]; - static const float sc_snakeDir[2]; - static sStateID_c *sc_stopStates[4]; static mVec2_c sc_ctrlPosMods[5]; static int sc_glbSnakeNum; static const int scSnakeSoundID; diff --git a/include/game/bases/d_bg_ctr.hpp b/include/game/bases/d_bg_ctr.hpp new file mode 100644 index 00000000..e68b940e --- /dev/null +++ b/include/game/bases/d_bg_ctr.hpp @@ -0,0 +1,37 @@ +#pragma once + +#include + +class dBg_ctr_c { +public: + dActor_c *mpActor; + u8 mPad1[0x9c]; + mVec2_c m_a0; + mVec2_c m_ac; + u8 mPad2[0xc]; + short *m_bc; + u8 mPad4[0x8]; + int m_c8; + int m_cc; + u32 mFlags; + int m_d4; + u8 mpPad5[0x4]; + bool m_dc; + u8 mpPad6[0x3]; + bool m_e0; + u8 m_e1; + u8 m_e2; + + typedef void CallbackF(dActor_c *self, dActor_c *other); + typedef void CallbackH(dActor_c *self, dActor_c *other); + typedef void CallbackW(dActor_c *self, dActor_c *other, u8); + + dBg_ctr_c(); + ~dBg_ctr_c(); + + void entry(); + void release(); + void set(dActor_c*, float, float, float, float, CallbackF *, CallbackH *, CallbackW *, u8, u8, mVec3_c *); + void setOfs(float, float, float, float, mVec3_c *); + void calc(); +}; diff --git a/source/d_enemiesNP/bases/d_a_en_snake_block.cpp b/source/d_enemiesNP/bases/d_a_en_snake_block.cpp index b2534cbd..294dd3bd 100644 --- a/source/d_enemiesNP/bases/d_a_en_snake_block.cpp +++ b/source/d_enemiesNP/bases/d_a_en_snake_block.cpp @@ -13,21 +13,21 @@ ACTOR_PROFILE(EN_SNAKEBLOCK, daEnSnakeBlock_c, 0); const float daEnSnakeBlock_c::sc_FallAccel = -0.1875f; const float daEnSnakeBlock_c::sc_FallMaxSpeed = -4.0f; -void daEnSnakeBlock_c::dBlock_c::createMdl(dHeapAllocator_c *alloc) { +void daEnSnakeBlock_c::dBlock_c::createMdl(mAllocator_c *allocator) { mResFile = dResMng_c::m_instance->getRes("block_snake_ice", "g3d/block_snake_ice.brres"); nw4r::g3d::ResMdl mdl = mResFile.GetResMdl("block_snake_ice"); - mModel.create(mdl, alloc, 0x32c, 1, nullptr); + mModel.create(mdl, allocator, 0x32c, 1, nullptr); dActor_c::setSoftLight_MapObj(mModel); mResTexSrt = mResFile.GetResAnmTexSrt("block_snake_ice"); - mAnmTexSrt.create(mdl, mResTexSrt, alloc, nullptr, 1); + mAnmTexSrt.create(mdl, mResTexSrt, allocator, nullptr, 1); mAnmTexSrt.setAnm(mModel, mResTexSrt, 0, m3d::FORWARD_LOOP); mModel.setAnm(mAnmTexSrt, 0.0f); mAnmTexSrt.setRate(1.0f, 0); nw4r::g3d::ResAnmClr res_anmclr = mResFile.GetResAnmClr("ridden"); - mAnmClr.create(mdl, res_anmclr, alloc, nullptr, 1); + mAnmClr.create(mdl, res_anmclr, allocator, nullptr, 1); mAnmClr.setAnm(mModel, res_anmclr, 0, m3d::FORWARD_ONCE); mModel.setAnm(mAnmClr); mAnmClr.setRate(0.0f, 0); @@ -51,15 +51,14 @@ void daEnSnakeBlock_c::dBlock_c::setAnmClr(const char *name) { mAnmClr.setRate(1.0f, 0); } -void daEnSnakeBlock_c::dBlock_c::draw(const mVec3_c &pos) { - mVec3_c a = mPos + pos; +void daEnSnakeBlock_c::dBlock_c::draw(const mVec3_c &offset) { + mVec3_c a = mPos + offset; dActor_c::changePosAngle(&a, nullptr, 1); - mMtx_c b = mMtx_c::createTrans(a); - mModel.setLocalMtx(&b); + mMtx_c mtx = mMtx_c::createTrans(a); + mModel.setLocalMtx(&mtx); - mVec3_c one = mVec3_c(1.0f, 1.0f, 1.0f); - mModel.setScale(one); + mModel.setScale(mVec3_c(1.0f, 1.0f, 1.0f)); mModel.calc(false); mModel.entry(); } @@ -78,8 +77,9 @@ void daEnSnakeBlock_c::dBlock_c::initBgCtr(daEnSnakeBlock_c *owner, mVec3_c &blo callBackF, callBackH, callBackW, 1, 0, nullptr ); mBgCtr.mFlags = 0; - // The unused flag was probably used to set the collision to icy before they - // decided to always make it icy. + + // [The unused flag was probably used to set the collision to icy before they + // decided to always make it icy.] /* if (_unused) { */ mBgCtr.mFlags |= 4; /* } */ @@ -157,14 +157,6 @@ mVec2_c daEnSnakeBlock_c::sc_ctrlPosMods[5] = { int daEnSnakeBlock_c::sc_glbSnakeNum = 0; -STATE_DEFINE(daEnSnakeBlock_c, Wait); -STATE_DEFINE(daEnSnakeBlock_c, Move); -STATE_DEFINE(daEnSnakeBlock_c, Shake); -STATE_DEFINE(daEnSnakeBlock_c, Collapse1); -STATE_DEFINE(daEnSnakeBlock_c, Collapse2); -STATE_DEFINE(daEnSnakeBlock_c, Collapse3); -STATE_DEFINE(daEnSnakeBlock_c, Stop); - const float daEnSnakeBlock_c::sc_snakeSpeeds2[3] = { 0.5f, 1.0f, 1.4f }; @@ -173,9 +165,13 @@ const float daEnSnakeBlock_c::sc_snakeSpeeds[3] = { 0.5f, 1.0f, 1.4f }; -const float daEnSnakeBlock_c::sc_snakeDir[2] = { - 1.0f, -1.0f -}; +STATE_DEFINE(daEnSnakeBlock_c, Wait); +STATE_DEFINE(daEnSnakeBlock_c, Move); +STATE_DEFINE(daEnSnakeBlock_c, Shake); +STATE_DEFINE(daEnSnakeBlock_c, Collapse1); +STATE_DEFINE(daEnSnakeBlock_c, Collapse2); +STATE_DEFINE(daEnSnakeBlock_c, Collapse3); +STATE_DEFINE(daEnSnakeBlock_c, Stop); bool daEnSnakeBlock_c::dCtrlBlock_c::calcPos(s8 *travelInfo) { float speed = sc_snakeSpeeds[mSnakeSpeedIdx]; @@ -208,14 +204,14 @@ bool daEnSnakeBlock_c::dCtrlBlock_c::calcTravelPos(s8 *travelInfo) { } int daEnSnakeBlock_c::create() { - if (sc_glbSnakeNum > 0 && (((mParam >> 0xC) & 0xFF) != 0)) { + if (sc_glbSnakeNum > 0 && ACTOR_PARAM(Param_0c) != 0) { deleteRequest(); return NOT_READY; } sc_glbSnakeNum++; - mBlockNum = (mParam & 0xF) + 2; - mSnakeType = (mParam >> 20) & 1; + mBlockNum = ACTOR_PARAM(Param_00) + 2; + mSnakeType = ACTOR_PARAM(Param_14); initBlock(); initBlockPath(); @@ -241,14 +237,18 @@ int daEnSnakeBlock_c::execute() { } int daEnSnakeBlock_c::draw() { + static const float sc_shakeOffsetX[2] = { + 1.0f, -1.0f + }; + mVec3_c offset(0.0f, 0.0f, 0.0f); if (mShakeTime > 0) { - offset.x += sc_snakeDir[(mShakeTime >> 1) & 1]; + offset.x += sc_shakeOffsetX[(mShakeTime >> 1) & 1]; } - getHeadBlock()->draw(offset); - getTailBlock()->draw(offset); + getHeadBlock().draw(offset); + getTailBlock().draw(offset); for (int i = 0; i < mBlockNum; i++) { mBlocks[i].draw(offset); } @@ -285,7 +285,7 @@ void daEnSnakeBlock_c::initBlockPath() { sRailNodeData *node = &file->mpRailNodes[rail->mNodeIdx]; node = &node[ACTOR_PARAM(RailStartIdx)]; - bool icy = (mParam >> 20) & 1; + bool icy = ACTOR_PARAM(Param_14); float nodeX = node[0].mX; float nodeY = node[0].mY; @@ -294,7 +294,7 @@ void daEnSnakeBlock_c::initBlockPath() { mVec3_c headPos(x, y, 1516.0f); - getHeadBlock()->initBgCtr(this, headPos, icy); + getHeadBlock().initBgCtr(this, headPos, icy); dBlock_c *curr = mBlocks; int i = 0; @@ -309,19 +309,19 @@ void daEnSnakeBlock_c::initBlockPath() { } mVec3_c tailPos = mVec3_c(x, y, 1516.0f); - getTailBlock()->initBgCtr(this, tailPos, icy); + getTailBlock().initBgCtr(this, tailPos, icy); - getHeadBlock()->mTravelInfoIdx = mBlockNum + 1; - getTailBlock()->mTravelInfoIdx = 1; + getHeadBlock().mTravelInfoIdx = mBlockNum + 1; + getTailBlock().mTravelInfoIdx = 1; // Note: Value 3 is out of bounds - getHeadBlock()->mSnakeSpeedIdx = (mParam >> 8) & 3; - getTailBlock()->mSnakeSpeedIdx = (mParam >> 8) & 3; + getHeadBlock().mSnakeSpeedIdx = ACTOR_PARAM(Param_08); + getTailBlock().mSnakeSpeedIdx = ACTOR_PARAM(Param_08); } void daEnSnakeBlock_c::calcAnm() { - getHeadBlock()->calcAnm(); - getTailBlock()->calcAnm(); + getHeadBlock().calcAnm(); + getTailBlock().calcAnm(); for (int i = 0; i < mBlockNum; i++) { mBlocks[i].calcAnm(); @@ -329,8 +329,8 @@ void daEnSnakeBlock_c::calcAnm() { } void daEnSnakeBlock_c::createMdl() { - getHeadBlock()->createMdl(&mAllocator); - getTailBlock()->createMdl(&mAllocator); + getHeadBlock().createMdl(&mAllocator); + getTailBlock().createMdl(&mAllocator); for (int i = 0; i < mBlockNum; i++) { mBlocks[i].createMdl(&mAllocator); @@ -338,27 +338,27 @@ void daEnSnakeBlock_c::createMdl() { } void daEnSnakeBlock_c::deleteBlock() { - getHeadBlock()->doDelete(); - getTailBlock()->doDelete(); + getHeadBlock().doDelete(); + getTailBlock().doDelete(); for (int i = 0; i < mBlockNum; i++) { mBlocks[i].doDelete(); } } -sStateID_c *daEnSnakeBlock_c::sc_stopStates[4] = { - &StateID_Stop, &StateID_Collapse1, &StateID_Collapse2, &StateID_Collapse3 -}; - void daEnSnakeBlock_c::setStopState() { - mpStopState = sc_stopStates[mParam >> 0x1c]; + static sStateID_c *l_StopStates[4] = { + &StateID_Stop, &StateID_Collapse1, &StateID_Collapse2, &StateID_Collapse3 + }; + + mpStopState = l_StopStates[ACTOR_PARAM(StopState)]; } void daEnSnakeBlock_c::calcBgCtr() { - getHeadBlock()->calcBgCtr(); - getTailBlock()->calcBgCtr(); + getHeadBlock().calcBgCtr(); + getTailBlock().calcBgCtr(); - getTailBlock()->mBgCtr.mFlags |= 1; + getTailBlock().mBgCtr.mFlags |= 1; for (int i = 0; i < mBlockNum; i++) { mBlocks[i].calcBgCtr(); @@ -466,20 +466,20 @@ void daEnSnakeBlock_c::setBlockPos() { prev--; } - tmp.x = getHeadBlock()->getPos().x; - tmp.y = getHeadBlock()->getPos().y; + tmp.x = getHeadBlock().getPos().x; + tmp.y = getHeadBlock().getPos().y; tmp.z = 1500.0f; mBlocks[0].setPos(tmp); } void daEnSnakeBlock_c::setActorPos() { - mPos.x = getHeadBlock()->getPos().x; - mPos.y = getHeadBlock()->getPos().y; + mPos.x = getHeadBlock().getPos().x; + mPos.y = getHeadBlock().getPos().y; mPos.z = 1500.0f; } bool daEnSnakeBlock_c::chkCollapseDelete() { - return getTailBlock()->getPos().y < dBgParameter_c::ms_Instance_p->yEnd() - 16.0f; + return getTailBlock().getPos().y < dBgParameter_c::ms_Instance_p->yEnd() - 16.0f; } bool daEnSnakeBlock_c::chkOffScreen() { @@ -495,10 +495,10 @@ void daEnSnakeBlock_c::finalizeState_Wait() {} void daEnSnakeBlock_c::executeState_Wait() {} void daEnSnakeBlock_c::initializeState_Move() { - getHeadBlock()->setAnmClr("create"); - getHeadBlock()->mAnmClr.setRate(0.0f, 0); - getHeadBlock()->mAnmClr.setFrame(25.0f, 0); - getTailBlock()->setAnmClr("ridden"); + getHeadBlock().setAnmClr("create"); + getHeadBlock().mAnmClr.setRate(0.0f, 0); + getHeadBlock().mAnmClr.setFrame(25.0f, 0); + getTailBlock().setAnmClr("ridden"); mBlocks[0].setAnmClr("create"); for (int i = 1; i < mBlockNum; i++) { @@ -506,25 +506,25 @@ void daEnSnakeBlock_c::initializeState_Move() { curr.setAnmClr("ridden"); } - getHeadBlock()->mLastPos = getHeadBlock()->mPos; - getTailBlock()->mLastPos = getTailBlock()->mPos; + getHeadBlock().mLastPos = getHeadBlock().mPos; + getTailBlock().mLastPos = getTailBlock().mPos; - int snakeSpeed = 16.0f / sc_snakeSpeeds[mParam >> 8 & 0x3]; + int snakeSpeed = 16.0f / sc_snakeSpeeds[ACTOR_PARAM(Param_08)]; mCreateAnmBlockIdx = 0; - mCreateAnmBlockNum = getHeadBlock()->mAnmClr.getFrameMax(0) / snakeSpeed; + mCreateAnmBlockNum = getHeadBlock().mAnmClr.getFrameMax(0) / snakeSpeed; } void daEnSnakeBlock_c::finalizeState_Move() {} void daEnSnakeBlock_c::executeState_Move() { dBlock_c *curr; - bool b3 = getHeadBlock()->calcPos(mpTravelInfo); - bool b4 = getTailBlock()->calcPos(mpTravelInfo); + bool b3 = getHeadBlock().calcPos(mpTravelInfo); + bool b4 = getTailBlock().calcPos(mpTravelInfo); bool b5 = false; bool b6 = false; if (b3 || b4) { - b5 = getHeadBlock()->calcTravelPos(mpTravelInfo); - b6 = getTailBlock()->calcTravelPos(mpTravelInfo); + b5 = getHeadBlock().calcTravelPos(mpTravelInfo); + b6 = getTailBlock().calcTravelPos(mpTravelInfo); dAudio::SoundEffectID_t(scSnakeSoundID).playMapSound(mPos, 0); @@ -558,10 +558,10 @@ void daEnSnakeBlock_c::executeState_Move() { } void daEnSnakeBlock_c::initializeState_Shake() { - getHeadBlock()->setAnmClr("ridden"); - getHeadBlock()->mAnmClr.setRate(0.0f, 0); - getTailBlock()->setAnmClr("ridden"); - getTailBlock()->mAnmClr.setRate(0.0f, 0); + getHeadBlock().setAnmClr("ridden"); + getHeadBlock().mAnmClr.setRate(0.0f, 0); + getTailBlock().setAnmClr("ridden"); + getTailBlock().mAnmClr.setRate(0.0f, 0); for (int i = 0; i < mBlockNum; i++) { dBlock_c &curr = mBlocks[i]; @@ -579,10 +579,10 @@ void daEnSnakeBlock_c::executeState_Shake() { } void daEnSnakeBlock_c::initializeState_Stop() { - getHeadBlock()->setAnmClr("ridden"); - getHeadBlock()->mAnmClr.setRate(0.0f, 0); - getTailBlock()->setAnmClr("ridden"); - getTailBlock()->mAnmClr.setRate(0.0f, 0); + getHeadBlock().setAnmClr("ridden"); + getHeadBlock().mAnmClr.setRate(0.0f, 0); + getTailBlock().setAnmClr("ridden"); + getTailBlock().mAnmClr.setRate(0.0f, 0); for (int i = 0; i < mBlockNum; i++) { dBlock_c &curr = mBlocks[i]; @@ -602,35 +602,35 @@ void daEnSnakeBlock_c::initializeState_Collapse1() { mVec2_c(0.0f, 0.0f) }; - getHeadBlock()->mLastPos = getHeadBlock()->mPos; - getTailBlock()->mLastPos = getTailBlock()->mPos; + getHeadBlock().mLastPos = getHeadBlock().mPos; + getTailBlock().mLastPos = getTailBlock().mPos; for (int i = 0; (int) i < mBlockNum; i++) { dBlock_c &curr = mBlocks[i]; curr.mLastPos = curr.mPos; } - dBlock_c *curr2 = getHeadBlock(); - int prevIdx = curr2->mTravelInfoIdx; + dBlock_c *curr = &getHeadBlock(); + int prevIdx = curr->mTravelInfoIdx; for (u32 i = 0; (int) i < mBlockNum; i++) { // [fake match] - curr2 = &mBlocks[i]; - curr2->mTravelInfoIdx = prevIdx; + curr = &mBlocks[i]; + curr->mTravelInfoIdx = prevIdx; prevIdx--; } - getTailBlock()->mTravelInfoIdx = prevIdx; + getTailBlock().mTravelInfoIdx = prevIdx; int idx = mpTravelInfo[mTravelInfoIdx]; - mVec2_c collapse_speed = sc_collapseSpeeds[idx]; - getHeadBlock()->setSpeed(collapse_speed.x, collapse_speed.y, 0.0f); - getTailBlock()->setSpeed(collapse_speed.x, collapse_speed.y, 0.0f); + mVec2_c collapseSpeed = sc_collapseSpeeds[idx]; + getHeadBlock().mSpeed.set(collapseSpeed.x, collapseSpeed.y, 0.0f); + getTailBlock().mSpeed.set(collapseSpeed.x, collapseSpeed.y, 0.0f); for (u32 i = 0; (int) i < mBlockNum; i++) { // [fake match] dBlock_c &curr = mBlocks[i]; - curr.setSpeed(collapse_speed.x, collapse_speed.y, 0.0f); + curr.mSpeed.set(collapseSpeed.x, collapseSpeed.y, 0.0f); } } void daEnSnakeBlock_c::finalizeState_Collapse1() {} void daEnSnakeBlock_c::executeState_Collapse1() { - getHeadBlock()->calcCollapse1(mpTravelInfo); - getTailBlock()->calcCollapse1(mpTravelInfo); + getHeadBlock().calcCollapse1(mpTravelInfo); + getTailBlock().calcCollapse1(mpTravelInfo); for (int i = 0; i < mBlockNum; i++) { mBlocks[i].calcCollapse1(mpTravelInfo); } @@ -642,19 +642,23 @@ void daEnSnakeBlock_c::executeState_Collapse1() { void daEnSnakeBlock_c::initializeState_Collapse2() { mCollapse2Idx = 0; - getHeadBlock()->resetSpeed(); - getTailBlock()->resetSpeed(); + getHeadBlock().mSpeed.set(0.0f, 0.0f, 0.0f); + getTailBlock().mSpeed.set(0.0f, 0.0f, 0.0f); for (int i = 0; i < mBlockNum; i++) { dBlock_c &curr = mBlocks[i]; - curr.resetSpeed(); + curr.mSpeed.set(0.0f, 0.0f, 0.0f); } } void daEnSnakeBlock_c::finalizeState_Collapse2() {} void daEnSnakeBlock_c::executeState_Collapse2() { - mCtrlBlock[0].process(); + getHeadBlock().releaseBgCtr(); + getHeadBlock().setFallCollapse(); + getHeadBlock().updatePos(); if (mCollapse2Idx > mBlockNum * 8) { - mCtrlBlock[1].process(); + getTailBlock().releaseBgCtr(); + getTailBlock().setFallCollapse(); + getTailBlock().updatePos(); } int i5 = mCollapse2Idx >> 3; @@ -665,7 +669,9 @@ void daEnSnakeBlock_c::executeState_Collapse2() { for (int i = 0; i < i5 + 1; i++) { dBlock_c &curr = mBlocks[i]; curr.mBgCtr.release(); - curr.process(); + curr.releaseBgCtr(); + curr.setFallCollapse(); + curr.updatePos(); } mCollapse2Idx++; @@ -675,24 +681,27 @@ void daEnSnakeBlock_c::executeState_Collapse2() { } void daEnSnakeBlock_c::initializeState_Collapse3() { - getHeadBlock()->resetSpeed(); - getTailBlock()->resetSpeed(); + getHeadBlock().mSpeed.set(0.0f, 0.0f, 0.0f); + getTailBlock().mSpeed.set(0.0f, 0.0f, 0.0f); for (int i = 0; i < mBlockNum; i++) { dBlock_c &curr = mBlocks[i]; - curr.resetSpeed(); + curr.mSpeed.set(0.0f, 0.0f, 0.0f); } } void daEnSnakeBlock_c::finalizeState_Collapse3() {} void daEnSnakeBlock_c::executeState_Collapse3() { - mCtrlBlock[0].process(); - mCtrlBlock[1].process(); + getHeadBlock().releaseBgCtr(); + getHeadBlock().setFallCollapse(); + getHeadBlock().mPos += getHeadBlock().mSpeed; + + getTailBlock().releaseBgCtr(); + getTailBlock().setFallCollapse(); + getTailBlock().mPos += getTailBlock().mSpeed; for (int i = 0; i < mBlockNum; i++) { dBlock_c &curr = mBlocks[i]; - if (curr.mBgCtr.m_dc) { - curr.mBgCtr.release(); - } + curr.releaseBgCtr(); curr.setFallCollapse(); curr.mPos += curr.mSpeed; } diff --git a/syms.txt b/syms.txt index d89a296f..988797a9 100644 --- a/syms.txt +++ b/syms.txt @@ -86,8 +86,8 @@ __ct__9dBg_ctr_cFv=0x8007F7A0 __dt__9dBg_ctr_cFv=0x8007F810 entry__9dBg_ctr_cFv=0x8007F900 release__9dBg_ctr_cFv=0x8007F950 -set__9dBg_ctr_cFP8dActor_cffffPvPvPviiPv=0x8007FA40 -setOfs__9dBg_ctr_cFffffPv=0x8007FBF0 +set__9dBg_ctr_cFP8dActor_cffffPFP8dActor_cP8dActor_c_vPFP8dActor_cP8dActor_c_vPFP8dActor_cP8dActor_cUc_vUcUcP7mVec3_c=0x8007FA40 +setOfs__9dBg_ctr_cFffffP7mVec3_c=0x8007FBF0 calc__9dBg_ctr_cFv=0x8007FDA0 __dt__Q23m3d9capture_cFv=0x80088FD0 isCyuukanStart__10dCyuukan_cFiUcUc=0x8008F000 From d56a070d4150e9c54ab107370b2bd6c7e58e1f46 Mon Sep 17 00:00:00 2001 From: RootCubed Date: Tue, 7 Apr 2026 21:58:09 +0200 Subject: [PATCH 15/15] more cleanup --- include/game/bases/d_a_en_snake_block.hpp | 90 +++++--- .../d_enemiesNP/bases/d_a_en_snake_block.cpp | 208 +++++++++--------- 2 files changed, 157 insertions(+), 141 deletions(-) diff --git a/include/game/bases/d_a_en_snake_block.hpp b/include/game/bases/d_a_en_snake_block.hpp index 4c9fa3fb..80d0ea3f 100644 --- a/include/game/bases/d_a_en_snake_block.hpp +++ b/include/game/bases/d_a_en_snake_block.hpp @@ -5,9 +5,14 @@ #include #include +#define MAX_SNAKE_BLOCK_COUNT 20 + +/// @brief A snake block which travels along a rail. +/// @paramtable +/// @statetable +/// @ingroup bases class daEnSnakeBlock_c : public dEn_c { public: - // @unofficial class dBlock_c { public: dBlock_c() : mpOwner(nullptr), m_1b4(0) {} @@ -21,7 +26,7 @@ class daEnSnakeBlock_c : public dEn_c { void draw(const mVec3_c &offset); - void initBgCtr(daEnSnakeBlock_c *parent, mVec3_c &blockPos, int unused); + void initBgCtr(daEnSnakeBlock_c *parent, mVec3_c &blockPos, bool icy); void calcBgCtr(); void setFallCollapse(); @@ -59,16 +64,29 @@ class daEnSnakeBlock_c : public dEn_c { short m_1b4; }; - // @unofficial class dCtrlBlock_c : public dBlock_c { public: + /// @brief The possible speed modes of a snake block. + enum SnakeSpeed_e { + SNAKE_SPEED_SLOW, + SNAKE_SPEED_MEDIUM, + SNAKE_SPEED_FAST, + SNAKE_SPEED_COUNT + }; + dCtrlBlock_c() {} virtual ~dCtrlBlock_c() { mBgCtr.release(); } - bool calcPos(s8 *travelInfo); - bool calcTravelPos(s8 *travelInfo); + /// @brief Move this block in the direction of the current travel info. + /// @param travelInfo Travel info array, used to determine the direction of movement. + /// @return Whether the block is ready for the next move. + bool moveBlock(s8 *travelInfo); + /// @brief Start the move to the next position. + /// @param travelInfo Travel info array, used to determine the direction of movement. + /// @return Whether the block has reached the end of the travel info. + bool nextTravelMove(s8 *travelInfo); - int mSnakeSpeedIdx; + SnakeSpeed_e mSnakeSpeed; }; enum TravelDir_e { @@ -76,10 +94,11 @@ class daEnSnakeBlock_c : public dEn_c { TRAVEL_DIR_UP, TRAVEL_DIR_DOWN, TRAVEL_DIR_LEFT, - TRAVEL_DIR_RIGHT + TRAVEL_DIR_RIGHT, + TRAVEL_DIR_COUNT }; - daEnSnakeBlock_c() : mpTravelInfo(nullptr), mTravelInfoIdx(0), mShakeTime(0) {} + daEnSnakeBlock_c() : mpTravelInfo(nullptr), mTravelInfoIdx(0), mShakeTimer(0) {} virtual ~daEnSnakeBlock_c() {} virtual int create(); @@ -111,42 +130,41 @@ class daEnSnakeBlock_c : public dEn_c { dHeapAllocator_c mAllocator; - dCtrlBlock_c mCtrlBlock[2]; - dBlock_c mBlocks[20]; + dCtrlBlock_c mCtrlBlock[2]; ///< The head and tail blocks. + dBlock_c mBlocks[MAX_SNAKE_BLOCK_COUNT]; ///< The blocks between the head and tail. Only the first mBlockCount of these are used. - int mBlockNum; - s8 *mpTravelInfo; - int mTravelInfoIdx; - short mShakeTime; + int mBlockCount; ///< The number of blocks between the head and tail. + s8 *mpTravelInfo; ///< Values are of type TravelDir_e. + int mTravelInfoIdx; ///< The current index into mpTravelInfo. + short mShakeTimer; ///< Counts frames for the shake animation. - sStateID_c *mpStopState; + sStateID_c *mpStopState; ///< The state to transition to when the snake block stops. int mSnakeType; ///< Used for custom snake types - int mCollapse2Idx; + int mCollapseTimer; int mCreateAnmBlockIdx; int mCreateAnmBlockNum; - u8 _pad[4]; + u8 mPad[4]; - ACTOR_PARAM_CONFIG(Param_00, 0, 4); - ACTOR_PARAM_CONFIG(RailIdx, 4, 4); - ACTOR_PARAM_CONFIG(Param_08, 8, 2); - ACTOR_PARAM_CONFIG(Param_0c, 12, 8); - ACTOR_PARAM_CONFIG(RailStartIdx, 12, 8); - ACTOR_PARAM_CONFIG(Param_14, 20, 1); - ACTOR_PARAM_CONFIG(StopState, 28, 4); + ACTOR_PARAM_CONFIG(BlockCount, 0, 4); ///< The number of blocks between the head and tail. + ACTOR_PARAM_CONFIG(RailID, 4, 4); ///< The ID of the rail that the snake block travels along. + ACTOR_PARAM_CONFIG(SnakeSpeed, 8, 2); ///< The snake's speed. See dCtrlBlock_c::SnakeSpeed_e. + ACTOR_PARAM_CONFIG(RailStartIdx, 12, 8); ///< The index of the rail points that the snake block starts at. + ACTOR_PARAM_CONFIG(SnakeType, 20, 1); ///< [Has no effect in-game, but might have been intended for ice / no ice variants] + ACTOR_PARAM_CONFIG(StopMode, 28, 4); ///< Determines how the snake block behaves after terminating. static const float sc_FallAccel; static const float sc_FallMaxSpeed; - static const float sc_snakeSpeeds[3]; - static const float sc_snakeSpeeds2[3]; - static mVec2_c sc_ctrlPosMods[5]; - static int sc_glbSnakeNum; + static const float sc_SnakeSpeeds[3]; + static const float sc_SnakeSpeeds2[3]; + static const mVec2_c sc_TravelDirs[5]; static const int scSnakeSoundID; - - STATE_FUNC_DECLARE(daEnSnakeBlock_c, Wait); - STATE_FUNC_DECLARE(daEnSnakeBlock_c, Move); - STATE_FUNC_DECLARE(daEnSnakeBlock_c, Shake); - STATE_FUNC_DECLARE(daEnSnakeBlock_c, Stop); - STATE_FUNC_DECLARE(daEnSnakeBlock_c, Collapse1); - STATE_FUNC_DECLARE(daEnSnakeBlock_c, Collapse2); - STATE_FUNC_DECLARE(daEnSnakeBlock_c, Collapse3); + static int g_SnakeNum; ///< Global counter for the active snake blocks. + + STATE_FUNC_DECLARE(daEnSnakeBlock_c, Wait); ///< Waiting for a player to land on the block to start moving. + STATE_FUNC_DECLARE(daEnSnakeBlock_c, Move); ///< Moving along the rail. + STATE_FUNC_DECLARE(daEnSnakeBlock_c, Shake); ///< Shaking before collapsing. + STATE_FUNC_DECLARE(daEnSnakeBlock_c, Stop); ///< Stopped at the end of the rail. + STATE_FUNC_DECLARE(daEnSnakeBlock_c, Collapse1); ///< Collapse mode 1: Blocks fall through last node. + STATE_FUNC_DECLARE(daEnSnakeBlock_c, Collapse2); ///< Collapse mode 2: Blocks fall after another, with an 8-frame delay between each. + STATE_FUNC_DECLARE(daEnSnakeBlock_c, Collapse3); ///< Collapse mode 3: Blocks fall all at once. }; diff --git a/source/d_enemiesNP/bases/d_a_en_snake_block.cpp b/source/d_enemiesNP/bases/d_a_en_snake_block.cpp index 294dd3bd..6cefd9f7 100644 --- a/source/d_enemiesNP/bases/d_a_en_snake_block.cpp +++ b/source/d_enemiesNP/bases/d_a_en_snake_block.cpp @@ -63,7 +63,7 @@ void daEnSnakeBlock_c::dBlock_c::draw(const mVec3_c &offset) { mModel.entry(); } -void daEnSnakeBlock_c::dBlock_c::initBgCtr(daEnSnakeBlock_c *owner, mVec3_c &blockPos, int _unused) { +void daEnSnakeBlock_c::dBlock_c::initBgCtr(daEnSnakeBlock_c *owner, mVec3_c &blockPos, bool icy) { mVec3_c pos = blockPos; mPos = pos; if (mpOwner == nullptr) { @@ -78,9 +78,9 @@ void daEnSnakeBlock_c::dBlock_c::initBgCtr(daEnSnakeBlock_c *owner, mVec3_c &blo ); mBgCtr.mFlags = 0; - // [The unused flag was probably used to set the collision to icy before they + // [The unused parameter was probably used to set the collision to icy before they // decided to always make it icy.] - /* if (_unused) { */ + /* if (icy) { */ mBgCtr.mFlags |= 4; /* } */ mBgCtr.entry(); @@ -102,7 +102,7 @@ void daEnSnakeBlock_c::dBlock_c::setFallCollapse() { } void daEnSnakeBlock_c::dBlock_c::calcCollapse1(s8 *travelInfo) { - static mVec2_c floats[] = { + static mVec2_c offsets[] = { mVec2_c(0.0f, 0.0f), mVec2_c(0.0f, 2.0f), mVec2_c(0.0f, -2.0f), @@ -115,12 +115,12 @@ void daEnSnakeBlock_c::dBlock_c::calcCollapse1(s8 *travelInfo) { } u8 info = travelInfo[mTravelInfoIdx]; - if (info == 0) { + if (info == TRAVEL_DIR_NONE) { setFallCollapse(); mPos += mSpeed; } else { - mPos.x += floats[info].x; - mPos.y += floats[info].y; + mPos.x += offsets[info].x; + mPos.y += offsets[info].y; mVec2_c diff(mPos.x - mLastPos.x, mPos.y - mLastPos.y); if (diff.length() >= 16.0f) { mLastPos = mPos; @@ -130,24 +130,24 @@ void daEnSnakeBlock_c::dBlock_c::calcCollapse1(s8 *travelInfo) { } void daEnSnakeBlock_c::dBlock_c::callBackF(dActor_c *self, dActor_c *other) { - daEnSnakeBlock_c *y = (daEnSnakeBlock_c *) self; + daEnSnakeBlock_c *snakeBlock = (daEnSnakeBlock_c *) self; - bool x = false; + bool isPlayer = false; if (other->mKind == dActor_c::STAGE_ACTOR_PLAYER) { - x = true; + isPlayer = true; } else if (other->mKind == dActor_c::STAGE_ACTOR_YOSHI && *other->getPlrNo() != -1) { - x = true; + isPlayer = true; } - if (x && y->isState(StateID_Wait)) { - y->changeState(StateID_Move); + if (isPlayer && snakeBlock->isState(StateID_Wait)) { + snakeBlock->changeState(StateID_Move); } } void daEnSnakeBlock_c::dBlock_c::callBackH(dActor_c *self, dActor_c *other) {} void daEnSnakeBlock_c::dBlock_c::callBackW(dActor_c *self, dActor_c *other, u8 x) {} -mVec2_c daEnSnakeBlock_c::sc_ctrlPosMods[5] = { +const mVec2_c daEnSnakeBlock_c::sc_TravelDirs[TRAVEL_DIR_COUNT] = { mVec2_c(0.0f, 0.0f), mVec2_c(0.0f, 1.0f), mVec2_c(0.0f, -1.0f), @@ -155,13 +155,13 @@ mVec2_c daEnSnakeBlock_c::sc_ctrlPosMods[5] = { mVec2_c(1.0f, 0.0f) }; -int daEnSnakeBlock_c::sc_glbSnakeNum = 0; +int daEnSnakeBlock_c::g_SnakeNum = 0; -const float daEnSnakeBlock_c::sc_snakeSpeeds2[3] = { +const float daEnSnakeBlock_c::sc_SnakeSpeeds2[dCtrlBlock_c::SNAKE_SPEED_COUNT] = { 0.5f, 1.0f, 1.4f }; -const float daEnSnakeBlock_c::sc_snakeSpeeds[3] = { +const float daEnSnakeBlock_c::sc_SnakeSpeeds[dCtrlBlock_c::SNAKE_SPEED_COUNT] = { 0.5f, 1.0f, 1.4f }; @@ -173,15 +173,15 @@ STATE_DEFINE(daEnSnakeBlock_c, Collapse2); STATE_DEFINE(daEnSnakeBlock_c, Collapse3); STATE_DEFINE(daEnSnakeBlock_c, Stop); -bool daEnSnakeBlock_c::dCtrlBlock_c::calcPos(s8 *travelInfo) { - float speed = sc_snakeSpeeds[mSnakeSpeedIdx]; +bool daEnSnakeBlock_c::dCtrlBlock_c::moveBlock(s8 *travelInfo) { + float speed = sc_SnakeSpeeds[mSnakeSpeed]; - mVec2_c newPos; - newPos.x = sc_ctrlPosMods[travelInfo[mTravelInfoIdx]].x; - newPos.y = sc_ctrlPosMods[travelInfo[mTravelInfoIdx]].y; + mVec2_c dir; + dir.x = sc_TravelDirs[travelInfo[mTravelInfoIdx]].x; + dir.y = sc_TravelDirs[travelInfo[mTravelInfoIdx]].y; - mPos.x += speed * newPos.x; - mPos.y += speed * newPos.y; + mPos.x += speed * dir.x; + mPos.y += speed * dir.y; if (std::fabs(mPos.x - mLastPos.x) >= 16.0f || std::fabs(mPos.y - mLastPos.y) >= 16.0f) { return true; @@ -189,29 +189,29 @@ bool daEnSnakeBlock_c::dCtrlBlock_c::calcPos(s8 *travelInfo) { return false; } -bool daEnSnakeBlock_c::dCtrlBlock_c::calcTravelPos(s8 *travelInfo) { - mVec2_c newPos; - newPos.x = sc_ctrlPosMods[travelInfo[mTravelInfoIdx]].x; - newPos.y = sc_ctrlPosMods[travelInfo[mTravelInfoIdx]].y; +bool daEnSnakeBlock_c::dCtrlBlock_c::nextTravelMove(s8 *travelInfo) { + mVec2_c dir; + dir.x = sc_TravelDirs[travelInfo[mTravelInfoIdx]].x; + dir.y = sc_TravelDirs[travelInfo[mTravelInfoIdx]].y; - mPos.x = mLastPos.x + newPos.x * 16.0f; - mPos.y = mLastPos.y + newPos.y * 16.0f; + mPos.x = mLastPos.x + dir.x * 16.0f; + mPos.y = mLastPos.y + dir.y * 16.0f; mLastPos = mPos; mTravelInfoIdx++; - return travelInfo[mTravelInfoIdx] == 0; + return travelInfo[mTravelInfoIdx] == TRAVEL_DIR_NONE; } int daEnSnakeBlock_c::create() { - if (sc_glbSnakeNum > 0 && ACTOR_PARAM(Param_0c) != 0) { + if (g_SnakeNum > 0 && ACTOR_PARAM(RailStartIdx) != 0) { deleteRequest(); return NOT_READY; } - sc_glbSnakeNum++; - mBlockNum = ACTOR_PARAM(Param_00) + 2; - mSnakeType = ACTOR_PARAM(Param_14); + g_SnakeNum++; + mBlockCount = ACTOR_PARAM(BlockCount) + 2; + mSnakeType = ACTOR_PARAM(SnakeType); initBlock(); initBlockPath(); @@ -243,13 +243,13 @@ int daEnSnakeBlock_c::draw() { mVec3_c offset(0.0f, 0.0f, 0.0f); - if (mShakeTime > 0) { - offset.x += sc_shakeOffsetX[(mShakeTime >> 1) & 1]; + if (mShakeTimer > 0) { + offset.x += sc_shakeOffsetX[(mShakeTimer >> 1) & 1]; } getHeadBlock().draw(offset); getTailBlock().draw(offset); - for (int i = 0; i < mBlockNum; i++) { + for (int i = 0; i < mBlockCount; i++) { mBlocks[i].draw(offset); } @@ -263,9 +263,9 @@ int daEnSnakeBlock_c::doDelete() { deleteBlock(); } - sc_glbSnakeNum--; - if (sc_glbSnakeNum < 0) { - sc_glbSnakeNum = 0; + g_SnakeNum--; + if (g_SnakeNum < 0) { + g_SnakeNum = 0; } return SUCCEEDED; @@ -279,17 +279,17 @@ void daEnSnakeBlock_c::initBlock() { } void daEnSnakeBlock_c::initBlockPath() { - sRailInfoData *rail = dRail_c::getRailInfoP(ACTOR_PARAM(RailIdx)); + sRailInfoData *rail = dRail_c::getRailInfoP(ACTOR_PARAM(RailID)); dCdFile_c *file = dCd_c::m_instance->getFileP(dScStage_c::m_instance->mCurrFile); - sRailNodeData *node = &file->mpRailNodes[rail->mNodeIdx]; + sRailNodeData *node = file->mpRailNodes + rail->mNodeIdx; node = &node[ACTOR_PARAM(RailStartIdx)]; - bool icy = ACTOR_PARAM(Param_14); + bool icy = ACTOR_PARAM(SnakeType); - float nodeX = node[0].mX; - float nodeY = node[0].mY; - float x = nodeX + mBlockNum * 16.0f + 8.0f; + float nodeX = node->mX; + float nodeY = node->mY; + float x = nodeX + mBlockCount * 16.0f + 8.0f; float y = -nodeY - 8.0f; mVec3_c headPos(x, y, 1516.0f); @@ -298,8 +298,8 @@ void daEnSnakeBlock_c::initBlockPath() { dBlock_c *curr = mBlocks; int i = 0; - if (mBlockNum > 0) { - while (i < mBlockNum) { + if (mBlockCount > 0) { + while (i < mBlockCount) { mVec3_c midPos(x, y, 1500.0f); curr->initBgCtr(this, midPos, icy); x -= 16.0f; @@ -311,19 +311,18 @@ void daEnSnakeBlock_c::initBlockPath() { mVec3_c tailPos = mVec3_c(x, y, 1516.0f); getTailBlock().initBgCtr(this, tailPos, icy); - getHeadBlock().mTravelInfoIdx = mBlockNum + 1; + getHeadBlock().mTravelInfoIdx = mBlockCount + 1; getTailBlock().mTravelInfoIdx = 1; - // Note: Value 3 is out of bounds - getHeadBlock().mSnakeSpeedIdx = ACTOR_PARAM(Param_08); - getTailBlock().mSnakeSpeedIdx = ACTOR_PARAM(Param_08); + getHeadBlock().mSnakeSpeed = (dCtrlBlock_c::SnakeSpeed_e) ACTOR_PARAM(SnakeSpeed); + getTailBlock().mSnakeSpeed = (dCtrlBlock_c::SnakeSpeed_e) ACTOR_PARAM(SnakeSpeed); } void daEnSnakeBlock_c::calcAnm() { getHeadBlock().calcAnm(); getTailBlock().calcAnm(); - for (int i = 0; i < mBlockNum; i++) { + for (int i = 0; i < mBlockCount; i++) { mBlocks[i].calcAnm(); } } @@ -332,7 +331,7 @@ void daEnSnakeBlock_c::createMdl() { getHeadBlock().createMdl(&mAllocator); getTailBlock().createMdl(&mAllocator); - for (int i = 0; i < mBlockNum; i++) { + for (int i = 0; i < mBlockCount; i++) { mBlocks[i].createMdl(&mAllocator); } } @@ -341,7 +340,7 @@ void daEnSnakeBlock_c::deleteBlock() { getHeadBlock().doDelete(); getTailBlock().doDelete(); - for (int i = 0; i < mBlockNum; i++) { + for (int i = 0; i < mBlockCount; i++) { mBlocks[i].doDelete(); } } @@ -351,7 +350,7 @@ void daEnSnakeBlock_c::setStopState() { &StateID_Stop, &StateID_Collapse1, &StateID_Collapse2, &StateID_Collapse3 }; - mpStopState = l_StopStates[ACTOR_PARAM(StopState)]; + mpStopState = l_StopStates[ACTOR_PARAM(StopMode)]; } void daEnSnakeBlock_c::calcBgCtr() { @@ -360,13 +359,13 @@ void daEnSnakeBlock_c::calcBgCtr() { getTailBlock().mBgCtr.mFlags |= 1; - for (int i = 0; i < mBlockNum; i++) { + for (int i = 0; i < mBlockCount; i++) { mBlocks[i].calcBgCtr(); } } void daEnSnakeBlock_c::initTravelInfo() { - sRailInfoData *rail = dRail_c::getRailInfoP(ACTOR_PARAM(RailIdx)); + sRailInfoData *rail = dRail_c::getRailInfoP(ACTOR_PARAM(RailID)); dCdFile_c *cdFile = dCd_c::m_instance->getFileP(dScStage_c::m_instance->mCurrFile); sRailNodeData *node = cdFile->mpRailNodes + rail->mNodeIdx; @@ -453,23 +452,23 @@ void daEnSnakeBlock_c::initTravelInfo() { } void daEnSnakeBlock_c::setBlockPos() { - dBlock_c *prev = &mBlocks[mBlockNum - 2]; - dBlock_c *curr = &mBlocks[mBlockNum - 1]; - mVec3_c tmp; - for (int i = 0; i < mBlockNum - 1; i++) { - tmp.x = prev->getPos().x; - tmp.y = prev->getPos().y; - tmp.z = 1500.0f; - curr->setPos(tmp); + dBlock_c *prev = &mBlocks[mBlockCount - 2]; + dBlock_c *curr = &mBlocks[mBlockCount - 1]; + mVec3_c pos; + for (int i = 0; i < mBlockCount - 1; i++) { + pos.x = prev->getPos().x; + pos.y = prev->getPos().y; + pos.z = 1500.0f; + curr->setPos(pos); curr--; prev--; } - tmp.x = getHeadBlock().getPos().x; - tmp.y = getHeadBlock().getPos().y; - tmp.z = 1500.0f; - mBlocks[0].setPos(tmp); + pos.x = getHeadBlock().getPos().x; + pos.y = getHeadBlock().getPos().y; + pos.z = 1500.0f; + mBlocks[0].setPos(pos); } void daEnSnakeBlock_c::setActorPos() { @@ -501,15 +500,14 @@ void daEnSnakeBlock_c::initializeState_Move() { getTailBlock().setAnmClr("ridden"); mBlocks[0].setAnmClr("create"); - for (int i = 1; i < mBlockNum; i++) { - dBlock_c &curr = mBlocks[i]; - curr.setAnmClr("ridden"); + for (int i = 1; i < mBlockCount; i++) { + mBlocks[i].setAnmClr("ridden"); } getHeadBlock().mLastPos = getHeadBlock().mPos; getTailBlock().mLastPos = getTailBlock().mPos; - int snakeSpeed = 16.0f / sc_snakeSpeeds[ACTOR_PARAM(Param_08)]; + int snakeSpeed = 16.0f / sc_SnakeSpeeds[ACTOR_PARAM(SnakeSpeed)]; mCreateAnmBlockIdx = 0; mCreateAnmBlockNum = getHeadBlock().mAnmClr.getFrameMax(0) / snakeSpeed; @@ -517,14 +515,14 @@ void daEnSnakeBlock_c::initializeState_Move() { void daEnSnakeBlock_c::finalizeState_Move() {} void daEnSnakeBlock_c::executeState_Move() { dBlock_c *curr; - bool b3 = getHeadBlock().calcPos(mpTravelInfo); - bool b4 = getTailBlock().calcPos(mpTravelInfo); - bool b5 = false; - bool b6 = false; + bool moveDoneHead = getHeadBlock().moveBlock(mpTravelInfo); + bool moveDoneTail = getTailBlock().moveBlock(mpTravelInfo); + bool allMoveDoneHead = false; + bool allMoveDoneTail = false; - if (b3 || b4) { - b5 = getHeadBlock().calcTravelPos(mpTravelInfo); - b6 = getTailBlock().calcTravelPos(mpTravelInfo); + if (moveDoneHead || moveDoneTail) { + allMoveDoneHead = getHeadBlock().nextTravelMove(mpTravelInfo); + allMoveDoneTail = getTailBlock().nextTravelMove(mpTravelInfo); dAudio::SoundEffectID_t(scSnakeSoundID).playMapSound(mPos, 0); @@ -536,7 +534,7 @@ void daEnSnakeBlock_c::executeState_Move() { curr = mBlocks; int frame; - int snakeSpeed = 16.0f / sc_snakeSpeeds[mParam >> 8 & 0x3]; + int snakeSpeed = 16.0f / sc_SnakeSpeeds[ACTOR_PARAM(SnakeSpeed)]; int i = 0; frame = 0; @@ -548,7 +546,7 @@ void daEnSnakeBlock_c::executeState_Move() { } } - if (b5 || b6) { + if (allMoveDoneHead || allMoveDoneTail) { if (mpStopState->isEqual(StateID_Stop)) { changeState(StateID_Stop); } else { @@ -563,17 +561,17 @@ void daEnSnakeBlock_c::initializeState_Shake() { getTailBlock().setAnmClr("ridden"); getTailBlock().mAnmClr.setRate(0.0f, 0); - for (int i = 0; i < mBlockNum; i++) { + for (int i = 0; i < mBlockCount; i++) { dBlock_c &curr = mBlocks[i]; curr.setAnmClr("ridden"); curr.mAnmClr.setRate(0.0f, 0); } - mShakeTime = 60; + mShakeTimer = 60; } void daEnSnakeBlock_c::finalizeState_Shake() {} void daEnSnakeBlock_c::executeState_Shake() { - if (--mShakeTime == 0) { + if (--mShakeTimer == 0) { changeState(*mpStopState); } } @@ -584,7 +582,7 @@ void daEnSnakeBlock_c::initializeState_Stop() { getTailBlock().setAnmClr("ridden"); getTailBlock().mAnmClr.setRate(0.0f, 0); - for (int i = 0; i < mBlockNum; i++) { + for (int i = 0; i < mBlockCount; i++) { dBlock_c &curr = mBlocks[i]; curr.setAnmClr("ridden"); curr.mAnmClr.setRate(0.0f, 0); @@ -594,7 +592,7 @@ void daEnSnakeBlock_c::finalizeState_Stop() {} void daEnSnakeBlock_c::executeState_Stop() {} void daEnSnakeBlock_c::initializeState_Collapse1() { - static mVec2_c sc_collapseSpeeds[5] = { + static mVec2_c sc_collapseSpeeds[TRAVEL_DIR_COUNT] = { mVec2_c(0.0f, 0.0f), mVec2_c(1.0f, 3.0f), mVec2_c(0.0f, -1.0f), @@ -604,25 +602,25 @@ void daEnSnakeBlock_c::initializeState_Collapse1() { getHeadBlock().mLastPos = getHeadBlock().mPos; getTailBlock().mLastPos = getTailBlock().mPos; - for (int i = 0; (int) i < mBlockNum; i++) { + for (int i = 0; (int) i < mBlockCount; i++) { dBlock_c &curr = mBlocks[i]; curr.mLastPos = curr.mPos; } dBlock_c *curr = &getHeadBlock(); int prevIdx = curr->mTravelInfoIdx; - for (u32 i = 0; (int) i < mBlockNum; i++) { // [fake match] + for (u32 i = 0; (int) i < mBlockCount; i++) { // [fake match] curr = &mBlocks[i]; curr->mTravelInfoIdx = prevIdx; prevIdx--; } getTailBlock().mTravelInfoIdx = prevIdx; - int idx = mpTravelInfo[mTravelInfoIdx]; - mVec2_c collapseSpeed = sc_collapseSpeeds[idx]; + int info = mpTravelInfo[mTravelInfoIdx]; + mVec2_c collapseSpeed = sc_collapseSpeeds[info]; getHeadBlock().mSpeed.set(collapseSpeed.x, collapseSpeed.y, 0.0f); getTailBlock().mSpeed.set(collapseSpeed.x, collapseSpeed.y, 0.0f); - for (u32 i = 0; (int) i < mBlockNum; i++) { // [fake match] + for (u32 i = 0; (int) i < mBlockCount; i++) { // [fake match] dBlock_c &curr = mBlocks[i]; curr.mSpeed.set(collapseSpeed.x, collapseSpeed.y, 0.0f); } @@ -631,7 +629,7 @@ void daEnSnakeBlock_c::finalizeState_Collapse1() {} void daEnSnakeBlock_c::executeState_Collapse1() { getHeadBlock().calcCollapse1(mpTravelInfo); getTailBlock().calcCollapse1(mpTravelInfo); - for (int i = 0; i < mBlockNum; i++) { + for (int i = 0; i < mBlockCount; i++) { mBlocks[i].calcCollapse1(mpTravelInfo); } @@ -641,10 +639,10 @@ void daEnSnakeBlock_c::executeState_Collapse1() { } void daEnSnakeBlock_c::initializeState_Collapse2() { - mCollapse2Idx = 0; + mCollapseTimer = 0; getHeadBlock().mSpeed.set(0.0f, 0.0f, 0.0f); getTailBlock().mSpeed.set(0.0f, 0.0f, 0.0f); - for (int i = 0; i < mBlockNum; i++) { + for (int i = 0; i < mBlockCount; i++) { dBlock_c &curr = mBlocks[i]; curr.mSpeed.set(0.0f, 0.0f, 0.0f); } @@ -655,18 +653,18 @@ void daEnSnakeBlock_c::executeState_Collapse2() { getHeadBlock().setFallCollapse(); getHeadBlock().updatePos(); - if (mCollapse2Idx > mBlockNum * 8) { + if (mCollapseTimer > mBlockCount * 8) { getTailBlock().releaseBgCtr(); getTailBlock().setFallCollapse(); getTailBlock().updatePos(); } - int i5 = mCollapse2Idx >> 3; - if (i5 > mBlockNum - 1) { - i5 = mBlockNum - 1; + int collapseUpTo = mCollapseTimer >> 3; + if (collapseUpTo > mBlockCount - 1) { + collapseUpTo = mBlockCount - 1; } - for (int i = 0; i < i5 + 1; i++) { + for (int i = 0; i < collapseUpTo + 1; i++) { dBlock_c &curr = mBlocks[i]; curr.mBgCtr.release(); curr.releaseBgCtr(); @@ -674,7 +672,7 @@ void daEnSnakeBlock_c::executeState_Collapse2() { curr.updatePos(); } - mCollapse2Idx++; + mCollapseTimer++; if (chkCollapseDelete()) { deleteActor(1); } @@ -684,7 +682,7 @@ void daEnSnakeBlock_c::initializeState_Collapse3() { getHeadBlock().mSpeed.set(0.0f, 0.0f, 0.0f); getTailBlock().mSpeed.set(0.0f, 0.0f, 0.0f); - for (int i = 0; i < mBlockNum; i++) { + for (int i = 0; i < mBlockCount; i++) { dBlock_c &curr = mBlocks[i]; curr.mSpeed.set(0.0f, 0.0f, 0.0f); } @@ -699,7 +697,7 @@ void daEnSnakeBlock_c::executeState_Collapse3() { getTailBlock().setFallCollapse(); getTailBlock().mPos += getTailBlock().mSpeed; - for (int i = 0; i < mBlockNum; i++) { + for (int i = 0; i < mBlockCount; i++) { dBlock_c &curr = mBlocks[i]; curr.releaseBgCtr(); curr.setFallCollapse();