#include "Game/MapObj/BlackHole.hpp" #include "Game/LiveActor/ModelObj.hpp" #include "Game/Util.hpp" // BlackHole::BlackHole void BlackHole::init(const JMapInfoIter &rIter) { initMapToolInfo(rIter); initModel(); MR::connectToSceneMapObj(this); initHitSensor(1); MR::addHitSensorEye(this, "body", 0x10, _A0, TVec3f(0.0f, 0.0f, 0.0f)); initEffectKeeper(0, 0, false); MR::setEffectHostMtx(this, "BlackHoleSuction", (MtxPtr)&_D8); f32 radius = _A0; f32 val = 500.0f * _9C; if (radius >= val) { radius = radius; } else { radius = val; } f32 clippingRadius = 500.0f * radius; MR::setClippingTypeSphere(this, clippingRadius); MR::setClippingTypeSphere(mBlackHoleModel, clippingRadius); MR::setClippingFarMax(this); MR::setClippingFarMax(mBlackHoleModel); initSound(4, false); if (MR::tryRegisterDemoCast(this, rIter)) { MR::registerDemoActionNerve(this, &NrvBlackHole::BlackHoleNrvDisappear::sInstance, 0); } bool isCreated = MR::createActorCameraInfoIfExist(rIter, &mCameraInfo); if (isCreated) { MR::initActorCamera(this, rIter, &mCameraInfo); } initNerve(&NrvBlackHole::BlackHoleNrvWait::sInstance); bool uses = MR::useStageSwitchReadAppear(this, rIter); if (uses) { MR::syncStageSwitchAppear(this); makeActorDead(); } else { makeActorAppeared(); } } void BlackHole::makeActorAppeared() { bool isOnSwitch = false; if (MR::isValidSwitchA(this) && MR::isOnSwitchA(this)) { isOnSwitch = true; } if (isOnSwitch) { LiveActor::makeActorAppeared(); mBlackHoleModel->makeActorAppeared(); } } void BlackHole::kill() { LiveActor::kill(); mBlackHoleModel->kill(); } bool BlackHole::tryStartDemoCamera() { if (mCameraInfo) { MR::startActorCameraTargetSelf(this, mCameraInfo, -1); return true; } return false; } void BlackHole::attackSensor(HitSensor *a1, HitSensor *a2) { if (isNerve(&NrvBlackHole::BlackHoleNrvWait::sInstance)) { if (!_A4 || isInCubeBox(a2->mPosition)) { if (MR::sendArbitraryMsg(0x73, a2, a1)) { if (MR::isSensorPlayer(a2)) { setNerve(&NrvBlackHole::BlackHoleNrvDemo::sInstance); } } } } } #ifdef NON_MATCHING // shrug void BlackHole::initMapToolInfo(const JMapInfoIter &rIter) { MR::initDefaultPos(this, rIter); MR::useStageSwitchReadA(this, rIter); MR::useStageSwitchReadAppear(this, rIter); if (MR::isEqualObjectName(rIter, "BlackHoleCube")) { initCubeBox(); setName("ブラックホール[キューブ指定]"); } if (_A4 == 0) { _A0 = 500.0f * mScale.z; } else { TVec3f stack_C; stack_C.setInlineXYPS(mScale); _A0 = PSVECMag(stack_C.toCVec()); } f32 arg0; bool ret = MR::getJMapInfoArg0NoInit(rIter, &arg0); if (ret) { _9C = arg0 / 1000.0f; } else if (_A4) { _9C = 1.0f; } else { _9C = mScale.x; } } #endif void BlackHole::initModel() { initModelManagerWithAnm("BlackHoleRange", 0, false); mBlackHoleModel = MR::createModelObjMapObj("コアモデル", "BlackHole", getBaseMtx()); mBlackHoleModel->makeActorDead(); updateModelScale(_9C, _9C); } #ifdef NON_MATCHING void BlackHole::initCubeBox() { MR::makeMtxRotate((MtxPtr)&_A8, mRotation.x, mRotation.y, mRotation.z); _A8.mMtx[0][3] = mPosition.x; _A8.mMtx[1][3] = mPosition.y; _A8.mMtx[2][3] = mPosition.z; _A4 = new TBox3f(); TVec3f stack_8(0.5f * (1000.0f * -mScale.x), 0.5f * (1000.0f * -mScale.y), 0.5f * (1000.0f * -mScale.z)); TVec3f stack_14(0.5f * (1000.0f * mScale.x), 0.5f * (1000.0f, mScale.z), 0.5f * (1000.0f * mScale.y)); _A4->mMin.set(stack_8); _A4->mMax.set(stack_14); } #endif bool BlackHole::isInCubeBox(const TVec3f &rVec) const { TVec3f stack_8; _A8.multTranspose(rVec, stack_8); bool ret = false; TBox3f* box = _A4; if (stack_8.x >= box->mMin.x && stack_8.y >= box->mMin.y && stack_8.z >= box->mMin.z && stack_8.x < box->mMax.x && stack_8.y < box->mMax.y && stack_8.z < box->mMax.z) { ret = true; } return ret; } void BlackHole::updateModelScale(f32 a1, f32 a2) { mScale.setAll(a1); mBlackHoleModel->mScale.setAll(0.5f * a2); } void BlackHole::exeWait() { if (MR::isFirstStep(this)) { MR::startBck(this, "BlackHoleRange", 0); MR::startBtk(this, "BlackHoleRange"); MR::startBtk(mBlackHoleModel, "BlackHole"); } MR::startLevelSound(this, "SE_OJ_LV_BLACK_HOLE", -1, -1, -1); bool isOnSwitch = false; if (MR::isValidSwitchA(this) && MR::isOnSwitchA(this)) { isOnSwitch = true; } if (isOnSwitch) { kill(); } } void BlackHole::exeDisappear() { if (MR::isFirstStep(this)) { MR::startSound(this, "SE_OJ_BLACK_HOLE_DISAPPEAR", -1, -1); } f32 nerveEaseIn = MR::calcNerveEaseInValue(this, 0x5A, _9C, 0.0f); f32 blackHoleEase = MR::calcNerveEaseInValue(this, 0x1E, 0x5A, _9C, 0.0f); mScale.setAll(nerveEaseIn); mBlackHoleModel->mScale.setAll(0.5f * blackHoleEase); if (MR::isStep(this, 0x5A)) { kill(); } } BlackHole::~BlackHole() { } namespace NrvBlackHole { BlackHoleNrvWait BlackHoleNrvWait::sInstance; BlackHoleNrvDemo BlackHoleNrvDemo::sInstance; BlackHoleNrvDisappear BlackHoleNrvDisappear::sInstance; void BlackHoleNrvDisappear::execute(Spine *pSpine) const { BlackHole* blackHole = reinterpret_cast(pSpine->mExecutor); blackHole->exeDisappear(); } void BlackHoleNrvDemo::execute(Spine *pSpine) const { BlackHole* blackHole = reinterpret_cast(pSpine->mExecutor); MR::startLevelSound(blackHole, "SE_OJ_LV_BLACK_HOLE", -1, -1, -1); } void BlackHoleNrvWait::execute(Spine *pSpine) const { BlackHole* blackHole = reinterpret_cast(pSpine->mExecutor); blackHole->exeWait(); } };