Torch
Loading...
Searching...
No Matches
Course.h
1#pragma once
2
3#include <string>
4#include <spdlog/spdlog.h>
5#include <spdlog/fmt/ostr.h>
6
7#define CREATOR_NINTENDO 4
8
9#define TRACK_TYPE_NONE 0x3F
10#define TRACK_TYPE_MASK 0x3F
11
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
20
21#define TRACK_SHAPE_MASK 0x1C0
22
23#define TRACK_JOIN_PREVIOUS 0x200
24#define TRACK_JOIN_NEXT 0x400
25#define TRACK_JOIN_MASK 0x600
26
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
32
33#define TRACK_FORM_MASK 0x00038000
34
35#define TRACK_FLAG_8000000 0x8000000
36#define TRACK_FLAG_JOINABLE 0x10000000
37#define TRACK_FLAG_20000000 0x20000000
38#define TRACK_FLAG_CONTINUOUS 0x40000000
39
40namespace FZX {
41enum class Venue {
42 /* 0 */ VENUE_MUTE_CITY,
43 /* 1 */ VENUE_PORT_TOWN,
44 /* 2 */ VENUE_BIG_BLUE,
45 /* 3 */ VENUE_SAND_OCEAN,
46 /* 4 */ VENUE_DEVILS_FOREST,
47 /* 5 */ VENUE_WHITE_LAND,
48 /* 6 */ VENUE_SECTOR,
49 /* 7 */ VENUE_RED_CANYON,
50 /* 8 */ VENUE_FIRE_FIELD,
51 /* 9 */ VENUE_SILENCE,
52 /* 10 */ VENUE_ENDING,
53};
54
55enum class Skybox {
56 /* 0 */ SKYBOX_PURPLE,
57 /* 1 */ SKYBOX_TURQUOISE,
58 /* 2 */ SKYBOX_DESERT,
59 /* 3 */ SKYBOX_BLUE,
60 /* 4 */ SKYBOX_NIGHT,
61 /* 5 */ SKYBOX_ORANGE,
62 /* 6 */ SKYBOX_SUNSET,
63 /* 7 */ SKYBOX_SKY_BLUE,
64};
65
66enum class PitZone {
67 /* -1 */ PIT_NONE = -1,
68 /* 0 */ PIT_BOTH,
69 /* 1 */ PIT_LEFT,
70 /* 2 */ PIT_RIGHT,
71};
72
73enum class DashZone {
74 /* -1 */ DASH_NONE = -1,
75 /* 0 */ DASH_MIDDLE,
76 /* 1 */ DASH_LEFT,
77 /* 2 */ DASH_RIGHT,
78};
79
80enum class Dirt {
81 /* -1 */ DIRT_NONE = -1,
82 /* 0 */ DIRT_BOTH,
83 /* 1 */ DIRT_LEFT,
84 /* 2 */ DIRT_RIGHT,
85 /* 3 */ DIRT_MIDDLE,
86};
87
88enum class Ice {
89 /* -1 */ ICE_NONE = -1,
90 /* 0 */ ICE_BOTH,
91 /* 1 */ ICE_LEFT,
92 /* 2 */ ICE_RIGHT,
93 /* 3 */ ICE_MIDDLE,
94};
95
96enum class Jump {
97 /* -1 */ JUMP_NONE = -1,
98 /* 0 */ JUMP_ALL,
99 /* 1 */ JUMP_LEFT,
100 /* 2 */ JUMP_RIGHT,
101};
102
103enum class Landmine {
104 /* -1 */ LANDMINE_NONE = -1,
105 /* 0 */ LANDMINE_MIDDLE,
106 /* 1 */ LANDMINE_LEFT,
107 /* 2 */ LANDMINE_RIGHT,
108};
109
110enum class Gate {
111 /* -1 */ GATE_NONE = -1,
112 /* 0 */ GATE_SQUARE,
113 /* 1 */ GATE_START,
114 /* 2 */ GATE_HEXAGONAL,
115};
116
117enum class Building {
118 /* -1 */ BUILDING_NONE = -1,
119 /* 0 */ BUILDING_TALL_BOTH,
120 /* 1 */ BUILDING_TALL_LEFT,
121 /* 2 */ BUILDING_TALL_RIGHT,
122 /* 3 */ BUILDING_SHORT_BOTH,
123 /* 4 */ BUILDING_SHORT_LEFT,
124 /* 5 */ BUILDING_SHORT_RIGHT,
125 /* 6 */ BUILDING_SPIRE_BOTH,
126 /* 7 */ BUILDING_SPIRE_LEFT,
127 /* 8 */ BUILDING_SPIRE_RIGHT,
128 /* 9 */ BUILDING_MOUNTAIN_BOTH,
129 /* 10 */ BUILDING_MOUNTAIN_LEFT,
130 /* 11 */ BUILDING_MOUNTAIN_RIGHT,
131 /* 12 */ BUILDING_TALL_GOLD_BOTH,
132 /* 13 */ BUILDING_TALL_GOLD_LEFT,
133 /* 14 */ BUILDING_TALL_GOLD_RIGHT,
134};
135
136enum class Sign {
137 /* -1 */ SIGN_NONE = -1,
138 /* 0 */ SIGN_TV,
139 /* 1 */ SIGN_1,
140 /* 2 */ SIGN_2,
141 /* 3 */ SIGN_NINTEX,
142 /* 4 */ SIGN_OVERHEAD,
143};
144
145enum class Road {
146 /* 0 */ ROAD_START_LINE,
147 /* 1 */ ROAD_1,
148 /* 2 */ ROAD_2,
149 /* 3 */ ROAD_3,
150 /* 4 */ ROAD_4,
151 /* 5 */ ROAD_5,
152 /* 6 */ ROAD_6,
153 /* 7 */ ROAD_7,
154};
155
156enum class WalledRoad {
157 /* 0 */ WALLED_ROAD_0,
158 /* 1 */ WALLED_ROAD_1,
159 /* 2 */ WALLED_ROAD_2,
160};
161
162enum class Pipe {
163 /* 0 */ PIPE_0,
164 /* 1 */ PIPE_1,
165 /* 2 */ PIPE_2,
166 /* 3 */ PIPE_3,
167};
168
169enum class Cylinder {
170 /* 0 */ CYLINDER_0,
171 /* 1 */ CYLINDER_1,
172 /* 2 */ CYLINDER_2,
173 /* 3 */ CYLINDER_3,
174};
175
176enum class HalfPipe {
177 /* 0 */ HALF_PIPE_0,
178 /* 1 */ HALF_PIPE_1,
179 /* 2 */ HALF_PIPE_2,
180 /* 3 */ HALF_PIPE_3,
181};
182
183enum class Tunnel {
184 /* 0 */ TUNNEL_0,
185 /* 1 */ TUNNEL_1,
186 /* 2 */ TUNNEL_2,
187 /* 3 */ TUNNEL_3,
188};
189
190enum class BorderlessRoad {
191 /* 0 */ BORDERLESS_ROAD_0,
192 /* 1 */ BORDERLESS_ROAD_1,
193 /* 2 */ BORDERLESS_ROAD_2,
194};
195
196inline std::ostream& operator<<(std::ostream& out, const Venue& venue) {
197 std::string output;
198 switch (venue) {
199 case Venue::VENUE_MUTE_CITY:
200 output = "VENUE_MUTE_CITY";
201 break;
202 case Venue::VENUE_PORT_TOWN:
203 output = "VENUE_PORT_TOWN";
204 break;
205 case Venue::VENUE_BIG_BLUE:
206 output = "VENUE_BIG_BLUE";
207 break;
208 case Venue::VENUE_SAND_OCEAN:
209 output = "VENUE_SAND_OCEAN";
210 break;
211 case Venue::VENUE_DEVILS_FOREST:
212 output = "VENUE_DEVILS_FOREST";
213 break;
214 case Venue::VENUE_WHITE_LAND:
215 output = "VENUE_WHITE_LAND";
216 break;
217 case Venue::VENUE_SECTOR:
218 output = "VENUE_SECTOR";
219 break;
220 case Venue::VENUE_RED_CANYON:
221 output = "VENUE_RED_CANYON";
222 break;
223 case Venue::VENUE_FIRE_FIELD:
224 output = "VENUE_FIRE_FIELD";
225 break;
226 case Venue::VENUE_SILENCE:
227 output = "VENUE_SILENCE";
228 break;
229 case Venue::VENUE_ENDING:
230 output = "VENUE_ENDING";
231 break;
232 }
233 return out << output;
234}
235
236inline std::ostream& operator<<(std::ostream& out, const Skybox& skybox) {
237 std::string output;
238 switch (skybox) {
239 case Skybox::SKYBOX_PURPLE:
240 output = "SKYBOX_PURPLE";
241 break;
242 case Skybox::SKYBOX_TURQUOISE:
243 output = "SKYBOX_TURQUOISE";
244 break;
245 case Skybox::SKYBOX_DESERT:
246 output = "SKYBOX_DESERT";
247 break;
248 case Skybox::SKYBOX_BLUE:
249 output = "SKYBOX_BLUE";
250 break;
251 case Skybox::SKYBOX_NIGHT:
252 output = "SKYBOX_NIGHT";
253 break;
254 case Skybox::SKYBOX_ORANGE:
255 output = "SKYBOX_ORANGE";
256 break;
257 case Skybox::SKYBOX_SUNSET:
258 output = "SKYBOX_SUNSET";
259 break;
260 case Skybox::SKYBOX_SKY_BLUE:
261 output = "SKYBOX_SKY_BLUE";
262 break;
263 }
264 return out << output;
265}
266
267inline std::ostream& operator<<(std::ostream& out, const PitZone& pitZone) {
268 std::string output;
269 switch (pitZone) {
270 case PitZone::PIT_NONE:
271 output = "PIT_NONE";
272 break;
273 case PitZone::PIT_BOTH:
274 output = "PIT_BOTH";
275 break;
276 case PitZone::PIT_LEFT:
277 output = "PIT_LEFT";
278 break;
279 case PitZone::PIT_RIGHT:
280 output = "PIT_RIGHT";
281 break;
282 }
283 return out << output;
284}
285
286inline std::ostream& operator<<(std::ostream& out, const DashZone& dashZone) {
287 std::string output;
288 switch (dashZone) {
289 case DashZone::DASH_NONE:
290 output = "DASH_NONE";
291 break;
292 case DashZone::DASH_MIDDLE:
293 output = "DASH_MIDDLE";
294 break;
295 case DashZone::DASH_LEFT:
296 output = "DASH_LEFT";
297 break;
298 case DashZone::DASH_RIGHT:
299 output = "DASH_RIGHT";
300 break;
301 }
302 return out << output;
303}
304
305inline std::ostream& operator<<(std::ostream& out, const Dirt& dirt) {
306 std::string output;
307 switch (dirt) {
308 case Dirt::DIRT_NONE:
309 output = "DIRT_NONE";
310 break;
311 case Dirt::DIRT_BOTH:
312 output = "DIRT_BOTH";
313 break;
314 case Dirt::DIRT_LEFT:
315 output = "DIRT_LEFT";
316 break;
317 case Dirt::DIRT_RIGHT:
318 output = "DIRT_RIGHT";
319 break;
320 case Dirt::DIRT_MIDDLE:
321 output = "DIRT_MIDDLE";
322 break;
323 }
324 return out << output;
325}
326
327inline std::ostream& operator<<(std::ostream& out, const Ice& ice) {
328 std::string output;
329 switch (ice) {
330 case Ice::ICE_NONE:
331 output = "ICE_NONE";
332 break;
333 case Ice::ICE_BOTH:
334 output = "ICE_BOTH";
335 break;
336 case Ice::ICE_LEFT:
337 output = "ICE_LEFT";
338 break;
339 case Ice::ICE_RIGHT:
340 output = "ICE_RIGHT";
341 break;
342 case Ice::ICE_MIDDLE:
343 output = "ICE_MIDDLE";
344 break;
345 }
346 return out << output;
347}
348
349inline std::ostream& operator<<(std::ostream& out, const Jump& jump) {
350 std::string output;
351 switch (jump) {
352 case Jump::JUMP_NONE:
353 output = "JUMP_NONE";
354 break;
355 case Jump::JUMP_ALL:
356 output = "JUMP_ALL";
357 break;
358 case Jump::JUMP_LEFT:
359 output = "JUMP_LEFT";
360 break;
361 case Jump::JUMP_RIGHT:
362 output = "JUMP_RIGHT";
363 break;
364 }
365 return out << output;
366}
367
368inline std::ostream& operator<<(std::ostream& out, const Landmine& landmine) {
369 std::string output;
370 switch (landmine) {
371 case Landmine::LANDMINE_NONE:
372 output = "LANDMINE_NONE";
373 break;
374 case Landmine::LANDMINE_MIDDLE:
375 output = "LANDMINE_MIDDLE";
376 break;
377 case Landmine::LANDMINE_LEFT:
378 output = "LANDMINE_LEFT";
379 break;
380 case Landmine::LANDMINE_RIGHT:
381 output = "LANDMINE_RIGHT";
382 break;
383 }
384 return out << output;
385}
386
387inline std::ostream& operator<<(std::ostream& out, const Gate& gate) {
388 std::string output;
389 switch (gate) {
390 case Gate::GATE_NONE:
391 output = "GATE_NONE";
392 break;
393 case Gate::GATE_SQUARE:
394 output = "GATE_SQUARE";
395 break;
396 case Gate::GATE_START:
397 output = "GATE_START";
398 break;
399 case Gate::GATE_HEXAGONAL:
400 output = "GATE_HEXAGONAL";
401 break;
402 }
403 return out << output;
404}
405
406inline std::ostream& operator<<(std::ostream& out, const Building& building) {
407 std::string output;
408 switch (building) {
409 case Building::BUILDING_NONE:
410 output = "BUILDING_NONE";
411 break;
412 case Building::BUILDING_TALL_BOTH:
413 output = "BUILDING_TALL_BOTH";
414 break;
415 case Building::BUILDING_TALL_LEFT:
416 output = "BUILDING_TALL_LEFT";
417 break;
418 case Building::BUILDING_TALL_RIGHT:
419 output = "BUILDING_TALL_RIGHT";
420 break;
421 case Building::BUILDING_SHORT_BOTH:
422 output = "BUILDING_SHORT_BOTH";
423 break;
424 case Building::BUILDING_SHORT_LEFT:
425 output = "BUILDING_SHORT_LEFT";
426 break;
427 case Building::BUILDING_SHORT_RIGHT:
428 output = "BUILDING_SHORT_RIGHT";
429 break;
430 case Building::BUILDING_SPIRE_BOTH:
431 output = "BUILDING_SPIRE_BOTH";
432 break;
433 case Building::BUILDING_SPIRE_LEFT:
434 output = "BUILDING_SPIRE_LEFT";
435 break;
436 case Building::BUILDING_SPIRE_RIGHT:
437 output = "BUILDING_SPIRE_RIGHT";
438 break;
439 case Building::BUILDING_MOUNTAIN_BOTH:
440 output = "BUILDING_MOUNTAIN_BOTH";
441 break;
442 case Building::BUILDING_MOUNTAIN_LEFT:
443 output = "BUILDING_MOUNTAIN_LEFT";
444 break;
445 case Building::BUILDING_MOUNTAIN_RIGHT:
446 output = "BUILDING_MOUNTAIN_RIGHT";
447 break;
448 case Building::BUILDING_TALL_GOLD_BOTH:
449 output = "BUILDING_TALL_GOLD_BOTH";
450 break;
451 case Building::BUILDING_TALL_GOLD_LEFT:
452 output = "BUILDING_TALL_GOLD_LEFT";
453 break;
454 case Building::BUILDING_TALL_GOLD_RIGHT:
455 output = "BUILDING_TALL_GOLD_RIGHT";
456 break;
457 }
458 return out << output;
459}
460
461inline std::ostream& operator<<(std::ostream& out, const Sign& sign) {
462 std::string output;
463 switch (sign) {
464 case Sign::SIGN_NONE:
465 output = "SIGN_NONE";
466 break;
467 case Sign::SIGN_TV:
468 output = "SIGN_TV";
469 break;
470 case Sign::SIGN_1:
471 output = "SIGN_1";
472 break;
473 case Sign::SIGN_2:
474 output = "SIGN_2";
475 break;
476 case Sign::SIGN_NINTEX:
477 output = "SIGN_NINTEX";
478 break;
479 case Sign::SIGN_OVERHEAD:
480 output = "SIGN_OVERHEAD";
481 break;
482 }
483 return out << output;
484}
485
486inline std::ostream& operator<<(std::ostream& out, const Road& road) {
487 std::string output;
488 switch (road) {
489 case Road::ROAD_START_LINE:
490 output = "ROAD_START_LINE";
491 break;
492 case Road::ROAD_1:
493 output = "ROAD_1";
494 break;
495 case Road::ROAD_2:
496 output = "ROAD_2";
497 break;
498 case Road::ROAD_3:
499 output = "ROAD_3";
500 break;
501 case Road::ROAD_4:
502 output = "ROAD_4";
503 break;
504 case Road::ROAD_5:
505 output = "ROAD_5";
506 break;
507 case Road::ROAD_6:
508 output = "ROAD_6";
509 break;
510 case Road::ROAD_7:
511 output = "ROAD_7";
512 break;
513 }
514 return out << output;
515}
516
517inline std::ostream& operator<<(std::ostream& out, const WalledRoad& walledRoad) {
518 std::string output;
519 switch (walledRoad) {
520 case WalledRoad::WALLED_ROAD_0:
521 output = "WALLED_ROAD_0";
522 break;
523 case WalledRoad::WALLED_ROAD_1:
524 output = "WALLED_ROAD_1";
525 break;
526 case WalledRoad::WALLED_ROAD_2:
527 output = "WALLED_ROAD_2";
528 break;
529 }
530 return out << output;
531}
532
533inline std::ostream& operator<<(std::ostream& out, const Pipe& pipe) {
534 std::string output;
535 switch (pipe) {
536 case Pipe::PIPE_0:
537 output = "PIPE_0";
538 break;
539 case Pipe::PIPE_1:
540 output = "PIPE_1";
541 break;
542 case Pipe::PIPE_2:
543 output = "PIPE_2";
544 break;
545 case Pipe::PIPE_3:
546 output = "PIPE_3";
547 break;
548 }
549 return out << output;
550}
551
552inline std::ostream& operator<<(std::ostream& out, const Cylinder& cylinder) {
553 std::string output;
554 switch (cylinder) {
555 case Cylinder::CYLINDER_0:
556 output = "CYLINDER_0";
557 break;
558 case Cylinder::CYLINDER_1:
559 output = "CYLINDER_1";
560 break;
561 case Cylinder::CYLINDER_2:
562 output = "CYLINDER_2";
563 break;
564 case Cylinder::CYLINDER_3:
565 output = "CYLINDER_3";
566 break;
567 }
568 return out << output;
569}
570
571inline std::ostream& operator<<(std::ostream& out, const HalfPipe& halfPipe) {
572 std::string output;
573 switch (halfPipe) {
574 case HalfPipe::HALF_PIPE_0:
575 output = "HALF_PIPE_0";
576 break;
577 case HalfPipe::HALF_PIPE_1:
578 output = "HALF_PIPE_1";
579 break;
580 case HalfPipe::HALF_PIPE_2:
581 output = "HALF_PIPE_2";
582 break;
583 case HalfPipe::HALF_PIPE_3:
584 output = "HALF_PIPE_3";
585 break;
586 }
587 return out << output;
588}
589
590inline std::ostream& operator<<(std::ostream& out, const Tunnel& tunnel) {
591 std::string output;
592 switch (tunnel) {
593 case Tunnel::TUNNEL_0:
594 output = "TUNNEL_0";
595 break;
596 case Tunnel::TUNNEL_1:
597 output = "TUNNEL_1";
598 break;
599 case Tunnel::TUNNEL_2:
600 output = "TUNNEL_2";
601 break;
602 case Tunnel::TUNNEL_3:
603 output = "TUNNEL_3";
604 break;
605 }
606 return out << output;
607}
608
609inline std::ostream& operator<<(std::ostream& out, const BorderlessRoad& borderlessRoad) {
610 std::string output;
611 switch (borderlessRoad) {
612 case BorderlessRoad::BORDERLESS_ROAD_0:
613 output = "BORDERLESS_ROAD_0";
614 break;
615 case BorderlessRoad::BORDERLESS_ROAD_1:
616 output = "BORDERLESS_ROAD_1";
617 break;
618 case BorderlessRoad::BORDERLESS_ROAD_2:
619 output = "BORDERLESS_ROAD_2";
620 break;
621 }
622 return out << output;
623}
624
625}