forked from mkw-sp/mkw-sp
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbuild.py
executable file
·1659 lines (1585 loc) · 78.7 KB
/
build.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
#!/usr/bin/env python3
import argparse
import glob
import io
import os
import platform
import subprocess
import sys
import tempfile
from vendor.ninja_syntax import Writer
try:
import json5
del json5
except ModuleNotFoundError:
raise SystemExit("Error: pyjson5 not found. Please install it with `python -m pip install json5`")
if sys.version_info < (3, 10):
raise SystemExit("Error: Python 3.10 or newer is required")
if platform.python_implementation() == "PyPy":
print("Warning: PyPy may be slower, due to spawning many Python processes")
features = [
'mission-mode',
'online',
'save-states',
]
our_argv = []
ninja_argv = []
found_seperator = False
for arg in sys.argv[1:]:
if found_seperator:
ninja_argv.append(arg)
elif arg == "--":
found_seperator = True
else:
our_argv.append(arg)
parser = argparse.ArgumentParser()
parser.add_argument('--gdb_compatible', action='store_true')
parser.add_argument("--dry", action="store_true")
parser.add_argument("--ci", action="store_true")
for feature in features:
parser.add_argument(f'--{feature}', default=True, action=argparse.BooleanOptionalAction)
args = parser.parse_args(our_argv)
out_buf = io.StringIO()
n = Writer(out_buf)
n.variable('ninja_required_version', '1.3')
n.newline()
n.variable('builddir', 'build')
n.variable('outdir', 'out')
n.newline()
n.variable('merge', os.path.join('.', 'merge.py'))
n.variable('wuj5', os.path.join('vendor', 'wuj5', 'wuj5.py'))
n.newline()
n.rule(
'merge',
command = f'{sys.executable} $merge $in -o $out',
description = 'MERGE $out',
)
n.newline()
n.rule(
'wuj5',
command = f'{sys.executable} $wuj5 encode $in -o $out',
description = 'WUJ5 $out',
)
n.newline()
n.rule(
'cp',
command = 'cp $in $out',
description = 'CP $out',
)
n.newline()
n.rule(
'arc',
command = f'{sys.executable} $wuj5 encode $arcin -o $out --retained $in $args',
description = 'ARC $out',
)
n.newline()
thumbnail_in_files = sorted(glob.glob("thumbnails/*.jpg"))
for in_file in thumbnail_in_files:
out_file = os.path.join('$builddir', 'contents.arc.d', in_file)
n.build(
out_file,
'cp',
in_file,
)
LANGUAGES = [
'E', # English (PAL)
'F', # French (PAL)
'G', # German
'I', # Italian
'J', # Japanese
'K', # Korean
'M', # Spanish (NTSC)
'Q', # French (NTSC)
'S', # Spanish (PAL)
'U', # English (NTSC)
'N', # Dutch
]
HUD_LANGUAGES = {
'E': 'E',
'F': 'F',
'G': 'G',
'I': 'I',
'J': 'E',
'K': 'E',
'M': 'S',
'Q': 'F',
'S': 'S',
'U': 'E',
'N': 'N',
}
pack_select_assets = [
os.path.join('bg', 'blyt', 'obi_bottom.brlyt.json5'),
os.path.join('bg', 'blyt', 'obi_bottom_message.brlyt.json5'),
os.path.join('button', 'anim', 'course_select_button_free.brlan.json5'),
os.path.join('button', 'anim', 'course_select_button_free_to_select.brlan.json5'),
os.path.join('button', 'anim', 'course_select_button_select.brlan.json5'),
os.path.join('button', 'anim', 'course_select_button_select_to_free.brlan.json5'),
os.path.join('button', 'blyt', 'course_select_button.brlyt.json5'),
os.path.join('button', 'blyt', 'course_select_scroll_bar.brlyt.json5'),
os.path.join('button', 'ctrl', 'CourseSelectArrowLeft.brctr.json5'),
os.path.join('button', 'ctrl', 'CourseSelectArrowRight.brctr.json5'),
os.path.join('button', 'ctrl', 'CourseSelectButton.brctr.json5'),
os.path.join('button', 'ctrl', 'CourseSelectScrollBar.brctr.json5'),
os.path.join('button', 'blyt', 'pack_select_button.brlyt.json5'),
os.path.join('button', 'ctrl', 'PackSelectButton.brctr.json5'),
os.path.join('control', 'ctrl', 'CourseSelectPageNum.brctr.json5'),
os.path.join('control', 'ctrl', 'TimeAttackGhostListPageNum.brctr.json5'),
]
asset_in_files = {
os.path.join('Scene', 'UI', 'AwardSP.arc.lzma'): sorted(glob.glob("award/**/*.json5", root_dir="assets")),
os.path.join('Scene', 'UI', 'CrashSP.arc.lzma'): sorted(glob.glob("fatal/**/*.*", root_dir="assets", recursive=True)),
os.path.join('Race', 'CommonSP.arc.lzma'): [
# Thumbnails
os.path.join('kartCameraParamThumbnails.bin'),
# Mega TC
os.path.join('MegaTC.brres'),
# Battle mode
os.path.join('balloon.brres'),
os.path.join('bikePartsDispParam.bin'),
os.path.join('kartPartsDispParam.bin'),
os.path.join('RKRace_SP.breff'),
os.path.join('RKRace_SP.breft'),
# Online mode
os.path.join('ItemSlotOnline.bin'),
],
os.path.join('Scene', 'UI', 'ChannelSP.arc.lzma'): [
# Explanation text with 2 lines
os.path.join('bg', 'blyt', 'obi_bottom.brlyt.json5'),
os.path.join('bg', 'blyt', 'obi_bottom_message.brlyt.json5'),
os.path.join('bg', 'timg', 'tt_obi_bottom_curve_000.tpl'),
os.path.join('bg', 'timg', 'tt_obi_bottom_right_000.tpl'),
#
os.path.join('bg', 'ctrl', 'MenuObiTitleTextOption.brctr.json5'),
# Channel
os.path.join('button', 'ctrl', 'ServicePackChannelButton.brctr.json5'),
# Tools
os.path.join('button', 'ctrl', 'ServicePackToolsButton.brctr.json5'),
os.path.join('button', 'ctrl', 'ServicePackTopButton.brctr.json5'),
os.path.join('button', 'ctrl', 'ToolsButton.brctr.json5'),
# Course/Pack Select
*pack_select_assets,
],
os.path.join('Scene', 'UI', 'FontSP_K.arc.lzma'): [
os.path.join('kart_font_korea.brfnt'),
os.path.join('tt_kart_font_rodan_ntlg_pro_b_K.brfnt'),
os.path.join('mario_font_number_nocolor.brfnt'),
os.path.join('mario_font_number_outline.brfnt'),
],
os.path.join('Scene', 'UI', 'FontSP_R.arc.lzma'): [
os.path.join('kart_kanji_font.brfnt'),
os.path.join('tt_kart_font_rodan_ntlg_pro_b_R.brfnt'),
os.path.join('mario_font_number_nocolor.brfnt'),
os.path.join('mario_font_number_outline.brfnt'),
],
os.path.join('Scene', 'UI', 'GlobeSP.arc.lzma'): [
# Explanation text with 2 lines
os.path.join('bg', 'blyt', 'obi_bottom.brlyt.json5'),
os.path.join('bg', 'blyt', 'obi_bottom_message.brlyt.json5'),
os.path.join('bg', 'timg', 'tt_obi_bottom_curve_000.tpl'),
os.path.join('bg', 'timg', 'tt_obi_bottom_right_000.tpl'),
#
os.path.join('button', 'blyt', 'common_w205_room_id.brlyt.json5'),
os.path.join('button', 'blyt', 'common_w206_room_id_text.brlyt.json5'),
os.path.join('button', 'ctrl', 'FriendRoom.brctr.json5'),
os.path.join('button', 'ctrl', 'OnlineTopButton.brctr.json5'),
os.path.join('button', 'ctrl', 'RoomCodeEditBox.brctr.json5'),
os.path.join('button', 'ctrl', 'RoomCodeEditBoxLetter.brctr.json5'),
os.path.join('button', 'ctrl', 'RoomCodeKeyboard.brctr.json5'),
os.path.join('button', 'ctrl', 'SettingsButton.brctr.json5'),
os.path.join('message_window', 'blyt', 'room_rules.brlyt.json5'),
os.path.join('message_window', 'ctrl', 'RoomRules.brctr.json5'),
# Settings
os.path.join('bg', 'blyt', 'race_obi_bottom_message.brlyt.json5'),
os.path.join('bg', 'ctrl', 'ObiInstructionTextPopup.brctr.json5'),
os.path.join('control', 'anim', 'common_w023_rule_menu_text_light_02_select.brlan.json5'),
os.path.join('control', 'anim', 'common_w023_rule_menu_text_light_02_stop.brlan.json5'),
os.path.join('control', 'anim', 'common_w134_rule_rap_yaji_l_chara_light_01_ok.brlan.json5'),
os.path.join('control', 'anim', 'common_w134_rule_rap_yaji_l_chara_light_01_stop.brlan.json5'),
os.path.join('control', 'anim', 'common_w134_rule_rap_yaji_l_chara_light_02_select.brlan.json5'),
os.path.join('control', 'anim', 'common_w134_rule_rap_yaji_l_chara_light_02_stop.brlan.json5'),
os.path.join('control', 'anim', 'common_w134_rule_rap_yaji_l_free.brlan.json5'),
os.path.join('control', 'anim', 'common_w134_rule_rap_yaji_l_free_to_select.brlan.json5'),
os.path.join('control', 'anim', 'common_w134_rule_rap_yaji_l_fuchi_check_loop.brlan.json5'),
os.path.join('control', 'anim', 'common_w134_rule_rap_yaji_l_select.brlan.json5'),
os.path.join('control', 'anim', 'common_w134_rule_rap_yaji_l_select_to_free.brlan.json5'),
os.path.join('control', 'anim', 'common_w135_rule_rap_yaji_r_chara_light_01_ok.brlan.json5'),
os.path.join('control', 'anim', 'common_w135_rule_rap_yaji_r_chara_light_01_stop.brlan.json5'),
os.path.join('control', 'anim', 'common_w135_rule_rap_yaji_r_chara_light_02_select.brlan.json5'),
os.path.join('control', 'anim', 'common_w135_rule_rap_yaji_r_chara_light_02_stop.brlan.json5'),
os.path.join('control', 'anim', 'common_w135_rule_rap_yaji_r_free.brlan.json5'),
os.path.join('control', 'anim', 'common_w135_rule_rap_yaji_r_free_to_select.brlan.json5'),
os.path.join('control', 'anim', 'common_w135_rule_rap_yaji_r_fuchi_check_loop.brlan.json5'),
os.path.join('control', 'anim', 'common_w135_rule_rap_yaji_r_select.brlan.json5'),
os.path.join('control', 'anim', 'common_w135_rule_rap_yaji_r_select_to_free.brlan.json5'),
os.path.join('control', 'anim', 'common_w201_setting_menu_free.brlan.json5'),
os.path.join('control', 'anim', 'common_w201_setting_menu_free_to_select.brlan.json5'),
os.path.join('control', 'anim', 'common_w201_setting_menu_select.brlan.json5'),
os.path.join('control', 'anim', 'common_w201_setting_menu_select_to_free.brlan.json5'),
os.path.join('control', 'anim', 'gr_area_select_menu_dummy0_loop.brlan.json5'),
os.path.join('control', 'anim', 'gr_area_select_menu_dummy0_onetime.brlan.json5'),
os.path.join('control', 'anim', 'gr_area_select_menu_dummy1_loop.brlan.json5'),
os.path.join('control', 'anim', 'gr_area_select_menu_dummy1_onetime.brlan.json5'),
os.path.join('control', 'blyt', 'common_w134_rule_rap_yaji_l.brlyt.json5'),
os.path.join('control', 'blyt', 'common_w135_rule_rap_yaji_r.brlyt.json5'),
os.path.join('control', 'blyt', 'common_w201_setting_menu.brlyt.json5'),
os.path.join('control', 'blyt', 'gr_area_select_menu.brlyt.json5'),
os.path.join('control', 'ctrl', 'CategoryUpDownBase.brctr.json5'),
os.path.join('control', 'ctrl', 'CategoryUpDownButtonL.brctr.json5'),
os.path.join('control', 'ctrl', 'CategoryUpDownButtonR.brctr.json5'),
os.path.join('control', 'ctrl', 'SettingUpDownBase.brctr.json5'),
os.path.join('control', 'ctrl', 'SettingUpDownButtonL.brctr.json5'),
os.path.join('control', 'ctrl', 'SettingUpDownButtonR.brctr.json5'),
os.path.join('ranking', 'anim', 'area_select_window_free.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_free_to_select.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_fuchi_check_loop.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_select.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_select_to_free.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_center_to_right.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_hide.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_left_to_center.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_light_01_ok.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_light_01_stop.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_light_02_select.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_light_02_stop.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_stop.brlan.json5'),
os.path.join('ranking', 'anim', 'category_window_text_free.brlan.json5'),
os.path.join('ranking', 'anim', 'category_window_text_free_to_select.brlan.json5'),
os.path.join('ranking', 'anim', 'category_window_text_select.brlan.json5'),
os.path.join('ranking', 'anim', 'category_window_text_select_to_free.brlan.json5'),
os.path.join('ranking', 'anim', 'category_window_text_text_center_to_right.brlan.json5'),
os.path.join('ranking', 'anim', 'category_window_text_text_hide.brlan.json5'),
os.path.join('ranking', 'anim', 'category_window_text_text_left_to_center.brlan.json5'),
os.path.join('ranking', 'blyt', 'area_select_window.brlyt.json5'),
os.path.join('ranking', 'blyt', 'area_select_window_text.brlyt.json5'),
os.path.join('ranking', 'blyt', 'category_window.brlyt.json5'),
os.path.join('ranking', 'blyt', 'category_window_text.brlyt.json5'),
os.path.join('ranking', 'ctrl', 'CategoryUpDownText.brctr.json5'),
os.path.join('ranking', 'ctrl', 'CategoryUpDownValue.brctr.json5'),
os.path.join('ranking', 'ctrl', 'SettingUpDownText.brctr.json5'),
os.path.join('ranking', 'ctrl', 'SettingUpDownValue.brctr.json5'),
os.path.join('ranking', 'timg', 'tt_pattern_chek_alpha_nasi_32x32.tpl'),
os.path.join('ranking', 'timg', 'tt_pattern_chek_bokashi_32x32.tpl'),
# Teams
os.path.join('button', 'anim', 'online_team_select_light_01_ok.brlan.json5'),
os.path.join('button', 'anim', 'online_team_select_light_01_stop.brlan.json5'),
os.path.join('button', 'anim', 'online_team_select_light_02_select.brlan.json5'),
os.path.join('button', 'anim', 'online_team_select_light_02_stop.brlan.json5'),
os.path.join('button', 'blyt', 'online_team_select.brlyt.json5'),
os.path.join('button', 'ctrl', 'OnlineTeamSelect.brctr.json5'),
os.path.join('button', 'timg', 'ht_squareWhite_00.tpl'),
# Multiplayer Character Select
os.path.join('button', 'ctrl', 'CharacterSelect4_0_Multi.brctr.json5'),
os.path.join('button', 'ctrl', 'CharacterSelect4_1_Multi.brctr.json5'),
os.path.join('button', 'ctrl', 'CharacterSelect4_2_Multi.brctr.json5'),
os.path.join('button', 'ctrl', 'CharacterSelect4_3_Multi.brctr.json5'),
os.path.join('button', 'blyt', 'common_w117_mii_suit.brlyt.json5'),
# Pack select assets
os.path.join('button', 'anim', 'common_w010_cup_fuchi_check_loop.brlan.json5'),
os.path.join('button', 'anim', 'common_w010_cup_text_light_01_ok.brlan.json5'),
os.path.join('button', 'anim', 'common_w010_cup_text_light_01_stop.brlan.json5'),
os.path.join('button', 'anim', 'common_w010_cup_text_light_02_select.brlan.json5'),
os.path.join('button', 'anim', 'common_w010_cup_text_light_02_stop.brlan.json5'),
*pack_select_assets,
],
os.path.join('Scene', 'UI', 'MenuMultiSP.arc.lzma'): [
os.path.join('button', 'anim', 'common_w083_earth_chat_message_fade_in.brlan.json5'),
os.path.join('button', 'anim', 'common_w083_earth_chat_message_fade_in_after.brlan.json5'),
os.path.join('button', 'anim', 'common_w083_earth_chat_message_fade_in_before.brlan.json5'),
os.path.join('button', 'anim', 'common_w083_earth_chat_message_fade_out.brlan.json5'),
os.path.join('button', 'anim', 'common_w083_earth_chat_message_free.brlan.json5'),
os.path.join('button', 'anim', 'common_w083_earth_chat_message_free_to_select.brlan.json5'),
os.path.join('button', 'anim', 'common_w083_earth_chat_message_fuchi_check_loop.brlan.json5'),
os.path.join('button', 'anim', 'common_w083_earth_chat_message_select.brlan.json5'),
os.path.join('button', 'anim', 'common_w083_earth_chat_message_select_to_free.brlan.json5'),
os.path.join('button', 'anim', 'common_w083_earth_chat_message_text_light_01_ok.brlan.json5'),
os.path.join('button', 'anim', 'common_w083_earth_chat_message_text_light_01_stop.brlan.json5'),
os.path.join('button', 'anim', 'common_w083_earth_chat_message_text_light_02_select.brlan.json5'),
os.path.join('button', 'anim', 'common_w083_earth_chat_message_text_light_02_stop.brlan.json5'),
os.path.join('button', 'blyt', 'common_w083_earth_chat_message.brlyt.json5'),
os.path.join('button', 'blyt', 'common_w132_movie_button_multi.brlyt.json5'),
os.path.join('button', 'ctrl', 'SettingsButton.brctr.json5'),
os.path.join('control', 'anim', 'common_w207_multi_team_rap_text_text_center_to_right.brlan.json5'),
os.path.join('control', 'anim', 'common_w207_multi_team_rap_text_text_hide.brlan.json5'),
os.path.join('control', 'anim', 'common_w207_multi_team_rap_text_text_left_to_center.brlan.json5'),
os.path.join('control', 'anim', 'common_w207_multi_team_rap_text_text_stop.brlan.json5'),
os.path.join('control', 'blyt', 'common_w207_multi_team_rap.brlyt.json5'),
os.path.join('control', 'blyt', 'common_w207_multi_team_rap_text.brlyt.json5'),
os.path.join('control', 'blyt', 'team_color_select_menu_common.brlyt.json5'),
os.path.join('control', 'ctrl', 'TeamArrowLeft.brctr.json5'),
os.path.join('control', 'ctrl', 'TeamArrowRight.brctr.json5'),
os.path.join('control', 'ctrl', 'TeamUpDownText.brctr.json5'),
os.path.join('control', 'ctrl', 'TeamUpDownValue.brctr.json5'),
os.path.join('control', 'timg', 'fm_team_color_flag_0.tpl'),
os.path.join('control', 'timg', 'fm_team_color_flag_1.tpl'),
os.path.join('control', 'timg', 'fm_team_color_flag_2.tpl'),
os.path.join('control', 'timg', 'fm_team_color_flag_3.tpl'),
os.path.join('control', 'timg', 'fm_team_color_flag_4.tpl'),
os.path.join('control', 'timg', 'fm_team_color_flag_5.tpl'),
os.path.join('control', 'timg', 'fm_team_color_flag_6.tpl'),
os.path.join('control', 'timg', 'fm_team_color_flag_7.tpl'),
os.path.join('control', 'timg', 'fm_team_color_flag_8.tpl'),
os.path.join('control', 'timg', 'fm_team_color_flag_9.tpl'),
os.path.join('control', 'timg', 'fm_team_color_flag_10.tpl'),
# Explanation text with 2 lines
os.path.join('bg', 'blyt', 'obi_bottom.brlyt.json5'),
os.path.join('bg', 'blyt', 'obi_bottom_message.brlyt.json5'),
os.path.join('bg', 'timg', 'tt_obi_bottom_curve_000.tpl'),
os.path.join('bg', 'timg', 'tt_obi_bottom_right_000.tpl'),
# 200cc
os.path.join('control', 'ctrl', 'VSSettingRadioOption.brctr.json5'),
# Settings
os.path.join('control', 'anim', 'common_w201_setting_menu_free.brlan.json5'),
os.path.join('control', 'anim', 'common_w201_setting_menu_free_to_select.brlan.json5'),
os.path.join('control', 'anim', 'common_w201_setting_menu_select.brlan.json5'),
os.path.join('control', 'anim', 'common_w201_setting_menu_select_to_free.brlan.json5'),
os.path.join('control', 'anim', 'gr_area_select_menu_dummy0_loop.brlan.json5'),
os.path.join('control', 'anim', 'gr_area_select_menu_dummy0_onetime.brlan.json5'),
os.path.join('control', 'anim', 'gr_area_select_menu_dummy1_loop.brlan.json5'),
os.path.join('control', 'anim', 'gr_area_select_menu_dummy1_onetime.brlan.json5'),
os.path.join('control', 'blyt', 'common_w201_setting_menu.brlyt.json5'),
os.path.join('control', 'blyt', 'gr_area_select_menu.brlyt.json5'),
os.path.join('control', 'ctrl', 'CategoryUpDownBase.brctr.json5'),
os.path.join('control', 'ctrl', 'CategoryUpDownButtonL.brctr.json5'),
os.path.join('control', 'ctrl', 'CategoryUpDownButtonR.brctr.json5'),
os.path.join('control', 'ctrl', 'SettingUpDownBase.brctr.json5'),
os.path.join('control', 'ctrl', 'SettingUpDownButtonL.brctr.json5'),
os.path.join('control', 'ctrl', 'SettingUpDownButtonR.brctr.json5'),
os.path.join('ranking', 'anim', 'area_select_window_free.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_free_to_select.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_fuchi_check_loop.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_select.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_select_to_free.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_center_to_right.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_hide.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_left_to_center.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_light_01_ok.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_light_01_stop.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_light_02_select.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_light_02_stop.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_stop.brlan.json5'),
os.path.join('ranking', 'anim', 'category_window_text_free.brlan.json5'),
os.path.join('ranking', 'anim', 'category_window_text_free_to_select.brlan.json5'),
os.path.join('ranking', 'anim', 'category_window_text_select.brlan.json5'),
os.path.join('ranking', 'anim', 'category_window_text_select_to_free.brlan.json5'),
os.path.join('ranking', 'anim', 'category_window_text_text_center_to_right.brlan.json5'),
os.path.join('ranking', 'anim', 'category_window_text_text_hide.brlan.json5'),
os.path.join('ranking', 'anim', 'category_window_text_text_left_to_center.brlan.json5'),
os.path.join('ranking', 'blyt', 'area_select_window.brlyt.json5'),
os.path.join('ranking', 'blyt', 'area_select_window_text.brlyt.json5'),
os.path.join('ranking', 'blyt', 'category_window.brlyt.json5'),
os.path.join('ranking', 'blyt', 'category_window_text.brlyt.json5'),
os.path.join('ranking', 'ctrl', 'CategoryUpDownText.brctr.json5'),
os.path.join('ranking', 'ctrl', 'CategoryUpDownValue.brctr.json5'),
os.path.join('ranking', 'ctrl', 'SettingUpDownText.brctr.json5'),
os.path.join('ranking', 'ctrl', 'SettingUpDownValue.brctr.json5'),
os.path.join('ranking', 'timg', 'tt_pattern_chek_alpha_nasi_32x32.tpl'),
os.path.join('ranking', 'timg', 'tt_pattern_chek_bokashi_32x32.tpl'),
# Teams
os.path.join('button', 'ctrl', 'TeamConfirmOK.brctr.json5'),
os.path.join('control', 'anim', 'common_w204_team_position.brlan.json5'),
os.path.join('control', 'blyt', 'common_w204_team.brlyt.json5'),
os.path.join('control', 'ctrl', 'TeamConfirm.brctr.json5'),
# Multiplayer Character Select
os.path.join('button', 'ctrl', 'CharacterSelect4_0_Multi.brctr.json5'),
os.path.join('button', 'ctrl', 'CharacterSelect4_1_Multi.brctr.json5'),
os.path.join('button', 'ctrl', 'CharacterSelect4_2_Multi.brctr.json5'),
os.path.join('button', 'ctrl', 'CharacterSelect4_3_Multi.brctr.json5'),
os.path.join('button', 'blyt', 'common_w117_mii_suit.brlyt.json5'),
*pack_select_assets,
],
os.path.join('Scene', 'UI', 'MenuOtherSP.arc.lzma'): [
# Explanation text with 2 lines
os.path.join('bg', 'blyt', 'obi_bottom.brlyt.json5'),
os.path.join('bg', 'blyt', 'obi_bottom_message.brlyt.json5'),
os.path.join('bg', 'timg', 'tt_obi_bottom_curve_000.tpl'),
os.path.join('bg', 'timg', 'tt_obi_bottom_right_000.tpl'),
# License display and license management
os.path.join('button', 'ctrl', 'LicenseManagementButton.brctr.json5'),
os.path.join('control', 'blyt', 'common_w076_license_icon_center.brlyt.json5'),
os.path.join('control', 'ctrl', 'LicenseDisplay.brctr.json5'),
os.path.join('control', 'ctrl', 'LicenseManagement.brctr.json5'),
os.path.join('control', 'timg', 'tt_license_icon_004.tpl'),
# Settings
os.path.join('control', 'anim', 'common_w023_rule_menu_text_light_02_select.brlan.json5'),
os.path.join('control', 'anim', 'common_w023_rule_menu_text_light_02_stop.brlan.json5'),
os.path.join('control', 'anim', 'common_w134_rule_rap_yaji_l_chara_light_01_ok.brlan.json5'),
os.path.join('control', 'anim', 'common_w134_rule_rap_yaji_l_chara_light_01_stop.brlan.json5'),
os.path.join('control', 'anim', 'common_w134_rule_rap_yaji_l_chara_light_02_select.brlan.json5'),
os.path.join('control', 'anim', 'common_w134_rule_rap_yaji_l_chara_light_02_stop.brlan.json5'),
os.path.join('control', 'anim', 'common_w134_rule_rap_yaji_l_free.brlan.json5'),
os.path.join('control', 'anim', 'common_w134_rule_rap_yaji_l_free_to_select.brlan.json5'),
os.path.join('control', 'anim', 'common_w134_rule_rap_yaji_l_fuchi_check_loop.brlan.json5'),
os.path.join('control', 'anim', 'common_w134_rule_rap_yaji_l_select.brlan.json5'),
os.path.join('control', 'anim', 'common_w134_rule_rap_yaji_l_select_to_free.brlan.json5'),
os.path.join('control', 'anim', 'common_w135_rule_rap_yaji_r_chara_light_01_ok.brlan.json5'),
os.path.join('control', 'anim', 'common_w135_rule_rap_yaji_r_chara_light_01_stop.brlan.json5'),
os.path.join('control', 'anim', 'common_w135_rule_rap_yaji_r_chara_light_02_select.brlan.json5'),
os.path.join('control', 'anim', 'common_w135_rule_rap_yaji_r_chara_light_02_stop.brlan.json5'),
os.path.join('control', 'anim', 'common_w135_rule_rap_yaji_r_free.brlan.json5'),
os.path.join('control', 'anim', 'common_w135_rule_rap_yaji_r_free_to_select.brlan.json5'),
os.path.join('control', 'anim', 'common_w135_rule_rap_yaji_r_fuchi_check_loop.brlan.json5'),
os.path.join('control', 'anim', 'common_w135_rule_rap_yaji_r_select.brlan.json5'),
os.path.join('control', 'anim', 'common_w135_rule_rap_yaji_r_select_to_free.brlan.json5'),
os.path.join('control', 'anim', 'common_w201_setting_menu_free.brlan.json5'),
os.path.join('control', 'anim', 'common_w201_setting_menu_free_to_select.brlan.json5'),
os.path.join('control', 'anim', 'common_w201_setting_menu_select.brlan.json5'),
os.path.join('control', 'anim', 'common_w201_setting_menu_select_to_free.brlan.json5'),
os.path.join('control', 'anim', 'gr_area_select_menu_dummy0_loop.brlan.json5'),
os.path.join('control', 'anim', 'gr_area_select_menu_dummy0_onetime.brlan.json5'),
os.path.join('control', 'anim', 'gr_area_select_menu_dummy1_loop.brlan.json5'),
os.path.join('control', 'anim', 'gr_area_select_menu_dummy1_onetime.brlan.json5'),
os.path.join('control', 'blyt', 'common_w134_rule_rap_yaji_l.brlyt.json5'),
os.path.join('control', 'blyt', 'common_w135_rule_rap_yaji_r.brlyt.json5'),
os.path.join('control', 'blyt', 'common_w201_setting_menu.brlyt.json5'),
os.path.join('control', 'blyt', 'gr_area_select_menu.brlyt.json5'),
os.path.join('control', 'ctrl', 'CategoryUpDownBase.brctr.json5'),
os.path.join('control', 'ctrl', 'CategoryUpDownButtonL.brctr.json5'),
os.path.join('control', 'ctrl', 'CategoryUpDownButtonR.brctr.json5'),
os.path.join('control', 'ctrl', 'SettingUpDownBase.brctr.json5'),
os.path.join('control', 'ctrl', 'SettingUpDownButtonL.brctr.json5'),
os.path.join('control', 'ctrl', 'SettingUpDownButtonR.brctr.json5'),
os.path.join('control', 'timg', 'tt_yajirushi_type1.tpl'),
os.path.join('ranking', 'anim', 'area_select_window_free.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_free_to_select.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_fuchi_check_loop.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_select.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_select_to_free.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_center_to_right.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_hide.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_left_to_center.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_light_01_ok.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_light_01_stop.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_light_02_select.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_light_02_stop.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_stop.brlan.json5'),
os.path.join('ranking', 'anim', 'category_window_text_free.brlan.json5'),
os.path.join('ranking', 'anim', 'category_window_text_free_to_select.brlan.json5'),
os.path.join('ranking', 'anim', 'category_window_text_select.brlan.json5'),
os.path.join('ranking', 'anim', 'category_window_text_select_to_free.brlan.json5'),
os.path.join('ranking', 'anim', 'category_window_text_text_center_to_right.brlan.json5'),
os.path.join('ranking', 'anim', 'category_window_text_text_hide.brlan.json5'),
os.path.join('ranking', 'anim', 'category_window_text_text_left_to_center.brlan.json5'),
os.path.join('ranking', 'blyt', 'area_select_window.brlyt.json5'),
os.path.join('ranking', 'blyt', 'area_select_window_text.brlyt.json5'),
os.path.join('ranking', 'blyt', 'category_window.brlyt.json5'),
os.path.join('ranking', 'blyt', 'category_window_text.brlyt.json5'),
os.path.join('ranking', 'ctrl', 'CategoryUpDownText.brctr.json5'),
os.path.join('ranking', 'ctrl', 'CategoryUpDownValue.brctr.json5'),
os.path.join('ranking', 'ctrl', 'SettingUpDownText.brctr.json5'),
os.path.join('ranking', 'ctrl', 'SettingUpDownValue.brctr.json5'),
os.path.join('ranking', 'timg', 'tt_pattern_chek_alpha_nasi_32x32.tpl'),
os.path.join('ranking', 'timg', 'tt_pattern_chek_bokashi_32x32.tpl'),
],
os.path.join('Scene', 'UI', 'MenuSingleSP.arc.lzma'): [
os.path.join('button', 'ctrl', 'SettingsButton.brctr.json5'),
# Explanation text with 2 lines
os.path.join('bg', 'blyt', 'obi_bottom.brlyt.json5'),
os.path.join('bg', 'blyt', 'obi_bottom_message.brlyt.json5'),
os.path.join('bg', 'timg', 'tt_obi_bottom_curve_000.tpl'),
os.path.join('bg', 'timg', 'tt_obi_bottom_right_000.tpl'),
# GP removal
os.path.join('button', 'blyt', 'common_w129_movie_button_single_top.brlyt.json5'),
os.path.join('button', 'blyt', 'common_w129_movie_button_single_top_no_mr.brlyt.json5'),
os.path.join('button', 'ctrl', 'MissionInstruction.brctr.json5'),
os.path.join('button', 'ctrl', 'SingleTop.brctr.json5'),
os.path.join('button', 'ctrl', 'SingleTopNoMR.brctr.json5'),
# Ghost list
os.path.join('button', 'blyt', 'common_w203_launch_button_half.brlyt.json5'),
os.path.join('button', 'ctrl', 'TimeAttackGhostListArrowLeft.brctr.json5'),
os.path.join('button', 'ctrl', 'TimeAttackGhostListArrowRight.brctr.json5'),
os.path.join('button', 'ctrl', 'TimeAttackGhostList.brctr.json5'),
os.path.join('button', 'ctrl', 'TimeAttackGhostListHalf.brctr.json5'),
os.path.join('control', 'anim', 'common_w200_ghost_button_active_off.brlan.json5'),
os.path.join('control', 'anim', 'common_w200_ghost_button_active_off_to_on.brlan.json5'),
os.path.join('control', 'anim', 'common_w200_ghost_button_active_on.brlan.json5'),
os.path.join('control', 'anim', 'common_w200_ghost_button_free.brlan.json5'),
os.path.join('control', 'anim', 'common_w200_ghost_button_free_to_select.brlan.json5'),
os.path.join('control', 'anim', 'common_w200_ghost_button_light_01_ok.brlan.json5'),
os.path.join('control', 'anim', 'common_w200_ghost_button_light_01_stop.brlan.json5'),
os.path.join('control', 'anim', 'common_w200_ghost_button_light_02_select.brlan.json5'),
os.path.join('control', 'anim', 'common_w200_ghost_button_light_02_stop.brlan.json5'),
os.path.join('control', 'anim', 'common_w200_ghost_button_select.brlan.json5'),
os.path.join('control', 'anim', 'common_w200_ghost_button_select_to_free.brlan.json5'),
os.path.join('control', 'anim', 'friend_room_comment_container_center_to_right.brlan.json5'),
os.path.join('control', 'anim', 'friend_room_comment_container_hide.brlan.json5'),
os.path.join('control', 'anim', 'friend_room_comment_container_left_to_center.brlan.json5'),
os.path.join('control', 'anim', 'friend_room_comment_container_show.brlan.json5'),
os.path.join('control', 'blyt', 'common_w200_ghost_button.brlyt.json5'),
os.path.join('control', 'blyt', 'ghost_container.brlyt.json5'),
os.path.join('control', 'ctrl', 'GhostSelectBase.brctr.json5'),
os.path.join('control', 'ctrl', 'GhostSelectOption.brctr.json5'),
os.path.join('control', 'ctrl', 'TimeAttackGhostListPageNum.brctr.json5'),
os.path.join('message_window', 'ctrl', 'TimeAttackGhostListMessageWindowHalf.brctr.json5'),
# 200cc
os.path.join('control', 'ctrl', 'VSSettingRadioOption.brctr.json5'),
# Settings
os.path.join('control', 'anim', 'common_w201_setting_menu_free.brlan.json5'),
os.path.join('control', 'anim', 'common_w201_setting_menu_free_to_select.brlan.json5'),
os.path.join('control', 'anim', 'common_w201_setting_menu_select.brlan.json5'),
os.path.join('control', 'anim', 'common_w201_setting_menu_select_to_free.brlan.json5'),
os.path.join('control', 'anim', 'gr_area_select_menu_dummy0_loop.brlan.json5'),
os.path.join('control', 'anim', 'gr_area_select_menu_dummy0_onetime.brlan.json5'),
os.path.join('control', 'anim', 'gr_area_select_menu_dummy1_loop.brlan.json5'),
os.path.join('control', 'anim', 'gr_area_select_menu_dummy1_onetime.brlan.json5'),
os.path.join('control', 'blyt', 'common_w201_setting_menu.brlyt.json5'),
os.path.join('control', 'blyt', 'gr_area_select_menu.brlyt.json5'),
os.path.join('control', 'ctrl', 'CategoryUpDownBase.brctr.json5'),
os.path.join('control', 'ctrl', 'CategoryUpDownButtonL.brctr.json5'),
os.path.join('control', 'ctrl', 'CategoryUpDownButtonR.brctr.json5'),
os.path.join('control', 'ctrl', 'SettingUpDownBase.brctr.json5'),
os.path.join('control', 'ctrl', 'SettingUpDownButtonL.brctr.json5'),
os.path.join('control', 'ctrl', 'SettingUpDownButtonR.brctr.json5'),
os.path.join('ranking', 'anim', 'area_select_window_free.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_free_to_select.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_fuchi_check_loop.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_select.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_select_to_free.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_center_to_right.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_hide.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_left_to_center.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_light_01_ok.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_light_01_stop.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_light_02_select.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_light_02_stop.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_stop.brlan.json5'),
os.path.join('ranking', 'anim', 'category_window_text_free.brlan.json5'),
os.path.join('ranking', 'anim', 'category_window_text_free_to_select.brlan.json5'),
os.path.join('ranking', 'anim', 'category_window_text_select.brlan.json5'),
os.path.join('ranking', 'anim', 'category_window_text_select_to_free.brlan.json5'),
os.path.join('ranking', 'anim', 'category_window_text_text_center_to_right.brlan.json5'),
os.path.join('ranking', 'anim', 'category_window_text_text_hide.brlan.json5'),
os.path.join('ranking', 'anim', 'category_window_text_text_left_to_center.brlan.json5'),
os.path.join('ranking', 'blyt', 'area_select_window.brlyt.json5'),
os.path.join('ranking', 'blyt', 'area_select_window_text.brlyt.json5'),
os.path.join('ranking', 'blyt', 'category_window.brlyt.json5'),
os.path.join('ranking', 'blyt', 'category_window_text.brlyt.json5'),
os.path.join('ranking', 'ctrl', 'CategoryUpDownText.brctr.json5'),
os.path.join('ranking', 'ctrl', 'CategoryUpDownValue.brctr.json5'),
os.path.join('ranking', 'ctrl', 'SettingUpDownText.brctr.json5'),
os.path.join('ranking', 'ctrl', 'SettingUpDownValue.brctr.json5'),
os.path.join('ranking', 'timg', 'tt_pattern_chek_alpha_nasi_32x32.tpl'),
os.path.join('ranking', 'timg', 'tt_pattern_chek_bokashi_32x32.tpl'),
# Teams
os.path.join('button', 'ctrl', 'TeamConfirmOK.brctr.json5'),
os.path.join('control', 'anim', 'common_w204_team_position.brlan.json5'),
os.path.join('control', 'blyt', 'common_w204_team.brlyt.json5'),
os.path.join('control', 'ctrl', 'TeamConfirm.brctr.json5'),
# Multiplayer Character Select
os.path.join('button', 'ctrl', 'CharacterSelect4_0_Multi.brctr.json5'),
os.path.join('button', 'ctrl', 'CharacterSelect4_1_Multi.brctr.json5'),
os.path.join('button', 'ctrl', 'CharacterSelect4_2_Multi.brctr.json5'),
os.path.join('button', 'ctrl', 'CharacterSelect4_3_Multi.brctr.json5'),
os.path.join('button', 'blyt', 'common_w117_mii_suit.brlyt.json5'),
*pack_select_assets,
# CourseDebug
os.path.join('control', 'anim', 'CourseDebug.brlan.json5'),
os.path.join('control', 'blyt', 'CourseDebug.brlyt.json5'),
os.path.join('control', 'ctrl', 'CourseDebug.brctr.json5'),
os.path.join('control', 'timg', 'download.tpl'),
os.path.join('control', 'timg', 'ef_wave_indMip.tpl'),
# Flags
os.path.join('control', 'blyt', 'chara_flag_machine_picture_common.brlyt.json5'),
*[os.path.normpath(i) for i in sorted(glob.glob("control/timg/[0-9][0-9][0-9].tpl", root_dir="assets", recursive=True))],
],
os.path.join('Scene', 'UI', 'RaceSP.arc.lzma'): [
# Menu
os.path.join('button', 'blyt', 'common_w202_menu_compact.brlyt.json5'),
os.path.join('button', 'ctrl', 'AfterMenuBT.brctr.json5'),
os.path.join('button', 'ctrl', 'AfterMenuBTLast.brctr.json5'),
os.path.join('button', 'ctrl', 'AfterMenuEndConfirm.brctr.json5'),
os.path.join('button', 'ctrl', 'AfterMenuTimeAttack.brctr.json5'),
os.path.join('button', 'ctrl', 'AfterMenuVS.brctr.json5'),
os.path.join('button', 'ctrl', 'AfterMenuVSLast.brctr.json5'),
os.path.join('button', 'ctrl', 'PauseMenuGhostWatch.brctr.json5'),
os.path.join('button', 'ctrl', 'PauseMenuReplayTA.brctr.json5'),
os.path.join('button', 'ctrl', 'PauseMenuTimeAttack.brctr.json5'),
os.path.join('button', 'ctrl', 'PauseMenuTimeAttackNoSS.brctr.json5'),
os.path.join('button', 'ctrl', 'PauseMenuVS.brctr.json5'),
# Settings
os.path.join('bg', 'blyt', 'race_obi_bottom_message.brlyt.json5'),
os.path.join('bg', 'ctrl', 'RaceObiInstructionText.brctr.json5'),
os.path.join('control', 'anim', 'common_w023_rule_menu_text_light_02_select.brlan.json5'),
os.path.join('control', 'anim', 'common_w023_rule_menu_text_light_02_stop.brlan.json5'),
os.path.join('control', 'anim', 'common_w134_rule_rap_yaji_l_chara_light_01_ok.brlan.json5'),
os.path.join('control', 'anim', 'common_w134_rule_rap_yaji_l_chara_light_01_stop.brlan.json5'),
os.path.join('control', 'anim', 'common_w134_rule_rap_yaji_l_chara_light_02_select.brlan.json5'),
os.path.join('control', 'anim', 'common_w134_rule_rap_yaji_l_chara_light_02_stop.brlan.json5'),
os.path.join('control', 'anim', 'common_w134_rule_rap_yaji_l_free.brlan.json5'),
os.path.join('control', 'anim', 'common_w134_rule_rap_yaji_l_free_to_select.brlan.json5'),
os.path.join('control', 'anim', 'common_w134_rule_rap_yaji_l_fuchi_check_loop.brlan.json5'),
os.path.join('control', 'anim', 'common_w134_rule_rap_yaji_l_select.brlan.json5'),
os.path.join('control', 'anim', 'common_w134_rule_rap_yaji_l_select_to_free.brlan.json5'),
os.path.join('control', 'anim', 'common_w135_rule_rap_yaji_r_chara_light_01_ok.brlan.json5'),
os.path.join('control', 'anim', 'common_w135_rule_rap_yaji_r_chara_light_01_stop.brlan.json5'),
os.path.join('control', 'anim', 'common_w135_rule_rap_yaji_r_chara_light_02_select.brlan.json5'),
os.path.join('control', 'anim', 'common_w135_rule_rap_yaji_r_chara_light_02_stop.brlan.json5'),
os.path.join('control', 'anim', 'common_w135_rule_rap_yaji_r_free.brlan.json5'),
os.path.join('control', 'anim', 'common_w135_rule_rap_yaji_r_free_to_select.brlan.json5'),
os.path.join('control', 'anim', 'common_w135_rule_rap_yaji_r_fuchi_check_loop.brlan.json5'),
os.path.join('control', 'anim', 'common_w135_rule_rap_yaji_r_select.brlan.json5'),
os.path.join('control', 'anim', 'common_w135_rule_rap_yaji_r_select_to_free.brlan.json5'),
os.path.join('control', 'anim', 'common_w201_setting_menu_free.brlan.json5'),
os.path.join('control', 'anim', 'common_w201_setting_menu_free_to_select.brlan.json5'),
os.path.join('control', 'anim', 'common_w201_setting_menu_select.brlan.json5'),
os.path.join('control', 'anim', 'common_w201_setting_menu_select_to_free.brlan.json5'),
os.path.join('control', 'anim', 'gr_area_select_menu_dummy0_loop.brlan.json5'),
os.path.join('control', 'anim', 'gr_area_select_menu_dummy0_onetime.brlan.json5'),
os.path.join('control', 'anim', 'gr_area_select_menu_dummy1_loop.brlan.json5'),
os.path.join('control', 'anim', 'gr_area_select_menu_dummy1_onetime.brlan.json5'),
os.path.join('control', 'blyt', 'common_w134_rule_rap_yaji_l.brlyt.json5'),
os.path.join('control', 'blyt', 'common_w135_rule_rap_yaji_r.brlyt.json5'),
os.path.join('control', 'blyt', 'common_w201_setting_menu.brlyt.json5'),
os.path.join('control', 'blyt', 'gr_area_select_menu.brlyt.json5'),
os.path.join('control', 'ctrl', 'CategoryUpDownBase.brctr.json5'),
os.path.join('control', 'ctrl', 'CategoryUpDownButtonL.brctr.json5'),
os.path.join('control', 'ctrl', 'CategoryUpDownButtonR.brctr.json5'),
os.path.join('control', 'ctrl', 'SettingUpDownBase.brctr.json5'),
os.path.join('control', 'ctrl', 'SettingUpDownButtonL.brctr.json5'),
os.path.join('control', 'ctrl', 'SettingUpDownButtonR.brctr.json5'),
os.path.join('control', 'timg', 'tt_yajirushi_type1.tpl'),
os.path.join('ranking', 'anim', 'area_select_window_free.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_free_to_select.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_fuchi_check_loop.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_select.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_select_to_free.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_center_to_right.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_hide.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_left_to_center.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_light_01_ok.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_light_01_stop.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_light_02_select.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_light_02_stop.brlan.json5'),
os.path.join('ranking', 'anim', 'area_select_window_text_text_stop.brlan.json5'),
os.path.join('ranking', 'anim', 'category_window_text_free.brlan.json5'),
os.path.join('ranking', 'anim', 'category_window_text_free_to_select.brlan.json5'),
os.path.join('ranking', 'anim', 'category_window_text_select.brlan.json5'),
os.path.join('ranking', 'anim', 'category_window_text_select_to_free.brlan.json5'),
os.path.join('ranking', 'anim', 'category_window_text_text_center_to_right.brlan.json5'),
os.path.join('ranking', 'anim', 'category_window_text_text_hide.brlan.json5'),
os.path.join('ranking', 'anim', 'category_window_text_text_left_to_center.brlan.json5'),
os.path.join('ranking', 'blyt', 'area_select_window.brlyt.json5'),
os.path.join('ranking', 'blyt', 'area_select_window_text.brlyt.json5'),
os.path.join('ranking', 'blyt', 'category_window.brlyt.json5'),
os.path.join('ranking', 'blyt', 'category_window_text.brlyt.json5'),
os.path.join('ranking', 'ctrl', 'CategoryUpDownText.brctr.json5'),
os.path.join('ranking', 'ctrl', 'CategoryUpDownValue.brctr.json5'),
os.path.join('ranking', 'ctrl', 'SettingUpDownText.brctr.json5'),
os.path.join('ranking', 'ctrl', 'SettingUpDownValue.brctr.json5'),
os.path.join('ranking', 'timg', 'tt_pattern_chek_alpha_nasi_32x32.tpl'),
os.path.join('ranking', 'timg', 'tt_pattern_chek_bokashi_32x32.tpl'),
# HUD
os.path.join('game_image', 'anim', 'battle_total_point_off.brlan.json5'),
os.path.join('game_image', 'anim', 'battle_total_point_on.brlan.json5'),
os.path.join('game_image', 'anim', 'battle_total_point_stop.brlan.json5'),
os.path.join('game_image', 'anim', 'chara_name_text_color_dummy.brlan.json5'),
os.path.join('game_image', 'anim', 'common_w039_map_chara_icon_dummy.brlan.json5'),
os.path.join('game_image', 'anim', 'game_image_lap_position.brlan.json5'),
os.path.join('game_image', 'anim', 'game_image_speed_texture_pattern_0_9.brlan.json5'),
os.path.join('game_image', 'blyt', 'battle_point_set_position.brlyt.json5'),
os.path.join('game_image', 'blyt', 'battle_total_point.brlyt.json5'),
os.path.join('game_image', 'blyt', 'coin.brlyt.json5'),
os.path.join('game_image', 'blyt', 'common_w039_map_chara_icon.brlyt.json5'),
os.path.join('game_image', 'blyt', 'debug_panel.brlyt.json5'),
os.path.join('game_image', 'blyt', 'game_image_lap.brlyt.json5'),
os.path.join('game_image', 'blyt', 'game_image_speed.brlyt.json5'),
os.path.join('game_image', 'blyt', 'InputDisplay.brlyt.json5'),
os.path.join('game_image', 'blyt', 'race_message_half.brlyt.json5'),
os.path.join('game_image', 'ctrl', 'balloon.brctr.json5'),
os.path.join('game_image', 'ctrl', 'BattleAddPoint.brctr.json5'),
os.path.join('game_image', 'ctrl', 'battle_total_point.brctr.json5'),
os.path.join('game_image', 'ctrl', 'DebugPanel.brctr.json5'),
os.path.join('game_image', 'ctrl', 'InputDisplay.brctr.json5'),
os.path.join('game_image', 'ctrl', 'item_window_new.brctr.json5'),
os.path.join('game_image', 'ctrl', 'lap_number.brctr.json5'),
os.path.join('game_image', 'ctrl', 'map_chara.brctr.json5'),
os.path.join('game_image', 'ctrl', 'point.brctr.json5'),
os.path.join('game_image', 'ctrl', 'position_multi.brctr.json5'),
os.path.join('game_image', 'ctrl', 'speed_number.brctr.json5'),
os.path.join('game_image', 'ctrl', 'time_number.brctr.json5'),
os.path.join('game_image', 'timg', 'basic_accel_off.tpl'),
os.path.join('game_image', 'timg', 'basic_accel_on.tpl'),
os.path.join('game_image', 'timg', 'basic_cstick_bg.tpl'),
os.path.join('game_image', 'timg', 'basic_cstick_center.tpl'),
os.path.join('game_image', 'timg', 'basic_dpad_down.tpl'),
os.path.join('game_image', 'timg', 'basic_dpad_left.tpl'),
os.path.join('game_image', 'timg', 'basic_dpad_off.tpl'),
os.path.join('game_image', 'timg', 'basic_dpad_right.tpl'),
os.path.join('game_image', 'timg', 'basic_dpad_up.tpl'),
os.path.join('game_image', 'timg', 'basic_trigger_bd_off.tpl'),
os.path.join('game_image', 'timg', 'basic_trigger_bd_on.tpl'),
os.path.join('game_image', 'timg', 'basic_trigger_l_off.tpl'),
os.path.join('game_image', 'timg', 'basic_trigger_l_on.tpl'),
os.path.join('game_image', 'timg', 'basic_trigger_r_off.tpl'),
os.path.join('game_image', 'timg', 'basic_trigger_r_on.tpl'),
os.path.join('game_image', 'timg', 'tt_d_number_3d_minus.tpl'),
os.path.join('game_image', 'timg', 'tt_d_number_3d_none.tpl'),
#MegaTC
os.path.join('game_image', 'timg', 'MegaTC_icon.tpl'),
os.path.join('game_image', 'blyt', 'item.brlyt.json5'),
# Results
os.path.join('result', 'anim', 'common_w204_result_team_position.brlan.json5'),
os.path.join('result', 'anim', 'position_12players_color_off.brlan.json5'),
os.path.join('result', 'anim', 'position_12players_c_off.brlan.json5'),
os.path.join('result', 'anim', 'team_point_position.brlan.json5'),
os.path.join('result', 'blyt', 'common_w204_team.brlyt.json5'),
os.path.join('result', 'blyt', 'team_point.brlyt.json5'),
os.path.join('result', 'ctrl', 'ResultTeam.brctr.json5'),
os.path.join('result', 'ctrl', 'ResultTeamPoint.brctr.json5'),
],
os.path.join('Scene', 'UI', 'TitleSP.arc.lzma'): [
# Explanation text with 2 lines
os.path.join('bg', 'blyt', 'obi_bottom.brlyt.json5'),
os.path.join('bg', 'blyt', 'obi_bottom_message.brlyt.json5'),
os.path.join('bg', 'timg', 'tt_obi_bottom_curve_000.tpl'),
os.path.join('bg', 'timg', 'tt_obi_bottom_right_000.tpl'),
# License selection
os.path.join('button', 'blyt', 'common_w076_license_icon_center.brlyt.json5'),
os.path.join('button', 'ctrl', 'LicenseSelect.brctr.json5'),
os.path.join('button', 'timg', 'tt_license_icon_004.tpl'),
# Title page without online
os.path.join('button', 'ctrl', 'TopMenuChannelWakuNoOnline.brctr.json5'),
# Online renaming
os.path.join('button', 'ctrl', 'TopMenuWifiWaku.brctr.json5'),
],
}
for language in LANGUAGES:
hud_language = HUD_LANGUAGES[language]
if language != 'K':
asset_in_files[os.path.join('Race', f'Common_{language}.arc.lzma')] = [
os.path.join(f'jugemu_lap_{language}.brres'),
os.path.join(f'jugemu_lapf_{language}.brres'),
]
asset_in_files[os.path.join('Scene', 'UI', f'AwardSP_{language}.arc.lzma')] = [
os.path.join('message', f'Common_{language}.bmg.json5'),
os.path.join('message', f'Menu_{language}.bmg.json5'),
os.path.join('message', f'Race_{language}.bmg.json5'),
]
asset_in_files[os.path.join('Scene', 'UI', f'ChannelSP_{language}.arc.lzma')] = [
os.path.join('message', f'Common_{language}.bmg.json5'),
os.path.join('message', f'Menu_{language}.bmg.json5'),
]
asset_in_files[os.path.join('Scene', 'UI', f'GlobeSP_{language}.arc.lzma')] = [
os.path.join('message', f'Common_{language}.bmg.json5'),
os.path.join('message', f'Menu_{language}.bmg.json5'),
]
asset_in_files[os.path.join('Scene', 'UI', f'MenuMultiSP_{language}.arc.lzma')] = [
os.path.join('message', f'Common_{language}.bmg.json5'),
os.path.join('message', f'Menu_{language}.bmg.json5'),
]
asset_in_files[os.path.join('Scene', 'UI', f'MenuOtherSP_{language}.arc.lzma')] = [
os.path.join('message', f'Common_{language}.bmg.json5'),
os.path.join('message', f'Menu_{language}.bmg.json5'),
]
asset_in_files[os.path.join('Scene', 'UI', f'MenuSingleSP_{language}.arc.lzma')] = [
os.path.join('message', f'Common_{language}.bmg.json5'),
os.path.join('message', f'Menu_{language}.bmg.json5'),
]
asset_in_files[os.path.join('Scene', 'UI', f'RaceSP_{language}.arc.lzma')] = [
os.path.join('game_image', 'timg', f'tt_speed_{hud_language}.tpl'),
os.path.join('message', f'Common_{language}.bmg.json5'),
os.path.join('message', f'Menu_{language}.bmg.json5'),
os.path.join('message', f'Race_{language}.bmg.json5'),
]
if hud_language != 'E':
asset_in_files[os.path.join('Scene', 'UI', f'RaceSP_{language}.arc.lzma')] += [
os.path.join('game_image', 'timg', f'tt_lap_{hud_language}.tpl'),
os.path.join('game_image', 'timg', f'tt_lap_{hud_language}_lap1.tpl'),
os.path.join('game_image', 'timg', f'tt_lap_{hud_language}_lap2.tpl'),
os.path.join('game_image', 'timg', f'tt_lap_{hud_language}_lap3.tpl'),
os.path.join('game_image', 'timg', f'tt_time_{hud_language}.tpl'),
]
for i in range(12):
for base in ['tt_position_no_st_64x64', 'tt_multi_position_no_st_64x64']:
asset_in_files[os.path.join('Scene', 'UI', f'RaceSP_{language}.arc.lzma')] += [
os.path.join('game_image', 'timg', f'{base}_{hud_language}_{i + 1:02d}.tpl')
]
asset_in_files[os.path.join('Scene', 'UI', f'TitleSP_{language}.arc.lzma')] = [
os.path.join('message', f'Common_{language}.bmg.json5'),
os.path.join('message', f'Menu_{language}.bmg.json5'),
]
asset_out_files = {target: [] for target in asset_in_files}
for target in asset_in_files:
for in_file in asset_in_files[target]:
base, ext = os.path.splitext(in_file)
outext = {
'.bin': '.bin',
'.breff': '.breff',
'.breft': '.breft',
'.brfna': '.brfna',
'.brfnt': '.brfnt',
'.brlyt': '.brlyt',
'.brres': '.brres',
'.json5': '',
'.tpl': '.tpl',
}[ext]
out_file = os.path.join('$builddir', 'Shared.arc.lzma.d', base + outext)
basebase, baseext = os.path.splitext(base)
out_files = [out_file for out_files in asset_out_files.values() for out_file in out_files]
if baseext == '.bmg':
merged_file = os.path.join('$builddir', 'merged', in_file)
if out_file not in out_files:
n.build(
merged_file,
'merge',
[
os.path.join('assets', in_file),
os.path.join('assets', basebase.rsplit('_', 1)[0] + 'SP_U.bmg.json5'),
os.path.join('assets', basebase.replace('_', 'SP_') + '.bmg.json5'),
],
implicit = '$merge',
)
in_file = merged_file
else:
in_file = os.path.join('assets', in_file)
if out_file not in out_files:
rule = {
'.bin': 'cp',
'.breff': 'cp',
'.breft': 'cp',
'.brfna': 'cp',
'.brfnt': 'cp',
'.brlyt': 'cp',
'.brres': 'cp',
'.json5': 'wuj5',
'.tpl': 'cp',
}[ext]
n.build(
out_file,
rule,
in_file,
)
asset_out_files[target] += [out_file]
n.newline()
renamed = {}
for language in LANGUAGES:
renamed[f'jugemu_lap_{language}.brres'] = 'jugemu_lap.brres'
renamed[f'jugemu_lapf_{language}.brres'] = 'jugemu_lapf.brres'
renamed[f'Common_{language}.bmg'] = 'Common.bmg'
renamed[f'Menu_{language}.bmg'] = 'Menu.bmg'
renamed[f'Race_{language}.bmg'] = 'Race.bmg'
for hud_language in HUD_LANGUAGES.values():
renamed[f'tt_lap_{hud_language}.tpl'] = 'tt_lap_E.tpl'
renamed[f'tt_lap_{hud_language}_lap1.tpl'] = 'tt_lap_E_Lap1.tpl'
renamed[f'tt_lap_{hud_language}_lap2.tpl'] = 'tt_lap_E_lap2.tpl'
renamed[f'tt_lap_{hud_language}_lap3.tpl'] = 'tt_lap_E_lap3.tpl'
renamed[f'tt_speed_{hud_language}.tpl'] = 'tt_speed.tpl'
renamed[f'tt_time_{hud_language}.tpl'] = 'tt_time_E.tpl'
for i in range(12):
for base in ['tt_position_no_st_64x64', 'tt_multi_position_no_st_64x64']:
renamed[f'{base}_{hud_language}_{i + 1:02d}.tpl'] = f'{base}_{i + 1:02d}.tpl'
for target in asset_out_files:
target_renamed = {}
for out_file in asset_out_files[target]:
out_file = os.path.basename(out_file)
if out_file in renamed:
target_renamed[out_file] = renamed[out_file]
target_renamed = ' '.join([f'--renamed {src} {dst}' for src, dst in target_renamed.items()])
n.build(
os.path.join('$builddir', 'contents.arc.d', target),
'arc',
asset_out_files[target],
variables = {
'arcin': os.path.join('$builddir', 'Shared.arc.lzma.d'),
'args': target_renamed,
},
)
n.newline()
devkitppc = os.environ.get("DEVKITPPC")
if not devkitppc:
raise SystemExit("DEVKITPPC environment variable not set")
n.variable('write', os.path.join('tools', 'write.py'))
n.variable('nanopb', os.path.join('vendor', 'nanopb', 'generator', 'nanopb_generator.py'))
n.variable('gcc', os.path.join(devkitppc, 'bin', 'powerpc-eabi-gcc'))
n.variable('compiler', os.path.join(devkitppc, 'bin', 'powerpc-eabi-gcc'))
n.variable('postprocess', 'postprocess.py')
n.variable('port', 'port.py')
n.variable('generate_symbol_map', 'generate_symbol_map.py')
n.variable('lzmac', 'lzmac.py')
n.variable('version', 'version.py')
n.variable('elf2dol', 'elf2dol.py')
n.newline()
n.rule(
'write',
command = f'{sys.executable} $write "$content" $out',
description = 'WRITE $out',
)
n.rule(
'nanopb',
command = f'{sys.executable} $nanopb $in -I protobuf -L "#include <vendor/nanopb/%s>" -D build/protobuf -q',
description = 'NANOPB $out',
)
n.newline()
common_Sflags = [
'-isystem', 'include',
'-isystem', 'payload',
'-isystem', 'vendor',
]
profile_Sflags = {
'DEBUG': [
'-DSP_DEBUG'
],
'TEST': [
'-DSP_TEST'
],
'RELEASE': [
'-DSP_RELEASE'
],
'CHANNEL': [
'-DSP_CHANNEL'
],
}
common_cflags = [
'-DREVOLUTION',
'-fms-extensions',
'-fno-asynchronous-unwind-tables',
'-fshort-wchar',
'-isystem', '.',
'-isystem', 'include',
'-isystem', 'payload',
'-isystem', 'vendor',
'-isystem', 'build',
'-msdata=none',
'-Wall',
'-Wextra',
'-Wno-packed-bitfield-compat',
]
common_ccflags = [
'-DREVOLUTION',
'-fno-asynchronous-unwind-tables',
'-fno-exceptions',
'-fno-rtti',
'-fshort-wchar',
'-isystem', '.',
'-isystem', 'include',
'-isystem', 'payload',
'-isystem', 'vendor',
'-isystem', 'build',
'-msdata=none',
'-std=c++23',
'-Wall',
'-Wextra',
'-Wno-delete-non-virtual-dtor',
'-Wno-packed-bitfield-compat',
'-Wsuggest-override',
]
if args.gdb_compatible:
common_cflags += ['-DGDB_COMPATIBLE=1']
common_ccflags += ['-DGDB_COMPATIBLE=1']
if args.ci:
common_ccflags.append("-Werror")
common_cflags.append("-Werror")
else: