1#include "Game/Enemy/Poihana.hpp"
2#include "Game/Util.hpp"
3#include "JSystem/JMath/JMath.hpp"
6 const Vec sNormalBinderPos = { 0.0f, 130.0f, 120.0f };
7 const Vec sTrampleBinderPos = { 0.0f, 150.0f, 0.0f };
10Poihana::Poihana(
const char *pName) :
LiveActor(pName) {
11 mAnimScaleCtrl =
nullptr;
12 mBindStarPointer =
nullptr;
14 mBindedActor =
nullptr;
15 mLaunchIntensity = 0.0f;
16 mRespawnPos.setInline(0.0f);
19 mHomePos.setInline(0.0f);
22 mBehavior = POIHANA_BEHAVIOR_NORMAL;
24 mWaterColumn =
nullptr;
110void Poihana::initAfterPlacement() {
111 TVec3f gravityNegated;
112 JGeometry::negateInternal((f32 *)&
mGravity, (f32 *)&gravityNegated);
114 MR::makeMtxUpNoSupportPos(&baseMtx, gravityNegated,
mPosition);
115 MR::setBaseTRMtx(
this, baseMtx);
116 MR::calcFrontVec(&mFrontVec,
this);
117 MR::trySetMoveLimitCollision(
this);
120void Poihana::control() {
121 if (!isNerve(&NrvPoihana::PoihanaNrvHide::sInstance)) {
122 mAnimScaleCtrl->updateNerve();
127 if (!tryDrown() && !tryDPDSwoon() && tryHipDropShock()) {
135 MR::calcMtxFromGravityAndZAxis(&baseMtx,
this,
mGravity, mFrontVec);
137 if (isNerveTypeWalkOrWait()) {
138 MR::blendMtx((MtxPtr)
getBaseMtx(), (MtxPtr)&baseMtx, 0.3f, (MtxPtr)&baseMtx);
141 MR::setBaseTRMtx(
this, baseMtx);
144 newScale.multPS(
mScale, mAnimScaleCtrl->_C);
145 MR::setBaseScale(
this, newScale);
149inline void calcRepelVector(
const TVec3f &agent,
const TVec3f &
object, TVec3f& dst) {
150 JMAVECScaleAdd(agent.toCVec(),
object.toCVec(), dst.toVec(), -agent.dot(
object));
156 if (MR::isSensorPlayer(pReceiver) || MR::isSensorEnemy(pReceiver) ||
157 MR::isSensorMapObj(pReceiver)) {
165 if (MR::isSensorEnemy(pSender)) {
166 if (MR::isSensorPlayer(pReceiver)) {
167 contactMario(pSender, pReceiver);
170 if (MR::sendMsgPush(pReceiver, pSender)) {
171 if (MR::isSensorPlayer(pReceiver)) {
173 if (isNerve(&NrvPoihana::PoihanaNrvShock::sInstance) ||
174 isNerve(&NrvPoihana::PoihanaNrvSwoonLand::sInstance) ||
175 isNerve(&NrvPoihana::PoihanaNrvSwoon::sInstance) ||
176 isNerve(&NrvPoihana::PoihanaNrvRecover::sInstance)) {
186 MR::normalizeOrZero(&pushVelocity);
188 if (
mVelocity.dot(pushVelocity) < 0.0f) {
190 calcRepelVector(pushVelocity, velocity,
mVelocity);
197 if (MR::isSensorEnemy(pSender) || MR::isSensorMapObj(pSender)) {
199 MR::normalizeOrZero(&pushOffset);
208bool Poihana::receiveMsgPlayerAttack(u32 msg,
HitSensor *pSender,
HitSensor *pReceiver) {
209 if (MR::isMsgStarPieceAttack(msg)) {
213 if (MR::isMsgPlayerTrample(msg) || MR::isMsgPlayerHipDrop(msg)) {
216 if (isNerve(&NrvPoihana::PoihanaNrvDrown::sInstance) ||
217 isNerve(&NrvPoihana::PoihanaNrvHide::sInstance) ||
218 isNerve(&NrvPoihana::PoihanaNrvAppear::sInstance) ||
219 isNerve(&NrvPoihana::PoihanaNrvShock::sInstance)) {
228 if (isNerve(&NrvPoihana::PoihanaNrvSleepStart::sInstance) ||
229 isNerve(&NrvPoihana::PoihanaNrvSleep::sInstance) ||
230 isNerve(&NrvPoihana::PoihanaNrvGetUp::sInstance)) {
237 MR::startSound(
this,
"SE_EV_POIHANA_TRAMPLE", -1, -1);
239 if (MR::isMsgPlayerHipDrop(msg)) {
240 MR::sendMsgAwayJump(pSender, pReceiver);
246 MR::setSensorOffset(
this,
"binder", sTrampleBinderPos);
247 MR::setSensorRadius(
this,
"binder", 125.0f);
248 MR::validateHitSensor(
this,
"binder");
251 if (MR::isMsgPlayerHitAll(msg) && tryShock()) {
252 MR::stopSceneForDefaultHit(3);
259bool Poihana::receiveMsgEnemyAttack(u32 msg,
HitSensor *pSender,
HitSensor *pReceiver) {
260 if (MR::isMsgExplosionAttack(msg) && tryShock()) {
301void Poihana::exeNonActive() {
302 if (MR::isFirstStep(
this)) {
305 MR::offCalcShadow(
this,
nullptr);
306 MR::offCalcAnim(
this);
310 MR::invalidateHitSensors(
this);
313 if (MR::isNearPlayerAnyTime(
this, 3500.0f)) {
314 if (mBehavior == POIHANA_BEHAVIOR_SLEEP) {
315 setNerve(&NrvPoihana::PoihanaNrvSleep::sInstance);
318 setNerve(&NrvPoihana::PoihanaNrvWait::sInstance);
323void Poihana::endNonActive() {
325 MR::onCalcShadow(
this,
nullptr);
326 MR::onCalcAnim(
this);
330 MR::setSensorOffset(
this,
"binder", sNormalBinderPos);
331 MR::setSensorRadius(
this,
"binder", 125.0f);
332 MR::validateHitSensor(
this,
"binder");
333 MR::validateHitSensors(
this);
336void Poihana::exeWait() {
337 if (MR::isFirstStep(
this)) {
338 MR::startBckNoInterpole(
this,
"Wait");
339 MR::setSensorOffset(
this,
"binder", sNormalBinderPos);
340 MR::setSensorRadius(
this,
"binder", 125.0f);
341 MR::validateHitSensor(
this,
"binder");
344 if (MR::isNearPlayer(
this, 800.0f)) {
345 setNerve(&NrvPoihana::PoihanaNrvSearch::sInstance);
347 else if (MR::isGreaterStep(
this, 180)) {
348 setNerve(&NrvPoihana::PoihanaNrvWalkAround::sInstance);
355void Poihana::exeWalkAround() {
356 if (MR::isFirstStep(
this)) {
357 if (!MR::isBckPlaying(
this,
"Walk")) {
358 MR::startBck(
this,
"Walk",
nullptr);
361 mRandDir = MR::getRandom((s32)-2, (s32)2);
364 MR::rotateVecDegree(&mFrontVec,
mGravity, mRandDir);
367 if (isNeedForBackHome()) {
368 setNerve(&NrvPoihana::PoihanaNrvGoBack::sInstance);
371 else if (MR::isNearPlayer(
this, 800.0f)) {
372 setNerve(&NrvPoihana::PoihanaNrvSearch::sInstance);
375 else if (MR::isGreaterStep(
this, 120)) {
376 if (mBehavior == POIHANA_BEHAVIOR_SLEEP) {
377 setNerve(&NrvPoihana::PoihanaNrvSleepStart::sInstance);
380 setNerve(&NrvPoihana::PoihanaNrvWait::sInstance);
385void Poihana::exeSleepStart() {
386 if (MR::isFirstStep(
this)) {
387 MR::startBck(
this,
"SleepStart",
nullptr);
388 MR::startSound(
this,
"SE_EV_POIHANA_SLEEP_START", -1, -1);
389 MR::invalidateHitSensor(
this,
"binder");
392 if (MR::isBckStopped(
this)) {
393 setNerve(&NrvPoihana::PoihanaNrvSleep::sInstance);
397void Poihana::exeSleep() {
398 if (MR::isFirstStep(
this)) {
399 MR::startBck(
this,
"Sleep",
nullptr);
400 MR::invalidateHitSensor(
this,
"binder");
403 if (isNeedForGetUp()) {
404 setNerve(&NrvPoihana::PoihanaNrvGetUp::sInstance);
411void Poihana::exeGetUp() {
412 if (MR::isFirstStep(
this)) {
413 MR::startBck(
this,
"GetUp",
nullptr);
414 MR::startSound(
this,
"SE_EV_POIHANA_WAKEUP", -1, -1);
415 MR::startSound(
this,
"SE_EM_POIHANA_WAKEUP", -1, -1);
418 if (MR::isBckStopped(
this)) {
419 MR::setSensorOffset(
this,
"binder", sNormalBinderPos);
420 MR::setSensorRadius(
this,
"binder", 125.0f);
421 MR::validateHitSensor(
this,
"binder");
422 setNerve(&NrvPoihana::PoihanaNrvWait::sInstance);
426void Poihana::exeSearch() {
427 if (MR::isFirstStep(
this)) {
428 MR::startBck(
this,
"Search",
nullptr);
429 MR::startSound(
this,
"SE_EV_POIHANA_FIND", -1, -1);
432 MR::turnDirectionToTargetUseGroundNormalDegree(
this, &mFrontVec, *MR::getPlayerPos(), 4.0f);
434 if (MR::isBckStopped(
this)) {
435 setNerve(&NrvPoihana::PoihanaNrvChasePlayer::sInstance);
439void Poihana::exeChasePlayer() {
440 if (MR::isFirstStep(
this)) {
441 MR::startBck(
this,
"Run",
nullptr);
442 MR::setSensorOffset(
this,
"binder", sNormalBinderPos);
443 MR::setSensorRadius(
this,
"binder", 125.0f);
444 MR::validateHitSensor(
this,
"binder");
447 MR::turnDirectionToTargetUseGroundNormalDegree(
this, &mFrontVec, *MR::getPlayerPos(), 4.0f);
450 if (isNeedForBackHome()) {
451 setNerve(&NrvPoihana::PoihanaNrvGoBack::sInstance);
455void Poihana::exeShootUpCharge() {
456 if (MR::isFirstStep(
this)) {
457 MR::startBck(
this,
"ThrowStart",
nullptr);
464 if (MR::isBckStopped(
this)) {
465 setNerve(&NrvPoihana::PoihanaNrvShootUp::sInstance);
501void Poihana::endShootUp() {
504 MR::setSensorOffset(
this,
"binder", sNormalBinderPos);
505 MR::setSensorRadius(
this,
"binder", 125.0f);
506 MR::validateHitSensor(
this,
"binder");
508 MR::endActorCamera(
this, mCamInfo,
true, -1);
511void Poihana::exeGoBack() {
512 if (MR::isFirstStep(
this) && !MR::isBckPlaying(
this,
"Walk")) {
513 MR::startBck(
this,
"Walk",
nullptr);
516 MR::turnDirectionToTargetUseGroundNormalDegree(
this, &mFrontVec, mHomePos, 2.0f);
519 if (MR::isNearPlayer(
this, 800.0f) && MR::isGreaterStep(
this, 120)) {
520 setNerve(&NrvPoihana::PoihanaNrvSearch::sInstance);
522 else if (MR::isNear(
this, mHomePos, 100.0f)) {
523 setNerve(&NrvPoihana::PoihanaNrvWait::sInstance);
527void Poihana::exeShock() {
528 if (MR::isFirstStep(
this)) {
529 MR::startBck(
this,
"PunchDamage",
nullptr);
530 MR::startBlowHitSound(
this);
531 MR::invalidateHitSensor(
this,
"binder");
534 if (MR::isOnGround(
this) && MR::isGreaterStep(
this, 12)) {
535 setNerve(&NrvPoihana::PoihanaNrvSwoon::sInstance);
539void Poihana::exeSwoonLand() {
540 if (MR::isFirstStep(
this)) {
541 MR::startBckNoInterpole(
this,
"SwoonLand");
542 MR::startSound(
this,
"SE_EV_POIHANA_SWOON", -1, -1);
545 if (MR::isBckStopped(
this)) {
546 setNerve(&NrvPoihana::PoihanaNrvSwoon::sInstance);
550void Poihana::exeSwoon() {
551 if (MR::isFirstStep(
this)) {
552 MR::startBck(
this,
"Swoon",
nullptr);
555 MR::startLevelSound(
this,
"SE_EM_LV_SWOON_S", -1, -1, -1);
557 if (MR::isStep(
this, 110)) {
558 setNerve(&NrvPoihana::PoihanaNrvRecover::sInstance);
562void Poihana::exeRecover() {
563 if (MR::isFirstStep(
this)) {
564 MR::startBck(
this,
"Recover",
nullptr);
565 MR::startSound(
this,
"SE_EM_POIHANA_RECOVER", -1, -1);
566 MR::startSound(
this,
"SE_EV_POIHANA_RECOVER", -1, -1);
570 if (MR::isBckStopped(
this)) {
571 MR::setSensorOffset(
this,
"binder", sNormalBinderPos);
572 MR::setSensorRadius(
this,
"binder", 125.0f);
573 MR::validateHitSensor(
this,
"binder");
574 setNerve(&NrvPoihana::PoihanaNrvWait::sInstance);
579void Poihana::exeShake() {
580 f32 _f31 = 0.2f - 0.01f * getNerveStep();
581 f32 scale = MR::sinDegree(getNerveStep() * 0.01745329251f) * _f31 + 36.0f;
584 if (MR::isStep(
this, 20)) {
586 setNerve(&NrvPoihana::PoihanaNrvSearch::sInstance);
590void Poihana::exeDrown() {
591 if (MR::isFirstStep(
this)) {
592 MR::startBck(
this,
"Drown",
nullptr);
593 MR::invalidateClipping(
this);
594 MR::invalidateHitSensors(
this);
595 MR::startSound(
this,
"SE_EM_FALL_INTO_WATER_S", -1, -1);
597 mWaterColumn->appear();
598 MR::tryStartAllAnim(mWaterColumn,
"Splash");
601 if (MR::isBckStopped(
this)) {
602 setNerve(&NrvPoihana::PoihanaNrvHide::sInstance);
606void Poihana::exeHide() {
607 if (MR::isFirstStep(
this)) {
608 MR::startSound(
this,
"SE_EM_EXPLODE_S_WATER", -1, -1);
609 MR::emitEffect(
this,
"DeathWater");
613 if (MR::isStep(
this, 150)) {
614 setNerve(&NrvPoihana::PoihanaNrvAppear::sInstance);
618void Poihana::exeAppear() {
619 if (MR::isFirstStep(
this)) {
620 MR::resetPosition(
this, mRespawnPos);
621 MR::emitEffect(
this,
"Appear");
624 if (MR::isLessStep(
this, 60)) {
625 MR::startLevelSound(
this,
"SE_EM_LV_POIHANA_REVIVE_EFFECT", -1, -1, -1);
628 if (MR::isStep(
this, 60)) {
630 MR::startBck(
this,
"Appear",
nullptr);
631 MR::startSound(
this,
"SE_EM_POIHANA_REVIVE_APPEAR", -1, -1);
633 else if (MR::isBckStopped(
this) && MR::isGreaterStep(
this, 60)) {
634 MR::validateClipping(
this);
635 MR::validateHitSensors(
this);
636 MR::setSensorOffset(
this,
"binder", sNormalBinderPos);
637 MR::setSensorRadius(
this,
"binder", 125.0f);
638 MR::validateHitSensor(
this,
"binder");
639 setNerve(&NrvPoihana::PoihanaNrvWait::sInstance);
643void Poihana::exeDPDSwoon() {
644 if (MR::isFirstStep(
this)) {
645 MR::invalidateHitSensor(
this,
"Binder");
649 &NrvPoihana::PoihanaNrvWait::sInstance);
652void Poihana::endDPDSwoon() {
653 mBindStarPointer->kill();
655 MR::setSensorOffset(
this,
"binder", sNormalBinderPos);
656 MR::setSensorRadius(
this,
"binder", 125.0f);
657 MR::validateHitSensor(
this,
"binder");
660bool Poihana::tryToStartBind(
HitSensor* pSender) {
661 if (mBindedActor !=
nullptr) {
665 LiveActor *bindedActor = pSender->mActor;
666 if (MR::isInWater(bindedActor, TVec3f(0.0f, 0.0f, 0.0f))) {
670 MR::tryRumblePadMiddle(
this, 0);
671 mBindedActor = pSender->mActor;
672 MR::startBckPlayer(
"Rise", (
const char *)
nullptr);
673 MR::invalidateClipping(
this);
677void Poihana::updateBindActorMtx() {
679 MR::makeMtxTR(binderMtx.toMtxPtr(), mBindedActor);
680 MR::setBaseTRMtx(mBindedActor, binderMtx);
683void Poihana::endBind() {
684 MR::validateClipping(
this);
686 if (MR::isPlayerInRush()) {
688 jumpVec.scale(-mLaunchIntensity,
mGravity);
689 MR::endBindAndPlayerJump(
this, jumpVec, 0);
690 MR::startSound(
this,
"SE_PM_HELI_JUMP", -1, -1);
693 mBindedActor =
nullptr;
696void Poihana::startBound() {
726 if (!isNerveTypeWalkOrWait()) {
728 if (isNerve(&NrvPoihana::PoihanaNrvShootUpCharge::sInstance) ||
729 isNerve(&NrvPoihana::PoihanaNrvShootUp::sInstance)) {
738 if (!isBackAttack(pReceiver)) {
742 if (MR::sendMsgEnemyAttackFlipWeak(pReceiver, pSender)) {
743 setNerve(&NrvPoihana::PoihanaNrvShake::sInstance);
745 }
else if (isNerve(&NrvPoihana::PoihanaNrvSleep::sInstance)) {
746 setNerve(&NrvPoihana::PoihanaNrvGetUp::sInstance);
806void Poihana::calcMyGravity() {
811 TVec3f upVec, gravityPos;
812 MR::calcUpVec(&upVec,
this);
813 JMAVECScaleAdd(upVec.toCVec(),
mPosition.toCVec(), gravityPos.toVec(), 20.0f);
814 MR::calcGravity(
this, gravityPos);
817bool Poihana::tryNonActive() {
818 if (!MR::isStageStateScenarioOpeningCamera()) {
819 bool notNear = !MR::isNearPlayerAnyTime(
this, 3500.0f);
820 if (notNear && MR::isBindedGround(
this)) {
821 setNerve(&NrvPoihana::PoihanaNrvNonActive::sInstance);
829bool Poihana::tryDrown() {
834 if (isNerve(&NrvPoihana::PoihanaNrvAppear::sInstance)) {
838 if (isNerve(&NrvPoihana::PoihanaNrvDrown::sInstance)) {
842 if (!MR::isInWater(
this, TVec3f(0.0f, 0.0f, 0.0f))) {
846 setNerve(&NrvPoihana::PoihanaNrvDrown::sInstance);
850bool Poihana::tryDPDSwoon() {
851 if (!isNerveTypeWalkOrWait()) {
855 if (!mBindStarPointer->tryStartPointBind()) {
859 setNerve(&NrvPoihana::PoihanaNrvDPDSwoon::sInstance);
863bool Poihana::tryShock() {
866 if (isNerve(&NrvPoihana::PoihanaNrvDrown::sInstance) ||
867 isNerve(&NrvPoihana::PoihanaNrvHide::sInstance) ||
868 isNerve(&NrvPoihana::PoihanaNrvAppear::sInstance)) {
876 if (isNerve(&NrvPoihana::PoihanaNrvShock::sInstance)) {
880 if (isNerve(&NrvPoihana::PoihanaNrvSwoonLand::sInstance)) {
885 setNerve(&NrvPoihana::PoihanaNrvShock::sInstance);
889bool Poihana::tryHipDropShock() {
890 bool isNotNear = !MR::isNearPlayerAnyTime(
this, 500.0f);
896 if (MR::isPlayerHipDropLand()) {
903bool Poihana::isNerveTypeWalkOrWait()
const {
904 return (isNerve(&NrvPoihana::PoihanaNrvWait::sInstance) ||
905 isNerve(&NrvPoihana::PoihanaNrvSearch::sInstance) ||
906 isNerve(&NrvPoihana::PoihanaNrvWalkAround::sInstance) ||
907 isNerve(&NrvPoihana::PoihanaNrvChasePlayer::sInstance) ||
908 isNerve(&NrvPoihana::PoihanaNrvGoBack::sInstance));
911bool Poihana::isNeedForBackHome()
const {
912 if (isNerve(&NrvPoihana::PoihanaNrvWalkAround::sInstance)) {
913 return !MR::isNear(
this, mHomePos, 350.0f);
916 if (!isNerve(&NrvPoihana::PoihanaNrvChasePlayer::sInstance)) {
918 if (mBehavior == POIHANA_BEHAVIOR_NEW_HOME) {
919 ret = !MR::isNearPlayer(
this, 1100.0f);
922 if (!MR::isNear(
this, mHomePos, 2000.0f) || !MR::isNearPlayer(
this, 1110.0f)) {
933bool Poihana::isNeedForGetUp()
const {
936 if (MR::isNearPlayer(
this, 500.0f)) {
939 f32 mag = PSVECMag((Vec *)MR::getPlayerVelocity());
941 if (!(mag >= 10.0f) && !MR::isPlayerSwingAction()) {
953bool Poihana::isBackAttack(
HitSensor *pMySensor)
const {
955 MR::calcFrontVec(&frontVec,
this);
956 JGeometry::negateInternal((f32 *)&frontVec, (f32 *)&frontVec);
958 TVec3f sensorRelative(pMySensor->mPosition -
mPosition);
959 return sensorRelative.dot(frontVec) > 0.0f;
962namespace NrvPoihana {
963 INIT_NERVE(PoihanaNrvNonActive);
964 INIT_NERVE(PoihanaNrvWait);
965 INIT_NERVE(PoihanaNrvWalkAround);
966 INIT_NERVE(PoihanaNrvSleepStart);
967 INIT_NERVE(PoihanaNrvSleep);
968 INIT_NERVE(PoihanaNrvGetUp);
969 INIT_NERVE(PoihanaNrvSearch);
970 INIT_NERVE(PoihanaNrvChasePlayer);
971 INIT_NERVE(PoihanaNrvShootUpCharge);
972 INIT_NERVE(PoihanaNrvShootUp);
973 INIT_NERVE(PoihanaNrvGoBack);
974 INIT_NERVE(PoihanaNrvShock);
975 INIT_NERVE(PoihanaNrvSwoon);
976 INIT_NERVE(PoihanaNrvSwoonLand);
977 INIT_NERVE(PoihanaNrvRecover);
978 INIT_NERVE(PoihanaNrvShake);
979 INIT_NERVE(PoihanaNrvDrown);
980 INIT_NERVE(PoihanaNrvHide);
981 INIT_NERVE(PoihanaNrvAppear);
982 INIT_NERVE(PoihanaNrvDPDSwoon);
984 void PoihanaNrvNonActive::execute(
Spine *pSpine)
const {
986 pActor->exeNonActive();
989 void PoihanaNrvNonActive::executeOnEnd(
Spine *pSpine)
const {
991 pActor->endNonActive();
994 void PoihanaNrvWait::execute(
Spine *pSpine)
const {
999 void PoihanaNrvWalkAround::execute(
Spine *pSpine)
const {
1001 pActor->exeWalkAround();
1004 void PoihanaNrvSleepStart::execute(
Spine *pSpine)
const {
1006 pActor->exeSleepStart();
1009 void PoihanaNrvSleep::execute(
Spine *pSpine)
const {
1014 void PoihanaNrvGetUp::execute(
Spine *pSpine)
const {
1019 void PoihanaNrvSearch::execute(
Spine *pSpine)
const {
1021 pActor->exeSearch();
1024 void PoihanaNrvChasePlayer::execute(
Spine *pSpine)
const {
1026 pActor->exeChasePlayer();
1029 void PoihanaNrvShootUpCharge::execute(
Spine *pSpine)
const {
1031 pActor->exeShootUpCharge();
1034 void PoihanaNrvShootUp::execute(
Spine *pSpine)
const {
1036 pActor->exeShootUp();
1039 void PoihanaNrvShootUp::executeOnEnd(
Spine *pSpine)
const {
1041 pActor->endShootUp();
1044 void PoihanaNrvGoBack::execute(
Spine *pSpine)
const {
1046 pActor->exeGoBack();
1049 void PoihanaNrvShock::execute(
Spine *pSpine)
const {
1054 void PoihanaNrvSwoon::execute(
Spine *pSpine)
const {
1059 void PoihanaNrvSwoonLand::execute(
Spine *pSpine)
const {
1061 pActor->exeSwoonLand();
1064 void PoihanaNrvRecover::execute(
Spine *pSpine)
const {
1066 pActor->exeRecover();
1069 void PoihanaNrvShake::execute(
Spine *pSpine)
const {
1074 void PoihanaNrvDrown::execute(
Spine *pSpine)
const {
1079 void PoihanaNrvHide::execute(
Spine *pSpine)
const {
1084 void PoihanaNrvAppear::execute(
Spine *pSpine)
const {
1086 pActor->exeAppear();
1089 void PoihanaNrvDPDSwoon::execute(
Spine *pSpine)
const {
1091 pActor->exeDPDSwoon();
1094 void PoihanaNrvDPDSwoon::executeOnEnd(
Spine *pSpine)
const {
1096 pActor->endDPDSwoon();
The basis of a drawable actor that can contain states (see: Nerve)
TVec3f mPosition
3D vector of the actor's position.
TVec3f mScale
3D vector of the actor's scale.
TVec3f mVelocity
3D vector of the actor's velocity.
TVec3f mGravity
3D vector of the actor's gravity.
virtual MtxPtr getBaseMtx() const
Gets the base matrix of the model used for the actor.
virtual void calcAndSetBaseMtx()
Calculates and sets the base matrix of the actor.