Files
Petari/source/Game/Enemy/IceMerameraKing.cpp
2024-09-20 12:32:08 +02:00

1047 lines
34 KiB
C++

#include "Game/Enemy/IceMerameraKing.hpp"
#include "Game/Enemy/Meramera.hpp"
#include <JSystem/JMath.hpp>
#include "math_types.hpp"
namespace {
static const char* hScaleJointName[3] = {
"WideInSide",
"WideOutSide",
"Hirgh1"
};
static const f32 hOnAirParam[4] = {
0.0f,
3.0f,
0.95999998f,
0.0f
};
static const f32 hOnGroundParam[4] = {
0.0f,
1.0f,
0.80000001f,
0.0f
};
static const f32 hFlyParam[4] = {
0.0f,
0.5f,
0.89999998f,
1.0f
};
static const f32 hAngryDemoParam[4] = {
0.0f,
0.5f,
0.89999998f,
1.5f
};
static const f32 hEscapeOnGroundParam[4] = {
-0.69999999f,
1.0f,
0.95999998f,
180.0f
};
static const f32 hEscapeOnAirParam[4] = {
0.0f,
3.0f,
0.95999998f,
0.0f
};
static const f32 hPreRecoverJumpParam[4] = {
0.0f,
1.0f,
0.95999998f,
0.0f
};
static const f32 hDamageJumpParam[4] = {
0.0f,
1.9f,
0.98000002f,
0.0f
};
static const f32 hAttackParam[4] = {
0.0f,
6.0f,
0.98000002f,
0.0f
};
static f32 hExtinguishOnAirParam[4] = {
0.0f,
0.125f,
0.95999998f,
0.0f
};
static f32 hExtinguishFallOnAirParam[4] = {
0.0f,
4.0f,
0.95999998f,
0.0f
};
};
IceMerameraKing::IceMerameraKing(const char *pName) : LiveActor(pName), mFixedPos(nullptr), _90(nullptr),
_94(nullptr), mActor(nullptr), _A0(0), _A4(0), _A8(nullptr), _AC(nullptr), _B0(0, 0, 1), _BC(0, 1, 0),
_C8(0, 0, 0), _D4(0, 0, 0), _E0(0), _E4(0), _EC(3), _F0(0), mModelArray(), _100(0, 0, 0, 1) {
_120 = false;
_110.x = 0.0f;
_110.y = 0.0f;
_110.z = 0.0f;
_11C = 0.0f;
_121 = false;
}
void IceMerameraKing::init(const JMapInfoIter &rIter) {
if (MR::isValidInfo(rIter)) {
MR::initDefaultPos(this, rIter);
_C8.set(mPosition);
_D4.set(mRotation);
MR::useStageSwitchWriteDead(this, rIter);
MR::useStageSwitchReadA(this, rIter);
}
mScale.x = 1.5f;
mScale.y = 1.5f;
mScale.z = 1.5f;
initModelManagerWithAnm("IceMerameraKing", nullptr, false);
MR::calcUpVec(&_BC, this);
MR::calcFrontVec(&_B0, this);
MR::connectToSceneEnemy(this);
f32 v5 = (mScale.y / 1.8f);
initBinder((130.0f * v5), (130.0f * v5), 0);
MR::setBinderOffsetVec(this, &_110, true);
initHitSensor(1);
MR::addHitSensorAtJointEnemy(this, "body", "JointRoot", 32, (130.0f * v5), TVec3f(0.0f, 0.0f, 0.0f));
initEffectKeeper(0, nullptr, false);
initSound(4, false);
initNerve(&NrvIceMerameraKing::HostTypeNrvSearch::sInstance);
MR::calcGravity(this);
MR::initShadowVolumeSphere(this, (130.0f * mScale.y));
MR::setShadowDropLength(this, nullptr, 1500.0f);
MR::declarePowerStar(this);
MR::declareStarPiece(this, 24);
mFixedPos = new FixedPosition(this, "Top", TVec3f(0, 0, 0), TVec3f(0.0f, 0.0f, 0.0f));
MR::tryRegisterDemoCast(this, rIter);
mActor = new ThrowingIce*[0x6]; //
s32 i = 0;
_A0 = 6;
while (i < 6) {
mActor[i] = new ThrowingIce("投擲用の氷");
mActor[i]->initWithoutIter();
_A4 += 1;
MR::tryRegisterDemoCast(mActor[i], rIter);
i++;
}
MR::initLightCtrl(this);
_A8 = new IceMerameraKingShockWave();
_A8->initWithoutIter();
_A8->mRotation.set(mRotation);
_A8->makeActorDead();
_AC = new ModelObj("壊れモデル", "IceMerameraKingBreak", nullptr, -2, -2, -2, false);
_AC->initWithoutIter();
_AC->mScale.set(mScale);
_AC->makeActorDead();
s32 childNum = MR::getChildObjNum(rIter);
_F0 = childNum;
mModelArray.mArray.mArr = new ThrowingIce*[childNum];
for (s32 i = 0; i < _F0; i++) {
mModelArray.mArray.mArr[i] = new ThrowingIce("メラメラ"); //wrong
MR::initChildObj(mModelArray.mArray.mArr[i], rIter, i);
mModelArray.mArray.mArr[i]->appear();
MR::tryRegisterDemoCast(mModelArray.mArray.mArr[i], rIter);
}
MR::tryRegisterDemoCast(_AC, rIter);
MR::registerDemoActionNerve(this, &NrvIceMerameraKing::HostTypeNrvBeginDemo::sInstance, nullptr);
mSpinParticle = new SpinPullParticleCallBack();
mJointController = MR::createJointDelegatorWithNullChildFunc(this, &IceMerameraKing::calcJoint, "JointRoot");
makeActorAppeared();
MR::emitEffect(this, "BodyIce");
_F8 = new CameraTargetDemoActor(getBaseMtx(), "アクター注目");
_F8->initWithoutIter();
_F8->mPosition.set(_C8);
_F8->mRotation.set(_D4);
_F8->setName("メラキン注目ターゲット");
MR::tryRegisterDemoCast(_F8, rIter);
//major
}
void IceMerameraKing::initAfterPlacement() {
MR::trySetMoveLimitCollision(this);
for (s32 i = 0; i < _F0; i++) {
bool cChar;
bool cc = mBinder->_1EC._0;
mModelArray.mArray.mArr[i]->makeActorAppeared();
mModelArray.mCount = mBinder->_24;
//mModelArray.mArray.init();
if (mBinder->_24) {
cChar = cc & 0xDF;
}
else {
cChar = cc | 0x20;
}
cc = cChar;
}
//major
}
void IceMerameraKing::kill() {
LiveActor::kill();
if (MR::isValidSwitchDead(this)) {
MR::onSwitchDead(this);
}
MR::startAfterBossBGM();
s32 temp = _A4;
for (s32 i = 0; i < temp; i++) {
if (!MR::isDead(mActor[i])) {
mActor[i]->kill();
}
}
}
void IceMerameraKing::control() {
TVec3f v7;
MR::copyJointScale(this, "Center", &v7);
f32 v3 = 130.0f * v7.x;
MR::setBinderRadius(this, v3);
_110.y = v3;
_110.x = 0.0f;
_110.z = 0.0f;
getSensor("body")->mRadius = v3;
MR::setShadowVolumeSphereRadius(this, nullptr, v3);
if (MR::isValidSwitchA(this)) {
if (MR::isOnSwitchA(this)) {
MR::invalidateClipping(this);
}
else {
MR::validateClipping(this);
}
}
if (!isNerve(&NrvIceMerameraKing::HostTypeNrvEscape::sInstance) && !isNerve(&NrvIceMerameraKing::HostTypeNrvEscapeJump::sInstance)) {
TQuat4f quad(0, 0, 0, 1);
_100.slerp(quad, 0.25f);
}
if (!isNerve(&NrvIceMerameraKing::HostTypeNrvEscape::sInstance) && !isNerve(&NrvIceMerameraKing::HostTypeNrvEscapeJump::sInstance)) {
MR::startLevelSound(this, "SE_BM_LV_ICEMERAKING_WAIT", -1, -1, -1);
}
if (MR::isDemoActive("メラキンオープニング")) {
MR::startSystemLevelSE("SE_DM_LV_MUTE_BGM", -1, -1);
if (MR::isDemoPartLastStep("カメラ寄る")) {
MR::playLevelMarioPinchBGM(_120);
_120 = true;
_121 = true;
}
}
else if (!isNerve(&NrvIceMerameraKing::HostTypeNrvDeathDemoWait::sInstance) && !isNerve(&NrvIceMerameraKing::HostTypeNrvDeathDemo::sInstance) && MR::isNearPlayer(this, 5000.0f) && _121) {
MR::playLevelMarioPinchBGM(_120);
_120 = true;
}
}
void IceMerameraKing::exeSearch() {
if (MR::isFirstStep(this)) {
MR::startAction(this, "Wait");
}
addVelocityToInitPos();
MR::moveAndTurnToPlayer(this, &_B0, hFlyParam[0], hFlyParam[1], hFlyParam[2], hFlyParam[3]);
MR::addVelocityKeepHeightUseShadow(this, 400.0f, 1.5f, 300.0f, nullptr);
f32 shadow = MR::calcDistanceToPlayer(this);
if (!(4500.0f < shadow)) {
if (shadow < 1000.0f) {
setNerve(&NrvIceMerameraKing::HostTypeNrvPreAttack::sInstance);
}
else {
if (isEnableThrow()) {
if (!(_EC > 2)) {
if (MR::isGreaterStep(this, 200) && isDeadAllIce()) {
_E0 = 0;
setNerve(&NrvIceMerameraKing::HostTypeNrvThrow2nd::sInstance);
}
}
else if (MR::isGreaterStep(this, 100) && isDeadAllIce()) {
_E0 = 0;
setNerve(&NrvIceMerameraKing::HostTypeNrvThrow::sInstance);
}
}
}
}
}
void IceMerameraKing::exeThrow() {
if (MR::isFirstStep(this)) {
MR::startAction(this, "AttackThrow");
if (isNerve(&NrvIceMerameraKing::HostTypeNrvBeginDemo::sInstance)) {
MR::calcFrontVec(&_B0, _F8);
}
}
MR::moveAndTurnToPlayer(this, &_B0, hFlyParam[0], hFlyParam[1], hFlyParam[2], hFlyParam[3]);
MR::addVelocityKeepHeightUseShadow(this, 400.0f, 1.5f, 300.0f, nullptr);
addVelocityToInitPos();
if (MR::isStep(this, 22)) {
_90 = getDeadWeaponAndAppear();
mFixedPos->_1C.getTrans(_90->mPosition);
if (!_90) {
setNerve(&NrvIceMerameraKing::HostTypeNrvSearch::sInstance);
return;
}
_E0++;
TVec3f v11(*MR::getPlayerVelocity());
v11.scale(35.0f);
TVec3f v12(*MR::getPlayerCenterPos());
v12.add(v11);
_90->emitIce(mPosition, v12, -5.0f, mGravity);
_90 = nullptr;
MR::startSound(this, "SE_BM_ICEMERAKING_THROW", -1, -1);
}
if (MR::isActionEnd(this)) {
if (MR::calcDistanceToPlayer(this) > 1000.0f) {
setNerve(&NrvIceMerameraKing::HostTypeNrvPreAttack::sInstance);
}
else {
s32 v10 = 3;
if (isNerve(&NrvIceMerameraKing::HostTypeNrvThrow2nd::sInstance)) {
v10 = 6;
}
if (v10 > _E0 || isEnableThrow()) {
setNerve(&NrvIceMerameraKing::HostTypeNrvSearch::sInstance);
}
else {
if (isNerve(&NrvIceMerameraKing::HostTypeNrvThrow2nd::sInstance)) {
setNerve(&NrvIceMerameraKing::HostTypeNrvThrow2nd::sInstance);
}
else {
setNerve(&NrvIceMerameraKing::HostTypeNrvThrow::sInstance);
}
}
}
}
//minor
}
void IceMerameraKing::tearDownThrow() {
if (_90) {
_90->kill();
_90 = nullptr;
}
if (_94) {
_94->kill();
_94 = nullptr;
}
}
void IceMerameraKing::exeExtinguish() {
hOnAirParam;
if (MR::isFirstStep(this)) {
MR::startAction(this, "GoOut");
MR::startSound(this, "SE_BM_ICEMERAKING_BLOW", -1, -1);
MR::startSound(this, "SE_BM_ICEMERAKING_SMOKE", -1, -1);
MR::deleteEffect(this, "BodyIce");
MR::emitEffectWithParticleCallBack(this, "BodyIceOff", mSpinParticle);
TVec3f v3 = *MR::getPlayerCenterPos();
TVec3f v4(mPosition);
v4.subtract(v3);
MR::vecKillElement(v4, mGravity, &v4);
MR::normalizeOrZero(&v4);
MR::addVelocitySeparateHV(this, v4, 20.0f, 0.0f);
_11C = 200.0f + MR::getShadowNearProjectionLength(this);
}
if (MR::isLessStep(this, 40)) {
MR::addVelocityKeepHeightUseShadow(this, _11C, 1.3f, 700.0f, nullptr);
MR::moveAndTurnToPlayer(this, &_B0, hExtinguishOnAirParam[0], hExtinguishOnAirParam[1], hExtinguishOnAirParam[2], hExtinguishOnAirParam[3]);
}
else if (MR::isOnGround(this) && MR::isActionEnd(this)) {
MR::moveAndTurnToPlayer(this, &_B0, hOnGroundParam[0], hOnGroundParam[1], hOnGroundParam[2], hOnGroundParam[3]);
MR::startSound(this, "SE_BM_ICEMERAKING_LAND", -1, -1);
_E8 = 0;
setNerve(&NrvIceMerameraKing::HostTypeNrvEscape::sInstance);
}
else {
MR::moveAndTurnToPlayer(this, &_B0, hExtinguishFallOnAirParam[0], hExtinguishFallOnAirParam[1], hExtinguishFallOnAirParam[2], hExtinguishFallOnAirParam[3]);
}
//minor. problems on the params
}
void IceMerameraKing::exeEscape() {
MR::isFirstStep(this);
s32 v3 = _E8 + 1;
_E8 = v3;
if (v3 > 0x258u && MR::isOnGround(this)) {
_E8 = 0;
setNerve(&NrvIceMerameraKing::HostTypeNrvPreRecover::sInstance);
}
else {
MR::emitEffect(this, "Rolling");
if (MR::isOnGround(this) ){
f32 v11 = MR::getLinerValueFromMinMax(PSVECMag(mVelocity.toCVec()), 2.0f, 6.0f, 0.0f, 100.0f);
MR::startLevelSound(this, "SE_BM_LV_ICEMERAKING_ROLL", v11, -1, 15);
}
if (MR::isOnGround(this)) {
f32 radius = getSensor("body")->mRadius;
MR::rotateQuatRollBall(&_100, mVelocity, *MR::getGroundNormal(this), (0.5f * radius));
MR::moveAndTurnToPlayer(this, &_B0, hEscapeOnGroundParam[0], hEscapeOnGroundParam[1], hEscapeOnGroundParam[2], hEscapeOnGroundParam[3]);
if (MR::isBindedWallFront(this, -_B0, 0.25f)) {
setNerve(&NrvIceMerameraKing::HostTypeNrvEscapeJump::sInstance);
}
}
else {
f32 sensor = getSensor("body")->mRadius;
MR::rotateQuatRollBall(&_100, mVelocity, -mGravity, 0.5f * sensor);
MR::moveAndTurnToPlayer(this, &_B0, hEscapeOnAirParam[0], hEscapeOnAirParam[1], hEscapeOnAirParam[2], hEscapeOnAirParam[3]);
}
}
}
void IceMerameraKing::exeEscapeJump() {
if (MR::isStep(this, 20)) {
MR::addVelocitySeparateHV(this, _B0, 20.0f, 90.0f);
MR::startSound(this, "SE_BM_ICEMERAKING_JUMP", -1, -1);
}
_E8++;
if (MR::isOnGround(this)) {
f32 radius = getSensor("body")->mRadius;
MR::rotateQuatRollBall(&_100, mVelocity, *MR::getGroundNormal(this), (0.5f * radius));
MR::moveAndTurnToPlayer(this, &_B0, hEscapeOnGroundParam[0], hEscapeOnGroundParam[1], hEscapeOnGroundParam[2], hEscapeOnGroundParam[3]);
if (MR::isGreaterStep(this, 20)) {
MR::emitEffect(this, "Land");
MR::startSound(this, "SE_BM_ICEMERAKING_LAND", -1, -1);
setNerve(&NrvIceMerameraKing::HostTypeNrvEscape::sInstance);
}
}
else {
f32 radius = getSensor("body")->mRadius;
MR::rotateQuatRollBall(&_100, mVelocity, -mGravity, (0.5f * radius));
MR::moveAndTurnToPlayer(this, &_B0, hEscapeOnAirParam[0], hEscapeOnAirParam[1], hEscapeOnAirParam[2], hEscapeOnAirParam[3]);
}
}
void IceMerameraKing::exeDamage() {
if (MR::isFirstStep(this)) {
MR::startAction(this, "Damage");
MR::emitEffect(this, "Damage");
MR::startBlowHitSound(this);
MR::startSound(this, "SE_BM_ICEMERAKING_DAMAGE", -1, -1),
MR::setVelocityJump(this, 80.0f);
MR::stopSceneForDefaultHit(4);
}
if (MR::isGreaterStep(this, 20)) {
MR::addVelocityKeepHeightUseShadow(this, 900.0f, 3.0f, 300.0f, nullptr);
}
if (MR::isOnGround(this)) {
MR::moveAndTurnToPlayer(this, &_B0, hOnGroundParam[0], hOnGroundParam[1], hOnGroundParam[2], hOnGroundParam[3]);
}
else {
MR::moveAndTurnToPlayer(this, &_B0, hDamageJumpParam[0], hDamageJumpParam[1], hDamageJumpParam[2], hDamageJumpParam[3]);
}
if (MR::isGreaterStep(this, 60)) {
if (_EC == 1) {
if (MR::tryStartDemoRegisteredMarioPuppetable(this, "怒りデモ")) {
setNerve(&NrvIceMerameraKing::HostTypeNrvAngryDemo2nd::sInstance);
}
}
else if (MR::tryStartDemoRegisteredMarioPuppetable(this, "怒りデモ")) {
setNerve(&NrvIceMerameraKing::HostTypeNrvAngryDemo1st::sInstance);
}
}
}
void IceMerameraKing::exePreRecover() {
if (MR::isFirstStep(this)) {
MR::setVelocityJump(this, 70.0f);
MR::startSound(this, "SE_BM_ICEMERAKING_JUMP", -1, -1);
}
addVelocityToInitPos();
if (MR::isLessStep(this, 50)) {
MR::moveAndTurnToPlayer(this, &_B0, hPreRecoverJumpParam[0], hPreRecoverJumpParam[1], hPreRecoverJumpParam[2], hPreRecoverJumpParam[3]);
}
else if (MR::isStep(this, 50)) {
MR::startAction(this, "PreRecover");
MR::setBinderRadius(this, 130.0f);
HitSensor* sensor = getSensor("body");
sensor->mRadius = 130.0f;
MR::setShadowVolumeSphereRadius(this, nullptr, 130.0f);
MR::moveAndTurnToPlayer(this, &_B0, hFlyParam[0], hFlyParam[1], hFlyParam[2], hFlyParam[3]);
}
else if (MR::isLessStep(this, 120)) {
MR::addVelocityKeepHeightUseShadow(this, 750.0f, 1.5f, 300.0f, nullptr);
MR::moveAndTurnToPlayer(this, &_B0, hFlyParam[0], hFlyParam[1], hFlyParam[2], hFlyParam[3]);
}
else {
setNerve(&NrvIceMerameraKing::HostTypeNrvRecover::sInstance);
}
}
void IceMerameraKing::exeRecover() {
if (MR::isFirstStep(this)) {
MR::startAction(this, "Recover");
MR::emitEffect(this, "BodyIce");
MR::startSound(this, "SE_BM_ICEMERAKING_PRE_RECOVER", -1, -1);
}
if (MR::isStep(this, 80)) {
MR::startSound(this, "SE_BM_ICEMERAKING_RECOVER", -1, -1);
}
addVelocityToInitPos();
MR::moveAndTurnToPlayer(this, &_B0, hFlyParam[0], hFlyParam[1], hFlyParam[2], hFlyParam[3]);
MR::addVelocityKeepHeightUseShadow(this, 750.0f, 1.5f, 300.0f, nullptr);
if (MR::isGreaterStep(this, 160)) {
setNerve(&NrvIceMerameraKing::HostTypeNrvSearch::sInstance);
}
}
void IceMerameraKing::exePreAttack() {
MR::isFirstStep(this);
if (MR::isLessStep(this, 120)) {
MR::addVelocityKeepHeightUseShadow(this, 800.0f, 1.5f, 300.0f, nullptr);
}
else if (MR::isDead(_A8)) {
setNerve(&NrvIceMerameraKing::HostTypeNrvAttack::sInstance);
return;
}
addVelocityToInitPos();
MR::moveAndTurnToPlayer(this, &_B0, hFlyParam[0], hFlyParam[1], hFlyParam[2], hFlyParam[3]);
}
void IceMerameraKing::exeAttack() {
if (MR::isFirstStep(this)) {
MR::startAction(this, "Attack");
MR::startSound(this, "SE_BM_ICEMERAKING_PRE_ATTACK", -1, -1);
}
if (!MR::isActionEnd(this)) {
MR::addVelocityKeepHeightUseShadow(this, 800.0f, 1.5f, 300.0f, nullptr);
MR::moveAndTurnToPlayer(this, &_B0, hFlyParam[0], hFlyParam[1], hFlyParam[2], hFlyParam[3]);
}
else {
MR::moveAndTurnToPlayer(this, &_B0, hAttackParam[0], hAttackParam[1], hAttackParam[2], hAttackParam[3]);
}
if (MR::isOnGround(this)) {
setNerve(&NrvIceMerameraKing::HostTypeNrvAttackAfter::sInstance);
}
}
void IceMerameraKing::exeAttackAfter() {
if (MR::isFirstStep(this)) {
_A8->appear();
_A8->mPosition.set(mPosition);
_A8->mPosition.set(_D4);
MR::emitEffect(this, "Land");
MR::startAction(this, "AttackEnd");
MR::startSound(this, "SE_BM_ICEMERAKING_HIP_DROP", -1, -1);
MR::tryRumblePadAndCameraDistanceStrong(this, 800.0f, 1200.0f, 2000.0f);
}
MR::moveAndTurnToPlayer(this, &_B0, hOnAirParam[0], hOnAirParam[1], hOnAirParam[2], hOnAirParam[3]);
if (MR::isGreaterStep(this, 90)) {
setNerve(&NrvIceMerameraKing::HostTypeNrvSearch::sInstance);
}
}
void IceMerameraKing::exeAngryDemo() {
if (MR::isFirstStep(this)) {
MR::emitEffect(this, "BodyIce");
if (isNerve(&NrvIceMerameraKing::HostTypeNrvAngryDemo2nd::sInstance)) {
MR::startAction(this, "Summon");
MR::startSound(this, "SE_BM_ICEMERAKING_PRE_ANGRY2", -1, -1);
}
else {
MR::startAction(this, "Recover");
MR::startSound(this, "SE_BM_ICEMERAKING_PRE_ANGRY1", -1, -1);
}
}
if (MR::isStep(this, 1)) {
MR::resetPosition(this, _C8);
}
MR::moveAndTurnToPlayer(this, &_B0, hAngryDemoParam[0], hAngryDemoParam[1], hAngryDemoParam[2], hAngryDemoParam[3]);
MR::addVelocityKeepHeightUseShadow(this, 400.0f, 1.5f, 300.0f, nullptr);
if (isNerve(&NrvIceMerameraKing::HostTypeNrvAngryDemo2nd::sInstance) && MR::isStep(this, 90)) {
for (s32 i = 0; i < _F0; i++) {
mModelArray.mArray.mArr[i]->makeActorAppeared();
}
}
if (isNerve(&NrvIceMerameraKing::HostTypeNrvAngryDemo2nd::sInstance) && MR::isStep(this, 85)) {
MR::startSound(this, "SE_BM_ICEMERAKING_ANGRY2", -1, -1);
}
else if (MR::isStep(this, 85)) {
MR::startSound(this, "SE_BM_ICEMERAKING_ANGRY1", -1, -1);
}
MR::playLevelMarioPinchBGM(true);
if (MR::isDemoPartLastStep("怒りデモ")) {
if (!(_EC > 2)) {
TVec3f v7(mGravity);
v7.scale(200.0f);
TVec3f v8(mPosition);
v8.subtract(v7);
MR::appearStarPiece(this, v8, 8, 15.0f, 70.0f, false);
}
else {
TVec3f v5(mGravity);
v5.scale(200.0f);
TVec3f v6(mPosition);
v6.subtract(v5);
MR::appearStarPiece(this, v6, 16, 15.0f, 70.0f, false);
}
MR::startSound(this, "SE_OJ_STAR_PIECE_BURST", -1, -1);
setNerve(&NrvIceMerameraKing::HostTypeNrvSearch::sInstance);
}
}
void IceMerameraKing::exeDeathDemo() {
if (MR::isFirstStep(this)) {
MR::startAction(this, "Death");
MR::startSound(this, "SE_BM_ICEMERAKING_DEAD", -1, -1);
_F8->mPosition.set(mPosition);
_AC->appear();
_AC->mRotation.set(_D4);
MR::resetPosition(_AC, mPosition);
MR::startAction(_AC, "Break");
MR::requestMovementOn(_AC);
for (s32 i = 0; i < _F0; i++) {
mModelArray.mArray.mArr[i]->kill();
}
MR::invalidateShadow(this, nullptr);
}
s32 frame = MR::getBckFrameMax(this);
if (MR::isOnGround(this)) {
mVelocity.zero();
}
else {
MR::moveAndTurnToPlayer(this, &_B0, hOnAirParam[0], hOnAirParam[1], hOnAirParam[2], hOnAirParam[3]);
}
if (!MR::isHiddenModel(this) && MR::isGreaterStep(this, frame - 37)) {
MR::hideModelAndOnCalcAnim(this);
}
if (!MR::isHiddenModel(_AC) && MR::isActionEnd(_AC)) {
MR::hideModel(_AC);
}
if (MR::isActionEnd(this) && MR::isHiddenModel(this) && MR::isHiddenModel(_AC)) {
MR::endDemo(this, "メラキンオープニング");
}
if (!MR::isDemoActive()) {
kill();
_AC->kill();
MR::requestAppearPowerStar(this, mPosition);
}
}
void IceMerameraKing::attackSensor(HitSensor *pSender, HitSensor *pReceiver) {
if (pSender == getSensor("body") && MR::isSensorPlayer(pReceiver)) {
if (isNerve(&NrvIceMerameraKing::HostTypeNrvDamage::sInstance)
|| isNerve(&NrvIceMerameraKing::HostTypeNrvExtinguish::sInstance)
|| isNerve(&NrvIceMerameraKing::HostTypeNrvEscape::sInstance)
|| isNerve(&NrvIceMerameraKing::HostTypeNrvEscapeJump::sInstance)
|| isNerve(&NrvIceMerameraKing::HostTypeNrvPreRecover::sInstance)
|| isNerve(&NrvIceMerameraKing::HostTypeNrvRecover::sInstance)
|| isNerve(&NrvIceMerameraKing::HostTypeNrvDeathDemoWait::sInstance)
|| isNerve(&NrvIceMerameraKing::HostTypeNrvAngryDemo1st::sInstance)
|| isNerve(&NrvIceMerameraKing::HostTypeNrvAngryDemo2nd::sInstance)
|| isNerve(&NrvIceMerameraKing::HostTypeNrvDeathDemo::sInstance)
|| MR::isPlayerElementModeIce()) {
MR::sendMsgPush(pReceiver, pSender);
}
else {
MR::sendMsgEnemyAttackFreeze(pReceiver, pSender);
}
}
}
bool IceMerameraKing::receiveMsgPlayerAttack(u32 msg, HitSensor *pSender, HitSensor *pReceiver) {
if (MR::isMsgStarPieceReflect(msg)) {
return true;
}
if (!isNerve(&NrvIceMerameraKing::HostTypeNrvEscape::sInstance) && !isNerve(&NrvIceMerameraKing::HostTypeNrvEscapeJump::sInstance)) {
return false;
}
if (MR::isMsgFreezeAttack(msg)) {
if (!--_EC) {
MR::stopMarioPinchBGMSoon();
MR::requestStartTimeKeepDemo(this, "メラキンオープニング", &NrvIceMerameraKing::HostTypeNrvDeathDemo::sInstance, &NrvIceMerameraKing::HostTypeNrvDeathDemoWait::sInstance, "死亡デモ");
}
else {
setNerve(&NrvIceMerameraKing::HostTypeNrvDamage::sInstance);
}
return true;
}
else if (MR::isMsgPlayerSpinAttack(msg)) {
if (!--_EC) {
MR::requestStartTimeKeepDemo(this, "メラキンオープニング", &NrvIceMerameraKing::HostTypeNrvDeathDemo::sInstance, &NrvIceMerameraKing::HostTypeNrvDeathDemoWait::sInstance, "死亡デモ");
}
else {
setNerve(&NrvIceMerameraKing::HostTypeNrvDamage::sInstance);
}
return true;
}
else {
return false;
}
}
bool IceMerameraKing::receiveOtherMsg(u32 msg, HitSensor *pSender, HitSensor *pReceiver) {
if (MR::isInSpinStormRange(msg, pSender, pReceiver, 600.0f)) {
if (isNerve(&NrvIceMerameraKing::HostTypeNrvDeathDemo::sInstance)
|| isNerve(&NrvIceMerameraKing::HostTypeNrvExtinguish::sInstance)
|| isNerve(&NrvIceMerameraKing::HostTypeNrvDamage::sInstance)
|| isNerve(&NrvIceMerameraKing::HostTypeNrvAngryDemo1st::sInstance)
|| isNerve(&NrvIceMerameraKing::HostTypeNrvAngryDemo2nd::sInstance)
|| isNerve(&NrvIceMerameraKing::HostTypeNrvEscape::sInstance)
|| isNerve(&NrvIceMerameraKing::HostTypeNrvEscapeJump::sInstance)
|| isNerve(&NrvIceMerameraKing::HostTypeNrvPreRecover::sInstance)
|| isNerve(&NrvIceMerameraKing::HostTypeNrvRecover::sInstance)) {
return false;
}
else {
TVec3f v10(*MR::getPlayerCenterPos());
v10.subtract(mPosition);
MR::vecKillElement(v10, mGravity, &v10);
if (PSVECMag(v10.toCVec()) > getSensor("body")->mRadius) {
return false;
}
else {
setNerve(&NrvIceMerameraKing::HostTypeNrvExtinguish::sInstance);
return true;
}
}
}
else {
return false;
}
}
void IceMerameraKing::addVelocityToInitPos() {
TVec3f v12(_C8);
v12.subtract(mPosition);
if (0.0f < mGravity.dot(v12)) {
MR::vecKillElement(v12, mGravity, &v12);
}
f32 squared = v12.squaredInline();
f32 half = 0.5f;
if (squared <= 0.0000038146973f) {
squared = squared;
}
else {
f32 inv = JGeometry::TUtil<f32>::inv_sqrt(squared);
f32 v9 = inv * half;
v12.scale(v9);
}
mVelocity.add(v12);
}
void IceMerameraKing::calcAndSetBaseMtx() {
TPos3f v3;
MR::makeMtxUpFrontPos(&v3, _BC, _B0, mPosition);
MR::setBaseTRMtx(this, v3);
mFixedPos->calc();
mJointController->registerCallBack();
}
bool IceMerameraKing::isDeadAllIce() {
s32 temp = _A4;
for (s32 i = 0; i < temp; i++) {
if (!MR::isDead(mActor[i])) {
return false;
}
}
return true;
}
bool IceMerameraKing::isEnableThrow() {
if (MR::isValidSwitchA(this) && !MR::isOnSwitchA(this)) {
return false;
}
if (MR::isPlayerInWaterMode() || MR::isPlayerOnWaterSurface()) {
return false;
}
TVec3f v10(*MR::getPlayerCenterPos());
v10.subtract(mPosition);
MR::normalize(&v10);
TVec3f v9;
MR::calcUpVec(&v9, this);
bool flag = false;
flag = -0.60000002f < v9.dot(v10);
return flag;
}
ThrowingIce* IceMerameraKing::getDeadWeaponAndAppear() {
ThrowingIce* v7;
s32 tempE4 = _E4;
s32 temp = _A4;
for (s32 i = 0; i < temp; i++) {
if (MR::isDead(mActor[tempE4])) {
MR::resetPosition(mActor[tempE4], mPosition);
mActor[tempE4]->appear();
_E4 += temp + 1 - ((_E4 + temp + 1) / (temp * temp));
v7 = mActor[tempE4];
return v7;
}
tempE4 += temp + 1 - ((tempE4 + temp + 1) / (temp * temp));
}
v7 = nullptr;
return v7;
//major
}
/*
bool IceMerameraKing::calcJoint(TPos3f *vec, const JointControllerInfo &info) {
TMtx34f v16;
TVec3f v15;
v16.mMtx[0][3] = 0.0f;
v16.mMtx[1][3] = 0.0f;
v16.mMtx[2][3] = 0.0f;
f32 v3 = _100.y;
f32 v4 = _100.x;
f32 v5 = 2.0f * _100.y;
f32 v6 = _100.z;
f32 v7 = 2.0f * _100.x;
f32 v8 = 2.0f * _100.w;
f32 v9 = ((1.0f - ((2.0f * _100.x) * _100.x)) - ((2.0f * _100.z) * _100.z));
f32 v10 = (((2.0f * _100.x) * _100.y) + ((2.0f * _100.w) * _100.z));
v16.mMtx[0][0] = (1.0f - ((2.0f * _100.y) * _100.y)) - ((2.0f * _100.z) * _100.z);
f32 v11 = ((1.0f - (v7 * v4)) - (v5 * v3));
v16.mMtx[0][1] = (v7 * v3) - (v8 * v6);
f32 v12 = (v8 * v3);
v16.mMtx[1][1] = v9;
f32 v13 = (v8 * v4);
v16.mMtx[1][0] = v10;
v16.mMtx[2][2] = v11;
v16.mMtx[0][2] = (v7 * v6) + v12;
v16.mMtx[1][2] = (v5 * v6) - v13;
v16.mMtx[2][0] = (v7 * v6) - v12;
v16.mMtx[2][1] = (v5 * v6) + v13;
vec->getTrans(v15);
mPosition.x = 0.0f;
mRotation.y = 0.0f;
mScale.z = 0.0f;
vec->concat(v16, *vec);
mPosition.x = v15.x;
mRotation.y = v15.y;
mScale.z = v15.z;
return true;
}
*/
IceMerameraKing::~IceMerameraKing() {
}
IceMerameraKingShockWave::IceMerameraKingShockWave() : ModelObj("衝撃", "IceMerameraKingShock", nullptr, -2, -2, -2, false) {
initHitSensor(2);
MR::addHitSensorEnemyAttack(this, "circle", 16, 15.0f, TVec3f(0.0f, -100.0f, 0.0f));
MR::addHitSensorEnemyAttack(this, "circle_end", 16, 24.0f, TVec3f(0.0f, -100.0f, 0.0f));
}
void IceMerameraKingShockWave::appear() {
LiveActor::appear();
MR::startAction(this, "Shock");
HitSensor* sensor = getSensor("circle");
sensor->mRadius = 0.0f;
}
void IceMerameraKingShockWave::control() {
TVec3f v7;
MR::copyJointScale(this, hScaleJointName[2], &v7);
f32 v3 = 15.0f * v7.y;
getSensor("circle")->mRadius = v3;
MR::copyJointScale(this, hScaleJointName[0], &v7);
f32 v4 = 25.0f * v7.y;
getSensor("circle_end")->mRadius = v4;
if (MR::isActionEnd(this)) {
kill();
}
}
void IceMerameraKingShockWave::attackSensor(HitSensor *pSender, HitSensor *pReceiver) {
if (pSender != getSensor("circle_end") && MR::isSensorPlayer(pReceiver)) {
HitSensor* sensor = getSensor("circle_end");
TVec3f v17(sensor->mPosition);
v17.subtract(pSender->mPosition);
f32 radius1 = sensor->mRadius;
f32 radius2 = pReceiver->mRadius;
if (PSVECMag(v17.toCVec()) > (radius2 + radius1)) {
TVec3f v15;
TVec3f v16(pSender->mPosition);
v16.subtract(pSender->mPosition);
MR::calcUpVec(&v15, this);
if (!(__fabsf(v16.dot(v15)) < 200.0f)) {
MR::vecKillElement(v16, v15, &v16);
MR::sendMsgEnemyAttackFlipToDir(pReceiver, pSender, v16);
}
}
}
}
IceMerameraKingShockWave::~IceMerameraKingShockWave() {
}
namespace NrvIceMerameraKing {
INIT_NERVE(HostTypeNrvSearch);
INIT_NERVE(HostTypeNrvBeginDemo);
INIT_NERVE(HostTypeNrvThrow);
INIT_NERVE(HostTypeNrvThrow2nd);
INIT_NERVE(HostTypeNrvExtinguish);
INIT_NERVE(HostTypeNrvEscape);
INIT_NERVE(HostTypeNrvEscapeJump);
INIT_NERVE(HostTypeNrvDamage);
INIT_NERVE(HostTypeNrvPreRecover);
INIT_NERVE(HostTypeNrvRecover);
INIT_NERVE(HostTypeNrvPreAttack);
INIT_NERVE(HostTypeNrvAttack);
INIT_NERVE(HostTypeNrvAttackAfter);
INIT_NERVE(HostTypeNrvAngryDemo1st);
INIT_NERVE(HostTypeNrvAngryDemo2nd);
INIT_NERVE(HostTypeNrvDeathDemoWait);
INIT_NERVE(HostTypeNrvDeathDemo);
void HostTypeNrvSearch::execute(Spine *pSpine) const {
IceMerameraKing *pActor = (IceMerameraKing*)pSpine->mExecutor;
pActor->exeSearch();
}
void HostTypeNrvBeginDemo::execute(Spine *pSpine) const {
IceMerameraKing *pActor = (IceMerameraKing*)pSpine->mExecutor;
pActor->exeThrow();
}
void HostTypeNrvBeginDemo::executeOnEnd(Spine *pSpine) const {
IceMerameraKing *pActor = (IceMerameraKing*)pSpine->mExecutor;
pActor->tearDownThrow();
}
void HostTypeNrvThrow::execute(Spine *pSpine) const {
IceMerameraKing *pActor = (IceMerameraKing*)pSpine->mExecutor;
pActor->exeThrow();
}
void HostTypeNrvThrow::executeOnEnd(Spine *pSpine) const {
IceMerameraKing *pActor = (IceMerameraKing*)pSpine->mExecutor;
pActor->tearDownThrow();
}
void HostTypeNrvThrow2nd::execute(Spine *pSpine) const {
IceMerameraKing *pActor = (IceMerameraKing*)pSpine->mExecutor;
pActor->exeThrow();
}
void HostTypeNrvThrow2nd::executeOnEnd(Spine *pSpine) const {
IceMerameraKing *pActor = (IceMerameraKing*)pSpine->mExecutor;
pActor->tearDownThrow();
}
void HostTypeNrvExtinguish::execute(Spine *pSpine) const {
IceMerameraKing *pActor = (IceMerameraKing*)pSpine->mExecutor;
pActor->exeExtinguish();
}
void HostTypeNrvEscape::execute(Spine *pSpine) const {
IceMerameraKing *pActor = (IceMerameraKing*)pSpine->mExecutor;
pActor->exeEscape();
}
void HostTypeNrvEscape::executeOnEnd(Spine *pSpine) const {
IceMerameraKing *pActor = (IceMerameraKing*)pSpine->mExecutor;
pActor->exeDeleteEffect();
}
void HostTypeNrvEscapeJump::execute(Spine *pSpine) const {
IceMerameraKing *pActor = (IceMerameraKing*)pSpine->mExecutor;
pActor->exeEscapeJump();
}
void HostTypeNrvDamage::execute(Spine *pSpine) const {
IceMerameraKing *pActor = (IceMerameraKing*)pSpine->mExecutor;
pActor->exeDamage();
}
void HostTypeNrvPreRecover::execute(Spine *pSpine) const {
IceMerameraKing *pActor = (IceMerameraKing*)pSpine->mExecutor;
pActor->exePreRecover();
}
void HostTypeNrvRecover::execute(Spine *pSpine) const {
IceMerameraKing *pActor = (IceMerameraKing*)pSpine->mExecutor;
pActor->exeRecover();
}
void HostTypeNrvPreAttack::execute(Spine *pSpine) const {
IceMerameraKing *pActor = (IceMerameraKing*)pSpine->mExecutor;
pActor->exePreAttack();
}
void HostTypeNrvAttack::execute(Spine *pSpine) const {
IceMerameraKing *pActor = (IceMerameraKing*)pSpine->mExecutor;
pActor->exeAttack();
}
void HostTypeNrvAttackAfter::execute(Spine *pSpine) const {
IceMerameraKing *pActor = (IceMerameraKing*)pSpine->mExecutor;
pActor->exeAttackAfter();
}
void HostTypeNrvAngryDemo1st::execute(Spine *pSpine) const {
IceMerameraKing *pActor = (IceMerameraKing*)pSpine->mExecutor;
pActor->exeAngryDemo();
}
void HostTypeNrvAngryDemo2nd::execute(Spine *pSpine) const {
IceMerameraKing *pActor = (IceMerameraKing*)pSpine->mExecutor;
pActor->exeAngryDemo();
}
void HostTypeNrvDeathDemoWait::execute(Spine *pSpine) const {
IceMerameraKing *pActor = (IceMerameraKing*)pSpine->mExecutor;
pActor->exeDeathDemoWait();
}
void HostTypeNrvDeathDemo::execute(Spine *pSpine) const {
IceMerameraKing *pActor = (IceMerameraKing*)pSpine->mExecutor;
pActor->exeDeathDemo();
}
TVec3f hBinderOffset(-100.586f, 222.65601f, -91.796898f);
TVec3f hEscapeBinderOffset(-39.0625f, 91.796898f, -47.851601f);
};