1#include "ObjectDossun.hh"
3#include "game/field/CollisionDirector.hh"
4#include "game/field/ObjectDirector.hh"
6#include "game/kart/KartObject.hh"
12 : ObjectCollidable(params), m_touchingGround(false) {}
15ObjectDossun::~ObjectDossun() =
default;
18void ObjectDossun::init() {
19 constexpr f32 BEFORE_FALL_VEL = 30.0f;
21 m_anmState = AnmState::Still;
25 if (m_railInterpolator) {
26 m_railInterpolator->init(0.0f, 0);
29 m_initialPosY = m_pos.y;
32 m_flags.setBit(eFlags::Position);
33 for (u32 i = 0; i < BEFORE_FALL_DURATION; ++i) {
34 m_pos.y = BEFORE_FALL_VEL + m_pos.y;
38 auto *colDir = CollisionDirector::Instance();
43 m_flags.setBit(eFlags::Position);
46 m_pos.y = m_vel + m_pos.y;
51 hasCol = colDir->checkSphereFull(STOMP_RADIUS, pos, EGG::Vector3f::inf,
KCL_TYPE_FLOOR,
55 m_pos += info.tangentOff;
56 m_flags.setBit(eFlags::Position);
59 f32 fallDuration = frameCount;
65 f32 pos = RISING_VEL + m_pos.y;
68 if (pos >= m_initialPosY) {
69 m_pos.y = m_initialPosY;
70 m_flags.setBit(eFlags::Position);
71 riseDuration = frameCount;
75 m_flags.setBit(eFlags::Position);
79 m_fullDuration = fallDuration + GROUND_DURATION + riseDuration + BEFORE_FALL_DURATION;
80 m_touchingGround =
false;
84void ObjectDossun::calcCollisionTransform() {
85 constexpr f32 HEIGHT = 400.0f;
94 mat[1, 3] += HEIGHT * m_scale.x;
96 collision()->transform(mat, m_scale);
100Kart::Reaction ObjectDossun::onCollision(
Kart::KartObject *kartObj, Kart::Reaction reactionOnKart,
102 constexpr f32 SQUISH_DISTANCE = 375.0f;
107 if (xzDist.
length() < SQUISH_DISTANCE * m_scale.x &&
108 (m_anmState == AnmState::Falling || m_touchingGround)) {
109 const auto &hitTable = ObjectDirector::Instance()->hitTableKart();
110 return hitTable.reaction(hitTable.slot(ObjectId::DossuncSoko));
113 return reactionOnKart;
117void ObjectDossun::initState() {
118 m_stillTimer =
static_cast<u32
>(m_mapObj->setting(2));
119 if (m_stillTimer == 0) {
120 m_stillTimer =
static_cast<u32
>(m_mapObj->setting(3));
124 m_beforeFallTimer = 0;
129void ObjectDossun::calcStomp() {
130 switch (m_anmState) {
131 case AnmState::BeforeFall:
134 case AnmState::Falling:
137 case AnmState::Grounded:
140 case AnmState::Rising:
147 if (m_cycleTimer-- == 0) {
153void ObjectDossun::calcBeforeFall() {
154 constexpr f32 BEFORE_FALL_VEL = 50.0f;
156 m_flags.setBit(eFlags::Position);
157 m_pos.y = BEFORE_FALL_VEL + m_pos.y;
159 if (--m_beforeFallTimer == 0) {
160 m_anmState = AnmState::Falling;
165void ObjectDossun::calcFalling() {
166 m_flags.setBit(eFlags::Position);
167 m_vel -= STOMP_ACCEL;
168 m_pos.y = m_vel + m_pos.y;
170 checkFloorCollision();
174void ObjectDossun::checkFloorCollision() {
178 if (!CollisionDirector::Instance()->checkSphereFull(STOMP_RADIUS, pos, EGG::Vector3f::inf,
184 m_pos += info.tangentOff;
185 m_flags.setBit(eFlags::Position);
188 m_touchingGround =
true;
#define KCL_TYPE_FLOOR
0x20E80FFF - Any KCL that the player or items can drive/land on.
The highest level abstraction for a kart.
f32 length() const
The square root of the vector's dot product.