From 18fea6f13905b2f692a75ad4c9b3762811249334 Mon Sep 17 00:00:00 2001 From: Moon Man Date: Sun, 26 Jan 2025 13:12:54 -0500 Subject: [PATCH] add a palette fade to black. --- Makefile | 8 ++++- sound/mozartsonata.mod | Bin 0 -> 57138 bytes source/main.c | 77 ++++++++++++++++++++++++++++++++++++----- 3 files changed, 76 insertions(+), 9 deletions(-) create mode 100644 sound/mozartsonata.mod diff --git a/Makefile b/Makefile index 5915c6f..22553bd 100644 --- a/Makefile +++ b/Makefile @@ -153,7 +153,13 @@ process-images: $(GRAPHICSFILES) # Rule for 8-bit images %_8.bin %_8.h: %.png @echo "Processing 8-bit image $<" - @magick $< -channel-fx "red=>blue,blue=>red" $(GENERATED)/$*_8.temp.png + @if [ "$$(magick identify -format '%k' $<)" -ne 256 ]; then \ + echo " Quantizing to 256 colors..."; \ + magick $< -colors 256 -depth 8 -type Palette $(GENERATED)/$*_8.temp.png; \ + else \ + echo " Already quantized, using as-is..."; \ + cp $< $(GENERATED)/$*_8.temp.png; \ + fi @grit $(GENERATED)/$*_8.temp.png -gb -gB8 -p -ftb -o $(GENERATED)/$*_8 @rm $(GENERATED)/$*_8.temp.png diff --git a/sound/mozartsonata.mod b/sound/mozartsonata.mod new file mode 100644 index 0000000000000000000000000000000000000000..f8f398735dff1402781e4b327924a256668fcfe3 GIT binary patch literal 57138 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 J;Eodb{{dUcFna(1 literal 0 HcmV?d00001 diff --git a/source/main.c b/source/main.c index 9444abf..b97c187 100644 --- a/source/main.c +++ b/source/main.c @@ -9,8 +9,8 @@ #include #include -#include "splash_8_img_bin.h" -#include "splash_8_pal_bin.h" +#include "together_8_img_bin.h" +#include "together_8_pal_bin.h" // Define any soundbank includes here #include "soundbank.h" @@ -19,9 +19,20 @@ // Global mixing buffer for maxmod u8 mixing_buffer[MM_MIXLEN_16KHZ] __attribute__((aligned(4))); +// Set the two variables below to start the palette fade + +// The number of steps to fade the palette to black +const u8 palette_fade_steps = 12; +// The current step of the palette fade, set this to above to start the fade, the fade will decrement this value until it reaches 0 +u8 palette_fade_step = 0; + +const u8 fade_pause_frames = 120; +u8 fade_pause_frame_count = 0; + // Function Prototypes void initializeSystem(void); void loadIntroScreen(void); +void fadePaletteStep(void); int main(void) { // Initialize GBA system and maxmod @@ -32,7 +43,7 @@ int main(void) { // Wait for VBlank before starting music VBlankIntrWait(); - mmStart(MOD_EYETIGER, MM_PLAY_LOOP); + mmStart(MOD_MOZARTSONATA, MM_PLAY_LOOP); // Main game loop while(1) { @@ -42,12 +53,24 @@ int main(void) { mmFrame(); // Game logic goes here - - // Wait for vertical blank scanKeys(); - if (keysDown() & KEY_A) { + u16 keys = keysDown(); + + // Check for key presses + if (keys & KEY_A) { mmEffect(SFX_WEAPON); } + + if ((keys & KEY_START) && palette_fade_step == 0) { + // Start the palette fade + palette_fade_step = palette_fade_steps; + } + else if (keys & KEY_SELECT) { + // Reset the palette to the original + DMA3COPY(together_8_pal_bin, BG_PALETTE, together_8_pal_bin_size >> 1); + } + + fadePaletteStep(); } return 0; @@ -71,9 +94,47 @@ void loadIntroScreen(void) { // Load the palette // Palette size needs to be in 16-bit units (divide by 2) - DMA3COPY(splash_8_pal_bin, BG_PALETTE, splash_8_pal_bin_size >> 1); + DMA3COPY(together_8_pal_bin, BG_PALETTE, together_8_pal_bin_size >> 1); // Copy image data to first frame buffer // Image size needs to be in 16-bit units (divide by 2) - DMA3COPY(splash_8_img_bin, (void*)VRAM, splash_8_img_bin_size >> 1); + DMA3COPY(together_8_img_bin, (void*)VRAM, together_8_img_bin_size >> 1); +} + +// increment the palette fade step by 1 +void fadePaletteStep(void) { + if (fade_pause_frame_count > fade_pause_frames) { + ++fade_pause_frame_count; + return; + } + fade_pause_frame_count = 0; + + if (palette_fade_steps && palette_fade_step) { + // Calculate how much to keep of each color component in this step + // As palette_fade_step goes from palette_fade_steps down to 1, + // this ratio goes from 1.0 down to nearly 0.0 + u16 keep_ratio = ((u16)palette_fade_step << 7) / (u16)palette_fade_steps; + + // fade the palette to black, by iterating over the palette memory one position at a time + for (u16 i = 0; i < 256; ++i) { + u16 color = ((u16*)together_8_pal_bin)[i]; + + // Extract RGB components (GBA uses 5 bits per component) + u16 r = (color & 0x1F); + u16 g = (color >> 5) & 0x1F; + u16 b = (color >> 10) & 0x1F; + + // Reduce each component based on current step + r = (r * keep_ratio) >> 7; + g = (g * keep_ratio) >> 7; + b = (b * keep_ratio) >> 7; + + // Recombine the components + u16 new_color = (b << 10) | (g << 5) | r; + + BG_PALETTE[i] = new_color; + } + + --palette_fade_step; + } } \ No newline at end of file