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 f32 posY = 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:
50 EGG::Vector3f scaledTang =
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 const auto &railPos = m_railInterpolator->curPos();
64 setPos(EGG::Vector3f(railPos.x, pos().y, railPos.z));
65 m_colTranslate.y -= 2.0f;
67 addPos(m_colTranslate);
74void ObjectRock::calcIntangible() {
75 if (m_cooldownTimer < 0) {
76 m_state = State::Tangible;
77 m_angSpd = INITIAL_ANGULAR_SPEED;
78 m_colTranslate.y =
static_cast<f32
>(m_mapObj->setting(3));
79 m_cooldownTimer = m_mapObj->setting(1);
85void ObjectRock::calcTangibleSub() {
86 EGG::Vector3f tangDir = m_railInterpolator->curTangentDir();
89 EGG::Matrix34f m = OrthonormalBasis(tangDir);
90 m_angRad += m_angSpd * DEG2RAD;
92 EGG::Matrix34f mat(EGG::Matrix34f::ident);
93 EGG::Vector3f vRot(m_angRad, 0.0f, 0.0f);
95 mat = m.multiplyTo(mat);
96 mat.setBase(3, pos());
101void ObjectRock::checkSphereFull() {
104 EGG::Vector3f offset(0.0f, -(scale().x * 240.0f - 50.0f), 0.0f);
105 EGG::Vector3f colPos = pos() + offset;
107 if (CollisionDirector::Instance()->checkSphereFull(50.0f, colPos, EGG::Vector3f::inf,
109 m_colTranslate.y *= -0.3f;
110 m_angSpd = std::max(360.0f *
static_cast<f32
>(m_mapObj->setting(2)) /
111 (480.0f * scale().x * F_PI),
113 addPos(info.tangentOff);
118void ObjectRock::breakRock() {
119 m_state = State::Intangible;
120 m_railInterpolator->init(0.0f, 0);
121 m_railInterpolator->setCurrVel(
static_cast<f32
>(m_mapObj->setting(2)));
123 setPos(EGG::Vector3f(pos().x, m_startYPos, pos().z));
128Kart::Reaction ObjectRock::onCollision(Kart::KartObject * ,
129 Kart::Reaction reactionOnKart, Kart::Reaction ,
131 if (scale().x < 1.0f) {
133 return Kart::Reaction::None;
135 return reactionOnKart;
#define KCL_TYPE_FLOOR
0x20E80FFF - Any KCL that the player or items can drive/land on.
ObjectRock(const System::MapdataGeoObj ¶ms)
@addr {0x8076F2E0}
constexpr f32 normalise()
Normalizes the vector and returns the original length.