A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
ObjectCow.hh
1#pragma once
2
3#include "game/field/StateManager.hh"
4#include "game/field/obj/ObjectCollidable.hh"
5
6namespace Field {
7
8class RailInterpolator;
9
12public:
13 ObjectCow(const System::MapdataGeoObj &params);
14 ~ObjectCow() override;
15
16 Kart::Reaction onCollision(Kart::KartObject *kartObj, Kart::Reaction reactionOnKart,
17 Kart::Reaction reactionOnObj, EGG::Vector3f &hitDepth) override;
18
19protected:
20 virtual void calcFloor();
21
22 void setup();
23 void calcPos();
24 f32 setTarget(const EGG::Vector3f &v);
25
27 [[nodiscard]] static EGG::Vector3f Interpolate(f32 t, const EGG::Vector3f &v0,
28 const EGG::Vector3f &v1) {
29 return v0 + (v1 - v0) * t;
30 }
31
33 EGG::Vector3f m_tangent;
34 EGG::Vector3f m_prevTangent;
35 EGG::Vector3f m_up;
36 EGG::Vector3f m_velocity;
38 f32 m_tangentFactor;
39 EGG::Vector3f m_floorNrm;
41 EGG::Vector3f m_targetDir;
43 f32 m_interpRate;
44
45 static constexpr EGG::Vector3f GRAVITY_FORCE = EGG::Vector3f(0.0f, 2.0f, 0.0f);
46};
47
48class ObjectCowLeader;
49
50template <>
51class StateManager<ObjectCowLeader> : public StateManagerBase<ObjectCowLeader> {
52public:
54 ~StateManager() override;
55
56private:
57 static const std::array<StateManagerEntry<ObjectCowLeader>, 3> STATE_ENTRIES;
58};
59
61class ObjectCowLeader final : public ObjectCow, public StateManager<ObjectCowLeader> {
62 friend class ObjectCowHerd;
63 friend class StateManager<ObjectCowLeader>;
64
65public:
67 ~ObjectCowLeader() override;
68
69 void init() override;
70 void calc() override;
71
73 [[nodiscard]] u32 loadFlags() const override {
74 return 1;
75 }
76
77private:
78 enum class AnmType {
79 EatST = 0,
80 Eat = 1,
81 EatED = 2,
82 };
83
84 void calcFloor() override;
85
86 void enterWait();
87 void enterEat();
88 void enterRoam();
89
90 void calcWait();
91 void calcEat();
92 void calcRoam();
93
94 f32 m_railSpeed;
95 bool m_endedRailSegment;
96 AnmType m_state1AnmType;
98};
99
101
102template <>
103class StateManager<ObjectCowFollower> : public StateManagerBase<ObjectCowFollower> {
104public:
106 ~StateManager() override;
107
108private:
109 static const std::array<StateManagerEntry<ObjectCowFollower>, 3> STATE_ENTRIES;
110};
111
113class ObjectCowFollower final : public ObjectCow, public StateManager<ObjectCowFollower> {
114 friend class ObjectCowHerd;
115 friend class StateManager<ObjectCowFollower>;
116
117public:
118 ObjectCowFollower(const System::MapdataGeoObj &params, const EGG::Vector3f &pos, f32 rot);
119 ~ObjectCowFollower() override;
120
121 void init() override;
122 void calc() override;
123
125 [[nodiscard]] u32 loadFlags() const override {
126 return 1;
127 }
128
130 void loadRail() override {}
131
132private:
133 void enterWait();
134 void enterFreeRoam();
135 void enterFollowLeader();
136
137 void calcWait();
138 void calcFreeRoam();
139 void calcFollowLeader();
140
141 const EGG::Vector3f m_posOffset;
142 RailInterpolator *m_rail;
147
148 static constexpr f32 BASE_TOP_SPEED = 2.0f;
149 static constexpr f32 TOP_SPEED_VARIANCE = 4.0f - 2.0f;
150
152 static constexpr f32 DIST_THRESHOLD = 200.0f;
153};
154
159class ObjectCowHerd final : public ObjectCollidable {
160public:
162 ~ObjectCowHerd() override;
163
164 void init() override;
165 void calc() override;
166
168 [[nodiscard]] u32 loadFlags() const override {
169 return 1;
170 }
171
173 void createCollision() override {}
174
176 void loadRail() override {}
177
178private:
179 void checkCollision();
180
181 ObjectCowLeader *m_leader;
182 std::span<ObjectCowFollower *> m_followers;
183};
184
185} // namespace Field
A cow that follows a leader by sharing the same rail.
Definition ObjectCow.hh:113
u16 m_waitFrames
Number of frames the cow will stand still for.
Definition ObjectCow.hh:143
static constexpr f32 DIST_THRESHOLD
Distance at which a cow is considered close enough to the rail to stop moving.
Definition ObjectCow.hh:152
f32 m_railSegThreshold
The rail segmentT at which a cow will change to state 2.
Definition ObjectCow.hh:146
f32 m_topSpeed
The speed the cow will accelerate up to.
Definition ObjectCow.hh:144
bool m_bStopping
Set when the cow is coming to a stop.
Definition ObjectCow.hh:145
The manager class that controls a group of cows.
Definition ObjectCow.hh:159
void checkCollision()
Prevents cows from walking into each other.
Definition ObjectCow.cc:568
void calc() override
Definition ObjectCow.cc:552
void init() override
Assigns the herd's rail to each child.
Definition ObjectCow.cc:545
A cow who its own rail and whose position is not influenced by the path of the others.
Definition ObjectCow.hh:61
u16 m_eatFrames
Length of the state 1 eat animation.
Definition ObjectCow.hh:97
The base class shared between ObjectCowLeader and ObjectCowFollower.
Definition ObjectCow.hh:11
EGG::Vector3f m_upForce
Used by calcPos to counteract gravity.
Definition ObjectCow.hh:42
u32 m_startFrame
The frame the cow will start moving.
Definition ObjectCow.hh:32
EGG::Vector3f m_state1TargetPos
Calculated in enterState1.
Definition ObjectCow.hh:40
f32 m_xzSpeed
XZ plane length of m_velocity.
Definition ObjectCow.hh:37
The highest level abstraction for a kart.
Definition KartObject.hh:11
Pertains to collision.
A 3D float vector.
Definition Vector.hh:87