SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
Coin.cpp
1#include "Game/MapObj/Coin.hpp"
2#include "Game/MapObj/CoinHolder.hpp"
3#include "Game/MapObj/CoinRotater.hpp"
4#include "Game/MapObj/PurpleCoinHolder.hpp"
5#include "Game/Util.hpp"
6#include "JSystem/JMath/JMath.hpp"
7
8Coin::Coin(const char *pName) : LiveActor(pName) {
9 mHostInfo = nullptr;
10 mFlashCtrl = nullptr;
11 mAirBubble = nullptr;
12 mDropPosition.x = 0.0f;
13 mDropPosition.y = 0.0f;
14 mDropPosition.z = 0.0f;
15 mClippingRange.x = 0.0f;
16 mClippingRange.y = 0.0f;
17 mClippingRange.z = 0.0f;
18 _B0 = 600;
19 mCannotTime = 0;
20 mIsInWater = false;
21 _B9 = false;
22 _BA = false;
23 mIsPurpleCoin = false;
24 mIsNeedBubble = false;
25}
26
27void Coin::init(const JMapInfoIter &rIter) {
28 MR::initDefaultPos(this, rIter);
29 initModelManagerWithAnm(mIsPurpleCoin ? "PurpleCoin" : "Coin", nullptr, false);
30 MR::connectToSceneItemStrongLight(this);
31 initHitSensor(1);
32 MR::addHitSensor(this, "coin", 0x4A, 4, 55.0f, TVec3f(0.0f, 70.0f, 0.0f));
33 initBinder(55.0f, 70.0f, 0);
34 MR::setBinderExceptSensorType(this, &mPosition, 10.0f);
35 MR::setClippingFar100m(this);
36 initEffectKeeper(0, nullptr, false);
37 initSound(1, false);
38
39 if (MR::isValidInfo(rIter)) {
40 setShadowAndPoseModeFromJMapIter(rIter);
41 }
42
43 if (_BA) {
44 TVec3f axis;
45 MR::calcActorAxisY(&axis, this);
46 mGravity.set<f32>(-axis);
47 }
48
49 initShadow(rIter);
50
51 if (mIsNeedBubble) {
52 mAirBubble = MR::createPartsModelNoSilhouettedMapObj(this, "アワ", "AirBubble", nullptr);
53 mAirBubble->initFixedPosition(TVec3f(0.0f, 70.0f, 0.0f), TVec3f(0.0f, 0.0f, 0.0f), nullptr);
54 mAirBubble->makeActorDead();
55 MR::registerDemoSimpleCastAll(mAirBubble);
56 MR::startBck(mAirBubble, "Move", nullptr);
57 }
58
59 mFlashCtrl = new FlashingCtrl(this, true);
60 MR::tryCreateMirrorActor(this, mIsPurpleCoin ? "PurpleCoin" : "Coin");
61 initNerve(&NrvCoin::CoinNrvFix::sInstance);
62
63 if (MR::isValidInfo(rIter)) {
64 if (MR::useStageSwitchReadAppear(this, rIter)) {
65 MR::syncStageSwitchAppear(this);
66 makeActorDead();
67 }
68 else {
69 appearFixInit();
70 }
71
72 if (MR::useStageSwitchReadB(this, rIter)) {
73 MR::FunctorV0M<Coin *, void (Coin::*)()> deadFunc = MR::Functor<Coin>(this, &Coin::makeActorDead);
74 MR::listenStageSwitchOnB(this, deadFunc);
75 }
76 }
77 else {
78 makeActorDead();
79 }
80
81 MR::useStageSwitchSleep(this, rIter);
82}
83
84void Coin::initAfterPlacement() {
85 MR::setClippingRangeIncludeShadow(this, &mClippingRange, 150.0f);
86}
87
88void Coin::initShadow(const JMapInfoIter &rIter) {
89 f32 arg_5 = -1.0f;
90 s32 arg_6 = -1;
91
92 if (MR::isValidInfo(rIter)) {
93 MR::getJMapInfoArg5NoInit(rIter, &arg_5);
94 MR::getJMapInfoArg6NoInit(rIter, &arg_6);
95 }
96
97 switch (arg_6) {
98 case 0:
99 MR::initShadowSurfaceCircle(this, 50.0f);
100 break;
101 case 1:
102 MR::initShadowVolumeCylinder(this, 50.0f);
103 break;
104 default:
105 MR::initShadowVolumeSphere(this, 50.0f);
106 break;
107 }
108
109 MR::setShadowDropPositionPtr(this, nullptr, &mDropPosition);
110
111 if (arg_5 > 0.0f) {
112 MR::setShadowDropLength(this, nullptr, arg_5);
113 }
114}
115
116void Coin::setShadowAndPoseModeFromJMapIter(const JMapInfoIter &rIter) {
117 bool arg_3 = false;
118 MR::getJMapInfoArg3WithInit(rIter, &arg_3);
119 _B9 = arg_3;
120 bool arg_4 = false;
121 MR::getJMapInfoArg4WithInit(rIter, &arg_4);
122 _BA = arg_4;
123 mIsNeedBubble = Coin::isNeedBubble(rIter);
124}
125
126void Coin::makeActorAppeared() {
127 MR::offCalcGravity(this);
128
129 if (!_BA) {
130 MR::calcGravityOrZero(this);
131 }
132
133 if (!mIsPurpleCoin && MR::isGalaxyDarkCometAppearInCurrentStage()) {
134 LiveActor::makeActorDead();
135 }
136 else {
137 LiveActor::makeActorAppeared();
138
139 if (mIsNeedBubble) {
140 mAirBubble->makeActorAppeared();
141 MR::setSensorRadius(this, "coin", 150.0f);
142 }
143 else {
144 MR::setSensorRadius(this, "coin", 55.0f);
145 }
146
147 mFlashCtrl->end();
148 setCalcShadowMode();
149 MR::validateShadow(this, nullptr);
150
151 if (!mIsPurpleCoin) {
152 mHostInfo->_8++;
153 }
154
155 mIsInWater = MR::isInWater(mPosition);
156 }
157}
158
159void Coin::makeActorDead() {
160 LiveActor::makeActorDead();
161 if (mAirBubble) {
162 mAirBubble->makeActorDead();
163 }
164}
165
167 TVec3f another_vec;
168 another_vec.set<f32>(MR::isNearZero(mGravity, 0.001f) ? TVec3f(0.0f, 1.0f, 0.0f) : -mGravity);
169 JMAVECScaleAdd(another_vec.toCVec(), mPosition.toCVec(), mDropPosition.toVec(), 70.0f);
170
171 TPos3f pos;
172
173 if (_BA) {
174 MR::makeMtxTR(pos.toMtxPtr(), this);
175 }
176 else {
177 MR::makeMtxUpNoSupportPos(&pos, another_vec, mPosition);
178 }
179
180 if (isNerve(&NrvCoin::CoinNrvSpinDrained::sInstance)) {
181 pos.concat(pos, MR::getCoinHiSpeedRotateYMatrix());
182 }
183 else {
184 if (mIsInWater) {
185 pos.concat(pos, MR::getCoinInWaterRotateYMatrix());
186 }
187 else {
188 pos.concat(pos, MR::getCoinRotateYMatrix());
189 }
190 }
191
192 MR::setBaseTRMtx(this, pos);
193}
194
195bool Coin::receiveOtherMsg(u32 msg, HitSensor *, HitSensor *) {
196 bool result;
197
198 if (MR::isMsgItemGet(msg)) {
199 noticeGetCoin();
200 MR::emitEffect(this, "CoinGet");
201 mFlashCtrl->end();
202 kill();
203 result = true;
204 }
205 else if (MR::isMsgItemPull(msg)) {
206 result = requestSpinDrain();
207 }
208 else if (MR::isMsgItemShow(msg)) {
209 result = requestShow();
210 }
211 else if (MR::isMsgItemHide(msg)) {
212 result = requestHide();
213 }
214 else if (MR::isMsgItemStartMove(msg)) {
215 result = requestStartControl();
216 }
217 else if (MR::isMsgItemEndMove(msg)) {
218 result = requestEndControl();
219 }
220 else if (MR::isMsgInhaleBlackHole(msg)) {
221 kill();
222 result = true;
223 }
224 else {
225 result = false;
226 }
227
228 return result;
229}
230
231void Coin::exeNonActive() {
232 if (MR::isFirstStep(this) || _B9) {
233 MR::setClippingRangeIncludeShadow(this, &mClippingRange, 150.0f);
234 }
235}
236
237void Coin::exeFix() {
238 if (MR::isFirstStep(this) || _B9) {
239 MR::setClippingRangeIncludeShadow(this, &mClippingRange, 150.0f);
240 }
241}
242
243void Coin::exeFixTimer() {
244 if (MR::isFirstStep(this)) {
245 mFlashCtrl->start(_B0);
246 MR::invalidateClipping(this);
247 MR::offBind(this);
248 }
249
250 if (MR::isStep(this, mCannotTime)) {
251 MR::validateHitSensors(this);
252 }
253
254 if (mFlashCtrl->mIsEnded) {
255 kill();
256 }
257}
258
259void Coin::exeMove() {
260 if (MR::isFirstStep(this)) {
261 mFlashCtrl->start(_B0);
262 MR::onCalcShadow(this, nullptr);
263 MR::onCalcShadowDropPrivateGravity(this, nullptr);
264 }
265
266 if (MR::isStep(this, mCannotTime)) {
267 MR::validateHitSensors(this);
268 }
269
270 if (MR::isGreaterEqualStep(this, mCannotTime) && MR::isBindedGroundDamageFire(this)) {
271 MR::emitEffect(this, "LavaFall");
272 MR::startSound(this, "SE_OJ_FALL_IN_MAGMA_S", -1, -1);
273 kill();
274 }
275 else {
276 if (MR::isInDeath(this, TVec3f(0.0f, 0.0f, 0.0f))) {
277 kill();
278 }
279 else {
280 MR::calcGravityOrZero(this);
281
282 if (MR::isPressedRoofAndGround(this)) {
283 MR::offBind(this);
284 MR::zeroVelocity(this);
285 }
286
287 if (!MR::isNoBind(this)) {
288 calcRebouond();
289 mVelocity += mGravity * (mIsInWater ? 0.30000001f : 1.0f);
290 attenuateVelocity();
291 }
292
293 if (mFlashCtrl->mIsEnded) {
294 kill();
295 }
296 }
297 }
298}
299
300void Coin::exeControled() {
301 if (MR::isFirstStep(this)) {
302 MR::onCalcShadow(this, nullptr);
303 MR::onCalcShadowDropPrivateGravity(this, nullptr);
304 }
305
306 MR::zeroVelocity(this);
307}
308
309void Coin::exeSpinDrained() {
310 if (MR::isFirstStep(this)) {
311 MR::onCalcShadow(this, nullptr);
312 MR::onCalcShadowDropPrivateGravity(this, nullptr);
313 }
314
315 MR::emitEffect(this, "CoinSpinBlur");
316}
317
318void Coin::exeHop() {
319 if (MR::isFirstStep(this)) {
320 noticeGetCoin();
321 }
322
324
325 if (MR::isGreaterStep(this, 30)) {
326 MR::emitEffect(this, "CoinGet");
327 mFlashCtrl->end();
328 kill();
329 }
330}
331
332void Coin::appear() {
333 appearFix();
334}
335
336void Coin::appearFixInit() {
337 makeActorAppeared();
338 MR::validateClipping(this);
339 MR::validateHitSensors(this);
340 MR::offBind(this);
341 mCannotTime = 0;
342 setNerve(&NrvCoin::CoinNrvFix::sInstance);
343}
344
345void Coin::appearFix() {
346 makeActorAppeared();
347 MR::validateClipping(this);
348 MR::validateHitSensors(this);
349 MR::offBind(this);
350 mCannotTime = 0;
351 setNerve(&NrvCoin::CoinNrvFix::sInstance);
352}
353
354void Coin::appearControlPose() {
355 makeActorAppeared();
356 MR::validateClipping(this);
357 MR::validateHitSensors(this);
358 MR::offBind(this);
359 MR::calcGravityOrZero(this);
360 mCannotTime = 0;
361 setNerve(&NrvCoin::CoinNrvControled::sInstance);
362}
363
364void Coin::appearNonActive() {
365 makeActorAppeared();
366 MR::validateClipping(this);
367 MR::invalidateHitSensors(this);
368 MR::offBind(this);
369 mCannotTime = 0;
370 setNerve(&NrvCoin::CoinNrvNonActive::sInstance);
371}
372
373void Coin::appearFixTimer(s32 a1, s32 a2) {
374 makeActorAppeared();
375 MR::invalidateClipping(this);
376 MR::invalidateHitSensors(this);
377 MR::offBind(this);
378 setLife(a1);
379 setCannotTime(a2);
380 setNerve(&NrvCoin::CoinNrvFixTimer::sInstance);
381}
382
383void Coin::appearMove(const TVec3f &a1, const TVec3f &a2, s32 a3, s32 a4) {
384 mPosition.set<f32>(a1);
385 makeActorAppeared();
386 MR::invalidateClipping(this);
387 MR::invalidateHitSensors(this);
388 MR::onBind(this);
389 MR::onCalcShadow(this, nullptr);
390 mVelocity.set<f32>(a2);
391
392 TVec3f stack_14;
393 if (MR::normalizeOrZero(a2, &stack_14)) {
394 mGravity.x = 0.0f;
395 mGravity.y = -1.0f;
396 mGravity.z = 0.0f;
397 }
398 else {
399 mGravity.set(-stack_14);
400 }
401
402 MR::calcGravityOrZero(this);
403 setLife(a3);
404 setCannotTime(a4);
405 setNerve(&NrvCoin::CoinNrvMove::sInstance);
406}
407
408void Coin::appearHop(const TVec3f &a1, const TVec3f &a2) {
409 if (MR::isNearZero(a2, 0.001f)) {
410 mGravity.x = 0.0f;
411 mGravity.y = -1.0f;
412 mGravity.z = 0.0f;
413 }
414 else {
415 MR::normalize(-a2, &mGravity);
416 }
417
418 mPosition.set(a1);
419 makeActorAppeared();
420 MR::invalidateClipping(this);
421 MR::invalidateHitSensors(this);
422 MR::offBind(this);
423 MR::invalidateShadow(this, nullptr);
424 mVelocity.set<f32>(a2 * 30.0f);
425 mCannotTime = 0;
426 setNerve(&NrvCoin::CoinNrvHop::sInstance);
427}
428
429bool Coin::requestActive() {
430 if (isNerve(&NrvCoin::CoinNrvNonActive::sInstance)) {
431 MR::invalidateHitSensors(this);
432 setNerve(&NrvCoin::CoinNrvFix::sInstance);
433 return true;
434 }
435
436 return false;
437}
438
439bool Coin::requestActiveWithGravity() {
440 if (isNerve(&NrvCoin::CoinNrvNonActive::sInstance)) {
441 MR::invalidateClipping(this);
442 MR::validateHitSensors(this);
443 MR::onBind(this);
444 MR::calcGravityOrZero(this);
445 mVelocity.set<f32>(-mGravity * 30.0f);
446 setNerve(&NrvCoin::CoinNrvMove::sInstance);
447 return true;
448 }
449
450 return false;
451}
452
453bool Coin::requestDeactive() {
454 if (!MR::isDead(this) && isNerve(&NrvCoin::CoinNrvFix::sInstance)) {
455 MR::invalidateHitSensors(this);
456 setNerve(&NrvCoin::CoinNrvNonActive::sInstance);
457 return true;
458 }
459
460 return false;
461}
462
463bool Coin::requestStartControl() {
464 if (MR::isDead(this)) {
465 return false;
466 }
467
468 if (!isNerve(&NrvCoin::CoinNrvFix::sInstance) && !isNerve(&NrvCoin::CoinNrvFixHide::sInstance)) {
469 return false;
470 }
471
472 if (isNerve(&NrvCoin::CoinNrvFixHide::sInstance)) {
473 MR::showModel(this);
474 }
475
476 MR::validateClipping(this);
477 MR::invalidateHitSensors(this);
478 MR::offBind(this);
479 MR::onCalcShadow(this, nullptr);
480 setNerve(&NrvCoin::CoinNrvControled::sInstance);
481 mFlashCtrl->end();
482 return true;
483}
484
485bool Coin::requestEndControl() {
486 if (MR::isDead(this) || !isNerve(&NrvCoin::CoinNrvControled::sInstance)) {
487 return false;
488 }
489
490 MR::validateClipping(this);
491 MR::validateHitSensors(this);
492 MR::offBind(this);
493 MR::offCalcShadow(this, nullptr);
494 setCalcShadowMode();
495 mCannotTime = 0;
496 setNerve(&NrvCoin::CoinNrvFix::sInstance);
497 return true;
498}
499
500bool Coin::requestSpinDrain() {
501 if (isNerve(&NrvCoin::CoinNrvSpinDrained::sInstance)) {
502 return false;
503 }
504
505 if (mIsNeedBubble) {
506 return false;
507 }
508
509 MR::invalidateClipping(this);
510 MR::offBind(this);
511 MR::validateHitSensors(this);
512 setNerve(&NrvCoin::CoinNrvSpinDrained::sInstance);
513 mFlashCtrl->end();
514 return true;
515}
516
517bool Coin::requestShow() {
518 if (isNerve(&NrvCoin::CoinNrvFixHide::sInstance) && !MR::isDead(this)) {
519 MR::showModel(this);
520 MR::validateHitSensors(this);
521 setNerve(&NrvCoin::CoinNrvFix::sInstance);
522 }
523
524 return false;
525}
526
527bool Coin::requestHide() {
528 if (isNerve(&NrvCoin::CoinNrvFix::sInstance) && !MR::isDead(this)) {
529 MR::hideModel(this);
530 MR::invalidateHitSensors(this);
531 setNerve(&NrvCoin::CoinNrvFixHide::sInstance);
532 }
533
534 return false;
535}
536
537void Coin::noticeGetCoin() {
538 if (mIsNeedBubble) {
539 MR::emitEffect(mAirBubble, "RecoveryBubbleBreak");
540 MR::incPlayerOxygen(8);
541 mAirBubble->kill();
542 mIsNeedBubble = false;
543 }
544
545 if (mIsPurpleCoin) {
546 MR::incPurpleCoin();
547 MR::startSystemSE("SE_SY_PURPLE_COIN", -1, -1);
548 }
549 else {
550 MR::incCoin(1);
551 MR::startSystemSE("SE_SY_COIN", -1, -1);
552 mHostInfo->_C++;
553 }
554}
555
556void Coin::setLife(s32 life) {
557 if (life < 0) {
558 _B0 = 0x258;
559 }
560 else {
561 _B0 = life;
562 }
563}
564
565void Coin::setHostInfo(CoinHostInfo *pInfo) {
566 mHostInfo = pInfo;
567}
568
569void Coin::setCalcShadowMode() {
570 if (_B9) {
571 MR::onCalcShadow(this, nullptr);
572 MR::onCalcShadowDropPrivateGravity(this, nullptr);
573 }
574 else {
575 MR::onCalcShadowOneTime(this, nullptr);
576 MR::onCalcShadowDropPrivateGravityOneTime(this, nullptr);
577 }
578}
579
580void Coin::setCannotTime(s32 time) {
581 if (time < 0) {
582 mCannotTime = 0x1E;
583 }
584 else {
585 mCannotTime = time;
586 }
587}
588
589void Coin::calcRebouond() {
590 if (MR::isBindedRoof(this)) {
591 MR::calcReboundVelocity(&mVelocity, *MR::getRoofNormal(this), 0.60000002f, 0.5f);
592 }
593
594 if (MR::isBindedWall(this)) {
595 MR::calcReboundVelocity(&mVelocity, *MR::getWallNormal(this), 0.60000002f, 0.5f);
596 }
597
598 if (MR::isBindedGround(this)) {
599 f32 dot = mVelocity.dot(-*MR::getGroundNormal(this));
600
601 f32 vel = 0.0f;
602
603 if (dot >= 2.0f) {
604 if (dot > 30.0f) {
605 dot = 30.0f;
606 }
607
608 int what = (100.0f * dot) / 30.0f;
609
610 if (what > 5) {
611 MR::startSound(this, "SE_OJ_COIN_BOUND", what, -1);
612 }
613
614 vel = 0.75f;
615 }
616
617 MR::calcReboundVelocity(&mVelocity, -mGravity, vel, 0.5f);
618 }
619}
620
621void Coin::attenuateVelocity() {
622 f32 velocity;
623
624 if (mIsInWater) {
625 velocity = 0.80000001f;
626 }
627 else if (MR::isOnGround(this)) {
628 velocity = 0.89999998f;
629 }
630 else {
631 velocity = 0.995f;
632 }
633
634 MR::attenuateVelocity(this, velocity);
635}
636
637bool Coin::isNeedBubble(const JMapInfoIter &rIter) {
638 if (!MR::isValidInfo(rIter)) {
639 return false;
640 }
641
642 bool arg = false;
643 MR::getJMapInfoArg7WithInit(rIter, &arg);
644 return arg;
645}
646
647void Coin::makeArchiveList(NameObjArchiveListCollector *pList, const JMapInfoIter &rIter) {
648 if (Coin::isNeedBubble(rIter)) {
649 pList->addArchive("AirBubble");
650 }
651}
652
653namespace MR {
654 NameObj* createDirectSetCoin(const char *pName) {
655 Coin* coin = new Coin(pName);
656 MR::createCoinHolder();
657 MR::createCoinRotater();
658 MR::addToCoinHolder(coin, coin);
659 return coin;
660 }
661
662 NameObj* createCoin(const NameObj *pObj, const char *pName) {
663 Coin* coin = new Coin(pName);
664 MR::createCoinHolder();
665 MR::createCoinRotater();
666 MR::addToCoinHolder(pObj, coin);
667 return coin;
668 }
669
670 NameObj* createDirectSetPurpleCoin(const char *pName) {
671 Coin* coin = new Coin(pName);
672 coin->mIsPurpleCoin = true;
673 MR::createPurpleCoinHolder();
674 MR::createCoinRotater();
675 MR::addToPurpleCoinHolder(coin, coin);
676 return coin;
677 }
678
679 NameObj* createPurpleCoin(const NameObj *pObj, const char *pName) {
680 Coin* coin = new Coin(pName);
681 coin->mIsPurpleCoin = true;
682 MR::createPurpleCoinHolder();
683 MR::createCoinRotater();
684 MR::addToPurpleCoinHolder(pObj, coin);
685 return coin;
686 }
687};
688
689namespace NrvCoin {
690 INIT_NERVE(CoinNrvNonActive);
691 INIT_NERVE(CoinNrvFix);
692 INIT_NERVE(CoinNrvFixHide);
693 INIT_NERVE(CoinNrvFixTimer);
694 INIT_NERVE(CoinNrvControled);
695 INIT_NERVE(CoinNrvSpinDrained);
696 INIT_NERVE(CoinNrvMove);
697 INIT_NERVE(CoinNrvHop);
698
699 void CoinNrvHop::execute(Spine *pSpine) const {
700 Coin* coin = reinterpret_cast<Coin*>(pSpine->mExecutor);
701 coin->exeHop();
702 }
703
704 void CoinNrvMove::execute(Spine *pSpine) const {
705 Coin* coin = reinterpret_cast<Coin*>(pSpine->mExecutor);
706 coin->exeMove();
707 }
708
709 void CoinNrvSpinDrained::execute(Spine *pSpine) const {
710 Coin* coin = reinterpret_cast<Coin*>(pSpine->mExecutor);
711 coin->exeSpinDrained();
712 }
713
714 void CoinNrvControled::execute(Spine *pSpine) const {
715 Coin* coin = reinterpret_cast<Coin*>(pSpine->mExecutor);
716 coin->exeControled();
717 }
718
719 void CoinNrvFixTimer::execute(Spine *pSpine) const {
720 Coin* coin = reinterpret_cast<Coin*>(pSpine->mExecutor);
721 coin->exeFixTimer();
722 }
723
724 void CoinNrvFixHide::execute(Spine *pSpine) const {
725
726 }
727
728 void CoinNrvFix::execute(Spine *pSpine) const {
729 Coin* coin = reinterpret_cast<Coin*>(pSpine->mExecutor);
730 coin->exeFix();
731 }
732
733 void CoinNrvNonActive::execute(Spine *pSpine) const {
734 Coin* coin = reinterpret_cast<Coin*>(pSpine->mExecutor);
735 coin->exeNonActive();
736 }
737};
738
739Coin::~Coin() {
740
741}
Definition Coin.hpp:23
virtual void calcAndSetBaseMtx()
Calculates and sets the base matrix of the actor.
Definition Coin.cpp:166
virtual void init(const JMapInfoIter &)
Intializes the NameObj and can set various settings and construct necessary classes.
Definition Coin.cpp:27
The basis of a drawable actor that can contain states (see: Nerve)
Definition LiveActor.hpp:24
TVec3f mPosition
3D vector of the actor's position.
Definition LiveActor.hpp:95
TVec3f mVelocity
3D vector of the actor's velocity.
Definition LiveActor.hpp:98
TVec3f mGravity
3D vector of the actor's gravity.
Definition LiveActor.hpp:99
Stores archive names of NameObjs.
The most basic form of an object.
Definition NameObj.hpp:11
Definition Spine.hpp:9