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