A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
Common.hh
Go to the documentation of this file.
1
3
4#pragma once
5
6#include <Types.hh>
7
8#include <egg/core/Heap.hh>
9
10#include <array>
11#include <limits>
12#include <utility>
13
14enum class Course {
15 Mario_Circuit = 0,
16 Moo_Moo_Meadows = 1,
17 Mushroom_Gorge = 2,
18 Grumble_Volcano = 3,
19 Toads_Factory = 4,
20 Coconut_Mall = 5,
21 DK_Summit = 6,
22 Wario_Gold_Mine = 7,
23 Luigi_Circuit = 8,
24 Daisy_Circuit = 9,
25 Moonview_Highway = 10,
26 Maple_Treeway = 11,
27 Bowsers_Castle = 12,
28 Rainbow_Road = 13,
29 Dry_Dry_Ruins = 14,
30 Koopa_Cape = 15,
31 GCN_Peach_Beach = 16,
32 GCN_Mario_Circuit = 17,
33 GCN_Waluigi_Stadium = 18,
34 GCN_DK_Mountain = 19,
35 DS_Yoshi_Falls = 20,
36 DS_Desert_Hills = 21,
37 DS_Peach_Gardens = 22,
38 DS_Delfino_Square = 23,
39 SNES_Mario_Circuit_3 = 24,
40 SNES_Ghost_Valley_2 = 25,
41 N64_Mario_Raceway = 26,
42 N64_Sherbet_Land = 27,
43 N64_Bowsers_Castle = 28,
44 N64_DKs_Jungle_Parkway = 29,
45 GBA_Bowser_Castle_3 = 30,
46 GBA_Shy_Guy_Beach = 31,
47 Delfino_Pier = 32,
48 Block_Plaza = 33,
49 Chain_Chomp_Roulette = 34,
50 Funky_Stadium = 35,
51 Thwomp_Desert = 36,
52 GCN_Cookie_Land = 37,
53 DS_Twilight_House = 38,
54 SNES_Battle_Course_4 = 39,
55 GBA_Battle_Course_3 = 40,
56 N64_Skyscraper = 41,
57 Galaxy_Colosseum = 54,
58 Win_Demo = 55,
59 Lose_Demo = 56,
60 Draw_Demo = 57,
61 Ending_Demo = 58,
62};
63
64enum class Vehicle {
65 Standard_Kart_S = 0,
66 Standard_Kart_M = 1,
67 Standard_Kart_L = 2,
68 Baby_Booster = 3,
69 Classic_Dragster = 4,
70 Offroader = 5,
71 Mini_Beast = 6,
72 Wild_Wing = 7,
73 Flame_Flyer = 8,
74 Cheep_Charger = 9,
75 Super_Blooper = 10,
76 Piranha_Prowler = 11,
77 Tiny_Titan = 12,
78 Daytripper = 13,
79 Jetsetter = 14,
80 Blue_Falcon = 15,
81 Sprinter = 16,
82 Honeycoupe = 17,
83 Standard_Bike_S = 18,
84 Standard_Bike_M = 19,
85 Standard_Bike_L = 20,
86 Bullet_Bike = 21,
87 Mach_Bike = 22,
88 Flame_Runner = 23,
89 Bit_Bike = 24,
90 Sugarscoot = 25,
91 Wario_Bike = 26,
92 Quacker = 27,
93 Zip_Zip = 28,
94 Shooting_Star = 29,
95 Magikruiser = 30,
96 Sneakster = 31,
97 Spear = 32,
98 Jet_Bubble = 33,
99 Dolphin_Dasher = 34,
100 Phantom = 35,
101 Max = 36,
102};
103
104enum class Character {
105 Mario = 0,
106 Baby_Peach = 1,
107 Waluigi = 2,
108 Bowser = 3,
109 Baby_Daisy = 4,
110 Dry_Bones = 5,
111 Baby_Mario = 6,
112 Luigi = 7,
113 Toad = 8,
114 Donkey_Kong = 9,
115 Yoshi = 10,
116 Wario = 11,
117 Baby_Luigi = 12,
118 Toadette = 13,
119 Koopa_Troopa = 14,
120 Daisy = 15,
121 Peach = 16,
122 Birdo = 17,
123 Diddy_Kong = 18,
124 King_Boo = 19,
125 Bowser_Jr = 20,
126 Dry_Bowser = 21,
127 Funky_Kong = 22,
128 Rosalina = 23,
129 Small_Mii_Outfit_A_Male = 24,
130 Small_Mii_Outfit_A_Female = 25,
131 Small_Mii_Outfit_B_Male = 26,
132 Small_Mii_Outfit_B_Female = 27,
133 Small_Mii_Outfit_C_Male = 28,
134 Small_Mii_Outfit_C_Female = 29,
135 Medium_Mii_Outfit_A_Male = 30,
136 Medium_Mii_Outfit_A_Female = 31,
137 Medium_Mii_Outfit_B_Male = 32,
138 Medium_Mii_Outfit_B_Female = 33,
139 Medium_Mii_Outfit_C_Male = 34,
140 Medium_Mii_Outfit_C_Female = 35,
141 Large_Mii_Outfit_A_Male = 36,
142 Large_Mii_Outfit_A_Female = 37,
143 Large_Mii_Outfit_B_Male = 38,
144 Large_Mii_Outfit_B_Female = 39,
145 Large_Mii_Outfit_C_Male = 40,
146 Large_Mii_Outfit_C_Female = 41,
147 Medium_Mii = 42,
148 Small_Mii = 43,
149 Large_Mii = 44,
150 Peach_Biker_Outfit = 45,
151 Daisy_Biker_Outfit = 46,
152 Rosalina_Biker_Outfit = 47,
153 Max = 48,
154};
155
156enum class WeightClass {
157 Invalid = -1,
158 Light = 0,
159 Medium = 1,
160 Heavy = 2,
161};
162
163enum class GroupID : u16 {
164 None = 0,
165 Race = 1,
166 Gfx = 2,
167 Kart = 3,
168 Object = 4,
169 Course = 5,
170 UI = 6,
171 Effect = 7,
172 Sound = 8,
173 Resource = 10,
174 HomeMenu = 11,
175 Item = 12,
176 Net = 13,
177};
178
179static constexpr WeightClass CharacterToWeight(Character character) {
180 switch (character) {
181 case Character::Baby_Peach:
182 case Character::Baby_Daisy... Character::Baby_Mario:
183 case Character::Toad:
184 case Character::Baby_Luigi... Character::Koopa_Troopa:
185 case Character::Small_Mii_Outfit_A_Male... Character::Small_Mii_Outfit_C_Female:
186 case Character::Small_Mii:
187 return WeightClass::Light;
188 case Character::Mario:
189 case Character::Luigi:
190 case Character::Yoshi:
191 case Character::Daisy... Character::Diddy_Kong:
192 case Character::Bowser_Jr:
193 case Character::Medium_Mii_Outfit_A_Male... Character::Medium_Mii_Outfit_C_Female:
194 case Character::Medium_Mii:
195 case Character::Peach_Biker_Outfit:
196 case Character::Daisy_Biker_Outfit:
197 return WeightClass::Medium;
198 case Character::Waluigi:
199 case Character::Bowser:
200 case Character::Donkey_Kong:
201 case Character::Wario:
202 case Character::King_Boo:
203 case Character::Dry_Bowser... Character::Rosalina:
204 case Character::Large_Mii_Outfit_A_Male... Character::Large_Mii_Outfit_C_Female:
205 case Character::Large_Mii:
206 case Character::Rosalina_Biker_Outfit:
207 return WeightClass::Heavy;
208 default:
209 return WeightClass::Invalid;
210 }
211}
212
213static constexpr WeightClass VehicleToWeight(Vehicle vehicle) {
214 switch (vehicle) {
215 case Vehicle::Standard_Kart_S:
216 case Vehicle::Baby_Booster:
217 case Vehicle::Mini_Beast:
218 case Vehicle::Cheep_Charger:
219 case Vehicle::Tiny_Titan:
220 case Vehicle::Blue_Falcon:
221 case Vehicle::Standard_Bike_S:
222 case Vehicle::Bullet_Bike:
223 case Vehicle::Bit_Bike:
224 case Vehicle::Quacker:
225 case Vehicle::Magikruiser:
226 case Vehicle::Jet_Bubble:
227 return WeightClass::Light;
228 case Vehicle::Standard_Kart_M:
229 case Vehicle::Classic_Dragster:
230 case Vehicle::Wild_Wing:
231 case Vehicle::Super_Blooper:
232 case Vehicle::Daytripper:
233 case Vehicle::Sprinter:
234 case Vehicle::Standard_Bike_M:
235 case Vehicle::Mach_Bike:
236 case Vehicle::Sugarscoot:
237 case Vehicle::Zip_Zip:
238 case Vehicle::Sneakster:
239 case Vehicle::Dolphin_Dasher:
240 return WeightClass::Medium;
241 case Vehicle::Standard_Kart_L:
242 case Vehicle::Offroader:
243 case Vehicle::Flame_Flyer:
244 case Vehicle::Piranha_Prowler:
245 case Vehicle::Jetsetter:
246 case Vehicle::Honeycoupe:
247 case Vehicle::Standard_Bike_L:
248 case Vehicle::Flame_Runner:
249 case Vehicle::Wario_Bike:
250 case Vehicle::Shooting_Star:
251 case Vehicle::Spear:
252 case Vehicle::Phantom:
253 return WeightClass::Heavy;
254 default:
255 return WeightClass::Invalid;
256 }
257}
258
259static constexpr const char *COURSE_NAMES[59] = {
260 "castle_course",
261 "farm_course",
262 "kinoko_course",
263 "volcano_course",
264 "factory_course",
265 "shopping_course",
266 "boardcross_course",
267 "truck_course",
268 "beginner_course",
269 "senior_course",
270 "ridgehighway_course",
271 "treehouse_course",
272 "koopa_course",
273 "rainbow_course",
274 "desert_course",
275 "water_course",
276 "old_peach_gc",
277 "old_mario_gc",
278 "old_waluigi_gc",
279 "old_donkey_gc",
280 "old_falls_ds",
281 "old_desert_ds",
282 "old_garden_ds",
283 "old_town_ds",
284 "old_mario_sfc",
285 "old_obake_sfc",
286 "old_mario_64",
287 "old_sherbet_64",
288 "old_koopa_64",
289 "old_donkey_64",
290 "old_koopa_gba",
291 "old_heyho_gba",
292 "venice_battle",
293 "block_battle",
294 "casino_battle",
295 "skate_battle",
296 "sand_battle",
297 "old_CookieLand_gc",
298 "old_House_ds",
299 "old_battle4_sfc",
300 "old_battle3_gba",
301 "old_matenro_64",
302 nullptr,
303 nullptr,
304 nullptr,
305 nullptr,
306 nullptr,
307 nullptr,
308 nullptr,
309 nullptr,
310 nullptr,
311 nullptr,
312 nullptr,
313 nullptr,
314 "ring_mission",
315 "winningrun_demo",
316 "loser_demo",
317 "draw_dmeo",
318 "ending_demo",
319};
320
321static constexpr const char *VEHICLE_NAMES[36] = {
322 "sdf_kart",
323 "mdf_kart",
324 "ldf_kart",
325 "sa_kart",
326 "ma_kart",
327 "la_kart",
328 "sb_kart",
329 "mb_kart",
330 "lb_kart",
331 "sc_kart",
332 "mc_kart",
333 "lc_kart",
334 "sd_kart",
335 "md_kart",
336 "ld_kart",
337 "se_kart",
338 "me_kart",
339 "le_kart",
340 "sdf_bike",
341 "mdf_bike",
342 "ldf_bike",
343 "sa_bike",
344 "ma_bike",
345 "la_bike",
346 "sb_bike",
347 "mb_bike",
348 "lb_bike",
349 "sc_bike",
350 "mc_bike",
351 "lc_bike",
352 "sd_bike",
353 "md_bike",
354 "ld_bike",
355 "se_bike",
356 "me_bike",
357 "le_bike",
358};
359
360STATIC_ASSERT(std::numeric_limits<f32>::epsilon() == 1.0f / 8388608.0f);
361STATIC_ASSERT(
362 std::endian::native == std::endian::big || std::endian::native == std::endian::little);
363
367template <template <typename...> class Base, typename Derived>
369private:
370 template <typename... Ts>
371 static std::true_type test(const Base<Ts...> *);
372
373 static std::false_type test(...);
374
375public:
376 static constexpr bool value = decltype(test(std::declval<Derived *>()))::value;
377};
378
379template <template <typename...> class Base, typename Derived>
380inline constexpr bool is_derived_from_template_v = is_derived_from_template<Base, Derived>::value;
381
382template <typename T>
383concept IntegralType = std::is_integral_v<T>;
384
385template <typename T>
386concept ParseableType = std::is_integral_v<T> ||
387 (std::is_floating_point_v<T> && (sizeof(T) == 4 || sizeof(T) == 8));
388
389// Form data into integral value
390template <IntegralType T>
391static inline T form(const u8 *data) {
392 T result = 0;
393 for (size_t i = 0; i < sizeof(T); ++i) {
394 result = (result << 8) | data[i];
395 }
396 return result;
397}
398
399// Consistent file parsing with byte-swappable values
400template <ParseableType T>
401static inline constexpr T parse(T val, std::endian endian = std::endian::big) {
402 if constexpr (std::is_integral_v<T>) {
403 return endian == std::endian::native ? val : std::byteswap(val);
404 } else {
405 if constexpr (sizeof(T) == 4) {
406 return std::bit_cast<T>(parse<u32>(std::bit_cast<u32>(val), endian));
407 } else {
408 return std::bit_cast<T>(parse<u64>(std::bit_cast<u64>(val), endian));
409 }
410 }
411}
412
413// Helper function to allow hex representation of f32
414static inline constexpr u32 f2u(f32 val) {
415 return std::bit_cast<u32>(val);
416}
417
418// The size of memory blocks that are allocated for game heap space.
419static constexpr size_t MEMORY_SPACE_SIZE = 0x1000000;
420
421#ifdef BUILD_DEBUG
422static constexpr auto DEFAULT_OPT = Abstract::Memory::MEMiHeapHead::OptFlag().setBit(
423 Abstract::Memory::MEMiHeapHead::eOptFlag::DebugFillAlloc);
424#else
425static constexpr auto DEFAULT_OPT = Abstract::Memory::MEMiHeapHead::OptFlag().setBit(
426 Abstract::Memory::MEMiHeapHead::eOptFlag::ZeroFillAlloc);
427#endif
Pertains to item handling.
Pertains to kart-related functionality.
constexpr TBitFlag< T, E > & setBit(Es... es)
Sets the corresponding bits for the provided enum values.
Definition BitFlag.hh:62
Helper template which uses function overloading and implicit up-casting to determine whether or not a...
Definition Common.hh:368