8#include <egg/core/Heap.hh>
27 Moonview_Highway = 10,
34 GCN_Mario_Circuit = 17,
35 GCN_Waluigi_Stadium = 18,
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,
51 Chain_Chomp_Roulette = 34,
55 DS_Twilight_House = 38,
56 SNES_Battle_Course_4 = 39,
57 GBA_Battle_Course_3 = 40,
59 Galaxy_Colosseum = 54,
106enum class Character {
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,
152 Peach_Biker_Outfit = 45,
153 Daisy_Biker_Outfit = 46,
154 Rosalina_Biker_Outfit = 47,
158enum class WeightClass {
165enum class GroupID : u16 {
181static constexpr WeightClass CharacterToWeight(Character 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;
211 return WeightClass::Invalid;
215static constexpr WeightClass VehicleToWeight(Vehicle 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:
254 case Vehicle::Phantom:
255 return WeightClass::Heavy;
257 return WeightClass::Invalid;
261static constexpr const char *COURSE_NAMES[59] = {
272 "ridgehighway_course",
323static constexpr const char *VEHICLE_NAMES[36] = {
362STATIC_ASSERT(std::numeric_limits<f32>::epsilon() == 1.0f / 8388608.0f);
364 std::endian::native == std::endian::big || std::endian::native == std::endian::little);
369template <
template <
typename...>
class Base,
typename Derived>
372 template <
typename... Ts>
373 static std::true_type test(
const Base<Ts...> *);
375 static std::false_type test(...);
378 static constexpr bool value =
decltype(test(std::declval<Derived *>()))::value;
381template <
template <
typename...>
class Base,
typename Derived>
389 (std::is_floating_point_v<T> && (
sizeof(T) == 4 ||
sizeof(T) == 8));
392template <IntegralType T>
393static inline T form(
const u8 *data) {
395 for (
size_t i = 0; i <
sizeof(T); ++i) {
396 result = (result << 8) | data[i];
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);
407 if constexpr (
sizeof(T) == 4) {
408 return std::bit_cast<T>(parse<u32>(std::bit_cast<u32>(val), endian));
410 return std::bit_cast<T>(parse<u64>(std::bit_cast<u64>(val), endian));
416static inline constexpr u32 f2u(f32 val) {
417 return std::bit_cast<u32>(val);
421static constexpr size_t MEMORY_SPACE_SIZE = 0x1000000;
424static constexpr auto DEFAULT_OPT = Abstract::Memory::MEMiHeapHead::OptFlag().setBit(
425 Abstract::Memory::MEMiHeapHead::eOptFlag::DebugFillAlloc);
427static constexpr auto DEFAULT_OPT = Abstract::Memory::MEMiHeapHead::OptFlag().setBit(
428 Abstract::Memory::MEMiHeapHead::eOptFlag::ZeroFillAlloc);
Helper template which uses function overloading and implicit up-casting to determine whether or not a...