1#include "ObjectRock.hh"
3#include "game/field/CollisionDirector.hh"
5#include "game/kart/KartCollide.hh"
13ObjectRock::~ObjectRock() =
default;
16void ObjectRock::init() {
17 m_railInterpolator->init(0.0f, 0);
18 m_railInterpolator->setCurrVel(
static_cast<f32
>(m_mapObj->setting(2)));
19 m_railInterpolator->calc();
21 m_state = State::Tangible;
22 m_flags.
setBit(eFlags::Position);
23 m_pos.y = m_startYPos = m_railInterpolator->curPos().y;
25 EGG::Vector3f curTanDirNorm = m_railInterpolator->curTangentDir();
27 setMatrixTangentTo(EGG::Vector3f::ey, curTanDirNorm);
30 m_angSpd = INITIAL_ANGULAR_SPEED;
31 m_cooldownTimer = m_mapObj->setting(0);
32 m_colTranslate.x = 0.0f;
33 m_colTranslate.y =
static_cast<f32
>(m_mapObj->setting(3));
34 m_colTranslate.z = 0.0f;
39void ObjectRock::calc() {
44 case State::Intangible:
51 m_railInterpolator->curTangentDir() * m_railInterpolator->getCurrVel();
52 m_colTranslate.x = scaledTang.x;
53 m_colTranslate.z = scaledTang.z;
57void ObjectRock::calcTangible() {
58 auto railStatus = m_railInterpolator->calc();
59 if (railStatus == RailInterpolator::Status::ChangingDirection) {
63 m_flags.
setBit(eFlags::Position);
64 m_pos.x = m_railInterpolator->curPos().x;
65 m_flags.
setBit(eFlags::Position);
66 m_pos.z = m_railInterpolator->curPos().z;
67 m_colTranslate.y -= 2.0f;
69 m_flags.
setBit(eFlags::Position);
70 m_pos += m_colTranslate;
77void ObjectRock::calcIntangible() {
78 if (m_cooldownTimer < 0) {
79 m_state = State::Tangible;
80 m_angSpd = INITIAL_ANGULAR_SPEED;
81 m_colTranslate.y =
static_cast<f32
>(m_mapObj->setting(3));
82 m_cooldownTimer = m_mapObj->setting(1);
88void ObjectRock::calcTangibleSub() {
93 m_angRad += m_angSpd * DEG2RAD;
98 m_flags.
setBit(eFlags::Matrix);
104void ObjectRock::checkSphereFull() {
107 EGG::Vector3f offset(0.0f, -(m_scale.x * 240.0f - 50.0f), 0.0f);
110 if (CollisionDirector::Instance()->checkSphereFull(50.0f, pos, EGG::Vector3f::inf,
112 m_colTranslate.y *= -0.3f;
113 m_angSpd = std::max(360.0f *
static_cast<f32
>(m_mapObj->setting(2)) /
114 (480.0f * m_scale.x * F_PI),
116 m_flags.
setBit(eFlags::Position);
117 m_pos += info.tangentOff;
122void ObjectRock::breakRock() {
123 m_state = State::Intangible;
124 m_railInterpolator->init(0.0f, 0);
125 m_railInterpolator->setCurrVel(
static_cast<f32
>(m_mapObj->setting(2)));
127 m_flags.
setBit(eFlags::Position);
128 m_pos.y = m_startYPos;
134 Kart::Reaction reactionOnKart, Kart::Reaction ,
136 if (m_scale.x < 1.0f) {
138 return Kart::Reaction::None;
140 return reactionOnKart;
#define KCL_TYPE_FLOOR
0x20E80FFF - Any KCL that the player or items can drive/land on.
Matrix34f multiplyTo(const Matrix34f &rhs) const
Multiplies two matrices.
void setBase(size_t col, const Vector3f &base)
Sets one column of a matrix.
ObjectRock(const System::MapdataGeoObj ¶ms)
@addr {0x8076F2E0}
The highest level abstraction for a kart.
constexpr TBitFlag< T, E > & setBit(Es... es)
Sets the corresponding bits for the provided enum values.
f32 normalise()
Normalizes the vector and returns the original length.