summaryrefslogtreecommitdiff
path: root/assets
diff options
context:
space:
mode:
authorTyler McGavran <tyler.taggerung@gmail.com>2023-06-30 10:34:33 -0400
committerGitHub <noreply@github.com>2023-06-30 08:34:33 -0600
commita966aa178704ddb75726bdd45e28079417e782e4 (patch)
tree9603e9de90eda2735085ec305d71b903a639b9e6 /assets
parent6537b5dc7847ce537b6a3410eee3812bcc65b67b (diff)
Add some more asset make and json files (#322)
Course outlines, course previews, unused traffic light, and character portraits Signed-off-by: Taggerung <tyler.taggerung@email.com>
Diffstat (limited to 'assets')
-rw-r--r--assets/character_portraits.json22
-rw-r--r--assets/course_outlines.json22
-rw-r--r--assets/course_previews.json22
-rw-r--r--assets/include/character_portraits.mk59
-rw-r--r--assets/include/course_outlines.mk45
-rw-r--r--assets/include/course_previews.mk45
-rw-r--r--assets/include/unused_traffic_light.mk37
-rw-r--r--assets/unused_traffic_light.json13
8 files changed, 265 insertions, 0 deletions
diff --git a/assets/character_portraits.json b/assets/character_portraits.json
new file mode 100644
index 000000000..7da181800
--- /dev/null
+++ b/assets/character_portraits.json
@@ -0,0 +1,22 @@
+{
+"gTLUTPortraitMario": {"output_dir": "character_portraits", "rom_offset": "0x132B50", "block_offset": "0x1A4D8", "width": 16, "height": 16, "type": "rgba16"},
+"gTLUTPortraitLuigi": {"output_dir": "character_portraits", "rom_offset": "0x132B50", "block_offset": "0x1A6D8", "width": 16, "height": 16, "type": "rgba16"},
+"gTLUTPortraitPeach": {"output_dir": "character_portraits", "rom_offset": "0x132B50", "block_offset": "0x1A8D8", "width": 16, "height": 16, "type": "rgba16"},
+"gTLUTPortraitToad": {"output_dir": "character_portraits", "rom_offset": "0x132B50", "block_offset": "0x1AAD8", "width": 16, "height": 16, "type": "rgba16"},
+"gTLUTPortraitYoshi": {"output_dir": "character_portraits", "rom_offset": "0x132B50", "block_offset": "0x1ACD8", "width": 16, "height": 16, "type": "rgba16"},
+"gTLUTPortraitDonkeyKong": {"output_dir": "character_portraits", "rom_offset": "0x132B50", "block_offset": "0x1AED8", "width": 16, "height": 16, "type": "rgba16"},
+"gTLUTPortraitWario": {"output_dir": "character_portraits", "rom_offset": "0x132B50", "block_offset": "0x1B0D8", "width": 16, "height": 16, "type": "rgba16"},
+"gTLUTPortraitBowser": {"output_dir": "character_portraits", "rom_offset": "0x132B50", "block_offset": "0x1B2D8", "width": 16, "height": 16, "type": "rgba16"},
+"gTLUTPortraitBombKartAndQuestionMark": {"output_dir": "character_portraits", "rom_offset": "0x132B50", "block_offset": "0x1B4D8", "width": 16, "height": 16, "type": "rgba16"},
+
+"gTexturePortraitMario": {"output_dir": "character_portraits", "rom_offset": "0x132B50", "block_offset": "0x1B6D8", "width": 32, "height": 32, "type": "ci8", "tlut": "gTLUTPortraitMario"},
+"gTexturePortraitLuigi": {"output_dir": "character_portraits", "rom_offset": "0x132B50", "block_offset": "0x1BAD8", "width": 32, "height": 32, "type": "ci8", "tlut": "gTLUTPortraitLuigi"},
+"gTexturePortraitPeach": {"output_dir": "character_portraits", "rom_offset": "0x132B50", "block_offset": "0x1BED8", "width": 32, "height": 32, "type": "ci8", "tlut": "gTLUTPortraitPeach"},
+"gTexturePortraitToad": {"output_dir": "character_portraits", "rom_offset": "0x132B50", "block_offset": "0x1C2D8", "width": 32, "height": 32, "type": "ci8", "tlut": "gTLUTPortraitToad"},
+"gTexturePortraitYoshi": {"output_dir": "character_portraits", "rom_offset": "0x132B50", "block_offset": "0x1C6D8", "width": 32, "height": 32, "type": "ci8", "tlut": "gTLUTPortraitYoshi"},
+"gTexturePortraitDonkeyKong": {"output_dir": "character_portraits", "rom_offset": "0x132B50", "block_offset": "0x1CAD8", "width": 32, "height": 32, "type": "ci8", "tlut": "gTLUTPortraitDonkeyKong"},
+"gTexturePortraitWario": {"output_dir": "character_portraits", "rom_offset": "0x132B50", "block_offset": "0x1CED8", "width": 32, "height": 32, "type": "ci8", "tlut": "gTLUTPortraitWario"},
+"gTexturePortraitBowser": {"output_dir": "character_portraits", "rom_offset": "0x132B50", "block_offset": "0x1D2D8", "width": 32, "height": 32, "type": "ci8", "tlut": "gTLUTPortraitBowser"},
+"gTexturePortraitBombKart": {"output_dir": "character_portraits", "rom_offset": "0x132B50", "block_offset": "0x1D6D8", "width": 32, "height": 32, "type": "ci8", "tlut": "gTLUTPortraitBombKartAndQuestionMark"},
+"gTexturePortraitQuestionMark": {"output_dir": "character_portraits", "rom_offset": "0x132B50", "block_offset": "0x1DAD8", "width": 32, "height": 32, "type": "ci8", "tlut": "gTLUTPortraitBombKartAndQuestionMark"}
+}
diff --git a/assets/course_outlines.json b/assets/course_outlines.json
new file mode 100644
index 000000000..48877d202
--- /dev/null
+++ b/assets/course_outlines.json
@@ -0,0 +1,22 @@
+{
+"gTextureCourseOutlineMarioRaceway": {"output_dir": "course_outlines", "rom_offset": "0x720C0C", "width": 64, "height": 64, "type": "i4"},
+"gTextureCourseOutlineChocoMountain": {"output_dir": "course_outlines", "rom_offset": "0x720ED0", "width": 64, "height": 64, "type": "i4"},
+"gTextureCourseOutlineBowsersCastle": {"output_dir": "course_outlines", "rom_offset": "0x7211D8", "width": 64, "height": 64, "type": "i4"},
+"gTextureCourseOutlineBansheeBoardwalk": {"output_dir": "course_outlines", "rom_offset": "0x72143C", "width": 64, "height": 64, "type": "i4"},
+"gTextureCourseOutlineYoshiValley": {"output_dir": "course_outlines", "rom_offset": "0x721634", "width": 64, "height": 64, "type": "i4"},
+"gTextureCourseOutlineFrappeSnowland": {"output_dir": "course_outlines", "rom_offset": "0x721A58", "width": 64, "height": 64, "type": "i4"},
+"gTextureCourseOutlineKoopaTroopaBeach": {"output_dir": "course_outlines", "rom_offset": "0x721CD0", "width": 64, "height": 64, "type": "i4"},
+"gTextureCourseOutlineRoyalRaceway": {"output_dir": "course_outlines", "rom_offset": "0x721F38", "width": 64, "height": 64, "type": "i4"},
+"gTextureCourseOutlineLuigiRaceway": {"output_dir": "course_outlines", "rom_offset": "0x722210", "width": 64, "height": 96, "type": "i4"},
+"gTextureCourseOutlineMooMooFarm": {"output_dir": "course_outlines", "rom_offset": "0x72248C", "width": 64, "height": 64, "type": "i4"},
+"gTextureCourseOutlineToadsTurnpike": {"output_dir": "course_outlines", "rom_offset": "0x7226C4", "width": 128, "height": 64, "type": "i4"},
+"gTextureCourseOutlineKalimariDesert": {"output_dir": "course_outlines", "rom_offset": "0x7229C0", "width": 64, "height": 96, "type": "i4"},
+"gTextureCourseOutlineSherbetLand": {"output_dir": "course_outlines", "rom_offset": "0x722D2C", "width": 64, "height": 64, "type": "i4"},
+"gTextureCourseOutlineRainbowRoad": {"output_dir": "course_outlines", "rom_offset": "0x723034", "width": 64, "height": 96, "type": "i4"},
+"gTextureCourseOutlineWarioStadium": {"output_dir": "course_outlines", "rom_offset": "0x723370", "width": 64, "height": 64, "type": "i4"},
+"gTextureCourseOutlineBlockFort": {"output_dir": "course_outlines", "rom_offset": "0x723644", "width": 64, "height": 64, "type": "i4"},
+"gTextureCourseOutlineSkyscraper": {"output_dir": "course_outlines", "rom_offset": "0x7238E4", "width": 64, "height": 64, "type": "i4"},
+"gTextureCourseOutlineDoubleDeck": {"output_dir": "course_outlines", "rom_offset": "0x723B18", "width": 64, "height": 64, "type": "i4"},
+"gTextureCourseOutlineDksJungleParkway": {"output_dir": "course_outlines", "rom_offset": "0x723C9C", "width": 64, "height": 64, "type": "i4"},
+"gTextureCourseOutlineBigDonut": {"output_dir": "course_outlines", "rom_offset": "0x723F84", "width": 64, "height": 64, "type": "i4"}
+}
diff --git a/assets/course_previews.json b/assets/course_previews.json
new file mode 100644
index 000000000..66f5a35a5
--- /dev/null
+++ b/assets/course_previews.json
@@ -0,0 +1,22 @@
+{
+"gTextureCoursePreviewMarioRaceway": {"output_dir": "course_previews", "rom_offset": "0x7A1418", "width": 128, "height": 78, "type": "rgba16"},
+"gTextureCoursePreviewChocoMountain": {"output_dir": "course_previews", "rom_offset": "0x7A4570", "width": 128, "height": 78, "type": "rgba16"},
+"gTextureCoursePreviewBowsersCastle": {"output_dir": "course_previews", "rom_offset": "0x7A6F94", "width": 128, "height": 78, "type": "rgba16"},
+"gTextureCoursePreviewBansheeBoardwalk": {"output_dir": "course_previews", "rom_offset": "0x7AA074", "width": 128, "height": 78, "type": "rgba16"},
+"gTextureCoursePreviewYoshiValley": {"output_dir": "course_previews", "rom_offset": "0x7AC720", "width": 128, "height": 78, "type": "rgba16"},
+"gTextureCoursePreviewFrappeSnowland": {"output_dir": "course_previews", "rom_offset": "0x7B0160", "width": 128, "height": 78, "type": "rgba16"},
+"gTextureCoursePreviewKoopaTroopaBeach": {"output_dir": "course_previews", "rom_offset": "0x7B2568", "width": 128, "height": 78, "type": "rgba16"},
+"gTextureCoursePreviewRoyalRaceway": {"output_dir": "course_previews", "rom_offset": "0x7B488C", "width": 128, "height": 78, "type": "rgba16"},
+"gTextureCoursePreviewLuigiRaceway": {"output_dir": "course_previews", "rom_offset": "0x7B70AC", "width": 128, "height": 78, "type": "rgba16"},
+"gTextureCoursePreviewMooMooFarm": {"output_dir": "course_previews", "rom_offset": "0x7B9E20", "width": 128, "height": 78, "type": "rgba16"},
+"gTextureCoursePreviewToadsTurnpike": {"output_dir": "course_previews", "rom_offset": "0x7BC3E8", "width": 128, "height": 78, "type": "rgba16"},
+"gTextureCoursePreviewKalimariDesert": {"output_dir": "course_previews", "rom_offset": "0x7BED84", "width": 128, "height": 78, "type": "rgba16"},
+"gTextureCoursePreviewSherbetLand": {"output_dir": "course_previews", "rom_offset": "0x7C1590", "width": 128, "height": 78, "type": "rgba16"},
+"gTextureCoursePreviewRainbowRoad": {"output_dir": "course_previews", "rom_offset": "0x7C45A0", "width": 128, "height": 78, "type": "rgba16"},
+"gTextureCoursePreviewWarioStadium": {"output_dir": "course_previews", "rom_offset": "0x7C6DC4", "width": 128, "height": 78, "type": "rgba16"},
+"gTextureCoursePreviewBlockFort": {"output_dir": "course_previews", "rom_offset": "0x7CA098", "width": 128, "height": 78, "type": "rgba16"},
+"gTextureCoursePreviewSkyscraper": {"output_dir": "course_previews", "rom_offset": "0x7CC5C0", "width": 128, "height": 78, "type": "rgba16"},
+"gTextureCoursePreviewDoubleDeck": {"output_dir": "course_previews", "rom_offset": "0x7CECB0", "width": 128, "height": 78, "type": "rgba16"},
+"gTextureCoursePreviewDksJungleParkway": {"output_dir": "course_previews", "rom_offset": "0x7D15A8", "width": 128, "height": 78, "type": "rgba16"},
+"gTextureCoursePreviewBigDonut": {"output_dir": "course_previews", "rom_offset": "0x7D548C", "width": 128, "height": 78, "type": "rgba16"}
+}
diff --git a/assets/include/character_portraits.mk b/assets/include/character_portraits.mk
new file mode 100644
index 000000000..fbdb73a81
--- /dev/null
+++ b/assets/include/character_portraits.mk
@@ -0,0 +1,59 @@
+PORTRAITS_DIR := assets/character_portraits
+
+PORTRAIT_PALETTES := \
+$(PORTRAITS_DIR)/gTLUTPortraitMario.png \
+$(PORTRAITS_DIR)/gTLUTPortraitLuigi.png \
+$(PORTRAITS_DIR)/gTLUTPortraitPeach.png \
+$(PORTRAITS_DIR)/gTLUTPortraitToad.png \
+$(PORTRAITS_DIR)/gTLUTPortraitYoshi.png \
+$(PORTRAITS_DIR)/gTLUTPortraitDonkeyKong.png \
+$(PORTRAITS_DIR)/gTLUTPortraitWario.png \
+$(PORTRAITS_DIR)/gTLUTPortraitBowser.png
+
+PORTRAIT_PNG := \
+$(PORTRAITS_DIR)/gTexturePortraitMario.png \
+$(PORTRAITS_DIR)/gTexturePortraitLuigi.png \
+$(PORTRAITS_DIR)/gTexturePortraitPeach.png \
+$(PORTRAITS_DIR)/gTexturePortraitToad.png \
+$(PORTRAITS_DIR)/gTexturePortraitYoshi.png \
+$(PORTRAITS_DIR)/gTexturePortraitDonkeyKong.png \
+$(PORTRAITS_DIR)/gTexturePortraitWario.png \
+$(PORTRAITS_DIR)/gTexturePortraitBowser.png
+
+# This is kind of ugly. I think the only fix for it would be to put these two portraits
+# and their palette in a separate .mk file. But I think that's even uglier
+
+SPECIAL_PORTRAIT_PALETTE := $(PORTRAITS_DIR)/gTLUTPortraitBombKartAndQuestionMark.png
+
+SPECIAL_PORTRAIT_PNG := \
+$(PORTRAITS_DIR)/gTexturePortraitBombKart.png \
+$(PORTRAITS_DIR)/gTexturePortraitQuestionMark.png
+
+PORTRAIT_EXPORT_SENTINEL := $(PORTRAITS_DIR)/.export
+
+$(BUILD_DIR)/src/common_textures.inc.o: $(PORTRAIT_PNG:%.png=%.inc.c) $(PORTRAIT_PALETTES:%.png=%.inc.c)
+$(BUILD_DIR)/src/common_textures.inc.o: $(SPECIAL_PORTRAIT_PNG:%.png=%.inc.c) $(SPECIAL_PORTRAIT_PALETTE:%.png=%.inc.c)
+
+$(PORTRAIT_PNG:%.png=%.inc.c): $(PORTRAITS_DIR)/gTexturePortrait%.inc.c : $(PORTRAITS_DIR)/gTexturePortrait%.png
+ $(N64GRAPHICS) -Z $@ -g $< -s u8 -f ci8 -c rgba16 -p $(PORTRAITS_DIR)/gTLUTPortrait$*.png
+
+$(SPECIAL_PORTRAIT_PNG:%.png=%.inc.c): $(PORTRAITS_DIR)/gTexturePortrait%.inc.c : $(PORTRAITS_DIR)/gTexturePortrait%.png
+ $(N64GRAPHICS) -Z $@ -g $< -s u8 -f ci8 -c rgba16 -p $(SPECIAL_PORTRAIT_PALETTE)
+
+$(PORTRAIT_PALETTES:%.png=%.inc.c): %.inc.c : %.png
+ $(N64GRAPHICS) -i $@ -g $< -s u8 -f rgba16
+
+$(SPECIAL_PORTRAIT_PALETTE:%.png=%.inc.c): %.inc.c : %.png
+ $(N64GRAPHICS) -i $@ -g $< -s u8 -f rgba16
+
+$(PORTRAIT_PNG) $(SPECIAL_PORTRAIT_PNG) $(PORTRAIT_PALETTES) $(SPECIAL_PORTRAIT_PALETTE): $(PORTRAIT_EXPORT_SENTINEL) ;
+
+$(PORTRAIT_EXPORT_SENTINEL): $(ASSET_DIR)/character_portraits.json
+ $(ASSET_EXTRACT) $(BASEROM) $<
+ touch $@
+
+.PHONY: distclean_character_portraits
+distclean_character_portraits:
+ rm -rf $(PORTRAITS_DIR)
+
+distclean_assets: distclean_character_portraits
diff --git a/assets/include/course_outlines.mk b/assets/include/course_outlines.mk
new file mode 100644
index 000000000..84f489a49
--- /dev/null
+++ b/assets/include/course_outlines.mk
@@ -0,0 +1,45 @@
+COURSE_OUTLINE_DIR := assets/course_outlines
+
+COURSE_OUTLINE_PNG := \
+$(COURSE_OUTLINE_DIR)/gTextureCourseOutlineMarioRaceway.png \
+$(COURSE_OUTLINE_DIR)/gTextureCourseOutlineChocoMountain.png \
+$(COURSE_OUTLINE_DIR)/gTextureCourseOutlineBowsersCastle.png \
+$(COURSE_OUTLINE_DIR)/gTextureCourseOutlineBansheeBoardwalk.png \
+$(COURSE_OUTLINE_DIR)/gTextureCourseOutlineYoshiValley.png \
+$(COURSE_OUTLINE_DIR)/gTextureCourseOutlineFrappeSnowland.png \
+$(COURSE_OUTLINE_DIR)/gTextureCourseOutlineKoopaTroopaBeach.png \
+$(COURSE_OUTLINE_DIR)/gTextureCourseOutlineRoyalRaceway.png \
+$(COURSE_OUTLINE_DIR)/gTextureCourseOutlineLuigiRaceway.png \
+$(COURSE_OUTLINE_DIR)/gTextureCourseOutlineMooMooFarm.png \
+$(COURSE_OUTLINE_DIR)/gTextureCourseOutlineToadsTurnpike.png \
+$(COURSE_OUTLINE_DIR)/gTextureCourseOutlineKalimariDesert.png \
+$(COURSE_OUTLINE_DIR)/gTextureCourseOutlineSherbetLand.png \
+$(COURSE_OUTLINE_DIR)/gTextureCourseOutlineRainbowRoad.png \
+$(COURSE_OUTLINE_DIR)/gTextureCourseOutlineWarioStadium.png \
+$(COURSE_OUTLINE_DIR)/gTextureCourseOutlineBlockFort.png \
+$(COURSE_OUTLINE_DIR)/gTextureCourseOutlineSkyscraper.png \
+$(COURSE_OUTLINE_DIR)/gTextureCourseOutlineDoubleDeck.png \
+$(COURSE_OUTLINE_DIR)/gTextureCourseOutlineDksJungleParkway.png \
+$(COURSE_OUTLINE_DIR)/gTextureCourseOutlineBigDonut.png
+
+COURSE_OUTLINE_EXPORT_SENTINEL := $(COURSE_OUTLINE_DIR)/.export
+
+$(BUILD_DIR)/data/other_textures.o: $(COURSE_OUTLINE_PNG:%.png=%.mio0)
+
+$(COURSE_OUTLINE_PNG:%.png=%.mio0): %.mio0 : %.bin
+ $(MIO0TOOL) -c $< $@
+
+$(COURSE_OUTLINE_PNG:%.png=%.bin): %.bin : %.png
+ $(N64GRAPHICS) -i $@ -g $< -s raw -f i4
+
+$(COURSE_OUTLINE_PNG): $(COURSE_OUTLINE_EXPORT_SENTINEL) ;
+
+$(COURSE_OUTLINE_EXPORT_SENTINEL): $(ASSET_DIR)/course_outlines.json
+ $(ASSET_EXTRACT) $(BASEROM) $<
+ touch $@
+
+.PHONY: distclean_course_outlines
+distclean_course_outlines:
+ rm -rf $(COURSE_OUTLINE_DIR)
+
+distclean_assets: distclean_course_outlines
diff --git a/assets/include/course_previews.mk b/assets/include/course_previews.mk
new file mode 100644
index 000000000..267c6cb09
--- /dev/null
+++ b/assets/include/course_previews.mk
@@ -0,0 +1,45 @@
+COURSE_PREVIEW_DIR := assets/course_previews
+
+COURSE_PREVIEW_PNG := \
+$(COURSE_PREVIEW_DIR)/gTextureCoursePreviewMarioRaceway.png \
+$(COURSE_PREVIEW_DIR)/gTextureCoursePreviewChocoMountain.png \
+$(COURSE_PREVIEW_DIR)/gTextureCoursePreviewBowsersCastle.png \
+$(COURSE_PREVIEW_DIR)/gTextureCoursePreviewBansheeBoardwalk.png \
+$(COURSE_PREVIEW_DIR)/gTextureCoursePreviewYoshiValley.png \
+$(COURSE_PREVIEW_DIR)/gTextureCoursePreviewFrappeSnowland.png \
+$(COURSE_PREVIEW_DIR)/gTextureCoursePreviewKoopaTroopaBeach.png \
+$(COURSE_PREVIEW_DIR)/gTextureCoursePreviewRoyalRaceway.png \
+$(COURSE_PREVIEW_DIR)/gTextureCoursePreviewLuigiRaceway.png \
+$(COURSE_PREVIEW_DIR)/gTextureCoursePreviewMooMooFarm.png \
+$(COURSE_PREVIEW_DIR)/gTextureCoursePreviewToadsTurnpike.png \
+$(COURSE_PREVIEW_DIR)/gTextureCoursePreviewKalimariDesert.png \
+$(COURSE_PREVIEW_DIR)/gTextureCoursePreviewSherbetLand.png \
+$(COURSE_PREVIEW_DIR)/gTextureCoursePreviewRainbowRoad.png \
+$(COURSE_PREVIEW_DIR)/gTextureCoursePreviewWarioStadium.png \
+$(COURSE_PREVIEW_DIR)/gTextureCoursePreviewBlockFort.png \
+$(COURSE_PREVIEW_DIR)/gTextureCoursePreviewSkyscraper.png \
+$(COURSE_PREVIEW_DIR)/gTextureCoursePreviewDoubleDeck.png \
+$(COURSE_PREVIEW_DIR)/gTextureCoursePreviewDksJungleParkway.png \
+$(COURSE_PREVIEW_DIR)/gTextureCoursePreviewBigDonut.png
+
+COURSE_PREVIEW_EXPORT_SENTINEL := $(COURSE_PREVIEW_DIR)/.export
+
+$(BUILD_DIR)/src/textures.inc.o: $(COURSE_PREVIEW_PNG:%.png=%.mio0)
+
+$(COURSE_PREVIEW_PNG:%.png=%.mio0): %.mio0 : %.bin
+ $(MIO0TOOL) -c $< $@
+
+$(COURSE_PREVIEW_PNG:%.png=%.bin): %.bin : %.png
+ $(N64GRAPHICS) -i $@ -g $< -s raw -f rgba16
+
+$(COURSE_PREVIEW_PNG): $(COURSE_PREVIEW_EXPORT_SENTINEL) ;
+
+$(COURSE_PREVIEW_EXPORT_SENTINEL): $(ASSET_DIR)/course_previews.json
+ $(ASSET_EXTRACT) $(BASEROM) $<
+ touch $@
+
+.PHONY: distclean_course_previews
+distclean_course_previews:
+ rm -rf $(COURSE_PREVIEW_DIR)
+
+distclean_assets: distclean_course_previews
diff --git a/assets/include/unused_traffic_light.mk b/assets/include/unused_traffic_light.mk
new file mode 100644
index 000000000..2bb6e23d7
--- /dev/null
+++ b/assets/include/unused_traffic_light.mk
@@ -0,0 +1,37 @@
+UNUSED_TRAFFIC_LIGHT_DIR := assets/unused_traffic_light
+
+UNUSED_TRAFFIC_LIGHT_PALETTE := $(UNUSED_TRAFFIC_LIGHT_DIR)/gTLUTUnusedTrafficLight.png
+
+UNUSED_TRAFFIC_LIGHT_PNG := \
+$(UNUSED_TRAFFIC_LIGHT_DIR)/gTextureUnusedTrafficLight01.png \
+$(UNUSED_TRAFFIC_LIGHT_DIR)/gTextureUnusedTrafficLight02.png \
+$(UNUSED_TRAFFIC_LIGHT_DIR)/gTextureUnusedTrafficLight03.png \
+$(UNUSED_TRAFFIC_LIGHT_DIR)/gTextureUnusedTrafficLight04.png \
+$(UNUSED_TRAFFIC_LIGHT_DIR)/gTextureUnusedTrafficLight05.png \
+$(UNUSED_TRAFFIC_LIGHT_DIR)/gTextureUnusedTrafficLight06.png \
+$(UNUSED_TRAFFIC_LIGHT_DIR)/gTextureUnusedTrafficLight07.png \
+$(UNUSED_TRAFFIC_LIGHT_DIR)/gTextureUnusedTrafficLight08.png \
+$(UNUSED_TRAFFIC_LIGHT_DIR)/gTextureUnusedTrafficLight09.png \
+$(UNUSED_TRAFFIC_LIGHT_DIR)/gTextureUnusedTrafficLight10.png
+
+UNUSED_TRAFFIC_LIGHT_EXPORT_SENTINEL := $(UNUSED_TRAFFIC_LIGHT_DIR)/.export
+
+$(BUILD_DIR)/src/common_textures.inc.o: $(UNUSED_TRAFFIC_LIGHT_PNG:%.png=%.inc.c) $(UNUSED_TRAFFIC_LIGHT_PALETTE:%.png=%.inc.c)
+
+$(UNUSED_TRAFFIC_LIGHT_PNG:%.png=%.inc.c): %.inc.c : %.png
+ $(N64GRAPHICS) -Z $@ -g $< -s u8 -f ci8 -c rgba16 -p $(UNUSED_TRAFFIC_LIGHT_PALETTE)
+
+$(UNUSED_TRAFFIC_LIGHT_PALETTE:%.png=%.inc.c): %.inc.c : %.png
+ $(N64GRAPHICS) -i $@ -g $< -s u8 -f rgba16
+
+$(UNUSED_TRAFFIC_LIGHT_PNG) $(UNUSED_TRAFFIC_LIGHT_PALETTE): $(UNUSED_TRAFFIC_LIGHT_EXPORT_SENTINEL) ;
+
+$(UNUSED_TRAFFIC_LIGHT_EXPORT_SENTINEL): $(ASSET_DIR)/unused_traffic_light.json
+ $(ASSET_EXTRACT) $(BASEROM) $<
+ touch $@
+
+.PHONY: distclean_unused_traffic_light
+distclean_unused_traffic_light:
+ rm -rf $(UNUSED_TRAFFIC_LIGHT_DIR)
+
+distclean_assets: distclean_unused_traffic_light
diff --git a/assets/unused_traffic_light.json b/assets/unused_traffic_light.json
new file mode 100644
index 000000000..49a652bc4
--- /dev/null
+++ b/assets/unused_traffic_light.json
@@ -0,0 +1,13 @@
+{
+"gTLUTUnusedTrafficLight": {"output_dir": "unused_traffic_light", "rom_offset": "0x132B50", "block_offset": "0x25ED8", "width": 16, "height": 16, "type": "rgba16"},
+"gTextureUnusedTrafficLight01": {"output_dir": "unused_traffic_light", "rom_offset": "0x132B50", "block_offset": "0x260D8", "width": 24, "height": 48, "type": "ci8", "tlut": "gTLUTUnusedTrafficLight"},
+"gTextureUnusedTrafficLight02": {"output_dir": "unused_traffic_light", "rom_offset": "0x132B50", "block_offset": "0x26558", "width": 24, "height": 48, "type": "ci8", "tlut": "gTLUTUnusedTrafficLight"},
+"gTextureUnusedTrafficLight03": {"output_dir": "unused_traffic_light", "rom_offset": "0x132B50", "block_offset": "0x269D8", "width": 24, "height": 48, "type": "ci8", "tlut": "gTLUTUnusedTrafficLight"},
+"gTextureUnusedTrafficLight04": {"output_dir": "unused_traffic_light", "rom_offset": "0x132B50", "block_offset": "0x26E58", "width": 24, "height": 48, "type": "ci8", "tlut": "gTLUTUnusedTrafficLight"},
+"gTextureUnusedTrafficLight05": {"output_dir": "unused_traffic_light", "rom_offset": "0x132B50", "block_offset": "0x272D8", "width": 24, "height": 48, "type": "ci8", "tlut": "gTLUTUnusedTrafficLight"},
+"gTextureUnusedTrafficLight06": {"output_dir": "unused_traffic_light", "rom_offset": "0x132B50", "block_offset": "0x27758", "width": 24, "height": 48, "type": "ci8", "tlut": "gTLUTUnusedTrafficLight"},
+"gTextureUnusedTrafficLight07": {"output_dir": "unused_traffic_light", "rom_offset": "0x132B50", "block_offset": "0x27BD8", "width": 24, "height": 48, "type": "ci8", "tlut": "gTLUTUnusedTrafficLight"},
+"gTextureUnusedTrafficLight08": {"output_dir": "unused_traffic_light", "rom_offset": "0x132B50", "block_offset": "0x28058", "width": 24, "height": 48, "type": "ci8", "tlut": "gTLUTUnusedTrafficLight"},
+"gTextureUnusedTrafficLight09": {"output_dir": "unused_traffic_light", "rom_offset": "0x132B50", "block_offset": "0x284D8", "width": 24, "height": 48, "type": "ci8", "tlut": "gTLUTUnusedTrafficLight"},
+"gTextureUnusedTrafficLight10": {"output_dir": "unused_traffic_light", "rom_offset": "0x132B50", "block_offset": "0x28958", "width": 24, "height": 48, "type": "ci8", "tlut": "gTLUTUnusedTrafficLight"}
+}