A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
ObjectChoropu.hh
1#pragma once
2
3#include "game/field/ObjectCollisionSphere.hh"
4#include "game/field/StateManager.hh"
5#include "game/field/obj/ObjectCollidable.hh"
6
7#include "game/kart/KartCollide.hh"
8
9#include <vector>
10
11namespace Field {
12
13class ObjectChoropu;
14class ObjectChoropuGround;
15class ObjectChoropuHoll;
16
17template <>
18class StateManager<ObjectChoropu> : public StateManagerBase<ObjectChoropu> {
19public:
21 ~StateManager() override;
22
23private:
24 static const std::array<StateManagerEntry<ObjectChoropu>, 5> STATE_ENTRIES;
25};
26
30class ObjectChoropu : public ObjectCollidable, public StateManager<ObjectChoropu> {
32
33public:
35 ~ObjectChoropu() override;
36
37 void init() override;
38 void calc() override;
39
41 [[nodiscard]] u32 loadFlags() const override {
42 return 1;
43 }
44
45 Kart::Reaction onCollision(Kart::KartObject *kartObj, Kart::Reaction reactionOnKart,
46 Kart::Reaction reactionOnObj, EGG::Vector3f &hitDepth) override;
47
48private:
49 void enterStateStub();
50 void enterDigging();
51 void enterPeeking();
52 void enterJumping();
53 void calcStateStub();
54 void calcDigging();
55 void calcPeeking();
56 void calcJumping();
57
58 void calcGround();
59 void calcGroundObjs();
60 [[nodiscard]] EGG::Matrix34f calcInterpolatedPose(f32 t) const;
61
62 std::span<ObjectChoropuGround *> m_groundObjs;
63 ObjectChoropuHoll *m_objHoll;
64 s16 m_startFrameOffset;
65 u16 m_idleDuration;
66 f32 m_groundHeight;
68 EGG::Matrix34f m_transMat;
69 EGG::Matrix34f m_railMat;
70 f32 m_groundLength;
71
72 static constexpr f32 RADIUS = 300.0f;
73 static constexpr f32 MAX_GROUND_LEN = 3000.0f;
74};
75
77public:
78 ObjectChoropuGround(const EGG::Vector3f &pos, const EGG::Vector3f &rot,
79 const EGG::Vector3f &scale);
80 ~ObjectChoropuGround() override;
81
83 [[nodiscard]] u32 loadFlags() const override {
84 return 1;
85 }
86
88 Kart::Reaction onCollision(Kart::KartObject * /*kartObj*/, Kart::Reaction reactionOnKart,
89 Kart::Reaction /*reactionOnObj*/, EGG::Vector3f &hitDepth) override {
90 hitDepth.setZero();
91 return reactionOnKart;
92 }
93
94 void calcPosAndMat(f32 height, const EGG::Matrix34f &mat);
95
96 [[nodiscard]] f32 height() const {
97 return m_height;
98 }
99
100private:
101 f32 m_height;
102};
103
105public:
107 ~ObjectChoropuHoll() override;
108
110 void init() override {
111 resize(RADIUS, 0.0f);
112 }
113
115 [[nodiscard]] const char *getName() const override {
116 return "holl";
117 }
118
120 [[nodiscard]] u32 loadFlags() const override {
121 return 1;
122 }
123
125 [[nodiscard]] const char *getKclName() const override {
126 return "holl";
127 }
128
130 void createCollision() override {
131 m_collision = new ObjectCollisionSphere(RADIUS, EGG::Vector3f::zero);
132 }
133
135 void loadRail() override {}
136
138 Kart::Reaction onCollision(Kart::KartObject * /*kartObj*/, Kart::Reaction /*reactionOnKart*/,
139 Kart::Reaction /*reactionOnObj*/, EGG::Vector3f &hitDepth) override {
140 hitDepth.setZero();
141 return Kart::Reaction::Wall;
142 }
143
144private:
145 static constexpr f32 RADIUS = 300.0f;
146};
147
148} // namespace Field
A 3 x 4 matrix.
Definition Matrix.hh:8
Represents the MMM and rPG monty moles.
static constexpr f32 MAX_GROUND_LEN
Max length of the dirt trail.
bool m_isStationary
rPG moles don't move while MMM moles do
The highest level abstraction for a kart.
Definition KartObject.hh:11
Pertains to collision.
A 3D float vector.
Definition Vector.hh:87