2023-12-13 00:40:16 -05:00
|
|
|
#include "Game/Map/Air.hpp"
|
|
|
|
|
#include "Game/LiveActor/MaterialCtrl.hpp"
|
|
|
|
|
#include "Game/Scene/SceneObjHolder.hpp"
|
|
|
|
|
#include "Game/Util.hpp"
|
2022-01-21 03:51:04 -05:00
|
|
|
|
|
|
|
|
Air::Air(const char *pName) : LiveActor(pName) {
|
|
|
|
|
_8C = 0;
|
|
|
|
|
_8D = 0;
|
|
|
|
|
mDistance = 70.0f;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Air::init(const JMapInfoIter &rIter) {
|
|
|
|
|
MR::initDefaultPos(this, rIter);
|
|
|
|
|
const char* object_name = 0;
|
|
|
|
|
MR::getObjectName(&object_name, rIter);
|
|
|
|
|
initModel(object_name);
|
|
|
|
|
MR::connectToSceneAir(this);
|
|
|
|
|
MR::useStageSwitchReadA(this, rIter);
|
|
|
|
|
MR::getJMapInfoArg0NoInit(rIter, &mDistance);
|
|
|
|
|
s32 arg_1 = -1;
|
|
|
|
|
MR::getJMapInfoArg1NoInit(rIter, &arg_1);
|
|
|
|
|
_8D = arg_1 + 1;
|
|
|
|
|
MR::tryStartAllAnim(this, object_name);
|
|
|
|
|
MR::setClippingTypeSphereContainsModelBoundingBox(this, 100.0f);
|
|
|
|
|
setFarClipping();
|
|
|
|
|
MR::setGroupClipping(this, rIter, 0x10);
|
|
|
|
|
initNerve(&NrvAir::HostTypeOut::sInstance);
|
|
|
|
|
MR::registerDemoSimpleCastAll(this);
|
|
|
|
|
bool registered = MR::tryRegisterDemoCast(this, rIter);
|
|
|
|
|
|
|
|
|
|
if (registered) {
|
|
|
|
|
bool val = true;
|
|
|
|
|
|
|
|
|
|
void (Air::*fadeOut)(void) = &Air::appearFadeOut;
|
|
|
|
|
bool ret = MR::tryRegisterDemoActionFunctor(this, MR::Functor(this, fadeOut), "消滅");
|
|
|
|
|
|
|
|
|
|
if (!ret) {
|
|
|
|
|
void (Air::*fadeIn)(void) = &Air::appearFadeIn;
|
|
|
|
|
ret = MR::tryRegisterDemoActionFunctor(this, MR::Functor(this, fadeIn), 0);
|
|
|
|
|
|
|
|
|
|
if (!ret) {
|
|
|
|
|
val = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (val) {
|
|
|
|
|
makeActorDead();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
appear();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Air::appear() {
|
|
|
|
|
LiveActor::appear();
|
|
|
|
|
|
|
|
|
|
f32 val = 100.0f * mDistance;
|
|
|
|
|
f32 dist = MR::calcDistanceToPlayer(this);
|
|
|
|
|
|
|
|
|
|
if (dist < val) {
|
|
|
|
|
MR::tryStartAllAnim(this, "Appear");
|
|
|
|
|
MR::setAllAnimFrameAtEnd(this, "Appear");
|
|
|
|
|
setNerve(&NrvAir::HostTypeIn::sInstance);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
MR::tryStartAllAnim(this, "Disappear");
|
|
|
|
|
MR::setAllAnimFrameAtEnd(this, "Disappear");
|
|
|
|
|
MR::hideModel(this);
|
|
|
|
|
setNerve(&NrvAir::HostTypeOut::sInstance);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool Air::isDrawing() const {
|
|
|
|
|
if (!MR::isDead(this)) {
|
|
|
|
|
return !MR::isHiddenModel(this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Air::initModel(const char *pModelName) {
|
|
|
|
|
initModelManagerWithAnm(pModelName, 0, false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool Air::tryChange() {
|
|
|
|
|
if (!MR::isValidSwitchA(this)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (_8C) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (MR::isOnSwitchA(this)) {
|
|
|
|
|
MR::tryStartAllAnim(this, "Change");
|
|
|
|
|
_8C = 1;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Air::appearFadeIn() {
|
|
|
|
|
makeActorAppeared();
|
|
|
|
|
MR::tryStartAllAnim(this, "Appear");
|
|
|
|
|
setNerve(&NrvAir::HostTypeIn::sInstance);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Air::appearFadeOut() {
|
|
|
|
|
makeActorAppeared();
|
|
|
|
|
MR::tryStartAllAnim(this, "Disappear");
|
|
|
|
|
setNerve(&NrvAir::HostTypeOut::sInstance);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Air::exeIn() {
|
|
|
|
|
bool isCameraNotEnd = false;
|
|
|
|
|
|
|
|
|
|
if (_8D && !MR::isStartAnimCameraEnd()) {
|
|
|
|
|
isCameraNotEnd = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!isCameraNotEnd) {
|
|
|
|
|
tryChange();
|
|
|
|
|
f32 val = (100.0f * (20.0f + mDistance));
|
|
|
|
|
if (val < MR::calcDistanceToPlayer(this)) {
|
|
|
|
|
MR::tryStartAllAnim(this, "Disappear");
|
|
|
|
|
setNerve(&NrvAir::HostTypeOut::sInstance);
|
|
|
|
|
}
|
|
|
|
|
}
|
2022-11-21 19:20:03 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Air::exeOut() {
|
|
|
|
|
bool flag = false;
|
|
|
|
|
|
|
|
|
|
if (_8D && !MR::isStartAnimCameraEnd()) {
|
|
|
|
|
flag = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!flag) {
|
|
|
|
|
tryChange();
|
|
|
|
|
|
|
|
|
|
if (!MR::isHiddenModel(this) && MR::isAnyAnimStopped(this, "Disappear")) {
|
|
|
|
|
MR::hideModel(this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
f32 distMult = (100.0f * mDistance);
|
|
|
|
|
|
|
|
|
|
if (MR::calcDistanceToPlayer(this) < distMult) {
|
|
|
|
|
MR::showModel(this);
|
|
|
|
|
MR::tryStartAllAnim(this, "Appear");
|
|
|
|
|
setNerve(&NrvAir::HostTypeIn::sInstance);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Air::~Air() {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ProjectionMapAir::initModel(const char *pModelName) {
|
2023-02-13 03:33:10 -05:00
|
|
|
initModelManagerWithAnm(pModelName, nullptr, true);
|
2022-11-21 19:20:03 -05:00
|
|
|
ProjmapEffectMtxSetter* mtxSetter = MR::initDLMakerProjmapEffectMtxSetter(this);
|
|
|
|
|
MR::newDifferedDLBuffer(this);
|
|
|
|
|
mtxSetter->updateMtxUseBaseMtx();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Air::setFarClipping() {
|
|
|
|
|
MR::setClippingFarMax(this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
AirFar100m::AirFar100m(const char *pName) : Air(pName) {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void AirFar100m::setFarClipping() {
|
|
|
|
|
MR::setClippingFar100m(this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
PriorDrawAir::PriorDrawAir(const char *pName) : Air(pName) {
|
|
|
|
|
MR::createSceneObj(SceneObj_PriorDrawAirHolder);
|
|
|
|
|
MR::getSceneObj<PriorDrawAirHolder*>(SceneObj_PriorDrawAirHolder)->add(this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
PriorDrawAirHolder::PriorDrawAirHolder() : NameObj("先描画大気保持") {
|
|
|
|
|
mAirCount = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PriorDrawAirHolder::add(PriorDrawAir *pAir) {
|
|
|
|
|
s32 airCnt = mAirCount++;
|
|
|
|
|
mAirs[airCnt] = pAir;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool PriorDrawAirHolder::isExistValidDrawAir() const {
|
|
|
|
|
PriorDrawAir** curAir = (PriorDrawAir**)&mAirs;
|
|
|
|
|
|
|
|
|
|
for (; curAir != &mAirs[mAirCount]; *curAir++) {
|
|
|
|
|
if ((*curAir)->isDrawing()) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
namespace MR {
|
|
|
|
|
bool isExistPriorDrawAir() {
|
|
|
|
|
if (!MR::isExistSceneObj(SceneObj_PriorDrawAirHolder)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return MR::getSceneObj<PriorDrawAirHolder*>(SceneObj_PriorDrawAirHolder)->isExistValidDrawAir();
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
namespace NrvAir {
|
|
|
|
|
INIT_NERVE(HostTypeIn);
|
|
|
|
|
INIT_NERVE(HostTypeOut);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
AirFar100m::~AirFar100m() {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ProjectionMapAir::~ProjectionMapAir() {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
PriorDrawAir::~PriorDrawAir() {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
PriorDrawAirHolder::~PriorDrawAirHolder() {
|
|
|
|
|
|
|
|
|
|
}
|