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 new file mode 100644 index 00000000..80d0ea3f --- /dev/null +++ b/include/game/bases/d_a_en_snake_block.hpp @@ -0,0 +1,170 @@ +#pragma once +#include +#include +#include +#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: + class dBlock_c { + public: + dBlock_c() : mpOwner(nullptr), m_1b4(0) {} + virtual ~dBlock_c() { mBgCtr.release(); } + + void createMdl(mAllocator_c *allocator); + void doDelete(); + + void calcAnm(); + void setAnmClr(const char *name); + + void draw(const mVec3_c &offset); + + void initBgCtr(daEnSnakeBlock_c *parent, mVec3_c &blockPos, bool icy); + void calcBgCtr(); + + void setFallCollapse(); + void calcCollapse1(s8 *travelInfo); + + mVec3_c getPos() const { return mPos; } + void setPos(mVec3_c pos) { mPos = pos; } + void releaseBgCtr() { + if (mBgCtr.m_dc) { + mBgCtr.release(); + } + } + void updatePos() { + mPos += mSpeed; + } + + 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; + 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 m_1b4; + }; + + 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(); } + + /// @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); + + SnakeSpeed_e mSnakeSpeed; + }; + + enum TravelDir_e { + TRAVEL_DIR_NONE, + TRAVEL_DIR_UP, + TRAVEL_DIR_DOWN, + TRAVEL_DIR_LEFT, + TRAVEL_DIR_RIGHT, + TRAVEL_DIR_COUNT + }; + + daEnSnakeBlock_c() : mpTravelInfo(nullptr), mTravelInfoIdx(0), mShakeTimer(0) {} + virtual ~daEnSnakeBlock_c() {} + + virtual int create(); + virtual int doDelete(); + virtual int execute(); + virtual int draw(); + virtual 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) + + dCtrlBlock_c &getHeadBlock() { return mCtrlBlock[0]; } + dCtrlBlock_c &getTailBlock() { return mCtrlBlock[1]; } + + dHeapAllocator_c mAllocator; + + 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 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; ///< The state to transition to when the snake block stops. + int mSnakeType; ///< Used for custom snake types + int mCollapseTimer; + int mCreateAnmBlockIdx; + int mCreateAnmBlockNum; + u8 mPad[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 const mVec2_c sc_TravelDirs[5]; + static const int scSnakeSoundID; + 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/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/include/game/bases/d_cd.hpp b/include/game/bases/d_cd.hpp index f692bc1a..66dc9556 100644 --- a/include/game/bases/d_cd.hpp +++ b/include/game/bases/d_cd.hpp @@ -99,9 +99,9 @@ class dCd_c { static void deleteInstance(); dCdFile_c *getFileP(int idx) { - dCdFile_c *course = &mFiles[idx]; - if (course->mpAreas != nullptr) { - return course; + dCdFile_c *file = &mFiles[idx]; + if (file->mpAreas != nullptr) { + return file; } return nullptr; } 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/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 195d39c6..7aef7093 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": { @@ -30,10 +30,19 @@ "slices": [ { "source": "runtime/rel_init.cpp", - "compilerFlags": "", "memoryRanges": { ".text": "0x0-0x70" } + }, + { + "source": "d_enemiesNP/bases/d_a_en_snake_block.cpp", + "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 new file mode 100644 index 00000000..6cefd9f7 --- /dev/null +++ b/source/d_enemiesNP/bases/d_a_en_snake_block.cpp @@ -0,0 +1,712 @@ +#include +#include +#include + +#include +#include +#include +#include +#include + +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(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, allocator, 0x32c, 1, nullptr); + dActor_c::setSoftLight_MapObj(mModel); + + mResTexSrt = mResFile.GetResAnmTexSrt("block_snake_ice"); + 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, allocator, nullptr, 1); + 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(const mVec3_c &offset) { + mVec3_c a = mPos + offset; + dActor_c::changePosAngle(&a, nullptr, 1); + + mMtx_c mtx = mMtx_c::createTrans(a); + mModel.setLocalMtx(&mtx); + + mModel.setScale(mVec3_c(1.0f, 1.0f, 1.0f)); + mModel.calc(false); + mModel.entry(); +} + +void daEnSnakeBlock_c::dBlock_c::initBgCtr(daEnSnakeBlock_c *owner, mVec3_c &blockPos, bool icy) { + mVec3_c pos = blockPos; + mPos = pos; + if (mpOwner == nullptr) { + mpOwner = owner; + } + + float dx = mPos.x - mpOwner->mPos.x; + float dy = mPos.y - mpOwner->mPos.y; + + 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 parameter was probably used to set the collision to icy before they + // decided to always make it icy.] + /* if (icy) { */ + mBgCtr.mFlags |= 4; + /* } */ + mBgCtr.entry(); +} + +void daEnSnakeBlock_c::dBlock_c::calcBgCtr() { + 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 += sc_FallAccel; + if (mSpeed.y < sc_FallMaxSpeed) { + mSpeed.y = sc_FallMaxSpeed; + } +} + +void daEnSnakeBlock_c::dBlock_c::calcCollapse1(s8 *travelInfo) { + static mVec2_c offsets[] = { + 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(); + } + + u8 info = travelInfo[mTravelInfoIdx]; + if (info == TRAVEL_DIR_NONE) { + setFallCollapse(); + mPos += mSpeed; + } else { + 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; + mTravelInfoIdx++; + } + } +} + +void daEnSnakeBlock_c::dBlock_c::callBackF(dActor_c *self, dActor_c *other) { + daEnSnakeBlock_c *snakeBlock = (daEnSnakeBlock_c *) self; + + bool isPlayer = false; + if (other->mKind == dActor_c::STAGE_ACTOR_PLAYER) { + isPlayer = true; + } else if (other->mKind == dActor_c::STAGE_ACTOR_YOSHI && *other->getPlrNo() != -1) { + isPlayer = true; + } + + 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) {} + +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), + mVec2_c(-1.0f, 0.0f), + mVec2_c(1.0f, 0.0f) +}; + +int daEnSnakeBlock_c::g_SnakeNum = 0; + +const float daEnSnakeBlock_c::sc_SnakeSpeeds2[dCtrlBlock_c::SNAKE_SPEED_COUNT] = { + 0.5f, 1.0f, 1.4f +}; + +const float daEnSnakeBlock_c::sc_SnakeSpeeds[dCtrlBlock_c::SNAKE_SPEED_COUNT] = { + 0.5f, 1.0f, 1.4f +}; + +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::moveBlock(s8 *travelInfo) { + float speed = sc_SnakeSpeeds[mSnakeSpeed]; + + mVec2_c dir; + dir.x = sc_TravelDirs[travelInfo[mTravelInfoIdx]].x; + dir.y = sc_TravelDirs[travelInfo[mTravelInfoIdx]].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; + } + return false; +} + +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 + dir.x * 16.0f; + mPos.y = mLastPos.y + dir.y * 16.0f; + + mLastPos = mPos; + + mTravelInfoIdx++; + return travelInfo[mTravelInfoIdx] == TRAVEL_DIR_NONE; +} + +int daEnSnakeBlock_c::create() { + if (g_SnakeNum > 0 && ACTOR_PARAM(RailStartIdx) != 0) { + deleteRequest(); + return NOT_READY; + } + + g_SnakeNum++; + mBlockCount = ACTOR_PARAM(BlockCount) + 2; + mSnakeType = ACTOR_PARAM(SnakeType); + + 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() { + static const float sc_shakeOffsetX[2] = { + 1.0f, -1.0f + }; + + mVec3_c offset(0.0f, 0.0f, 0.0f); + + if (mShakeTimer > 0) { + offset.x += sc_shakeOffsetX[(mShakeTimer >> 1) & 1]; + } + + getHeadBlock().draw(offset); + getTailBlock().draw(offset); + for (int i = 0; i < mBlockCount; i++) { + mBlocks[i].draw(offset); + } + + return SUCCEEDED; +} + +void daEnSnakeBlock_c::deleteReady() { } + +int daEnSnakeBlock_c::doDelete() { + if (mAllocator.mpHeap != mAllocatorDummyHeap_c::getInstance()) { + deleteBlock(); + } + + g_SnakeNum--; + if (g_SnakeNum < 0) { + g_SnakeNum = 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(ACTOR_PARAM(RailID)); + dCdFile_c *file = dCd_c::m_instance->getFileP(dScStage_c::m_instance->mCurrFile); + + sRailNodeData *node = file->mpRailNodes + rail->mNodeIdx; + node = &node[ACTOR_PARAM(RailStartIdx)]; + + bool icy = ACTOR_PARAM(SnakeType); + + 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); + + getHeadBlock().initBgCtr(this, headPos, icy); + + dBlock_c *curr = mBlocks; + int i = 0; + if (mBlockCount > 0) { + while (i < mBlockCount) { + mVec3_c midPos(x, y, 1500.0f); + curr->initBgCtr(this, midPos, icy); + x -= 16.0f; + curr++; + i++; + } + } + + mVec3_c tailPos = mVec3_c(x, y, 1516.0f); + getTailBlock().initBgCtr(this, tailPos, icy); + + getHeadBlock().mTravelInfoIdx = mBlockCount + 1; + getTailBlock().mTravelInfoIdx = 1; + + 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 < mBlockCount; i++) { + mBlocks[i].calcAnm(); + } +} + +void daEnSnakeBlock_c::createMdl() { + getHeadBlock().createMdl(&mAllocator); + getTailBlock().createMdl(&mAllocator); + + for (int i = 0; i < mBlockCount; i++) { + mBlocks[i].createMdl(&mAllocator); + } +} + +void daEnSnakeBlock_c::deleteBlock() { + getHeadBlock().doDelete(); + getTailBlock().doDelete(); + + for (int i = 0; i < mBlockCount; i++) { + mBlocks[i].doDelete(); + } +} + +void daEnSnakeBlock_c::setStopState() { + static sStateID_c *l_StopStates[4] = { + &StateID_Stop, &StateID_Collapse1, &StateID_Collapse2, &StateID_Collapse3 + }; + + mpStopState = l_StopStates[ACTOR_PARAM(StopMode)]; +} + +void daEnSnakeBlock_c::calcBgCtr() { + getHeadBlock().calcBgCtr(); + getTailBlock().calcBgCtr(); + + getTailBlock().mBgCtr.mFlags |= 1; + + for (int i = 0; i < mBlockCount; i++) { + mBlocks[i].calcBgCtr(); + } +} + +void daEnSnakeBlock_c::initTravelInfo() { + 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; + + s16 dx; + s16 dy; + s16 dx_abs; + s16 dy_abs; + + ulong dist = 0; + + int startIdx = ACTOR_PARAM(RailStartIdx); + u16 railCount = rail->mCount; + + 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)); + dy = abs((next->mY >> 4) - (curr->mY >> 4)); + + dist += dx + dy; + } + + mTravelInfoIdx = dist; + mpTravelInfo = new s8[dist + 2]; + + ulong currIdx = 1; + for (int i = startIdx; i < rail->mCount - 1; i++) { + 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); + + TravelDir_e xDir = TRAVEL_DIR_NONE; + TravelDir_e yDir = TRAVEL_DIR_NONE; + + if (dx > 0) { + xDir = TRAVEL_DIR_RIGHT; + } else if (dx < 0) { + xDir = TRAVEL_DIR_LEFT; + } + + if (dy < 0) { + yDir = TRAVEL_DIR_UP; + } else if (dy > 0) { + yDir = TRAVEL_DIR_DOWN; + } + + ulong count = 0; + ulong idx; + if (dx_abs <= dy_abs) { + for (int j = 0; j < dx_abs; j++) { + idx = currIdx + count; + mpTravelInfo[idx] = xDir; + mpTravelInfo[idx + 1] = yDir; + count += 2; + } + for (int j = 0; j < dy_abs - dx_abs; j++) { + idx = currIdx + count; + mpTravelInfo[idx] = yDir; + count++; + } + } else { + for (int j = 0; j < dy_abs; j++) { + idx = currIdx + count; + mpTravelInfo[idx] = xDir; + mpTravelInfo[idx + 1] = yDir; + count += 2; + } + for (int j = 0; j < dx_abs - dy_abs; j++) { + idx = currIdx + count; + mpTravelInfo[idx] = xDir; + count++; + } + } + + currIdx += count; + } + + mpTravelInfo[0] = TRAVEL_DIR_NONE; + mpTravelInfo[dist + 1] = TRAVEL_DIR_NONE; +} + +void daEnSnakeBlock_c::setBlockPos() { + 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--; + } + + pos.x = getHeadBlock().getPos().x; + pos.y = getHeadBlock().getPos().y; + pos.z = 1500.0f; + mBlocks[0].setPos(pos); +} + +void daEnSnakeBlock_c::setActorPos() { + 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; +} + +bool daEnSnakeBlock_c::chkOffScreen() { + if (isState(StateID_Wait)) { + return false; + } + + return mPos.x >= dBgParameter_c::ms_Instance_p->xEnd() + 512.0f; +} + +void daEnSnakeBlock_c::initializeState_Wait() {} +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"); + + mBlocks[0].setAnmClr("create"); + 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(SnakeSpeed)]; + + mCreateAnmBlockIdx = 0; + mCreateAnmBlockNum = getHeadBlock().mAnmClr.getFrameMax(0) / snakeSpeed; +} +void daEnSnakeBlock_c::finalizeState_Move() {} +void daEnSnakeBlock_c::executeState_Move() { + dBlock_c *curr; + bool moveDoneHead = getHeadBlock().moveBlock(mpTravelInfo); + bool moveDoneTail = getTailBlock().moveBlock(mpTravelInfo); + bool allMoveDoneHead = false; + bool allMoveDoneTail = false; + + if (moveDoneHead || moveDoneTail) { + allMoveDoneHead = getHeadBlock().nextTravelMove(mpTravelInfo); + allMoveDoneTail = getTailBlock().nextTravelMove(mpTravelInfo); + + dAudio::SoundEffectID_t(scSnakeSoundID).playMapSound(mPos, 0); + + setBlockPos(); + mCreateAnmBlockIdx++; + if (mCreateAnmBlockIdx > mCreateAnmBlockNum) { + mCreateAnmBlockIdx = mCreateAnmBlockNum; + } + + curr = mBlocks; + int frame; + int snakeSpeed = 16.0f / sc_SnakeSpeeds[ACTOR_PARAM(SnakeSpeed)]; + int i = 0; + frame = 0; + + for (; i < mCreateAnmBlockIdx; i++) { + curr->setAnmClr("create"); + curr->mAnmClr.setFrame(frame, 0); + curr++; + frame += snakeSpeed; + } + } + + if (allMoveDoneHead || allMoveDoneTail) { + if (mpStopState->isEqual(StateID_Stop)) { + changeState(StateID_Stop); + } else { + changeState(StateID_Shake); + } + } +} + +void daEnSnakeBlock_c::initializeState_Shake() { + getHeadBlock().setAnmClr("ridden"); + getHeadBlock().mAnmClr.setRate(0.0f, 0); + getTailBlock().setAnmClr("ridden"); + getTailBlock().mAnmClr.setRate(0.0f, 0); + + for (int i = 0; i < mBlockCount; i++) { + dBlock_c &curr = mBlocks[i]; + curr.setAnmClr("ridden"); + curr.mAnmClr.setRate(0.0f, 0); + } + + mShakeTimer = 60; +} +void daEnSnakeBlock_c::finalizeState_Shake() {} +void daEnSnakeBlock_c::executeState_Shake() { + if (--mShakeTimer == 0) { + changeState(*mpStopState); + } +} + +void daEnSnakeBlock_c::initializeState_Stop() { + getHeadBlock().setAnmClr("ridden"); + getHeadBlock().mAnmClr.setRate(0.0f, 0); + getTailBlock().setAnmClr("ridden"); + getTailBlock().mAnmClr.setRate(0.0f, 0); + + for (int i = 0; i < mBlockCount; i++) { + dBlock_c &curr = mBlocks[i]; + curr.setAnmClr("ridden"); + curr.mAnmClr.setRate(0.0f, 0); + } +} +void daEnSnakeBlock_c::finalizeState_Stop() {} +void daEnSnakeBlock_c::executeState_Stop() {} + +void daEnSnakeBlock_c::initializeState_Collapse1() { + 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), + mVec2_c(0.0f, 0.0f), + mVec2_c(0.0f, 0.0f) + }; + + getHeadBlock().mLastPos = getHeadBlock().mPos; + getTailBlock().mLastPos = getTailBlock().mPos; + 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 < mBlockCount; i++) { // [fake match] + curr = &mBlocks[i]; + curr->mTravelInfoIdx = prevIdx; + prevIdx--; + } + getTailBlock().mTravelInfoIdx = prevIdx; + + 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 < mBlockCount; i++) { // [fake match] + dBlock_c &curr = mBlocks[i]; + 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); + for (int i = 0; i < mBlockCount; i++) { + mBlocks[i].calcCollapse1(mpTravelInfo); + } + + if (chkCollapseDelete()) { + deleteActor(1); + } +} + +void daEnSnakeBlock_c::initializeState_Collapse2() { + 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 < mBlockCount; i++) { + dBlock_c &curr = mBlocks[i]; + curr.mSpeed.set(0.0f, 0.0f, 0.0f); + } +} +void daEnSnakeBlock_c::finalizeState_Collapse2() {} +void daEnSnakeBlock_c::executeState_Collapse2() { + getHeadBlock().releaseBgCtr(); + getHeadBlock().setFallCollapse(); + getHeadBlock().updatePos(); + + if (mCollapseTimer > mBlockCount * 8) { + getTailBlock().releaseBgCtr(); + getTailBlock().setFallCollapse(); + getTailBlock().updatePos(); + } + + int collapseUpTo = mCollapseTimer >> 3; + if (collapseUpTo > mBlockCount - 1) { + collapseUpTo = mBlockCount - 1; + } + + for (int i = 0; i < collapseUpTo + 1; i++) { + dBlock_c &curr = mBlocks[i]; + curr.mBgCtr.release(); + curr.releaseBgCtr(); + curr.setFallCollapse(); + curr.updatePos(); + } + + mCollapseTimer++; + if (chkCollapseDelete()) { + deleteActor(1); + } +} + +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 < mBlockCount; i++) { + dBlock_c &curr = mBlocks[i]; + curr.mSpeed.set(0.0f, 0.0f, 0.0f); + } +} +void daEnSnakeBlock_c::finalizeState_Collapse3() {} +void daEnSnakeBlock_c::executeState_Collapse3() { + getHeadBlock().releaseBgCtr(); + getHeadBlock().setFallCollapse(); + getHeadBlock().mPos += getHeadBlock().mSpeed; + + getTailBlock().releaseBgCtr(); + getTailBlock().setFallCollapse(); + getTailBlock().mPos += getTailBlock().mSpeed; + + for (int i = 0; i < mBlockCount; i++) { + dBlock_c &curr = mBlocks[i]; + curr.releaseBgCtr(); + curr.setFallCollapse(); + curr.mPos += curr.mSpeed; + } + + if (chkCollapseDelete()) { + deleteActor(1); + } +} + +const int daEnSnakeBlock_c::scSnakeSoundID = SE_OBJ_SNAKE_BLOCK; 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; } diff --git a/syms.txt b/syms.txt index 69365d8c..988797a9 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_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 __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