1#include "ObjectFlamePoleV.hh"
3#include "game/system/RaceManager.hh"
8ObjectFlamePoleV::ObjectFlamePoleV(
const System::MapdataGeoObj ¶ms)
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(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() {
30 constexpr EGG::Vector3f BIG_SCALE = EGG::Vector3f(13.0f, 14.0f, 13.0f);
31 constexpr f32 RADIUS = 70.0f;
39 }
else if (0.0f != m_scaleFactor) {
40 setScale(m_scaleFactor);
43 resize(RADIUS * scale().y, 0.0f);
46 m_fallSpeed = m_maxOffsetY / FALL_FRAMES;
50void ObjectFlamePoleV::calc() {
51 if (System::RaceManager::Instance()->timer() <= m_initDelay) {
57 f32 posY = m_currOffsetY + (m_initPosY - m_maxOffsetY);
58 setPos(EGG::Vector3f(pos().x, posY, pos().z));
62void ObjectFlamePoleV::calcErupted() {
63 constexpr f32 AMPLITUDE = BEFORE_ERUPT_FRAMES;
65 f32 frame =
static_cast<f32
>(m_currentFrame);
66 if (frame >=
static_cast<f32
>(m_cycleDuration) - BEFORE_ERUPT_FRAMES - ERUPT_FRAMES -
67 FALL_FRAMES -
static_cast<f32
>(m_dormantFrames)) {
71 f32 sin = EGG::Mathf::SinFIdx(DEG2FIDX * (360.0f * frame / 30.0f));
72 m_currOffsetY = m_maxOffsetY + AMPLITUDE * sin;
76void ObjectFlamePoleV::calcLowering() {
78 if (m_currOffsetY <= -300.0f) {
82 if (m_currOffsetY <= 0.0f) {
86 m_currOffsetY = m_loweringStartOffsetY - m_fallSpeed *
static_cast<f32
>(m_currentFrame);
Base class that represents different "states" for an object.