A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
KartModel.cc
1#include "KartModel.hh"
2
3#include "game/kart/KartBody.hh"
4#include "game/kart/KartMove.hh"
5#include "game/kart/KartParam.hh"
6#include "game/kart/KartState.hh"
7
8#include "game/system/RaceConfig.hh"
9
10#include <egg/math/Math.hh>
11
12namespace Render {
13
14KartModel::KartModel() {
15 m_somethingLeft = false;
16 m_somethingRight = false;
17 _58 = 0.0f;
18 _54 = 1.0f;
19 _5c = 0.0f;
20 _64 = 0.0f;
21 _2e8 = 0.0f;
22}
23
24KartModel::~KartModel() = default;
25
27void KartModel::vf_1c() {
28 const auto &status = KartObjectProxy::status();
29
30 if (status.onBit(Kart::eStatus::Burnout)) {
31 _54 = 1.0f;
32
33 f32 pitch = move()->burnout().pitch();
34 f32 fVar2 = pitch + 75.0f * (pitch - _2e8);
35 f32 fVar4 = std::min(0.2f, 0.04f * EGG::Mathf::abs(fVar2));
36 fVar4 = fVar2 > 0.0f ? fVar4 : -fVar4;
37
38 _2e8 = pitch;
39 _58 += fVar4;
40 } else {
41 _2e8 = 0.0f;
42 _58 *= 0.9f;
43 }
44
45 bool frozenInIce =
46 System::RaceConfig::Instance()->raceScenario().course == Course::N64_Sherbet_Land &&
47 status.onBit(Kart::eStatus::InRespawn, Kart::eStatus::AfterRespawn);
48 f32 xStick = frozenInIce ? 0.0f : inputs()->currentState().stick.x;
49 bool isInCannon = status.onBit(Kart::eStatus::InCannon);
50 f32 fVar2 = isInCannon ? 0.02f : 0.1f;
51
52 f32 local_f31 = _58;
53 if (xStick <= 0.2f) {
54 if (xStick < -0.2f) {
55 _58 -= fVar2;
56 }
57 } else {
58 _58 += fVar2;
59 }
60
61 xStick = EGG::Mathf::abs(xStick);
62
63 if (isInCannon) {
64 xStick *= 0.8f;
65 fVar2 = 0.05f;
66 }
67
68 _54 += fVar2 * (xStick - _54);
69
70 if (local_f31 < -_54 || _54 < local_f31) {
71 if (-_54 <= _58) {
72 if (_54 < _58) {
73 _58 -= 0.1f;
74 }
75 } else {
76 _58 += 0.1f;
77 }
78 } else if (-_54 <= _58) {
79 _58 = std::min(_54, _58);
80 } else {
81 _58 = -_54;
82 }
83
84 f32 dVar13 = _58;
85
86 if (isBike()) {
87 if (state()->isDrifting()) {
88 dVar13 = m_isInsideDrift ? 5.0f : 20.0f;
89 } else {
90 dVar13 = 15.0f;
91 }
92 } else {
93 dVar13 = 15.0f;
94 }
95
96 f32 dVar12 = 0.0f;
97 _64 = dVar13 * 0.1f;
98
99 if (isBike()) {
100 dVar12 = -_58 * dVar13;
101
102 if (m_somethingLeft) {
103 dVar12 += m_isInsideDrift ? 5.0f : 10.0f;
104 } else if (m_somethingRight) {
105 dVar12 -= m_isInsideDrift ? 5.0f : 10.0f;
106 }
107 } else {
108 if (!m_somethingLeft && m_somethingRight) {
109 dVar12 -= 5.0f;
110 } else {
111 dVar12 += 5.0f;
112 }
113 }
114
115 if (dVar12 <= _5c) {
116 _5c -= _64;
117 _5c = std::max(_5c, dVar12);
118 } else {
119 _5c += _64;
120 _5c = std::min(_5c, dVar12);
121 }
122
123 body()->setAngle(_5c);
124}
125
127void KartModel::init() {
128 FUN_807C7828(param()->playerIdx(), isBike());
129
130 _2e8 = 0.0f;
131}
132
134void KartModel::calc() {
135 FUN_807CB530();
136}
137
141 m_somethingRight = false;
142 m_somethingLeft = false;
143 auto &status = KartObjectProxy::status();
144
146 if (state()->isDrifting() || (status.onBit(Kart::eStatus::ChargingSSMT) && turnInput)) {
147 if (move()->hopStickX() == 1) {
148 m_somethingLeft = true;
149 } else {
150 if (move()->hopStickX() == -1) {
151 m_somethingRight = true;
152 } else if (status.offBit(Kart::eStatus::StickLeft)) {
153 m_somethingRight = true;
154 } else {
155 m_somethingLeft = true;
156 }
157 }
158 }
159}
160
164 FUN_807CB198();
165 vf_1c();
166}
167
170void KartModel::FUN_807C7828(u8 /*playerIdx*/, bool /*isBike*/) {
171 m_isInsideDrift =
172 param()->stats().driftType == Kart::KartParam::Stats::DriftType::Inside_Drift_Bike;
173}
174
176KartModelKart::KartModelKart() = default;
177
179KartModelKart::~KartModelKart() = default;
180
182KartModelBike::KartModelBike() = default;
183
185KartModelBike::~KartModelBike() = default;
186
187} // namespace Render
constexpr bool offBit(Es... es) const
Checks if all of the corresponding bits for the provided enum values are off.
Definition BitFlag.hh:412
constexpr bool onBit(Es... es) const
Checks if any of the corresponding bits for the provided enum values are on.
Definition BitFlag.hh:379
void FUN_807C7828(u8 playerIdx, bool isBike)
Definition KartModel.cc:170
@ StickLeft
Set on left stick input. Mutually exclusive to m_bStickRight.
@ StickRight
Set on right stick input. Mutually exclusive to m_bStickLeft.
@ ChargingSSMT
Tracks whether we are charging a stand-still mini-turbo.
@ Burnout
Set during a burnout on race start.
Pertains to rendering the kart model.