# Paths for Windows (Unix-style for MSYS2/Git Bash compatibility)
DEVKITPRO := /d/Software/DevKitPro
DEVKITARM := /d/Software/DevKitPro/devkitARM

# Tools
CC = $(DEVKITARM)/bin/arm-none-eabi-gcc
OBJCOPY = $(DEVKITARM)/bin/arm-none-eabi-objcopy

# Directories
GFX_DIR := gfx
LEVELS_DIR := levels
BUILD_DIR := build
MUSIC_DIR := sound

# Source files
SRCS = main.c game.c graphics.c sound.c startscreen.c \
       $(wildcard $(GFX_DIR)/*.c)
OBJS = $(patsubst %.c,$(BUILD_DIR)/%.o,$(SRCS)) $(BUILD_DIR)/soundbank.o
OUT = $(BUILD_DIR)/game.gba
LIBS = -ltonc -lmm -lgba

# Compiler and linker flags
CFLAGS = -mthumb -mthumb-interwork -mcpu=arm7tdmi -fno-strict-aliasing \
         -I$(DEVKITPRO)/libtonc/include -I$(DEVKITPRO)/libmaxmod/include \
         -I$(DEVKITPRO)/libgba/include -I$(GFX_DIR) -I$(LEVELS_DIR)
LDFLAGS = -specs=gba.specs -L$(DEVKITPRO)/libtonc/lib -L$(DEVKITPRO)/libmaxmod/lib \
          -L$(DEVKITPRO)/libgba/lib -Wl,-Map=$(BUILD_DIR)/game.map

# Audio files
AUDIO_FILES = $(wildcard $(MUSIC_DIR)/*.mod) $(wildcard $(MUSIC_DIR)/*.wav)

# Targets
all: $(OUT)

# Ensure build directory exists
$(BUILD_DIR):
	mkdir -p $(BUILD_DIR)/$(GFX_DIR)

# Compile .c to .o
$(BUILD_DIR)/%.o: %.c | $(BUILD_DIR)
	$(CC) $(CFLAGS) -c $< -o $@

$(BUILD_DIR)/$(GFX_DIR)/%.o: $(GFX_DIR)/%.c | $(BUILD_DIR)
	$(CC) $(CFLAGS) -c $< -o $@

# Link objects to ELF
$(BUILD_DIR)/game.elf: $(OBJS)
	$(CC) $^ $(LDFLAGS) $(LIBS) -o $@

# Convert ELF to GBA binary
$(OUT): $(BUILD_DIR)/game.elf
	$(OBJCOPY) -O binary $< $@

# Generate soundbank.bin and soundbank.h in the root directory
soundbank.bin soundbank.h: $(AUDIO_FILES)
	$(DEVKITPRO)/tools/bin/mmutil $(AUDIO_FILES) -osoundbank.bin -hsoundbank.h

# Convert soundbank.bin to soundbank.o
$(BUILD_DIR)/soundbank.o: soundbank.bin
	$(OBJCOPY) -I binary -O elf32-littlearm --binary-architecture arm7tdmi \
	           --rename-section .data=.rodata,alloc,load,readonly,data,contents \
	           --redefine-sym _binary_soundbank_bin_start=soundbank_bin \
	           $< $@

# Clean up
clean:
	rm -rf $(BUILD_DIR) soundbank.bin soundbank.h

# Dependencies (simplified)
$(BUILD_DIR)/main.o: main.c game.h graphics.h sound.h startscreen.h $(GFX_DIR)/bg_lab.h $(GFX_DIR)/bg_menu.h $(GFX_DIR)/sprites_global.h \
                     $(GFX_DIR)/sprites_lab.h $(GFX_DIR)/sprites_ice.h $(GFX_DIR)/sprites_cave.h $(GFX_DIR)/sprites_city.h \
                     $(GFX_DIR)/sprites_mansion.h $(GFX_DIR)/sprites_powerp.h $(GFX_DIR)/sprites_woods.h $(GFX_DIR)/sprites_special1.h \
                     $(GFX_DIR)/sprites_special2.h $(GFX_DIR)/endscreen.h soundbank.h $(GFX_DIR)/world_lab.h $(GFX_DIR)/world_ice.h \
                     $(GFX_DIR)/world_cave.h $(GFX_DIR)/world_city.h $(GFX_DIR)/world_mansion.h $(GFX_DIR)/world_powerp.h \
                     $(GFX_DIR)/world_woods.h $(GFX_DIR)/world_special1.h $(GFX_DIR)/world_special2.h
$(BUILD_DIR)/game.o: game.c game.h $(wildcard $(LEVELS_DIR)/*.h)
$(BUILD_DIR)/graphics.o: graphics.c graphics.h game.h $(GFX_DIR)/bg_lab.h $(GFX_DIR)/bg_ice.h $(GFX_DIR)/bg_cave.h $(GFX_DIR)/bg_city.h \
                         $(GFX_DIR)/bg_mansion.h $(GFX_DIR)/bg_powerp.h $(GFX_DIR)/bg_woods.h $(GFX_DIR)/bg_special1.h \
                         $(GFX_DIR)/bg_special2.h $(GFX_DIR)/sprites_global.h $(GFX_DIR)/sprites_lab.h $(GFX_DIR)/sprites_ice.h \
                         $(GFX_DIR)/sprites_cave.h $(GFX_DIR)/sprites_city.h $(GFX_DIR)/sprites_mansion.h $(GFX_DIR)/sprites_powerp.h \
                         $(GFX_DIR)/sprites_woods.h $(GFX_DIR)/sprites_special1.h $(GFX_DIR)/sprites_special2.h
$(BUILD_DIR)/sound.o: sound.c sound.h game.h soundbank.h
$(BUILD_DIR)/startscreen.o: startscreen.c startscreen.h game.h graphics.h sound.h $(GFX_DIR)/world_lab.h

.PHONY: all clean