4#include <spdlog/spdlog.h>
5#include <spdlog/fmt/ostr.h>
7#define CREATOR_NINTENDO 4
9#define TRACK_TYPE_NONE 0x3F
10#define TRACK_TYPE_MASK 0x3F
12#define TRACK_SHAPE_ROAD 0x0
13#define TRACK_SHAPE_WALLED_ROAD 0x40
14#define TRACK_SHAPE_PIPE 0x80
15#define TRACK_SHAPE_CYLINDER 0xC0
16#define TRACK_SHAPE_HALF_PIPE 0x100
17#define TRACK_SHAPE_TUNNEL 0x140
18#define TRACK_SHAPE_AIR 0x180
19#define TRACK_SHAPE_BORDERLESS_ROAD 0x1C0
21#define TRACK_SHAPE_MASK 0x1C0
23#define TRACK_JOIN_PREVIOUS 0x200
24#define TRACK_JOIN_NEXT 0x400
25#define TRACK_JOIN_MASK 0x600
27#define TRACK_FORM_STRAIGHT 0x00008000
28#define TRACK_FORM_LEFT 0x00010000
29#define TRACK_FORM_RIGHT 0x00018000
30#define TRACK_FORM_S 0x00020000
31#define TRACK_FORM_S_FLIPPED 0x00028000
33#define TRACK_FORM_MASK 0x00038000
35#define TRACK_FLAG_8000000 0x8000000
36#define TRACK_FLAG_JOINABLE 0x10000000
37#define TRACK_FLAG_20000000 0x20000000
38#define TRACK_FLAG_CONTINUOUS 0x40000000
124 BUILDING_SHORT_RIGHT,
127 BUILDING_SPIRE_RIGHT,
128 BUILDING_MOUNTAIN_BOTH,
129 BUILDING_MOUNTAIN_LEFT,
130 BUILDING_MOUNTAIN_RIGHT,
131 BUILDING_TALL_GOLD_BOTH,
132 BUILDING_TALL_GOLD_LEFT,
133 BUILDING_TALL_GOLD_RIGHT,
156enum class WalledRoad {
190enum class BorderlessRoad {
196inline std::ostream& operator<<(std::ostream& out,
const Venue& venue) {
199 case Venue::VENUE_MUTE_CITY:
200 output =
"VENUE_MUTE_CITY";
202 case Venue::VENUE_PORT_TOWN:
203 output =
"VENUE_PORT_TOWN";
205 case Venue::VENUE_BIG_BLUE:
206 output =
"VENUE_BIG_BLUE";
208 case Venue::VENUE_SAND_OCEAN:
209 output =
"VENUE_SAND_OCEAN";
211 case Venue::VENUE_DEVILS_FOREST:
212 output =
"VENUE_DEVILS_FOREST";
214 case Venue::VENUE_WHITE_LAND:
215 output =
"VENUE_WHITE_LAND";
217 case Venue::VENUE_SECTOR:
218 output =
"VENUE_SECTOR";
220 case Venue::VENUE_RED_CANYON:
221 output =
"VENUE_RED_CANYON";
223 case Venue::VENUE_FIRE_FIELD:
224 output =
"VENUE_FIRE_FIELD";
226 case Venue::VENUE_SILENCE:
227 output =
"VENUE_SILENCE";
229 case Venue::VENUE_ENDING:
230 output =
"VENUE_ENDING";
233 return out << output;
236inline std::ostream& operator<<(std::ostream& out,
const Skybox& skybox) {
239 case Skybox::SKYBOX_PURPLE:
240 output =
"SKYBOX_PURPLE";
242 case Skybox::SKYBOX_TURQUOISE:
243 output =
"SKYBOX_TURQUOISE";
245 case Skybox::SKYBOX_DESERT:
246 output =
"SKYBOX_DESERT";
248 case Skybox::SKYBOX_BLUE:
249 output =
"SKYBOX_BLUE";
251 case Skybox::SKYBOX_NIGHT:
252 output =
"SKYBOX_NIGHT";
254 case Skybox::SKYBOX_ORANGE:
255 output =
"SKYBOX_ORANGE";
257 case Skybox::SKYBOX_SUNSET:
258 output =
"SKYBOX_SUNSET";
260 case Skybox::SKYBOX_SKY_BLUE:
261 output =
"SKYBOX_SKY_BLUE";
264 return out << output;
267inline std::ostream& operator<<(std::ostream& out,
const PitZone& pitZone) {
270 case PitZone::PIT_NONE:
273 case PitZone::PIT_BOTH:
276 case PitZone::PIT_LEFT:
279 case PitZone::PIT_RIGHT:
280 output =
"PIT_RIGHT";
283 return out << output;
286inline std::ostream& operator<<(std::ostream& out,
const DashZone& dashZone) {
289 case DashZone::DASH_NONE:
290 output =
"DASH_NONE";
292 case DashZone::DASH_MIDDLE:
293 output =
"DASH_MIDDLE";
295 case DashZone::DASH_LEFT:
296 output =
"DASH_LEFT";
298 case DashZone::DASH_RIGHT:
299 output =
"DASH_RIGHT";
302 return out << output;
305inline std::ostream& operator<<(std::ostream& out,
const Dirt& dirt) {
308 case Dirt::DIRT_NONE:
309 output =
"DIRT_NONE";
311 case Dirt::DIRT_BOTH:
312 output =
"DIRT_BOTH";
314 case Dirt::DIRT_LEFT:
315 output =
"DIRT_LEFT";
317 case Dirt::DIRT_RIGHT:
318 output =
"DIRT_RIGHT";
320 case Dirt::DIRT_MIDDLE:
321 output =
"DIRT_MIDDLE";
324 return out << output;
327inline std::ostream& operator<<(std::ostream& out,
const Ice& ice) {
340 output =
"ICE_RIGHT";
342 case Ice::ICE_MIDDLE:
343 output =
"ICE_MIDDLE";
346 return out << output;
349inline std::ostream& operator<<(std::ostream& out,
const Jump& jump) {
352 case Jump::JUMP_NONE:
353 output =
"JUMP_NONE";
358 case Jump::JUMP_LEFT:
359 output =
"JUMP_LEFT";
361 case Jump::JUMP_RIGHT:
362 output =
"JUMP_RIGHT";
365 return out << output;
368inline std::ostream& operator<<(std::ostream& out,
const Landmine& landmine) {
371 case Landmine::LANDMINE_NONE:
372 output =
"LANDMINE_NONE";
374 case Landmine::LANDMINE_MIDDLE:
375 output =
"LANDMINE_MIDDLE";
377 case Landmine::LANDMINE_LEFT:
378 output =
"LANDMINE_LEFT";
380 case Landmine::LANDMINE_RIGHT:
381 output =
"LANDMINE_RIGHT";
384 return out << output;
387inline std::ostream& operator<<(std::ostream& out,
const Gate& gate) {
390 case Gate::GATE_NONE:
391 output =
"GATE_NONE";
393 case Gate::GATE_SQUARE:
394 output =
"GATE_SQUARE";
396 case Gate::GATE_START:
397 output =
"GATE_START";
399 case Gate::GATE_HEXAGONAL:
400 output =
"GATE_HEXAGONAL";
403 return out << output;
406inline std::ostream& operator<<(std::ostream& out,
const Building& building) {
409 case Building::BUILDING_NONE:
410 output =
"BUILDING_NONE";
412 case Building::BUILDING_TALL_BOTH:
413 output =
"BUILDING_TALL_BOTH";
415 case Building::BUILDING_TALL_LEFT:
416 output =
"BUILDING_TALL_LEFT";
418 case Building::BUILDING_TALL_RIGHT:
419 output =
"BUILDING_TALL_RIGHT";
421 case Building::BUILDING_SHORT_BOTH:
422 output =
"BUILDING_SHORT_BOTH";
424 case Building::BUILDING_SHORT_LEFT:
425 output =
"BUILDING_SHORT_LEFT";
427 case Building::BUILDING_SHORT_RIGHT:
428 output =
"BUILDING_SHORT_RIGHT";
430 case Building::BUILDING_SPIRE_BOTH:
431 output =
"BUILDING_SPIRE_BOTH";
433 case Building::BUILDING_SPIRE_LEFT:
434 output =
"BUILDING_SPIRE_LEFT";
436 case Building::BUILDING_SPIRE_RIGHT:
437 output =
"BUILDING_SPIRE_RIGHT";
439 case Building::BUILDING_MOUNTAIN_BOTH:
440 output =
"BUILDING_MOUNTAIN_BOTH";
442 case Building::BUILDING_MOUNTAIN_LEFT:
443 output =
"BUILDING_MOUNTAIN_LEFT";
445 case Building::BUILDING_MOUNTAIN_RIGHT:
446 output =
"BUILDING_MOUNTAIN_RIGHT";
448 case Building::BUILDING_TALL_GOLD_BOTH:
449 output =
"BUILDING_TALL_GOLD_BOTH";
451 case Building::BUILDING_TALL_GOLD_LEFT:
452 output =
"BUILDING_TALL_GOLD_LEFT";
454 case Building::BUILDING_TALL_GOLD_RIGHT:
455 output =
"BUILDING_TALL_GOLD_RIGHT";
458 return out << output;
461inline std::ostream& operator<<(std::ostream& out,
const Sign& sign) {
464 case Sign::SIGN_NONE:
465 output =
"SIGN_NONE";
476 case Sign::SIGN_NINTEX:
477 output =
"SIGN_NINTEX";
479 case Sign::SIGN_OVERHEAD:
480 output =
"SIGN_OVERHEAD";
483 return out << output;
486inline std::ostream& operator<<(std::ostream& out,
const Road& road) {
489 case Road::ROAD_START_LINE:
490 output =
"ROAD_START_LINE";
514 return out << output;
517inline std::ostream& operator<<(std::ostream& out,
const WalledRoad& walledRoad) {
519 switch (walledRoad) {
520 case WalledRoad::WALLED_ROAD_0:
521 output =
"WALLED_ROAD_0";
523 case WalledRoad::WALLED_ROAD_1:
524 output =
"WALLED_ROAD_1";
526 case WalledRoad::WALLED_ROAD_2:
527 output =
"WALLED_ROAD_2";
530 return out << output;
533inline std::ostream& operator<<(std::ostream& out,
const Pipe& pipe) {
549 return out << output;
552inline std::ostream& operator<<(std::ostream& out,
const Cylinder& cylinder) {
555 case Cylinder::CYLINDER_0:
556 output =
"CYLINDER_0";
558 case Cylinder::CYLINDER_1:
559 output =
"CYLINDER_1";
561 case Cylinder::CYLINDER_2:
562 output =
"CYLINDER_2";
564 case Cylinder::CYLINDER_3:
565 output =
"CYLINDER_3";
568 return out << output;
571inline std::ostream& operator<<(std::ostream& out,
const HalfPipe& halfPipe) {
574 case HalfPipe::HALF_PIPE_0:
575 output =
"HALF_PIPE_0";
577 case HalfPipe::HALF_PIPE_1:
578 output =
"HALF_PIPE_1";
580 case HalfPipe::HALF_PIPE_2:
581 output =
"HALF_PIPE_2";
583 case HalfPipe::HALF_PIPE_3:
584 output =
"HALF_PIPE_3";
587 return out << output;
590inline std::ostream& operator<<(std::ostream& out,
const Tunnel& tunnel) {
593 case Tunnel::TUNNEL_0:
596 case Tunnel::TUNNEL_1:
599 case Tunnel::TUNNEL_2:
602 case Tunnel::TUNNEL_3:
606 return out << output;
609inline std::ostream& operator<<(std::ostream& out,
const BorderlessRoad& borderlessRoad) {
611 switch (borderlessRoad) {
612 case BorderlessRoad::BORDERLESS_ROAD_0:
613 output =
"BORDERLESS_ROAD_0";
615 case BorderlessRoad::BORDERLESS_ROAD_1:
616 output =
"BORDERLESS_ROAD_1";
618 case BorderlessRoad::BORDERLESS_ROAD_2:
619 output =
"BORDERLESS_ROAD_2";
622 return out << output;