1#include "ObjectCarA.hh"
3#include "game/field/ObjectCollisionCylinder.hh"
5#include "game/kart/KartCollide.hh"
6#include "game/kart/KartObject.hh"
11ObjectCarA::ObjectCarA(
const System::MapdataGeoObj ¶ms)
13 m_finalVel(static_cast<f32>(params.setting(0))),
14 m_accel(static_cast<f32>(params.setting(1)) / 10.0f),
15 m_stopTime(static_cast<u32>(params.setting(2))) {}
18ObjectCarA::~ObjectCarA() =
default;
21void ObjectCarA::init() {
22 constexpr f32 RADIUS = 400.0f;
24 m_railInterpolator->init(0, 0);
27 f32 finalTime = m_finalVel / m_accel;
29 (m_railInterpolator->railLength() - finalTime * m_accel * finalTime) / m_finalVel;
31 setMatrixFromOrthonormalBasisAndPos(m_railInterpolator->curTangentDir());
33 setPos(m_railInterpolator->curPos());
35 m_motionState = MotionState::Accelerating;
36 m_changingDir =
false;
37 m_currUp = EGG::Vector3f::ey;
38 m_currTangent = m_railInterpolator->curTangentDir();
44void ObjectCarA::calc() {
47 m_railInterpolator->setCurrVel(m_currVel);
49 auto status = m_railInterpolator->calc();
50 m_changingDir = (status == RailInterpolator::Status::ChangingDirection);
56void ObjectCarA::createCollision() {
57 constexpr f32 RADIUS = 210.0f;
58 constexpr f32 HEIGHT = 200.0f;
60 m_collision = EGG::egg_new<ObjectCollisionCylinder>(RADIUS, HEIGHT, collisionCenter());
64void ObjectCarA::calcCollisionTransform() {
65 ObjectCollisionBase *objCol = collision();
73 SetRotTangentHorizontal(mat, transform().base(2), EGG::Vector3f::ey);
74 mat.setBase(3, transform().base(3) + 50.0f * transform().base(1));
76 objCol->transform(mat, scale(),
77 -m_railInterpolator->curTangentDir() * m_railInterpolator->getCurrVel());
81Kart::Reaction ObjectCarA::onCollision(Kart::KartObject *kartObj, Kart::Reaction reactionOnKart,
82 Kart::Reaction , EGG::Vector3f & ) {
83 return kartObj->speedRatioCapped() < 0.5f ? Kart::Reaction::WallAllSpeed : reactionOnKart;
87void ObjectCarA::enterStop() {
92void ObjectCarA::enterCruising() {
93 m_currVel = m_finalVel;
97void ObjectCarA::calcStop() {
98 if (m_currentFrame > m_stopTime) {
99 m_motionState = MotionState::Accelerating;
100 m_currentStateId = 1;
105void ObjectCarA::calcAccel() {
106 if (m_motionState == MotionState::Accelerating) {
107 m_currVel += m_accel;
109 if (m_currVel > m_finalVel) {
110 m_currVel = m_finalVel;
111 m_motionState = MotionState::Cruising;
114 }
else if (m_motionState == MotionState::Decelerating) {
117 m_currVel = std::max(0.01f, m_currVel - m_accel);
122 if (m_railInterpolator->isMovementDirectionForward()) {
123 m_railInterpolator->init(0.0f, 0);
126 m_motionState = MotionState::Cruising;
133void ObjectCarA::calcCruising() {
135 if (
static_cast<f32
>(m_currentFrame) > m_cruiseTime - 1.0f) {
136 m_motionState = MotionState::Decelerating;
142void ObjectCarA::calcPos() {
143 m_currUp = Interpolate(0.1f, m_currUp, EGG::Vector3f::ey);
144 m_currUp.normalise2();
146 setMatrixTangentTo(m_currUp, m_currTangent);
147 setPos(m_railInterpolator->curPos());
Base class that represents different "states" for an object.