mirror of
https://github.com/encounter/Petari.git
synced 2026-03-30 11:34:15 -07:00
220 lines
6.0 KiB
C++
220 lines
6.0 KiB
C++
#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<f32>(a1);
|
|
mBlackHoleModel->mScale.setAll<f32>(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<f32>(nerveEaseIn);
|
|
mBlackHoleModel->mScale.setAll<f32>(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<BlackHole*>(pSpine->mExecutor);
|
|
blackHole->exeDisappear();
|
|
}
|
|
|
|
void BlackHoleNrvDemo::execute(Spine *pSpine) const {
|
|
BlackHole* blackHole = reinterpret_cast<BlackHole*>(pSpine->mExecutor);
|
|
MR::startLevelSound(blackHole, "SE_OJ_LV_BLACK_HOLE", -1, -1, -1);
|
|
}
|
|
|
|
void BlackHoleNrvWait::execute(Spine *pSpine) const {
|
|
BlackHole* blackHole = reinterpret_cast<BlackHole*>(pSpine->mExecutor);
|
|
blackHole->exeWait();
|
|
}
|
|
|
|
}; |