A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
ObjectFireSnake.hh
1#pragma once
2
3#include "game/field/StateManager.hh"
4#include "game/field/obj/ObjectProjectile.hh"
5
6namespace Kinoko::Field {
7
8class ObjectFireSnakeKid : public ObjectCollidable {
9public:
10 ObjectFireSnakeKid(const System::MapdataGeoObj &params);
11 ~ObjectFireSnakeKid() override;
12
14 [[nodiscard]] u32 loadFlags() const override {
15 return 1;
16 }
17};
18
19class ObjectFireSnake : public ObjectProjectile, virtual public StateManager {
20public:
21 ObjectFireSnake(const System::MapdataGeoObj &params);
22 ~ObjectFireSnake() override;
23
24 void init() override;
25 void calc() override;
26
28 [[nodiscard]] u32 loadFlags() const override {
29 return 1;
30 }
31
32 void initProjectile(const EGG::Vector3f &pos) override;
33 void onLaunch() override;
34
35 void enterDespawned();
36 void enterFalling();
37 void enterHighBounce();
38 void enterRest();
39 void enterBounce() {}
40 void enterDespawning() {}
41
42 void calcDespawned() {}
43 void calcFalling();
44 void calcHighBounce();
45 void calcRest();
46 void calcBounce();
47 void calcDespawning() {}
48
49protected:
50 void calcChildren();
51
52 EGG::Vector3f m_sunPos;
53 EGG::Vector3f m_initialPos;
54 EGG::Vector3f m_initRot;
55 EGG::Vector3f m_visualPos;
56 EGG::Vector3f m_bounceDir;
57 u16 m_age;
58 u16 m_delayFrame;
59
60private:
61 void calcBounce(f32 initialVel);
62
63 bool isCollisionEnabled() const {
64 return m_currentStateId == 2 || m_currentStateId == 3 || m_currentStateId == 4;
65 }
66
67 std::array<ObjectFireSnakeKid *, 2> m_kids;
68 const s16 m_maxAge;
69 EGG::Vector3f m_xzSunDist;
70 EGG::Vector3f m_fallAxis;
71 f32 m_xzSpeed;
73 std::array<EGG::Matrix34f, 21> m_prevTransforms;
74
75 static constexpr std::array<StateManagerEntry, 6> STATE_ENTRIES = {{
76 {StateEntry<ObjectFireSnake, &ObjectFireSnake::enterDespawned,
77 &ObjectFireSnake::calcDespawned>(0)},
78 {StateEntry<ObjectFireSnake, &ObjectFireSnake::enterFalling,
79 &ObjectFireSnake::calcFalling>(1)},
80 {StateEntry<ObjectFireSnake, &ObjectFireSnake::enterHighBounce,
81 &ObjectFireSnake::calcHighBounce>(2)},
82 {StateEntry<ObjectFireSnake, &ObjectFireSnake::enterRest, &ObjectFireSnake::calcRest>(
83 3)},
84 {StateEntry<ObjectFireSnake, &ObjectFireSnake::enterBounce,
85 &ObjectFireSnake::calcBounce>(4)},
86 {StateEntry<ObjectFireSnake, &ObjectFireSnake::enterDespawning,
87 &ObjectFireSnake::calcDespawning>(5)},
88 }};
89
90 static constexpr f32 GRAVITY = 3.0f;
91};
92
93} // namespace Kinoko::Field
u16 m_fallDuration
How long the firesnake falls from the sun.
void initProjectile(const EGG::Vector3f &pos) override
Callback function called by the managing ObjectSniper.
std::array< EGG::Matrix34f, 21 > m_prevTransforms
The last 21 transformation matrices.
u16 m_age
How long the firesnake has been spawned.
const s16 m_maxAge
Number of frames until the snake will disappear.
void onLaunch() override
Callback function use by the ObjectSniper that wants to throw this projectile.
Pertains to collision.
A 3D float vector.
Definition Vector.hh:107