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
51class ObjectCowLeader final : public ObjectCow, public StateManager<ObjectCowLeader> {
52 friend class ObjectCowHerd;
53 friend class StateManager<ObjectCowLeader>;
54
55public:
57 ~ObjectCowLeader() override;
58
59 void init() override;
60 void calc() override;
61
63 [[nodiscard]] u32 loadFlags() const override {
64 return 1;
65 }
66
67private:
68 enum class AnmType {
69 EatST = 0,
70 Eat = 1,
71 EatED = 2,
72 };
73
74 void calcFloor() override;
75
76 void enterWait();
77 void enterEat();
78 void enterRoam();
79
80 void calcWait();
81 void calcEat();
82 void calcRoam();
83
84 f32 m_railSpeed;
85 bool m_endedRailSegment;
86 AnmType m_state1AnmType;
88
89 static constexpr std::array<StateManagerEntry<ObjectCowLeader>, 3> STATE_ENTRIES = {{
90 {0, &ObjectCowLeader::enterWait, &ObjectCowLeader::calcWait},
91 {1, &ObjectCowLeader::enterEat, &ObjectCowLeader::calcEat},
92 {2, &ObjectCowLeader::enterRoam, &ObjectCowLeader::calcRoam},
93 }};
94};
95
96class ObjectCowFollower;
97
99class ObjectCowFollower final : public ObjectCow, public StateManager<ObjectCowFollower> {
100 friend class ObjectCowHerd;
101 friend class StateManager<ObjectCowFollower>;
102
103public:
104 ObjectCowFollower(const System::MapdataGeoObj &params, const EGG::Vector3f &pos, f32 rot);
105 ~ObjectCowFollower() override;
106
107 void init() override;
108 void calc() override;
109
111 [[nodiscard]] u32 loadFlags() const override {
112 return 1;
113 }
114
116 void loadRail() override {}
117
118private:
119 void enterWait();
120 void enterFreeRoam();
121 void enterFollowLeader();
122
123 void calcWait();
124 void calcFreeRoam();
125 void calcFollowLeader();
126
127 const EGG::Vector3f m_posOffset;
128 RailInterpolator *m_rail;
133
134 static constexpr f32 BASE_TOP_SPEED = 2.0f;
135 static constexpr f32 TOP_SPEED_VARIANCE = 4.0f - 2.0f;
136
138 static constexpr f32 DIST_THRESHOLD = 200.0f;
139
140 static constexpr std::array<StateManagerEntry<ObjectCowFollower>, 3> STATE_ENTRIES = {{
141 {0, &ObjectCowFollower::enterWait, &ObjectCowFollower::calcWait},
142 {1, &ObjectCowFollower::enterFreeRoam, &ObjectCowFollower::calcFreeRoam},
143 {2, &ObjectCowFollower::enterFollowLeader, &ObjectCowFollower::calcFollowLeader},
144 }};
145};
146
151class ObjectCowHerd final : public ObjectCollidable {
152public:
154 ~ObjectCowHerd() override;
155
156 void init() override;
157 void calc() override;
158
160 [[nodiscard]] u32 loadFlags() const override {
161 return 1;
162 }
163
165 void createCollision() override {}
166
168 void loadRail() override {}
169
170private:
171 void checkCollision();
172
173 ObjectCowLeader *m_leader;
174 std::span<ObjectCowFollower *> m_followers;
175};
176
177} // namespace Field
A cow that follows a leader by sharing the same rail.
Definition ObjectCow.hh:99
u16 m_waitFrames
Number of frames the cow will stand still for.
Definition ObjectCow.hh:129
static constexpr f32 DIST_THRESHOLD
Distance at which a cow is considered close enough to the rail to stop moving.
Definition ObjectCow.hh:138
f32 m_railSegThreshold
The rail segmentT at which a cow will change to state 2.
Definition ObjectCow.hh:132
f32 m_topSpeed
The speed the cow will accelerate up to.
Definition ObjectCow.hh:130
bool m_bStopping
Set when the cow is coming to a stop.
Definition ObjectCow.hh:131
The manager class that controls a group of cows.
Definition ObjectCow.hh:151
void checkCollision()
Prevents cows from walking into each other.
Definition ObjectCow.cc:488
void calc() override
Definition ObjectCow.cc:472
void init() override
Assigns the herd's rail to each child.
Definition ObjectCow.cc:465
A cow who its own rail and whose position is not influenced by the path of the others.
Definition ObjectCow.hh:51
u16 m_eatFrames
Length of the state 1 eat animation.
Definition ObjectCow.hh:87
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:88