diff options
Diffstat (limited to 'src/engine/gfx')
-rw-r--r-- | src/engine/gfx/color.asm | 536 | ||||
-rw-r--r-- | src/engine/gfx/default_palettes.asm | 33 | ||||
-rw-r--r-- | src/engine/gfx/palettes.asm | 170 | ||||
-rw-r--r-- | src/engine/gfx/sprite_animations.asm | 828 |
4 files changed, 1173 insertions, 394 deletions
diff --git a/src/engine/gfx/color.asm b/src/engine/gfx/color.asm new file mode 100644 index 0000000..db75861 --- /dev/null +++ b/src/engine/gfx/color.asm @@ -0,0 +1,536 @@ +; writes wd293 with byte depending on console +; every entry in the list is $00 +Func_10a9b: + push hl + ld a, [wConsole] + add LOW(.data_10ab1) + ld l, a + ld a, HIGH(.data_10ab1) + adc 0 + ld h, a + ld a, [hl] + ld [wd293], a + xor a + ld [wd317], a + pop hl + ret + +.data_10ab1 + db $00 ; CONSOLE_DMG + db $00 ; CONSOLE_SGB + db $00 ; CONSOLE_CGB + +FadeScreenToWhite: + ld a, [wLCDC] + bit LCDC_ENABLE_F, a + jr z, .lcd_off + ld a, [wd293] + ld [wTempBGP], a + ld [wTempOBP0], a + ld [wTempOBP1], a + ld de, PALRGB_WHITE + ld hl, wTempBackgroundPalettesCGB + ld bc, NUM_BACKGROUND_PALETTES palettes + call FillMemoryWithDE + call RestoreFirstColorInOBPals + call FadeScreenToTempPals + call DisableLCD + ret + +.lcd_off + ld a, [wd293] + ld [wBGP], a + ld [wOBP0], a + ld [wOBP1], a + ld de, PALRGB_WHITE + ld hl, wBackgroundPalettesCGB + ld bc, NUM_BACKGROUND_PALETTES palettes + call FillMemoryWithDE + call FlushAllPalettes + ret + +FadeScreenFromWhite: + call .BackupPalsAndSetWhite + call RestoreFirstColorInOBPals + call FlushAllPalettes + call EnableLCD + jp FadeScreenToTempPals + +.BackupPalsAndSetWhite + ld a, [wBGP] + ld [wTempBGP], a + ld a, [wOBP0] + ld [wTempOBP0], a + ld a, [wOBP1] + ld [wTempOBP1], a + ld hl, wBackgroundPalettesCGB + ld de, wTempBackgroundPalettesCGB + ld bc, NUM_BACKGROUND_PALETTES palettes + NUM_OBJECT_PALETTES palettes + call CopyDataHLtoDE_SaveRegisters + jr SetWhitePalettes ; can be fallthrough + +; fills wBackgroundPalettesCGB with white pal +SetWhitePalettes: + ld a, [wd293] + ld [wBGP], a + ld [wOBP0], a + ld [wOBP1], a + ld de, PALRGB_WHITE + ld hl, wBackgroundPalettesCGB + ld bc, NUM_BACKGROUND_PALETTES palettes + call FillMemoryWithDE + ret + +; gets from backup OB pals the first color +; of each pal and writes them in wObjectPalettesCGB +RestoreFirstColorInOBPals: + ld hl, wTempObjectPalettesCGB + ld de, wObjectPalettesCGB + ld c, NUM_OBJECT_PALETTES +.loop_pals + push bc + ld a, [hli] + ld [de], a + inc de + ld a, [hl] + ld [de], a + ld bc, CGB_PAL_SIZE - 1 + add hl, bc + ld a, c + add e + ld e, a + ld a, b + adc d + ld d, a + pop bc + dec c + jr nz, .loop_pals + ret + +FadeScreenToTempPals: + ld a, [wVBlankCounter] + push af + ld c, $10 +.loop + push bc + ld a, c + and %11 + cp 0 + call z, Func_10b85 + call FadeBGPalIntoTemp3 + call FadeOBPalIntoTemp + call FlushAllPalettes + call DoFrameIfLCDEnabled + pop bc + dec c + dec c + jr nz, .loop + pop af + ld b, a + ld a, [wVBlankCounter] + sub b + ret + +; does something with wBGP given wTempBGP +; mixes them into a single value? +Func_10b85: + push bc + ld c, $03 + ld hl, wBGP + ld de, wTempBGP +.asm_10b8e + push bc + ld b, [hl] + ld a, [de] + ld c, a + call .Func_10b9e + ld [hl], a + pop bc + inc de + inc hl + dec c + jr nz, .asm_10b8e + pop bc + ret + +.Func_10b9e + push bc + push de + ld e, 4 + ld d, $00 +.loop + call .Func_10bba + or d + rlca + rlca + ld d, a + rlc b + rlc b + rlc c + rlc c + dec e + jr nz, .loop + ld a, d + pop de + pop bc + ret + +; calculates ((b & %11) << 2) | (c & %11) +; that is, %0000xxyy, where x and y are +; the 2 lower bits of b and c respectively +; and outputs the entry from a table given that value +.Func_10bba + push hl + push bc + ld a, %11 + and b + add a + add a + ld b, a + ld a, %11 + and c + or b + ld c, a + ld b, $00 + ld hl, .data_10bd1 + add hl, bc + ld a, [hl] + pop bc + pop hl + ret + +.data_10bd1 + db %00 ; b = %00 | c = %00 + db %01 ; b = %00 | c = %01 + db %01 ; b = %00 | c = %10 + db %01 ; b = %00 | c = %11 + db %00 ; b = %01 | c = %00 + db %01 ; b = %01 | c = %01 + db %10 ; b = %01 | c = %10 + db %10 ; b = %01 | c = %11 + db %01 ; b = %10 | c = %00 + db %01 ; b = %10 | c = %01 + db %10 ; b = %10 | c = %10 + db %11 ; b = %10 | c = %11 + db %10 ; b = %11 | c = %00 + db %10 ; b = %11 | c = %01 + db %10 ; b = %11 | c = %10 + db %11 ; b = %11 | c = %11 + +FadeOBPalIntoTemp: + push bc + ld c, 4 palettes + ld hl, wObjectPalettesCGB + ld de, wTempObjectPalettesCGB + jr FadePalIntoAnother + +FadeBGPalIntoTemp1: + push bc + ld c, 2 palettes + ld hl, wBackgroundPalettesCGB + ld de, wTempBackgroundPalettesCGB + jr FadePalIntoAnother + +FadeBGPalIntoTemp2: + push bc + ld c, 2 palettes + ld hl, wBackgroundPalettesCGB + 4 palettes + ld de, wTempBackgroundPalettesCGB + 4 palettes + jr FadePalIntoAnother + +FadeBGPalIntoTemp3: + push bc + ld c, 4 palettes + ld hl, wBackgroundPalettesCGB + ld de, wTempBackgroundPalettesCGB +; fallthrough + +; hl = input pal to modify +; de = pal to fade into +; c = number of colors to fade +FadePalIntoAnother: + push bc + ld a, [de] + inc de + ld c, a + ld a, [de] + inc de + ld b, a + push de + push bc + ld c, [hl] + inc hl + ld b, [hl] + pop de + call .GetFadedColor + ; overwrite with new color + ld [hld], a + ld [hl], c + inc hl + inc hl + pop de + pop bc + dec c + jr nz, FadePalIntoAnother + pop bc + ret + +; fade pal bc to de +; output resulting pal in a and c +.GetFadedColor + push hl + ld a, c + cp e + jr nz, .unequal + ld a, b + cp d + jr z, .skip + +.unequal + ; red + ld a, e + and %11111 + ld l, a + ld a, c + and %11111 + call .FadeColor + ldh [hffb6], a + + ; green + ld a, e + and %11100000 + ld l, a + ld a, d + and %11 + or l + swap a + rrca + ld l, a + ld a, c + and %11100000 + ld h, a + ld a, b + and %11 + or h + swap a + rrca + call .FadeColor + rlca + swap a + ld h, a + and %11 + ldh [hffb7], a + ld a, %11100000 + and h + ld h, a + ldh a, [hffb6] + or h + ld h, a + + ; blue + ld a, d + and %1111100 + rrca + rrca + ld l, a + ld a, b + and %1111100 + rrca + rrca + call .FadeColor + rlca + rlca + ld b, a + ldh a, [hffb7] + or b + ld c, h +.skip + pop hl + ret + +; compares color in a and in l +; if a is smaller/greater than l, then +; increase/decrease its value up to l +; up to a maximum of 4 +; a = pal color (red, green or blue) +; l = pal color (red, green or blue) +.FadeColor + cp l + ret z ; same value + jr c, .incr_a +; decr a + dec a + cp l + ret z + dec a + cp l + ret z + dec a + cp l + ret z + dec a + ret + +.incr_a + inc a + cp l + ret z + inc a + cp l + ret z + inc a + cp l + ret z + inc a + ret + +; fades screen to white then +; if c == 0, fade back in +; keep white otherwise +FlashScreenToWhite: + ldh a, [hBankSRAM] + push af + push bc + ld a, BANK("SRAM1") + call BankswitchSRAM + call CopyPalsToSRAMBuffer + call FadeScreenToWhite + pop bc + ld a, c + or a + jr nz, .skip_fade_in + call LoadPalsFromSRAMBuffer + call FadeScreenFromWhite +.skip_fade_in + call EnableLCD + pop af + call BankswitchSRAM + call DisableSRAM + ret + +; copies current BG and OP pals, +; wBackgroundPalettesCGB and wObjectPalettesCGB +; to sGfxBuffer2 +CopyPalsToSRAMBuffer: + ldh a, [hBankSRAM] + + push af + cp BANK("SRAM1") + jr z, .ok + debug_nop +.ok + ld a, BANK("SRAM1") + call BankswitchSRAM + ld hl, sGfxBuffer2 + ld a, [wBGP] + ld [hli], a + ld a, [wOBP0] + ld [hli], a + ld a, [wOBP1] + ld [hli], a + ld e, l + ld d, h + ld hl, wBackgroundPalettesCGB + ld bc, NUM_BACKGROUND_PALETTES palettes + NUM_OBJECT_PALETTES palettes + call CopyDataHLtoDE_SaveRegisters + pop af + + call BankswitchSRAM + call DisableSRAM + ret + +; loads BG and OP pals, +; wBackgroundPalettesCGB and wObjectPalettesCGB +; from sGfxBuffer2 +LoadPalsFromSRAMBuffer: + ldh a, [hBankSRAM] + + push af + cp BANK("SRAM1") + jr z, .ok + debug_nop +.ok + ld a, BANK("SRAM1") + call BankswitchSRAM + ld hl, sGfxBuffer2 + ld a, [hli] + ld [wBGP], a + ld a, [hli] + ld [wOBP0], a + ld a, [hli] + ld [wOBP1], a + ld de, wBackgroundPalettesCGB + ld bc, NUM_BACKGROUND_PALETTES palettes + NUM_OBJECT_PALETTES palettes + call CopyDataHLtoDE_SaveRegisters + pop af + + call BankswitchSRAM + call DisableSRAM + ret + +; backs up all palettes +; and writes 4 BG pals with white pal +Func_10d17: + ld a, [wBGP] + ld [wTempBGP], a + ld a, [wOBP0] + ld [wTempOBP0], a + ld a, [wOBP1] + ld [wTempOBP1], a + ld hl, wBackgroundPalettesCGB + ld de, wTempBackgroundPalettesCGB + ld bc, NUM_BACKGROUND_PALETTES palettes + NUM_OBJECT_PALETTES palettes + call CopyDataHLtoDE_SaveRegisters + + ld a, [wd293] + ld [wBGP], a + ld de, PALRGB_WHITE + ld hl, wBackgroundPalettesCGB + ld bc, 4 palettes + call FillMemoryWithDE + call FlushAllPalettes + + ld a, $10 + ld [wd317], a + ret + +Func_10d50: + ld a, [wd293] + ld [wTempBGP], a + ld a, [wOBP0] + ld [wTempOBP0], a + ld a, [wOBP1] + ld [wTempOBP1], a + ld de, PALRGB_WHITE + ld hl, wTempBackgroundPalettesCGB + ld bc, 4 palettes + call FillMemoryWithDE + ld a, $10 + ld [wd317], a + ret + +; does stuff according to bottom 2 bits from wd317: +; - if equal to %01, modify wBGP +; - if bottom bit not set, fade BG pals 0 and 1 +; - if bottom bit is set, fade BG pals 4 and 5 +; and Flush Palettes +; then decrements wd317 +; does nothing if wd317 is 0 +Func_10d74: + ld a, [wd317] + or a + ret z + and %11 + ld c, a + cp $1 + call z, Func_10b85 + bit 0, c + call z, FadeBGPalIntoTemp1 + bit 0, c + call nz, FadeBGPalIntoTemp2 + bit 0, c + call nz, FlushAllPalettes + ld a, [wd317] + dec a + ld [wd317], a + ret diff --git a/src/engine/gfx/default_palettes.asm b/src/engine/gfx/default_palettes.asm new file mode 100644 index 0000000..f479997 --- /dev/null +++ b/src/engine/gfx/default_palettes.asm @@ -0,0 +1,33 @@ +Func_12871: + call ZeroObjectPositions + ld a, $01 + ld [wVBlankOAMCopyToggle], a + call Set_OBJ_8x8 + call SetDefaultPalettes + xor a + ldh [hSCX], a + ldh [hSCY], a + ldh [hWX], a + ldh [hWY], a + call SetWindowOff + ret + +; same as SetDefaultConsolePalettes +; but forces all wBGP, wOBP0 and wOBP1 +; to be the default +SetDefaultPalettes: + push hl + push bc + push de + ld a, %11100100 + ld [wBGP], a + ld [wOBP0], a + ld [wOBP1], a + ld a, 4 + ld [wTextBoxFrameType], a + bank1call SetDefaultConsolePalettes + call FlushAllPalettes + pop de + pop bc + pop hl + ret diff --git a/src/engine/gfx/palettes.asm b/src/engine/gfx/palettes.asm deleted file mode 100644 index 8a0d71a..0000000 --- a/src/engine/gfx/palettes.asm +++ /dev/null @@ -1,170 +0,0 @@ -; \1 = palette pointer -; \2 = number of palettes -; \3 = number of OBJ colors -palette_pointer: MACRO - dwb \1, BANK(\1) - BANK(Palettes) - db (\2 << 4) + \3 -ENDM - -Palettes: - palette_pointer Palette0, 8, 1 ; PALETTE_0 - palette_pointer Palette1, 8, 0 ; PALETTE_1 - palette_pointer Palette2, 8, 0 ; PALETTE_2 - palette_pointer Palette3, 8, 0 ; PALETTE_3 - palette_pointer Palette4, 8, 0 ; PALETTE_4 - palette_pointer Palette5, 8, 0 ; PALETTE_5 - palette_pointer Palette6, 8, 0 ; PALETTE_6 - palette_pointer Palette7, 8, 0 ; PALETTE_7 - palette_pointer Palette8, 8, 0 ; PALETTE_8 - palette_pointer Palette9, 8, 0 ; PALETTE_9 - palette_pointer Palette10, 8, 0 ; PALETTE_10 - palette_pointer Palette11, 8, 0 ; PALETTE_11 - palette_pointer Palette12, 8, 0 ; PALETTE_12 - palette_pointer Palette13, 8, 0 ; PALETTE_13 - palette_pointer Palette14, 8, 0 ; PALETTE_14 - palette_pointer Palette15, 8, 0 ; PALETTE_15 - palette_pointer Palette16, 8, 0 ; PALETTE_16 - palette_pointer Palette17, 8, 0 ; PALETTE_17 - palette_pointer Palette18, 8, 0 ; PALETTE_18 - palette_pointer Palette19, 8, 0 ; PALETTE_19 - palette_pointer Palette20, 8, 0 ; PALETTE_20 - palette_pointer Palette21, 8, 0 ; PALETTE_21 - palette_pointer Palette22, 8, 0 ; PALETTE_22 - palette_pointer Palette23, 8, 0 ; PALETTE_23 - palette_pointer Palette24, 8, 0 ; PALETTE_24 - palette_pointer Palette25, 8, 0 ; PALETTE_25 - palette_pointer Palette26, 8, 0 ; PALETTE_26 - palette_pointer Palette27, 8, 0 ; PALETTE_27 - palette_pointer Palette28, 8, 0 ; PALETTE_28 - palette_pointer Palette29, 8, 2 ; PALETTE_29 - palette_pointer Palette30, 8, 2 ; PALETTE_30 - palette_pointer Palette31, 1, 1 ; PALETTE_31 - palette_pointer Palette32, 1, 1 ; PALETTE_32 - palette_pointer Palette33, 1, 1 ; PALETTE_33 - palette_pointer Palette34, 1, 1 ; PALETTE_34 - palette_pointer Palette35, 1, 1 ; PALETTE_35 - palette_pointer Palette36, 1, 1 ; PALETTE_36 - palette_pointer Palette37, 1, 1 ; PALETTE_37 - palette_pointer Palette38, 1, 1 ; PALETTE_38 - palette_pointer Palette39, 1, 1 ; PALETTE_39 - palette_pointer Palette40, 1, 1 ; PALETTE_40 - palette_pointer Palette41, 1, 1 ; PALETTE_41 - palette_pointer Palette42, 1, 1 ; PALETTE_42 - palette_pointer Palette43, 1, 1 ; PALETTE_43 - palette_pointer Palette44, 1, 1 ; PALETTE_44 - palette_pointer Palette45, 1, 1 ; PALETTE_45 - palette_pointer Palette46, 1, 1 ; PALETTE_46 - palette_pointer Palette47, 1, 1 ; PALETTE_47 - palette_pointer Palette48, 1, 1 ; PALETTE_48 - palette_pointer Palette49, 1, 1 ; PALETTE_49 - palette_pointer Palette50, 1, 1 ; PALETTE_50 - palette_pointer Palette51, 1, 1 ; PALETTE_51 - palette_pointer Palette52, 1, 1 ; PALETTE_52 - palette_pointer Palette53, 1, 1 ; PALETTE_53 - palette_pointer Palette54, 1, 1 ; PALETTE_54 - palette_pointer Palette55, 1, 1 ; PALETTE_55 - palette_pointer Palette56, 1, 1 ; PALETTE_56 - palette_pointer Palette57, 1, 1 ; PALETTE_57 - palette_pointer Palette58, 1, 1 ; PALETTE_58 - palette_pointer Palette59, 1, 1 ; PALETTE_59 - palette_pointer Palette60, 1, 1 ; PALETTE_60 - palette_pointer Palette61, 1, 1 ; PALETTE_61 - palette_pointer Palette62, 1, 1 ; PALETTE_62 - palette_pointer Palette63, 1, 1 ; PALETTE_63 - palette_pointer Palette64, 1, 1 ; PALETTE_64 - palette_pointer Palette65, 1, 1 ; PALETTE_65 - palette_pointer Palette66, 1, 1 ; PALETTE_66 - palette_pointer Palette67, 1, 1 ; PALETTE_67 - palette_pointer Palette68, 1, 1 ; PALETTE_68 - palette_pointer Palette69, 1, 1 ; PALETTE_69 - palette_pointer Palette70, 1, 1 ; PALETTE_70 - palette_pointer Palette71, 1, 1 ; PALETTE_71 - palette_pointer Palette72, 1, 1 ; PALETTE_72 - palette_pointer Palette73, 1, 1 ; PALETTE_73 - palette_pointer Palette74, 1, 1 ; PALETTE_74 - palette_pointer Palette75, 1, 1 ; PALETTE_75 - palette_pointer Palette76, 1, 1 ; PALETTE_76 - palette_pointer Palette77, 1, 1 ; PALETTE_77 - palette_pointer Palette78, 1, 1 ; PALETTE_78 - palette_pointer Palette79, 1, 1 ; PALETTE_79 - palette_pointer Palette80, 1, 1 ; PALETTE_80 - palette_pointer Palette81, 1, 1 ; PALETTE_81 - palette_pointer Palette82, 1, 1 ; PALETTE_82 - palette_pointer Palette83, 1, 1 ; PALETTE_83 - palette_pointer Palette84, 1, 1 ; PALETTE_84 - palette_pointer Palette85, 1, 1 ; PALETTE_85 - palette_pointer Palette86, 1, 1 ; PALETTE_86 - palette_pointer Palette87, 1, 1 ; PALETTE_87 - palette_pointer Palette88, 1, 1 ; PALETTE_88 - palette_pointer Palette89, 1, 1 ; PALETTE_89 - palette_pointer Palette90, 1, 1 ; PALETTE_90 - palette_pointer Palette91, 1, 1 ; PALETTE_91 - palette_pointer Palette92, 1, 1 ; PALETTE_92 - palette_pointer Palette93, 1, 1 ; PALETTE_93 - palette_pointer Palette94, 8, 0 ; PALETTE_94 - palette_pointer Palette95, 8, 0 ; PALETTE_95 - palette_pointer Palette96, 8, 0 ; PALETTE_96 - palette_pointer Palette97, 8, 0 ; PALETTE_97 - palette_pointer Palette98, 8, 0 ; PALETTE_98 - palette_pointer Palette99, 8, 0 ; PALETTE_99 - palette_pointer Palette100, 8, 0 ; PALETTE_100 - palette_pointer Palette101, 7, 0 ; PALETTE_101 - palette_pointer Palette102, 7, 0 ; PALETTE_102 - palette_pointer Palette103, 7, 0 ; PALETTE_103 - palette_pointer Palette104, 7, 0 ; PALETTE_104 - palette_pointer Palette105, 7, 0 ; PALETTE_105 - palette_pointer Palette106, 7, 0 ; PALETTE_106 - palette_pointer Palette107, 7, 0 ; PALETTE_107 - palette_pointer Palette108, 0, 1 ; PALETTE_108 - palette_pointer Palette109, 0, 1 ; PALETTE_109 - palette_pointer Palette110, 0, 0 ; PALETTE_110 - palette_pointer Palette111, 8, 1 ; PALETTE_111 - palette_pointer Palette112, 8, 1 ; PALETTE_112 - palette_pointer Palette113, 8, 1 ; PALETTE_113 - palette_pointer Palette114, 4, 2 ; PALETTE_114 - palette_pointer Palette115, 4, 2 ; PALETTE_115 - palette_pointer Palette116, 4, 2 ; PALETTE_116 - palette_pointer Palette117, 1, 0 ; PALETTE_117 - palette_pointer Palette118, 6, 0 ; PALETTE_118 - palette_pointer Palette119, 1, 0 ; PALETTE_119 - palette_pointer Palette120, 1, 0 ; PALETTE_120 - palette_pointer Palette121, 1, 0 ; PALETTE_121 - palette_pointer Palette122, 1, 0 ; PALETTE_122 - palette_pointer Palette123, 1, 0 ; PALETTE_123 - palette_pointer Palette124, 1, 0 ; PALETTE_124 - palette_pointer Palette125, 1, 0 ; PALETTE_125 - palette_pointer Palette126, 1, 0 ; PALETTE_126 - palette_pointer Palette127, 1, 0 ; PALETTE_127 - palette_pointer Palette128, 1, 0 ; PALETTE_128 - palette_pointer Palette129, 1, 0 ; PALETTE_129 - palette_pointer Palette130, 1, 0 ; PALETTE_130 - palette_pointer Palette131, 1, 0 ; PALETTE_131 - palette_pointer Palette132, 1, 0 ; PALETTE_132 - palette_pointer Palette133, 1, 0 ; PALETTE_133 - palette_pointer Palette134, 1, 0 ; PALETTE_134 - palette_pointer Palette135, 1, 0 ; PALETTE_135 - palette_pointer Palette136, 1, 0 ; PALETTE_136 - palette_pointer Palette137, 1, 0 ; PALETTE_137 - palette_pointer Palette138, 1, 0 ; PALETTE_138 - palette_pointer Palette139, 1, 0 ; PALETTE_139 - palette_pointer Palette140, 1, 0 ; PALETTE_140 - palette_pointer Palette141, 1, 0 ; PALETTE_141 - palette_pointer Palette142, 1, 0 ; PALETTE_142 - palette_pointer Palette143, 1, 0 ; PALETTE_143 - palette_pointer Palette144, 1, 0 ; PALETTE_144 - palette_pointer Palette145, 1, 0 ; PALETTE_145 - palette_pointer Palette146, 1, 0 ; PALETTE_146 - palette_pointer Palette147, 1, 0 ; PALETTE_147 - palette_pointer Palette148, 1, 0 ; PALETTE_148 - palette_pointer Palette149, 1, 0 ; PALETTE_149 - palette_pointer Palette150, 1, 0 ; PALETTE_150 - palette_pointer Palette151, 1, 0 ; PALETTE_151 - palette_pointer Palette152, 1, 0 ; PALETTE_152 - palette_pointer Palette153, 1, 0 ; PALETTE_153 - palette_pointer Palette154, 1, 0 ; PALETTE_154 - palette_pointer Palette155, 1, 0 ; PALETTE_155 - palette_pointer Palette156, 1, 0 ; PALETTE_156 - palette_pointer Palette157, 1, 0 ; PALETTE_157 - palette_pointer Palette158, 1, 0 ; PALETTE_158 - palette_pointer Palette159, 1, 0 ; PALETTE_159 - palette_pointer Palette160, 1, 0 ; PALETTE_160 diff --git a/src/engine/gfx/sprite_animations.asm b/src/engine/gfx/sprite_animations.asm index 7c432c6..51e2a3a 100644 --- a/src/engine/gfx/sprite_animations.asm +++ b/src/engine/gfx/sprite_animations.asm @@ -1,224 +1,604 @@ -; \1 = anim data pointer -anim_data_pointer: MACRO - dwb \1, BANK(\1) - BANK(SpriteAnimations) - db $00 ; unused (padding?) -ENDM - -SpriteAnimations: - anim_data_pointer AnimData0 ; SPRITE_ANIM_LIGHT_NPC_UP - anim_data_pointer AnimData1 ; SPRITE_ANIM_LIGHT_NPC_RIGHT - anim_data_pointer AnimData2 ; SPRITE_ANIM_LIGHT_NPC_DOWN - anim_data_pointer AnimData3 ; SPRITE_ANIM_LIGHT_NPC_LEFT - anim_data_pointer AnimData4 ; SPRITE_ANIM_DARK_NPC_UP - anim_data_pointer AnimData5 ; SPRITE_ANIM_DARK_NPC_RIGHT - anim_data_pointer AnimData6 ; SPRITE_ANIM_DARK_NPC_DOWN - anim_data_pointer AnimData7 ; SPRITE_ANIM_DARK_NPC_LEFT - anim_data_pointer AnimData8 ; SPRITE_ANIM_SGB_AMY_LAYING - anim_data_pointer AnimData9 ; SPRITE_ANIM_SGB_AMY_STAND - anim_data_pointer AnimData10 ; SPRITE_ANIM_SGB_CLERK_NPC_UP - anim_data_pointer AnimData11 ; SPRITE_ANIM_SGB_CLERK_NPC_RIGHT - anim_data_pointer AnimData12 ; SPRITE_ANIM_SGB_CLERK_NPC_DOWN - anim_data_pointer AnimData13 ; SPRITE_ANIM_SGB_CLERK_NPC_LEFT - anim_data_pointer AnimData14 ; SPRITE_ANIM_BLUE_NPC_UP - anim_data_pointer AnimData15 ; SPRITE_ANIM_BLUE_NPC_RIGHT - anim_data_pointer AnimData16 ; SPRITE_ANIM_BLUE_NPC_DOWN - anim_data_pointer AnimData17 ; SPRITE_ANIM_BLUE_NPC_LEFT - anim_data_pointer AnimData18 ; SPRITE_ANIM_PINK_NPC_UP - anim_data_pointer AnimData19 ; SPRITE_ANIM_PINK_NPC_RIGHT - anim_data_pointer AnimData20 ; SPRITE_ANIM_PINK_NPC_DOWN - anim_data_pointer AnimData21 ; SPRITE_ANIM_PINK_NPC_LEFT - anim_data_pointer AnimData22 ; SPRITE_ANIM_YELLOW_NPC_UP - anim_data_pointer AnimData23 ; SPRITE_ANIM_YELLOW_NPC_RIGHT - anim_data_pointer AnimData24 ; SPRITE_ANIM_YELLOW_NPC_DOWN - anim_data_pointer AnimData25 ; SPRITE_ANIM_YELLOW_NPC_LEFT - anim_data_pointer AnimData26 ; SPRITE_ANIM_GREEN_NPC_UP - anim_data_pointer AnimData27 ; SPRITE_ANIM_GREEN_NPC_RIGHT - anim_data_pointer AnimData28 ; SPRITE_ANIM_GREEN_NPC_DOWN - anim_data_pointer AnimData29 ; SPRITE_ANIM_GREEN_NPC_LEFT - anim_data_pointer AnimData30 ; SPRITE_ANIM_RED_NPC_UP - anim_data_pointer AnimData31 ; SPRITE_ANIM_RED_NPC_RIGHT - anim_data_pointer AnimData32 ; SPRITE_ANIM_RED_NPC_DOWN - anim_data_pointer AnimData33 ; SPRITE_ANIM_RED_NPC_LEFT - anim_data_pointer AnimData34 ; SPRITE_ANIM_PURPLE_NPC_UP - anim_data_pointer AnimData35 ; SPRITE_ANIM_PURPLE_NPC_RIGHT - anim_data_pointer AnimData36 ; SPRITE_ANIM_PURPLE_NPC_DOWN - anim_data_pointer AnimData37 ; SPRITE_ANIM_PURPLE_NPC_LEFT - anim_data_pointer AnimData38 ; SPRITE_ANIM_WHITE_NPC_UP - anim_data_pointer AnimData39 ; SPRITE_ANIM_WHITE_NPC_RIGHT - anim_data_pointer AnimData40 ; SPRITE_ANIM_WHITE_NPC_DOWN - anim_data_pointer AnimData41 ; SPRITE_ANIM_WHITE_NPC_LEFT - anim_data_pointer AnimData42 ; SPRITE_ANIM_INDIGO_NPC_UP - anim_data_pointer AnimData43 ; SPRITE_ANIM_INDIGO_NPC_RIGHT - anim_data_pointer AnimData44 ; SPRITE_ANIM_INDIGO_NPC_DOWN - anim_data_pointer AnimData45 ; SPRITE_ANIM_INDIGO_NPC_LEFT - anim_data_pointer AnimData46 ; SPRITE_ANIM_CGB_AMY_LAYING - anim_data_pointer AnimData47 ; SPRITE_ANIM_CGB_AMY_STAND - anim_data_pointer AnimData48 ; SPRITE_ANIM_CGB_CLERK_NPC_UP - anim_data_pointer AnimData49 ; SPRITE_ANIM_CGB_CLERK_NPC_RIGHT - anim_data_pointer AnimData50 ; SPRITE_ANIM_CGB_CLERK_NPC_DOWN - anim_data_pointer AnimData51 ; SPRITE_ANIM_CGB_CLERK_NPC_LEFT - anim_data_pointer AnimData52 ; SPRITE_ANIM_SGB_VOLCANO_SMOKE - anim_data_pointer AnimData53 ; SPRITE_ANIM_SGB_OWMAP_CURSOR - anim_data_pointer AnimData54 ; SPRITE_ANIM_SGB_OWMAP_CURSOR_FAST - anim_data_pointer AnimData55 ; SPRITE_ANIM_CGB_VOLCANO_SMOKE - anim_data_pointer AnimData56 ; SPRITE_ANIM_CGB_OWMAP_CURSOR - anim_data_pointer AnimData57 ; SPRITE_ANIM_CGB_OWMAP_CURSOR_FAST - anim_data_pointer AnimData58 ; SPRITE_ANIM_TORCH - anim_data_pointer AnimData59 ; SPRITE_ANIM_SGB_CARD_TOP_LEFT - anim_data_pointer AnimData60 ; SPRITE_ANIM_SGB_CARD_TOP_RIGHT - anim_data_pointer AnimData61 ; SPRITE_ANIM_SGB_CARD_LEFT_SPARK - anim_data_pointer AnimData62 ; SPRITE_ANIM_SGB_CARD_BOTTOM_LEFT - anim_data_pointer AnimData63 ; SPRITE_ANIM_SGB_CARD_BOTTOM_RIGHT - anim_data_pointer AnimData64 ; SPRITE_ANIM_SGB_CARD_RIGHT_SPARK - anim_data_pointer AnimData65 ; SPRITE_ANIM_CGB_CARD_TOP_LEFT - anim_data_pointer AnimData66 ; SPRITE_ANIM_CGB_CARD_TOP_RIGHT - anim_data_pointer AnimData67 ; SPRITE_ANIM_CGB_CARD_LEFT_SPARK - anim_data_pointer AnimData68 ; SPRITE_ANIM_CGB_CARD_BOTTOM_LEFT - anim_data_pointer AnimData69 ; SPRITE_ANIM_CGB_CARD_BOTTOM_RIGHT - anim_data_pointer AnimData70 ; SPRITE_ANIM_CGB_CARD_RIGHT_SPARK - anim_data_pointer AnimData71 ; SPRITE_ANIM_71 - anim_data_pointer AnimData72 ; SPRITE_ANIM_72 - anim_data_pointer AnimData73 ; SPRITE_ANIM_73 - anim_data_pointer AnimData74 ; SPRITE_ANIM_74 - anim_data_pointer AnimData75 ; SPRITE_ANIM_75 - anim_data_pointer AnimData76 ; SPRITE_ANIM_76 - anim_data_pointer AnimData77 ; SPRITE_ANIM_77 - anim_data_pointer AnimData78 ; SPRITE_ANIM_78 - anim_data_pointer AnimData79 ; SPRITE_ANIM_79 - anim_data_pointer AnimData80 ; SPRITE_ANIM_80 - anim_data_pointer AnimData81 ; SPRITE_ANIM_81 - anim_data_pointer AnimData82 ; SPRITE_ANIM_82 - anim_data_pointer AnimData83 ; SPRITE_ANIM_83 - anim_data_pointer AnimData84 ; SPRITE_ANIM_84 - anim_data_pointer AnimData85 ; SPRITE_ANIM_85 - anim_data_pointer AnimData86 ; SPRITE_ANIM_86 - anim_data_pointer AnimData87 ; SPRITE_ANIM_87 - anim_data_pointer AnimData88 ; SPRITE_ANIM_88 - anim_data_pointer AnimData89 ; SPRITE_ANIM_89 - anim_data_pointer AnimData90 ; SPRITE_ANIM_90 - anim_data_pointer AnimData91 ; SPRITE_ANIM_91 - anim_data_pointer AnimData92 ; SPRITE_ANIM_92 - anim_data_pointer AnimData93 ; SPRITE_ANIM_93 - anim_data_pointer AnimData94 ; SPRITE_ANIM_94 - anim_data_pointer AnimData95 ; SPRITE_ANIM_95 - anim_data_pointer AnimData96 ; SPRITE_ANIM_96 - anim_data_pointer AnimData97 ; SPRITE_ANIM_97 - anim_data_pointer AnimData98 ; SPRITE_ANIM_98 - anim_data_pointer AnimData99 ; SPRITE_ANIM_99 - anim_data_pointer AnimData100 ; SPRITE_ANIM_100 - anim_data_pointer AnimData101 ; SPRITE_ANIM_101 - anim_data_pointer AnimData102 ; SPRITE_ANIM_102 - anim_data_pointer AnimData103 ; SPRITE_ANIM_103 - anim_data_pointer AnimData104 ; SPRITE_ANIM_104 - anim_data_pointer AnimData105 ; SPRITE_ANIM_105 - anim_data_pointer AnimData106 ; SPRITE_ANIM_106 - anim_data_pointer AnimData107 ; SPRITE_ANIM_107 - anim_data_pointer AnimData108 ; SPRITE_ANIM_108 - anim_data_pointer AnimData109 ; SPRITE_ANIM_109 - anim_data_pointer AnimData110 ; SPRITE_ANIM_110 - anim_data_pointer AnimData111 ; SPRITE_ANIM_111 - anim_data_pointer AnimData112 ; SPRITE_ANIM_112 - anim_data_pointer AnimData113 ; SPRITE_ANIM_113 - anim_data_pointer AnimData114 ; SPRITE_ANIM_114 - anim_data_pointer AnimData115 ; SPRITE_ANIM_115 - anim_data_pointer AnimData116 ; SPRITE_ANIM_116 - anim_data_pointer AnimData117 ; SPRITE_ANIM_117 - anim_data_pointer AnimData118 ; SPRITE_ANIM_118 - anim_data_pointer AnimData119 ; SPRITE_ANIM_119 - anim_data_pointer AnimData120 ; SPRITE_ANIM_120 - anim_data_pointer AnimData121 ; SPRITE_ANIM_121 - anim_data_pointer AnimData122 ; SPRITE_ANIM_122 - anim_data_pointer AnimData123 ; SPRITE_ANIM_123 - anim_data_pointer AnimData124 ; SPRITE_ANIM_124 - anim_data_pointer AnimData125 ; SPRITE_ANIM_125 - anim_data_pointer AnimData126 ; SPRITE_ANIM_126 - anim_data_pointer AnimData127 ; SPRITE_ANIM_127 - anim_data_pointer AnimData128 ; SPRITE_ANIM_128 - anim_data_pointer AnimData129 ; SPRITE_ANIM_129 - anim_data_pointer AnimData130 ; SPRITE_ANIM_130 - anim_data_pointer AnimData131 ; SPRITE_ANIM_131 - anim_data_pointer AnimData132 ; SPRITE_ANIM_132 - anim_data_pointer AnimData133 ; SPRITE_ANIM_133 - anim_data_pointer AnimData134 ; SPRITE_ANIM_134 - anim_data_pointer AnimData135 ; SPRITE_ANIM_135 - anim_data_pointer AnimData136 ; SPRITE_ANIM_136 - anim_data_pointer AnimData137 ; SPRITE_ANIM_137 - anim_data_pointer AnimData138 ; SPRITE_ANIM_138 - anim_data_pointer AnimData139 ; SPRITE_ANIM_139 - anim_data_pointer AnimData140 ; SPRITE_ANIM_140 - anim_data_pointer AnimData141 ; SPRITE_ANIM_141 - anim_data_pointer AnimData142 ; SPRITE_ANIM_142 - anim_data_pointer AnimData143 ; SPRITE_ANIM_143 - anim_data_pointer AnimData144 ; SPRITE_ANIM_144 - anim_data_pointer AnimData145 ; SPRITE_ANIM_145 - anim_data_pointer AnimData146 ; SPRITE_ANIM_146 - anim_data_pointer AnimData147 ; SPRITE_ANIM_147 - anim_data_pointer AnimData148 ; SPRITE_ANIM_148 - anim_data_pointer AnimData149 ; SPRITE_ANIM_149 - anim_data_pointer AnimData150 ; SPRITE_ANIM_150 - anim_data_pointer AnimData151 ; SPRITE_ANIM_151 - anim_data_pointer AnimData152 ; SPRITE_ANIM_152 - anim_data_pointer AnimData153 ; SPRITE_ANIM_153 - anim_data_pointer AnimData154 ; SPRITE_ANIM_154 - anim_data_pointer AnimData155 ; SPRITE_ANIM_155 - anim_data_pointer AnimData156 ; SPRITE_ANIM_156 - anim_data_pointer AnimData157 ; SPRITE_ANIM_157 - anim_data_pointer AnimData158 ; SPRITE_ANIM_158 - anim_data_pointer AnimData159 ; SPRITE_ANIM_159 - anim_data_pointer AnimData160 ; SPRITE_ANIM_160 - anim_data_pointer AnimData161 ; SPRITE_ANIM_161 - anim_data_pointer AnimData162 ; SPRITE_ANIM_162 - anim_data_pointer AnimData163 ; SPRITE_ANIM_163 - anim_data_pointer AnimData164 ; SPRITE_ANIM_164 - anim_data_pointer AnimData165 ; SPRITE_ANIM_165 - anim_data_pointer AnimData166 ; SPRITE_ANIM_166 - anim_data_pointer AnimData167 ; SPRITE_ANIM_167 - anim_data_pointer AnimData168 ; SPRITE_ANIM_168 - anim_data_pointer AnimData169 ; SPRITE_ANIM_169 - anim_data_pointer AnimData170 ; SPRITE_ANIM_170 - anim_data_pointer AnimData171 ; SPRITE_ANIM_171 - anim_data_pointer AnimData172 ; SPRITE_ANIM_172 - anim_data_pointer AnimData173 ; SPRITE_ANIM_173 - anim_data_pointer AnimData174 ; SPRITE_ANIM_174 - anim_data_pointer AnimData175 ; SPRITE_ANIM_175 - anim_data_pointer AnimData176 ; SPRITE_ANIM_176 - anim_data_pointer AnimData177 ; SPRITE_ANIM_177 - anim_data_pointer AnimData178 ; SPRITE_ANIM_178 - anim_data_pointer AnimData179 ; SPRITE_ANIM_179 - anim_data_pointer AnimData180 ; SPRITE_ANIM_180 - anim_data_pointer AnimData181 ; SPRITE_ANIM_181 - anim_data_pointer AnimData182 ; SPRITE_ANIM_182 - anim_data_pointer AnimData183 ; SPRITE_ANIM_183 - anim_data_pointer AnimData184 ; SPRITE_ANIM_184 - anim_data_pointer AnimData185 ; SPRITE_ANIM_185 - anim_data_pointer AnimData186 ; SPRITE_ANIM_186 - anim_data_pointer AnimData187 ; SPRITE_ANIM_187 - anim_data_pointer AnimData188 ; SPRITE_ANIM_188 - anim_data_pointer AnimData189 ; SPRITE_ANIM_189 - anim_data_pointer AnimData190 ; SPRITE_ANIM_190 - anim_data_pointer AnimData191 ; SPRITE_ANIM_191 - anim_data_pointer AnimData192 ; SPRITE_ANIM_192 - anim_data_pointer AnimData193 ; SPRITE_ANIM_193 - anim_data_pointer AnimData194 ; SPRITE_ANIM_194 - anim_data_pointer AnimData195 ; SPRITE_ANIM_195 - anim_data_pointer AnimData196 ; SPRITE_ANIM_196 - anim_data_pointer AnimData197 ; SPRITE_ANIM_197 - anim_data_pointer AnimData198 ; SPRITE_ANIM_198 - anim_data_pointer AnimData199 ; SPRITE_ANIM_199 - anim_data_pointer AnimData200 ; SPRITE_ANIM_200 - anim_data_pointer AnimData201 ; SPRITE_ANIM_201 - anim_data_pointer AnimData202 ; SPRITE_ANIM_202 - anim_data_pointer AnimData203 ; SPRITE_ANIM_203 - anim_data_pointer AnimData204 ; SPRITE_ANIM_204 - anim_data_pointer AnimData205 ; SPRITE_ANIM_205 - anim_data_pointer AnimData206 ; SPRITE_ANIM_206 - anim_data_pointer AnimData207 ; SPRITE_ANIM_207 - anim_data_pointer AnimData208 ; SPRITE_ANIM_208 - anim_data_pointer AnimData209 ; SPRITE_ANIM_209 - anim_data_pointer AnimData210 ; SPRITE_ANIM_210 - anim_data_pointer AnimData211 ; SPRITE_ANIM_211 - anim_data_pointer AnimData212 ; SPRITE_ANIM_212 - anim_data_pointer AnimData213 ; SPRITE_ANIM_213 - anim_data_pointer AnimData214 ; SPRITE_ANIM_214 - anim_data_pointer AnimData215 ; SPRITE_ANIM_215 - anim_data_pointer AnimData216 ; SPRITE_ANIM_216 +; disables all sprite animations +; and clears memory related to sprites +Func_1296e: + push af + ld a, [wd5d7] + or a + jr z, .continue + pop af + ret +.continue + pop af + push bc + push hl + xor a + ld [wWhichSprite], a + call GetFirstSpriteAnimBufferProperty + lb bc, 0, SPRITE_ANIM_LENGTH + +; disable all sprite animations +.loop_sprites + xor a + ld [hl], a ; set SPRITE_ANIM_ENABLED to 0 + add hl, bc + ld a, [wWhichSprite] + inc a + ld [wWhichSprite], a + cp SPRITE_ANIM_BUFFER_CAPACITY + jr nz, .loop_sprites + + call ClearSpriteVRAMBuffer + call ZeroObjectPositions + ld hl, wVBlankOAMCopyToggle + inc [hl] + pop hl + pop bc + ret + +; creates a new entry in SpriteAnimBuffer, else loads the sprite if need be +CreateSpriteAndAnimBufferEntry: + push af + ld a, [wd5d7] + or a + jr z, .continue + pop af + ret +.continue + pop af + push bc + push hl + call Func_12c05 + ld [wCurrSpriteTileID], a + xor a + ld [wWhichSprite], a + call GetFirstSpriteAnimBufferProperty + ld bc, SPRITE_ANIM_LENGTH +.findFirstEmptyAnimField + ld a, [hl] + or a + jr z, .foundEmptyAnimField + add hl, bc + ld a, [wWhichSprite] + inc a + ld [wWhichSprite], a + cp $10 + jr nz, .findFirstEmptyAnimField + debug_nop + scf + jr .quit +.foundEmptyAnimField + ld a, $1 + ld [hl], a + call FillNewSpriteAnimBufferEntry + or a +.quit + pop hl + pop bc + ret + +FillNewSpriteAnimBufferEntry: + push hl + push bc + push hl + inc hl + ld c, SPRITE_ANIM_LENGTH - 1 + xor a +.clearSpriteAnimBufferEntryLoop + ld [hli], a + dec c + jr nz, .clearSpriteAnimBufferEntryLoop + pop hl + ld bc, SPRITE_ANIM_ID - 1 + add hl, bc + ld a, [wCurrSpriteTileID] + ld [hli], a + ld a, $ff + ld [hl], a + ld bc, SPRITE_ANIM_COUNTER - SPRITE_ANIM_ID + add hl, bc + ld a, $ff + ld [hl], a + pop bc + pop hl + ret + +DisableCurSpriteAnim: + ld a, [wWhichSprite] + ; fallthrough + +; sets SPRITE_ANIM_ENABLED to false +; of sprite in register a +DisableSpriteAnim: + push af + ld a, [wd5d7] + or a + jr z, .disable + pop af + ret +.disable + pop af + push hl + push bc + ld c, SPRITE_ANIM_ENABLED + call GetSpriteAnimBufferProperty_SpriteInA + ld [hl], FALSE + pop bc + pop hl + ret + +GetSpriteAnimCounter: + ld a, [wWhichSprite] + push hl + push bc + ld c, SPRITE_ANIM_COUNTER + call GetSpriteAnimBufferProperty_SpriteInA + ld a, [hl] + pop bc + pop hl + ret + +_HandleAllSpriteAnimations: + push af + ld a, [wd5d7] ; skip animating this frame if enabled + or a + jr z, .continue + pop af + ret +.continue + pop af + push af + push bc + push de + push hl + call ZeroObjectPositions + xor a + ld [wWhichSprite], a + call GetFirstSpriteAnimBufferProperty +.spriteLoop + ld a, [hl] + or a + jr z, .nextSprite ; skip if SPRITE_ANIM_ENABLED is 0 + call TryHandleSpriteAnimationFrame + call LoadSpriteDataForAnimationFrame +.nextSprite + ld bc, SPRITE_ANIM_LENGTH + add hl, bc + ld a, [wWhichSprite] + inc a + ld [wWhichSprite], a + cp SPRITE_ANIM_BUFFER_CAPACITY + jr nz, .spriteLoop + ld hl, wVBlankOAMCopyToggle + inc [hl] + pop hl + pop de + pop bc + pop af + ret + +LoadSpriteDataForAnimationFrame: + push hl + push bc + inc hl + ld a, [hli] + ld [wCurrSpriteAttributes], a + ld a, [hli] + ld [wCurrSpriteXPos], a + ld a, [hli] + ld [wCurrSpriteYPos], a + ld a, [hl] + ld [wCurrSpriteTileID], a + ld bc, SPRITE_ANIM_FLAGS - SPRITE_ANIM_TILE_ID + add hl, bc + ld a, [hl] + and 1 << SPRITE_ANIM_FLAG_UNSKIPPABLE + jr nz, .quit + ld bc, SPRITE_ANIM_FRAME_BANK - SPRITE_ANIM_FLAGS + add hl, bc + ld a, [hli] + ld [wd5d6], a + or a + jr z, .quit + ld a, [hli] + ld h, [hl] + ld l, a + call DrawSpriteAnimationFrame +.quit + pop bc + pop hl + ret + +; decrements the given sprite's movement counter (2x if SPRITE_ANIM_FLAG_SPEED is set) +; moves to the next animation frame if necessary +TryHandleSpriteAnimationFrame: + push hl + push bc + push de + push hl + ld d, 1 + ld bc, SPRITE_ANIM_FLAGS + add hl, bc + bit SPRITE_ANIM_FLAG_SPEED, [hl] + jr z, .skipSpeedIncrease + inc d +.skipSpeedIncrease + pop hl + ld bc, SPRITE_ANIM_COUNTER + add hl, bc + ld a, [hl] + cp $ff + jr z, .exit + sub d + ld [hl], a + jr z, .doNextAnimationFrame + jr nc, .exit +.doNextAnimationFrame + ld bc, SPRITE_ANIM_ENABLED - SPRITE_ANIM_COUNTER + add hl, bc + call HandleAnimationFrame +.exit + pop de + pop bc + pop hl + ret + +StartNewSpriteAnimation: + push hl + push af + ld c, SPRITE_ANIM_ID + call GetSpriteAnimBufferProperty + pop af + cp [hl] + pop hl + ret z + ; fallthrough + +StartSpriteAnimation: + push hl + call LoadSpriteAnimPointers + call HandleAnimationFrame + pop hl + ret + +; a = sprite animation +; c = animation counter value +Func_12ac9: + push bc + ld b, a + ld a, c + or a + ld a, b + pop bc + jr z, StartSpriteAnimation + + push hl + push bc + call LoadSpriteAnimPointers + ld a, $ff + call GetAnimFramePointerFromOffset + pop bc + ld a, c + call SetAnimationCounterAndLoop + pop hl + ret + +; Given an animation ID, fills the current sprite's Animation Pointer and Frame Offset Pointer +; a - Animation ID for current sprite +LoadSpriteAnimPointers: + push bc + push af + call GetFirstSpriteAnimBufferProperty + pop af + push hl + ld bc, SPRITE_ANIM_ID + add hl, bc + ld [hli], a + push hl + ld l, 6 ; SpriteAnimations + farcall GetMapDataPointer + farcall LoadGraphicsPointerFromHL + pop hl ; hl is animation bank + ld a, [wTempPointerBank] + ld [hli], a + ld a, [wTempPointer + 0] + ld [hli], a + ld c, a + ld a, [wTempPointer + 1] + ld [hli], a + ld b, a + ; offset pointer = pointer + $3 + ld a, $3 + add c + ld [hli], a + ld a, $0 + adc b + ld [hli], a + pop hl + pop bc + ret + +; hl - beginning of current sprite_anim_buffer +; Handles a full animation frame using all values in animation structure +; (frame data offset, anim counter, X Mov, Y Mov) +HandleAnimationFrame: + push bc + push de + push hl +.tryHandlingFrame + push hl + ld bc, SPRITE_ANIM_BANK + add hl, bc + ld a, [hli] + ld [wTempPointerBank], a + + inc hl + inc hl + ld a, [hl] ; SPRITE_ANIM_FRAME_OFFSET_POINTER + ld [wTempPointer + 0], a + add SPRITE_FRAME_OFFSET_SIZE ; advance FRAME_OFFSET_POINTER by 1 frame, 4 bytes + ld [hli], a + ld a, [hl] + ld [wTempPointer + 1], a + adc 0 + ld [hl], a + + ld de, wLoadedPalData + ld bc, SPRITE_FRAME_OFFSET_SIZE + call CopyBankedDataToDE + pop hl ; beginning of current sprite_anim_buffer + ld de, wLoadedPalData + ld a, [de] + call GetAnimFramePointerFromOffset + inc de + ld a, [de] + call SetAnimationCounterAndLoop + jr c, .tryHandlingFrame + inc de + ld bc, SPRITE_ANIM_COORD_X + add hl, bc + push hl + ld bc, SPRITE_ANIM_FLAGS - SPRITE_ANIM_COORD_X + add hl, bc + ld b, [hl] + pop hl + ld a, [de] + bit SPRITE_ANIM_FLAG_X_SUBTRACT, b + jr z, .addXOffset + cpl + inc a +.addXOffset + add [hl] + ld [hli], a + inc de + ld a, [de] + bit SPRITE_ANIM_FLAG_Y_SUBTRACT, b + jr z, .addYOffset + cpl + inc a +.addYOffset + add [hl] + ld [hl], a + pop hl + pop de + pop bc + ret + +; Calls GetAnimationFramePointer after setting up wTempPointerBank +; and wVRAMTileOffset +; a - frame offset from Animation Data +; hl - beginning of Sprite Anim Buffer +GetAnimFramePointerFromOffset: + ld [wVRAMTileOffset], a + push hl + push bc + push de + push hl + ld bc, SPRITE_ANIM_BANK + add hl, bc + ld a, [hli] + ld [wTempPointerBank], a + ld a, [hli] + ld [wTempPointer + 0], a + ld a, [hli] + ld [wTempPointer + 1], a + pop hl + call GetAnimationFramePointer ; calls with the original map data script pointer/bank + pop de + pop bc + pop hl + ret + +; Sets the animation counter for the current sprite. If the value is zero, loop the animation +; a - new animation counter +SetAnimationCounterAndLoop: + push hl + push bc + ld bc, SPRITE_ANIM_COUNTER + add hl, bc + ld [hl], a + or a + jr nz, .exit + ld bc, SPRITE_ANIM_POINTER - SPRITE_ANIM_COUNTER + add hl, bc + ld a, [hli] + add $3 ; skip base bank/pointer at beginning of data structure + ld c, a + ld a, [hli] + adc 0 + ld b, a + ld a, c + ld [hli], a + ld a, b + ld [hl], a + scf +.exit + pop bc + pop hl + ret + +Func_12ba7: + push hl + push bc + push de + call EnableSRAM + ld hl, wSpriteAnimBuffer + ld de, sGeneralSaveDataEnd + ld bc, $100 + call CopyDataHLtoDE + ld hl, wSpriteVRAMBuffer + ld bc, $40 + call CopyDataHLtoDE + ld a, [wSpriteVRAMBufferSize] + ld [de], a + call DisableSRAM + pop de + pop bc + pop hl + ret + +Func_12bcd: + push hl + push bc + push de + call EnableSRAM + ld hl, sGeneralSaveDataEnd + ld de, wSpriteAnimBuffer + ld bc, $100 + call CopyDataHLtoDE + ld de, wSpriteVRAMBuffer + ld bc, $40 + call CopyDataHLtoDE + ld a, [hl] + ld [wSpriteVRAMBufferSize], a + call DisableSRAM + pop de + pop bc + pop hl + ret + +; clears wSpriteVRAMBufferSize and wSpriteVRAMBuffer +ClearSpriteVRAMBuffer: + push hl + push bc + xor a + ld [wSpriteVRAMBufferSize], a + ld c, $40 + ld hl, wSpriteVRAMBuffer +.asm_12bfe + ld [hli], a + dec c + jr nz, .asm_12bfe + pop bc + pop hl + ret + +; gets some value based on the sprite in a and wSpriteVRAMBuffer +; loads the sprites data if it doesn't already exist +Func_12c05: + push hl + push bc + push de + ld b, a + ld d, $0 + ld a, [wSpriteVRAMBufferSize] + ld c, a + ld hl, wSpriteVRAMBuffer + or a + jr z, .tryToAddSprite + +.findSpriteMatchLoop + inc hl + ld a, [hl] + cp b + jr z, .foundSpriteMatch + inc hl + ld a, [hli] + add [hl] ; add tile size to tile offset + ld d, a + inc hl + dec c + jr nz, .findSpriteMatchLoop + +.tryToAddSprite + ld a, [wSpriteVRAMBufferSize] + cp $10 + jr nc, .quitFail + inc a + ld [wSpriteVRAMBufferSize], a ; increase number of entries by 1 + inc hl + push hl + ld a, b + ld [hli], a ; store sprite index + call Func_12c4f + push af + ld a, d + ld [hli], a ; store tile offset + pop af + ld [hl], a ; store tile size + pop hl + +.foundSpriteMatch + dec hl + inc [hl] ; mark this entry as valid + inc hl + inc hl + ld a, [hli] + add [hl] + cp $81 + jr nc, .quitFail ; exceeds total tile size + ld a, d + or a + jr .quitSucceed + +.quitFail + debug_nop + xor a + scf +.quitSucceed + pop de + pop bc + pop hl + ret + +; input: +; a = sprite index within the data map +; d = tile offset in VRAM +; output: +; a = number of tiles in sprite +Func_12c4f: + push af + xor a + ld [wd4cb], a + ld a, d + ld [wVRAMTileOffset], a + pop af + farcall Func_8025b + ret + +Func_12c5e: + push hl + push bc + push de + ld c, $10 + ld de, $4 + ld hl, wSpriteVRAMBuffer +.asm_12c69 + ld a, [hl] + or a + jr z, .asm_12c77 + push hl + push de + inc hl + ld a, [hli] + ld d, [hl] + call Func_12c4f + pop de + pop hl +.asm_12c77 + add hl, de + dec c + jr nz, .asm_12c69 + pop de + pop bc + pop hl + ret |