Files

93 lines
2.1 KiB
C++

#include "Game/MapObj/LargeChain.hpp"
namespace {
static f32 sPartsLength = 200.0f;
};
LargeChain::LargeChain(const char *pName) : LiveActor(pName) {
_8C = nullptr;
_90 = nullptr;
mChainArray = nullptr;
mChainCount = 1;
}
void LargeChain::init(const JMapInfoIter &rIter) {
MR::initDefaultPos(this, rIter);
s32 chainLen;
MR::getJMapInfoArg0NoInit(rIter, &chainLen);
mChainCount = chainLen / sPartsLength;
createChainParts();
MR::connectToSceneMapObjMovement(this);
if (MR::tryRegisterDemoCast(this, rIter)) {
MR::registerDemoActionNerve(this, &NrvLargeChain::LargeChainNrvBreak::sInstance, nullptr);
}
MR::useStageSwitchSleep(this, rIter);
initNerve(&NrvLargeChain::LargeChainNrvWait::sInstance);
makeActorAppeared();
}
void LargeChain::makeActorAppeared() {
for (s32 i = 0; i < (u32)mChainCount; i++) {
mChainArray[i].makeActorAppeared();
}
_8C->makeActorAppeared();
_90->makeActorAppeared();
LiveActor::makeActorAppeared();
}
void LargeChain::makeActorDead() {
for (s32 i = 0; i < (u32)mChainCount; i++) {
mChainArray[i].makeActorDead();
}
_8C->makeActorDead();
_90->makeActorDead();
LiveActor::makeActorDead();
}
void LargeChain::exeBreak() {
if (MR::isFirstStep(this)) {
MR::invalidateClipping(this);
invalidateClippingAllChainParts();
}
if (!(getNerveStep() % 5)) {
s32 step = getNerveStep() / 5;
if (step == 0) {
_8C->breakChainParts();
}
else {
if (step == mChainCount - 1) {
_90->breakChainParts();
}
}
mChainArray[step].breakChainParts();
if (step == mChainCount - 1) {
kill();
}
}
}
LargeChainParts::~LargeChainParts() {
}
void LargeChain::invalidateClippingAllChainParts() {
for (s32 i = 0; i < (u32)mChainCount; i++) {
MR::invalidateClipping(&mChainArray[i]);
}
}
LargeChain::~LargeChain() {
}
namespace NrvLargeChain {
INIT_NERVE(LargeChainNrvWait);
INIT_NERVE(LargeChainNrvBreak);
};