A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
ObjectFlamePoleV.cc
1#include "ObjectFlamePoleV.hh"
2
3#include "game/system/RaceManager.hh"
4
5namespace Field {
6
8ObjectFlamePoleV::ObjectFlamePoleV(const System::MapdataGeoObj &params)
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;
17
18 if (m_isBig) {
19 m_maxOffsetY = BIG_MULTIPLIER * M_D8 * m_scaleFactor;
20 } else {
21 m_maxOffsetY = M_D8 * m_scaleFactor;
22 }
23}
24
26ObjectFlamePoleV::~ObjectFlamePoleV() = default;
27
29void ObjectFlamePoleV::init() {
30 constexpr EGG::Vector3f BIG_SCALE = EGG::Vector3f(13.0f, 14.0f, 13.0f);
31 constexpr f32 RADIUS = 70.0f;
32
33 m_nextStateId = 0;
34
35 disableCollision();
36
37 if (m_isBig) {
38 m_scale = BIG_SCALE;
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);
43 }
44
45 resize(RADIUS * m_scale.y, 0.0f);
46
47 m_currOffsetY = 0.0f;
48 m_fallSpeed = m_maxOffsetY / FALL_FRAMES;
49}
50
52void ObjectFlamePoleV::calc() {
53 if (System::RaceManager::Instance()->timer() <= m_initDelay) {
54 return;
55 }
56
57 StateManager::calc();
58
59 m_flags.setBit(eFlags::Position);
60 m_pos.y = m_currOffsetY + (m_initPosY - m_maxOffsetY);
61}
62
64void ObjectFlamePoleV::calcErupted() {
65 constexpr f32 AMPLITUDE = BEFORE_ERUPT_FRAMES;
66
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)) {
70 m_nextStateId = 3;
71 }
72
73 f32 sin = EGG::Mathf::SinFIdx(DEG2FIDX * (360.0f * frame / 30.0f));
74 m_currOffsetY = m_maxOffsetY + AMPLITUDE * sin;
75}
76
78void ObjectFlamePoleV::calcLowering() {
79 if (m_isBig) {
80 if (m_currOffsetY <= -300.0f) {
81 m_nextStateId = 4;
82 }
83 } else {
84 if (m_currOffsetY <= 0.0f) {
85 m_nextStateId = 4;
86 }
87 }
88 m_currOffsetY = m_loweringStartOffsetY - m_fallSpeed * static_cast<f32>(m_currentFrame);
89}
90
91}; // namespace Field
Pertains to collision.
A 3D float vector.
Definition Vector.hh:88