8#include <egg/core/Heap.hh>
25 Moonview_Highway = 10,
32 GCN_Mario_Circuit = 17,
33 GCN_Waluigi_Stadium = 18,
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,
49 Chain_Chomp_Roulette = 34,
53 DS_Twilight_House = 38,
54 SNES_Battle_Course_4 = 39,
55 GBA_Battle_Course_3 = 40,
57 Galaxy_Colosseum = 54,
104enum class Character {
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,
150 Peach_Biker_Outfit = 45,
151 Daisy_Biker_Outfit = 46,
152 Rosalina_Biker_Outfit = 47,
156enum class WeightClass {
163enum class GroupID :
u16 {
179static constexpr WeightClass CharacterToWeight(Character 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;
209 return WeightClass::Invalid;
213static constexpr WeightClass VehicleToWeight(Vehicle 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:
252 case Vehicle::Phantom:
253 return WeightClass::Heavy;
255 return WeightClass::Invalid;
259static constexpr const char *COURSE_NAMES[59] = {
270 "ridgehighway_course",
321static constexpr const char *VEHICLE_NAMES[36] = {
360STATIC_ASSERT(std::numeric_limits<f32>::epsilon() == 1.0f / 8388608.0f);
362 std::endian::native == std::endian::big || std::endian::native == std::endian::little);
367template <
template <
typename...>
class Base,
typename Derived>
370 template <
typename... Ts>
371 static std::true_type test(
const Base<Ts...> *);
373 static std::false_type test(...);
376 static constexpr bool value =
decltype(test(std::declval<Derived *>()))::value;
379template <
template <
typename...>
class Base,
typename Derived>
387 (std::is_floating_point_v<T> && (
sizeof(T) == 4 ||
sizeof(T) == 8));
390template <IntegralType T>
391static inline T form(
const u8 *data) {
393 for (
size_t i = 0; i <
sizeof(T); ++i) {
394 result = (result << 8) | data[i];
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);
405 if constexpr (
sizeof(T) == 4) {
406 return std::bit_cast<T>(parse<u32>(std::bit_cast<u32>(val), endian));
408 return std::bit_cast<T>(parse<u64>(std::bit_cast<u64>(val), endian));
414static inline constexpr u32 f2u(f32 val) {
415 return std::bit_cast<u32>(val);
419static constexpr size_t MEMORY_SPACE_SIZE = 0x1000000;
423 Abstract::Memory::MEMiHeapHead::eOptFlag::DebugFillAlloc);
426 Abstract::Memory::MEMiHeapHead::eOptFlag::ZeroFillAlloc);
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.
Helper template which uses function overloading and implicit up-casting to determine whether or not a...