1#include "ObjectFlamePoleV.hh"
3#include "game/system/RaceManager.hh"
9 : ObjectCollidable(params), StateManager(this, STATE_ENTRIES),
10 m_initDelay(static_cast<u32>(params.setting(1))),
11 m_cycleDuration(static_cast<s32>(params.setting(0))),
12 m_dormantFrames(static_cast<s32>(params.setting(3)) + 200),
13 m_scaleFactor(params.setting(2) == 0 ? 5.0f : static_cast<f32>(params.setting(2))),
14 m_initPosY(m_pos.y), m_isBig(strcmp(getName(),
"FlamePole_v_big") == 0) {
15 constexpr f32 M_D8 = 384.0f;
16 constexpr f32 BIG_MULTIPLIER = 14.0f;
19 m_maxOffsetY = BIG_MULTIPLIER * M_D8 * m_scaleFactor;
21 m_maxOffsetY = M_D8 * m_scaleFactor;
26ObjectFlamePoleV::~ObjectFlamePoleV() =
default;
29void ObjectFlamePoleV::init() {
31 constexpr f32 RADIUS = 70.0f;
39 m_flags.setBit(eFlags::Scale);
40 }
else if (0.0f != m_scaleFactor) {
41 m_scale =
EGG::Vector3f(m_scaleFactor, m_scaleFactor, m_scaleFactor);
42 m_flags.setBit(eFlags::Scale);
45 resize(RADIUS * m_scale.y, 0.0f);
48 m_fallSpeed = m_maxOffsetY / FALL_FRAMES;
52void ObjectFlamePoleV::calc() {
53 if (System::RaceManager::Instance()->timer() <= m_initDelay) {
59 m_flags.setBit(eFlags::Position);
60 m_pos.y = m_currOffsetY + (m_initPosY - m_maxOffsetY);
64void ObjectFlamePoleV::calcErupted() {
65 constexpr f32 AMPLITUDE = BEFORE_ERUPT_FRAMES;
67 f32 frame =
static_cast<f32
>(m_currentFrame);
68 if (frame >=
static_cast<f32
>(m_cycleDuration) - BEFORE_ERUPT_FRAMES - ERUPT_FRAMES -
69 FALL_FRAMES -
static_cast<f32
>(m_dormantFrames)) {
73 f32 sin = EGG::Mathf::SinFIdx(DEG2FIDX * (360.0f * frame / 30.0f));
74 m_currOffsetY = m_maxOffsetY + AMPLITUDE * sin;
78void ObjectFlamePoleV::calcLowering() {
80 if (m_currOffsetY <= -300.0f) {
84 if (m_currOffsetY <= 0.0f) {
88 m_currOffsetY = m_loweringStartOffsetY - m_fallSpeed *
static_cast<f32
>(m_currentFrame);