1#include "ObjectCarA.hh"
3#include "game/field/ObjectCollisionCylinder.hh"
5#include "game/kart/KartCollide.hh"
6#include "game/kart/KartObject.hh"
12 : ObjectCollidable(params), StateManager(this), m_finalVel(static_cast<f32>(params.setting(0))),
13 m_accel(static_cast<f32>(params.setting(1)) / 10.0f),
14 m_stopTime(static_cast<
u32>(params.setting(2))) {}
17ObjectCarA::~ObjectCarA() =
default;
20void ObjectCarA::init() {
21 constexpr f32 RADIUS = 400.0f;
23 m_railInterpolator->init(0, 0);
26 f32 finalTime = m_finalVel / m_accel;
28 (m_railInterpolator->railLength() - finalTime * m_accel * finalTime) / m_finalVel;
30 setMatrixFromOrthonormalBasisAndPos(m_railInterpolator->curTangentDir());
32 m_flags.setBit(eFlags::Position);
33 m_pos = 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 =
new ObjectCollisionCylinder(RADIUS, HEIGHT, collisionCenter());
64void ObjectCarA::calcCollisionTransform() {
65 ObjectCollisionBase *objCol = collision();
73 SetRotTangentHorizontal(mat, m_transform.base(2), EGG::Vector3f::ey);
74 mat.
setBase(3, m_transform.base(3) + 50.0f * m_transform.base(1));
76 objCol->transform(mat, m_scale,
77 -m_railInterpolator->curTangentDir() * m_railInterpolator->getCurrVel());
81Kart::Reaction ObjectCarA::onCollision(
Kart::KartObject *kartObj, Kart::Reaction reactionOnKart,
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);
148 m_pos = m_railInterpolator->curPos();
149 m_flags.setBit(eFlags::Position);
void setBase(size_t col, const Vector3f &base)
Sets one column of a matrix.
The highest level abstraction for a kart.