Files

345 lines
10 KiB
C++
Raw Permalink Normal View History

#include "Game/MapObj/PressureBase.hpp"
2022-09-06 02:46:16 -04:00
PressureMessenger::PressureMessenger(MsgSharedGroup *pGroup, const char *pName) : LiveActor(pName) {
mSharedGroup = pGroup;
_90 = 0;
}
void PressureMessenger::init(const JMapInfoIter &rIter) {
MR::connectToSceneMapObjMovement(this);
initHitSensor(1);
MR::addBodyMessageSensorMapObj(this);
MR::invalidateClipping(this);
initNerve(&NrvPressureMessenger::PressureMessengerNrvSync::sInstance);
makeActorAppeared();
}
void PressureMessenger::exeSync() {
if (MR::isStep(this, _90)) {
mSharedGroup->sendMsgToGroupMember(0x68, getSensor("body"), "body");
setNerve(&NrvPressureMessenger::PressureMessengerNrvSync::sInstance);
}
}
PressureBase::PressureBase(const char *pName) : LiveActor(pName) {
mJointController = nullptr;
2022-09-06 02:46:16 -04:00
mFront.x = 0.0f;
mFront.y = 0.0f;
mFront.z = 1.0f;
_9C = 0.0f;
mNozzleRotation = 0.0f;
mWaitTime = 300;
mBallSpeed = 30.0f;
mShotType = 0;
_B0 = 0;
mMessenger = nullptr;
mGroup = nullptr;
2022-09-06 02:46:16 -04:00
_BC = 0;
}
void PressureBase::init(const JMapInfoIter &rIter) {
MR::initDefaultPos(this, rIter);
const char* objName;
MR::getObjectName(&objName, rIter);
initModelManagerWithAnm(objName, nullptr, false);
2022-09-06 02:46:16 -04:00
MR::calcFrontVec(&mFront, this);
MR::connectToSceneNoShadowedMapObjStrongLight(this);
initHitSensor(2);
MR::addHitSensorMapObj(this, "body", 8, 70.0f, TVec3f(0.0f, 30.0f, 0.0f));
MR::addHitSensorAtJointMapObjSimple(this, "cannon", "Cannon1", 8, 70.0f, TVec3f(40.0f, 0.0f, 0.0f));
initEffectKeeper(0, nullptr, false);
2022-09-06 02:46:16 -04:00
initSound(6, false);
MR::initShadowVolumeSphere(this, 75.0f);
MR::invalidateShadow(this, nullptr);
2022-09-06 02:46:16 -04:00
mJointController = MR::createJointDelegatorWithNullChildFunc<PressureBase>(this, &PressureBase::calcJointCannonV, "Cannon1");
MR::initJointTransform(this);
MR::getJMapInfoArg0NoInit(rIter, &mNozzleRotation);
MR::getJMapInfoArg1NoInit(rIter, &mWaitTime);
s16 frame = MR::getBckFrameMax(this, "ShotStart");
_B0 = (mWaitTime < frame);
//_B0 = ((frame ^ mWaitTime >> 1) - (frame ^ mWaitTime) < 0;
initBullet(rIter);
MR::getJMapInfoArg2NoInit(rIter, &mBallSpeed);
MR::getJMapInfoArg3NoInit(rIter, &mShotType);
MR::calcGravity(this);
MR::setGroupClipping(this, rIter, 32);
mGroup = MR::joinToGroupArray(this, rIter, "プレッシャー軍団", 0x20);
if (mGroup != nullptr) {
2022-09-06 02:46:16 -04:00
PressureBase* actor = (PressureBase*)mGroup->getActor(0);
if (this == actor) {
mMessenger = new PressureMessenger(mGroup, "プレッシャー同期メッセンジャー");
mMessenger->initWithoutIter();
}
}
MR::tryRegisterDemoCast(this, rIter);
MR::useStageSwitchSleep(this, rIter);
if (MR::useStageSwitchReadA(this, rIter)) {
void (PressureBase::*relaxFunc)(void) = &PressureBase::startRelax;
void (PressureBase::*waitFunc)(void) = &PressureBase::startWait;
MR::listenStageSwitchOnOffA(this, MR::Functor(this, relaxFunc), MR::Functor(this, waitFunc));
initNerve(&NrvPressureBase::PressureBaseNrvRelax::sInstance);
}
else {
initNerve(&NrvPressureBase::PressureBaseNrvFirstWait::sInstance);
}
if (MR::useStageSwitchReadAppear(this, rIter)) {
MR::syncStageSwitchAppear(this);
makeActorDead();
}
else {
makeActorAppeared();
}
}
#ifdef NON_MATCHING
// regswap
void PressureBase::initAfterPlacement() {
if (mMessenger != nullptr) {
2022-09-06 02:46:16 -04:00
s32 waitTime = -1;
for (u16 i = 0; i < MR::getGroupFromArray(this)->mObjectCount; ++i) {
PressureBase* actor = (PressureBase*)MR::getGroupFromArray(this)->getActor(i);
if (actor->mWaitTime > waitTime) {
waitTime = actor->mWaitTime;
}
}
mMessenger->_90 = waitTime + 60;
}
}
#endif
void PressureBase::calcAndSetBaseMtx() {
LiveActor::calcAndSetBaseMtx();
mJointController->registerCallBack();
}
void PressureBase::control() {
if (mWaitTime == 3) {
MR::turnDirectionToTargetDegree(this, &mFront, *MR::getPlayerPos(), 5.0f);
}
}
void PressureBase::exeBound() {
if (MR::isFirstStep(this)) {
if (isNerve(&NrvPressureBase::PressureBaseNrvRelaxStart::sInstance)) {
MR::startBck(this, "SwitchOff", nullptr);
2022-09-06 02:46:16 -04:00
}
else {
MR::startBck(this, "SwitchOn", nullptr);
2022-09-06 02:46:16 -04:00
}
}
f32 rate = MR::calcNerveRate(this, 0x14);
f32 scale = MR::getScaleWithReactionValueZeroToOne(rate, 1.0f, -2.0f);
scale *= (-45.0f - mNozzleRotation);
if (isNerve(&NrvPressureBase::PressureBaseNrvRelaxStart::sInstance)) {
_9C = mNozzleRotation + scale;
}
else {
_9C = -45.0f - scale;
}
if (MR::isStep(this, 0x14)) {
if (isNerve(&NrvPressureBase::PressureBaseNrvRelaxStart::sInstance)) {
setNerve(&NrvPressureBase::PressureBaseNrvRelax::sInstance);
}
else {
setNerve(&NrvPressureBase::PressureBaseNrvWait::sInstance);
}
}
}
void PressureBase::exeWait() {
if (mWaitTime == MR::getBckFrameMax(this, "ShotStart") + getNerveStep()) {
setNerve(&NrvPressureBase::PressureBaseNrvPrepareToShot::sInstance);
}
else if (MR::isStep(this, mWaitTime)) {
setNerve(&NrvPressureBase::PressureBaseNrvShot::sInstance);
}
}
void PressureBase::exePrepareToShot() {
if (MR::isFirstStep(this)) {
MR::startBck(this, "ShotStart", nullptr);
2022-09-06 02:46:16 -04:00
}
if (MR::isBckStopped(this)) {
setNerve(&NrvPressureBase::PressureBaseNrvShot::sInstance);
}
}
void PressureBase::exeShot() {
if (MR::isFirstStep(this)) {
if (_B0) {
MR::startBck(this, "ShortShot", nullptr);
2022-09-06 02:46:16 -04:00
}
else {
MR::startBck(this, "Shot", nullptr);
2022-09-06 02:46:16 -04:00
}
}
if (_B0) {
if (MR::isStep(this, 0x36)) {
shotBullet(mBallSpeed);
}
}
else {
if (MR::isStep(this, 0x10)) {
shotBullet(mBallSpeed);
}
}
if (MR::isBckStopped(this)) {
if (mGroup != nullptr) {
2022-09-06 02:46:16 -04:00
setNerve(&NrvPressureBase::PressureBaseNrvSyncWait::sInstance);
}
else {
setNerve(&NrvPressureBase::PressureBaseNrvWait::sInstance);
}
}
}
void PressureBase::attackSensor(HitSensor *a1, HitSensor *a2) {
if (MR::isSensorPlayer(a2) || MR::isSensorEnemy(a2)) {
MR::sendMsgPush(a2, a1);
}
}
bool PressureBase::receiveMsgPlayerAttack(u32 msg, HitSensor *, HitSensor *) {
return MR::isMsgStarPieceReflect(msg);
}
bool PressureBase::receiveOtherMsg(u32 msg, HitSensor *, HitSensor *) {
if (msg == 0x68) {
bool v5 = false;
if (isNerve(&NrvPressureBase::PressureBaseNrvRelaxStart::sInstance) || isNerve(&NrvPressureBase::PressureBaseNrvRelax::sInstance)) {
v5 = true;
}
if (v5) {
return false;
}
setNerve(&NrvPressureBase::PressureBaseNrvWait::sInstance);
return true;
}
return false;
}
void PressureBase::startWait() {
if (isNerve(&NrvPressureBase::PressureBaseNrvRelax::sInstance)) {
setNerve(&NrvPressureBase::PressureBaseNrvWaitStart::sInstance);
}
}
void PressureBase::startRelax() {
bool dontStartRelax = false;
if (isNerve(&NrvPressureBase::PressureBaseNrvRelaxStart::sInstance) || isNerve(&NrvPressureBase::PressureBaseNrvRelax::sInstance)) {
dontStartRelax = true;
}
if (!dontStartRelax) {
MR::startSound(this, "SE_OJ_W_PRESS_HEAD_OFF", -1, -1);
setNerve(&NrvPressureBase::PressureBaseNrvRelaxStart::sInstance);
}
}
void PressureBase::initBullet(const JMapInfoIter &) {
}
bool PressureBase::shotBullet(f32) {
return false;
}
// PressureBase::calcJointCannonV
bool PressureBase::isShotTypeOnGravity() const {
return mShotType == 0;
}
bool PressureBase::isShotTypeFollow() const {
return mShotType == 2;
}
namespace NrvPressureMessenger {
INIT_NERVE(PressureMessengerNrvSync);
};
namespace NrvPressureBase {
INIT_NERVE(PressureBaseNrvRelaxStart);
INIT_NERVE(PressureBaseNrvWaitStart);
INIT_NERVE(PressureBaseNrvRelax);
INIT_NERVE(PressureBaseNrvSyncWait);
INIT_NERVE(PressureBaseNrvFirstWait);
INIT_NERVE(PressureBaseNrvWait);
INIT_NERVE(PressureBaseNrvPrepareToShot);
INIT_NERVE(PressureBaseNrvShot);
void PressureBaseNrvShot::execute(Spine *pSpine) const {
PressureBase* pressure = reinterpret_cast<PressureBase*>(pSpine->mExecutor);
pressure->exeShot();
}
void PressureBaseNrvPrepareToShot::execute(Spine *pSpine) const {
PressureBase* pressure = reinterpret_cast<PressureBase*>(pSpine->mExecutor);
pressure->exePrepareToShot();
}
void PressureBaseNrvWait::execute(Spine *pSpine) const {
PressureBase* pressure = reinterpret_cast<PressureBase*>(pSpine->mExecutor);
pressure->exeWait();
}
void PressureBaseNrvFirstWait::execute(Spine *pSpine) const {
PressureBase* pressure = reinterpret_cast<PressureBase*>(pSpine->mExecutor);
if (MR::isStep(pressure, pressure->mWaitTime)) {
pressure->setNerve(&NrvPressureBase::PressureBaseNrvPrepareToShot::sInstance);
}
}
void PressureBaseNrvSyncWait::execute(Spine *pSpine) const {
}
void PressureBaseNrvRelax::execute(Spine *pSpine) const {
PressureBase* pressure = reinterpret_cast<PressureBase*>(pSpine->mExecutor);
if (MR::isFirstStep(pressure)) {
pressure->_9C = -45.0f;
}
}
void PressureBaseNrvWaitStart::execute(Spine *pSpine) const {
PressureBase* pressure = reinterpret_cast<PressureBase*>(pSpine->mExecutor);
pressure->exeBound();
}
void PressureBaseNrvRelaxStart::execute(Spine *pSpine) const {
PressureBase* pressure = reinterpret_cast<PressureBase*>(pSpine->mExecutor);
pressure->exeBound();
}
};
namespace NrvPressureMessenger {
void PressureMessengerNrvSync::execute(Spine *pSpine) const {
PressureMessenger* mess = reinterpret_cast<PressureMessenger*>(pSpine->mExecutor);
mess->exeSync();
}
};
PressureMessenger::~PressureMessenger() {
}