1#include "Game/MapObj/BallRail.hpp"
2#include <JSystem/JMath/JMath.hpp>
4BallRail::BallRail(
const char *pName) :
LiveActor(pName) {
9 mDeceleration = 0.995f;
14 if (MR::getJMapInfoArg0NoInit(rIter, &mAcceleration)) {
15 mAcceleration /= 1000.0f;
18 if (MR::getJMapInfoArg1NoInit(rIter, &mDeceleration)) {
19 mDeceleration /= 1000.0f;
22 MR::connectToSceneMapObjMovement(
this);
23 MR::invalidateClipping(
this);
24 MR::onCalcGravity(
this);
27 MR::moveCoordToStartPos(
this);
28 MR::setRailCoordSpeed(
this, 0.0f);
34 MR::addHitSensor(
this,
"bind", 0x7B, 8, _AC, offs);
35 initNerve(&NrvBallRail::BallRailNrvWait::sInstance);
39void BallRail::control() {
44 if (msg == 173 && isNerve(&NrvBallRail::BallRailNrvWait::sInstance)) {
46 TVec3f v8 = a2->mPosition - a3->mPosition;
48 if (v8.dot(v9) > 0.0f) {
53 MR::normalizeOrZero(&v8);
55 MR::zeroVelocity(a2->mActor);
69void BallRail::initRailPoints() {
70 #warning "BallRail::initRailPoints has a regswap"
71 u32 numPoints = (u32)(MR::getRailTotalLength(
this) / 100.0f) + 2;
72 mNumPoints = numPoints;
74 MR::moveCoordToStartPos(
this);
75 MR::setRailCoordSpeed(
this, 100.0f);
77 for (u32 i = 0; i < mNumPoints - 1; i++) {
78 mRailPoints[i]._0 = MR::getRailPos(
this);
79 mRailPoints[i]._24 = MR::getRailDirection(
this);
80 MR::moveRailRider(
this);
83 MR::moveCoordToEndPos(
this);
84 mRailPoints[mNumPoints - 1]._0 = MR::getRailPos(
this);
85 mRailPoints[mNumPoints - 1]._24 = MR::getRailDirection(
this);
86 MR::moveCoordToStartPos(
this);
87 MR::setRailCoordSpeed(
this, 0.0f);
91 if (mNumPoints >= 2) {
93 PSVECCrossProduct(pnt->_24.toCVec(), v17.toCVec(), pnt->_C.toVec());
94 MR::normalizeOrZero(&pnt->_C);
97 for (u32 i = 0; i < mNumPoints; i++) {
99 PSVECCrossProduct(pnt->_24.toCVec(), v17.toCVec(), pnt->_C.toVec());
100 MR::normalizeOrZero(&pnt->_C);
103 if (mNumPoints >= 2) {
105 PSVECCrossProduct(lastPnt->_24.toCVec(), v17.toCVec(), lastPnt->_C.toVec());
106 MR::normalizeOrZero(&lastPnt->_C);
110void BallRail::exeWait() {
111 MR::moveCoordToNearestPos(
this, *MR::getPlayerPos());
112 MR::moveTransToCurrentRailPos(
this);
114 if (_90 !=
nullptr) {
115 setNerve(&NrvBallRail::BallRailNrvSetUp::sInstance);
119void BallRail::exeSetUp() {
120 if (MR::isFirstStep(
this)) {
121 _94 = _90->mPosition;
122 MR::zeroVelocity(_90->mActor);
123 MR::setRailCoordSpeed(
this, 0.0f);
126 MR::moveCoord(
this, 3.0f);
127 MR::moveTransToCurrentRailPos(
this);
131 if (MR::isLessStep(
this, 15)) {
133 JMAVECScaleAdd(
mGravity.toCVec(),
mPosition.toCVec(), v6.toVec(), -_90->mRadius);
134 f32 rate = MR::calcNerveEaseInRate(
this, 15);
135 MR::vecBlend(_94, v6, &v7, rate);
138 JMAVECScaleAdd(
mGravity.toCVec(),
mPosition.toCVec(), v7.toVec(), -_90->mRadius);
141 if (MR::isStep(
this, 15)) {
142 MR::tryRumblePadStrong(
this, 0);
145 MR::subtractAndSet(_90->mActor->
mVelocity, v7, &_90->mPosition);
147 if (MR::isGreaterStep(
this, 45)) {
148 setNerve(&NrvBallRail::BallRailNrvRun::sInstance);
152void BallRail::exeRun() {
153 if (MR::isFirstStep(
this)) {
154 MR::setRailCoordSpeed(
this, 0.0f);
157 TVec3f v14(MR::getRailDirection(
this));
158 TVec3f v13 =
mGravity * mAcceleration;
160 MR::accelerateRailCoordSpeed(
this, v13.dot(v14));
161 MR::slowDownRailCoordSpeed(
this, mDeceleration);
163 if (!MR::isRailGoingToEnd(
this) || MR::getRailCoordSpeed(
this) < 6.0f) {
164 if (!MR::isRailGoingToEnd(
this)) {
165 MR::setRailDirectionToEnd(
this);
168 MR::setRailCoordSpeed(
this, 6.0f);
171 MR::moveRailRider(
this);
172 MR::moveTransToCurrentRailPos(
this);
173 JMAVECScaleAdd(
mGravity.toCVec(),
mPosition.toCVec(), v12.toVec(), -_90->mRadius);
174 MR::subtractAndSet(_90->mActor->
mVelocity, v12, &_90->mPosition);
176 if (MR::isRailReachedGoal(
this)) {
179 MR::multAndSet(vec, MR::getRailDirection(
this), MR::getRailCoordSpeed(
this));
180 getSensor(
"bind")->receiveMessage(178, _90);
182 setNerve(&NrvBallRail::BallRailNrvNoBind::sInstance);
186void BallRail::exeNoBind() {
187 if (getNerveStep() > 60) {
188 setNerve(&NrvBallRail::BallRailNrvWait::sInstance);
192BallRailPoint::BallRailPoint() : _0(0, 0, 0), _C(1, 0, 0), _18(0, 1, 0), _24(0, 0, 1) {
196BallRail::~BallRail() {
200namespace NrvBallRail {
201 INIT_NERVE(BallRailNrvWait);
202 INIT_NERVE(BallRailNrvSetUp);
203 INIT_NERVE(BallRailNrvRun);
204 INIT_NERVE(BallRailNrvNoBind);
virtual void init(const JMapInfoIter &)
Intializes the NameObj and can set various settings and construct necessary classes.
The basis of a drawable actor that can contain states (see: Nerve)
TVec3f mPosition
3D vector of the actor's position.
TVec3f mVelocity
3D vector of the actor's velocity.
TVec3f mGravity
3D vector of the actor's gravity.
HitSensor * getSensor(const char *pSensorName) const
Gets a sensor.