A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
ObjectHwanwan.hh
1#pragma once
2
3#include "game/field/StateManager.hh"
4#include "game/field/obj/ObjectCollidable.hh"
5
6#include "game/kart/KartCollide.hh"
7#include "game/kart/KartObject.hh"
8
9namespace Field {
10
11class ObjectHwanwan : public ObjectCollidable, public StateManager {
12 friend class ObjectHwanwanManager;
13
14public:
15 ObjectHwanwan(const System::MapdataGeoObj &params);
16 ~ObjectHwanwan() override;
17
18 void init() override;
19 void calc() override;
20
22 [[nodiscard]] u32 loadFlags() const override {
23 return 1;
24 }
25
27 [[nodiscard]] const char *getKclName() const override {
28 return "wanwan";
29 }
30
32 void loadRail() override {}
33
35 Kart::Reaction onCollision(Kart::KartObject *kartObj, Kart::Reaction reactionOnKart,
36 Kart::Reaction /*reactionOnObj*/, EGG::Vector3f & /*hitDepth*/) override {
37 return kartObj->speedRatioCapped() < 0.5f ? Kart::Reaction::WallAllSpeed : reactionOnKart;
38 }
39
40private:
42 void enterState0() {}
43
45 void enterState1() {}
46
48 void calcState0() {
49 if (m_touchingGround) {
50 m_bounceVel += EGG::Vector3f::ey * 12.0f;
51 }
52 }
53
55 void calcState1() {}
56
57 void checkFloorCollision();
58 void calcUp();
59
60 const EGG::Vector3f m_initPos;
61 EGG::Vector3f m_workPos;
62 EGG::Vector3f m_extVel;
63 EGG::Vector3f m_bounceVel;
64 EGG::Vector3f m_tangent;
65 EGG::Vector3f m_up;
66 EGG::Vector3f m_targetUp;
67 bool m_touchingGround;
68 f32 m_initJumpVel;
69 f32 m_targetY;
70
71 static constexpr f32 DIAMETER = 400.0f;
72 static constexpr EGG::Vector3f GRAVITY = EGG::Vector3f(0.0f, 2.5f, 0.0f);
73
74 static constexpr std::array<StateManagerEntry, 2> STATE_ENTRIES = {{
75 {StateEntry<ObjectHwanwan, &ObjectHwanwan::enterState0, &ObjectHwanwan::calcState0>(0)},
76 {StateEntry<ObjectHwanwan, &ObjectHwanwan::enterState1, &ObjectHwanwan::calcState1>(1)},
77 }};
78};
79
80class ObjectHwanwanManager : public ObjectCollidable {
81public:
82 ObjectHwanwanManager(const System::MapdataGeoObj &params);
83 ~ObjectHwanwanManager() override;
84
85 void init() override;
86 void calc() override;
87
89 [[nodiscard]] u32 loadFlags() const override {
90 return 1;
91 }
92
94 void loadGraphics() override {}
95
97 void createCollision() override {}
98
99private:
100 void calcState();
101
102 ObjectHwanwan *m_hwanwan;
103};
104
105} // namespace Field
The highest level abstraction for a kart.
Definition KartObject.hh:11
Pertains to collision.
A 3D float vector.
Definition Vector.hh:88