mirror of
https://github.com/encounter/Petari.git
synced 2026-03-30 11:34:15 -07:00
355 lines
8.8 KiB
C++
355 lines
8.8 KiB
C++
#include "Game/MapObj/ChipBase.hpp"
|
|
#include "Game/MapObj/ChipHolder.hpp"
|
|
|
|
ChipBase::ChipBase(const char *pName, s32 chipType, const char *pChipName) : LiveActor(pName) {
|
|
mFlashingCtrl = 0;
|
|
mRailMover = 0;
|
|
mAirBubble = 0;
|
|
mChipName = pChipName;
|
|
mHost = 0;
|
|
mClippingRange.x = 0.0f;
|
|
mClippingRange.y = 0.0f;
|
|
mClippingRange.z = 0.0f;
|
|
mGroupID = -1;
|
|
mChipType = chipType;
|
|
_B5 = false;
|
|
}
|
|
|
|
void ChipBase::init(const JMapInfoIter &rIter) {
|
|
MR::createChipHolder(mChipType);
|
|
initJMapParam(rIter);
|
|
initModel(rIter);
|
|
initSensor();
|
|
initShadow(rIter);
|
|
initEffectKeeper(0, 0, false);
|
|
initSound(4, false);
|
|
initNerve(&NrvChipBase::ChipBaseNrvWait::sInstance);
|
|
|
|
if (MR::isValidInfo(rIter)) {
|
|
MR::setGroupClipping(this, rIter, 0x20);
|
|
}
|
|
|
|
mFlashingCtrl = new FlashingCtrl(this, true);
|
|
bool uses = MR::useStageSwitchReadAppear(this, rIter);
|
|
if (uses) {
|
|
MR::syncStageSwitchAppear(this);
|
|
makeActorDead();
|
|
}
|
|
else {
|
|
makeActorAppeared();
|
|
}
|
|
}
|
|
|
|
void ChipBase::initModel(const JMapInfoIter &rIter) {
|
|
mScale.scaleInline(1.0f);
|
|
initModelManagerWithAnm(mChipName, 0, false);
|
|
MR::connectToSceneNoSilhouettedMapObjStrongLight(this);
|
|
|
|
if (ChipBase::isNeedBubble(rIter)) {
|
|
mAirBubble = MR::createPartsModelNoSilhouettedMapObj(this, "アワ", "AirBubble", 0);
|
|
mAirBubble->initFixedPosition(TVec3f(0.0f, 0.0f, 0.0f), TVec3f(0.0f, 0.0f, 0.0f), 0);
|
|
MR::startBck(mAirBubble, "Move", 0);
|
|
}
|
|
}
|
|
|
|
void ChipBase::initSensor() {
|
|
f32 radius;
|
|
f32 scale_x = mScale.x;
|
|
initHitSensor(1);
|
|
|
|
if (mAirBubble) {
|
|
radius = 150.0f;
|
|
}
|
|
else {
|
|
radius = 80.0f;
|
|
}
|
|
|
|
TVec3f sensor(0.0f, 0.0f, 0.0f);
|
|
MR::addHitSensorEnemy(this, "body", 8, radius * scale_x, sensor);
|
|
}
|
|
|
|
#ifdef NON_MATCHING
|
|
void ChipBase::initShadow(const JMapInfoIter &rIter) {
|
|
if (MR::isValidInfo(rIter)) {
|
|
MR::getJMapInfoArg2WithInit(rIter, &_B5);
|
|
}
|
|
else {
|
|
_B5 = false;
|
|
}
|
|
|
|
s32 shadowShape = -1;
|
|
if (MR::isValidInfo(rIter)) {
|
|
MR::getJMapInfoArg5NoInit(rIter, &shadowShape);
|
|
}
|
|
|
|
if (shadowShape == 0) {
|
|
MR::initShadowVolumeCylinder(this, 50.0f * mScale.x);
|
|
_B5 = false;
|
|
}
|
|
else {
|
|
MR::initShadowVolumeSphere(this, 50.0f * mScale.x);
|
|
}
|
|
|
|
f32 dropLength = 2000.0f;
|
|
if (MR::isValidInfo(rIter)) {
|
|
MR::getJMapInfoArg4NoInit(rIter, &dropLength);
|
|
}
|
|
MR::setShadowDropLength(this, 0, dropLength);
|
|
|
|
if (mRailMover || _B5) {
|
|
MR::onCalcShadowDropPrivateGravity(this, 0);
|
|
}
|
|
else {
|
|
MR::onCalcShadowOneTime(this, 0);
|
|
MR::onCalcShadowDropPrivateGravityOneTime(this, 0);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
void ChipBase::initJMapParam(const JMapInfoIter &rIter) {
|
|
if (MR::isValidInfo(rIter)) {
|
|
MR::initDefaultPos(this, rIter);
|
|
MR::getJMapInfoArg0NoInit(rIter, &mGroupID);
|
|
|
|
if (MR::isConnectedWithRail(rIter)) {
|
|
initRailRider(rIter);
|
|
mRailMover = new MapPartsRailMover(this);
|
|
mRailMover->init(rIter);
|
|
}
|
|
}
|
|
}
|
|
|
|
void ChipBase::initAfterPlacement() {
|
|
MR::registerChip(mChipType, this, mGroupID);
|
|
MR::setClippingRangeIncludeShadow(this, &mClippingRange, 100.0f);
|
|
}
|
|
|
|
void ChipBase::deactive() {
|
|
makeActorDead();
|
|
setNerve(&NrvChipBase::ChipBaseNrvDeactive::sInstance);
|
|
}
|
|
|
|
void ChipBase::setGroupID(s32 id) {
|
|
mGroupID = id;
|
|
}
|
|
|
|
void ChipBase::setHost(LiveActor *pActor) {
|
|
mHost = pActor;
|
|
}
|
|
|
|
void ChipBase::makeActorAppeared() {
|
|
if (!isNerve(&NrvChipBase::ChipBaseNrvDeactive::sInstance)) {
|
|
LiveActor::makeActorAppeared();
|
|
if (mRailMover) {
|
|
mRailMover->start();
|
|
}
|
|
}
|
|
}
|
|
|
|
void ChipBase::makeActorDead() {
|
|
if (mRailMover) {
|
|
mRailMover->end();
|
|
}
|
|
|
|
LiveActor::makeActorDead();
|
|
}
|
|
|
|
void ChipBase::control() {
|
|
if (mRailMover) {
|
|
mRailMover->movement();
|
|
mPosition.x = mRailMover->_28.x;
|
|
mPosition.y = mRailMover->_28.y;
|
|
mPosition.z = mRailMover->_28.z;
|
|
MR::setClippingRangeIncludeShadow(this, &mClippingRange, 100.0f);
|
|
}
|
|
}
|
|
|
|
void ChipBase::appearWait() {
|
|
if (!isNerve(&NrvChipBase::ChipBaseNrvDeactive::sInstance)) {
|
|
makeActorAppeared();
|
|
MR::validateClipping(this);
|
|
setNerve(&NrvChipBase::ChipBaseNrvWait::sInstance);
|
|
}
|
|
}
|
|
|
|
void ChipBase::appearFlashing(s32 a1) {
|
|
if (!isNerve(&NrvChipBase::ChipBaseNrvDeactive::sInstance)) {
|
|
appear();
|
|
MR::invalidateClipping(this);
|
|
mFlashingCtrl->start(a1);
|
|
setNerve(&NrvChipBase::ChipBaseNrvFlashing::sInstance);
|
|
}
|
|
}
|
|
|
|
bool ChipBase::requestGet(HitSensor *a1, HitSensor *a2) {
|
|
if (isGettable()) {
|
|
MR::noticeGetChip(mChipType, this, mGroupID);
|
|
setNerve(&NrvChipBase::ChipBaseNrvGot::sInstance);
|
|
|
|
if (mHost) {
|
|
mHost->receiveMessage(0x87, a1, a2);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool ChipBase::requestShow() {
|
|
if (isNerve(&NrvChipBase::ChipBaseNrvHide::sInstance)) {
|
|
MR::startBck(this, "Wait", 0);
|
|
MR::showModel(this);
|
|
setNerve(&NrvChipBase::ChipBaseNrvWait::sInstance);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool ChipBase::requestHide() {
|
|
if (isGettable()) {
|
|
MR::invalidateHitSensors(this);
|
|
MR::hideModel(this);
|
|
MR::stopBck(this);
|
|
MR::forceDeleteEffectAll(this);
|
|
setNerve(&NrvChipBase::ChipBaseNrvHide::sInstance);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool ChipBase::requestStartControl() {
|
|
if (isNerve(&NrvChipBase::ChipBaseNrvWait::sInstance)) {
|
|
setNerve(&NrvChipBase::ChipBaseNrvControled::sInstance);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool ChipBase::requestEndControl() {
|
|
if (isNerve(&NrvChipBase::ChipBaseNrvControled::sInstance)) {
|
|
setNerve(&NrvChipBase::ChipBaseNrvWait::sInstance);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
void ChipBase::exeFlashing() {
|
|
if (MR::isFirstStep(this)) {
|
|
MR::startBck(this, "Wait", 0);
|
|
MR::validateHitSensors(this);
|
|
}
|
|
|
|
if (mFlashingCtrl->mIsEnded) {
|
|
kill();
|
|
}
|
|
}
|
|
|
|
#ifdef NON_MATCHING
|
|
// mAirBubble load isn't loading twice
|
|
void ChipBase::exeGot() {
|
|
if (MR::isFirstStep(this)) {
|
|
PartsModel* mdl = mAirBubble;
|
|
if (mdl != 0) {
|
|
MR::emitEffect(mdl, "RecoveryBubbleBreak");
|
|
MR::incPlayerOxygen(8);
|
|
mAirBubble->kill();
|
|
}
|
|
|
|
MR::emitEffect(this, "Get");
|
|
MR::tryRumblePadMiddle(this, 0);
|
|
|
|
if (!mChipType) {
|
|
MR::startSystemSE("SE_SY_BLUECHIP_GET", MR::getGotChipCount(mChipType, mGroupID), -1);
|
|
}
|
|
else {
|
|
if (mChipType == 1) {
|
|
MR::startSystemSE("SE_SY_YELLOWCHIP_GET", MR::getGotChipCount(mChipType, mGroupID), -1);
|
|
}
|
|
}
|
|
}
|
|
|
|
kill();
|
|
}
|
|
#endif
|
|
|
|
bool ChipBase::isGettable() const {
|
|
if (MR::isDead(this)) {
|
|
return false;
|
|
}
|
|
|
|
bool ret;
|
|
|
|
if (MR::isLessStep(this, 0x28)) {
|
|
ret = false;
|
|
}
|
|
else {
|
|
ret = false;
|
|
if (isNerve(&NrvChipBase::ChipBaseNrvWait::sInstance) || isNerve(&NrvChipBase::ChipBaseNrvFlashing::sInstance)) {
|
|
ret = true;
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
bool ChipBase::isNeedBubble(const JMapInfoIter &rIter) {
|
|
if (!MR::isValidInfo(rIter)) {
|
|
return false;
|
|
}
|
|
|
|
bool val = false;
|
|
MR::getJMapInfoArg3WithInit(rIter, &val);
|
|
return val;
|
|
}
|
|
|
|
void ChipBase::makeArchiveList(NameObjArchiveListCollector *pList, const JMapInfoIter &rIter) {
|
|
if (ChipBase::isNeedBubble(rIter)) {
|
|
pList->addArchive("AirBubble");
|
|
}
|
|
}
|
|
|
|
namespace NrvChipBase {
|
|
ChipBaseNrvDeactive ChipBaseNrvDeactive::sInstance;
|
|
ChipBaseNrvWait ChipBaseNrvWait::sInstance;
|
|
ChipBaseNrvControled ChipBaseNrvControled::sInstance;
|
|
ChipBaseNrvFlashing ChipBaseNrvFlashing::sInstance;
|
|
ChipBaseNrvHide ChipBaseNrvHide::sInstance;
|
|
ChipBaseNrvGot ChipBaseNrvGot::sInstance;
|
|
|
|
void ChipBaseNrvGot::execute(Spine *pSpine) const {
|
|
ChipBase* base = reinterpret_cast<ChipBase*>(pSpine->mExecutor);
|
|
base->exeGot();
|
|
}
|
|
|
|
void ChipBaseNrvHide::execute(Spine *pSpine) const {
|
|
|
|
}
|
|
|
|
void ChipBaseNrvFlashing::execute(Spine *pSpine) const {
|
|
ChipBase* base = reinterpret_cast<ChipBase*>(pSpine->mExecutor);
|
|
base->exeFlashing();
|
|
}
|
|
|
|
void ChipBaseNrvControled::execute(Spine *pSpine) const {
|
|
ChipBase* base = reinterpret_cast<ChipBase*>(pSpine->mExecutor);
|
|
MR::zeroVelocity(base);
|
|
}
|
|
|
|
void ChipBaseNrvWait::execute(Spine *pSpine) const {
|
|
ChipBase* base = reinterpret_cast<ChipBase*>(pSpine->mExecutor);
|
|
|
|
if (MR::isFirstStep(base)) {
|
|
MR::startBck(base, "Wait", 0);
|
|
MR::validateHitSensors(base);
|
|
}
|
|
}
|
|
|
|
void ChipBaseNrvDeactive::execute(Spine *pSpine) const {
|
|
|
|
}
|
|
}; |