EarthBound/ASM/Palette Routines

From Data Crystal
Jump to navigation Jump to search

This is a sub-page of EarthBound/ASM.

$C0023F-$C0030E: Load map palette animation

First checks if the currently loaded map palette is animated, as indicated by a non-zero Palette Animation Index and a non-zero Animation Number of Palettes for that animation index, and sets the Animation Palette Active Flag accordingly in WRAM. If the palette is animated, loads Decompressed Map Animation Palettes, Animation Palette Frame Durations, Animation Palette Remaining Frames, and Animation Palette Number to WRAM.

$C0030F-$C0035A: Iterate map palette animation frame

Decrements Animation Palette Remaining Frames, and if zero, updates WRAM (Animation Palette Number and Animation Palette Remaining Frames) for the next animation palette and calls the subroutine at $C0A1F2 to load the next palette.

$C00391-$C00433: Calculate color averages for map palette

For the given map palette, averages out all the non-zero red values, all the non-zero green values, and all the non-zero blue values from all colors in all 6 subpalettes of the map palette. Stores the results to WRAM at $7E43D0, $7E43D2, and $7E43D4 respectively.

Inputs

  • accumulator: Map palette data pointer

$C00434-$C0047F: Cap palette color adjustment

For the given unadjusted and adjusted color values (single red, green, or blue value), determines a new adjusted color value that is at most 6 different from the unadjusted. Used by the subroutine at $C00480 to limit the difference made by sprite palette adjustements.

Inputs

  • accumulator: Original unadjusted color value (red, green, or blue)
  • x: Adjusted color value

Outputs

  • accumulator: Capped adjusted color value

$C00480-$C005E6: Adjust sprite palette colors for map palette

Adjusts all sprite palettes based on the color differences between the current map palette and the default map palette (Onett daytime palette).

Calculates color averages for the current map palette at $7E0240 using the subroutine at $C00391. Then compares the averages with the default map palette averages stored at $7E43D6, $7E43D8, and $7E43DA, and computes a comparison ratio using the formula ratio = current_color_average * 8 / default_color_average.

Then for every single color in the sprite palettes ($7E0300-$7E03FF), individually multiplies each of red, green, and blue by the comparison ratio for that color component (or if red, green, and blue components are all equal, multiplies them by the average of the comparison ratios) to calculate an adjusted color component. Finally caps the adjustment to each color component using the subroutine at $C00434, and writes the adjusted color components back to the sprite palette.

$C005E7-$C00629: Calculate color averages for default map palette

Calculates color averages for the default map palette (the Onett daytime palette). Loads the palette as the current map palette, calculates averages using the subroutine at $C00391, and then copies the red, green, and blue averages to $7E43D6, $7E43D8, and $7E43DA respectively.

$C00778-$C007B5: Load sprite replacement palette from map

If the current map palette's Sprite Palette Replacement Index is non-zero, replace sprite subpalette 3 (loaded into RAM at $7E0380-$7E039F) with the subpalette designated by the replacement index.

Used to bring a map subpalette into sprite subpalettes for the occasions where a map element needs to be created using sprites, e.g. to animate Lost Underworld geysers.

$C007B6-$C008C2: Load map palette

For the given tileset number and map palette number, loads the relevant map palette as the current map palette (in RAM at $7E0240-$7E02FF). Implemented by looking up the relevant palette location using the Map Palette Pointer Table and then doing a simple copy.

If the Alternate Palette Flag from the newly-loaded palette is non-zero, checks the relevant Flag, and on match, replaces the newly-loaded palette with the one found at the Alternate Palette Pointer of the newly-loaded palette. To allow chaining alternate palettes, this check repeats until the Alternate Palette Flag is zero or the relevant flag does not match.

If the End Credits Display Photos flag is non-zero, instead of loading the normal map palette, loads a palette for photo display. Decompresses all the photo display palettes from $E1374A-$E1413E to $7F0000. Then looks up the Current Photographer Photo in the Wandering Photographer Configuration Table to get the relevant pointer in the decompressed palettes, and loads that palette as the current map palette.

Inputs

  • accumulator: Tileset number
  • x: Map palette number

$C0A1F2-$C0A20B: Load map palette animation palette

Loads a palette from Decompressed Map Animation Palettes and replaces the current map palette.

Inputs

  • accumulator: Map animation palette number

$C47F87-$C4800A: Load text/window palette

First checks player data in RAM to determine if any characters are unconscious or diamondized. If so, loads the red text/window palette used in such situations as the current text/window palette.

Otherwise, loads the appropriate palette for the player-selected Current Window Flavor as the current text/window palette.

$C496F9-$C4973F: Copy current palettes

Copies all current text/window/map/sprite palettes (at $7E0200-$7E03FF) to $7F0000-$7F01FF.