PYTHON := python
MD5 := md5sum -c --quiet
CC := gcc

.SUFFIXES:
.PHONY: all clean prism prism00 lzcomp freespace
.SECONDEXPANSION:
.PRECIOUS: %.2bpp %.1bpp %.png %.asm %.c %.blk %.tilemap %.pal %.lz %.wav %.ded %.ctf %.bsp

poketools := extras/pokemontools
gfx       := $(PYTHON) gfx.py
includes  := $(PYTHON) $(poketools)/scan_includes.py
bank_ends := $(PYTHON) contents/bank_ends.py
EXE :=
LZ := utils/lzcomp${EXE}
TEXTCOMP := utils/textcomp${EXE}
BSPCOMP := utils/bspcomp${EXE}
IPSPATCH := utils/ipspatch${EXE}
XORBANKS := utils/xorbanks${EXE}

ifdef BUILD_DATE
BUILD_DATE_FLAG := -DBUILD_DATE=${BUILD_DATE}
else
BUILD_DATE_FLAG :=
endif

prism_obj := \
wram.o \
main.o \
audio.o \
maps.o \
text.o \
gfx.o

prism_nodebug_obj := $(prism_obj:.o=_nodebug.o)

gbs_obj := \
wram.o \
gbs.o

roms := pokeprism.gbc
all_roms := pokeprism.gbc pokeprism00.gbc pokeprism_nodebug.gbc

all: freespace nodebug

prism: pokeprism.gbc contents/contents.link
prism00: pokeprism00.gbc contents/contents.link
nodebug: pokeprism_nodebug.gbc contents/contents.link
lzcomp: ${LZ}
textcomp: ${TEXTCOMP}
bspcomp: ${BSPCOMP}
ipspatch: ${IPSPATCH}
xorbanks: ${XORBANKS}
gbs: pokeprism.gbs

freespace: contents/bank_ends.txt

${LZ}: utils/lzcomp.c
	${CC} -O3 $< -o $@

${TEXTCOMP}: utils/textcomp.c
	${CC} -O3 $< -o $@

${BSPCOMP}: utils/bsp/bspcomp.c
	${CC} -O3 $< -o $@

${IPSPATCH}: utils/ipspatch.c
	${CC} -O3 $< -o $@

${XORBANKS}: utils/xorbanks.c
	${CC} -O3 $< -o $@

clean:
	rm -f $(all_roms) $(prism_obj) $(prism_nodebug_obj) $(all_roms:.gbc=.map) $(all_roms:.gbc=.sym)
	rm -f $(LZ) ${TEXTCOMP} ${IPSPATCH} ${BSPCOMP} ${XORBANKS}
	rm -f pokeprism.bsp pokeprism.gbs
	cd patch && rm -f _xorpatch.bin _debug.ips _release.ips _hashes.txt _version.txt

patch: all baserom.gbc ${IPSPATCH} ${BSPCOMP} ${XORBANKS}
	[ $(shell sha1sum -b baserom.gbc | cut -c 1-40) = f2f52230b536214ef7c9924f483392993e226cfb ]
	utils/ipspatch create pokeprism_nodebug.gbc pokeprism.gbc patch/_debug.ips
	utils/ipspatch create pokeprism.gbc pokeprism_nodebug.gbc patch/_release.ips
	printf "\\thexdata %s\\n\\thexdata %s\\n" `sha1sum -b pokeprism_nodebug.gbc | cut -c 1-40` `sha1sum -b pokeprism.gbc | cut -c 1-40` > patch/_hashes.txt
	utils/xorbanks baserom.gbc pokeprism_nodebug.gbc patch/_xorpatch.bin
	hexdump -s 252 -n 4 -v -e '"\t" "hexdata " 4/1 "%02x" "\n"' pokeprism.gbc > patch/_version.txt
	cd patch && ../utils/bspcomp patch.txt ../pokeprism.bsp

%.asm: ;

%.o: dep = $(shell $(includes) $(@D)/$*.asm)
%.o: %.asm $$(dep)
	rgbasm -DDEBUG_MODE ${BUILD_DATE_FLAG} -o $@ $<

%_nodebug.o: dep = $(shell $(includes) $(@D)/$*.asm)
%_nodebug.o: %.asm $$(dep)
	rgbasm ${BUILD_DATE_FLAG} -o $@ $<

pokeprism.gbc: $(prism_obj) contents/contents.link
	rgblink -n pokeprism.sym.temp -m pokeprism.map -l contents/contents.link -p 0xff -o $@ ${prism_obj}
	rgbfix -Cjv -i PRSM -k 01 -l 0x33 -m 0x10 -p 0xff -r 3 -t PM_PRISM $@
	sort pokeprism.sym.temp >pokeprism.sym
	rm pokeprism.sym.temp

pokeprism00.gbc: $(prism_obj) contents/contents.link
	rgblink -n pokeprism00.sym.temp -m pokeprism00.map -l contents/contents.link -p 0x00 -o $@ ${prism_obj}
	rgbfix -Cjv -i PRSM -k 01 -l 0x33 -m 0x10 -p 0x00 -r 3 -t PM_PRISM $@
	sort pokeprism00.sym.temp >pokeprism00.sym
	rm pokeprism00.sym.temp

pokeprism_nodebug.gbc: $(prism_nodebug_obj) contents/contents.link
	rgblink -n pokeprism_nodebug.sym.temp -m pokeprism_nodebug.map -l contents/contents.link -p 0xff -o $@ ${prism_nodebug_obj}
	rgbfix -Cjv -i PRSM -k 01 -l 0x33 -m 0x10 -p 0xff -r 3 -t PM_PRISM $@
	sort pokeprism_nodebug.sym.temp >pokeprism_nodebug.sym
	rm pokeprism_nodebug.sym.temp

pokeprism.gbs: $(gbs_obj) contents/gbs.link
	rgbasm -DGBS ${BUILD_DATE_FLAG} -o audio_gbs.o audio.asm
	rgblink -o $@ -l contents/gbs.link ${gbs_obj} audio_gbs.o
	$(PYTHON) gbstrim.py $@

%.png: ;
%.2bpp: %.png ; $(gfx) 2bpp $<
%.1bpp: %.png ; $(gfx) 1bpp $<
%.lz: % ${LZ} ; $(LZ) $< $@
%.txt: ;
contents/bank_ends.txt: prism prism00 ; $(bank_ends) > $@

%.wav: ;
%.ded: %.wav dedenc.py ; $(PYTHON) dedenc.py $< $@

%.pal: %.2bpp ;
gfx/pics/%/normal.pal gfx/pics/%/bitmask.asm gfx/pics/%/frames.asm: gfx/pics/%/front.2bpp ;
%.bin: ;
%.blk: ;
%.tilemap: ;

%.ctf: %.asm macros/charmap.asm ${TEXTCOMP} ; ${TEXTCOMP} macros/charmap.asm $< $@
