ROM := pokegold-spaceworld.gb
CORRECTEDROM := $(ROM:%.gb=%-correctheader.gb)
BASEROM := baserom.gb

DIRS := home engine data gfx audio maps scripts ram slack
FILES :=

BUILD := build

rwildcard = $(foreach d, $(wildcard $1*), $(filter $(subst *, %, $2), $d) $(call rwildcard, $d/, $2))
ASMFILES := $(call rwildcard, $(DIRS), *.asm) $(FILES)
OBJS := $(patsubst %.asm, $(BUILD)/%.o, $(ASMFILES))
OBJS += $(BUILD)/shim.o


### Build tools

ifeq (,$(shell which sha1sum))
SHA1 := shasum
else
SHA1 := sha1sum
endif

PYTHON := python3

RGBDS ?=
RGBASM  ?= $(RGBDS)rgbasm
RGBFIX  ?= $(RGBDS)rgbfix
RGBGFX  ?= $(RGBDS)rgbgfx
RGBLINK ?= $(RGBDS)rgblink

RGBASMFLAGS := -E -i $(BUILD)/ -DGOLD

SCAN_INCLUDES := tools/scan_includes
MAKE_SHIM := tools/make_shim.py

tools/gfx :=


### Build targets

.SECONDEXPANSION:

.PHONY: all
all: $(ROM) $(CORRECTEDROM) compare

.PHONY: compare
compare: $(ROM) $(CORRECTEDROM)
	@$(SHA1) -c roms.sha1

.PHONY: tools
tools tools/pkmncompress tools/gfx tools/scan_includes:
	"$(MAKE)" -C tools/

# Remove files generated by the build process.
.PHONY: clean
clean:
	rm -rf $(ROM) $(CORRECTEDROM) $(ROMS:.gb=.sym) $(ROMS:.gb=.map) $(BUILD)
	"$(MAKE)" -C tools clean

# Remove generated files except for graphics.
.PHONY: tidy
tidy:
	rm -rf $(ROM) $(CORRECTEDROM) $(ROMS:.gb=.sym) $(ROMS:.gb=.map) $(OBJS) $(BUILD)/shim.asm

# Visualize disassembly progress.
.PHONY: coverage
coverage: $(ROM:.gb=.map)
	utils/coverage.py $<


### Build products

%.map: %.gb

$(CORRECTEDROM): %-correctheader.gb: %.gb
	cp $< $@
	cp $(<:.gb=.sym) $(@:.gb=.sym)
	$(RGBFIX) -f hg -m 0x10 $@

$(ROM): poke%-spaceworld.gb: layout.link $(OBJS) | $(BASEROM)
	$(RGBLINK) -d -n $(@:.gb=.sym) -m $(@:.gb=.map) -l layout.link -O $(BASEROM) -o $@ $(filter-out $<, $^)
	$(RGBFIX) -f lh -k 01 -l 0x33 -m 0x03 -p 0 -r 3 -t "POKEMON2$(shell echo $* | cut -d _ -f 1 | tr '[:lower:]' '[:upper:]')" $@

$(BASEROM):
	@echo "Please obtain a copy of Gold_debug.sgb and put it in this directory as $@"
	@exit 1

$(BUILD)/shim.asm: shim.sym | $$(dir $$@)
	$(MAKE_SHIM) $< > $@


### Misc file-specific graphics rules
include gfx/gfx.mk
include slack/slack.mk


### Catch-all build target rules

$(BUILD)/%.o: $(BUILD)/%.asm | $$(dir $$@)
	$(RGBASM) $(RGBASMFLAGS) $(OUTPUT_OPTION) $<

$(BUILD)/%.o: %.asm | $$(dir $$@)
	$(RGBASM) $(RGBASMFLAGS) $(OUTPUT_OPTION) $<

$(BUILD)/%.d: %.asm | $$(dir $$@) $(SCAN_INCLUDES)
	@$(SCAN_INCLUDES) -b $(BUILD)/ -i $(BUILD)/ -i ./ -o $@ -t $(@:.d=.o) $<

.PRECIOUS: $(BUILD)/%.pic
$(BUILD)/%.pic: $(BUILD)/%.2bpp tools/pkmncompress | $$(dir $$@)
	tools/pkmncompress $< $@

.PRECIOUS: $(BUILD)/%.2bpp
$(BUILD)/%.2bpp: %.png tools/gfx | $$(dir $$@)
	$(RGBGFX) $(OUTPUT_OPTION) $<
	tools/gfx $(tools/gfx) $(OUTPUT_OPTION) $@

.PRECIOUS: $(BUILD)/%.1bpp
$(BUILD)/%.1bpp: %.1bpp.png tools/gfx | $$(dir $$@)
	$(RGBGFX) -d1 $(OUTPUT_OPTION) $<
	tools/gfx $(tools/gfx) -d1 $(OUTPUT_OPTION) $@

.PRECIOUS: $(BUILD)/%.tilemap
$(BUILD)/%.tilemap: %.png | $$(dir $$@)
	$(RGBGFX) -t $@ $<

.PRECIOUS: $(BUILD)/%.sgb.tilemap
$(BUILD)/%.sgb.tilemap: %.bin | $$(dir $$@)
	tr < $< -d '\000' > $@

.PRECIOUS: %/
%/:
	mkdir -p $@


### Scan .asm files for INCLUDE dependencies

ifeq (,$(filter clean tools,$(MAKECMDGOALS)))
-include $(patsubst %.o, %.d, $(OBJS))
endif
