1#include "ObjectFireSnakeV.hh"
3#include "game/field/CollisionDirector.hh"
5#include "game/system/RaceManager.hh"
11 : StateManager(this, STATE_ENTRIES), ObjectFireSnake(params),
12 m_cycleDuration(params.setting(1)), m_distFromPipe(static_cast<f32>(params.setting(2))),
14 m_delayFrame = params.setting(0);
19 m_initRot = m_transform.base(0);
20 m_initialPos = m_sunPos + m_initRot * m_distFromPipe;
24ObjectFireSnakeV::~ObjectFireSnakeV() =
default;
27void ObjectFireSnakeV::init() {
29 ObjectFireSnake::enterDespawned();
31 m_visualPos = m_sunPos;
32 m_bounceDir = m_initRot;
36void ObjectFireSnakeV::calc() {
37 if (System::RaceManager::Instance()->timer() >= m_delayFrame) {
43void ObjectFireSnakeV::calcSub() {
46 u32 frame = System::RaceManager::Instance()->timer() - m_delayFrame;
47 if (frame % m_cycleDuration == 0) {
51 if (m_currentStateId >= 1 && m_currentStateId <= 4) {
53 if (m_age >= 600 && m_currentStateId == 3) {
62void ObjectFireSnakeV::enterFalling() {
63 constexpr f32 FALL_DURATION = 140.0f;
65 ObjectFireSnake::enterFalling();
68 unregisterCollision();
72 m_visualPos = m_sunPos;
73 m_bounceDir = m_initRot;
74 m_initialPos = m_sunPos + m_initRot * m_distFromPipe;
75 m_fallSpeed = m_distFromPipe / FALL_DURATION;
79void ObjectFireSnakeV::calcFalling() {
80 constexpr f32 INITIAL_Y_VELOCITY = 120.0f;
81 constexpr f32 AABB_DELAY_FRAMES = 5;
83 if (m_currentFrame > AABB_DELAY_FRAMES && !getUnit()) {
87 m_visualPos.x += m_bounceDir.x * m_fallSpeed;
88 m_visualPos.z += m_bounceDir.z * m_fallSpeed;
89 m_visualPos.y += INITIAL_Y_VELOCITY - GRAVITY *
static_cast<f32
>(m_currentFrame);
91 if (m_currentFrame > COL_CHECK_DELAY_FRAMES) {
92 CollisionInfo colInfo;
94 bool hasCol = CollisionDirector::Instance()->checkSphereFull(RADIUS, m_visualPos,
98 m_visualPos += colInfo.tangentOff;
103 setMatrixTangentTo(EGG::Vector3f::ey, m_bounceDir);
104 m_flags.setBit(eFlags::Position);
109void ObjectFireSnakeV::calcHighBounce() {
110 constexpr f32 INITIAL_Y_VELOCITY = 90.0f;
112 m_visualPos.z += m_bounceDir.z * m_fallSpeed;
113 m_visualPos.x += m_bounceDir.x * m_fallSpeed;
114 m_visualPos.y += INITIAL_Y_VELOCITY - GRAVITY *
static_cast<f32
>(m_currentFrame);
116 if (m_currentFrame > COL_CHECK_DELAY_FRAMES) {
117 CollisionInfo colInfo;
119 bool hasCol = CollisionDirector::Instance()->checkSphereFull(RADIUS, m_visualPos,
123 m_visualPos += colInfo.tangentOff;
128 setMatrixTangentTo(EGG::Vector3f::ey, m_bounceDir);
129 m_flags.setBit(eFlags::Position);
#define KCL_TYPE_FLOOR
0x20E80FFF - Any KCL that the player or items can drive/land on.