mirror of
https://github.com/encounter/Petari.git
synced 2026-03-30 11:34:15 -07:00
240 lines
6.8 KiB
C++
240 lines
6.8 KiB
C++
#include "Game/MapObj/FireBar.hpp"
|
|
#include "Game/Util.hpp"
|
|
#include "JSystem/JMath/JMath.hpp"
|
|
|
|
FireBarBall::~FireBarBall() {
|
|
|
|
}
|
|
|
|
FireBar::~FireBar() {
|
|
|
|
}
|
|
|
|
FireBarBall::FireBarBall(LiveActor *pParent) : ModelObj("ファイアバー玉", "FireBarBall", 0, 0xB, -2, -2, false) {
|
|
mFireBarParent = pParent;
|
|
}
|
|
|
|
void FireBarBall::init(const JMapInfoIter &rIter) {
|
|
f32 shadowDropDist = 100.0f;
|
|
MR::getJMapInfoArg6NoInit(rIter, &shadowDropDist);
|
|
|
|
if (0.0f != shadowDropDist) {
|
|
MR::initShadowVolumeCylinder(this, 55.0f);
|
|
MR::setShadowDropLength(this, 0, shadowDropDist);
|
|
s32 shadowDropRotate = -1;
|
|
MR::getJMapInfoArg4NoInit(rIter, &shadowDropRotate);
|
|
|
|
if (shadowDropRotate == 0) {
|
|
TVec3f upVec;
|
|
MR::calcUpVec(&upVec, mFireBarParent);
|
|
upVec.negate();
|
|
MR::setShadowDropDirection(this, 0, upVec);
|
|
}
|
|
|
|
s32 cutShadows = -1;
|
|
MR::getJMapInfoArg2NoInit(rIter, &cutShadows);
|
|
|
|
if (cutShadows == 0) {
|
|
MR::setShadowVolumeEndDropOffset(this, 0, 20.0f);
|
|
MR::onShadowVolumeCutDropLength(this, 0);
|
|
MR::onCalcShadow(this, 0);
|
|
}
|
|
}
|
|
|
|
MR::setClippingTypeSphereContainsModelBoundingBox(this, 100.0f);
|
|
makeActorAppeared();
|
|
}
|
|
|
|
void FireBarBall::initAfterPlacement() {
|
|
MR::calcGravity(this);
|
|
}
|
|
|
|
void FireBarBall::control() {
|
|
controlEmitEffect();
|
|
}
|
|
|
|
void FireBarBall::startClipped() {
|
|
MR::deleteEffect(this, "FireBarBall");
|
|
LiveActor::startClipped();
|
|
}
|
|
|
|
void FireBarBall::endClipped() {
|
|
LiveActor::endClipped();
|
|
}
|
|
|
|
void FireBarBall::controlEmitEffect() {
|
|
if (MR::isNearPlayerAnyTime(this, 5000.0f)) {
|
|
MR::emitEffect(this, "FireBarBall");
|
|
}
|
|
else {
|
|
MR::deleteEffect(this, "FireBarBall");
|
|
}
|
|
}
|
|
|
|
FireBar::FireBar(const char *pName) : LiveActor(pName) {
|
|
mFireBalls = 0;
|
|
mFireBallCount = 5;
|
|
_94.x = 0.0f;
|
|
_94.y = 0.0f;
|
|
_94.z = 0.0f;
|
|
mFireBarSpeed = -1.0f;
|
|
mStickCount = 1;
|
|
mStickDistance = 140.0f;
|
|
}
|
|
|
|
void FireBar::init(const JMapInfoIter &rIter) {
|
|
MR::initDefaultPos(this, rIter);
|
|
initModelManagerWithAnm("FireBarCore", 0, false);
|
|
MR::connectToSceneMapObj(this);
|
|
initHitSensor(2);
|
|
MR::addBodyMessageSensorMapObj(this);
|
|
MR::addHitSensorCallbackEnemyAttack(this, "fire", 8, 30.0f);
|
|
MR::initCollisionParts(this, "FireBarCore", getSensor("body"), 0);
|
|
initEffectKeeper(0, 0, false);
|
|
initSound(3, false);
|
|
MR::calcGravity(this);
|
|
|
|
f32 shadowDropDist = 100.0f;
|
|
MR::getJMapInfoArg6NoInit(rIter, &shadowDropDist);
|
|
MR::getJMapInfoArg3NoInit(rIter, &shadowDropDist);
|
|
shadowDropDist -= 55.0f;
|
|
|
|
if (shadowDropDist > 0.0f) {
|
|
TVec3f up_vec;
|
|
TVec3f scaled_vec;
|
|
TVec3f drop_direction;
|
|
TVec3f shadow_box;
|
|
shadow_box.x = 100.0f;
|
|
shadow_box.y = 100.0f;
|
|
shadow_box.z = 100.0f;
|
|
MR::initShadowVolumeBox(this, shadow_box);
|
|
MR::calcUpVec(&up_vec, this);
|
|
JMAVECScaleAdd((const Vec*)&up_vec, (const Vec*)&mPosition, (Vec*)&scaled_vec, 50.0f);
|
|
MR::setShadowDropPosition(this, 0, scaled_vec);
|
|
MR::setShadowVolumeStartDropOffset(this, 0, 100.0f);
|
|
MR::setShadowDropLength(this, 0, shadowDropDist);
|
|
|
|
s32 rotateShadow = -1;
|
|
MR::getJMapInfoArg4NoInit(rIter, &rotateShadow);
|
|
if (rotateShadow == 0) {
|
|
MR::calcUpVec(&drop_direction, this);
|
|
drop_direction.negate();
|
|
MR::setShadowDropDirection(this, 0, drop_direction);
|
|
}
|
|
}
|
|
|
|
s32 numFireBalls = 5;
|
|
f32 fireBallSpeed = -1.0f;
|
|
MR::getJMapInfoArg0NoInit(rIter, &numFireBalls);
|
|
MR::getJMapInfoArg1NoInit(rIter, &fireBallSpeed);
|
|
MR::getJMapInfoArg5NoInit(rIter, &mStickDistance);
|
|
MR::getJMapInfoArg7NoInit(rIter, &mStickCount);
|
|
|
|
mFireBarSpeed = 0.1f * fireBallSpeed;
|
|
mFireBallCount = mStickCount * numFireBalls;
|
|
MR::calcFrontVec(&_94, this);
|
|
initFireBarBall(rIter);
|
|
MR::setGroupClipping(this, rIter, 0x20);
|
|
MR::setClippingTypeSphere(this, (mFireBallCount + 1) * 100.0f);
|
|
MR::useStageSwitchSleep(this, rIter);
|
|
initNerve(&NrvFireBar::FireBarNrvWait::sInstance);
|
|
makeActorAppeared();
|
|
}
|
|
|
|
void FireBar::exeWait() {
|
|
TVec3f up_vec;
|
|
MR::calcUpVec(&up_vec, this);
|
|
MR::rotateVecDegree(&up_vec, _94, mFireBarSpeed);
|
|
MR::startLevelSound(this, "SE_OJ_LV_FIRE_BAR_CENTER", -1, -1, -1);
|
|
fixFireBarBall();
|
|
}
|
|
|
|
void FireBar::makeActorAppeared() {
|
|
for (s32 i = 0; i < mFireBallCount; i++) {
|
|
mFireBalls[i]->makeActorAppeared();
|
|
}
|
|
|
|
LiveActor::makeActorAppeared();
|
|
}
|
|
|
|
void FireBar::makeActorDead() {
|
|
for (s32 i = 0; i < mFireBallCount; i++) {
|
|
mFireBalls[i]->makeActorDead();
|
|
}
|
|
|
|
LiveActor::makeActorDead();
|
|
}
|
|
|
|
void FireBar::attackSensor(HitSensor *a1, HitSensor *a2) {
|
|
if (MR::isSensorPlayerOrRide(a2) && MR::isSensorEnemyAttack(a1)) {
|
|
MR::sendMsgEnemyAttackFire(a2, a1);
|
|
}
|
|
}
|
|
|
|
// updateHitSensor__7FireBarFP9HitSensor
|
|
|
|
#ifdef NON_MATCHING
|
|
// meh
|
|
void FireBar::initFireBarBall(const JMapInfoIter &rIter) {
|
|
mFireBalls = new FireBarBall*[mFireBallCount];
|
|
s32 totalNum = mFireBallCount;
|
|
totalNum /= mStickCount;
|
|
f32 startVal = 25.0f;
|
|
|
|
for (s32 i = 0; i < mFireBallCount; i++) {
|
|
mFireBalls[i] = new FireBarBall(this);
|
|
mFireBalls[i]->init(rIter);
|
|
MR::startBtk(mFireBalls[i], "FireBarBall");
|
|
s32 div = i / totalNum;
|
|
div *= totalNum;
|
|
|
|
startVal = !(i - div) ? 0.0f : startVal + 25.0f;
|
|
s32 btkFrame = MR::getBtkFrameMax(mFireBalls[i]);
|
|
s32 derp = startVal;
|
|
startVal = (derp - (derp / (btkFrame * btkFrame)));
|
|
MR::setBtkFrame(mFireBalls[i], startVal);
|
|
}
|
|
|
|
fixFireBarBall();
|
|
}
|
|
#endif
|
|
|
|
void FireBar::fixFireBarBall() {
|
|
TVec3f scaled;
|
|
scaled.scale(100.0f, _94);
|
|
|
|
TVec3f final_pos;
|
|
final_pos.z = 0.0f;
|
|
final_pos.y = 0.0f;
|
|
final_pos.x = 0.0f;
|
|
|
|
s32 totalNum = mFireBallCount;
|
|
totalNum /= mStickCount;
|
|
for (s32 i = 0; i < mFireBallCount; i++) {
|
|
s32 div = i / totalNum;
|
|
div *= totalNum;
|
|
if (!(i - div)) {
|
|
TVec3f up_vec;
|
|
MR::calcUpVec(&up_vec, this);
|
|
MR::rotateVecDegree(&scaled, up_vec, 360.0f / mStickCount);
|
|
TVec3f norm;
|
|
MR::normalize(scaled, &norm);
|
|
JMAVECScaleAdd((const Vec*)&norm, (const Vec*)&mPosition, (Vec*)&final_pos, mStickDistance);
|
|
JMAVECScaleAdd((const Vec*)&up_vec, (const Vec*)&final_pos, (Vec*)&final_pos, 50.0f);
|
|
}
|
|
else {
|
|
JMathInlineVEC::PSVECAdd((const Vec*)&final_pos, (const Vec*)&scaled, (Vec*)&final_pos);
|
|
}
|
|
|
|
mFireBalls[i]->mPosition.set(scaled);
|
|
}
|
|
}
|
|
|
|
namespace NrvFireBar {
|
|
FireBarNrvWait FireBarNrvWait::sInstance;
|
|
|
|
void FireBarNrvWait::execute(Spine *pSpine) const {
|
|
FireBar* bar = reinterpret_cast<FireBar*>(pSpine->mExecutor);
|
|
bar->exeWait();
|
|
}
|
|
}; |