summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--constants/sprite_anim_constants.asm228
-rwxr-xr-xdata/icon_pointers.asm41
-rwxr-xr-xdata/pokemon/menu_icons.asm254
-rwxr-xr-xdata/sprite_anims/framesets.asm1440
-rwxr-xr-xdata/sprite_anims/oam.asm830
-rwxr-xr-xdata/sprite_anims/sequences.asm50
-rwxr-xr-xengine/battle/battle_transition.asm747
-rwxr-xr-xengine/events/field_moves.asm449
-rwxr-xr-xengine/events/magnet_train.asm387
-rwxr-xr-xengine/gfx/mon_icons.asm337
-rwxr-xr-xengine/gfx/sprite_anims.asm2800
-rwxr-xr-xengine/gfx/sprites.asm1220
-rwxr-xr-xengine/menus/delete_save.asm34
-rwxr-xr-xengine/menus/savemenu_copytilemapatonce.asm84
-rwxr-xr-xengine/movie/init_hof_credits.asm60
-rwxr-xr-xengine/phone/phonering_copytilemapatonce.asm87
-rwxr-xr-xengine/rtc/reset_password.asm254
-rwxr-xr-xengine/tilesets/timeofday_pals.asm317
-rwxr-xr-xgfx/battle/expbarend.2bppbin0 -> 16 bytes
-rwxr-xr-xgfx/battle/expbarend.pngbin0 -> 85 bytes
-rwxr-xr-xgfx/battle/expbarend_sgb.2bppbin0 -> 16 bytes
-rwxr-xr-xgfx/battle/expbarend_sgb.pngbin0 -> 85 bytes
-rwxr-xr-xgfx/icons.asm41
-rwxr-xr-xgfx/icons/bat.2bppbin0 -> 128 bytes
-rwxr-xr-xgfx/icons/bat.pngbin0 -> 169 bytes
-rwxr-xr-xgfx/icons/bigmon.2bppbin0 -> 128 bytes
-rwxr-xr-xgfx/icons/bigmon.pngbin0 -> 185 bytes
-rwxr-xr-xgfx/icons/bird.2bppbin0 -> 128 bytes
-rwxr-xr-xgfx/icons/bird.pngbin0 -> 176 bytes
-rwxr-xr-xgfx/icons/blob.2bppbin0 -> 128 bytes
-rwxr-xr-xgfx/icons/blob.pngbin0 -> 174 bytes
-rwxr-xr-xgfx/icons/bug.2bppbin0 -> 128 bytes
-rwxr-xr-xgfx/icons/bug.pngbin0 -> 185 bytes
-rwxr-xr-xgfx/icons/bulbasaur.2bppbin0 -> 128 bytes
-rwxr-xr-xgfx/icons/bulbasaur.pngbin0 -> 166 bytes
-rwxr-xr-xgfx/icons/caterpillar.2bppbin0 -> 128 bytes
-rwxr-xr-xgfx/icons/caterpillar.pngbin0 -> 159 bytes
-rwxr-xr-xgfx/icons/charmander.2bppbin0 -> 128 bytes
-rwxr-xr-xgfx/icons/charmander.pngbin0 -> 166 bytes
-rwxr-xr-xgfx/icons/clefairy.2bppbin0 -> 128 bytes
-rwxr-xr-xgfx/icons/clefairy.pngbin0 -> 165 bytes
-rwxr-xr-xgfx/icons/diglett.2bppbin0 -> 128 bytes
-rwxr-xr-xgfx/icons/diglett.pngbin0 -> 129 bytes
-rwxr-xr-xgfx/icons/egg.2bppbin0 -> 128 bytes
-rwxr-xr-xgfx/icons/egg.pngbin0 -> 155 bytes
-rwxr-xr-xgfx/icons/equine.2bppbin0 -> 128 bytes
-rwxr-xr-xgfx/icons/equine.pngbin0 -> 159 bytes
-rwxr-xr-xgfx/icons/fighter.2bppbin0 -> 128 bytes
-rwxr-xr-xgfx/icons/fighter.pngbin0 -> 179 bytes
-rwxr-xr-xgfx/icons/fish.2bppbin0 -> 128 bytes
-rwxr-xr-xgfx/icons/fish.pngbin0 -> 173 bytes
-rwxr-xr-xgfx/icons/fox.2bppbin0 -> 128 bytes
-rwxr-xr-xgfx/icons/fox.pngbin0 -> 188 bytes
-rwxr-xr-xgfx/icons/geodude.2bppbin0 -> 128 bytes
-rwxr-xr-xgfx/icons/geodude.pngbin0 -> 173 bytes
-rwxr-xr-xgfx/icons/ghost.2bppbin0 -> 128 bytes
-rwxr-xr-xgfx/icons/ghost.pngbin0 -> 143 bytes
-rwxr-xr-xgfx/icons/gyarados.2bppbin0 -> 128 bytes
-rwxr-xr-xgfx/icons/gyarados.pngbin0 -> 208 bytes
-rwxr-xr-xgfx/icons/ho_oh.2bppbin0 -> 128 bytes
-rwxr-xr-xgfx/icons/ho_oh.pngbin0 -> 204 bytes
-rwxr-xr-xgfx/icons/humanshape.2bppbin0 -> 128 bytes
-rwxr-xr-xgfx/icons/humanshape.pngbin0 -> 161 bytes
-rwxr-xr-xgfx/icons/item.2bpp1
-rwxr-xr-xgfx/icons/item.pngbin0 -> 82 bytes
-rwxr-xr-xgfx/icons/jellyfish.2bppbin0 -> 128 bytes
-rwxr-xr-xgfx/icons/jellyfish.pngbin0 -> 172 bytes
-rwxr-xr-xgfx/icons/jigglypuff.2bppbin0 -> 128 bytes
-rwxr-xr-xgfx/icons/jigglypuff.pngbin0 -> 165 bytes
-rwxr-xr-xgfx/icons/lapras.2bppbin0 -> 128 bytes
-rwxr-xr-xgfx/icons/lapras.pngbin0 -> 165 bytes
-rwxr-xr-xgfx/icons/lugia.2bppbin0 -> 128 bytes
-rwxr-xr-xgfx/icons/lugia.pngbin0 -> 185 bytes
-rwxr-xr-xgfx/icons/mail.2bpp1
-rwxr-xr-xgfx/icons/mail.pngbin0 -> 85 bytes
-rwxr-xr-xgfx/icons/monster.2bppbin0 -> 128 bytes
-rwxr-xr-xgfx/icons/monster.pngbin0 -> 179 bytes
-rwxr-xr-xgfx/icons/moth.2bppbin0 -> 128 bytes
-rwxr-xr-xgfx/icons/moth.pngbin0 -> 185 bytes
-rwxr-xr-xgfx/icons/oddish.2bppbin0 -> 128 bytes
-rwxr-xr-xgfx/icons/oddish.pngbin0 -> 157 bytes
-rwxr-xr-xgfx/icons/pikachu.2bppbin0 -> 128 bytes
-rwxr-xr-xgfx/icons/pikachu.pngbin0 -> 172 bytes
-rwxr-xr-xgfx/icons/poliwag.2bppbin0 -> 128 bytes
-rwxr-xr-xgfx/icons/poliwag.pngbin0 -> 158 bytes
-rwxr-xr-xgfx/icons/serpent.2bppbin0 -> 128 bytes
-rwxr-xr-xgfx/icons/serpent.pngbin0 -> 145 bytes
-rwxr-xr-xgfx/icons/shell.2bppbin0 -> 128 bytes
-rwxr-xr-xgfx/icons/shell.pngbin0 -> 170 bytes
-rwxr-xr-xgfx/icons/slowpoke.2bpp2
-rwxr-xr-xgfx/icons/slowpoke.pngbin0 -> 183 bytes
-rwxr-xr-xgfx/icons/snorlax.2bppbin0 -> 128 bytes
-rwxr-xr-xgfx/icons/snorlax.pngbin0 -> 165 bytes
-rwxr-xr-xgfx/icons/squirtle.2bppbin0 -> 128 bytes
-rwxr-xr-xgfx/icons/squirtle.pngbin0 -> 170 bytes
-rwxr-xr-xgfx/icons/staryu.2bppbin0 -> 128 bytes
-rwxr-xr-xgfx/icons/staryu.pngbin0 -> 166 bytes
-rwxr-xr-xgfx/icons/sudowoodo.2bppbin0 -> 128 bytes
-rwxr-xr-xgfx/icons/sudowoodo.pngbin0 -> 195 bytes
-rwxr-xr-xgfx/icons/unown.2bppbin0 -> 128 bytes
-rwxr-xr-xgfx/icons/unown.pngbin0 -> 112 bytes
-rwxr-xr-xgfx/icons/voltorb.2bppbin0 -> 128 bytes
-rwxr-xr-xgfx/icons/voltorb.pngbin0 -> 127 bytes
-rwxr-xr-xgfx/overworld/magnet_train_bg.tilemap1
-rwxr-xr-xgfx/overworld/magnet_train_fg.tilemapbin0 -> 80 bytes
-rwxr-xr-xgfx/overworld/trainer_battle_day.pal4
-rwxr-xr-xgfx/overworld/trainer_battle_nite.pal4
-rwxr-xr-xgfx/overworld/trainer_battle_pokeball_tiles.2bpp1
-rwxr-xr-xgfx/overworld/trainer_battle_pokeball_tiles.pngbin0 -> 89 bytes
-rwxr-xr-xhome/tilemap.asm16
-rw-r--r--macros.asm1
-rwxr-xr-xmacros/scripts/gfx_anims.asm53
-rw-r--r--main.asm123
-rw-r--r--wram.asm41
114 files changed, 6710 insertions, 3198 deletions
diff --git a/constants/sprite_anim_constants.asm b/constants/sprite_anim_constants.asm
index 79d1155c..3181da67 100644
--- a/constants/sprite_anim_constants.asm
+++ b/constants/sprite_anim_constants.asm
@@ -1,46 +1,46 @@
; sprite_anim_struct members (see macros/wram.asm)
const_def
- const SPRITEANIMSTRUCT_INDEX ; 0
- const SPRITEANIMSTRUCT_FRAMESET_ID ; 1
- const SPRITEANIMSTRUCT_ANIM_SEQ_ID ; 2
- const SPRITEANIMSTRUCT_TILE_ID ; 3
- const SPRITEANIMSTRUCT_XCOORD ; 4
- const SPRITEANIMSTRUCT_YCOORD ; 5
- const SPRITEANIMSTRUCT_XOFFSET ; 6
- const SPRITEANIMSTRUCT_YOFFSET ; 7
- const SPRITEANIMSTRUCT_DURATION ; 8
- const SPRITEANIMSTRUCT_DURATIONOFFSET ; 9
- const SPRITEANIMSTRUCT_FRAME ; a
- const SPRITEANIMSTRUCT_JUMPTABLE_INDEX ; b
- const SPRITEANIMSTRUCT_0C ; c
- const SPRITEANIMSTRUCT_0D ; d
- const SPRITEANIMSTRUCT_0E ; e
- const SPRITEANIMSTRUCT_0F ; f
+ const SPRITEANIMSTRUCT_INDEX ; 00
+ const SPRITEANIMSTRUCT_FRAMESET_ID ; 01
+ const SPRITEANIMSTRUCT_ANIM_SEQ_ID ; 02
+ const SPRITEANIMSTRUCT_TILE_ID ; 03
+ const SPRITEANIMSTRUCT_XCOORD ; 04
+ const SPRITEANIMSTRUCT_YCOORD ; 05
+ const SPRITEANIMSTRUCT_XOFFSET ; 06
+ const SPRITEANIMSTRUCT_YOFFSET ; 07
+ const SPRITEANIMSTRUCT_DURATION ; 08
+ const SPRITEANIMSTRUCT_DURATIONOFFSET ; 09
+ const SPRITEANIMSTRUCT_FRAME ; 0a
+ const SPRITEANIMSTRUCT_JUMPTABLE_INDEX ; 0b
+ const SPRITEANIMSTRUCT_0C ; 0c
+ const SPRITEANIMSTRUCT_0D ; 0d
+ const SPRITEANIMSTRUCT_0E ; 0e
+ const SPRITEANIMSTRUCT_0F ; 0f
SPRITEANIMSTRUCT_LENGTH EQU const_value
NUM_SPRITE_ANIM_STRUCTS EQU 10 ; see wSpriteAnimationStructs
; SpriteAnimSeqData indexes (see data/sprite_anims/sequences.asm)
const_def
const SPRITE_ANIM_INDEX_PARTY_MON ; 00
- const SPRITE_ANIM_INDEX_01 ; 01
- const SPRITE_ANIM_INDEX_02 ; 02
- const SPRITE_ANIM_INDEX_03 ; 03
- const SPRITE_ANIM_INDEX_04 ; 04
- const SPRITE_ANIM_INDEX_05 ; 05
- const SPRITE_ANIM_INDEX_06 ; 06
- const SPRITE_ANIM_INDEX_07 ; 07
- const SPRITE_ANIM_INDEX_08 ; 08
- const SPRITE_ANIM_INDEX_09 ; 09
- const SPRITE_ANIM_INDEX_0A ; 0a
- const SPRITE_ANIM_INDEX_0B ; 0b
- const SPRITE_ANIM_INDEX_0C ; 0c
- const SPRITE_ANIM_INDEX_0D ; 0d
- const SPRITE_ANIM_INDEX_0E ; 0e
+ const SPRITE_ANIM_INDEX_GS_INTRO_BUBBLE ; 01
+ const SPRITE_ANIM_INDEX_GS_INTRO_SHELLDER ; 02
+ const SPRITE_ANIM_INDEX_GS_INTRO_MAGIKARP ; 03
+ const SPRITE_ANIM_INDEX_GS_INTRO_LAPRAS ; 04
+ const SPRITE_ANIM_INDEX_GS_INTRO_LAPRAS_2 ; 05
+ const SPRITE_ANIM_INDEX_GS_INTRO_NOTE ; 06
+ const SPRITE_ANIM_INDEX_GS_INTRO_INVISIBLE_NOTE ; 07
+ const SPRITE_ANIM_INDEX_GS_INTRO_JIGGLYPUFF ; 08
+ const SPRITE_ANIM_INDEX_GS_INTRO_PIKACHU ; 09
+ const SPRITE_ANIM_INDEX_GS_INTRO_PIKACHU_TAIL ; 0a
+ const SPRITE_ANIM_INDEX_GS_INTRO_FIREBALL ; 0b
+ const SPRITE_ANIM_INDEX_GS_INTRO_CHIKORITA ; 0c
+ const SPRITE_ANIM_INDEX_GS_INTRO_CYNDAQUIL ; 0d
+ const SPRITE_ANIM_INDEX_GS_INTRO_TOTODILE ; 0e
const SPRITE_ANIM_INDEX_GS_TITLE_TRAIL ; 0f
- const SPRITE_ANIM_INDEX_UNUSED_10 ; 10
- const SPRITE_ANIM_INDEX_UNUSED_11 ; 11
- const SPRITE_ANIM_INDEX_UNUSED_12 ; 12
- const SPRITE_ANIM_INDEX_UNUSED_13 ; 13
+ const SPRITE_ANIM_INDEX_UNUSED_PIKACHU ; 10
+ const SPRITE_ANIM_INDEX_UNUSED_PIKACHU_TAIL ; 11
+ const SPRITE_ANIM_INDEX_UNUSED_NOTE ; 12
+ const SPRITE_ANIM_INDEX_UNUSED_JIGGLYPUFF ; 13
const SPRITE_ANIM_INDEX_NAMING_SCREEN_CURSOR ; 14
const SPRITE_ANIM_INDEX_GAMEFREAK_LOGO ; 15
const SPRITE_ANIM_INDEX_GS_INTRO_STAR ; 16
@@ -70,7 +70,49 @@ NUM_SPRITE_ANIM_STRUCTS EQU 10 ; see wSpriteAnimationStructs
const SPRITE_ANIM_INDEX_EGG_HATCH ; 2e
; DoAnimFrame.Jumptable indexes (see engine/gfx/sprite_anims.asm)
-SPRITE_ANIM_SEQ_NULL EQU $00
+ const_def
+ const SPRITE_ANIM_SEQ_NULL ; 00
+ const SPRITE_ANIM_SEQ_PARTY_MON ; 01
+ const SPRITE_ANIM_SEQ_PARTY_MON_SWITCH ; 02
+ const SPRITE_ANIM_SEQ_PARTY_MON_SELECTED ; 03
+ const SPRITE_ANIM_SEQ_GS_INTRO_BUBBLE ; 04
+ const SPRITE_ANIM_SEQ_GS_INTRO_SHELLDER ; 05
+ const SPRITE_ANIM_SEQ_GS_INTRO_MAGIKARP ; 06
+ const SPRITE_ANIM_SEQ_GS_INTRO_LAPRAS ; 07
+ const SPRITE_ANIM_SEQ_GS_INTRO_LAPRAS_2 ; 08
+ const SPRITE_ANIM_SEQ_GS_INTRO_NOTE ; 09
+ const SPRITE_ANIM_SEQ_GS_INTRO_JIGGLYPUFF ; 0a
+ const SPRITE_ANIM_SEQ_GS_INTRO_PIKACHU ; 0b
+ const SPRITE_ANIM_SEQ_GS_INTRO_PIKACHU_TAIL ; 0c
+ const SPRITE_ANIM_SEQ_GS_INTRO_FIREBALL ; 0d
+ const SPRITE_ANIM_SEQ_GS_INTRO_CHIKORITA_TOTODILE ; 0e
+ const SPRITE_ANIM_SEQ_GS_INTRO_CYNDAQUIL ; 0f
+ const SPRITE_ANIM_SEQ_GS_TITLE_TRAIL ; 10
+ const SPRITE_ANIM_SEQ_UNUSED_PIKACHU ; 11
+ const SPRITE_ANIM_SEQ_UNUSED_PIKACHU_TAIL ; 12
+ const SPRITE_ANIM_SEQ_UNUSED_NOTE ; 13
+ const SPRITE_ANIM_SEQ_UNUSED_JIGGLYPUFF ; 14
+ const SPRITE_ANIM_SEQ_NAMING_SCREEN_CURSOR ; 15
+ const SPRITE_ANIM_SEQ_GAMEFREAK_LOGO ; 16
+ const SPRITE_ANIM_SEQ_GS_INTRO_STAR ; 17
+ const SPRITE_ANIM_SEQ_GS_INTRO_SPARKLE ; 18
+ const SPRITE_ANIM_SEQ_SLOTS_GOLEM ; 19
+ const SPRITE_ANIM_SEQ_SLOTS_CHANSEY ; 1a
+ const SPRITE_ANIM_SEQ_SLOTS_EGG ; 1b
+ const SPRITE_ANIM_SEQ_MAIL_CURSOR ; 1c
+ const SPRITE_ANIM_SEQ_UNUSED_CURSOR ; 1d
+ const SPRITE_ANIM_SEQ_DUMMY_GAME_CURSOR ; 1e
+ const SPRITE_ANIM_SEQ_POKEGEAR_ARROW ; 1f
+ const SPRITE_ANIM_SEQ_TRADE_POKE_BALL ; 20
+ const SPRITE_ANIM_SEQ_TRADE_TUBE_BULGE ; 21
+ const SPRITE_ANIM_SEQ_TRADEMON_IN_TUBE ; 22
+ const SPRITE_ANIM_SEQ_REVEAL_NEW_MON ; 23
+ const SPRITE_ANIM_SEQ_RADIO_TUNING_KNOB ; 24
+ const SPRITE_ANIM_SEQ_CUT_LEAVES ; 25
+ const SPRITE_ANIM_SEQ_FLY_FROM ; 26
+ const SPRITE_ANIM_SEQ_FLY_LEAF ; 27
+ const SPRITE_ANIM_SEQ_FLY_TO ; 28
+ const SPRITE_ANIM_SEQ_GS_INTRO_HO_OH_LUGIA ; 29
; SpriteAnimFrameData indexes (see data/sprite_anims/framesets.asm)
const_def
@@ -78,49 +120,58 @@ SPRITE_ANIM_SEQ_NULL EQU $00
const SPRITE_ANIM_FRAMESET_PARTY_MON ; 01
const SPRITE_ANIM_FRAMESET_PARTY_MON_WITH_MAIL ; 02
const SPRITE_ANIM_FRAMESET_PARTY_MON_WITH_ITEM ; 03
- const SPRITE_ANIM_FRAMESET_PARTY_MON_FAST ; 04
- const SPRITE_ANIM_FRAMESET_PARTY_MON_WITH_MAIL_FAST ; 05
- const SPRITE_ANIM_FRAMESET_PARTY_MON_WITH_ITEM_FAST ; 06
- const SPRITE_ANIM_FRAMESET_GS_TITLE_TRAIL ; 07
- const SPRITE_ANIM_FRAMESET_TEXT_ENTRY_CURSOR ; 08
- const SPRITE_ANIM_FRAMESET_TEXT_ENTRY_CURSOR_BIG ; 09
- const SPRITE_ANIM_FRAMESET_GAMEFREAK_LOGO ; 0a
- const SPRITE_ANIM_FRAMESET_GS_INTRO_STAR ; 0b
- const SPRITE_ANIM_FRAMESET_GS_INTRO_SPARKLE ; 0c
- const SPRITE_ANIM_FRAMESET_SLOTS_GOLEM ; 0d
- const SPRITE_ANIM_FRAMESET_SLOTS_CHANSEY ; 0e
- const SPRITE_ANIM_FRAMESET_SLOTS_CHANSEY_2 ; 0f
- const SPRITE_ANIM_FRAMESET_SLOTS_EGG ; 10
- const SPRITE_ANIM_FRAMESET_RED_WALK ; 11
- const SPRITE_ANIM_FRAMESET_STILL_CURSOR ; 12
- const SPRITE_ANIM_FRAMESET_TRADE_POKE_BALL ; 13
- const SPRITE_ANIM_FRAMESET_TRADE_POKE_BALL_WOBBLE ; 14
- const SPRITE_ANIM_FRAMESET_TRADE_POOF ; 15
- const SPRITE_ANIM_FRAMESET_TRADE_TUBE_BULGE ; 16
- const SPRITE_ANIM_FRAMESET_TRADEMON_ICON ; 17
- const SPRITE_ANIM_FRAMESET_TRADEMON_BUBBLE ; 18
- const SPRITE_ANIM_FRAMESET_EVOLUTION_BALL_OF_LIGHT ; 19
- const SPRITE_ANIM_FRAMESET_RADIO_TUNING_KNOB ; 1a
- const SPRITE_ANIM_FRAMESET_MAGNET_TRAIN_RED ; 1b
- const SPRITE_ANIM_FRAMESET_UNUSED_1C ; 1c
- const SPRITE_ANIM_FRAMESET_LEAF ; 1d
- const SPRITE_ANIM_FRAMESET_CUT_TREE ; 1e
- const SPRITE_ANIM_FRAMESET_EGG_CRACK ; 1f
- const SPRITE_ANIM_FRAMESET_EGG_HATCH_1 ; 20
- const SPRITE_ANIM_FRAMESET_EGG_HATCH_2 ; 21
- const SPRITE_ANIM_FRAMESET_EGG_HATCH_3 ; 22
- const SPRITE_ANIM_FRAMESET_EGG_HATCH_4 ; 23
- const SPRITE_ANIM_FRAMESET_GS_INTRO_HO_OH ; 24
- const SPRITE_ANIM_FRAMESET_HEADBUTT ; 25
- const SPRITE_ANIM_FRAMESET_EZCHAT_CURSOR_1 ; 26
- const SPRITE_ANIM_FRAMESET_EZCHAT_CURSOR_2 ; 27
- const SPRITE_ANIM_FRAMESET_EZCHAT_CURSOR_3 ; 28
- const SPRITE_ANIM_FRAMESET_EZCHAT_CURSOR_4 ; 29
- const SPRITE_ANIM_FRAMESET_EZCHAT_CURSOR_5 ; 2a
- const SPRITE_ANIM_FRAMESET_EZCHAT_CURSOR_6 ; 2b
- const SPRITE_ANIM_FRAMESET_EZCHAT_CURSOR_7 ; 2c
- const SPRITE_ANIM_FRAMESET_BLUE_WALK ; 2d
- const SPRITE_ANIM_FRAMESET_MAGNET_TRAIN_BLUE ; 2e
+ const SPRITE_ANIM_FRAMESET_GS_INTRO_BUBBLE ; 04
+ const SPRITE_ANIM_FRAMESET_GS_INTRO_SHELLDER ; 05
+ const SPRITE_ANIM_FRAMESET_GS_INTRO_MAGIKARP ; 06
+ const SPRITE_ANIM_FRAMESET_GS_INTRO_LAPRAS ; 07
+ const SPRITE_ANIM_FRAMESET_GS_INTRO_LAPRAS_2 ; 08
+ const SPRITE_ANIM_FRAMESET_GS_INTRO_NOTE ; 09
+ const SPRITE_ANIM_FRAMESET_GS_INTRO_INVISIBLE_NOTE ; 0a
+ const SPRITE_ANIM_FRAMESET_GS_INTRO_JIGGLYPUFF ; 0b
+ const SPRITE_ANIM_FRAMESET_GS_INTRO_JIGGLYPUFF_2 ; 0c
+ const SPRITE_ANIM_FRAMESET_GS_INTRO_PIKACHU ; 0d
+ const SPRITE_ANIM_FRAMESET_GS_INTRO_PIKACHU_2 ; 0e
+ const SPRITE_ANIM_FRAMESET_GS_INTRO_PIKACHU_3 ; 0f
+ const SPRITE_ANIM_FRAMESET_GS_INTRO_PIKACHU_TAIL ; 10
+ const SPRITE_ANIM_FRAMESET_GS_INTRO_PIKACHU_TAIL_2 ; 11
+ const SPRITE_ANIM_FRAMESET_GS_INTRO_FIREBALL ; 12
+ const SPRITE_ANIM_FRAMESET_GS_INTRO_CHIKORITA ; 13
+ const SPRITE_ANIM_FRAMESET_GS_INTRO_CYNDAQUIL ; 14
+ const SPRITE_ANIM_FRAMESET_GS_INTRO_TOTODILE ; 15
+ const SPRITE_ANIM_FRAMESET_GS_TITLE_TRAIL ; 16
+ const SPRITE_ANIM_FRAMESET_UNUSED_PIKACHU ; 17
+ const SPRITE_ANIM_FRAMESET_UNUSED_PIKACHU_2 ; 18
+ const SPRITE_ANIM_FRAMESET_UNUSED_PIKACHU_3 ; 19
+ const SPRITE_ANIM_FRAMESET_TEXT_ENTRY_CURSOR ; 1a
+ const SPRITE_ANIM_FRAMESET_TEXT_ENTRY_CURSOR_BIG ; 1b
+ const SPRITE_ANIM_FRAMESET_GAMEFREAK_LOGO ; 1c
+ const SPRITE_ANIM_FRAMESET_GS_INTRO_STAR ; 1d
+ const SPRITE_ANIM_FRAMESET_GS_INTRO_SPARKLE ; 1e
+ const SPRITE_ANIM_FRAMESET_SLOTS_GOLEM ; 1f
+ const SPRITE_ANIM_FRAMESET_SLOTS_CHANSEY ; 20
+ const SPRITE_ANIM_FRAMESET_SLOTS_CHANSEY_2 ; 21
+ const SPRITE_ANIM_FRAMESET_SLOTS_EGG ; 22
+ const SPRITE_ANIM_FRAMESET_RED_WALK ; 23
+ const SPRITE_ANIM_FRAMESET_STILL_CURSOR ; 24
+ const SPRITE_ANIM_FRAMESET_TRADE_POKE_BALL ; 25
+ const SPRITE_ANIM_FRAMESET_TRADE_POKE_BALL_WOBBLE ; 26
+ const SPRITE_ANIM_FRAMESET_TRADE_POOF ; 27
+ const SPRITE_ANIM_FRAMESET_TRADE_TUBE_BULGE ; 28
+ const SPRITE_ANIM_FRAMESET_TRADEMON_ICON ; 29
+ const SPRITE_ANIM_FRAMESET_TRADEMON_BUBBLE ; 2a
+ const SPRITE_ANIM_FRAMESET_EVOLUTION_BALL_OF_LIGHT ; 2b
+ const SPRITE_ANIM_FRAMESET_RADIO_TUNING_KNOB ; 2c
+ const SPRITE_ANIM_FRAMESET_MAGNET_TRAIN_RED ; 2d
+ const SPRITE_ANIM_FRAMESET_UNUSED_1C ; 2e
+ const SPRITE_ANIM_FRAMESET_LEAF ; 2f
+ const SPRITE_ANIM_FRAMESET_CUT_TREE ; 30
+ const SPRITE_ANIM_FRAMESET_EGG_CRACK ; 31
+ const SPRITE_ANIM_FRAMESET_EGG_HATCH_1 ; 32
+ const SPRITE_ANIM_FRAMESET_EGG_HATCH_2 ; 33
+ const SPRITE_ANIM_FRAMESET_EGG_HATCH_3 ; 34
+ const SPRITE_ANIM_FRAMESET_EGG_HATCH_4 ; 35
+ const SPRITE_ANIM_FRAMESET_GS_INTRO_HO_OH_LUGIA ; 36
+ const SPRITE_ANIM_FRAMESET_HEADBUTT ; 37
; SpriteAnimOAMData indexes (see data/sprite_anims/oam.asm)
const_def
@@ -210,20 +261,9 @@ SPRITE_ANIM_SEQ_NULL EQU $00
const SPRITE_ANIM_OAMSET_CUT_TREE_4 ; 53
const SPRITE_ANIM_OAMSET_EGG_CRACK ; 54
const SPRITE_ANIM_OAMSET_EGG_HATCH ; 55
- const SPRITE_ANIM_OAMSET_GS_INTRO_HO_OH_1 ; 56
- const SPRITE_ANIM_OAMSET_GS_INTRO_HO_OH_2 ; 57
- const SPRITE_ANIM_OAMSET_GS_INTRO_HO_OH_3 ; 58
- const SPRITE_ANIM_OAMSET_GS_INTRO_HO_OH_4 ; 59
- const SPRITE_ANIM_OAMSET_GS_INTRO_HO_OH_5 ; 5a
+ const SPRITE_ANIM_OAMSET_GS_INTRO_HO_OH_LUGIA_1 ; 56
+ const SPRITE_ANIM_OAMSET_GS_INTRO_HO_OH_LUGIA_2 ; 57
+ const SPRITE_ANIM_OAMSET_GS_INTRO_HO_OH_LUGIA_3 ; 58
+ const SPRITE_ANIM_OAMSET_GS_INTRO_HO_OH_LUGIA_4 ; 59
+ const SPRITE_ANIM_OAMSET_GS_INTRO_HO_OH_LUGIA_5 ; 5a
const SPRITE_ANIM_OAMSET_HEADBUTT_TREE_2 ; 5b
- const SPRITE_ANIM_OAMSET_EZCHAT_CURSOR_1 ; 5c
- const SPRITE_ANIM_OAMSET_EZCHAT_CURSOR_2 ; 5d
- const SPRITE_ANIM_OAMSET_EZCHAT_CURSOR_3 ; 5e
- const SPRITE_ANIM_OAMSET_EZCHAT_CURSOR_4 ; 5f
- const SPRITE_ANIM_OAMSET_EZCHAT_CURSOR_5 ; 60
- const SPRITE_ANIM_OAMSET_EZCHAT_CURSOR_6 ; 61
- const SPRITE_ANIM_OAMSET_EZCHAT_CURSOR_7 ; 62
- const SPRITE_ANIM_OAMSET_BLUE_WALK_1 ; 63
- const SPRITE_ANIM_OAMSET_BLUE_WALK_2 ; 64
- const SPRITE_ANIM_OAMSET_MAGNET_TRAIN_BLUE_1 ; 65
- const SPRITE_ANIM_OAMSET_MAGNET_TRAIN_BLUE_2 ; 66
diff --git a/data/icon_pointers.asm b/data/icon_pointers.asm
new file mode 100755
index 00000000..bfe07abb
--- /dev/null
+++ b/data/icon_pointers.asm
@@ -0,0 +1,41 @@
+IconPointers:
+; entries correspond to ICON_* constants
+ dw NullIcon
+ dw PoliwagIcon
+ dw JigglypuffIcon
+ dw DiglettIcon
+ dw PikachuIcon
+ dw StaryuIcon
+ dw FishIcon
+ dw BirdIcon
+ dw MonsterIcon
+ dw ClefairyIcon
+ dw OddishIcon
+ dw BugIcon
+ dw GhostIcon
+ dw LaprasIcon
+ dw HumanshapeIcon
+ dw FoxIcon
+ dw EquineIcon
+ dw ShellIcon
+ dw BlobIcon
+ dw SerpentIcon
+ dw VoltorbIcon
+ dw SquirtleIcon
+ dw BulbasaurIcon
+ dw CharmanderIcon
+ dw CaterpillarIcon
+ dw UnownIcon
+ dw GeodudeIcon
+ dw FighterIcon
+ dw EggIcon
+ dw JellyfishIcon
+ dw MothIcon
+ dw BatIcon
+ dw SnorlaxIcon
+ dw HoOhIcon
+ dw LugiaIcon
+ dw GyaradosIcon
+ dw SlowpokeIcon
+ dw SudowoodoIcon
+ dw BigmonIcon
diff --git a/data/pokemon/menu_icons.asm b/data/pokemon/menu_icons.asm
new file mode 100755
index 00000000..f378cbfb
--- /dev/null
+++ b/data/pokemon/menu_icons.asm
@@ -0,0 +1,254 @@
+; party menu icons
+
+MonMenuIcons:
+ db ICON_BULBASAUR ; BULBASAUR
+ db ICON_BULBASAUR ; IVYSAUR
+ db ICON_BULBASAUR ; VENUSAUR
+ db ICON_CHARMANDER ; CHARMANDER
+ db ICON_CHARMANDER ; CHARMELEON
+ db ICON_BIGMON ; CHARIZARD
+ db ICON_SQUIRTLE ; SQUIRTLE
+ db ICON_SQUIRTLE ; WARTORTLE
+ db ICON_SQUIRTLE ; BLASTOISE
+ db ICON_CATERPILLAR ; CATERPIE
+ db ICON_CATERPILLAR ; METAPOD
+ db ICON_MOTH ; BUTTERFREE
+ db ICON_CATERPILLAR ; WEEDLE
+ db ICON_CATERPILLAR ; KAKUNA
+ db ICON_BUG ; BEEDRILL
+ db ICON_BIRD ; PIDGEY
+ db ICON_BIRD ; PIDGEOTTO
+ db ICON_BIRD ; PIDGEOT
+ db ICON_FOX ; RATTATA
+ db ICON_FOX ; RATICATE
+ db ICON_BIRD ; SPEAROW
+ db ICON_BIRD ; FEAROW
+ db ICON_SERPENT ; EKANS
+ db ICON_SERPENT ; ARBOK
+ db ICON_PIKACHU ; PIKACHU
+ db ICON_PIKACHU ; RAICHU
+ db ICON_MONSTER ; SANDSHREW
+ db ICON_MONSTER ; SANDSLASH
+ db ICON_FOX ; NIDORAN_F
+ db ICON_FOX ; NIDORINA
+ db ICON_MONSTER ; NIDOQUEEN
+ db ICON_FOX ; NIDORAN_M
+ db ICON_FOX ; NIDORINO
+ db ICON_MONSTER ; NIDOKING
+ db ICON_CLEFAIRY ; CLEFAIRY
+ db ICON_CLEFAIRY ; CLEFABLE
+ db ICON_FOX ; VULPIX
+ db ICON_FOX ; NINETALES
+ db ICON_JIGGLYPUFF ; JIGGLYPUFF
+ db ICON_JIGGLYPUFF ; WIGGLYTUFF
+ db ICON_BAT ; ZUBAT
+ db ICON_BAT ; GOLBAT
+ db ICON_ODDISH ; ODDISH
+ db ICON_ODDISH ; GLOOM
+ db ICON_ODDISH ; VILEPLUME
+ db ICON_BUG ; PARAS
+ db ICON_BUG ; PARASECT
+ db ICON_CATERPILLAR ; VENONAT
+ db ICON_MOTH ; VENOMOTH
+ db ICON_DIGLETT ; DIGLETT
+ db ICON_DIGLETT ; DUGTRIO
+ db ICON_FOX ; MEOWTH
+ db ICON_FOX ; PERSIAN
+ db ICON_MONSTER ; PSYDUCK
+ db ICON_MONSTER ; GOLDUCK
+ db ICON_FIGHTER ; MANKEY
+ db ICON_FIGHTER ; PRIMEAPE
+ db ICON_FOX ; GROWLITHE
+ db ICON_FOX ; ARCANINE
+ db ICON_POLIWAG ; POLIWAG
+ db ICON_POLIWAG ; POLIWHIRL
+ db ICON_POLIWAG ; POLIWRATH
+ db ICON_HUMANSHAPE ; ABRA
+ db ICON_HUMANSHAPE ; KADABRA
+ db ICON_HUMANSHAPE ; ALAKAZAM
+ db ICON_FIGHTER ; MACHOP
+ db ICON_FIGHTER ; MACHOKE
+ db ICON_FIGHTER ; MACHAMP
+ db ICON_ODDISH ; BELLSPROUT
+ db ICON_ODDISH ; WEEPINBELL
+ db ICON_ODDISH ; VICTREEBEL
+ db ICON_JELLYFISH ; TENTACOOL
+ db ICON_JELLYFISH ; TENTACRUEL
+ db ICON_GEODUDE ; GEODUDE
+ db ICON_GEODUDE ; GRAVELER
+ db ICON_GEODUDE ; GOLEM
+ db ICON_EQUINE ; PONYTA
+ db ICON_EQUINE ; RAPIDASH
+ db ICON_SLOWPOKE ; SLOWPOKE
+ db ICON_SLOWPOKE ; SLOWBRO
+ db ICON_VOLTORB ; MAGNEMITE
+ db ICON_VOLTORB ; MAGNETON
+ db ICON_BIRD ; FARFETCH_D
+ db ICON_BIRD ; DODUO
+ db ICON_BIRD ; DODRIO
+ db ICON_LAPRAS ; SEEL
+ db ICON_LAPRAS ; DEWGONG
+ db ICON_BLOB ; GRIMER
+ db ICON_BLOB ; MUK
+ db ICON_SHELL ; SHELLDER
+ db ICON_SHELL ; CLOYSTER
+ db ICON_GHOST ; GASTLY
+ db ICON_GHOST ; HAUNTER
+ db ICON_GHOST ; GENGAR
+ db ICON_SERPENT ; ONIX
+ db ICON_HUMANSHAPE ; DROWZEE
+ db ICON_HUMANSHAPE ; HYPNO
+ db ICON_SHELL ; KRABBY
+ db ICON_SHELL ; KINGLER
+ db ICON_VOLTORB ; VOLTORB
+ db ICON_VOLTORB ; ELECTRODE
+ db ICON_ODDISH ; EXEGGCUTE
+ db ICON_ODDISH ; EXEGGUTOR
+ db ICON_MONSTER ; CUBONE
+ db ICON_MONSTER ; MAROWAK
+ db ICON_FIGHTER ; HITMONLEE
+ db ICON_FIGHTER ; HITMONCHAN
+ db ICON_MONSTER ; LICKITUNG
+ db ICON_BLOB ; KOFFING
+ db ICON_BLOB ; WEEZING
+ db ICON_EQUINE ; RHYHORN
+ db ICON_MONSTER ; RHYDON
+ db ICON_CLEFAIRY ; CHANSEY
+ db ICON_ODDISH ; TANGELA
+ db ICON_MONSTER ; KANGASKHAN
+ db ICON_FISH ; HORSEA
+ db ICON_FISH ; SEADRA
+ db ICON_FISH ; GOLDEEN
+ db ICON_FISH ; SEAKING
+ db ICON_STARYU ; STARYU
+ db ICON_STARYU ; STARMIE
+ db ICON_HUMANSHAPE ; MR__MIME
+ db ICON_BUG ; SCYTHER
+ db ICON_HUMANSHAPE ; JYNX
+ db ICON_HUMANSHAPE ; ELECTABUZZ
+ db ICON_HUMANSHAPE ; MAGMAR
+ db ICON_BUG ; PINSIR
+ db ICON_EQUINE ; TAUROS
+ db ICON_FISH ; MAGIKARP
+ db ICON_GYARADOS ; GYARADOS
+ db ICON_LAPRAS ; LAPRAS
+ db ICON_BLOB ; DITTO
+ db ICON_FOX ; EEVEE
+ db ICON_FOX ; VAPOREON
+ db ICON_FOX ; JOLTEON
+ db ICON_FOX ; FLAREON
+ db ICON_VOLTORB ; PORYGON
+ db ICON_SHELL ; OMANYTE
+ db ICON_SHELL ; OMASTAR
+ db ICON_SHELL ; KABUTO
+ db ICON_SHELL ; KABUTOPS
+ db ICON_BIRD ; AERODACTYL
+ db ICON_SNORLAX ; SNORLAX
+ db ICON_BIRD ; ARTICUNO
+ db ICON_BIRD ; ZAPDOS
+ db ICON_BIRD ; MOLTRES
+ db ICON_SERPENT ; DRATINI
+ db ICON_SERPENT ; DRAGONAIR
+ db ICON_BIGMON ; DRAGONITE
+ db ICON_HUMANSHAPE ; MEWTWO
+ db ICON_HUMANSHAPE ; MEW
+ db ICON_ODDISH ; CHIKORITA
+ db ICON_ODDISH ; BAYLEEF
+ db ICON_ODDISH ; MEGANIUM
+ db ICON_FOX ; CYNDAQUIL
+ db ICON_FOX ; QUILAVA
+ db ICON_FOX ; TYPHLOSION
+ db ICON_MONSTER ; TOTODILE
+ db ICON_MONSTER ; CROCONAW
+ db ICON_MONSTER ; FERALIGATR
+ db ICON_FOX ; SENTRET
+ db ICON_FOX ; FURRET
+ db ICON_BIRD ; HOOTHOOT
+ db ICON_BIRD ; NOCTOWL
+ db ICON_BUG ; LEDYBA
+ db ICON_BUG ; LEDIAN
+ db ICON_BUG ; SPINARAK
+ db ICON_BUG ; ARIADOS
+ db ICON_BAT ; CROBAT
+ db ICON_FISH ; CHINCHOU
+ db ICON_FISH ; LANTURN
+ db ICON_PIKACHU ; PICHU
+ db ICON_CLEFAIRY ; CLEFFA
+ db ICON_JIGGLYPUFF ; IGGLYBUFF
+ db ICON_CLEFAIRY ; TOGEPI
+ db ICON_BIRD ; TOGETIC
+ db ICON_BIRD ; NATU
+ db ICON_BIRD ; XATU
+ db ICON_FOX ; MAREEP
+ db ICON_MONSTER ; FLAAFFY
+ db ICON_MONSTER ; AMPHAROS
+ db ICON_ODDISH ; BELLOSSOM
+ db ICON_JIGGLYPUFF ; MARILL
+ db ICON_JIGGLYPUFF ; AZUMARILL
+ db ICON_SUDOWOODO ; SUDOWOODO
+ db ICON_POLIWAG ; POLITOED
+ db ICON_ODDISH ; HOPPIP
+ db ICON_ODDISH ; SKIPLOOM
+ db ICON_ODDISH ; JUMPLUFF
+ db ICON_MONSTER ; AIPOM
+ db ICON_ODDISH ; SUNKERN
+ db ICON_ODDISH ; SUNFLORA
+ db ICON_BUG ; YANMA
+ db ICON_MONSTER ; WOOPER
+ db ICON_MONSTER ; QUAGSIRE
+ db ICON_FOX ; ESPEON
+ db ICON_FOX ; UMBREON
+ db ICON_BIRD ; MURKROW
+ db ICON_SLOWPOKE ; SLOWKING
+ db ICON_GHOST ; MISDREAVUS
+ db ICON_UNOWN ; UNOWN
+ db ICON_GHOST ; WOBBUFFET
+ db ICON_EQUINE ; GIRAFARIG
+ db ICON_BUG ; PINECO
+ db ICON_BUG ; FORRETRESS
+ db ICON_SERPENT ; DUNSPARCE
+ db ICON_BUG ; GLIGAR
+ db ICON_SERPENT ; STEELIX
+ db ICON_MONSTER ; SNUBBULL
+ db ICON_MONSTER ; GRANBULL
+ db ICON_FISH ; QWILFISH
+ db ICON_BUG ; SCIZOR
+ db ICON_BUG ; SHUCKLE
+ db ICON_BUG ; HERACROSS
+ db ICON_FOX ; SNEASEL
+ db ICON_MONSTER ; TEDDIURSA
+ db ICON_MONSTER ; URSARING
+ db ICON_BLOB ; SLUGMA
+ db ICON_BLOB ; MAGCARGO
+ db ICON_EQUINE ; SWINUB
+ db ICON_EQUINE ; PILOSWINE
+ db ICON_SHELL ; CORSOLA
+ db ICON_FISH ; REMORAID
+ db ICON_FISH ; OCTILLERY
+ db ICON_MONSTER ; DELIBIRD
+ db ICON_FISH ; MANTINE
+ db ICON_BIRD ; SKARMORY
+ db ICON_FOX ; HOUNDOUR
+ db ICON_FOX ; HOUNDOOM
+ db ICON_BIGMON ; KINGDRA
+ db ICON_EQUINE ; PHANPY
+ db ICON_EQUINE ; DONPHAN
+ db ICON_VOLTORB ; PORYGON2
+ db ICON_EQUINE ; STANTLER
+ db ICON_MONSTER ; SMEARGLE
+ db ICON_FIGHTER ; TYROGUE
+ db ICON_FIGHTER ; HITMONTOP
+ db ICON_HUMANSHAPE ; SMOOCHUM
+ db ICON_HUMANSHAPE ; ELEKID
+ db ICON_HUMANSHAPE ; MAGBY
+ db ICON_EQUINE ; MILTANK
+ db ICON_CLEFAIRY ; BLISSEY
+ db ICON_FOX ; RAIKOU
+ db ICON_FOX ; ENTEI
+ db ICON_FOX ; SUICUNE
+ db ICON_MONSTER ; LARVITAR
+ db ICON_MONSTER ; PUPITAR
+ db ICON_MONSTER ; TYRANITAR
+ db ICON_LUGIA ; LUGIA
+ db ICON_HO_OH ; HO_OH
+ db ICON_HUMANSHAPE ; CELEBI
diff --git a/data/sprite_anims/framesets.asm b/data/sprite_anims/framesets.asm
index e53b1c47..0f05fdda 100755
--- a/data/sprite_anims/framesets.asm
+++ b/data/sprite_anims/framesets.asm
@@ -1,1038 +1,402 @@
-AnimatedObjectFrameData: ; 8dbfe
- dw .data_8dc6e
- dw .data_8dc71
- dw .data_8dc76
- dw .data_8dc7b
- dw .data_8dc89
- dw .data_8dc8e
- dw .data_8dc93
- dw .data_8dc98
- dw .data_8dc9b
- dw .data_8dca4
- dw .data_8dca7
- dw .data_8dcaa
- dw .data_8dcb3
- dw .data_8dcb6
- dw .data_8dcbd
- dw .data_8dcc0
- dw .data_8dcc3
- dw .data_8dccc
- dw .data_8dccf
- dw .data_8dcd6
- dw .data_8dcd9
- dw .data_8dcdc
- dw .data_8dcdf
- dw .data_8dcb6
- dw .data_8dcbd
- dw .data_8dce4
- dw .data_8dceb
- dw .data_8dcf0
- dw .data_8dcf5
- dw .data_8dcf8
- dw .data_8dcfd
- dw .data_8dd06
- dw .data_8dd0f
- dw .data_8dd18
- dw .data_8dd23
- dw .data_8dc80
- dw .data_8dd26
- dw .data_8dd29
- dw .data_8dd2c
- dw .data_8dd35
- dw .data_8dd3c
- dw .data_8dd41
- dw .data_8dd46
- dw .data_8dd49
- dw .data_8dd50
- dw .data_8dd53
- dw .data_8dd85
- dw .data_8dd88
- dw .data_8dd8b
- dw .data_8dd98
- dw .data_8dd9b
- dw .data_8dd9e
- dw .data_8dda1
- dw .data_8dda4
- dw .data_8dda7
- dw .data_8ddb4
-
-.data_8dc6e ; 8dc6e
- db $00,$20
- db $ff
-
-.data_8dc71 ; 8dc71
- db $00,$08, $01,$08
- db $fe
-
-.data_8dc76 ; 8dc76
- db $3d,$08, $3e,$08
- db $fe
-
-.data_8dc7b ; 8dc7b
- db $3f,$08, $40,$08
- db $fe
-
-.data_8dc80 ; 8dc80
- db $00,$08, $01,$08, $00,$08, $01,$48
- db $fe
-
-.data_8dc89 ; 8dc89
- db $02,$08, $03,$08
- db $fe
-
-.data_8dc8e ; 8dc8e
- db $04,$08, $05,$08
- db $fe
-
-.data_8dc93 ; 8dc93
- db $06,$41, $07,$41
- db $fe
-
-.data_8dc98 ; 8dc98
- db $08,$47
- db $ff
-
-.data_8dc9b ; 8dc9b
- db $09,$07, $0a,$07, $0b,$07, $09,$07
- db $fe
-
-.data_8dca4 ; 8dca4
- db $0c,$08
- db $ff
-
-.data_8dca7 ; 8dca7
- db $0d,$08
- db $ff
-
-.data_8dcaa ; 8dcaa
- db $0e,$59, $10,$09, $0e,$19, $10,$09
- db $fe
-
-.data_8dcb3 ; 8dcb3
- db $0f,$20
- db $ff
-
-.data_8dcb6 ; 8dcb6
- db $11,$04, $12,$05, $14,$04
- db $fe
-
-.data_8dcbd ; 8dcbd
- db $12,$08
- db $ff
-
-.data_8dcc0 ; 8dcc0
- db $13,$20
- db $ff
-
-.data_8dcc3 ; 8dcc3
- db $15,$03, $16,$03, $17,$03, $16,$03
- db $fe
-
-.data_8dccc ; 8dccc
- db $15,$1f
- db $ff
-
-.data_8dccf ; 8dccf
- db $18,$01, $19,$01, $1a,$01
- db $fc
-
-.data_8dcd6 ; 8dcd6
- db $1b,$18
- db $fc
-
-.data_8dcd9 ; 8dcd9
- db $1c,$58
- db $fc
-
-.data_8dcdc ; 8dcdc
- db $1d,$18
- db $fc
-
-.data_8dcdf ; 8dcdf
- db $1e,$01, $1f,$01
- db $fe
-
-.data_8dce4 ; 8dce4
- db $12,$00, $13,$0f, $14,$0f
- db $ff
-
-.data_8dceb ; 8dceb
- db $20,$01, $fd,$01
- db $fe
-
-.data_8dcf0 ; 8dcf0
- db $21,$01, $fd,$01
- db $fe
-
-.data_8dcf5 ; 8dcf5
- db $22,$08
- db $ff
-
-.data_8dcf8 ; 8dcf8
- db $23,$03, $23,$83
- db $fe
-
-.data_8dcfd ; 8dcfd
- db $24,$02, $25,$02, $26,$02, $25,$02
- db $fe
-
-.data_8dd06 ; 8dd06
- db $27,$07, $28,$07, $27,$87, $28,$47
- db $fe
-
-.data_8dd0f ; 8dd0f
- db $29,$07, $2a,$07, $29,$07, $2b,$07
- db $fe
-
-.data_8dd18 ; 8dd18
- db $29,$07, $2c,$07, $2d,$07, $2c,$07, $29,$07
- db $ff
-
-.data_8dd23 ; 8dd23
- db $2e,$14
- db $ff
-
-.data_8dd26 ; 8dd26
- db $2f,$20
- db $ff
-
-.data_8dd29 ; 8dd29
- db $30,$20
- db $ff
-
-.data_8dd2c ; 8dd2c
- db $30,$03, $31,$03, $30,$03, $31,$43
- db $fe
-
-.data_8dd35 ; 8dd35
- db $32,$04, $33,$04, $34,$04
- db $fc
-
-.data_8dd3c ; 8dd3c
- db $35,$03, $36,$03
- db $fe
-
-.data_8dd41 ; 8dd41
- db $37,$07, $38,$07
- db $fe
-
-.data_8dd46 ; 8dd46
- db $39,$20
- db $ff
-
-.data_8dd49 ; 8dd49
- db $3b,$02, $3a,$02, $3b,$02
- db $ff
-
-.data_8dd50 ; 8dd50
- db $3c,$20
- db $ff
-
-.data_8dd53 ; 8dd53
- db $41,$08, $42,$08, $41,$08, $42,$48
- db $fe
-
-; --- BEGIN UNUSED BLOCK ---
-.data_8dd5c ; 8dd5c
- db $43,$08, $44,$08
- db $fe
-
-.data_8dd61 ; 8dd61
- db $45,$08, $46,$08
- db $fe
-
-.data_8dd66 ; 8dd66
- db $47,$08, $48,$08
- db $fe
-
-.data_8dd6b ; 8dd6b
- db $49,$01, $49,$41, $49,$c1, $49,$81
- db $fe
-
-.data_8dd74 ; 8dd74
- db $4a,$20
- db $ff
-
-.data_8dd77 ; 8dd77
- db $4b,$20
- db $ff
-
-.data_8dd7a ; 8dd7a
- db $4c,$20
- db $ff
-
-.data_8dd7d ; 8dd7d
- db $4d,$20
- db $ff
-
-.data_8dd80 ; 8dd80
- db $4e,$03, $fd,$03
- db $fe
-; --- END UNUSED BLOCK ;;;
-
-.data_8dd85 ; 8dd85
- db $fd,$20
- db $ff
-
-.data_8dd88 ; 8dd88
- db $4f,$20
- db $ff
-
-.data_8dd8b ; 8dd8b
- db $50,$02, $51,$10, $fd,$01, $52,$01, $fd,$01, $53,$01
- db $fc
-
-.data_8dd98 ; 8dd98
- db $54,$20
- db $ff
-
-.data_8dd9b ; 8dd9b
- db $55,$20
- db $ff
-
-.data_8dd9e ; 8dd9e
- db $55,$60
- db $ff
-
-.data_8dda1 ; 8dda1
- db $55,$a0
- db $ff
-
-.data_8dda4 ; 8dda4
- db $55,$e0
- db $ff
-
-.data_8dda7 ; 8dda7
- db $56,$0a, $57,$09, $58,$0a, $59,$0a, $58,$09, $5a,$0a
- db $fe
-
-.data_8ddb4 ; 8ddb4
- db $50,$02, $5b,$02, $50,$02, $5b,$42
- db $fe
-
-AnimatedObjectOAMData: ; 8ddbc
- dbw $00, .data_8e16a
- dbw $04, .data_8e16a
- dbw $4c, .data_8ded1
- dbw $5c, .data_8ded1
- dbw $6c, .data_8ded6
- dbw $6e, .data_8ded6
- dbw $2d, .data_8e1d0
- dbw $4d, .data_8e1d0
- dbw $60, .data_8e1e9
- dbw $00, .data_8e212
- dbw $00, .data_8e27f
- dbw $06, .data_8e2ec
- dbw $0c, .data_8e361
- dbw $0d, .data_8ded1
- dbw $00, .data_8e033
- dbw $04, .data_8e033
- dbw $08, .data_8e033
- dbw $40, .data_8e033
- dbw $44, .data_8e033
- dbw $48, .data_8e033
- dbw $4c, .data_8e033
- dbw $80, .data_8e36a
- dbw $85, .data_8e36a
- dbw $8a, .data_8e36a
- dbw $00, .data_8df09
- dbw $01, .data_8df3c
- dbw $09, .data_8df7d
- dbw $10, .data_8e074
- dbw $29, .data_8e074
- dbw $42, .data_8e074
- dbw $f8, .data_8e661
- dbw $fa, .data_8e661
- dbw $00, .data_8e395
- dbw $00, .data_8e3a6
- dbw $00, .data_8e3cf
- dbw $0f, .data_8dee7
- dbw $11, .data_8ded1
- dbw $12, .data_8ded1
- dbw $13, .data_8ded1
- dbw $00, .data_8e40c
- dbw $08, .data_8e40c
- dbw $10, .data_8e425
- dbw $10, .data_8e43e
- dbw $10, .data_8e457
- dbw $10, .data_8e470
- dbw $10, .data_8e489
- dbw $3a, .data_8ded1
- dbw $00, .data_8e16a
- dbw $00, .data_8def8
- dbw $02, .data_8e17b
- dbw $06, .data_8df3c
- dbw $0a, .data_8df3c
- dbw $0e, .data_8df3c
- dbw $12, .data_8df1a
- dbw $13, .data_8df1a
- dbw $00, .data_8e16a
- dbw $04, .data_8e16a
- dbw $10, .data_8df3c
- dbw $00, .data_8e17b
- dbw $04, .data_8ded1
- dbw $00, .data_8e4a2
- dbw $00, .data_8e18c
- dbw $00, .data_8e19d
- dbw $00, .data_8e1ae
- dbw $00, .data_8e1bf
- dbw $00, .data_8e17b
- dbw $04, .data_8e17b
- dbw $00, .data_8e00e
- dbw $30, .data_8e00e
- dbw $03, .data_8e00e
- dbw $33, .data_8e00e
- dbw $06, .data_8e00e
- dbw $36, .data_8e00e
- dbw $09, .data_8e00e
- dbw $39, .data_8e00e
- dbw $0c, .data_8e4af
- dbw $0c, .data_8e4c8
- dbw $3c, .data_8ded1
- dbw $3e, .data_8ded1
- dbw $00, .data_8e37f
- dbw $00, .data_8e384
- dbw $00, .data_8e4d9
- dbw $00, .data_8e4ea
- dbw $00, .data_8e4fb
- dbw $00, .data_8ded1
- dbw $01, .data_8ded1
- dbw $00, .data_8e50c
- dbw $00, .data_8e559
- dbw $00, .data_8e59a
- dbw $00, .data_8e5d7
- dbw $00, .data_8e61c
- dbw $04, .data_8e384
-
-; 23:5ed1
-.data_8ded1 ; 8ded1
- db $01
- db $fc, $fc, $00, $00
-
-.data_8ded6 ; 8ded6
- db $04
- db $f8, $f8, $00, $00
- db $f8, $00, $01, $00
- db $00, $f8, $10, $00
- db $00, $00, $11, $00
-
-.data_8dee7 ; 8dee7
- db $04
- db $f8, $f8, $00, $00
- db $f8, $00, $00, $20
- db $00, $f8, $01, $00
- db $00, $00, $01, $20
-
-.data_8def8 ; 8def8
- db $04
- db $f8, $f8, $00, $80
- db $f8, $00, $00, $a0
- db $00, $f8, $01, $80
- db $00, $00, $01, $a0
-
-.data_8df09 ; 8df09
- db $04
- db $f8, $f8, $00, $00
- db $f8, $00, $00, $20
- db $00, $f8, $00, $40
- db $00, $00, $00, $60
-
-.data_8df1a ; 8df1a
- db $04
- db $f8, $f8, $00, $07
- db $f8, $00, $00, $27
- db $00, $f8, $00, $47
- db $00, $00, $00, $67
-
-.data_8df2b ; 8df2b
- db $04
- db $f8, $f8, $00, $80
- db $f8, $00, $00, $a0
- db $00, $f8, $00, $c0
- db $00, $00, $00, $e0
-
-.data_8df3c ; 8df3c
- db $10
- db $f0, $f0, $00, $00
- db $f0, $f8, $01, $00
- db $f8, $f0, $02, $00
- db $f8, $f8, $03, $00
- db $f0, $00, $01, $20
- db $f0, $08, $00, $20
- db $f8, $00, $03, $20
- db $f8, $08, $02, $20
- db $00, $f0, $02, $40
- db $00, $f8, $03, $40
- db $08, $f0, $00, $40
- db $08, $f8, $01, $40
- db $00, $00, $03, $60
- db $00, $08, $02, $60
- db $08, $00, $01, $60
- db $08, $08, $00, $60
-
-.data_8df7d ; 8df7d
- db $24
- db $e8, $e8, $00, $00
- db $e8, $f0, $01, $00
- db $e8, $f8, $02, $00
- db $f0, $e8, $03, $00
- db $f0, $f0, $04, $00
- db $f0, $f8, $05, $00
- db $f8, $e8, $06, $00
- db $f8, $f0, $05, $00
- db $f8, $f8, $05, $00
- db $e8, $00, $02, $20
- db $e8, $08, $01, $20
- db $e8, $10, $00, $20
- db $f0, $00, $05, $20
- db $f0, $08, $04, $20
- db $f0, $10, $03, $20
- db $f8, $00, $05, $20
- db $f8, $08, $05, $20
- db $f8, $10, $06, $20
- db $00, $e8, $06, $40
- db $00, $f0, $05, $40
- db $00, $f8, $05, $40
- db $08, $e8, $03, $40
- db $08, $f0, $04, $40
- db $08, $f8, $05, $40
- db $10, $e8, $00, $40
- db $10, $f0, $01, $40
- db $10, $f8, $02, $40
- db $00, $00, $05, $60
- db $00, $08, $05, $60
- db $00, $10, $06, $60
- db $08, $00, $05, $60
- db $08, $08, $04, $60
- db $08, $10, $03, $60
- db $10, $00, $02, $60
- db $10, $08, $01, $60
- db $10, $10, $00, $60
-
-.data_8e00e ; 8e00e
- db $09
- db $f4, $f4, $00, $00
- db $f4, $fc, $01, $00
- db $f4, $04, $02, $00
- db $fc, $f4, $10, $00
- db $fc, $fc, $11, $00
- db $fc, $04, $12, $00
- db $04, $f4, $20, $00
- db $04, $fc, $21, $00
- db $04, $04, $22, $00
-
-.data_8e033 ; 8e033
- db $10
- db $f0, $f0, $00, $00
- db $f0, $f8, $01, $00
- db $f0, $00, $02, $00
- db $f0, $08, $03, $00
- db $f8, $f0, $10, $00
- db $f8, $f8, $11, $00
- db $f8, $00, $12, $00
- db $f8, $08, $13, $00
- db $00, $f0, $20, $00
- db $00, $f8, $21, $00
- db $00, $00, $22, $00
- db $00, $08, $23, $00
- db $08, $f0, $30, $00
- db $08, $f8, $31, $00
- db $08, $00, $32, $00
- db $08, $08, $33, $00
-
-.data_8e074 ; 8e074
- db $19
- db $ec, $ec, $00, $00
- db $f4, $ec, $01, $00
- db $fc, $ec, $02, $00
- db $04, $ec, $03, $00
- db $0c, $ec, $04, $00
- db $ec, $f4, $05, $00
- db $f4, $f4, $06, $00
- db $fc, $f4, $07, $00
- db $04, $f4, $08, $00
- db $0c, $f4, $09, $00
- db $ec, $fc, $0a, $00
- db $f4, $fc, $0b, $00
- db $fc, $fc, $0c, $00
- db $04, $fc, $0d, $00
- db $0c, $fc, $0e, $00
- db $ec, $04, $0f, $00
- db $f4, $04, $10, $00
- db $fc, $04, $11, $00
- db $04, $04, $12, $00
- db $0c, $04, $13, $00
- db $ec, $0c, $14, $00
- db $f4, $0c, $15, $00
- db $fc, $0c, $16, $00
- db $04, $0c, $17, $00
- db $0c, $0c, $18, $00
-
-.data_8e0d9 ; unreferenced
- db $24
- db $e8, $e8, $00, $00
- db $e8, $f0, $01, $00
- db $e8, $f8, $02, $00
- db $e8, $00, $03, $00
- db $e8, $08, $04, $00
- db $e8, $10, $05, $00
- db $f0, $e8, $06, $00
- db $f0, $f0, $07, $00
- db $f0, $f8, $08, $00
- db $f0, $00, $09, $00
- db $f0, $08, $0a, $00
- db $f0, $10, $0b, $00
- db $f8, $e8, $0c, $00
- db $f8, $f0, $0d, $00
- db $f8, $f8, $0e, $00
- db $f8, $00, $0f, $00
- db $f8, $08, $10, $00
- db $f8, $10, $11, $00
- db $00, $e8, $12, $00
- db $00, $f0, $13, $00
- db $00, $f8, $14, $00
- db $00, $00, $15, $00
- db $00, $08, $16, $00
- db $00, $10, $17, $00
- db $08, $e8, $18, $00
- db $08, $f0, $19, $00
- db $08, $f8, $1a, $00
- db $08, $00, $1b, $00
- db $08, $08, $1c, $00
- db $08, $10, $1d, $00
- db $10, $e8, $1e, $00
- db $10, $f0, $1f, $00
- db $10, $f8, $20, $00
- db $10, $00, $21, $00
- db $10, $08, $22, $00
- db $10, $10, $23, $00
-
-.data_8e16a ; 8e16a
- db $04
- db $f8, $f8, $00, $00
- db $f8, $00, $01, $00
- db $00, $f8, $02, $00
- db $00, $00, $03, $00
-
-.data_8e17b ; 8e17b
- db $04
- db $f8, $f8, $00, $80
- db $f8, $00, $01, $80
- db $00, $f8, $02, $80
- db $00, $00, $03, $80
-
-.data_8e18c ; 8e18c
- db $04
- db $f8, $f8, $00, $00
- db $f8, $00, $01, $00
- db $00, $f8, $08, $00
- db $00, $00, $03, $00
-
-.data_8e19d ; 8e19d
- db $04
- db $f8, $f8, $04, $00
- db $f8, $00, $05, $00
- db $00, $f8, $08, $00
- db $00, $00, $07, $00
-
-.data_8e1ae ; 8e1ae
- db $04
- db $f8, $f8, $00, $00
- db $f8, $00, $01, $00
- db $00, $f8, $09, $00
- db $00, $00, $03, $00
-
-.data_8e1bf ; 8e1bf
- db $04
- db $f8, $f8, $04, $00
- db $f8, $00, $05, $00
- db $00, $f8, $09, $00
- db $00, $00, $07, $00
-
-.data_8e1d0 ; 8e1d0
- db $06
- db $f8, $f4, $00, $01
- db $f8, $fc, $01, $01
- db $f8, $04, $02, $01
- db $00, $f4, $10, $01
- db $00, $fc, $11, $01
- db $00, $04, $12, $01
-
-.data_8e1e9 ; 8e1e9
- db $0a
- db $f4, $f0, $00, $00
- db $f4, $f8, $01, $00
- db $f4, $00, $02, $00
- db $f4, $08, $03, $00
- db $fc, $f0, $04, $00
- db $fc, $f8, $05, $00
- db $fc, $00, $06, $00
- db $04, $f0, $08, $00
- db $04, $f8, $09, $00
- db $04, $00, $0a, $00
-
-.data_8e212 ; 8e212
- db $1b
- db $e8, $e8, $00, $00
- db $e8, $f0, $01, $00
- db $e8, $f8, $02, $00
- db $f0, $e8, $10, $00
- db $f0, $f0, $11, $00
- db $f0, $f8, $12, $00
- db $f8, $e8, $20, $00
- db $f8, $f0, $21, $00
- db $f8, $f8, $22, $00
- db $f8, $00, $23, $00
- db $00, $e8, $30, $80
- db $00, $f0, $31, $80
- db $00, $f8, $32, $80
- db $00, $00, $33, $80
- db $00, $08, $34, $80
- db $08, $e8, $40, $80
- db $08, $f0, $41, $80
- db $08, $f8, $42, $80
- db $08, $00, $43, $80
- db $08, $08, $44, $80
- db $08, $10, $45, $80
- db $10, $e8, $50, $80
- db $10, $f0, $51, $80
- db $10, $f8, $52, $80
- db $10, $00, $53, $80
- db $10, $08, $54, $80
- db $10, $10, $55, $80
-
-.data_8e27f ; 8e27f
- db $1b
- db $e8, $e8, $0d, $00
- db $e8, $f0, $0e, $00
- db $e8, $f8, $0f, $00
- db $f0, $e8, $1d, $00
- db $f0, $f0, $1e, $00
- db $f0, $f8, $1f, $00
- db $f8, $e8, $20, $00
- db $f8, $f0, $21, $00
- db $f8, $f8, $22, $00
- db $f8, $00, $23, $00
- db $00, $e8, $30, $80
- db $00, $f0, $31, $80
- db $00, $f8, $32, $80
- db $00, $00, $33, $80
- db $00, $08, $34, $80
- db $08, $e8, $40, $80
- db $08, $f0, $41, $80
- db $08, $f8, $42, $80
- db $08, $00, $43, $80
- db $08, $08, $44, $80
- db $08, $10, $45, $80
- db $10, $e8, $50, $80
- db $10, $f0, $51, $80
- db $10, $f8, $52, $80
- db $10, $00, $53, $80
- db $10, $08, $54, $80
- db $10, $10, $55, $80
-
-.data_8e2ec ; 8e2ec
- db $1d
- db $e8, $e8, $00, $00
- db $e8, $f0, $01, $00
- db $e8, $f8, $02, $00
- db $e8, $00, $03, $00
- db $f0, $e8, $10, $00
- db $f0, $f0, $11, $00
- db $f0, $f8, $12, $00
- db $f0, $00, $13, $00
- db $f8, $e8, $20, $00
- db $f8, $f0, $21, $00
- db $f8, $f8, $22, $00
- db $f8, $00, $23, $00
- db $f8, $08, $24, $00
- db $00, $e8, $30, $80
- db $00, $f0, $31, $80
- db $00, $f8, $32, $80
- db $00, $00, $33, $80
- db $00, $08, $34, $80
- db $08, $e8, $40, $80
- db $08, $f0, $41, $80
- db $08, $f8, $42, $80
- db $08, $00, $43, $80
- db $08, $08, $44, $80
- db $08, $10, $45, $80
- db $10, $f0, $51, $80
- db $10, $f8, $52, $80
- db $10, $00, $53, $80
- db $10, $08, $54, $80
- db $10, $10, $55, $80
-
-.data_8e361 ; 8e361
- db $02
- db $f8, $fc, $00, $00
- db $00, $fc, $10, $00
-
-.data_8e36a ; 8e36a
- db $05
- db $f0, $18, $00, $00
- db $f0, $20, $01, $00
- db $f8, $10, $02, $00
- db $f8, $18, $03, $00
- db $00, $10, $04, $00
-
-.data_8e37f ; 8e37f
- db $01
- db $fc, $fc, $00, $06
-
-.data_8e384 ; 8e384
- db $04
- db $f8, $f8, $00, $06
- db $f8, $00, $01, $06
- db $00, $f8, $02, $06
- db $00, $00, $03, $06
-
-.data_8e395 ; 8e395
- db $04
- db $ff, $ff, $00, $00
- db $ff, $00, $00, $20
- db $00, $ff, $00, $40
- db $00, $00, $00, $60
-
-.data_8e3a6 ; 8e3a6
- db $0a
- db $ff, $00, $00, $00
- db $ff, $08, $01, $00
- db $ff, $10, $01, $00
- db $ff, $18, $01, $00
- db $ff, $20, $00, $20
- db $00, $00, $00, $40
- db $00, $08, $01, $40
- db $00, $10, $01, $40
- db $00, $18, $01, $40
- db $00, $20, $00, $60
-
-.data_8e3cf ; 8e3cf
- db $0f
- db $ec, $f4, $00, $11
- db $ec, $fc, $01, $11
- db $ec, $04, $02, $11
- db $f4, $f4, $03, $11
- db $f4, $fc, $04, $11
- db $f4, $04, $05, $11
- db $fc, $f4, $06, $11
- db $fc, $fc, $07, $11
- db $fc, $04, $08, $11
- db $04, $f4, $09, $11
- db $04, $fc, $0a, $11
- db $04, $04, $0b, $11
- db $0c, $f4, $0c, $11
- db $0c, $fc, $0d, $11
- db $0c, $04, $0e, $11
-
-.data_8e40c ; 8e40c
- db $06
- db $f4, $f4, $00, $15
- db $f4, $fc, $02, $15
- db $f4, $04, $00, $35
- db $04, $f4, $04, $15
- db $04, $fc, $06, $15
- db $04, $04, $04, $35
-
-.data_8e425 ; 8e425
- db $06
- db $f4, $f4, $00, $16
- db $f4, $fc, $02, $16
- db $f4, $04, $04, $16
- db $04, $f4, $06, $16
- db $04, $fc, $08, $16
- db $04, $04, $0a, $16
-
-.data_8e43e ; 8e43e
- db $06
- db $f4, $f4, $00, $16
- db $f4, $fc, $02, $16
- db $f4, $04, $04, $16
- db $04, $f4, $0c, $16
- db $04, $fc, $0e, $16
- db $04, $04, $10, $16
-
-.data_8e457 ; 8e457
- db $06
- db $f4, $f4, $00, $16
- db $f4, $fc, $02, $16
- db $f4, $04, $04, $16
- db $04, $f4, $12, $16
- db $04, $fc, $14, $16
- db $04, $04, $16, $16
-
-.data_8e470 ; 8e470
- db $06
- db $f4, $f4, $00, $16
- db $f4, $fc, $02, $16
- db $f4, $04, $04, $16
- db $04, $f4, $18, $16
- db $04, $fc, $1a, $16
- db $04, $04, $1c, $16
-
-.data_8e489 ; 8e489
- db $06
- db $f4, $f4, $1e, $16
- db $f4, $fc, $20, $16
- db $f4, $04, $22, $16
- db $04, $f4, $24, $16
- db $04, $fc, $26, $16
- db $04, $04, $28, $16
-
-.data_8e4a2 ; 8e4a2
- db $03
- db $f4, $fc, $00, $10
- db $fc, $fc, $00, $10
- db $04, $fc, $00, $10
-
-.data_8e4af ; 8e4af
- db $06
- db $00, $00, $00, $00
- db $00, $08, $01, $00
- db $00, $10, $01, $00
- db $00, $18, $01, $00
- db $00, $20, $02, $00
- db $00, $28, $03, $00
-
-.data_8e4c8 ; 8e4c8
- db $04
- db $00, $00, $00, $00
- db $00, $08, $01, $00
- db $00, $10, $02, $00
- db $00, $18, $03, $00
-
-.data_8e4d9 ; 8e4d9
- db $04
- db $f8, $f6, $00, $06
- db $f8, $02, $01, $06
- db $00, $f6, $02, $06
- db $00, $02, $03, $06
-
-.data_8e4ea ; 8e4ea
- db $04
- db $f8, $f4, $00, $06
- db $f8, $04, $01, $06
- db $00, $f4, $02, $06
- db $00, $04, $03, $06
-
-.data_8e4fb ; 8e4fb
- db $04
- db $f8, $f0, $00, $06
- db $f8, $08, $01, $06
- db $00, $f0, $02, $06
- db $00, $08, $03, $06
-
-.data_8e50c ; 8e50c
- db $13
- db $f8, $e0, $00, $00
- db $f0, $e8, $02, $00
- db $00, $e8, $04, $00
- db $e8, $f0, $06, $00
- db $f8, $f0, $08, $00
- db $08, $f0, $0a, $00
- db $e8, $f8, $0c, $00
- db $f8, $f8, $0e, $00
- db $08, $f8, $10, $00
- db $e8, $00, $12, $00
- db $f8, $00, $14, $00
- db $08, $00, $16, $00
- db $e8, $08, $18, $00
- db $f8, $08, $1a, $00
- db $08, $08, $1c, $00
- db $f8, $10, $1e, $00
- db $08, $10, $20, $00
- db $f0, $18, $22, $00
- db $00, $18, $24, $00
-
-.data_8e559 ; 8e559
- db $10
- db $f8, $e0, $00, $00
- db $f0, $e8, $02, $00
- db $00, $e8, $04, $00
- db $f8, $f0, $26, $00
- db $08, $f0, $0a, $00
- db $e8, $f8, $28, $00
- db $f8, $f8, $2a, $00
- db $08, $f8, $10, $00
- db $f8, $00, $2c, $00
- db $08, $00, $16, $00
- db $f8, $08, $30, $00
- db $08, $08, $1c, $00
- db $f8, $10, $1e, $00
- db $08, $10, $20, $00
- db $f0, $18, $22, $00
- db $00, $18, $24, $00
-
-.data_8e59a ; 8e59a
- db $0f
- db $f8, $e0, $00, $00
- db $f0, $e8, $02, $00
- db $00, $e8, $32, $00
- db $f8, $f0, $34, $00
- db $08, $f0, $36, $00
- db $f8, $f8, $38, $00
- db $08, $f8, $3a, $00
- db $f8, $00, $3c, $00
- db $08, $00, $3e, $00
- db $f8, $08, $30, $00
- db $08, $08, $1c, $00
- db $f8, $10, $1e, $00
- db $08, $10, $20, $00
- db $f0, $18, $22, $00
- db $00, $18, $24, $00
-
-.data_8e5d7 ; 8e5d7
- db $11
- db $f8, $e0, $00, $00
- db $f0, $e8, $02, $00
- db $00, $e8, $04, $00
- db $f8, $f0, $40, $00
- db $08, $f0, $42, $00
- db $18, $f0, $44, $00
- db $f8, $f8, $46, $00
- db $08, $f8, $48, $00
- db $18, $f8, $4a, $00
- db $f8, $00, $4c, $00
- db $08, $00, $4e, $00
- db $f8, $08, $30, $00
- db $08, $08, $1c, $00
- db $f8, $10, $1e, $00
- db $08, $10, $20, $00
- db $f0, $18, $22, $00
- db $00, $18, $24, $00
-
-.data_8e61c ; 8e61c
- db $11
- db $f8, $e0, $00, $00
- db $f0, $e8, $02, $00
- db $00, $e8, $04, $00
- db $f8, $f0, $50, $00
- db $08, $f0, $0a, $00
- db $e8, $f8, $52, $00
- db $f8, $f8, $54, $00
- db $08, $f8, $10, $00
- db $e8, $00, $56, $00
- db $f8, $00, $2e, $00
- db $08, $00, $16, $00
- db $f8, $08, $30, $00
- db $08, $08, $1c, $00
- db $f8, $10, $1e, $00
- db $08, $10, $20, $00
- db $f0, $18, $22, $00
- db $00, $18, $24, $00
-
-.data_8e661 ; 8e661
- db $01
- db $fc, $fc, $00, $11
-
-BrokenStdGFXPointers: ; 23:6666
- dbbw $80, $01, .deleted
- dbbw $80, $01, .deleted
- dbbw $80, $01, .deleted
- dbbw $80, $01, .deleted
- dbbw $10, $37, .deleted
- dbbw $10, $11, .deleted
- dbbw $10, $39, .deleted
- dbbw $10, $24, .deleted
- dbbw $10, $21, .deleted
-.deleted
+SpriteAnimFrameData:
+; entries correspond to SPRITE_ANIM_FRAMESET_* constants
+ dw .Frameset_00
+ dw .Frameset_PartyMon
+ dw .Frameset_PartyMonWithMail
+ dw .Frameset_PartyMonWithItem
+ dw .Frameset_GSIntroBubble
+ dw .Frameset_GSIntroShellder
+ dw .Frameset_GSIntroMagikarp
+ dw .Frameset_GSIntroLapras
+ dw .Frameset_GSIntroLapras2
+ dw .Frameset_GSIntroNote
+ dw .Frameset_GSIntroInvisibleNote
+ dw .Frameset_GSIntroJigglypuff
+ dw .Frameset_GSIntroJigglypuff2
+ dw .Frameset_GSIntroPikachu
+ dw .Frameset_GSIntroPikachu2
+ dw .Frameset_GSIntroPikachu3
+ dw .Frameset_GSIntroPikachuTail
+ dw .Frameset_GSIntroPikachuTail2
+ dw .Frameset_GSIntroFireball
+ dw .Frameset_GSIntroChikorita
+ dw .Frameset_GSIntroCyndaquil
+ dw .Frameset_GSIntroTotodile
+ dw .Frameset_GSTitleTrail
+ dw .Frameset_GSIntroPikachu ; SPRITE_ANIM_FRAMESET_UNUSED_PIKACHU
+ dw .Frameset_GSIntroPikachu2 ; SPRITE_ANIM_FRAMESET_UNUSED_PIKACHU_2
+ dw .Frameset_GSIntroPikachu4 ; SPRITE_ANIM_FRAMESET_UNUSED_PIKACHU_3
+ dw .Frameset_TextEntryCursor
+ dw .Frameset_TextEntryCursorBig
+ dw .Frameset_GameFreakLogo
+ dw .Frameset_GSIntroStar
+ dw .Frameset_GSIntroSparkle
+ dw .Frameset_SlotsGolem
+ dw .Frameset_SlotsChansey
+ dw .Frameset_SlotsChansey2
+ dw .Frameset_SlotsEgg
+ dw .Frameset_RedWalk
+ dw .Frameset_StillCursor
+ dw .Frameset_TradePokeBall
+ dw .Frameset_TradePokeBallWobble
+ dw .Frameset_TradePoof
+ dw .Frameset_TradeTubeBulge
+ dw .Frameset_TrademonIcon
+ dw .Frameset_TrademonBubble
+ dw .Frameset_EvolutionBallOfLight
+ dw .Frameset_RadioTuningKnob
+ dw .Frameset_MagnetTrainRed
+ dw .Frameset_Unused1C
+ dw .Frameset_Leaf
+ dw .Frameset_CutTree
+ dw .Frameset_EggCrack
+ dw .Frameset_EggHatch1
+ dw .Frameset_EggHatch2
+ dw .Frameset_EggHatch3
+ dw .Frameset_EggHatch4
+ dw .Frameset_GSIntroHoOhLugia
+ dw .Frameset_HeadbuttTree
+
+.Frameset_00:
+ frame SPRITE_ANIM_OAMSET_RED_WALK_1, 32
+ endanim
+
+.Frameset_PartyMon:
+ frame SPRITE_ANIM_OAMSET_RED_WALK_1, 8
+ frame SPRITE_ANIM_OAMSET_RED_WALK_2, 8
+ dorestart
+
+.Frameset_PartyMonWithMail:
+ frame SPRITE_ANIM_OAMSET_PARTY_MON_WITH_MAIL_1, 8
+ frame SPRITE_ANIM_OAMSET_PARTY_MON_WITH_MAIL_2, 8
+ dorestart
+
+.Frameset_PartyMonWithItem:
+ frame SPRITE_ANIM_OAMSET_PARTY_MON_WITH_ITEM_1, 8
+ frame SPRITE_ANIM_OAMSET_PARTY_MON_WITH_ITEM_2, 8
+ dorestart
+
+.Frameset_RedWalk:
+ frame SPRITE_ANIM_OAMSET_RED_WALK_1, 8
+ frame SPRITE_ANIM_OAMSET_RED_WALK_2, 8
+ frame SPRITE_ANIM_OAMSET_RED_WALK_1, 8
+ frame SPRITE_ANIM_OAMSET_RED_WALK_2, 8, OAM_X_FLIP
+ dorestart
+
+.Frameset_GSIntroBubble:
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_BUBBLE_1, 8
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_BUBBLE_2, 8
+ dorestart
+
+.Frameset_GSIntroShellder:
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_SHELLDER_1, 8
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_SHELLDER_2, 8
+ dorestart
+
+.Frameset_GSIntroMagikarp:
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_MAGIKARP_1, $41
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_MAGIKARP_2, $41
+ dorestart
+
+.Frameset_GSIntroLapras:
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_LAPRAS_1, $47
+ endanim
+
+.Frameset_GSIntroLapras2:
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_LAPRAS_2, 7
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_LAPRAS_3, 7
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_LAPRAS_4, 7
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_LAPRAS_2, 7
+ dorestart
+
+.Frameset_GSIntroNote:
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_NOTE, 8
+ endanim
+
+.Frameset_GSIntroInvisibleNote:
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_INVISIBLE_NOTE, 8
+ endanim
+
+.Frameset_GSIntroJigglypuff:
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_JIGGLYPUFF_1, $59
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_JIGGLYPUFF_3, 9
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_JIGGLYPUFF_1, $19
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_JIGGLYPUFF_3, 9
+ dorestart
+
+.Frameset_GSIntroJigglypuff2:
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_JIGGLYPUFF_2, 32
+ endanim
+
+.Frameset_GSIntroPikachu:
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_PIKACHU_1, 4
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_PIKACHU_2, 5
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_PIKACHU_4, 4
+ dorestart
+
+.Frameset_GSIntroPikachu2:
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_PIKACHU_2, 8
+ endanim
+
+.Frameset_GSIntroPikachu3:
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_PIKACHU_3, 32
+ endanim
+
+.Frameset_GSIntroPikachuTail:
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_PIKACHU_TAIL_1, 3
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_PIKACHU_TAIL_2, 3
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_PIKACHU_TAIL_3, 3
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_PIKACHU_TAIL_2, 3
+ dorestart
+
+.Frameset_GSIntroPikachuTail2:
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_PIKACHU_TAIL_1, $1f
+ endanim
+
+.Frameset_GSIntroFireball:
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_SMALL_FIREBALL, 1
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_MED_FIREBALL, 1
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_BIG_FIREBALL, 1
+ delanim
+
+.Frameset_GSIntroChikorita:
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_CHIKORITA, $18
+ delanim
+
+.Frameset_GSIntroCyndaquil:
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_CYNDAQUIL, $58
+ delanim
+
+.Frameset_GSIntroTotodile:
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_TOTODILE, $18
+ delanim
+
+.Frameset_GSTitleTrail:
+IF DEF(_GOLD)
+ frame SPRITE_ANIM_OAMSET_GS_TITLE_TRAIL_1, 1
+ frame SPRITE_ANIM_OAMSET_GS_TITLE_TRAIL_2, 1
+ dorestart
+ELIF DEF(_SILVER)
+ frame SPRITE_ANIM_OAMSET_GS_TITLE_TRAIL_1, 32
+ endanim
+ENDC
+
+.Frameset_GSIntroPikachu4:
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_PIKACHU_2, 0
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_PIKACHU_3, 15
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_PIKACHU_4, 15
+ endanim
+
+.Frameset_TextEntryCursor:
+ frame SPRITE_ANIM_OAMSET_TEXT_ENTRY_CURSOR, 1
+ dowait 1
+ dorestart
+
+.Frameset_TextEntryCursorBig:
+ frame SPRITE_ANIM_OAMSET_TEXT_ENTRY_CURSOR_BIG, 1
+ dowait 1
+ dorestart
+
+.Frameset_GameFreakLogo:
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_GAMEFREAK_LOGO, 8
+ endanim
+
+.Frameset_GSIntroStar:
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_STAR, 3
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_STAR, 3, OAM_Y_FLIP
+ dorestart
+
+.Frameset_GSIntroSparkle:
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_SPARKLE_1, 2
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_SPARKLE_2, 2
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_SPARKLE_3, 2
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_SPARKLE_2, 2
+ dorestart
+
+.Frameset_SlotsGolem:
+ frame SPRITE_ANIM_OAMSET_SLOTS_GOLEM_1, 7
+ frame SPRITE_ANIM_OAMSET_SLOTS_GOLEM_2, 7
+ frame SPRITE_ANIM_OAMSET_SLOTS_GOLEM_1, 7, OAM_Y_FLIP
+ frame SPRITE_ANIM_OAMSET_SLOTS_GOLEM_2, 7, OAM_X_FLIP
+ dorestart
+
+.Frameset_SlotsChansey:
+ frame SPRITE_ANIM_OAMSET_SLOTS_CHANSEY_1, 7
+ frame SPRITE_ANIM_OAMSET_SLOTS_CHANSEY_2, 7
+ frame SPRITE_ANIM_OAMSET_SLOTS_CHANSEY_1, 7
+ frame SPRITE_ANIM_OAMSET_SLOTS_CHANSEY_3, 7
+ dorestart
+
+.Frameset_SlotsChansey2:
+ frame SPRITE_ANIM_OAMSET_SLOTS_CHANSEY_1, 7
+ frame SPRITE_ANIM_OAMSET_SLOTS_CHANSEY_4, 7
+ frame SPRITE_ANIM_OAMSET_SLOTS_CHANSEY_5, 7
+ frame SPRITE_ANIM_OAMSET_SLOTS_CHANSEY_4, 7
+ frame SPRITE_ANIM_OAMSET_SLOTS_CHANSEY_1, 7
+ endanim
+
+.Frameset_SlotsEgg:
+ frame SPRITE_ANIM_OAMSET_SLOTS_EGG, 20
+ endanim
+
+.Frameset_StillCursor:
+ frame SPRITE_ANIM_OAMSET_STILL_CURSOR, 32
+ endanim
+
+.Frameset_TradePokeBall:
+ frame SPRITE_ANIM_OAMSET_TRADE_POKE_BALL_1, 32
+ endanim
+
+.Frameset_TradePokeBallWobble:
+ frame SPRITE_ANIM_OAMSET_TRADE_POKE_BALL_1, 3
+ frame SPRITE_ANIM_OAMSET_TRADE_POKE_BALL_2, 3
+ frame SPRITE_ANIM_OAMSET_TRADE_POKE_BALL_1, 3
+ frame SPRITE_ANIM_OAMSET_TRADE_POKE_BALL_2, 3, OAM_X_FLIP
+ dorestart
+
+.Frameset_TradePoof:
+ frame SPRITE_ANIM_OAMSET_TRADE_POOF_1, 4
+ frame SPRITE_ANIM_OAMSET_TRADE_POOF_2, 4
+ frame SPRITE_ANIM_OAMSET_TRADE_POOF_3, 4
+ delanim
+
+.Frameset_TradeTubeBulge:
+ frame SPRITE_ANIM_OAMSET_TRADE_TUBE_BULGE_1, 3
+ frame SPRITE_ANIM_OAMSET_TRADE_TUBE_BULGE_2, 3
+ dorestart
+
+.Frameset_TrademonIcon:
+ frame SPRITE_ANIM_OAMSET_TRADEMON_ICON_1, 7
+ frame SPRITE_ANIM_OAMSET_TRADEMON_ICON_2, 7
+ dorestart
+
+.Frameset_TrademonBubble:
+ frame SPRITE_ANIM_OAMSET_TRADEMON_BUBBLE, 32
+ endanim
+
+.Frameset_EvolutionBallOfLight:
+ frame SPRITE_ANIM_OAMSET_EVOLUTION_BALL_OF_LIGHT_2, 2
+ frame SPRITE_ANIM_OAMSET_EVOLUTION_BALL_OF_LIGHT_1, 2
+ frame SPRITE_ANIM_OAMSET_EVOLUTION_BALL_OF_LIGHT_2, 2
+ endanim
+
+.Frameset_RadioTuningKnob:
+ frame SPRITE_ANIM_OAMSET_RADIO_TUNING_KNOB, 32
+ endanim
+
+.Frameset_MagnetTrainRed:
+ frame SPRITE_ANIM_OAMSET_MAGNET_TRAIN_RED_1, 8
+ frame SPRITE_ANIM_OAMSET_MAGNET_TRAIN_RED_2, 8
+ frame SPRITE_ANIM_OAMSET_MAGNET_TRAIN_RED_1, 8
+ frame SPRITE_ANIM_OAMSET_MAGNET_TRAIN_RED_2, 8, OAM_X_FLIP
+ dorestart
+
+; unused
+ frame SPRITE_ANIM_OAMSET_UNUSED_43, 8
+ frame SPRITE_ANIM_OAMSET_UNUSED_44, 8
+ dorestart
+
+; unused
+ frame SPRITE_ANIM_OAMSET_UNUSED_45, 8
+ frame SPRITE_ANIM_OAMSET_UNUSED_46, 8
+ dorestart
+
+; unused
+ frame SPRITE_ANIM_OAMSET_UNUSED_47, 8
+ frame SPRITE_ANIM_OAMSET_UNUSED_48, 8
+ dorestart
+
+; unused
+ frame SPRITE_ANIM_OAMSET_UNUSED_49, 1
+ frame SPRITE_ANIM_OAMSET_UNUSED_49, 1, OAM_X_FLIP
+ frame SPRITE_ANIM_OAMSET_UNUSED_49, 1, OAM_X_FLIP, OAM_Y_FLIP
+ frame SPRITE_ANIM_OAMSET_UNUSED_49, 1, OAM_Y_FLIP
+ dorestart
+
+; unused
+ frame SPRITE_ANIM_OAMSET_UNUSED_4A, 32
+ endanim
+
+; unused
+ frame SPRITE_ANIM_OAMSET_UNUSED_4B, 32
+ endanim
+
+; unused
+ frame SPRITE_ANIM_OAMSET_UNUSED_4C, 32
+ endanim
+
+; unused
+ frame SPRITE_ANIM_OAMSET_UNUSED_4D, 32
+ endanim
+
+; unused
+ frame SPRITE_ANIM_OAMSET_UNUSED_4E, 3
+ dowait 3
+ dorestart
+
+.Frameset_Unused1C:
+ dowait 32
+ endanim
+
+.Frameset_Leaf:
+ frame SPRITE_ANIM_OAMSET_LEAF, 32
+ endanim
+
+.Frameset_CutTree:
+ frame SPRITE_ANIM_OAMSET_TREE_1, 2
+ frame SPRITE_ANIM_OAMSET_CUT_TREE_2, 16
+ dowait 1
+ frame SPRITE_ANIM_OAMSET_CUT_TREE_3, 1
+ dowait 1
+ frame SPRITE_ANIM_OAMSET_CUT_TREE_4, 1
+ delanim
+
+.Frameset_EggCrack:
+ frame SPRITE_ANIM_OAMSET_EGG_CRACK, 32
+ endanim
+
+.Frameset_EggHatch1:
+ frame SPRITE_ANIM_OAMSET_EGG_HATCH, 32
+ endanim
+
+.Frameset_EggHatch2:
+ frame SPRITE_ANIM_OAMSET_EGG_HATCH, 32, OAM_X_FLIP
+ endanim
+
+.Frameset_EggHatch3:
+ frame SPRITE_ANIM_OAMSET_EGG_HATCH, 32, OAM_Y_FLIP
+ endanim
+
+.Frameset_EggHatch4:
+ frame SPRITE_ANIM_OAMSET_EGG_HATCH, 32, OAM_X_FLIP, OAM_Y_FLIP
+ endanim
+
+.Frameset_GSIntroHoOhLugia:
+IF DEF(_GOLD)
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_HO_OH_LUGIA_1, 10
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_HO_OH_LUGIA_2, 9
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_HO_OH_LUGIA_3, 10
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_HO_OH_LUGIA_4, 10
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_HO_OH_LUGIA_3, 9
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_HO_OH_LUGIA_5, 10
+ dorestart
+
+ELIF DEF(_SILVER)
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_HO_OH_LUGIA_2, 3
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_HO_OH_LUGIA_1, 7
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_HO_OH_LUGIA_2, 7
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_HO_OH_LUGIA_3, 7
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_HO_OH_LUGIA_3, 7
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_HO_OH_LUGIA_4, 7
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_HO_OH_LUGIA_4, 7
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_HO_OH_LUGIA_3, 7
+ frame SPRITE_ANIM_OAMSET_GS_INTRO_HO_OH_LUGIA_2, 3
+ dorestart
+ENDC
+
+.Frameset_HeadbuttTree:
+ frame SPRITE_ANIM_OAMSET_TREE_1, 2
+ frame SPRITE_ANIM_OAMSET_HEADBUTT_TREE_2, 2
+ frame SPRITE_ANIM_OAMSET_TREE_1, 2
+ frame SPRITE_ANIM_OAMSET_HEADBUTT_TREE_2, 2, OAM_X_FLIP
+ dorestart
diff --git a/data/sprite_anims/oam.asm b/data/sprite_anims/oam.asm
new file mode 100755
index 00000000..dde96fca
--- /dev/null
+++ b/data/sprite_anims/oam.asm
@@ -0,0 +1,830 @@
+SpriteAnimOAMData:
+; entries correspond to SPRITE_ANIM_OAMSET_* constants
+ ; vtile offset, data pointer
+ dbw $00, .OAMData_RedWalk ; SPRITE_ANIM_OAMSET_RED_WALK_1
+ dbw $04, .OAMData_RedWalk ; SPRITE_ANIM_OAMSET_RED_WALK_2
+ dbw $4c, .OAMData_1x1_Palette0 ; SPRITE_ANIM_OAMSET_GS_INTRO_BUBBLE_1
+ dbw $5c, .OAMData_1x1_Palette0 ; SPRITE_ANIM_OAMSET_GS_INTRO_BUBBLE_2
+ dbw $6c, .OAMData_GSIntroShellder ; SPRITE_ANIM_OAMSET_GS_INTRO_SHELLDER_1
+ dbw $6e, .OAMData_GSIntroShellder ; SPRITE_ANIM_OAMSET_GS_INTRO_SHELLDER_2
+ dbw $2d, .OAMData_GSIntroMagikarp ; SPRITE_ANIM_OAMSET_GS_INTRO_MAGIKARP_1
+ dbw $4d, .OAMData_GSIntroMagikarp ; SPRITE_ANIM_OAMSET_GS_INTRO_MAGIKARP_2
+ dbw $60, .OAMData_GSIntroLapras1 ; SPRITE_ANIM_OAMSET_GS_INTRO_LAPRAS_1
+ dbw $00, .OAMData_GSIntroLapras2 ; SPRITE_ANIM_OAMSET_GS_INTRO_LAPRAS_2
+ dbw $00, .OAMData_GSIntroLapras3 ; SPRITE_ANIM_OAMSET_GS_INTRO_LAPRAS_3
+ dbw $06, .OAMData_GSIntroLapras4 ; SPRITE_ANIM_OAMSET_GS_INTRO_LAPRAS_4
+ dbw $0c, .OAMData_GSIntroNote ; SPRITE_ANIM_OAMSET_GS_INTRO_NOTE
+ dbw $0d, .OAMData_1x1_Palette0 ; SPRITE_ANIM_OAMSET_GS_INTRO_INVISIBLE_NOTE
+ dbw $00, .OAMData_GSIntroJigglypuffPikachu ; SPRITE_ANIM_OAMSET_GS_INTRO_JIGGLYPUFF_1
+ dbw $04, .OAMData_GSIntroJigglypuffPikachu ; SPRITE_ANIM_OAMSET_GS_INTRO_JIGGLYPUFF_2
+ dbw $08, .OAMData_GSIntroJigglypuffPikachu ; SPRITE_ANIM_OAMSET_GS_INTRO_JIGGLYPUFF_3
+ dbw $40, .OAMData_GSIntroJigglypuffPikachu ; SPRITE_ANIM_OAMSET_GS_INTRO_PIKACHU_1
+ dbw $44, .OAMData_GSIntroJigglypuffPikachu ; SPRITE_ANIM_OAMSET_GS_INTRO_PIKACHU_2
+ dbw $48, .OAMData_GSIntroJigglypuffPikachu ; SPRITE_ANIM_OAMSET_GS_INTRO_PIKACHU_3
+ dbw $4c, .OAMData_GSIntroJigglypuffPikachu ; SPRITE_ANIM_OAMSET_GS_INTRO_PIKACHU_4
+ dbw $80, .OAMData_GSIntroPikachuTail ; SPRITE_ANIM_OAMSET_GS_INTRO_PIKACHU_TAIL_1
+ dbw $85, .OAMData_GSIntroPikachuTail ; SPRITE_ANIM_OAMSET_GS_INTRO_PIKACHU_TAIL_2
+ dbw $8a, .OAMData_GSIntroPikachuTail ; SPRITE_ANIM_OAMSET_GS_INTRO_PIKACHU_TAIL_3
+ dbw $00, .OAMData_GSIntroSmallFireball ; SPRITE_ANIM_OAMSET_GS_INTRO_SMALL_FIREBALL
+ dbw $01, .OAMData_TradePoofBubble ; SPRITE_ANIM_OAMSET_GS_INTRO_MED_FIREBALL
+ dbw $09, .OAMData_GSIntroBigFireball ; SPRITE_ANIM_OAMSET_GS_INTRO_BIG_FIREBALL
+ dbw $10, .OAMData_GSIntroStarter ; SPRITE_ANIM_OAMSET_GS_INTRO_CHIKORITA
+ dbw $29, .OAMData_GSIntroStarter ; SPRITE_ANIM_OAMSET_GS_INTRO_CYNDAQUIL
+ dbw $42, .OAMData_GSIntroStarter ; SPRITE_ANIM_OAMSET_GS_INTRO_TOTODILE
+ dbw $f8, .OAMData_GSTitleTrail ; SPRITE_ANIM_OAMSET_GS_TITLE_TRAIL_1
+ dbw $fa, .OAMData_GSTitleTrail ; SPRITE_ANIM_OAMSET_GS_TITLE_TRAIL_2
+ dbw $00, .OAMData_TextEntryCursor ; SPRITE_ANIM_OAMSET_TEXT_ENTRY_CURSOR
+ dbw $00, .OAMData_TextEntryCursorBig ; SPRITE_ANIM_OAMSET_TEXT_ENTRY_CURSOR_BIG
+ dbw $00, .OAMData_GSIntroGameFreakLogo ; SPRITE_ANIM_OAMSET_GS_INTRO_GAMEFREAK_LOGO
+ dbw $0f, .OAMData_GSIntroStar ; SPRITE_ANIM_OAMSET_GS_INTRO_STAR
+ dbw $11, .OAMData_1x1_Palette0 ; SPRITE_ANIM_OAMSET_GS_INTRO_SPARKLE_1
+ dbw $12, .OAMData_1x1_Palette0 ; SPRITE_ANIM_OAMSET_GS_INTRO_SPARKLE_2
+ dbw $13, .OAMData_1x1_Palette0 ; SPRITE_ANIM_OAMSET_GS_INTRO_SPARKLE_3
+ dbw $00, .OAMData_SlotsGolem ; SPRITE_ANIM_OAMSET_SLOTS_GOLEM_1
+ dbw $08, .OAMData_SlotsGolem ; SPRITE_ANIM_OAMSET_SLOTS_GOLEM_2
+ dbw $10, .OAMData_SlotsChansey1 ; SPRITE_ANIM_OAMSET_SLOTS_CHANSEY_1
+ dbw $10, .OAMData_SlotsChansey2 ; SPRITE_ANIM_OAMSET_SLOTS_CHANSEY_2
+ dbw $10, .OAMData_SlotsChansey3 ; SPRITE_ANIM_OAMSET_SLOTS_CHANSEY_3
+ dbw $10, .OAMData_SlotsChansey4 ; SPRITE_ANIM_OAMSET_SLOTS_CHANSEY_4
+ dbw $10, .OAMData_SlotsChansey5 ; SPRITE_ANIM_OAMSET_SLOTS_CHANSEY_5
+ dbw $3a, .OAMData_1x1_Palette0 ; SPRITE_ANIM_OAMSET_SLOTS_EGG
+ dbw $00, .OAMData_RedWalk ; SPRITE_ANIM_OAMSET_STILL_CURSOR
+ dbw $00, .OAMData_TradePokeBall1 ; SPRITE_ANIM_OAMSET_TRADE_POKE_BALL_1
+ dbw $02, .OAMData_MagnetTrainRed ; SPRITE_ANIM_OAMSET_TRADE_POKE_BALL_2
+ dbw $06, .OAMData_TradePoofBubble ; SPRITE_ANIM_OAMSET_TRADE_POOF_1
+ dbw $0a, .OAMData_TradePoofBubble ; SPRITE_ANIM_OAMSET_TRADE_POOF_2
+ dbw $0e, .OAMData_TradePoofBubble ; SPRITE_ANIM_OAMSET_TRADE_POOF_3
+ dbw $12, .OAMData_TradeTubeBulge ; SPRITE_ANIM_OAMSET_TRADE_TUBE_BULGE_1
+ dbw $13, .OAMData_TradeTubeBulge ; SPRITE_ANIM_OAMSET_TRADE_TUBE_BULGE_2
+ dbw $00, .OAMData_RedWalk ; SPRITE_ANIM_OAMSET_TRADEMON_ICON_1
+ dbw $04, .OAMData_RedWalk ; SPRITE_ANIM_OAMSET_TRADEMON_ICON_2
+ dbw $10, .OAMData_TradePoofBubble ; SPRITE_ANIM_OAMSET_TRADEMON_BUBBLE
+ dbw $00, .OAMData_MagnetTrainRed ; SPRITE_ANIM_OAMSET_EVOLUTION_BALL_OF_LIGHT_1
+ dbw $04, .OAMData_1x1_Palette0 ; SPRITE_ANIM_OAMSET_EVOLUTION_BALL_OF_LIGHT_2
+ dbw $00, .OAMData_RadioTuningKnob ; SPRITE_ANIM_OAMSET_RADIO_TUNING_KNOB
+ dbw $00, .OAMData_PartyMonWithMail1 ; SPRITE_ANIM_OAMSET_PARTY_MON_WITH_MAIL_1
+ dbw $00, .OAMData_PartyMonWithMail2 ; SPRITE_ANIM_OAMSET_PARTY_MON_WITH_MAIL_2
+ dbw $00, .OAMData_PartyMonWithItem1 ; SPRITE_ANIM_OAMSET_PARTY_MON_WITH_ITEM_1
+ dbw $00, .OAMData_PartyMonWithItem2 ; SPRITE_ANIM_OAMSET_PARTY_MON_WITH_ITEM_2
+ dbw $00, .OAMData_MagnetTrainRed ; SPRITE_ANIM_OAMSET_MAGNET_TRAIN_RED_1
+ dbw $04, .OAMData_MagnetTrainRed ; SPRITE_ANIM_OAMSET_MAGNET_TRAIN_RED_2
+ dbw $00, .OAMData_Unused43_4A ; SPRITE_ANIM_OAMSET_UNUSED_43
+ dbw $30, .OAMData_Unused43_4A ; SPRITE_ANIM_OAMSET_UNUSED_44
+ dbw $03, .OAMData_Unused43_4A ; SPRITE_ANIM_OAMSET_UNUSED_45
+ dbw $33, .OAMData_Unused43_4A ; SPRITE_ANIM_OAMSET_UNUSED_46
+ dbw $06, .OAMData_Unused43_4A ; SPRITE_ANIM_OAMSET_UNUSED_47
+ dbw $36, .OAMData_Unused43_4A ; SPRITE_ANIM_OAMSET_UNUSED_48
+ dbw $09, .OAMData_Unused43_4A ; SPRITE_ANIM_OAMSET_UNUSED_49
+ dbw $39, .OAMData_Unused43_4A ; SPRITE_ANIM_OAMSET_UNUSED_4A
+ dbw $0c, .OAMData_Unused4B ; SPRITE_ANIM_OAMSET_UNUSED_4B
+ dbw $0c, .OAMData_Unused4C ; SPRITE_ANIM_OAMSET_UNUSED_4C
+ dbw $3c, .OAMData_1x1_Palette0 ; SPRITE_ANIM_OAMSET_UNUSED_4D
+ dbw $3e, .OAMData_1x1_Palette0 ; SPRITE_ANIM_OAMSET_UNUSED_4E
+ dbw $00, .OAMData_Leaf ; SPRITE_ANIM_OAMSET_LEAF
+ dbw $00, .OAMData_Tree ; SPRITE_ANIM_OAMSET_TREE_1
+ dbw $00, .OAMData_CutTree2 ; SPRITE_ANIM_OAMSET_CUT_TREE_2
+ dbw $00, .OAMData_CutTree3 ; SPRITE_ANIM_OAMSET_CUT_TREE_3
+ dbw $00, .OAMData_CutTree4 ; SPRITE_ANIM_OAMSET_CUT_TREE_4
+ dbw $00, .OAMData_1x1_Palette0 ; SPRITE_ANIM_OAMSET_EGG_CRACK
+ dbw $01, .OAMData_1x1_Palette0 ; SPRITE_ANIM_OAMSET_EGG_HATCH
+IF DEF(_GOLD)
+ dbw $00, .OAMData_GSIntroHoOh1 ; SPRITE_ANIM_OAMSET_GS_INTRO_HO_OH_1
+ dbw $00, .OAMData_GSIntroHoOh2 ; SPRITE_ANIM_OAMSET_GS_INTRO_HO_OH_2
+ dbw $00, .OAMData_GSIntroHoOh3 ; SPRITE_ANIM_OAMSET_GS_INTRO_HO_OH_3
+ dbw $00, .OAMData_GSIntroHoOh4 ; SPRITE_ANIM_OAMSET_GS_INTRO_HO_OH_4
+ dbw $00, .OAMData_GSIntroHoOh5 ; SPRITE_ANIM_OAMSET_GS_INTRO_HO_OH_5
+ELIF DEF(_SILVER)
+ dbw $00, .OAMData_GSIntroLugia1 ; SPRITE_ANIM_OAMSET_GS_INTRO_HO_OH_1
+ dbw $20, .OAMData_GSIntroLugia1 ; SPRITE_ANIM_OAMSET_GS_INTRO_HO_OH_2
+ dbw $40, .OAMData_GSIntroLugia2 ; SPRITE_ANIM_OAMSET_GS_INTRO_HO_OH_3
+ dbw $60, .OAMData_GSIntroLugia2 ; SPRITE_ANIM_OAMSET_GS_INTRO_HO_OH_4
+ dbw $00, .OAMData_GSIntroLugia1 ; SPRITE_ANIM_OAMSET_GS_INTRO_HO_OH_5
+ENDC
+ dbw $04, .OAMData_Tree ; SPRITE_ANIM_OAMSET_HEADBUTT_TREE_2
+
+.OAMData_1x1_Palette0:
+ db 1
+ dbsprite -1, -1, 4, 4, $00, 0
+
+.OAMData_GSIntroShellder:
+ db 4
+ dbsprite -1, -1, 0, 0, $00, 0
+ dbsprite 0, -1, 0, 0, $01, 0
+ dbsprite -1, 0, 0, 0, $10, 0
+ dbsprite 0, 0, 0, 0, $11, 0
+
+.OAMData_GSIntroStar:
+ db 4
+ dbsprite -1, -1, 0, 0, $00, 0
+ dbsprite 0, -1, 0, 0, $00, 0 | X_FLIP
+ dbsprite -1, 0, 0, 0, $01, 0
+ dbsprite 0, 0, 0, 0, $01, 0 | X_FLIP
+
+.OAMData_TradePokeBall1:
+ db 4
+ dbsprite -1, -1, 0, 0, $00, 0 | PRIORITY
+ dbsprite 0, -1, 0, 0, $00, 0 | X_FLIP | PRIORITY
+ dbsprite -1, 0, 0, 0, $01, 0 | PRIORITY
+ dbsprite 0, 0, 0, 0, $01, 0 | X_FLIP | PRIORITY
+
+.OAMData_GSIntroSmallFireball:
+ db 4
+ dbsprite -1, -1, 0, 0, $00, 0
+ dbsprite 0, -1, 0, 0, $00, 0 | X_FLIP
+ dbsprite -1, 0, 0, 0, $00, 0 | Y_FLIP
+ dbsprite 0, 0, 0, 0, $00, 0 | X_FLIP | Y_FLIP
+
+.OAMData_TradeTubeBulge:
+ db 4
+ dbsprite -1, -1, 0, 0, $00, 7
+ dbsprite 0, -1, 0, 0, $00, 7 | X_FLIP
+ dbsprite -1, 0, 0, 0, $00, 7 | Y_FLIP
+ dbsprite 0, 0, 0, 0, $00, 7 | X_FLIP | Y_FLIP
+
+; unused
+ db 4
+ dbsprite -1, -1, 0, 0, $00, 0 | PRIORITY
+ dbsprite 0, -1, 0, 0, $00, 0 | X_FLIP | PRIORITY
+ dbsprite -1, 0, 0, 0, $00, 0 | Y_FLIP | PRIORITY
+ dbsprite 0, 0, 0, 0, $00, 0 | X_FLIP | Y_FLIP | PRIORITY
+
+.OAMData_TradePoofBubble:
+ db 16
+ dbsprite -2, -2, 0, 0, $00, 0
+ dbsprite -1, -2, 0, 0, $01, 0
+ dbsprite -2, -1, 0, 0, $02, 0
+ dbsprite -1, -1, 0, 0, $03, 0
+ dbsprite 0, -2, 0, 0, $01, 0 | X_FLIP
+ dbsprite 1, -2, 0, 0, $00, 0 | X_FLIP
+ dbsprite 0, -1, 0, 0, $03, 0 | X_FLIP
+ dbsprite 1, -1, 0, 0, $02, 0 | X_FLIP
+ dbsprite -2, 0, 0, 0, $02, 0 | Y_FLIP
+ dbsprite -1, 0, 0, 0, $03, 0 | Y_FLIP
+ dbsprite -2, 1, 0, 0, $00, 0 | Y_FLIP
+ dbsprite -1, 1, 0, 0, $01, 0 | Y_FLIP
+ dbsprite 0, 0, 0, 0, $03, 0 | X_FLIP | Y_FLIP
+ dbsprite 1, 0, 0, 0, $02, 0 | X_FLIP | Y_FLIP
+ dbsprite 0, 1, 0, 0, $01, 0 | X_FLIP | Y_FLIP
+ dbsprite 1, 1, 0, 0, $00, 0 | X_FLIP | Y_FLIP
+
+.OAMData_GSIntroBigFireball:
+ db 36
+ dbsprite -3, -3, 0, 0, $00, 0
+ dbsprite -2, -3, 0, 0, $01, 0
+ dbsprite -1, -3, 0, 0, $02, 0
+ dbsprite -3, -2, 0, 0, $03, 0
+ dbsprite -2, -2, 0, 0, $04, 0
+ dbsprite -1, -2, 0, 0, $05, 0
+ dbsprite -3, -1, 0, 0, $06, 0
+ dbsprite -2, -1, 0, 0, $05, 0
+ dbsprite -1, -1, 0, 0, $05, 0
+ dbsprite 0, -3, 0, 0, $02, 0 | X_FLIP
+ dbsprite 1, -3, 0, 0, $01, 0 | X_FLIP
+ dbsprite 2, -3, 0, 0, $00, 0 | X_FLIP
+ dbsprite 0, -2, 0, 0, $05, 0 | X_FLIP
+ dbsprite 1, -2, 0, 0, $04, 0 | X_FLIP
+ dbsprite 2, -2, 0, 0, $03, 0 | X_FLIP
+ dbsprite 0, -1, 0, 0, $05, 0 | X_FLIP
+ dbsprite 1, -1, 0, 0, $05, 0 | X_FLIP
+ dbsprite 2, -1, 0, 0, $06, 0 | X_FLIP
+ dbsprite -3, 0, 0, 0, $06, 0 | Y_FLIP
+ dbsprite -2, 0, 0, 0, $05, 0 | Y_FLIP
+ dbsprite -1, 0, 0, 0, $05, 0 | Y_FLIP
+ dbsprite -3, 1, 0, 0, $03, 0 | Y_FLIP
+ dbsprite -2, 1, 0, 0, $04, 0 | Y_FLIP
+ dbsprite -1, 1, 0, 0, $05, 0 | Y_FLIP
+ dbsprite -3, 2, 0, 0, $00, 0 | Y_FLIP
+ dbsprite -2, 2, 0, 0, $01, 0 | Y_FLIP
+ dbsprite -1, 2, 0, 0, $02, 0 | Y_FLIP
+ dbsprite 0, 0, 0, 0, $05, 0 | X_FLIP | Y_FLIP
+ dbsprite 1, 0, 0, 0, $05, 0 | X_FLIP | Y_FLIP
+ dbsprite 2, 0, 0, 0, $06, 0 | X_FLIP | Y_FLIP
+ dbsprite 0, 1, 0, 0, $05, 0 | X_FLIP | Y_FLIP
+ dbsprite 1, 1, 0, 0, $04, 0 | X_FLIP | Y_FLIP
+ dbsprite 2, 1, 0, 0, $03, 0 | X_FLIP | Y_FLIP
+ dbsprite 0, 2, 0, 0, $02, 0 | X_FLIP | Y_FLIP
+ dbsprite 1, 2, 0, 0, $01, 0 | X_FLIP | Y_FLIP
+ dbsprite 2, 2, 0, 0, $00, 0 | X_FLIP | Y_FLIP
+
+.OAMData_Unused43_4A:
+ db 9
+ dbsprite -2, -2, 4, 4, $00, 0
+ dbsprite -1, -2, 4, 4, $01, 0
+ dbsprite 0, -2, 4, 4, $02, 0
+ dbsprite -2, -1, 4, 4, $10, 0
+ dbsprite -1, -1, 4, 4, $11, 0
+ dbsprite 0, -1, 4, 4, $12, 0
+ dbsprite -2, 0, 4, 4, $20, 0
+ dbsprite -1, 0, 4, 4, $21, 0
+ dbsprite 0, 0, 4, 4, $22, 0
+
+.OAMData_GSIntroJigglypuffPikachu:
+ db 16
+ dbsprite -2, -2, 0, 0, $00, 0
+ dbsprite -1, -2, 0, 0, $01, 0
+ dbsprite 0, -2, 0, 0, $02, 0
+ dbsprite 1, -2, 0, 0, $03, 0
+ dbsprite -2, -1, 0, 0, $10, 0
+ dbsprite -1, -1, 0, 0, $11, 0
+ dbsprite 0, -1, 0, 0, $12, 0
+ dbsprite 1, -1, 0, 0, $13, 0
+ dbsprite -2, 0, 0, 0, $20, 0
+ dbsprite -1, 0, 0, 0, $21, 0
+ dbsprite 0, 0, 0, 0, $22, 0
+ dbsprite 1, 0, 0, 0, $23, 0
+ dbsprite -2, 1, 0, 0, $30, 0
+ dbsprite -1, 1, 0, 0, $31, 0
+ dbsprite 0, 1, 0, 0, $32, 0
+ dbsprite 1, 1, 0, 0, $33, 0
+
+.OAMData_GSIntroStarter:
+ db 25
+ dbsprite -3, -3, 4, 4, $00, 0
+ dbsprite -3, -2, 4, 4, $01, 0
+ dbsprite -3, -1, 4, 4, $02, 0
+ dbsprite -3, 0, 4, 4, $03, 0
+ dbsprite -3, 1, 4, 4, $04, 0
+ dbsprite -2, -3, 4, 4, $05, 0
+ dbsprite -2, -2, 4, 4, $06, 0
+ dbsprite -2, -1, 4, 4, $07, 0
+ dbsprite -2, 0, 4, 4, $08, 0
+ dbsprite -2, 1, 4, 4, $09, 0
+ dbsprite -1, -3, 4, 4, $0a, 0
+ dbsprite -1, -2, 4, 4, $0b, 0
+ dbsprite -1, -1, 4, 4, $0c, 0
+ dbsprite -1, 0, 4, 4, $0d, 0
+ dbsprite -1, 1, 4, 4, $0e, 0
+ dbsprite 0, -3, 4, 4, $0f, 0
+ dbsprite 0, -2, 4, 4, $10, 0
+ dbsprite 0, -1, 4, 4, $11, 0
+ dbsprite 0, 0, 4, 4, $12, 0
+ dbsprite 0, 1, 4, 4, $13, 0
+ dbsprite 1, -3, 4, 4, $14, 0
+ dbsprite 1, -2, 4, 4, $15, 0
+ dbsprite 1, -1, 4, 4, $16, 0
+ dbsprite 1, 0, 4, 4, $17, 0
+ dbsprite 1, 1, 4, 4, $18, 0
+
+; unused
+ db 36
+ dbsprite -3, -3, 0, 0, $00, 0
+ dbsprite -2, -3, 0, 0, $01, 0
+ dbsprite -1, -3, 0, 0, $02, 0
+ dbsprite 0, -3, 0, 0, $03, 0
+ dbsprite 1, -3, 0, 0, $04, 0
+ dbsprite 2, -3, 0, 0, $05, 0
+ dbsprite -3, -2, 0, 0, $06, 0
+ dbsprite -2, -2, 0, 0, $07, 0
+ dbsprite -1, -2, 0, 0, $08, 0
+ dbsprite 0, -2, 0, 0, $09, 0
+ dbsprite 1, -2, 0, 0, $0a, 0
+ dbsprite 2, -2, 0, 0, $0b, 0
+ dbsprite -3, -1, 0, 0, $0c, 0
+ dbsprite -2, -1, 0, 0, $0d, 0
+ dbsprite -1, -1, 0, 0, $0e, 0
+ dbsprite 0, -1, 0, 0, $0f, 0
+ dbsprite 1, -1, 0, 0, $10, 0
+ dbsprite 2, -1, 0, 0, $11, 0
+ dbsprite -3, 0, 0, 0, $12, 0
+ dbsprite -2, 0, 0, 0, $13, 0
+ dbsprite -1, 0, 0, 0, $14, 0
+ dbsprite 0, 0, 0, 0, $15, 0
+ dbsprite 1, 0, 0, 0, $16, 0
+ dbsprite 2, 0, 0, 0, $17, 0
+ dbsprite -3, 1, 0, 0, $18, 0
+ dbsprite -2, 1, 0, 0, $19, 0
+ dbsprite -1, 1, 0, 0, $1a, 0
+ dbsprite 0, 1, 0, 0, $1b, 0
+ dbsprite 1, 1, 0, 0, $1c, 0
+ dbsprite 2, 1, 0, 0, $1d, 0
+ dbsprite -3, 2, 0, 0, $1e, 0
+ dbsprite -2, 2, 0, 0, $1f, 0
+ dbsprite -1, 2, 0, 0, $20, 0
+ dbsprite 0, 2, 0, 0, $21, 0
+ dbsprite 1, 2, 0, 0, $22, 0
+ dbsprite 2, 2, 0, 0, $23, 0
+
+.OAMData_RedWalk:
+ db 4
+ dbsprite -1, -1, 0, 0, $00, PAL_OW_RED
+ dbsprite 0, -1, 0, 0, $01, PAL_OW_RED
+ dbsprite -1, 0, 0, 0, $02, PAL_OW_RED
+ dbsprite 0, 0, 0, 0, $03, PAL_OW_RED
+
+.OAMData_MagnetTrainRed:
+ db 4
+ dbsprite -1, -1, 0, 0, $00, PAL_OW_RED | PRIORITY
+ dbsprite 0, -1, 0, 0, $01, PAL_OW_RED | PRIORITY
+ dbsprite -1, 0, 0, 0, $02, PAL_OW_RED | PRIORITY
+ dbsprite 0, 0, 0, 0, $03, PAL_OW_RED | PRIORITY
+
+.OAMData_PartyMonWithMail1:
+ db 4
+ dbsprite -1, -1, 0, 0, $00, PAL_OW_RED
+ dbsprite 0, -1, 0, 0, $01, PAL_OW_RED
+ dbsprite -1, 0, 0, 0, $08, PAL_OW_RED
+ dbsprite 0, 0, 0, 0, $03, PAL_OW_RED
+
+.OAMData_PartyMonWithMail2:
+ db 4
+ dbsprite -1, -1, 0, 0, $04, PAL_OW_RED
+ dbsprite 0, -1, 0, 0, $05, PAL_OW_RED
+ dbsprite -1, 0, 0, 0, $08, PAL_OW_RED
+ dbsprite 0, 0, 0, 0, $07, PAL_OW_RED
+
+.OAMData_PartyMonWithItem1:
+ db 4
+ dbsprite -1, -1, 0, 0, $00, PAL_OW_RED
+ dbsprite 0, -1, 0, 0, $01, PAL_OW_RED
+ dbsprite -1, 0, 0, 0, $09, PAL_OW_RED
+ dbsprite 0, 0, 0, 0, $03, PAL_OW_RED
+
+.OAMData_PartyMonWithItem2:
+ db 4
+ dbsprite -1, -1, 0, 0, $04, PAL_OW_RED
+ dbsprite 0, -1, 0, 0, $05, PAL_OW_RED
+ dbsprite -1, 0, 0, 0, $09, PAL_OW_RED
+ dbsprite 0, 0, 0, 0, $07, PAL_OW_RED
+
+.OAMData_GSIntroMagikarp:
+ db 6
+ dbsprite -2, -1, 4, 0, $00, 1
+ dbsprite -1, -1, 4, 0, $01, 1
+ dbsprite 0, -1, 4, 0, $02, 1
+ dbsprite -2, 0, 4, 0, $10, 1
+ dbsprite -1, 0, 4, 0, $11, 1
+ dbsprite 0, 0, 4, 0, $12, 1
+
+.OAMData_GSIntroLapras1:
+ db 10
+ dbsprite -2, -2, 0, 4, $00, 0
+ dbsprite -1, -2, 0, 4, $01, 0
+ dbsprite 0, -2, 0, 4, $02, 0
+ dbsprite 1, -2, 0, 4, $03, 0
+ dbsprite -2, -1, 0, 4, $04, 0
+ dbsprite -1, -1, 0, 4, $05, 0
+ dbsprite 0, -1, 0, 4, $06, 0
+ dbsprite -2, 0, 0, 4, $08, 0
+ dbsprite -1, 0, 0, 4, $09, 0
+ dbsprite 0, 0, 0, 4, $0a, 0
+
+.OAMData_GSIntroLapras2:
+ db 27
+ dbsprite -3, -3, 0, 0, $00, 0
+ dbsprite -2, -3, 0, 0, $01, 0
+ dbsprite -1, -3, 0, 0, $02, 0
+ dbsprite -3, -2, 0, 0, $10, 0
+ dbsprite -2, -2, 0, 0, $11, 0
+ dbsprite -1, -2, 0, 0, $12, 0
+ dbsprite -3, -1, 0, 0, $20, 0
+ dbsprite -2, -1, 0, 0, $21, 0
+ dbsprite -1, -1, 0, 0, $22, 0
+ dbsprite 0, -1, 0, 0, $23, 0
+ dbsprite -3, 0, 0, 0, $30, 0 | PRIORITY
+ dbsprite -2, 0, 0, 0, $31, 0 | PRIORITY
+ dbsprite -1, 0, 0, 0, $32, 0 | PRIORITY
+ dbsprite 0, 0, 0, 0, $33, 0 | PRIORITY
+ dbsprite 1, 0, 0, 0, $34, 0 | PRIORITY
+ dbsprite -3, 1, 0, 0, $40, 0 | PRIORITY
+ dbsprite -2, 1, 0, 0, $41, 0 | PRIORITY
+ dbsprite -1, 1, 0, 0, $42, 0 | PRIORITY
+ dbsprite 0, 1, 0, 0, $43, 0 | PRIORITY
+ dbsprite 1, 1, 0, 0, $44, 0 | PRIORITY
+ dbsprite 2, 1, 0, 0, $45, 0 | PRIORITY
+ dbsprite -3, 2, 0, 0, $50, 0 | PRIORITY
+ dbsprite -2, 2, 0, 0, $51, 0 | PRIORITY
+ dbsprite -1, 2, 0, 0, $52, 0 | PRIORITY
+ dbsprite 0, 2, 0, 0, $53, 0 | PRIORITY
+ dbsprite 1, 2, 0, 0, $54, 0 | PRIORITY
+ dbsprite 2, 2, 0, 0, $55, 0 | PRIORITY
+
+.OAMData_GSIntroLapras3:
+ db 27
+ dbsprite -3, -3, 0, 0, $0d, 0
+ dbsprite -2, -3, 0, 0, $0e, 0
+ dbsprite -1, -3, 0, 0, $0f, 0
+ dbsprite -3, -2, 0, 0, $1d, 0
+ dbsprite -2, -2, 0, 0, $1e, 0
+ dbsprite -1, -2, 0, 0, $1f, 0
+ dbsprite -3, -1, 0, 0, $20, 0
+ dbsprite -2, -1, 0, 0, $21, 0
+ dbsprite -1, -1, 0, 0, $22, 0
+ dbsprite 0, -1, 0, 0, $23, 0
+ dbsprite -3, 0, 0, 0, $30, 0 | PRIORITY
+ dbsprite -2, 0, 0, 0, $31, 0 | PRIORITY
+ dbsprite -1, 0, 0, 0, $32, 0 | PRIORITY
+ dbsprite 0, 0, 0, 0, $33, 0 | PRIORITY
+ dbsprite 1, 0, 0, 0, $34, 0 | PRIORITY
+ dbsprite -3, 1, 0, 0, $40, 0 | PRIORITY
+ dbsprite -2, 1, 0, 0, $41, 0 | PRIORITY
+ dbsprite -1, 1, 0, 0, $42, 0 | PRIORITY
+ dbsprite 0, 1, 0, 0, $43, 0 | PRIORITY
+ dbsprite 1, 1, 0, 0, $44, 0 | PRIORITY
+ dbsprite 2, 1, 0, 0, $45, 0 | PRIORITY
+ dbsprite -3, 2, 0, 0, $50, 0 | PRIORITY
+ dbsprite -2, 2, 0, 0, $51, 0 | PRIORITY
+ dbsprite -1, 2, 0, 0, $52, 0 | PRIORITY
+ dbsprite 0, 2, 0, 0, $53, 0 | PRIORITY
+ dbsprite 1, 2, 0, 0, $54, 0 | PRIORITY
+ dbsprite 2, 2, 0, 0, $55, 0 | PRIORITY
+
+.OAMData_GSIntroLapras4:
+ db 29
+ dbsprite -3, -3, 0, 0, $00, 0
+ dbsprite -2, -3, 0, 0, $01, 0
+ dbsprite -1, -3, 0, 0, $02, 0
+ dbsprite 0, -3, 0, 0, $03, 0
+ dbsprite -3, -2, 0, 0, $10, 0
+ dbsprite -2, -2, 0, 0, $11, 0
+ dbsprite -1, -2, 0, 0, $12, 0
+ dbsprite 0, -2, 0, 0, $13, 0
+ dbsprite -3, -1, 0, 0, $20, 0
+ dbsprite -2, -1, 0, 0, $21, 0
+ dbsprite -1, -1, 0, 0, $22, 0
+ dbsprite 0, -1, 0, 0, $23, 0
+ dbsprite 1, -1, 0, 0, $24, 0
+ dbsprite -3, 0, 0, 0, $30, 0 | PRIORITY
+ dbsprite -2, 0, 0, 0, $31, 0 | PRIORITY
+ dbsprite -1, 0, 0, 0, $32, 0 | PRIORITY
+ dbsprite 0, 0, 0, 0, $33, 0 | PRIORITY
+ dbsprite 1, 0, 0, 0, $34, 0 | PRIORITY
+ dbsprite -3, 1, 0, 0, $40, 0 | PRIORITY
+ dbsprite -2, 1, 0, 0, $41, 0 | PRIORITY
+ dbsprite -1, 1, 0, 0, $42, 0 | PRIORITY
+ dbsprite 0, 1, 0, 0, $43, 0 | PRIORITY
+ dbsprite 1, 1, 0, 0, $44, 0 | PRIORITY
+ dbsprite 2, 1, 0, 0, $45, 0 | PRIORITY
+ dbsprite -2, 2, 0, 0, $51, 0 | PRIORITY
+ dbsprite -1, 2, 0, 0, $52, 0 | PRIORITY
+ dbsprite 0, 2, 0, 0, $53, 0 | PRIORITY
+ dbsprite 1, 2, 0, 0, $54, 0 | PRIORITY
+ dbsprite 2, 2, 0, 0, $55, 0 | PRIORITY
+
+.OAMData_GSIntroNote:
+ db 2
+ dbsprite -1, -1, 4, 0, $00, 0
+ dbsprite -1, 0, 4, 0, $10, 0
+
+.OAMData_GSIntroPikachuTail:
+ db 5
+ dbsprite 3, -2, 0, 0, $00, 0
+ dbsprite 4, -2, 0, 0, $01, 0
+ dbsprite 2, -1, 0, 0, $02, 0
+ dbsprite 3, -1, 0, 0, $03, 0
+ dbsprite 2, 0, 0, 0, $04, 0
+
+.OAMData_Leaf:
+ db 1
+ dbsprite -1, -1, 4, 4, $00, PAL_OW_TREE
+
+.OAMData_Tree:
+ db 4
+ dbsprite -1, -1, 0, 0, $00, PAL_OW_TREE
+ dbsprite 0, -1, 0, 0, $01, PAL_OW_TREE
+ dbsprite -1, 0, 0, 0, $02, PAL_OW_TREE
+ dbsprite 0, 0, 0, 0, $03, PAL_OW_TREE
+
+.OAMData_TextEntryCursor:
+ db 4
+ dbsprite -1, -1, 7, 7, $00, 0
+ dbsprite 0, -1, 0, 7, $00, 0 | X_FLIP
+ dbsprite -1, 0, 7, 0, $00, 0 | Y_FLIP
+ dbsprite 0, 0, 0, 0, $00, 0 | X_FLIP | Y_FLIP
+
+.OAMData_TextEntryCursorBig:
+ db 10
+ dbsprite 0, -1, 0, 7, $00, 0
+ dbsprite 1, -1, 0, 7, $01, 0
+ dbsprite 2, -1, 0, 7, $01, 0
+ dbsprite 3, -1, 0, 7, $01, 0
+ dbsprite 4, -1, 0, 7, $00, 0 | X_FLIP
+ dbsprite 0, 0, 0, 0, $00, 0 | Y_FLIP
+ dbsprite 1, 0, 0, 0, $01, 0 | Y_FLIP
+ dbsprite 2, 0, 0, 0, $01, 0 | Y_FLIP
+ dbsprite 3, 0, 0, 0, $01, 0 | Y_FLIP
+ dbsprite 4, 0, 0, 0, $00, 0 | X_FLIP | Y_FLIP
+
+.OAMData_GSIntroGameFreakLogo:
+ db 15
+ dbsprite -2, -3, 4, 4, $00, 1 | OBP_NUM
+ dbsprite -1, -3, 4, 4, $01, 1 | OBP_NUM
+ dbsprite 0, -3, 4, 4, $02, 1 | OBP_NUM
+ dbsprite -2, -2, 4, 4, $03, 1 | OBP_NUM
+ dbsprite -1, -2, 4, 4, $04, 1 | OBP_NUM
+ dbsprite 0, -2, 4, 4, $05, 1 | OBP_NUM
+ dbsprite -2, -1, 4, 4, $06, 1 | OBP_NUM
+ dbsprite -1, -1, 4, 4, $07, 1 | OBP_NUM
+ dbsprite 0, -1, 4, 4, $08, 1 | OBP_NUM
+ dbsprite -2, 0, 4, 4, $09, 1 | OBP_NUM
+ dbsprite -1, 0, 4, 4, $0a, 1 | OBP_NUM
+ dbsprite 0, 0, 4, 4, $0b, 1 | OBP_NUM
+ dbsprite -2, 1, 4, 4, $0c, 1 | OBP_NUM
+ dbsprite -1, 1, 4, 4, $0d, 1 | OBP_NUM
+ dbsprite 0, 1, 4, 4, $0e, 1 | OBP_NUM
+
+.OAMData_SlotsGolem:
+ db 6
+ dbsprite -2, -2, 4, 4, $00, 5 | OBP_NUM
+ dbsprite -1, -2, 4, 4, $02, 5 | OBP_NUM
+ dbsprite 0, -2, 4, 4, $00, 5 | OBP_NUM | X_FLIP
+ dbsprite -2, 0, 4, 4, $04, 5 | OBP_NUM
+ dbsprite -1, 0, 4, 4, $06, 5 | OBP_NUM
+ dbsprite 0, 0, 4, 4, $04, 5 | OBP_NUM | X_FLIP
+
+.OAMData_SlotsChansey1:
+ db 6
+ dbsprite -2, -2, 4, 4, $00, 6 | OBP_NUM
+ dbsprite -1, -2, 4, 4, $02, 6 | OBP_NUM
+ dbsprite 0, -2, 4, 4, $04, 6 | OBP_NUM
+ dbsprite -2, 0, 4, 4, $06, 6 | OBP_NUM
+ dbsprite -1, 0, 4, 4, $08, 6 | OBP_NUM
+ dbsprite 0, 0, 4, 4, $0a, 6 | OBP_NUM
+
+.OAMData_SlotsChansey2:
+ db 6
+ dbsprite -2, -2, 4, 4, $00, 6 | OBP_NUM
+ dbsprite -1, -2, 4, 4, $02, 6 | OBP_NUM
+ dbsprite 0, -2, 4, 4, $04, 6 | OBP_NUM
+ dbsprite -2, 0, 4, 4, $0c, 6 | OBP_NUM
+ dbsprite -1, 0, 4, 4, $0e, 6 | OBP_NUM
+ dbsprite 0, 0, 4, 4, $10, 6 | OBP_NUM
+
+.OAMData_SlotsChansey3:
+ db 6
+ dbsprite -2, -2, 4, 4, $00, 6 | OBP_NUM
+ dbsprite -1, -2, 4, 4, $02, 6 | OBP_NUM
+ dbsprite 0, -2, 4, 4, $04, 6 | OBP_NUM
+ dbsprite -2, 0, 4, 4, $12, 6 | OBP_NUM
+ dbsprite -1, 0, 4, 4, $14, 6 | OBP_NUM
+ dbsprite 0, 0, 4, 4, $16, 6 | OBP_NUM
+
+.OAMData_SlotsChansey4:
+ db 6
+ dbsprite -2, -2, 4, 4, $00, 6 | OBP_NUM
+ dbsprite -1, -2, 4, 4, $02, 6 | OBP_NUM
+ dbsprite 0, -2, 4, 4, $04, 6 | OBP_NUM
+ dbsprite -2, 0, 4, 4, $18, 6 | OBP_NUM
+ dbsprite -1, 0, 4, 4, $1a, 6 | OBP_NUM
+ dbsprite 0, 0, 4, 4, $1c, 6 | OBP_NUM
+
+.OAMData_SlotsChansey5:
+ db 6
+ dbsprite -2, -2, 4, 4, $1e, 6 | OBP_NUM
+ dbsprite -1, -2, 4, 4, $20, 6 | OBP_NUM
+ dbsprite 0, -2, 4, 4, $22, 6 | OBP_NUM
+ dbsprite -2, 0, 4, 4, $24, 6 | OBP_NUM
+ dbsprite -1, 0, 4, 4, $26, 6 | OBP_NUM
+ dbsprite 0, 0, 4, 4, $28, 6 | OBP_NUM
+
+.OAMData_RadioTuningKnob:
+ db 3
+ dbsprite -1, -2, 4, 4, $00, 0 | OBP_NUM
+ dbsprite -1, -1, 4, 4, $00, 0 | OBP_NUM
+ dbsprite -1, 0, 4, 4, $00, 0 | OBP_NUM
+
+.OAMData_Unused4B:
+ db 6
+ dbsprite 0, 0, 0, 0, $00, 0
+ dbsprite 1, 0, 0, 0, $01, 0
+ dbsprite 2, 0, 0, 0, $01, 0
+ dbsprite 3, 0, 0, 0, $01, 0
+ dbsprite 4, 0, 0, 0, $02, 0
+ dbsprite 5, 0, 0, 0, $03, 0
+
+.OAMData_Unused4C:
+ db 4
+ dbsprite 0, 0, 0, 0, $00, 0
+ dbsprite 1, 0, 0, 0, $01, 0
+ dbsprite 2, 0, 0, 0, $02, 0
+ dbsprite 3, 0, 0, 0, $03, 0
+
+.OAMData_CutTree2:
+ db 4
+ dbsprite -2, -1, 6, 0, $00, PAL_OW_TREE
+ dbsprite 0, -1, 2, 0, $01, PAL_OW_TREE
+ dbsprite -2, 0, 6, 0, $02, PAL_OW_TREE
+ dbsprite 0, 0, 2, 0, $03, PAL_OW_TREE
+
+.OAMData_CutTree3:
+ db 4
+ dbsprite -2, -1, 4, 0, $00, PAL_OW_TREE
+ dbsprite 0, -1, 4, 0, $01, PAL_OW_TREE
+ dbsprite -2, 0, 4, 0, $02, PAL_OW_TREE
+ dbsprite 0, 0, 4, 0, $03, PAL_OW_TREE
+
+.OAMData_CutTree4:
+ db 4
+ dbsprite -2, -1, 0, 0, $00, PAL_OW_TREE
+ dbsprite 1, -1, 0, 0, $01, PAL_OW_TREE
+ dbsprite -2, 0, 0, 0, $02, PAL_OW_TREE
+ dbsprite 1, 0, 0, 0, $03, PAL_OW_TREE
+
+IF DEF(_GOLD)
+.OAMData_GSIntroHoOh1:
+ db 19
+ dbsprite -4, -1, 0, 0, $00, 0
+ dbsprite -3, -2, 0, 0, $02, 0
+ dbsprite -3, 0, 0, 0, $04, 0
+ dbsprite -2, -3, 0, 0, $06, 0
+ dbsprite -2, -1, 0, 0, $08, 0
+ dbsprite -2, 1, 0, 0, $0a, 0
+ dbsprite -1, -3, 0, 0, $0c, 0
+ dbsprite -1, -1, 0, 0, $0e, 0
+ dbsprite -1, 1, 0, 0, $10, 0
+ dbsprite 0, -3, 0, 0, $12, 0
+ dbsprite 0, -1, 0, 0, $14, 0
+ dbsprite 0, 1, 0, 0, $16, 0
+ dbsprite 1, -3, 0, 0, $18, 0
+ dbsprite 1, -1, 0, 0, $1a, 0
+ dbsprite 1, 1, 0, 0, $1c, 0
+ dbsprite 2, -1, 0, 0, $1e, 0
+ dbsprite 2, 1, 0, 0, $20, 0
+ dbsprite 3, -2, 0, 0, $22, 0
+ dbsprite 3, 0, 0, 0, $24, 0
+
+.OAMData_GSIntroHoOh2:
+ db 16
+ dbsprite -4, -1, 0, 0, $00, 0
+ dbsprite -3, -2, 0, 0, $02, 0
+ dbsprite -3, 0, 0, 0, $04, 0
+ dbsprite -2, -1, 0, 0, $26, 0
+ dbsprite -2, 1, 0, 0, $0a, 0
+ dbsprite -1, -3, 0, 0, $28, 0
+ dbsprite -1, -1, 0, 0, $2a, 0
+ dbsprite -1, 1, 0, 0, $10, 0
+ dbsprite 0, -1, 0, 0, $2c, 0
+ dbsprite 0, 1, 0, 0, $16, 0
+ dbsprite 1, -1, 0, 0, $30, 0
+ dbsprite 1, 1, 0, 0, $1c, 0
+ dbsprite 2, -1, 0, 0, $1e, 0
+ dbsprite 2, 1, 0, 0, $20, 0
+ dbsprite 3, -2, 0, 0, $22, 0
+ dbsprite 3, 0, 0, 0, $24, 0
+
+.OAMData_GSIntroHoOh3:
+ db 15
+ dbsprite -4, -1, 0, 0, $00, 0
+ dbsprite -3, -2, 0, 0, $02, 0
+ dbsprite -3, 0, 0, 0, $32, 0
+ dbsprite -2, -1, 0, 0, $34, 0
+ dbsprite -2, 1, 0, 0, $36, 0
+ dbsprite -1, -1, 0, 0, $38, 0
+ dbsprite -1, 1, 0, 0, $3a, 0
+ dbsprite 0, -1, 0, 0, $3c, 0
+ dbsprite 0, 1, 0, 0, $3e, 0
+ dbsprite 1, -1, 0, 0, $30, 0
+ dbsprite 1, 1, 0, 0, $1c, 0
+ dbsprite 2, -1, 0, 0, $1e, 0
+ dbsprite 2, 1, 0, 0, $20, 0
+ dbsprite 3, -2, 0, 0, $22, 0
+ dbsprite 3, 0, 0, 0, $24, 0
+
+.OAMData_GSIntroHoOh4:
+ db 17
+ dbsprite -4, -1, 0, 0, $00, 0
+ dbsprite -3, -2, 0, 0, $02, 0
+ dbsprite -3, 0, 0, 0, $04, 0
+ dbsprite -2, -1, 0, 0, $40, 0
+ dbsprite -2, 1, 0, 0, $42, 0
+ dbsprite -2, 3, 0, 0, $44, 0
+ dbsprite -1, -1, 0, 0, $46, 0
+ dbsprite -1, 1, 0, 0, $48, 0
+ dbsprite -1, 3, 0, 0, $4a, 0
+ dbsprite 0, -1, 0, 0, $4c, 0
+ dbsprite 0, 1, 0, 0, $4e, 0
+ dbsprite 1, -1, 0, 0, $30, 0
+ dbsprite 1, 1, 0, 0, $1c, 0
+ dbsprite 2, -1, 0, 0, $1e, 0
+ dbsprite 2, 1, 0, 0, $20, 0
+ dbsprite 3, -2, 0, 0, $22, 0
+ dbsprite 3, 0, 0, 0, $24, 0
+
+.OAMData_GSIntroHoOh5:
+ db 17
+ dbsprite -4, -1, 0, 0, $00, 0
+ dbsprite -3, -2, 0, 0, $02, 0
+ dbsprite -3, 0, 0, 0, $04, 0
+ dbsprite -2, -1, 0, 0, $50, 0
+ dbsprite -2, 1, 0, 0, $0a, 0
+ dbsprite -1, -3, 0, 0, $52, 0
+ dbsprite -1, -1, 0, 0, $54, 0
+ dbsprite -1, 1, 0, 0, $10, 0
+ dbsprite 0, -3, 0, 0, $56, 0
+ dbsprite 0, -1, 0, 0, $2e, 0
+ dbsprite 0, 1, 0, 0, $16, 0
+ dbsprite 1, -1, 0, 0, $30, 0
+ dbsprite 1, 1, 0, 0, $1c, 0
+ dbsprite 2, -1, 0, 0, $1e, 0
+ dbsprite 2, 1, 0, 0, $20, 0
+ dbsprite 3, -2, 0, 0, $22, 0
+ dbsprite 3, 0, 0, 0, $24, 0
+
+.OAMData_GSTitleTrail:
+ db 1
+ dbsprite -1, -1, 4, 4, $00, 1 | OBP_NUM
+
+ELIF DEF(_SILVER)
+.OAMData_GSIntroLugia1:
+ db 16
+ dbsprite -5, -2, 0, 0, $00, 0
+ dbsprite -5, 0, 0, 0, $02, 0
+ dbsprite -4, -2, 0, 0, $04, 0
+ dbsprite -4, 0, 0, 0, $06, 0
+ dbsprite -3, -1, 0, 0, $08, 0
+ dbsprite -2, -1, 0, 0, $0a, 0
+ dbsprite -1, -2, 0, 0, $0c, 0
+ dbsprite -1, 0, 0, 0, $0e, 0
+ dbsprite 0, -2, 0, 0, $10, 0
+ dbsprite 0, 0, 0, 0, $12, 0
+ dbsprite 1, -2, 0, 0, $14, 0
+ dbsprite 1, 0, 0, 0, $16, 0
+ dbsprite 2, -2, 0, 0, $18, 0
+ dbsprite 2, 0, 0, 0, $1a, 0
+ dbsprite 3, -1, 0, 0, $1c, 0
+ dbsprite 4, -1, 0, 0, $1e, 0
+
+.OAMData_GSIntroLugia2:
+ db 16
+ dbsprite -5, -2, 0, 0, $00, 0
+ dbsprite -5, 0, 0, 0, $02, 0
+ dbsprite -4, -2, 0, 0, $04, 0
+ dbsprite -4, 0, 0, 0, $06, 0
+ dbsprite -3, -1, 0, 0, $08, 0
+ dbsprite -2, -1, 0, 0, $0a, 0
+ dbsprite -1, -2, 0, 0, $0c, 0
+ dbsprite -1, 0, 0, 0, $0e, 0
+ dbsprite 0, -2, 0, 0, $10, 0
+ dbsprite 0, 0, 0, 0, $12, 0
+ dbsprite 1, -2, 0, 0, $14, 0
+ dbsprite 1, 0, 0, 0, $16, 0
+ dbsprite 2, -2, 0, 0, $18, 0
+ dbsprite 2, 0, 0, 0, $1a, 0
+ dbsprite 3, -2, 0, 0, $1c, 0
+ dbsprite 4, -2, 0, 0, $1e, 0
+
+.OAMData_GSIntroLugia3:
+ db 17
+ dbsprite -5, -2, 0, 0, $3c, 0
+ dbsprite -5, 0, 0, 0, $3e, 0
+ dbsprite -4, -2, 0, 0, $40, 0
+ dbsprite -4, 0, 0, 0, $42, 0
+ dbsprite -3, -1, 0, 0, $44, 0
+ dbsprite -2, -2, 0, 0, $46, 0
+ dbsprite -2, 0, 0, 0, $48, 0
+ dbsprite -1, -2, 0, 0, $4a, 0
+ dbsprite -1, 0, 0, 0, $78, 0
+ dbsprite 0, -2, 0, 0, $4c, 0
+ dbsprite 0, 0, 0, 0, $7a, 0
+ dbsprite 1, -2, 0, 0, $4e, 0
+ dbsprite 1, 0, 0, 0, $50, 0
+ dbsprite 2, -2, 0, 0, $52, 0
+ dbsprite 2, 0, 0, 0, $54, 0
+ dbsprite 3, -1, 0, 0, $56, 0
+ dbsprite 4, -1, 0, 0, $58, 0
+
+.OAMData_GSIntroLugia4:
+ db 17
+ dbsprite -5, -2, 0, 0, $5a, 0
+ dbsprite -5, 0, 0, 0, $5c, 0
+ dbsprite -4, -2, 0, 0, $5e, 0
+ dbsprite -4, 0, 0, 0, $60, 0
+ dbsprite -3, -1, 0, 0, $62, 0
+ dbsprite -2, -2, 0, 0, $64, 0
+ dbsprite -2, 0, 0, 0, $66, 0
+ dbsprite -1, -2, 0, 0, $68, 0
+ dbsprite -1, 0, 0, 0, $78, 0
+ dbsprite 0, -2, 0, 0, $6a, 0
+ dbsprite 0, 0, 0, 0, $7a, 0
+ dbsprite 1, -2, 0, 0, $6c, 0
+ dbsprite 1, 0, 0, 0, $6e, 0
+ dbsprite 2, -2, 0, 0, $70, 0
+ dbsprite 2, 0, 0, 0, $72, 0
+ dbsprite 3, -1, 0, 0, $74, 0
+ dbsprite 4, -1, 0, 0, $76, 0
+
+; unused / copy of intro4
+.OAMData_GSIntroLugia5:
+ db 17
+ dbsprite -5, -2, 0, 0, $5a, 0
+ dbsprite -5, 0, 0, 0, $5c, 0
+ dbsprite -4, -2, 0, 0, $5e, 0
+ dbsprite -4, 0, 0, 0, $60, 0
+ dbsprite -3, -1, 0, 0, $62, 0
+ dbsprite -2, -2, 0, 0, $64, 0
+ dbsprite -2, 0, 0, 0, $66, 0
+ dbsprite -1, -2, 0, 0, $68, 0
+ dbsprite -1, 0, 0, 0, $78, 0
+ dbsprite 0, -2, 0, 0, $6a, 0
+ dbsprite 0, 0, 0, 0, $7a, 0
+ dbsprite 1, -2, 0, 0, $6c, 0
+ dbsprite 1, 0, 0, 0, $6e, 0
+ dbsprite 2, -2, 0, 0, $70, 0
+ dbsprite 2, 0, 0, 0, $72, 0
+ dbsprite 3, -1, 0, 0, $74, 0
+ dbsprite 4, -1, 0, 0, $76, 0
+
+.OAMData_GSTitleTrail:
+ db 2
+ dbsprite -1, -1, 0, 0, $00, 0
+ dbsprite 0, -1, 0, 0, $02, 0
+ENDC
diff --git a/data/sprite_anims/sequences.asm b/data/sprite_anims/sequences.asm
new file mode 100755
index 00000000..2c240d24
--- /dev/null
+++ b/data/sprite_anims/sequences.asm
@@ -0,0 +1,50 @@
+SpriteAnimSeqData:
+; entries correspond to SPRITE_ANIM_INDEX_* constants
+ ; frameset, sequence, tile
+ db SPRITE_ANIM_FRAMESET_PARTY_MON, SPRITE_ANIM_SEQ_PARTY_MON, $00 ; SPRITE_ANIM_INDEX_PARTY_MON
+ db SPRITE_ANIM_FRAMESET_GS_INTRO_BUBBLE, SPRITE_ANIM_SEQ_GS_INTRO_BUBBLE, $00 ; SPRITE_ANIM_INDEX_GS_INTRO_BUBBLE
+ db SPRITE_ANIM_FRAMESET_GS_INTRO_SHELLDER, SPRITE_ANIM_SEQ_GS_INTRO_SHELLDER, $00 ; SPRITE_ANIM_INDEX_GS_INTRO_SHELLDER
+ db SPRITE_ANIM_FRAMESET_GS_INTRO_MAGIKARP, SPRITE_ANIM_SEQ_GS_INTRO_MAGIKARP, $00 ; SPRITE_ANIM_INDEX_GS_INTRO_MAGIKARP
+ db SPRITE_ANIM_FRAMESET_GS_INTRO_LAPRAS, SPRITE_ANIM_SEQ_GS_INTRO_LAPRAS, $00 ; SPRITE_ANIM_INDEX_GS_INTRO_LAPRAS
+ db SPRITE_ANIM_FRAMESET_GS_INTRO_LAPRAS_2, SPRITE_ANIM_SEQ_GS_INTRO_LAPRAS_2, $00 ; SPRITE_ANIM_INDEX_GS_INTRO_LAPRAS_2
+ db SPRITE_ANIM_FRAMESET_GS_INTRO_NOTE, SPRITE_ANIM_SEQ_GS_INTRO_NOTE, $01 ; SPRITE_ANIM_INDEX_GS_INTRO_NOTE
+ db SPRITE_ANIM_FRAMESET_GS_INTRO_INVISIBLE_NOTE, SPRITE_ANIM_SEQ_GS_INTRO_NOTE, $01 ; SPRITE_ANIM_INDEX_GS_INTRO_INVISIBLE_NOTE
+ db SPRITE_ANIM_FRAMESET_GS_INTRO_JIGGLYPUFF, SPRITE_ANIM_SEQ_GS_INTRO_JIGGLYPUFF, $01 ; SPRITE_ANIM_INDEX_GS_INTRO_JIGGLYPUFF
+ db SPRITE_ANIM_FRAMESET_GS_INTRO_PIKACHU, SPRITE_ANIM_SEQ_GS_INTRO_PIKACHU, $01 ; SPRITE_ANIM_INDEX_GS_INTRO_PIKACHU
+ db SPRITE_ANIM_FRAMESET_GS_INTRO_PIKACHU_TAIL, SPRITE_ANIM_SEQ_GS_INTRO_PIKACHU_TAIL, $01 ; SPRITE_ANIM_INDEX_GS_INTRO_PIKACHU_TAIL
+ db SPRITE_ANIM_FRAMESET_GS_INTRO_FIREBALL, SPRITE_ANIM_SEQ_GS_INTRO_FIREBALL, $02 ; SPRITE_ANIM_INDEX_GS_INTRO_FIREBALL
+ db SPRITE_ANIM_FRAMESET_GS_INTRO_CHIKORITA, SPRITE_ANIM_SEQ_GS_INTRO_CHIKORITA_TOTODILE, $02 ; SPRITE_ANIM_INDEX_GS_INTRO_CHIKORITA
+ db SPRITE_ANIM_FRAMESET_GS_INTRO_CYNDAQUIL, SPRITE_ANIM_SEQ_GS_INTRO_CYNDAQUIL, $02 ; SPRITE_ANIM_INDEX_GS_INTRO_CYNDAQUIL
+ db SPRITE_ANIM_FRAMESET_GS_INTRO_TOTODILE, SPRITE_ANIM_SEQ_GS_INTRO_CHIKORITA_TOTODILE, $02 ; SPRITE_ANIM_INDEX_GS_INTRO_TOTODILE
+ db SPRITE_ANIM_FRAMESET_GS_TITLE_TRAIL, SPRITE_ANIM_SEQ_GS_TITLE_TRAIL, $00 ; SPRITE_ANIM_INDEX_GS_TITLE_TRAIL
+ db SPRITE_ANIM_FRAMESET_GS_INTRO_PIKACHU, SPRITE_ANIM_SEQ_UNUSED_PIKACHU, $01 ; SPRITE_ANIM_INDEX_UNUSED_PIKACHU
+ db SPRITE_ANIM_FRAMESET_GS_INTRO_PIKACHU_TAIL, SPRITE_ANIM_SEQ_UNUSED_PIKACHU_TAIL, $01 ; SPRITE_ANIM_INDEX_UNUSED_PIKACHU_TAIL
+ db SPRITE_ANIM_FRAMESET_GS_INTRO_NOTE, SPRITE_ANIM_SEQ_UNUSED_NOTE, $01 ; SPRITE_ANIM_INDEX_UNUSED_NOTE
+ db SPRITE_ANIM_FRAMESET_GS_INTRO_JIGGLYPUFF, SPRITE_ANIM_SEQ_UNUSED_JIGGLYPUFF, $01 ; SPRITE_ANIM_INDEX_UNUSED_JIGGLYPUFF
+ db SPRITE_ANIM_FRAMESET_TEXT_ENTRY_CURSOR, SPRITE_ANIM_SEQ_NAMING_SCREEN_CURSOR, $05 ; SPRITE_ANIM_INDEX_NAMING_SCREEN_CURSOR
+ db SPRITE_ANIM_FRAMESET_GAMEFREAK_LOGO, SPRITE_ANIM_SEQ_GAMEFREAK_LOGO, $06 ; SPRITE_ANIM_INDEX_GAMEFREAK_LOGO
+ db SPRITE_ANIM_FRAMESET_GS_INTRO_STAR, SPRITE_ANIM_SEQ_GS_INTRO_STAR, $06 ; SPRITE_ANIM_INDEX_GS_INTRO_STAR
+ db SPRITE_ANIM_FRAMESET_GS_INTRO_SPARKLE, SPRITE_ANIM_SEQ_GS_INTRO_SPARKLE, $06 ; SPRITE_ANIM_INDEX_GS_INTRO_SPARKLE
+ db SPRITE_ANIM_FRAMESET_SLOTS_GOLEM, SPRITE_ANIM_SEQ_SLOTS_GOLEM, $07 ; SPRITE_ANIM_INDEX_SLOTS_GOLEM
+ db SPRITE_ANIM_FRAMESET_SLOTS_CHANSEY, SPRITE_ANIM_SEQ_SLOTS_CHANSEY, $07 ; SPRITE_ANIM_INDEX_SLOTS_CHANSEY
+ db SPRITE_ANIM_FRAMESET_SLOTS_EGG, SPRITE_ANIM_SEQ_SLOTS_EGG, $07 ; SPRITE_ANIM_INDEX_SLOTS_EGG
+ db SPRITE_ANIM_FRAMESET_TEXT_ENTRY_CURSOR, SPRITE_ANIM_SEQ_MAIL_CURSOR, $05 ; SPRITE_ANIM_INDEX_COMPOSE_MAIL_CURSOR
+ db SPRITE_ANIM_FRAMESET_RED_WALK, SPRITE_ANIM_SEQ_NULL, $00 ; SPRITE_ANIM_INDEX_RED_WALK
+ db SPRITE_ANIM_FRAMESET_STILL_CURSOR, SPRITE_ANIM_SEQ_UNUSED_CURSOR, $08 ; SPRITE_ANIM_INDEX_UNUSED_CURSOR
+ db SPRITE_ANIM_FRAMESET_STILL_CURSOR, SPRITE_ANIM_SEQ_DUMMY_GAME_CURSOR, $08 ; SPRITE_ANIM_INDEX_DUMMY_GAME
+ db SPRITE_ANIM_FRAMESET_STILL_CURSOR, SPRITE_ANIM_SEQ_POKEGEAR_ARROW, $08 ; SPRITE_ANIM_INDEX_POKEGEAR_ARROW
+ db SPRITE_ANIM_FRAMESET_TRADE_POKE_BALL, SPRITE_ANIM_SEQ_TRADE_POKE_BALL, $00 ; SPRITE_ANIM_INDEX_TRADE_POKE_BALL
+ db SPRITE_ANIM_FRAMESET_TRADE_POOF, SPRITE_ANIM_SEQ_NULL, $00 ; SPRITE_ANIM_INDEX_TRADE_POOF
+ db SPRITE_ANIM_FRAMESET_TRADE_TUBE_BULGE, SPRITE_ANIM_SEQ_TRADE_TUBE_BULGE, $00 ; SPRITE_ANIM_INDEX_TRADE_TUBE_BULGE
+ db SPRITE_ANIM_FRAMESET_TRADEMON_ICON, SPRITE_ANIM_SEQ_TRADEMON_IN_TUBE, $00 ; SPRITE_ANIM_INDEX_TRADEMON_ICON
+ db SPRITE_ANIM_FRAMESET_TRADEMON_BUBBLE, SPRITE_ANIM_SEQ_TRADEMON_IN_TUBE, $00 ; SPRITE_ANIM_INDEX_TRADEMON_BUBBLE
+ db SPRITE_ANIM_FRAMESET_EVOLUTION_BALL_OF_LIGHT, SPRITE_ANIM_SEQ_REVEAL_NEW_MON, $00 ; SPRITE_ANIM_INDEX_EVOLUTION_BALL_OF_LIGHT
+ db SPRITE_ANIM_FRAMESET_RADIO_TUNING_KNOB, SPRITE_ANIM_SEQ_RADIO_TUNING_KNOB, $00 ; SPRITE_ANIM_INDEX_RADIO_TUNING_KNOB
+ db SPRITE_ANIM_FRAMESET_MAGNET_TRAIN_RED, SPRITE_ANIM_SEQ_NULL, $00 ; SPRITE_ANIM_INDEX_MAGNET_TRAIN_RED
+ db SPRITE_ANIM_FRAMESET_LEAF, SPRITE_ANIM_SEQ_CUT_LEAVES, $00 ; SPRITE_ANIM_INDEX_LEAF
+ db SPRITE_ANIM_FRAMESET_CUT_TREE, SPRITE_ANIM_SEQ_NULL, $00 ; SPRITE_ANIM_INDEX_CUT_TREE
+ db SPRITE_ANIM_FRAMESET_LEAF, SPRITE_ANIM_SEQ_FLY_LEAF, $00 ; SPRITE_ANIM_INDEX_FLY_LEAF
+ db SPRITE_ANIM_FRAMESET_EGG_CRACK, SPRITE_ANIM_SEQ_NULL, $00 ; SPRITE_ANIM_INDEX_EGG_CRACK
+ db SPRITE_ANIM_FRAMESET_GS_INTRO_HO_OH_LUGIA, SPRITE_ANIM_SEQ_GS_INTRO_HO_OH_LUGIA, $00 ; SPRITE_ANIM_INDEX_GS_INTRO_HO_OH
+ db SPRITE_ANIM_FRAMESET_HEADBUTT, SPRITE_ANIM_SEQ_NULL, $00 ; SPRITE_ANIM_INDEX_HEADBUTT
+ db SPRITE_ANIM_FRAMESET_EGG_HATCH_1, SPRITE_ANIM_SEQ_REVEAL_NEW_MON, $00 ; SPRITE_ANIM_INDEX_EGG_HATCH
diff --git a/engine/battle/battle_transition.asm b/engine/battle/battle_transition.asm
new file mode 100755
index 00000000..4de4d347
--- /dev/null
+++ b/engine/battle/battle_transition.asm
@@ -0,0 +1,747 @@
+; BattleTransitionJumptable.Jumptable indexes
+BATTLETRANSITION_CAVE EQU $01
+BATTLETRANSITION_CAVE_STRONGER EQU $09
+BATTLETRANSITION_NO_CAVE EQU $10
+BATTLETRANSITION_NO_CAVE_STRONGER EQU $18
+BATTLETRANSITION_FINISH EQU $20
+BATTLETRANSITION_END EQU $80
+
+BATTLETRANSITION_SQUARE EQU "8" ; $fe
+BATTLETRANSITION_BLACK EQU "9" ; $ff
+
+DoBattleTransition:
+ call .InitGFX
+ ldh a, [rBGP]
+ ld [wBGP], a
+ ldh a, [rOBP0]
+ ld [wOBP0], a
+ ldh a, [rOBP1]
+ ld [wOBP1], a
+ call DelayFrame
+ ld hl, hVBlank
+ ld a, [hl]
+ push af
+ ld [hl], 1
+
+.loop
+ ld a, [wJumptableIndex]
+ bit 7, a ; BATTLETRANSITION_END?
+ jr nz, .done
+ call BattleTransitionJumptable
+ call DelayFrame
+ jr .loop
+
+.done
+ ld hl, wBGPals1
+ ld bc, 8 palettes
+ xor a
+ call ByteFill
+
+ ld a, %11111111
+ ld [wBGP], a
+ call DmgToCgbBGPals
+ call DelayFrame
+ xor a
+ ldh [hLCDCPointer], a
+ ldh [hLYOverrideStart], a
+ ldh [hLYOverrideEnd], a
+ ldh [hSCY], a
+
+ pop af
+ ldh [hVBlank], a
+ call DelayFrame
+ ret
+
+.InitGFX:
+ farcall ReanchorBGMap_NoOAMUpdate
+ call UpdateSprites
+ call DelayFrame
+ call ConvertTrainerBattlePokeballTilesTo2bpp
+ call CGBOnly_CopyTilemapAtOnce
+
+ ld a, SCREEN_HEIGHT_PX
+ ldh [hWY], a
+ call DelayFrame
+ xor a
+ ldh [hBGMapMode], a
+ ld hl, wJumptableIndex
+ xor a
+ ld [hli], a
+ ld [hli], a
+ ld [hl], a
+ call WipeLYOverrides
+ ret
+
+ConvertTrainerBattlePokeballTilesTo2bpp:
+ ld hl, wDecompressScratch
+ ld bc, $28 tiles
+.loop
+ ld [hl], -1
+ inc hl
+ dec bc
+ ld a, c
+ or b
+ jr nz, .loop
+
+ ld de, wDecompressScratch
+ ld hl, vBGMap2
+ ld b, BANK(@)
+ ld c, $28
+ call Request2bpp
+
+ ld de, TrainerBattlePokeballTiles
+ ld hl, vTiles3 tile BATTLETRANSITION_SQUARE
+ ld b, BANK(TrainerBattlePokeballTiles)
+ ld c, 2
+ call Request2bpp
+ ret
+
+TrainerBattlePokeballTiles:
+INCBIN "gfx/overworld/trainer_battle_pokeball_tiles.2bpp"
+
+BattleTransitionJumptable:
+ jumptable .Jumptable, wJumptableIndex
+
+.Jumptable
+ dw StartTrainerBattle_DetermineWhichAnimation ; 00
+
+ ; BATTLETRANSITION_CAVE
+ dw StartTrainerBattle_LoadPokeBallGraphics ; 01
+ dw StartTrainerBattle_SetUpBGMap ; 02
+ dw StartTrainerBattle_Flash ; 03
+ dw StartTrainerBattle_Flash ; 04
+ dw StartTrainerBattle_Flash ; 05
+ dw StartTrainerBattle_NextScene ; 06
+ dw StartTrainerBattle_SetUpForWavyOutro ; 07
+ dw StartTrainerBattle_SineWave ; 08
+
+ ; BATTLETRANSITION_CAVE_STRONGER
+ dw StartTrainerBattle_LoadPokeBallGraphics ; 09
+ dw StartTrainerBattle_SetUpBGMap ; 0a
+ dw StartTrainerBattle_Flash ; 0b
+ dw StartTrainerBattle_Flash ; 0c
+ dw StartTrainerBattle_Flash ; 0d
+ dw StartTrainerBattle_NextScene ; 0e
+ ; There is no setup for this one
+ dw StartTrainerBattle_ZoomToBlack ; 0f
+
+ ; BATTLETRANSITION_NO_CAVE
+ dw StartTrainerBattle_LoadPokeBallGraphics ; 10
+ dw StartTrainerBattle_SetUpBGMap ; 11
+ dw StartTrainerBattle_Flash ; 12
+ dw StartTrainerBattle_Flash ; 13
+ dw StartTrainerBattle_Flash ; 14
+ dw StartTrainerBattle_NextScene ; 15
+ dw StartTrainerBattle_SetUpForSpinOutro ; 16
+ dw StartTrainerBattle_SpinToBlack ; 17
+
+ ; BATTLETRANSITION_NO_CAVE_STRONGER
+ dw StartTrainerBattle_LoadPokeBallGraphics ; 18
+ dw StartTrainerBattle_SetUpBGMap ; 19
+ dw StartTrainerBattle_Flash ; 1a
+ dw StartTrainerBattle_Flash ; 1b
+ dw StartTrainerBattle_Flash ; 1c
+ dw StartTrainerBattle_NextScene ; 1d
+ dw StartTrainerBattle_SetUpForRandomScatterOutro ; 1e
+ dw StartTrainerBattle_SpeckleToBlack ; 1f
+
+ ; BATTLETRANSITION_FINISH
+ dw StartTrainerBattle_Finish ; 20
+
+; transition animations
+ const_def
+ const TRANS_CAVE
+ const TRANS_CAVE_STRONGER
+ const TRANS_NO_CAVE
+ const TRANS_NO_CAVE_STRONGER
+
+; transition animation bits
+TRANS_STRONGER_F EQU 0 ; bit set in TRANS_CAVE_STRONGER and TRANS_NO_CAVE_STRONGER
+TRANS_NO_CAVE_F EQU 1 ; bit set in TRANS_NO_CAVE and TRANS_NO_CAVE_STRONGER
+
+StartTrainerBattle_DetermineWhichAnimation:
+; The screen flashes a different number of times depending on the level of
+; your lead Pokemon relative to the opponent's.
+; BUG: wBattleMonLevel and wEnemyMonLevel are not set at this point, so whatever
+; values happen to be there will determine the animation.
+ ld de, 0
+ ld a, [wBattleMonLevel]
+ add 3
+ ld hl, wEnemyMonLevel
+ cp [hl]
+ jr nc, .not_stronger
+ set TRANS_STRONGER_F, e
+.not_stronger
+ ld a, [wEnvironment]
+ cp CAVE
+ jr z, .cave
+ cp ENVIRONMENT_5
+ jr z, .cave
+ cp DUNGEON
+ jr z, .cave
+ set TRANS_NO_CAVE_F, e
+.cave
+ ld hl, .StartingPoints
+ add hl, de
+ ld a, [hl]
+ ld [wJumptableIndex], a
+ ret
+
+.StartingPoints:
+; entries correspond to TRANS_* constants
+ db BATTLETRANSITION_CAVE
+ db BATTLETRANSITION_CAVE_STRONGER
+ db BATTLETRANSITION_NO_CAVE
+ db BATTLETRANSITION_NO_CAVE_STRONGER
+
+StartTrainerBattle_Finish:
+ call ClearSprites
+ ld a, BATTLETRANSITION_END
+ ld [wJumptableIndex], a
+ ret
+
+StartTrainerBattle_NextScene:
+ ld hl, wJumptableIndex
+ inc [hl]
+ ret
+
+StartTrainerBattle_SetUpBGMap:
+ call StartTrainerBattle_NextScene
+ xor a
+ ld [wce64], a
+ ldh [hBGMapMode], a
+ ret
+
+StartTrainerBattle_Flash:
+ call .DoFlashAnimation
+ ret nc
+ call StartTrainerBattle_NextScene
+ ret
+
+.DoFlashAnimation:
+ ld a, [wTimeOfDayPalset]
+ cp %11111111 ; dark cave
+ jr z, .done
+ ld hl, wce64
+ ld a, [hl]
+ inc [hl]
+ srl a
+ ld e, a
+ ld d, 0
+ ld hl, .pals
+ add hl, de
+ ld a, [hl]
+ cp %00000001
+ jr z, .done
+ ld [wBGP], a
+ call DmgToCgbBGPals
+ and a
+ ret
+
+.done
+ xor a
+ ld [wce64], a
+ scf
+ ret
+
+.pals
+ dc 3, 3, 2, 1
+ dc 3, 3, 3, 2
+ dc 3, 3, 3, 3
+ dc 3, 3, 3, 2
+ dc 3, 3, 2, 1
+ dc 3, 2, 1, 0
+ dc 2, 1, 0, 0
+ dc 1, 0, 0, 0
+ dc 0, 0, 0, 0
+ dc 1, 0, 0, 0
+ dc 2, 1, 0, 0
+ dc 3, 2, 1, 0
+ dc 0, 0, 0, 1
+
+StartTrainerBattle_SetUpForWavyOutro:
+ farcall Function55a1
+
+ call StartTrainerBattle_NextScene
+
+ ld a, LOW(rSCX)
+ ldh [hLCDCPointer], a
+ xor a
+ ldh [hLYOverrideStart], a
+ ld a, $90
+ ldh [hLYOverrideEnd], a
+ xor a
+ ld [wce64], a
+ ld [wce65], a
+ ret
+
+StartTrainerBattle_SineWave:
+ ld a, [wce64]
+ cp $60
+ jr nc, .end
+ call .DoSineWave
+ ret
+
+.end
+ ld a, BATTLETRANSITION_FINISH
+ ld [wJumptableIndex], a
+ ret
+
+.DoSineWave:
+ ld hl, wce65
+ ld a, [hl]
+ inc [hl]
+ ld hl, wce64
+ ld d, [hl]
+ add [hl]
+ ld [hl], a
+ ld a, wLYOverridesEnd - wLYOverrides
+ ld bc, wLYOverrides
+ ld e, 0
+
+.loop
+ push af
+ push de
+ ld a, e
+ call StartTrainerBattle_DrawSineWave
+ ld [bc], a
+ inc bc
+ pop de
+ ld a, e
+ add 2
+ ld e, a
+ pop af
+ dec a
+ jr nz, .loop
+ ret
+
+StartTrainerBattle_SetUpForSpinOutro:
+ farcall Function55a1
+ call StartTrainerBattle_NextScene
+ xor a
+ ld [wce64], a
+ ret
+
+StartTrainerBattle_SpinToBlack:
+ xor a
+ ldh [hBGMapMode], a
+ ld a, [wce64]
+ ld e, a
+ ld d, 0
+ ld hl, .spintable
+rept 5
+ add hl, de
+endr
+ ld a, [hli]
+ cp -1
+ jr z, .end
+ ld [wce65], a
+ call .load
+ ld a, 1
+ ldh [hBGMapMode], a
+ call DelayFrame
+ call DelayFrame
+ ld hl, wce64
+ inc [hl]
+ ret
+
+.end
+ ld a, 1
+ ldh [hBGMapMode], a
+ call DelayFrame
+ call DelayFrame
+ call DelayFrame
+ xor a
+ ldh [hBGMapMode], a
+ ld a, BATTLETRANSITION_FINISH
+ ld [wJumptableIndex], a
+ ret
+
+; quadrants
+ const_def
+ const UPPER_LEFT
+ const UPPER_RIGHT
+ const LOWER_LEFT
+ const LOWER_RIGHT
+
+; quadrant bits
+RIGHT_QUADRANT_F EQU 0 ; bit set in UPPER_RIGHT and LOWER_RIGHT
+LOWER_QUADRANT_F EQU 1 ; bit set in LOWER_LEFT and LOWER_RIGHT
+
+.spintable
+spintable_entry: MACRO
+ db \1
+ dw .wedge\2
+ dwcoord \3, \4
+ENDM
+ spintable_entry UPPER_LEFT, 1, 1, 6
+ spintable_entry UPPER_LEFT, 2, 0, 3
+ spintable_entry UPPER_LEFT, 3, 1, 0
+ spintable_entry UPPER_LEFT, 4, 5, 0
+ spintable_entry UPPER_LEFT, 5, 9, 0
+ spintable_entry UPPER_RIGHT, 5, 10, 0
+ spintable_entry UPPER_RIGHT, 4, 14, 0
+ spintable_entry UPPER_RIGHT, 3, 18, 0
+ spintable_entry UPPER_RIGHT, 2, 19, 3
+ spintable_entry UPPER_RIGHT, 1, 18, 6
+ spintable_entry LOWER_RIGHT, 1, 18, 11
+ spintable_entry LOWER_RIGHT, 2, 19, 14
+ spintable_entry LOWER_RIGHT, 3, 18, 17
+ spintable_entry LOWER_RIGHT, 4, 14, 17
+ spintable_entry LOWER_RIGHT, 5, 10, 17
+ spintable_entry LOWER_LEFT, 5, 9, 17
+ spintable_entry LOWER_LEFT, 4, 5, 17
+ spintable_entry LOWER_LEFT, 3, 1, 17
+ spintable_entry LOWER_LEFT, 2, 0, 14
+ spintable_entry LOWER_LEFT, 1, 1, 11
+ db -1
+
+.load
+ ld a, [hli]
+ ld e, a
+ ld a, [hli]
+ ld d, a
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+.loop
+ push hl
+ ld a, [de]
+ ld c, a
+ inc de
+.loop1
+ ld [hl], BATTLETRANSITION_BLACK
+ ld a, [wce65]
+ bit RIGHT_QUADRANT_F, a
+ jr z, .leftside
+ inc hl
+ jr .okay1
+.leftside
+ dec hl
+.okay1
+ dec c
+ jr nz, .loop1
+ pop hl
+ ld a, [wce65]
+ bit LOWER_QUADRANT_F, a
+ ld bc, SCREEN_WIDTH
+ jr z, .upper
+ ld bc, -SCREEN_WIDTH
+.upper
+ add hl, bc
+ ld a, [de]
+ inc de
+ cp -1
+ ret z
+ and a
+ jr z, .loop
+ ld c, a
+.loop2
+ ld a, [wce65]
+ bit RIGHT_QUADRANT_F, a
+ jr z, .leftside2
+ dec hl
+ jr .okay2
+.leftside2
+ inc hl
+.okay2
+ dec c
+ jr nz, .loop2
+ jr .loop
+
+.wedge1 db 2, 3, 5, 4, 9, -1
+.wedge2 db 1, 1, 2, 2, 4, 2, 4, 2, 3, -1
+.wedge3 db 2, 1, 3, 1, 4, 1, 4, 1, 4, 1, 3, 1, 2, 1, 1, 1, 1, -1
+.wedge4 db 4, 1, 4, 0, 3, 1, 3, 0, 2, 1, 2, 0, 1, -1
+.wedge5 db 4, 0, 3, 0, 3, 0, 2, 0, 2, 0, 1, 0, 1, 0, 1, -1
+
+StartTrainerBattle_SetUpForRandomScatterOutro:
+ farcall Function55a1
+ call StartTrainerBattle_NextScene
+ ld a, $10
+ ld [wce64], a
+ ld a, 1
+ ldh [hBGMapMode], a
+ ret
+
+StartTrainerBattle_SpeckleToBlack:
+ ld hl, wce64
+ ld a, [hl]
+ and a
+ jr z, .done
+ dec [hl]
+ ld c, 12
+.loop
+ push bc
+ call .BlackOutRandomTile
+ pop bc
+ dec c
+ jr nz, .loop
+ ret
+
+.done
+ ld a, 1
+ ldh [hBGMapMode], a
+ call DelayFrame
+ call DelayFrame
+ call DelayFrame
+ xor a
+ ldh [hBGMapMode], a
+ ld a, BATTLETRANSITION_FINISH
+ ld [wJumptableIndex], a
+ ret
+
+.BlackOutRandomTile:
+.y_loop
+ call Random
+ cp SCREEN_HEIGHT
+ jr nc, .y_loop
+ ld b, a
+
+.x_loop
+ call Random
+ cp SCREEN_WIDTH
+ jr nc, .x_loop
+ ld c, a
+
+ hlcoord 0, -1
+ ld de, SCREEN_WIDTH
+ inc b
+
+.row_loop
+ add hl, de
+ dec b
+ jr nz, .row_loop
+ add hl, bc
+
+; If the tile has already been blacked out,
+; sample a new tile
+ ld a, [hl]
+ cp BATTLETRANSITION_BLACK
+ jr z, .y_loop
+ ld [hl], BATTLETRANSITION_BLACK
+ ret
+
+StartTrainerBattle_LoadPokeBallGraphics:
+ ld a, [wOtherTrainerClass]
+ and a
+ jr z, .nextscene ; don't need to be here if wild
+
+ xor a
+ ldh [hBGMapMode], a
+
+ hlcoord 2, 1
+ ld de, .PokeBallTransition
+ ld b, SCREEN_WIDTH - 4
+.loop
+ push hl
+ ld c, 2
+.loop2
+ push hl
+ ld a, [de]
+ inc de
+.loop3
+; Loading is done bit by bit
+ and a
+ jr z, .done
+ sla a
+ jr nc, .no_load
+ ld [hl], BATTLETRANSITION_SQUARE
+.no_load
+ inc hl
+ jr .loop3
+
+.done
+ pop hl
+ push bc
+ ld bc, (SCREEN_WIDTH - 4) / 2
+ add hl, bc
+ pop bc
+ dec c
+ jr nz, .loop2
+
+ pop hl
+ push bc
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ pop bc
+ dec b
+ jr nz, .loop
+
+ ldh a, [hCGB]
+ and a
+ jr nz, .cgb
+ ld a, 1
+ ldh [hBGMapMode], a
+ call DelayFrame
+ call DelayFrame
+ jr .nextscene
+
+.cgb
+ ld hl, .daypals
+ ld a, [wTimeOfDayPal]
+ maskbits NUM_DAYTIMES
+ cp DARKNESS_F
+ jr nz, .daytime
+ ld hl, .nightpals
+.daytime
+ call .copypals
+ push hl
+ ld de, wBGPals1 palette PAL_BG_TEXT
+ ld bc, 1 palettes
+ call CopyBytes
+ pop hl
+ ld de, wBGPals2 palette PAL_BG_TEXT
+ ld bc, 1 palettes
+ call CopyBytes
+ hlcoord 0, 0, wAttrmap
+ ld bc, SCREEN_HEIGHT * SCREEN_WIDTH
+ ld a, %00000111
+ call ByteFill
+ ld a, 1
+ ldh [hCGBPalUpdate], a
+ call DelayFrame
+ call CGBOnly_CopyTilemapAtOnce
+
+.nextscene
+ call StartTrainerBattle_NextScene
+ ret
+
+.PokeBallTransition:
+ ; 16x16 overlay of a Poke Ball
+pusho
+opt b.X ; . = 0, X = 1
+ bigdw %......XXXX......
+ bigdw %....XXXXXXXX....
+ bigdw %..XXXX....XXXX..
+ bigdw %..XX........XX..
+ bigdw %.XX..........XX.
+ bigdw %.XX...XXXX...XX.
+ bigdw %XX...XX..XX...XX
+ bigdw %XXXXXX....XXXXXX
+ bigdw %XXXXXX....XXXXXX
+ bigdw %XX...XX..XX...XX
+ bigdw %.XX...XXXX...XX.
+ bigdw %.XX..........XX.
+ bigdw %..XX........XX..
+ bigdw %..XXXX....XXXX..
+ bigdw %....XXXXXXXX....
+ bigdw %......XXXX......
+popo
+
+.copypals
+ ld de, wBGPals1 palette PAL_BG_TEXT
+ call .copy
+ ld de, wBGPals2 palette PAL_BG_TEXT
+ call .copy
+ ld de, wOBPals1 palette PAL_OW_TREE
+ call .copy
+ ld de, wOBPals2 palette PAL_OW_TREE
+ call .copy
+ ld de, wOBPals1 palette PAL_OW_ROCK
+ call .copy
+ ld de, wOBPals2 palette PAL_OW_ROCK
+
+.copy
+ push hl
+ ld bc, 1 palettes
+ call CopyBytes
+ pop hl
+ ret
+
+.daypals
+INCLUDE "gfx/overworld/trainer_battle_day.pal"
+
+.nightpals
+INCLUDE "gfx/overworld/trainer_battle_nite.pal"
+
+WipeLYOverrides:
+ ld hl, wLYOverrides
+ call .wipe
+ ld hl, wLYOverridesBackup
+.wipe
+ xor a
+ ld c, SCREEN_HEIGHT_PX
+.loop
+ ld [hli], a
+ dec c
+ jr nz, .loop
+ ret
+
+StartTrainerBattle_DrawSineWave:
+ calc_sine_wave .SineWave
+
+.SineWave:
+ sine_table 256
+
+StartTrainerBattle_ZoomToBlack:
+ farcall Function55a1
+ ld de, .boxes
+
+.loop
+ ld a, [de]
+ cp -1
+ jr z, .done
+ inc de
+ ld c, a
+ ld a, [de]
+ inc de
+ ld b, a
+ ld a, [de]
+ inc de
+ ld l, a
+ ld a, [de]
+ inc de
+ ld h, a
+ xor a
+ ldh [hBGMapMode], a
+ call .Copy
+ call WaitBGMap
+ jr .loop
+
+.done
+ ld a, BATTLETRANSITION_FINISH
+ ld [wJumptableIndex], a
+ ret
+
+.boxes
+zoombox: MACRO
+; width, height, start y, start x
+ db \1, \2
+ dwcoord \3, \4
+ENDM
+ zoombox 4, 2, 8, 8
+ zoombox 6, 4, 7, 7
+ zoombox 8, 6, 6, 6
+ zoombox 10, 8, 5, 5
+ zoombox 12, 10, 4, 4
+ zoombox 14, 12, 3, 3
+ zoombox 16, 14, 2, 2
+ zoombox 18, 16, 1, 1
+ zoombox 20, 18, 0, 0
+ db -1
+
+.Copy:
+ ld a, BATTLETRANSITION_BLACK
+.row
+ push bc
+ push hl
+.col
+ ld [hli], a
+ dec c
+ jr nz, .col
+ pop hl
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ pop bc
+ dec b
+ jr nz, .row
+ ret
+
+Unreferenced_Function8ca53:
+ ld a, 1
+ ldh [hBGMapMode], a
+ call WaitBGMap
+ xor a
+ ldh [hBGMapMode], a
+ ret
diff --git a/engine/events/field_moves.asm b/engine/events/field_moves.asm
new file mode 100755
index 00000000..3423f840
--- /dev/null
+++ b/engine/events/field_moves.asm
@@ -0,0 +1,449 @@
+FIELDMOVE_GRASS EQU $80
+FIELDMOVE_TREE EQU $84
+FIELDMOVE_FLY EQU $84
+
+PlayWhirlpoolSound:
+ call WaitSFX
+ ld de, SFX_SURF
+ call PlaySFX
+ call WaitSFX
+ ret
+
+BlindingFlash:
+ farcall FadeOutPalettes
+ ld hl, wStatusFlags
+ set STATUSFLAGS_FLASH_F, [hl]
+ farcall ReplaceTimeOfDayPals
+ farcall UpdateTimeOfDayPal
+ ld b, SCGB_MAPPALS
+ call GetSGBLayout
+ farcall FadeInPalettes
+ ret
+
+ShakeHeadbuttTree:
+ farcall ClearSpriteAnims
+ ld de, CutGrassGFX
+ ld hl, vTiles0 tile FIELDMOVE_GRASS
+ lb bc, BANK(CutGrassGFX), 4
+ call Request2bpp
+ ld de, HeadbuttTreeGFX
+ ld hl, vTiles0 tile FIELDMOVE_TREE
+ lb bc, BANK(HeadbuttTreeGFX), 8
+ call Request2bpp
+ call Cut_Headbutt_GetPixelFacing
+ ld a, SPRITE_ANIM_INDEX_HEADBUTT
+ call InitSpriteAnimStruct
+ ld hl, SPRITEANIMSTRUCT_TILE_ID
+ add hl, bc
+ ld [hl], FIELDMOVE_TREE
+ ld a, 36 * SPRITEOAMSTRUCT_LENGTH
+ ld [wCurSpriteOAMAddr], a
+ farcall DoNextFrameForAllSprites
+ call HideHeadbuttTree
+ ld a, 32
+ ld [wFrameCounter], a
+ call WaitSFX
+ ld de, SFX_SANDSTORM
+ call PlaySFX
+.loop
+ ld hl, wFrameCounter
+ ld a, [hl]
+ and a
+ jr z, .done
+ dec [hl]
+ ld a, 36 * SPRITEOAMSTRUCT_LENGTH
+ ld [wCurSpriteOAMAddr], a
+ farcall DoNextFrameForAllSprites
+ call DelayFrame
+ jr .loop
+
+.done
+ call OverworldTextModeSwitch
+ call WaitBGMap
+ xor a
+ ldh [hBGMapMode], a
+ farcall ClearSpriteAnims
+ ld hl, wVirtualOAMSprite36
+ ld bc, wVirtualOAMEnd - wVirtualOAMSprite36
+ xor a
+ call ByteFill
+ call ReplaceChrisSprite
+ ret
+
+HeadbuttTreeGFX:
+INCBIN "gfx/overworld/headbutt_tree.2bpp"
+
+HideHeadbuttTree:
+ xor a
+ ldh [hBGMapMode], a
+ ld a, [wPlayerDirection]
+ and %00001100
+ srl a
+ ld e, a
+ ld d, 0
+ ld hl, TreeRelativeLocationTable
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+
+ ld a, 5 ; grass block
+ ld [hli], a
+ ld [hld], a
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ ld [hli], a
+ ld [hld], a
+ call WaitBGMap
+ xor a
+ ldh [hBGMapMode], a
+ ret
+
+TreeRelativeLocationTable:
+ dwcoord 8, 8 + 2 ; RIGHT
+ dwcoord 8, 8 - 2 ; LEFT
+ dwcoord 8 - 2, 8 ; DOWN
+ dwcoord 8 + 2, 8 ; UP
+
+OWCutAnimation:
+ ; Animation index in e
+ ; 0: Split tree in half
+ ; 1: Mow the lawn
+ ld a, e
+ and 1
+ ld [wJumptableIndex], a
+ call .LoadCutGFX
+ call WaitSFX
+ ld de, SFX_PLACE_PUZZLE_PIECE_DOWN
+ call PlaySFX
+.loop
+ ld a, [wJumptableIndex]
+ bit 7, a
+ jr nz, .finish
+ ld a, 36 * SPRITEOAMSTRUCT_LENGTH
+ ld [wCurSpriteOAMAddr], a
+ callfar DoNextFrameForAllSprites
+ call OWCutJumptable
+ call DelayFrame
+ jr .loop
+
+.finish
+ ret
+
+.LoadCutGFX:
+ callfar ClearSpriteAnims ; pointless to farcall
+ ld de, CutGrassGFX
+ ld hl, vTiles0 tile FIELDMOVE_GRASS
+ lb bc, BANK(CutGrassGFX), 4
+ call Request2bpp
+ ld de, CutTreeGFX
+ ld hl, vTiles0 tile FIELDMOVE_TREE
+ lb bc, BANK(CutTreeGFX), 4
+ call Request2bpp
+ ret
+
+CutTreeGFX:
+INCBIN "gfx/overworld/cut_tree.2bpp"
+
+CutGrassGFX:
+INCBIN "gfx/overworld/cut_grass.2bpp"
+
+OWCutJumptable:
+ ld a, [wJumptableIndex]
+ ld e, a
+ ld d, 0
+ ld hl, .dw
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp hl
+
+.dw
+ dw Cut_SpawnAnimateTree
+ dw Cut_SpawnAnimateLeaves
+ dw Cut_StartWaiting
+ dw Cut_WaitAnimSFX
+
+Cut_SpawnAnimateTree:
+ call Cut_Headbutt_GetPixelFacing
+ ld a, SPRITE_ANIM_INDEX_CUT_TREE ; cut tree
+ call InitSpriteAnimStruct
+ ld hl, SPRITEANIMSTRUCT_TILE_ID
+ add hl, bc
+ ld [hl], FIELDMOVE_TREE
+ ld a, 32
+ ld [wFrameCounter], a
+; Cut_StartWaiting
+ ld hl, wJumptableIndex
+ inc [hl]
+ inc [hl]
+ ret
+
+Cut_SpawnAnimateLeaves:
+ call Cut_GetLeafSpawnCoords
+ xor a
+ call Cut_SpawnLeaf
+ ld a, $10
+ call Cut_SpawnLeaf
+ ld a, $20
+ call Cut_SpawnLeaf
+ ld a, $30
+ call Cut_SpawnLeaf
+ ld a, 32 ; frames
+ ld [wFrameCounter], a
+; Cut_StartWaiting
+ ld hl, wJumptableIndex
+ inc [hl]
+ ret
+
+Cut_StartWaiting:
+ ld a, 1
+ ldh [hBGMapMode], a
+; Cut_WaitAnimSFX
+ ld hl, wJumptableIndex
+ inc [hl]
+
+Cut_WaitAnimSFX:
+ ld hl, wFrameCounter
+ ld a, [hl]
+ and a
+ jr z, .finished
+ dec [hl]
+ ret
+
+.finished
+ ld hl, wJumptableIndex
+ set 7, [hl]
+ ret
+
+Cut_SpawnLeaf:
+ push de
+ push af
+ ld a, SPRITE_ANIM_INDEX_LEAF ; leaf
+ call InitSpriteAnimStruct
+ ld hl, SPRITEANIMSTRUCT_TILE_ID
+ add hl, bc
+ ld [hl], FIELDMOVE_GRASS
+ ld hl, SPRITEANIMSTRUCT_0E
+ add hl, bc
+ ld [hl], 4
+ pop af
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld [hl], a
+ pop de
+ ret
+
+Cut_GetLeafSpawnCoords:
+ ld de, 0
+ ld a, [wMetatileStandingX]
+ bit 0, a
+ jr z, .left_side
+ set 0, e
+.left_side
+ ld a, [wMetatileStandingY]
+ bit 0, a
+ jr z, .top_side
+ set 1, e
+.top_side
+ ld a, [wPlayerDirection]
+ and %00001100
+ add e
+ ld e, a
+ ld hl, .Coords
+ add hl, de
+ add hl, de
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ret
+
+.Coords:
+ dbpixel 11, 12 ; facing down, top left
+ dbpixel 9, 12 ; facing down, top right
+ dbpixel 11, 14 ; facing down, bottom left
+ dbpixel 9, 14 ; facing down, bottom right
+
+ dbpixel 11, 8 ; facing up, top left
+ dbpixel 9, 8 ; facing up, top right
+ dbpixel 11, 10 ; facing up, bottom left
+ dbpixel 9, 10 ; facing up, bottom right
+
+ dbpixel 7, 12 ; facing left, top left
+ dbpixel 9, 12 ; facing left, top right
+ dbpixel 7, 10 ; facing left, bottom left
+ dbpixel 9, 10 ; facing left, bottom right
+
+ dbpixel 11, 12 ; facing right, top left
+ dbpixel 13, 12 ; facing right, top right
+ dbpixel 11, 10 ; facing right, bottom left
+ dbpixel 13, 10 ; facing right, bottom right
+
+Cut_Headbutt_GetPixelFacing:
+ ld a, [wPlayerDirection]
+ and %00001100
+ srl a
+ ld e, a
+ ld d, 0
+ ld hl, .Coords
+ add hl, de
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ret
+
+.Coords:
+ dbpixel 10, 13
+ dbpixel 10, 9
+ dbpixel 8, 11
+ dbpixel 12, 11
+
+FlyFromAnim:
+ call DelayFrame
+ ld a, [wVramState]
+ push af
+ xor a
+ ld [wVramState], a
+ call FlyFunction_InitGFX
+ depixel 10, 10, 4, 0
+ ld a, SPRITE_ANIM_INDEX_RED_WALK
+ call InitSpriteAnimStruct
+ ld hl, SPRITEANIMSTRUCT_TILE_ID
+ add hl, bc
+ ld [hl], FIELDMOVE_FLY
+ ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID
+ add hl, bc
+ ld [hl], SPRITE_ANIM_SEQ_FLY_FROM
+ ld a, 128
+ ld [wFrameCounter], a
+.loop
+ ld a, [wJumptableIndex]
+ bit 7, a
+ jr nz, .exit
+ ld a, 0 * SPRITEOAMSTRUCT_LENGTH
+ ld [wCurSpriteOAMAddr], a
+ callfar DoNextFrameForAllSprites
+ call FlyFunction_FrameTimer
+ call DelayFrame
+ jr .loop
+
+.exit
+ pop af
+ ld [wVramState], a
+ ret
+
+FlyToAnim:
+ call DelayFrame
+ ld a, [wVramState]
+ push af
+ xor a
+ ld [wVramState], a
+ call FlyFunction_InitGFX
+ depixel 31, 10, 4, 0
+ ld a, SPRITE_ANIM_INDEX_RED_WALK
+ call InitSpriteAnimStruct
+ ld hl, SPRITEANIMSTRUCT_TILE_ID
+ add hl, bc
+ ld [hl], FIELDMOVE_FLY
+ ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID
+ add hl, bc
+ ld [hl], SPRITE_ANIM_SEQ_FLY_TO
+ ld hl, SPRITEANIMSTRUCT_0F
+ add hl, bc
+ ld [hl], 11 * 8
+ ld a, 64
+ ld [wFrameCounter], a
+.loop
+ ld a, [wJumptableIndex]
+ bit 7, a
+ jr nz, .exit
+ ld a, 0 * SPRITEOAMSTRUCT_LENGTH
+ ld [wCurSpriteOAMAddr], a
+ callfar DoNextFrameForAllSprites
+ call FlyFunction_FrameTimer
+ call DelayFrame
+ jr .loop
+
+.exit
+ pop af
+ ld [wVramState], a
+ call .RestorePlayerSprite_DespawnLeaves
+ ret
+
+.RestorePlayerSprite_DespawnLeaves:
+ ld hl, wVirtualOAMSprite00TileID
+ xor a
+ ld c, 4
+.OAMloop
+ ld [hli], a ; tile id
+rept SPRITEOAMSTRUCT_LENGTH - 1
+ inc hl
+endr
+ inc a
+ dec c
+ jr nz, .OAMloop
+ ld hl, wVirtualOAMSprite04
+ ld bc, wVirtualOAMEnd - wVirtualOAMSprite04
+ xor a
+ call ByteFill
+ ret
+
+FlyFunction_InitGFX:
+ callfar ClearSpriteAnims
+ ld de, CutGrassGFX
+ ld hl, vTiles0 tile FIELDMOVE_GRASS
+ lb bc, BANK(CutGrassGFX), 4
+ call Request2bpp
+ ld a, [wCurPartyMon]
+ ld hl, wPartySpecies
+ ld e, a
+ ld d, 0
+ add hl, de
+ ld a, [hl]
+ ld [wTempIconSpecies], a
+ ld e, FIELDMOVE_FLY
+ farcall GetSpeciesIcon
+ xor a
+ ld [wJumptableIndex], a
+ ret
+
+FlyFunction_FrameTimer:
+ call .SpawnLeaf
+ ld hl, wFrameCounter
+ ld a, [hl]
+ and a
+ jr z, .exit
+ dec [hl]
+ cp $40
+ ret c
+ and 7
+ ret nz
+ ld de, SFX_FLY
+ call PlaySFX
+ ret
+
+.exit
+ ld hl, wJumptableIndex
+ set 7, [hl]
+ ret
+
+.SpawnLeaf:
+ ld hl, wce65
+ ld a, [hl]
+ inc [hl]
+ and 7
+ ret nz
+ ld a, [hl]
+ and (6 * 8) >> 1
+ sla a
+ add 8 * 8 ; gives a number in [$40, $50, $60, $70]
+ ld d, a
+ ld e, 0
+ ld a, SPRITE_ANIM_INDEX_FLY_LEAF ; fly land
+ call InitSpriteAnimStruct
+ ld hl, SPRITEANIMSTRUCT_TILE_ID
+ add hl, bc
+ ld [hl], FIELDMOVE_GRASS
+ ret
diff --git a/engine/events/magnet_train.asm b/engine/events/magnet_train.asm
new file mode 100755
index 00000000..715c801c
--- /dev/null
+++ b/engine/events/magnet_train.asm
@@ -0,0 +1,387 @@
+MagnetTrain:
+ ld a, [wScriptVar]
+ and a
+ jr nz, .ToGoldenrod
+ ld a, 1 ; forwards
+ lb bc, 8 * TILE_WIDTH, 12 * TILE_WIDTH
+ lb de, (11 * TILE_WIDTH) - (11 * TILE_WIDTH + 4), -12 * TILE_WIDTH
+ jr .continue
+
+.ToGoldenrod:
+ ld a, -1 ; backwards
+ lb bc, -8 * TILE_WIDTH, -12 * TILE_WIDTH
+ lb de, (11 * TILE_WIDTH) + (11 * TILE_WIDTH + 4), 12 * TILE_WIDTH
+
+.continue
+ ld [wMagnetTrainDirection], a
+ ld a, c
+ ld [wMagnetTrainInitPosition], a
+ ld a, b
+ ld [wMagnetTrainHoldPosition], a
+ ld a, e
+ ld [wMagnetTrainFinalPosition], a
+ ld a, d
+ ld [wMagnetTrainPlayerSpriteInitX], a
+
+ ldh a, [hSCX]
+ push af
+ ldh a, [hSCY]
+ push af
+ call MagnetTrain_LoadGFX_PlayMusic
+ ld hl, hVBlank
+ ld a, [hl]
+ push af
+ ld [hl], 1
+.loop
+ ld a, [wJumptableIndex]
+ bit 7, a
+ jr nz, .done
+ callfar PlaySpriteAnimations
+ call MagnetTrain_Jumptable
+ call MagnetTrain_UpdateLYOverrides
+ call PushLYOverrides
+ call DelayFrame
+ jr .loop
+
+.done
+ pop af
+ ldh [hVBlank], a
+ call ClearBGPalettes
+ xor a
+ ldh [hLCDCPointer], a
+ ldh [hLYOverrideStart], a
+ ldh [hLYOverrideEnd], a
+ ldh [hSCX], a
+ ld [wRequested2bppSource], a
+ ld [wRequested2bppSource + 1], a
+ ld [wRequested2bppDest], a
+ ld [wRequested2bppDest + 1], a
+ ld [wRequested2bpp], a
+ call ClearTilemap
+
+ pop af
+ ldh [hSCY], a
+ pop af
+ ldh [hSCX], a
+ xor a
+ ldh [hBGMapMode], a
+ ret
+
+MagnetTrain_UpdateLYOverrides:
+ ld hl, wLYOverridesBackup
+ ld c, 6 * TILE_WIDTH - 1
+ ld a, [wMagnetTrainOffset]
+ add a
+ ldh [hSCX], a
+ call .loadloop
+ ld c, 6 * TILE_WIDTH
+ ld a, [wMagnetTrainPosition]
+ call .loadloop
+ ld c, 6 * TILE_WIDTH + 1
+ ld a, [wMagnetTrainOffset]
+ add a
+ call .loadloop
+
+ ld a, [wMagnetTrainDirection]
+ ld d, a
+ ld hl, wMagnetTrainOffset
+ ld a, [hl]
+ add d
+ add d
+ ld [hl], a
+ ret
+
+.loadloop
+ ld [hli], a
+ dec c
+ jr nz, .loadloop
+ ret
+
+MagnetTrain_LoadGFX_PlayMusic:
+ call ClearBGPalettes
+ call ClearSprites
+ call DisableLCD
+ callfar ClearSpriteAnims
+ call SetMagnetTrainPals
+ call DrawMagnetTrain
+ ld a, SCREEN_HEIGHT_PX
+ ldh [hWY], a
+ call EnableLCD
+ xor a
+ ldh [hBGMapMode], a
+ ldh [hSCX], a
+ ldh [hSCY], a
+
+ ld de, ChrisSpriteGFX
+ ld hl, vTiles0
+ lb bc, BANK(ChrisSpriteGFX), 4
+ call Request2bpp
+
+ ld de, ChrisSpriteGFX + 12 tiles
+ ld hl, vTiles0 tile $04
+ lb bc, BANK(ChrisSpriteGFX), 4
+ call Request2bpp
+
+ call MagnetTrain_InitLYOverrides
+
+ ld a, [wTimeOfDayPal]
+ push af
+ ld a, [wEnvironment]
+ push af
+
+ ld a, [wTimeOfDay]
+ maskbits NUM_DAYTIMES
+ ld [wTimeOfDayPal], a
+ ld a, TOWN
+ ld [wEnvironment], a
+ ld b, SCGB_MAPPALS
+ call GetSGBLayout
+ call UpdateTimePals
+
+ ldh a, [rBGP]
+ ld [wBGP], a
+ ldh a, [rOBP0]
+ ld [wOBP0], a
+ ldh a, [rOBP1]
+ ld [wOBP1], a
+
+ pop af
+ ld [wEnvironment], a
+ pop af
+ ld [wTimeOfDayPal], a
+
+ ld hl, wJumptableIndex
+ xor a
+ ld [hli], a ; wJumptableIndex
+ ld a, [wMagnetTrainInitPosition]
+ ld [hli], a ; wMagnetTrainOffset
+ ld [hli], a ; wMagnetTrainPosition
+ ld [hli], a ; wMagnetTrainWaitCounter
+
+ ld de, MUSIC_MAGNET_TRAIN
+ call PlayMusic2
+ ret
+
+DrawMagnetTrain:
+ hlbgcoord 0, 0
+ xor a
+.loop
+ call GetMagnetTrainBGTiles
+ ld b, BG_MAP_WIDTH / 2
+ call .FillAlt
+ inc a
+ cp SCREEN_HEIGHT
+ jr c, .loop
+
+ hlbgcoord 0, 6
+ ld de, MagnetTrainTilemap
+ ld c, SCREEN_WIDTH
+ call .FillLine
+ hlbgcoord 0, 7
+ ld de, MagnetTrainTilemap + SCREEN_WIDTH
+ ld c, SCREEN_WIDTH
+ call .FillLine
+ hlbgcoord 0, 8
+ ld de, MagnetTrainTilemap + (SCREEN_WIDTH * 2)
+ ld c, SCREEN_WIDTH
+ call .FillLine
+ hlbgcoord 0, 9
+ ld de, MagnetTrainTilemap + (SCREEN_WIDTH * 3)
+ ld c, SCREEN_WIDTH
+ call .FillLine
+ ret
+
+.FillLine:
+ ld a, [de]
+ inc de
+ ld [hli], a
+ dec c
+ jr nz, .FillLine
+ ret
+
+.FillAlt:
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ inc hl
+ dec b
+ jr nz, .FillAlt
+ ret
+
+GetMagnetTrainBGTiles:
+ push hl
+ ld e, a
+ ld d, 0
+ ld hl, MagnetTrainBGTiles
+ add hl, de
+ add hl, de
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ pop hl
+ ret
+
+MagnetTrainBGTiles:
+; 2x18 tilemap, repeated in vertical strips for the background.
+INCBIN "gfx/overworld/magnet_train_bg.tilemap"
+
+MagnetTrain_InitLYOverrides:
+ ld hl, wLYOverrides
+ ld bc, wLYOverridesEnd - wLYOverrides
+ ld a, [wMagnetTrainInitPosition]
+ call ByteFill
+ ld hl, wLYOverridesBackup
+ ld bc, wLYOverridesBackupEnd - wLYOverridesBackup
+ ld a, [wMagnetTrainInitPosition]
+ call ByteFill
+ ld a, LOW(rSCX)
+ ldh [hLCDCPointer], a
+ ret
+
+SetMagnetTrainPals:
+ ld a, 1
+ ldh [rVBK], a
+
+ ; bushes
+ hlbgcoord 0, 0
+ ld bc, 4 * BG_MAP_WIDTH
+ ld a, PAL_BG_GREEN
+ call ByteFill
+
+ ; train
+ hlbgcoord 0, 4
+ ld bc, 10 * BG_MAP_WIDTH
+ xor a ; PAL_BG_GRAY
+ call ByteFill
+
+ ; more bushes
+ hlbgcoord 0, 14
+ ld bc, 4 * BG_MAP_WIDTH
+ ld a, PAL_BG_GREEN
+ call ByteFill
+
+ ; train window
+ hlbgcoord 7, 8
+ ld bc, 6
+ ld a, PAL_BG_YELLOW
+ call ByteFill
+
+ ld a, 0
+ ldh [rVBK], a
+ ret
+
+MagnetTrain_Jumptable:
+ ld a, [wJumptableIndex]
+ ld e, a
+ ld d, 0
+ ld hl, .Jumptable
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp hl
+
+.Jumptable:
+ dw .InitPlayerSpriteAnim
+ dw .WaitScene
+ dw .MoveTrain1
+ dw .WaitScene
+ dw .MoveTrain2
+ dw .WaitScene
+ dw .TrainArrived
+
+.Next:
+ ld hl, wJumptableIndex
+ inc [hl]
+ ret
+
+.InitPlayerSpriteAnim:
+ ld d, (8 + 2) * TILE_WIDTH + 5
+ ld a, [wMagnetTrainPlayerSpriteInitX]
+ ld e, a
+ ld a, SPRITE_ANIM_INDEX_MAGNET_TRAIN_RED
+ call InitSpriteAnimStruct
+ ld hl, SPRITEANIMSTRUCT_TILE_ID
+ add hl, bc
+ ld [hl], 0
+ call .Next
+ ld a, 128
+ ld [wMagnetTrainWaitCounter], a
+ ret
+
+.MoveTrain1:
+ ld hl, wMagnetTrainHoldPosition
+ ld a, [wMagnetTrainPosition]
+ cp [hl]
+ jr z, .PrepareToHoldTrain
+ ld e, a
+ ld a, [wMagnetTrainDirection]
+ xor $ff
+ inc a
+ add e
+ ld [wMagnetTrainPosition], a
+ ld hl, wGlobalAnimXOffset
+ ld a, [wMagnetTrainDirection]
+ add [hl]
+ ld [hl], a
+ ret
+
+.PrepareToHoldTrain:
+ call .Next
+ ld a, 128
+ ld [wMagnetTrainWaitCounter], a
+ ret
+
+.WaitScene:
+ ld hl, wMagnetTrainWaitCounter
+ ld a, [hl]
+ and a
+ jr z, .DoneWaiting
+ dec [hl]
+ ret
+
+.DoneWaiting:
+ call .Next
+ ret
+
+.MoveTrain2:
+ ld hl, wMagnetTrainFinalPosition
+ ld a, [wMagnetTrainPosition]
+ cp [hl]
+ jr z, .PrepareToFinishAnim
+ ld e, a
+ ld a, [wMagnetTrainDirection]
+ xor $ff
+ inc a
+ ld d, a
+ ld a, e
+ add d
+ add d
+ ld [wMagnetTrainPosition], a
+ ld hl, wGlobalAnimXOffset
+ ld a, [wMagnetTrainDirection]
+ ld d, a
+ ld a, [hl]
+ add d
+ add d
+ ld [hl], a
+ ret
+
+ ret
+
+.PrepareToFinishAnim:
+ call .Next
+ ret
+
+.TrainArrived:
+ ld a, $80
+ ld [wJumptableIndex], a
+ ld de, SFX_TRAIN_ARRIVED
+ call PlaySFX
+ ret
+
+
+MagnetTrainTilemap:
+; 20x4 tilemap
+INCBIN "gfx/overworld/magnet_train_fg.tilemap"
diff --git a/engine/gfx/mon_icons.asm b/engine/gfx/mon_icons.asm
new file mode 100755
index 00000000..d0d3856e
--- /dev/null
+++ b/engine/gfx/mon_icons.asm
@@ -0,0 +1,337 @@
+LoadOverworldMonIcon:
+ ld a, e
+ call ReadMonMenuIcon
+ ld l, a
+ ld h, 0
+ add hl, hl
+ ld de, IconPointers
+ add hl, de
+ ld a, [hli]
+ ld e, a
+ ld d, [hl]
+ ld b, BANK(Icons)
+ ld c, 8
+ ret
+
+LoadMenuMonIcon:
+ push hl
+ push de
+ push bc
+ call .LoadIcon
+ pop bc
+ pop de
+ pop hl
+ ret
+
+.LoadIcon:
+ ld d, 0
+ ld hl, .Jumptable
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp hl
+
+.Jumptable:
+; entries correspond to MONICON_* constants
+ dw PartyMenu_InitAnimatedMonIcon ; MONICON_PARTYMENU
+ dw NamingScreen_InitAnimatedMonIcon ; MONICON_NAMINGSCREEN
+ dw MoveList_InitAnimatedMonIcon ; MONICON_MOVES
+ dw Trade_LoadMonIconGFX ; MONICON_TRADE
+
+PartyMenu_InitAnimatedMonIcon:
+ ld a, [wCurIconTile]
+ push af
+ ldh a, [hObjectStructIndexBuffer]
+ ld hl, wPartySpecies
+ ld e, a
+ ld d, 0
+ add hl, de
+ ld a, [hl]
+ call ReadMonMenuIcon
+ ld [wCurIcon], a
+ call GetMemIconGFX
+ ldh a, [hObjectStructIndexBuffer]
+; y coord
+ add a
+ add a
+ add a
+ add a
+ add $1c
+ ld d, a
+; x coord
+ ld e, $10
+; type is partymon icon
+ ld a, SPRITE_ANIM_INDEX_PARTY_MON
+ call _InitSpriteAnimStruct
+ pop af
+ ld hl, SPRITEANIMSTRUCT_TILE_ID
+ add hl, bc
+ ld [hl], a
+
+ call .SpawnItemIcon
+ call SetPartyMonIconAnimSpeed
+ ret
+
+.SpawnItemIcon:
+ push bc
+ ldh a, [hObjectStructIndexBuffer]
+ ld hl, wPartyMon1Item
+ ld bc, PARTYMON_STRUCT_LENGTH
+ call AddNTimes
+ pop bc
+ ld a, [hl]
+ and a
+ ret z
+ push hl
+ push bc
+ ld d, a
+ callfar ItemIsMail
+ pop bc
+ pop hl
+ jr c, .mail
+ ld a, SPRITE_ANIM_FRAMESET_PARTY_MON_WITH_ITEM
+ jr .okay
+
+.mail
+ ld a, SPRITE_ANIM_FRAMESET_PARTY_MON_WITH_MAIL
+.okay
+ ld hl, SPRITEANIMSTRUCT_FRAMESET_ID
+ add hl, bc
+ ld [hl], a
+ ret
+
+SetPartyMonIconAnimSpeed:
+ push bc
+ ldh a, [hObjectStructIndexBuffer]
+ ld b, a
+ call .getspeed
+ ld a, b
+ pop bc
+ ld hl, SPRITEANIMSTRUCT_DURATIONOFFSET
+ add hl, bc
+ ld [hl], a
+ rlca
+ rlca
+ ld hl, SPRITEANIMSTRUCT_0D
+ add hl, bc
+ ld [hl], a
+ ret
+
+.getspeed
+ farcall PlacePartymonHPBar
+ call GetHPPal
+ ld e, d
+ ld d, 0
+ ld hl, .speeds
+ add hl, de
+ ld b, [hl]
+ ret
+
+.speeds
+ db $00 ; HP_GREEN
+ db $40 ; HP_YELLOW
+ db $80 ; HP_RED
+
+NamingScreen_InitAnimatedMonIcon:
+ ld a, [wTempIconSpecies]
+ call ReadMonMenuIcon
+ ld [wCurIcon], a
+ xor a
+ call GetIconGFX
+ depixel 4, 4, 4, 0
+ ld a, SPRITE_ANIM_INDEX_PARTY_MON
+ call _InitSpriteAnimStruct
+ ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID
+ add hl, bc
+ ld [hl], SPRITE_ANIM_SEQ_NULL
+ ret
+
+MoveList_InitAnimatedMonIcon:
+ ld a, [wTempIconSpecies]
+ call ReadMonMenuIcon
+ ld [wCurIcon], a
+ xor a
+ call GetIconGFX
+ ld d, 3 * 8 + 2 ; depixel 3, 4, 2, 4
+ ld e, 4 * 8 + 4
+ ld a, SPRITE_ANIM_INDEX_PARTY_MON
+ call _InitSpriteAnimStruct
+ ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID
+ add hl, bc
+ ld [hl], SPRITE_ANIM_SEQ_NULL
+ ret
+
+Trade_LoadMonIconGFX:
+ ld a, [wTempIconSpecies]
+ call ReadMonMenuIcon
+ ld [wCurIcon], a
+ ld a, $62
+ ld [wCurIconTile], a
+ call GetMemIconGFX
+ ret
+
+GetSpeciesIcon:
+; Load species icon into VRAM at tile a
+ push de
+ ld a, [wTempIconSpecies]
+ call ReadMonMenuIcon
+ ld [wCurIcon], a
+ pop de
+ ld a, e
+ call GetIconGFX
+ ret
+
+GetMemIconGFX:
+ ld a, [wCurIconTile]
+GetIconGFX:
+; Load icon graphics into VRAM starting from tile a.
+ ld l, a
+ ld h, 0
+
+; One tile is 16 bytes long.
+rept 4
+ add hl, hl
+endr
+
+ ld de, vTiles0
+ add hl, de
+ push hl
+
+; The icons are contiguous, in order and of the same
+; size, so the pointer table is somewhat redundant.
+ ld a, [wCurIcon]
+ push hl
+ ld l, a
+ ld h, 0
+ add hl, hl
+ ld de, IconPointers
+ add hl, de
+ ld a, [hli]
+ ld e, a
+ ld d, [hl]
+ pop hl
+
+ lb bc, BANK(Icons), 8
+ call Request2bpp
+
+ pop hl
+ ld de, 8 tiles
+ add hl, de
+ ld de, HeldItemIcons
+ lb bc, BANK(HeldItemIcons), 2
+ call Request2bpp
+ ld a, [wCurIconTile]
+ add 10
+ ld [wCurIconTile], a
+ ret
+
+HeldItemIcons:
+INCBIN "gfx/icons/mail.2bpp"
+INCBIN "gfx/icons/item.2bpp"
+
+FreezeMonIcons:
+ ld hl, wSpriteAnimationStructs
+ ld e, PARTY_LENGTH
+ ld a, [wMenuCursorY]
+ ld d, a
+.loop
+ ld a, [hl]
+ and a
+ jr z, .next
+ cp d
+ jr z, .loadwithtwo
+ ld a, SPRITE_ANIM_SEQ_NULL
+ jr .ok
+
+.loadwithtwo
+ ld a, SPRITE_ANIM_SEQ_PARTY_MON_SWITCH
+
+.ok
+ push hl
+ ld c, l
+ ld b, h
+ ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID
+ add hl, bc
+ ld [hl], a
+ pop hl
+
+.next
+ ld bc, $10
+ add hl, bc
+ dec e
+ jr nz, .loop
+ ret
+
+UnfreezeMonIcons:
+ ld hl, wSpriteAnimationStructs
+ ld e, PARTY_LENGTH
+.loop
+ ld a, [hl]
+ and a
+ jr z, .next
+ push hl
+ ld c, l
+ ld b, h
+ ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID
+ add hl, bc
+ ld [hl], SPRITE_ANIM_SEQ_PARTY_MON
+ pop hl
+.next
+ ld bc, $10
+ add hl, bc
+ dec e
+ jr nz, .loop
+ ret
+
+HoldSwitchmonIcon:
+ ld hl, wSpriteAnimationStructs
+ ld e, PARTY_LENGTH
+ ld a, [wSwitchMon]
+ ld d, a
+.loop
+ ld a, [hl]
+ and a
+ jr z, .next
+ cp d
+ jr z, .is_switchmon
+ ld a, SPRITE_ANIM_SEQ_PARTY_MON_SELECTED
+ jr .join_back
+
+.is_switchmon
+ ld a, SPRITE_ANIM_SEQ_PARTY_MON_SWITCH
+.join_back
+ push hl
+ ld c, l
+ ld b, h
+ ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID
+ add hl, bc
+ ld [hl], a
+ pop hl
+.next
+ ld bc, $10
+ add hl, bc
+ dec e
+ jr nz, .loop
+ ret
+
+ReadMonMenuIcon:
+ cp EGG
+ jr z, .egg
+ dec a
+ ld hl, MonMenuIcons
+ ld e, a
+ ld d, 0
+ add hl, de
+ ld a, [hl]
+ ret
+.egg
+ ld a, ICON_EGG
+ ret
+
+INCLUDE "data/pokemon/menu_icons.asm"
+
+INCLUDE "data/icon_pointers.asm"
+
+INCLUDE "gfx/icons.asm"
diff --git a/engine/gfx/sprite_anims.asm b/engine/gfx/sprite_anims.asm
index 2877539d..a6e717e8 100755
--- a/engine/gfx/sprite_anims.asm
+++ b/engine/gfx/sprite_anims.asm
@@ -1,1361 +1,1497 @@
-DoAnimFrame: ; 8d463
- ld hl, $2 ; 23:5463
- add hl, bc ; 23:5466
- ld e, [hl] ; 23:5467
- ld d, $0 ; 23:5468
- ld hl, .Jumptable ; 23:546a
- add hl, de ; 23:546d
- add hl, de ; 23:546e
- ld a, [hli] ; 23:546f
- ld h, [hl] ; 23:5470
- ld l, a ; 23:5471
- jp hl ; 23:5472
-
-.Jumptable: ; 23:5473
- dw Function8d4c7
- dw Function8d4c8
- dw Function8d4df
- dw Function8d510
- dw Function8d528
- dw Function8d54e
- dw Function8d55d
- dw Function8d5a2
- dw Function8d5bf
- dw Function8d623
- dw Function8d66b
- dw Function8d690
- dw Function8d702
- dw Function8d765
- dw Function8d7b1
- dw Function8d7ef
- dw Function8d82d
- dw Function8d897
- dw Function8d8b8
- dw Function8d8bf
- dw Function8d909
- dw Function8d91a
- dw Function8d928
- dw Function8d92f
- dw Function8d971
- dw Function8d9d0
- dw Function8d9d7
- dw Function8d9ec
- dw Function8d921
- dw Function8da1c
- dw Function8da2a
- dw Function8da23
- dw Function8da31
- dw Function8dad8
- dw Function8daf0
- dw Function8daf7
- dw Function8db25
- dw Function8db2c
- dw Function8db5d
- dw Function8db8f
- dw Function8dbb4
- dw Function8d885
-
-Function8d4c7: ; 8d4c7
- ret ; 23:54c7
-
-Function8d4c8: ; 8d4c8
- ld a, [$cee0] ; 23:54c8
- ld hl, $0 ; 23:54cb
- add hl, bc ; 23:54ce
- cp [hl] ; 23:54cf
- jr z, Function8d4df ; 23:54d0
- ld hl, $4 ; 23:54d2
- add hl, bc ; 23:54d5
- ld [hl], $10 ; 23:54d6
- ld hl, $7 ; 23:54d8
- add hl, bc ; 23:54db
- ld [hl], $0 ; 23:54dc
- ret ; 23:54de
-
-Function8d4df: ; 8d4df
- ld hl, $4 ; 23:54df
- add hl, bc ; 23:54e2
- ld [hl], $18 ; 23:54e3
- ld hl, $c ; 23:54e5
- add hl, bc ; 23:54e8
- ld a, [hl] ; 23:54e9
- ld d, a ; 23:54ea
- inc [hl] ; 23:54eb
- and $f ; 23:54ec
- ret nz ; 23:54ee
- ld hl, $d ; 23:54ef
- add hl, bc ; 23:54f2
- ld e, [hl] ; 23:54f3
- ld hl, $7 ; 23:54f4
- add hl, bc ; 23:54f7
- ld a, d ; 23:54f8
- and $10 ; 23:54f9
- jr z, .asm_8d505 ; 23:54fb
- ld a, e ; 23:54fd
- and a ; 23:54fe
- jr z, Function8d50c ; 23:54ff
- cp $1 ; 23:5501
- jr z, Function8d508 ; 23:5503
-.asm_8d505
- xor a ; 23:5505
- ld [hl], a ; 23:5506
- ret ; 23:5507
-
-Function8d508: ; 8d508
- ld a, $ff ; 23:5508
- ld [hl], a ; 23:550a
- ret ; 23:550b
-
-Function8d50c: ; 8d50c
- ld a, $fe ; 23:550c
- ld [hl], a ; 23:550e
- ret ; 23:550f
-
-Function8d510: ; 8d510
- ld a, [$cee0] ; 23:5510
- ld hl, $0 ; 23:5513
- add hl, bc ; 23:5516
- cp [hl] ; 23:5517
- jr z, Function8d521 ; 23:5518
- ld hl, $4 ; 23:551a
- add hl, bc ; 23:551d
- ld [hl], $10 ; 23:551e
- ret ; 23:5520
-
-Function8d521: ; 8d521
- ld hl, $4 ; 23:5521
- add hl, bc ; 23:5524
- ld [hl], $18 ; 23:5525
- ret ; 23:5527
-
-Function8d528: ; 8d528
- ld hl, $d ; 23:5528
- add hl, bc ; 23:552b
- ld a, [hl] ; 23:552c
- inc [hl] ; 23:552d
- cp $40 ; 23:552e
- jr nc, Function8d54a ; 23:5530
- ld hl, $7 ; 23:5532
- add hl, bc ; 23:5535
- dec [hl] ; 23:5536
- ld hl, $c ; 23:5537
- add hl, bc ; 23:553a
- ld a, [hl] ; 23:553b
- add a, $2 ; 23:553c
- ld [hl], a ; 23:553e
- ld d, $8 ; 23:553f
- call Function8dbf6 ; 23:5541
- ld hl, $6 ; 23:5544
- add hl, bc ; 23:5547
- ld [hl], a ; 23:5548
- ret ; 23:5549
-
-Function8d54a: ; 8d54a
- call DeinitializeSprite ; 23:554a
- ret ; 23:554d
-
-Function8d54e: ; 8d54e
- ld a, [$c5c7] ; 23:554e
- ld hl, $5 ; 23:5551
- add hl, bc ; 23:5554
- add [hl] ; 23:5555
- cp $b0 ; 23:5556
- ret c ; 23:5558
- call DeinitializeSprite ; 23:5559
- ret ; 23:555c
-
-Function8d55d: ; 8d55d
- call Function8dbdd ; 23:555d
- jp hl ; 23:5560
-
-; anonymous jumptable
- dw Function8d565
- dw Function8d576
-
-Function8d565: ; 8d565
- call Function8dbf0 ; 23:5565
- ld hl, $0 ; 23:5568
- add hl, bc ; 23:556b
- ld a, [hl] ; 23:556c
- and $3 ; 23:556d
- swap a ; 23:556f
- ld hl, $c ; 23:5571
- add hl, bc ; 23:5574
- ld [hl], a ; 23:5575
-Function8d576: ; 8d576
- ld de, $201 ; 23:5576
- ldh a, [$ffe9] ; 23:5579
- and a ; 23:557b
- jr z, .asm_8d581 ; 23:557c
- ld de, $402 ; 23:557e
+DoAnimFrame:
+ ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID
+ add hl, bc
+ ld e, [hl]
+ ld d, 0
+ ld hl, .Jumptable
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp hl
+
+.Jumptable:
+; entries correspond to SPRITE_ANIM_SEQ_* constants
+ dw .Null
+ dw .PartyMon
+ dw .PartyMonSwitch
+ dw .PartyMonSelected
+ dw .GSIntroBubble
+ dw .GSIntroShellder
+ dw .GSIntroMagikarp
+ dw .GSIntroLapras
+ dw .GSIntroLapras2
+ dw .GSIntroNote
+ dw .GSIntroJigglypuff
+ dw .GSIntroPikachu
+ dw .GSIntroPikachuTail
+ dw .GSIntroFireball
+ dw .GSIntroChikoritaTotodile
+ dw .GSIntroCyndaquil
+ dw .GSTitleTrail
+ dw .UnusedPikachu
+ dw .UnusedPikachuTail
+ dw .UnusedNote
+ dw .UnusedJigglypuff
+ dw .NamingScreenCursor
+ dw .GameFreakLogo
+ dw .GSIntroStar
+ dw .GSIntroSparkle
+ dw .SlotsGolem
+ dw .SlotsChansey
+ dw .SlotsChanseyEgg
+ dw .MailCursor
+ dw .UnusedCursor
+ dw .DummyGameCursor
+ dw .PokegearArrow
+ dw .TradePokeBall
+ dw .TradeTubeBulge
+ dw .TrademonInTube
+ dw .RevealNewMon
+ dw .RadioTuningKnob
+ dw .CutLeaves
+ dw .FlyFrom
+ dw .FlyLeaf
+ dw .FlyTo
+ dw .GSIntroHoOhLugia
+
+.Null:
+ ret
+
+.PartyMon
+ ld a, [wMenuCursorY]
+
+ ld hl, SPRITEANIMSTRUCT_INDEX
+ add hl, bc
+ cp [hl]
+ jr z, .PartyMonSwitch
+
+ ld hl, SPRITEANIMSTRUCT_XCOORD
+ add hl, bc
+ ld [hl], 8 * 2
+
+ ld hl, SPRITEANIMSTRUCT_YOFFSET
+ add hl, bc
+ ld [hl], 0
+ ret
+
+.PartyMonSwitch
+ ld hl, SPRITEANIMSTRUCT_XCOORD
+ add hl, bc
+ ld [hl], 8 * 3
+
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld a, [hl]
+ ld d, a
+ inc [hl]
+ and $f
+ ret nz
+
+ ld hl, SPRITEANIMSTRUCT_0D
+ add hl, bc
+ ld e, [hl]
+
+ ld hl, SPRITEANIMSTRUCT_YOFFSET
+ add hl, bc
+ ld a, d
+ and $10 ; bit 4
+ jr z, .load_zero
+ ld a, e
+ and a
+ jr z, .load_minus_two
+ cp $1
+ jr z, .load_minus_one
+.load_zero
+ xor a
+ ld [hl], a
+ ret
+
+.load_minus_one
+ ld a, -1
+ ld [hl], a
+ ret
+
+.load_minus_two
+ ld a, -2
+ ld [hl], a
+ ret
+
+.PartyMonSelected
+ ld a, [wMenuCursorY]
+
+ ld hl, SPRITEANIMSTRUCT_INDEX
+ add hl, bc
+ cp [hl]
+ jr z, .three_offset_right
+
+ ld hl, SPRITEANIMSTRUCT_XCOORD
+ add hl, bc
+ ld [hl], 8 * 2
+ ret
+
+.three_offset_right
+ ld hl, SPRITEANIMSTRUCT_XCOORD
+ add hl, bc
+ ld [hl], 8 * 3
+ ret
+
+.GSIntroBubble
+ ld hl, SPRITEANIMSTRUCT_0D
+ add hl, bc
+ ld a, [hl]
+ inc [hl]
+ cp $40
+ jr nc, .asm_8d54a
+
+ ld hl, SPRITEANIMSTRUCT_YOFFSET
+ add hl, bc
+ dec [hl]
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld a, [hl]
+ add $02
+ ld [hl], a
+ ld d, $08
+ call .Sprites_Sine
+ ld hl, SPRITEANIMSTRUCT_XOFFSET
+ add hl, bc
+ ld [hl], a
+ ret
+
+.asm_8d54a
+ call DeinitializeSprite
+ ret
+
+.GSIntroShellder
+ ld a, [wGlobalAnimYOffset]
+ ld hl, SPRITEANIMSTRUCT_YCOORD
+ add hl, bc
+ add [hl]
+ cp $b0
+ ret c
+ call DeinitializeSprite
+ ret
+
+.GSIntroMagikarp
+ call .AnonymousJumptable
+ jp hl
+
+; Anonymous dw (see .AnonymousJumptable)
+ dw .Function8d565
+ dw .Function8d576
+
+.Function8d565
+ call .IncrementJumptableIndex
+
+ ld hl, SPRITEANIMSTRUCT_INDEX
+ add hl, bc
+ ld a, [hl]
+
+ and $03
+ swap a
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld [hl], a
+
+.Function8d576
+ ld de, $0201
+ ldh a, [hSGB]
+ and a
+ jr z, .asm_8d581
+ ld de, $0402
+
.asm_8d581
- ld hl, $6 ; 23:5581
- add hl, bc ; 23:5584
- ld a, [hl] ; 23:5585
- cp $f0 ; 23:5586
- jr nc, Function8d59e ; 23:5588
- add d ; 23:558a
- ld [hl], a ; 23:558b
- ld hl, $c ; 23:558c
- add hl, bc ; 23:558f
- ld a, [hl] ; 23:5590
- add e ; 23:5591
- ld [hl], a ; 23:5592
- ld d, $8 ; 23:5593
- call Function8dbf6 ; 23:5595
- ld hl, $7 ; 23:5598
- add hl, bc ; 23:559b
- ld [hl], a ; 23:559c
- ret ; 23:559d
-
-Function8d59e: ; 8d59e
- call DeinitializeSprite ; 23:559e
- ret ; 23:55a1
-
-Function8d5a2: ; 8d5a2
- ld hl, $4 ; 23:55a2
- add hl, bc ; 23:55a5
- ld a, [hl] ; 23:55a6
- cp $b0 ; 23:55a7
- jr nc, Function8d5bb ; 23:55a9
- inc [hl] ; 23:55ab
- ld hl, $c ; 23:55ac
- add hl, bc ; 23:55af
- ld a, [hl] ; 23:55b0
- inc [hl] ; 23:55b1
- and $1 ; 23:55b2
- ret z ; 23:55b4
- ld hl, $5 ; 23:55b5
- add hl, bc ; 23:55b8
- inc [hl] ; 23:55b9
- ret ; 23:55ba
-
-Function8d5bb: ; 8d5bb
- call DeinitializeSprite ; 23:55bb
- ret ; 23:55be
-
-Function8d5bf: ; 8d5bf
- call Function8dbdd ; 23:55bf
- jp hl ; 23:55c2
+ ld hl, SPRITEANIMSTRUCT_XOFFSET
+ add hl, bc
+ ld a, [hl]
+ cp $f0
+ jr nc, .asm_8d59e
+
+ add d
+ ld [hl], a
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld a, [hl]
+ add e
+ ld [hl], a
+ ld d, $08
+ call .Sprites_Sine
+ ld hl, SPRITEANIMSTRUCT_YOFFSET
+ add hl, bc
+ ld [hl], a
+ ret
+
+.asm_8d59e
+ call DeinitializeSprite
+ ret
+
+.GSIntroLapras
+ ld hl, SPRITEANIMSTRUCT_XCOORD
+ add hl, bc
+ ld a, [hl]
+ cp $b0
+ jr nc, .asm_8d5bb
+
+ inc [hl]
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld a, [hl]
+ inc [hl]
+ and $1
+ ret z
+
+ ld hl, SPRITEANIMSTRUCT_YCOORD
+ add hl, bc
+ inc [hl]
+ ret
+
+.asm_8d5bb
+ call DeinitializeSprite
+ ret
+
+.GSIntroLapras2
+ call .AnonymousJumptable
+ jp hl
; anonymous jumptable
- dw Function8d5c9
- dw Function8d5e2
- dw Function8d5f3
-
-Function8d5c9: ; 8d5c9
- call Function8d60b ; 23:55c9
- ret z ; 23:55cc
- ld hl, $4 ; 23:55cd
- add hl, bc ; 23:55d0
- ld a, [hl] ; 23:55d1
- cp $58 ; 23:55d2
- jr c, Function8d5d8 ; 23:55d4
- dec [hl] ; 23:55d6
- ret ; 23:55d7
-
-Function8d5d8: ; 8d5d8
- call Function8dbf0 ; 23:55d8
- ld hl, $d ; 23:55db
- add hl, bc ; 23:55de
- ld [hl], $b0 ; 23:55df
- ret ; 23:55e1
-
-Function8d5e2: ; 8d5e2
- call Function8d60b ; 23:55e2
- ld hl, $d ; 23:55e5
- add hl, bc ; 23:55e8
- ld a, [hl] ; 23:55e9
- and a ; 23:55ea
- jr z, Function8d5ef ; 23:55eb
- dec [hl] ; 23:55ed
- ret ; 23:55ee
-
-Function8d5ef: ; 8d5ef
- call Function8dbf0 ; 23:55ef
- ret ; 23:55f2
-
-Function8d5f3: ; 8d5f3
- call Function8d60b ; 23:55f3
- ret z ; 23:55f6
- ld hl, $4 ; 23:55f7
- add hl, bc ; 23:55fa
- ld a, [hl] ; 23:55fb
- cp $d0 ; 23:55fc
- jr z, Function8d602 ; 23:55fe
- dec [hl] ; 23:5600
- ret ; 23:5601
-
-Function8d602: ; 8d602
- call DeinitializeSprite ; 23:5602
- ld a, $1 ; 23:5605
- ld [$cb19], a ; 23:5607
- ret ; 23:560a
-
-Function8d60b: ; 8d60b
- ld hl, $c ; 23:560b
- add hl, bc ; 23:560e
- ld a, [hl] ; 23:560f
- inc [hl] ; 23:5610
- ld d, $4 ; 23:5611
- call Function8dbf6 ; 23:5613
- ld hl, $7 ; 23:5616
- add hl, bc ; 23:5619
- ld [hl], a ; 23:561a
- ld hl, $c ; 23:561b
- add hl, bc ; 23:561e
- ld a, [hl] ; 23:561f
- and $1 ; 23:5620
- ret ; 23:5622
-
-Function8d623: ; 8d623
- call Function8dbdd ; 23:5623
- jp hl ; 23:5626
+ dw .Function8d5c9
+ dw .Function8d5e2
+ dw .Function8d5f3
+
+.Function8d5c9
+ call .Function8d60b
+ ret z
+
+ ld hl, SPRITEANIMSTRUCT_XCOORD
+ add hl, bc
+ ld a, [hl]
+ cp $58
+ jr c, .asm_8d5d8
+
+ dec [hl]
+ ret
+
+
+.asm_8d5d8
+ call .IncrementJumptableIndex
+ ld hl, SPRITEANIMSTRUCT_0D
+ add hl, bc
+ ld [hl], $b0
+ ret
+
+.Function8d5e2
+ call .Function8d60b
+ ld hl, SPRITEANIMSTRUCT_0D
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr z, .asm_8d5ef
+
+ dec [hl]
+ ret
+
+.asm_8d5ef
+ call .IncrementJumptableIndex
+ ret
+
+.Function8d5f3
+ call .Function8d60b
+ ret z
+ ld hl, SPRITEANIMSTRUCT_XCOORD
+ add hl, bc
+ ld a, [hl]
+ cp $d0
+ jr z, .asm_8d602
+ dec [hl]
+ ret
+
+.asm_8d602
+ call DeinitializeSprite
+ ld a, $1
+ ld [wBattleMonLevel], a
+ ret
+
+.Function8d60b
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld a, [hl]
+ inc [hl]
+ ld d, 4
+ call .Sprites_Sine
+ ld hl, SPRITEANIMSTRUCT_YOFFSET
+ add hl, bc
+ ld [hl], a
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld a, [hl]
+ and $1
+ ret
+
+.GSIntroNote
+ call .AnonymousJumptable
+ jp hl
; anonymous jumptable
- dw Function8d62b
- dw Function8d63e
-
-Function8d62b: ; 8d62b
- call Function8dbf0 ; 23:562b
- ld hl, $0 ; 23:562e
- add hl, bc ; 23:5631
- ld a, [hl] ; 23:5632
- and $1 ; 23:5633
- swap a ; 23:5635
- sla a ; 23:5637
- ld hl, $c ; 23:5639
- add hl, bc ; 23:563c
- ld [hl], a ; 23:563d
-Function8d63e: ; 8d63e
- ld hl, $6 ; 23:563e
- add hl, bc ; 23:5641
- ld a, [hl] ; 23:5642
- cp $80 ; 23:5643
- jr nc, Function8d667 ; 23:5645
- inc [hl] ; 23:5647
- ld d, $4 ; 23:5648
- ld hl, $c ; 23:564a
- add hl, bc ; 23:564d
- ld a, [hl] ; 23:564e
- add a, $2 ; 23:564f
- ld [hl], a ; 23:5651
- call Function8dbf6 ; 23:5652
- ld hl, $7 ; 23:5655
- add hl, bc ; 23:5658
- ld [hl], a ; 23:5659
- ld hl, $c ; 23:565a
- add hl, bc ; 23:565d
- and $2 ; 23:565e
- ret z ; 23:5660
- ld hl, $5 ; 23:5661
- add hl, bc ; 23:5664
- dec [hl] ; 23:5665
- ret ; 23:5666
-
-Function8d667: ; 8d667
- call DeinitializeSprite ; 23:5667
- ret ; 23:566a
-
-Function8d66b: ; 8d66b
- call Function8dbdd ; 23:566b
- jp hl ; 23:566e
+ dw .Function8d62b
+ dw .Function8d63e
+
+.Function8d62b
+ call .IncrementJumptableIndex
+ ld hl, 0
+ add hl, bc
+ ld a, [hl]
+ and $1
+ swap a
+ sla a
+
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld [hl], a
+.Function8d63e
+ ld hl, SPRITEANIMSTRUCT_XOFFSET
+ add hl, bc
+ ld a, [hl]
+ cp $80
+ jr nc, .asm_8d667
+ inc [hl]
+ ld d, $04
+
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld a, [hl]
+ add $02
+ ld [hl], a
+ call .Sprites_Sine
+
+ ld hl, SPRITEANIMSTRUCT_YOFFSET
+ add hl, bc
+ ld [hl], a
+
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ and $2
+ ret z
+
+ ld hl, SPRITEANIMSTRUCT_YCOORD
+ add hl, bc
+ dec [hl]
+ ret
+
+.asm_8d667
+ call DeinitializeSprite
+ ret
+
+.GSIntroJigglypuff
+ call .AnonymousJumptable
+ jp hl
; anonymous jumptable
- dw Function8d673
- dw Function8d680
-
-Function8d673: ; 8d673
- ld a, [$cb19] ; 23:5673
- and a ; 23:5676
- ret z ; 23:5677
- call Function8dbf0 ; 23:5678
- ld a, $c ; 23:567b
- call Function8d332 ; 23:567d
-Function8d680: ; 8d680
- ld hl, $4 ; 23:5680
- add hl, bc ; 23:5683
- ld a, [hl] ; 23:5684
- cp $d0 ; 23:5685
- jr z, Function8d68c ; 23:5687
- dec [hl] ; 23:5689
- dec [hl] ; 23:568a
- ret ; 23:568b
-
-Function8d68c: ; 8d68c
- call DeinitializeSprite ; 23:568c
- ret ; 23:568f
-
-Function8d690: ; 8d690
- call Function8dbdd ; 23:5690
- jp hl ; 23:5693
+ dw .Function8d673
+ dw .Function8d680
+
+.Function8d673
+ ld a, [wBattleMonLevel]
+ and a
+ ret z
+ call .IncrementJumptableIndex
+ ld a, SPRITE_ANIM_FRAMESET_GS_INTRO_JIGGLYPUFF_2
+ call _ReinitSpriteAnimFrame
+.Function8d680
+ ld hl, SPRITEANIMSTRUCT_XCOORD
+ add hl, bc
+ ld a, [hl]
+ cp $d0
+ jr z, .asm_8d68c
+ dec [hl]
+ dec [hl]
+ ret
+
+.asm_8d68c
+ call DeinitializeSprite
+ ret
+
+.GSIntroPikachu
+ call .AnonymousJumptable
+ jp hl
; anonymous jumptable
- dw Function8d69c
- dw Function8d6b6
- dw Function8d6c9
- dw Function8d6f2
-Function8d69c:
- ld hl, $4 ; 23:569c
- add hl, bc ; 23:569f
- ld a, [hl] ; 23:56a0
- cp $80 ; 23:56a1
- jr z, Function8d6a7 ; 23:56a3
- dec [hl] ; 23:56a5
- ret ; 23:56a6
-
-Function8d6a7: ; 8d6a7
- call Function8dbf0 ; 23:56a7
- ld hl, $d ; 23:56aa
- add hl, bc ; 23:56ad
- ld [hl], $30 ; 23:56ae
- ld a, $e ; 23:56b0
- call Function8d332 ; 23:56b2
- ret ; 23:56b5
-
-Function8d6b6: ; 8d6b6
- ld hl, $d ; 23:56b6
- add hl, bc ; 23:56b9
- ld a, [hl] ; 23:56ba
- and a ; 23:56bb
- jr z, Function8d6c0 ; 23:56bc
- dec [hl] ; 23:56be
- ret ; 23:56bf
-
-Function8d6c0: ; 8d6c0
- call Function8dbf0 ; 23:56c0
- ld a, $f ; 23:56c3
- call Function8d332 ; 23:56c5
- ret ; 23:56c8
-
-Function8d6c9: ; 8d6c9
- ld hl, $c ; 23:56c9
- add hl, bc ; 23:56cc
- ld a, [hl] ; 23:56cd
- add a, $4 ; 23:56ce
- ld [hl], a ; 23:56d0
- ld d, $4 ; 23:56d1
- call Function8dbf6 ; 23:56d3
- ld hl, $7 ; 23:56d6
- add hl, bc ; 23:56d9
- ld [hl], a ; 23:56da
- ld hl, $4 ; 23:56db
- add hl, bc ; 23:56de
- ld a, [hl] ; 23:56df
- cp $50 ; 23:56e0
- jr z, Function8d6e9 ; 23:56e2
- dec [hl] ; 23:56e4
- dec [hl] ; 23:56e5
- dec [hl] ; 23:56e6
- dec [hl] ; 23:56e7
- ret ; 23:56e8
-
-Function8d6e9: ; 8d6e9
- ld a, $1 ; 23:56e9
- ld [$cb19], a ; 23:56eb
- call Function8dbf0 ; 23:56ee
- ret ; 23:56f1
-
-Function8d6f2: ; 8d6f2
- ld hl, $4 ; 23:56f2
- add hl, bc ; 23:56f5
- ld a, [hl] ; 23:56f6
- cp $d0 ; 23:56f7
- jr z, Function8d6fe ; 23:56f9
- dec [hl] ; 23:56fb
- dec [hl] ; 23:56fc
- ret ; 23:56fd
-
-Function8d6fe: ; 8d6fe
- call DeinitializeSprite ; 23:56fe
- ret ; 23:5701
-
-Function8d702: ; 8d702
- call Function8dbdd ; 23:5702
- jp hl ; 23:5705
+ dw .Function8d69c
+ dw .Function8d6b6
+ dw .Function8d6c9
+ dw .Function8d6f2
+
+.Function8d69c
+ ld hl, SPRITEANIMSTRUCT_XCOORD
+ add hl, bc
+ ld a, [hl]
+ cp $80
+ jr z, .asm_8d6a7
+ dec [hl]
+ ret
+
+.asm_8d6a7
+ call .IncrementJumptableIndex
+ ld hl, SPRITEANIMSTRUCT_0D
+ add hl, bc
+ ld [hl], $30
+ ld a, SPRITE_ANIM_FRAMESET_GS_INTRO_PIKACHU_2
+ call _ReinitSpriteAnimFrame
+ ret
+
+.Function8d6b6
+ ld hl, SPRITEANIMSTRUCT_0D
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr z, .asm_8d6c0
+ dec [hl]
+ ret
+
+.asm_8d6c0
+ call .IncrementJumptableIndex
+ ld a, SPRITE_ANIM_FRAMESET_GS_INTRO_PIKACHU_3
+ call _ReinitSpriteAnimFrame
+ ret
+
+.Function8d6c9
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld a, [hl]
+ add $04
+ ld [hl], a
+ ld d, $04
+ call .Sprites_Sine
+ ld hl, SPRITEANIMSTRUCT_YOFFSET
+ add hl, bc
+ ld [hl], a
+ ld hl, SPRITEANIMSTRUCT_XCOORD
+ add hl, bc
+ ld a, [hl]
+ cp $50
+ jr z, .asm_8d6e9
+ dec [hl]
+ dec [hl]
+ dec [hl]
+ dec [hl]
+ ret
+
+.asm_8d6e9
+ ld a, 1
+ ld [wBattleMonLevel], a
+ call .IncrementJumptableIndex
+ ret
+
+.Function8d6f2
+ ld hl, SPRITEANIMSTRUCT_XCOORD
+ add hl, bc
+ ld a, [hl]
+ cp $d0
+ jr z, .asm_8d6fe
+ dec [hl]
+ dec [hl]
+ ret
+
+.asm_8d6fe
+ call DeinitializeSprite
+ ret
+
+.GSIntroPikachuTail
+ call .AnonymousJumptable
+ jp hl
; anonymous jumptable
- dw Function8d70c
- dw Function8d726
- dw Function8d73c
-
-Function8d70c: ; 8d70c
- ld hl, $4 ; 23:570c
- add hl, bc ; 23:570f
- ld a, [hl] ; 23:5710
- cp $80 ; 23:5711
- jr z, Function8d717 ; 23:5713
- dec [hl] ; 23:5715
- ret ; 23:5716
-
-Function8d717: ; 8d717
- call Function8dbf0 ; 23:5717
- ld hl, $d ; 23:571a
- add hl, bc ; 23:571d
- ld [hl], $30 ; 23:571e
- ld a, $11 ; 23:5720
- call Function8d332 ; 23:5722
- ret ; 23:5725
-
-Function8d726: ; 8d726
- ld hl, $d ; 23:5726
- add hl, bc ; 23:5729
- ld a, [hl] ; 23:572a
- and a ; 23:572b
- jr z, Function8d738 ; 23:572c
- dec [hl] ; 23:572e
- cp $20 ; 23:572f
- ret nz ; 23:5731
- ld a, $10 ; 23:5732
- call Function8d332 ; 23:5734
- ret ; 23:5737
-
-Function8d738: ; 8d738
- call Function8dbf0 ; 23:5738
- ret ; 23:573b
-
-Function8d73c: ; 8d73c
- ld hl, $c ; 23:573c
- add hl, bc ; 23:573f
- ld a, [hl] ; 23:5740
- add a, $4 ; 23:5741
- ld [hl], a ; 23:5743
- ld d, $4 ; 23:5744
- call Function8dbf6 ; 23:5746
- ld hl, $7 ; 23:5749
- add hl, bc ; 23:574c
- ld [hl], a ; 23:574d
- ld hl, $4 ; 23:574e
- add hl, bc ; 23:5751
- ld a, [hl] ; 23:5752
- cp $d0 ; 23:5753
- jr z, Function8d761 ; 23:5755
- dec [hl] ; 23:5757
- dec [hl] ; 23:5758
- ld a, [$cb19] ; 23:5759
- and a ; 23:575c
- ret nz ; 23:575d
- dec [hl] ; 23:575e
- dec [hl] ; 23:575f
- ret ; 23:5760
-
-Function8d761: ; 8d761
- call DeinitializeSprite ; 23:5761
- ret ; 23:5764
-
-Function8d765: ; 8d765
- call Function8dbdd ; 23:5765
- jp hl ; 23:5768
+ dw .Function8d70c
+ dw .Function8d726
+ dw .Function8d73c
+
+.Function8d70c
+ ld hl, SPRITEANIMSTRUCT_XCOORD
+ add hl, bc
+ ld a, [hl]
+ cp $80
+ jr z, .asm_8d717
+ dec [hl]
+ ret
+
+.asm_8d717
+ call .IncrementJumptableIndex
+
+ ld hl, SPRITEANIMSTRUCT_0D
+ add hl, bc
+ ld [hl], $30
+ ld a, SPRITE_ANIM_FRAMESET_GS_INTRO_PIKACHU_TAIL_2
+ call _ReinitSpriteAnimFrame
+ ret
+
+.Function8d726
+ ld hl, SPRITEANIMSTRUCT_0D
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr z, .asm_8d738
+ dec [hl]
+ cp $20
+ ret nz
+ ld a, SPRITE_ANIM_FRAMESET_GS_INTRO_PIKACHU_TAIL
+ call _ReinitSpriteAnimFrame
+ ret
+
+.asm_8d738
+ call .IncrementJumptableIndex
+ ret
+
+.Function8d73c
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld a, [hl]
+ add $04
+ ld [hl], a
+ ld d, $04
+ call .Sprites_Sine
+
+ ld hl, SPRITEANIMSTRUCT_YOFFSET
+ add hl, bc
+ ld [hl], a
+
+ ld hl, SPRITEANIMSTRUCT_XCOORD
+ add hl, bc
+ ld a, [hl]
+ cp $d0
+ jr z, .asm_8d761
+ dec [hl]
+ dec [hl]
+ ld a, [wBattleMonLevel]
+ and a
+ ret nz
+ dec [hl]
+ dec [hl]
+ ret
+
+.asm_8d761
+ call DeinitializeSprite
+ ret
+
+.GSIntroFireball
+ call .AnonymousJumptable
+ jp hl
; anonymous jumptable
- dw Function8d76d
- dw Function8d786
-
-Function8d76d: ; 8d76d
- call Function8dbf0 ; 23:576d
- ld hl, $0 ; 23:5770
- add hl, bc ; 23:5773
- ld a, [hl] ; 23:5774
- and $4 ; 23:5775
- sla a ; 23:5777
- ld e, a ; 23:5779
- ld a, [hl] ; 23:577a
- and $3 ; 23:577b
- swap a ; 23:577d
- add e ; 23:577f
- ld hl, $c ; 23:5780
- add hl, bc ; 23:5783
- ld [hl], a ; 23:5784
- ret ; 23:5785
-
-Function8d786: ; 8d786
- ld hl, $4 ; 23:5786
- add hl, bc ; 23:5789
- dec [hl] ; 23:578a
- dec [hl] ; 23:578b
- dec [hl] ; 23:578c
- dec [hl] ; 23:578d
- ld hl, $d ; 23:578e
- add hl, bc ; 23:5791
- ld a, [hl] ; 23:5792
- ld d, a ; 23:5793
- add a, $8 ; 23:5794
- ld [hl], a ; 23:5796
- ld hl, $c ; 23:5797
- add hl, bc ; 23:579a
- ld a, [hl] ; 23:579b
- push af ; 23:579c
- push de ; 23:579d
- call Function8dbf6 ; 23:579e
- ld hl, $7 ; 23:57a1
- add hl, bc ; 23:57a4
- ld [hl], a ; 23:57a5
- pop de ; 23:57a6
- pop af ; 23:57a7
- call Function8dbfa ; 23:57a8
- ld hl, $6 ; 23:57ab
- add hl, bc ; 23:57ae
- ld [hl], a ; 23:57af
- ret ; 23:57b0
-
-Function8d7b1: ; 8d7b1
- call Function8dbdd ; 23:57b1
- jp hl ; 23:57b4
+ dw .Function8d76d
+ dw .Function8d786
+
+.Function8d76d
+ call .IncrementJumptableIndex
+ ld hl, 0
+ add hl, bc
+ ld a, [hl]
+ and $4
+ sla a
+ ld e, a
+ ld a, [hl]
+ and $3
+ swap a
+ add e
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld [hl], a
+ ret
+
+.Function8d786
+ ld hl, SPRITEANIMSTRUCT_XCOORD
+ add hl, bc
+ dec [hl]
+ dec [hl]
+ dec [hl]
+ dec [hl]
+
+ ld hl, SPRITEANIMSTRUCT_0D
+ add hl, bc
+ ld a, [hl]
+ ld d, a
+ add $8
+ ld [hl], a
+
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld a, [hl]
+ push af
+ push de
+ call .Sprites_Sine
+
+ ld hl, SPRITEANIMSTRUCT_YOFFSET
+ add hl, bc
+ ld [hl], a
+ pop de
+ pop af
+ call .Sprites_Cosine
+
+ ld hl, SPRITEANIMSTRUCT_XOFFSET
+ add hl, bc
+ ld [hl], a
+ ret
+
+; flash down/right
+.GSIntroChikoritaTotodile
+ call .AnonymousJumptable
+ jp hl
; anonymous jumptable
- dw Function8d7b9
- dw Function8d7c9
-
-Function8d7b9: ; 8d7b9
- call Function8dbf0 ; 23:57b9
- ld hl, $c ; 23:57bc
- add hl, bc ; 23:57bf
- ld [hl], $30 ; 23:57c0
- ld hl, $d ; 23:57c2
- add hl, bc ; 23:57c5
- ld [hl], $30 ; 23:57c6
- ret ; 23:57c8
-
-Function8d7c9: ; 8d7c9
- ld hl, $c ; 23:57c9
- add hl, bc ; 23:57cc
- ld a, [hl] ; 23:57cd
- cp $3c ; 23:57ce
- ret nc ; 23:57d0
- inc [hl] ; 23:57d1
- inc [hl] ; 23:57d2
- ld d, $90 ; 23:57d3
- call Function8dbf6 ; 23:57d5
- ld hl, $7 ; 23:57d8
- add hl, bc ; 23:57db
- ld [hl], a ; 23:57dc
- ld hl, $d ; 23:57dd
- add hl, bc ; 23:57e0
- ld a, [hl] ; 23:57e1
- inc [hl] ; 23:57e2
- inc [hl] ; 23:57e3
- ld d, $90 ; 23:57e4
- call Function8dbfa ; 23:57e6
- ld hl, $6 ; 23:57e9
- add hl, bc ; 23:57ec
- ld [hl], a ; 23:57ed
- ret ; 23:57ee
-
-Function8d7ef: ; 8d7ef
- call Function8dbdd ; 23:57ef
- jp hl ; 23:57f2
+ dw .Function8d7b9
+ dw .Function8d7c9
+
+.Function8d7b9
+ call .IncrementJumptableIndex
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld [hl], $30
+ ld hl, SPRITEANIMSTRUCT_0D
+ add hl, bc
+ ld [hl], $30
+ ret
+
+.Function8d7c9
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld a, [hl]
+ cp $3c
+ ret nc
+
+ inc [hl]
+ inc [hl]
+ ld d, $90
+ call .Sprites_Sine
+
+ ld hl, SPRITEANIMSTRUCT_YOFFSET
+ add hl, bc
+ ld [hl], a
+
+ ld hl, SPRITEANIMSTRUCT_0D
+ add hl, bc
+ ld a, [hl]
+ inc [hl]
+ inc [hl]
+ ld d, $90
+ call .Sprites_Cosine
+
+ ld hl, SPRITEANIMSTRUCT_XOFFSET
+ add hl, bc
+ ld [hl], a
+ ret
+
+; flash down/left
+.GSIntroCyndaquil
+ call .AnonymousJumptable
+ jp hl
; anonymous jumptable
- dw Function8d7f7
- dw Function8d807
-
-Function8d7f7: ; 8d7f7
- call Function8dbf0 ; 23:57f7
- ld hl, $c ; 23:57fa
- add hl, bc ; 23:57fd
- ld [hl], $30 ; 23:57fe
- ld hl, $d ; 23:5800
- add hl, bc ; 23:5803
- ld [hl], $10 ; 23:5804
- ret ; 23:5806
-
-Function8d807: ; 8d807
- ld hl, $c ; 23:5807
- add hl, bc ; 23:580a
- ld a, [hl] ; 23:580b
- cp $3c ; 23:580c
- ret nc ; 23:580e
- inc [hl] ; 23:580f
- inc [hl] ; 23:5810
- ld d, $90 ; 23:5811
- call Function8dbf6 ; 23:5813
- ld hl, $7 ; 23:5816
- add hl, bc ; 23:5819
- ld [hl], a ; 23:581a
- ld hl, $d ; 23:581b
- add hl, bc ; 23:581e
- ld a, [hl] ; 23:581f
- inc [hl] ; 23:5820
- inc [hl] ; 23:5821
- ld d, $90 ; 23:5822
- call Function8dbfa ; 23:5824
- ld hl, $6 ; 23:5827
- add hl, bc ; 23:582a
- ld [hl], a ; 23:582b
- ret ; 23:582c
-
-Function8d82d: ; 8d82d
- call Function8dbdd ; 23:582d
- jp hl ; 23:5830
+ dw .Function8d7f7
+ dw .Function8d807
+
+.Function8d7f7
+ call .IncrementJumptableIndex
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld [hl], $30
+ ld hl, SPRITEANIMSTRUCT_0D
+ add hl, bc
+ ld [hl], $10
+ ret
+
+.Function8d807
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld a, [hl]
+ cp $3c
+ ret nc
+ inc [hl]
+ inc [hl]
+ ld d, $90
+ call .Sprites_Sine
+ ld hl, SPRITEANIMSTRUCT_YOFFSET
+ add hl, bc
+ ld [hl], a
+ ld hl, SPRITEANIMSTRUCT_0D
+ add hl, bc
+ ld a, [hl]
+ inc [hl]
+ inc [hl]
+ ld d, $90
+ call .Sprites_Cosine
+ ld hl, SPRITEANIMSTRUCT_XOFFSET
+ add hl, bc
+ ld [hl], a
+ ret
+.GSTitleTrail
+ call .AnonymousJumptable
+ jp hl
+
+IF DEF(_GOLD)
; anonymous jumptable
- dw Function8d835
- dw Function8d84c
-
-Function8d835: ; 8d835
- call Function8dbf0 ; 23:5835
- ld hl, $0 ; 23:5838
- add hl, bc ; 23:583b
- ld a, [hl] ; 23:583c
- ld hl, $d ; 23:583d
- add hl, bc ; 23:5840
- and $3 ; 23:5841
- ld [hl], a ; 23:5843
- inc [hl] ; 23:5844
- swap a ; 23:5845
- ld hl, $c ; 23:5847
- add hl, bc ; 23:584a
- ld [hl], a ; 23:584b
-Function8d84c: ; 8d84c
- ld hl, $4 ; 23:584c
- add hl, bc ; 23:584f
- ld a, [hl] ; 23:5850
- cp $a4 ; 23:5851
- jr nc, Function8d881 ; 23:5853
- ld hl, $d ; 23:5855
- add hl, bc ; 23:5858
- add a, $4 ; 23:5859
- ld hl, $4 ; 23:585b
- add hl, bc ; 23:585e
- ld [hl], a ; 23:585f
- ld hl, $5 ; 23:5860
- add hl, bc ; 23:5863
- inc [hl] ; 23:5864
- ld hl, $d ; 23:5865
- add hl, bc ; 23:5868
- ld a, [hl] ; 23:5869
- sla a ; 23:586a
- sla a ; 23:586c
- ld d, $2 ; 23:586e
- ld hl, $c ; 23:5870
- add hl, bc ; 23:5873
- ld a, [hl] ; 23:5874
- add a, $3 ; 23:5875
- ld [hl], a ; 23:5877
- call Function8dbf6 ; 23:5878
- ld hl, $7 ; 23:587b
- add hl, bc ; 23:587e
- ld [hl], a ; 23:587f
- ret ; 23:5880
-
-Function8d881: ; 8d881
- call DeinitializeSprite ; 23:5881
- ret ; 23:5884
-
-Function8d885: ; 8d885
- ld hl, $c ; 23:5885
- add hl, bc ; 23:5888
- ld a, [hl] ; 23:5889
- inc a ; 23:588a
- ld [hl], a ; 23:588b
- ld d, $2 ; 23:588c
- call Function8dbf6 ; 23:588e
- ld hl, $7 ; 23:5891
- add hl, bc ; 23:5894
- ld [hl], a ; 23:5895
- ret ; 23:5896
-
-Function8d897: ; 8d897
- push bc ; 23:5897
- callba_hc $38, $4000 ; 23:5898 ; 23:589d
- pop bc ; 23:589e
- ld hl, $c704 ; 23:589f
- ld a, [hl] ; 23:58a2
- and $3 ; 23:58a3
- ret z ; 23:58a5
- ld [hl], $0 ; 23:58a6
- ld e, a ; 23:58a8
- ld d, $0 ; 23:58a9
- ld hl, $58b4 ; 23:58ab
- add hl, de ; 23:58ae
- ld a, [hl] ; 23:58af
- call Function8d332 ; 23:58b0
- ret ; 23:58b3
-
-Function8d8b4: ; 8d8b4
- db $17
- db $18
- db $17
- db $19
-
-Function8d8b8: ; 8d8b8
- callba_hc $38, $4000 ; 23:58b8 ; 23:58bd
- ret ; 23:58be
-
-Function8d8bf: ; 8d8bf
- call Function8dbdd ; 23:58bf
- jp hl ; 23:58c2
+ dw .Function8d835
+ dw .Function8d84c
+
+.Function8d835
+ call .IncrementJumptableIndex
+
+ ld hl, SPRITEANIMSTRUCT_INDEX
+ add hl, bc
+ ld a, [hl]
+
+ ld hl, SPRITEANIMSTRUCT_0D
+ add hl, bc
+ and $3
+ ld [hl], a
+ inc [hl]
+ swap a
+
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld [hl], a
+
+.Function8d84c
+ ld hl, SPRITEANIMSTRUCT_XCOORD
+ add hl, bc
+ ld a, [hl]
+ cp $a4
+ jr nc, .asm_8d881
+
+ ld hl, SPRITEANIMSTRUCT_0D
+ add hl, bc
+ add $4
+
+ ld hl, SPRITEANIMSTRUCT_XCOORD
+ add hl, bc
+ ld [hl], a
+
+ ld hl, SPRITEANIMSTRUCT_YCOORD
+ add hl, bc
+ inc [hl]
+
+ ld hl, SPRITEANIMSTRUCT_0D
+ add hl, bc
+ ld a, [hl]
+ sla a
+ sla a
+ ld d, 2
+
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld a, [hl]
+ add $3
+ ld [hl], a
+ call .Sprites_Sine
+
+ ld hl, SPRITEANIMSTRUCT_YOFFSET
+ add hl, bc
+ ld [hl], a
+ ret
+
+.asm_8d881
+ call DeinitializeSprite
+ ret
+
+ELIF DEF(_SILVER)
+; anonymous jumptable
+ dw .Function8d835
+ dw .Function8d856
+
+.Function8d835
+ ld a, [wIntroSceneTimer]
+ and $30
+ swap a
+ add $3
+ ld d, a
+
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld a, [wIntroSceneTimer]
+ and $30
+ swap a
+ add $07
+ add [hl]
+ ld [hl], a
+ call .Sprites_Sine
+
+ ld hl, SPRITEANIMSTRUCT_YOFFSET
+ add hl, bc
+ ld [hl], a
+.Function8d856
+ ld hl, SPRITEANIMSTRUCT_XCOORD
+ add hl, bc
+ ld a, [hl]
+ cp $a4
+ jr nc, .asm_8d863
+ add $4
+ ld [hl], a
+ ret
+
+.asm_8d863
+ call DeinitializeSprite
+ ret
+ENDC
+
+.GSIntroHoOhLugia
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld a, [hl]
+IF DEF(_GOLD)
+ inc a
+ ld [hl], a
+ ld d, 2
+ELIF DEF(_SILVER)
+ dec a
+ ld [hl], a
+ ld d, 8
+ENDC
+ call .Sprites_Sine
+
+ ld hl, SPRITEANIMSTRUCT_YOFFSET
+ add hl, bc
+ ld [hl], a
+ ret
+
+.UnusedPikachu
+ push bc
+ farcall ret_e0000
+ pop bc
+ ld hl, wc704
+ ld a, [hl]
+ and $3
+ ret z
+ ld [hl], 0
+ ld e, a
+ ld d, 0
+ ld hl, .Data_8d8b4
+ add hl, de
+ ld a, [hl]
+ call _ReinitSpriteAnimFrame
+ ret
+
+.Data_8d8b4
+ db SPRITE_ANIM_FRAMESET_UNUSED_PIKACHU
+ db SPRITE_ANIM_FRAMESET_UNUSED_PIKACHU_2
+ db SPRITE_ANIM_FRAMESET_UNUSED_PIKACHU
+ db SPRITE_ANIM_FRAMESET_UNUSED_PIKACHU_3
+
+.UnusedPikachuTail
+ farcall ret_e0000
+ ret
+
+.UnusedNote
+ call .AnonymousJumptable
+ jp hl
; anonymous jumptable
- dw Function8d8c7
- dw Function8d8d9
-
-Function8d8c7: ; 8d8c7
- call Function8d8e1 ; 23:58c7
- ld a, [$c717] ; 23:58ca
- ld hl, $4 ; 23:58cd
- add hl, bc ; 23:58d0
- add [hl] ; 23:58d1
- ld [hl], a ; 23:58d2
- cp $c0 ; 23:58d3
- ret nc ; 23:58d5
- cp $a8 ; 23:58d6
- ret c ; 23:58d8
-Function8d8d9:
- call DeinitializeSprite ; 23:58d9
- ld hl, $c5bc ; 23:58dc
- dec [hl] ; 23:58df
- ret ; 23:58e0
-
-Function8d8e1: ; 8d8e1
- ld hl, $c ; 23:58e1
- add hl, bc ; 23:58e4
- ld a, [hl] ; 23:58e5
- inc [hl] ; 23:58e6
- and $1f ; 23:58e7
- srl a ; 23:58e9
- ld e, a ; 23:58eb
- ld d, $0 ; 23:58ec
- ld hl, Data_8d8f9 ; 23:58ee
- add hl, de ; 23:58f1
- ld a, [hl] ; 23:58f2
- ld hl, $7 ; 23:58f3
- add hl, bc ; 23:58f6
- ld [hl], a ; 23:58f7
- ret ; 23:58f8
-
-Data_8d8f9: ; 8d8f9
- db $04
- db $07
- db $09
- db $0a
- db $09
- db $07
- db $04
- db $00
- db $fc
- db $f9
- db $f7
- db $f6
- db $f7
- db $f9
- db $fc
- db $00
-
-Function8d909: ; 8d909
- ld a, [$c717]
- ld hl, $4
+ dw .Function8d8c7
+ dw .Function8d8d9
+
+.Function8d8c7
+ call .Function8d8e1
+ ld a, [wc717]
+ ld hl, SPRITEANIMSTRUCT_XCOORD
+ add hl, bc
+ add [hl]
+ ld [hl], a
+ cp $c0
+ ret nc
+ cp $a8
+ ret c
+.Function8d8d9
+ call DeinitializeSprite
+ ld hl, wSpriteAnimCount
+ dec [hl]
+ ret
+
+.Function8d8e1
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld a, [hl]
+ inc [hl]
+ and $1f
+ srl a
+ ld e, a
+ ld d, 0
+ ld hl, .Data_8d8f9
+ add hl, de
+ ld a, [hl]
+ ld hl, SPRITEANIMSTRUCT_YOFFSET
+ add hl, bc
+ ld [hl], a
+ ret
+
+.Data_8d8f9
+ db 4, 7, 9, 10, 9, 7, 4, 0
+ db -4, -7, -9, -10, -9, -7, -4, 0
+
+.UnusedJigglypuff
+ ld a, [wc717]
+
+ ld hl, SPRITEANIMSTRUCT_XCOORD
add hl, bc
add [hl]
ld [hl], a
cp $30
ret nz
xor a
- ld [$c717], a
- ret ; 23:5919
-
-Function8d91a: ; 8d91a
- callab_hc $4, $5dfa ; 23:591a ; 23:591f
- ret ; 23:5920
-
-Function8d921: ; 8d921
- callab_hc $4, $648e ; 23:5921 ; 23:5926
- ret ; 23:5927
-
-Function8d928: ; 8d928
- callab_hc $39, $4b20 ; 23:5928 ; 23:592d
- ret ; 23:592e
-
-Function8d92f: ; 8d92f
- ld hl, $c ; 23:592f
- add hl, bc ; 23:5932
- ld a, [hl] ; 23:5933
- and a ; 23:5934
- jr z, Function8d968 ; 23:5935
- dec [hl] ; 23:5937
- dec [hl] ; 23:5938
- ld d, a ; 23:5939
- and $1f ; 23:593a
- jr nz, .asm_8d943 ; 23:593c
- ld hl, $d ; 23:593e
- add hl, bc ; 23:5941
- dec [hl] ; 23:5942
+ ld [wc717], a
+ ret
+
+.NamingScreenCursor
+ callfar NamingScreen_AnimateCursor
+ ret
+
+.MailCursor
+ callfar ComposeMail_AnimateCursor
+ ret
+
+.GameFreakLogo:
+ callfar GFPresents_UpdateLogoPal
+ ret
+
+.GSIntroStar
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr z, .asm_8d968
+ dec [hl]
+ dec [hl]
+ ld d, a
+ and $1f
+ jr nz, .asm_8d943
+
+ ld hl, SPRITEANIMSTRUCT_0D
+ add hl, bc
+ dec [hl]
.asm_8d943
- ld hl, $b ; 23:5943
- add hl, bc ; 23:5946
- ld a, [hl] ; 23:5947
- push af ; 23:5948
- push de ; 23:5949
- call Function8dbf6 ; 23:594a
- ld hl, $7 ; 23:594d
- add hl, bc ; 23:5950
- ld [hl], a ; 23:5951
- pop de ; 23:5952
- pop af ; 23:5953
- call Function8dbfa ; 23:5954
- ld hl, $6 ; 23:5957
- add hl, bc ; 23:595a
- ld [hl], a ; 23:595b
- ld hl, $d ; 23:595c
- add hl, bc ; 23:595f
- ld a, [hl] ; 23:5960
- ld hl, $b ; 23:5961
- add hl, bc ; 23:5964
- add [hl] ; 23:5965
- ld [hl], a ; 23:5966
- ret ; 23:5967
-
-Function8d968: ; 8d968
- ld a, $1 ; 23:5968
- ld [$ce64], a ; 23:596a
- call DeinitializeSprite ; 23:596d
- ret ; 23:5970
-
-Function8d971: ; 8d971
- ld hl, $c ; 23:5971
- add hl, bc ; 23:5974
- ld a, [hli] ; 23:5975
- or [hl] ; 23:5976
- jr z, Function8d9cc ; 23:5977
- ld hl, $f ; 23:5979
- add hl, bc ; 23:597c
- ld d, [hl] ; 23:597d
- ld hl, $b ; 23:597e
- add hl, bc ; 23:5981
- ld a, [hl] ; 23:5982
- push af ; 23:5983
- push de ; 23:5984
- call Function8dbf6 ; 23:5985
- ld hl, $7 ; 23:5988
- add hl, bc ; 23:598b
- ld [hl], a ; 23:598c
- pop de ; 23:598d
- pop af ; 23:598e
- call Function8dbfa ; 23:598f
- ld hl, $6 ; 23:5992
- add hl, bc ; 23:5995
- ld [hl], a ; 23:5996
- ld hl, $c ; 23:5997
- add hl, bc ; 23:599a
- ld e, [hl] ; 23:599b
- inc hl ; 23:599c
- ld d, [hl] ; 23:599d
- ld hl, $e ; 23:599e
- add hl, bc ; 23:59a1
- ld a, [hli] ; 23:59a2
- ld h, [hl] ; 23:59a3
- ld l, a ; 23:59a4
- add hl, de ; 23:59a5
- ld e, l ; 23:59a6
- ld d, h ; 23:59a7
- ld hl, $e ; 23:59a8
- add hl, bc ; 23:59ab
- ld [hl], e ; 23:59ac
- inc hl ; 23:59ad
- ld [hl], d ; 23:59ae
- ld hl, $c ; 23:59af
- add hl, bc ; 23:59b2
- ld a, [hli] ; 23:59b3
- ld h, [hl] ; 23:59b4
- ld l, a ; 23:59b5
- ld de, $fff0 ; 23:59b6
- add hl, de ; 23:59b9
- ld e, l ; 23:59ba
- ld d, h ; 23:59bb
- ld hl, $c ; 23:59bc
- add hl, bc ; 23:59bf
- ld [hl], e ; 23:59c0
- inc hl ; 23:59c1
- ld [hl], d ; 23:59c2
- ld hl, $b ; 23:59c3
- add hl, bc ; 23:59c6
- ld a, [hl] ; 23:59c7
- xor $20 ; 23:59c8
- ld [hl], a ; 23:59ca
- ret ; 23:59cb
-
-Function8d9cc: ; 8d9cc
- call DeinitializeSprite ; 23:59cc
- ret ; 23:59cf
-
-Function8d9d0: ; 8d9d0
- callab_hc $24, $7772 ; 23:59d0 ; 23:59d5
- ret ; 23:59d6
-
-Function8d9d7: ; 8d9d7
- callab_hc $24, $7801 ; 23:59d7 ; 23:59dc
- ld hl, $ce64 ; 23:59dd
- ld a, [hl] ; 23:59e0
- cp $2 ; 23:59e1
- ret nz ; 23:59e3
- ld [hl], $3 ; 23:59e4
- ld a, $21 ; 23:59e6
- call Function8d332 ; 23:59e8
- ret ; 23:59eb
-
-Function8d9ec: ; 8d9ec
- ld hl, $b ; 23:59ec
- add hl, bc ; 23:59ef
- ld a, [hl] ; 23:59f0
- dec [hl] ; 23:59f1
- ld e, a ; 23:59f2
- and $1 ; 23:59f3
- jr z, .asm_8da10 ; 23:59f5
- ld hl, $4 ; 23:59f7
- add hl, bc ; 23:59fa
- ld a, [hl] ; 23:59fb
- cp $78 ; 23:59fc
- jr c, asm_8da0f ; 23:59fe
- call DeinitializeSprite ; 23:5a00
- ld a, $4 ; 23:5a03
- ld [$ce64], a ; 23:5a05
- ld de, $1e ; 23:5a08
- call $3e24 ; 23:5a0b
- ret ; 23:5a0e
-
-.asm_8da0f
- inc [hl] ; 23:5a0f
-.asm_8da10
- ld a, e ; 23:5a10
- ld d, $20 ; 23:5a11
- call Function8dbf6 ; 23:5a13
- ld hl, $7 ; 23:5a16
- add hl, bc ; 23:5a19
- ld [hl], a ; 23:5a1a
- ret ; 23:5a1b
-
-Function8da1c: ; 8da1c
- callab_hc $38, $4908 ; 23:5a1c ; 23:5a21
- ret ; 23:5a22
-
-Function8da23: ; 8da23
- callab_hc $24, $4d0b ; 23:5a23 ; 23:5a28
- ret ; 23:5a29
-
-Function8da2a: ; 8da2a
- callab_hc $38, $69ae ; 23:5a2a ; 23:5a2f
- ret ; 23:5a30
-
-Function8da31: ; 8da31
- call Function8dbdd ; 23:5a31
- jp hl ; 23:5a34
- ld b, c ; 23:5a35
- ld e, d ; 23:5a36
- add e ; 23:5a37
- ld e, d ; 23:5a38
- ld d, e ; 23:5a39
- ld e, d ; 23:5a3a
- ld h, [hl] ; 23:5a3b
- ld e, d ; 23:5a3c
- sub [hl] ; 23:5a3d
- ld e, d ; 23:5a3e
- call nc, $3e5a ; 23:5a3f
- ld h, $cd ; 23:5a42
- ld [hld], a ; 23:5a44
- ld d, e ; 23:5a45
- ld hl, $b ; 23:5a46
- add hl, bc ; 23:5a49
- ld [hl], $2 ; 23:5a4a
- ld hl, $c ; 23:5a4c
- add hl, bc ; 23:5a4f
- ld [hl], $20 ; 23:5a50
- ret ; 23:5a52
-
-Function8da53: ; 8da53
- ld hl, $c ; 23:5a53
- add hl, bc ; 23:5a56
- ld a, [hl] ; 23:5a57
- and a ; 23:5a58
- jr z, Function8da5d ; 23:5a59
- dec [hl] ; 23:5a5b
- ret ; 23:5a5c
-
-Function8da5d: ; 8da5d
- call Function8dbf0 ; 23:5a5d
- ld hl, $c ; 23:5a60
- add hl, bc ; 23:5a63
- ld [hl], $40 ; 23:5a64
- ld hl, $c ; 23:5a66
- add hl, bc ; 23:5a69
- ld a, [hl] ; 23:5a6a
- cp $30 ; 23:5a6b
- jr c, Function8da7b ; 23:5a6d
- dec [hl] ; 23:5a6f
- ld d, $28 ; 23:5a70
- call Function8dbf6 ; 23:5a72
- ld hl, $7 ; 23:5a75
- add hl, bc ; 23:5a78
- ld [hl], a ; 23:5a79
- ret ; 23:5a7a
-
-Function8da7b: ; 8da7b
- ld de, $c ; 23:5a7b
- call $3e24 ; 23:5a7e
- jr Function8dad4 ; 23:5a81
- ld hl, $b ; 23:5a83
- add hl, bc ; 23:5a86
- ld [hl], $4 ; 23:5a87
- ld hl, $c ; 23:5a89
- add hl, bc ; 23:5a8c
- ld [hl], $30 ; 23:5a8d
- ld hl, $d ; 23:5a8f
- add hl, bc ; 23:5a92
- ld [hl], $24 ; 23:5a93
- ret ; 23:5a95
-
-Function8da96: ; 8da96
- ld hl, $d ; 23:5a96
- add hl, bc ; 23:5a99
- ld a, [hl] ; 23:5a9a
- and a ; 23:5a9b
- jr z, Function8daca ; 23:5a9c
- ld d, a ; 23:5a9e
- ld hl, $c ; 23:5a9f
- add hl, bc ; 23:5aa2
- ld a, [hl] ; 23:5aa3
- call Sprites_Sine ; 23:5aa4
- ld hl, $7 ; 23:5aa7
- add hl, bc ; 23:5aaa
- ld [hl], a ; 23:5aab
- ld hl, $c ; 23:5aac
- add hl, bc ; 23:5aaf
- inc [hl] ; 23:5ab0
- ld a, [hl] ; 23:5ab1
- and $3f ; 23:5ab2
- ret nz ; 23:5ab4
- ld hl, $c ; 23:5ab5
- add hl, bc ; 23:5ab8
- ld [hl], $20 ; 23:5ab9
- ld hl, $d ; 23:5abb
- add hl, bc ; 23:5abe
- ld a, [hl] ; 23:5abf
- sub a, $c ; 23:5ac0
- ld [hl], a ; 23:5ac2
- ld de, $20 ; 23:5ac3
- call $3e24 ; 23:5ac6
- ret ; 23:5ac9
-
-Function8daca: ; 8daca
- xor a ; 23:5aca
- ld hl, $7 ; 23:5acb
- add hl, bc ; 23:5ace
- ld [hl], a ; 23:5acf
- call Function8dbf0 ; 23:5ad0
- ret ; 23:5ad3
-
-Function8dad4: ; 8dad4
- call DeinitializeSprite ; 23:5ad4
- ret ; 23:5ad7
-
-Function8dad8: ; 8dad8
- ld hl, $4 ; 23:5ad8
- add hl, bc ; 23:5adb
- ld a, [hl] ; 23:5adc
- inc [hl] ; 23:5add
- cp $b0 ; 23:5ade
- jr nc, Function8daec ; 23:5ae0
- and $3 ; 23:5ae2
- ret nz ; 23:5ae4
- ld de, $3 ; 23:5ae5
- call $3e24 ; 23:5ae8
- ret ; 23:5aeb
-
-Function8daec: ; 8daec
- call DeinitializeSprite ; 23:5aec
- ret ; 23:5aef
-
-Function8daf0: ; 8daf0
- callab_hc $a, $54cf ; 23:5af0 ; 23:5af5
- ret ; 23:5af6
-
-Function8daf7: ; 8daf7
- ld hl, $c ; 23:5af7
- add hl, bc ; 23:5afa
- ld a, [hl] ; 23:5afb
- cp $80 ; 23:5afc
- jr nc, Function8db21 ; 23:5afe
- ld d, a ; 23:5b00
- add a, $8 ; 23:5b01
- ld [hl], a ; 23:5b03
- ld hl, $b ; 23:5b04
- add hl, bc ; 23:5b07
- ld a, [hl] ; 23:5b08
- xor $20 ; 23:5b09
- ld [hl], a ; 23:5b0b
- push af ; 23:5b0c
- push de ; 23:5b0d
- call Function8dbf6 ; 23:5b0e
- ld hl, $7 ; 23:5b11
- add hl, bc ; 23:5b14
- ld [hl], a ; 23:5b15
- pop de ; 23:5b16
- pop af ; 23:5b17
- call Function8dbfa ; 23:5b18
- ld hl, $6 ; 23:5b1b
- add hl, bc ; 23:5b1e
- ld [hl], a ; 23:5b1f
- ret ; 23:5b20
-
-Function8db21: ; 8db21
- call DeinitializeSprite ; 23:5b21
- ret ; 23:5b24
-
-Function8db25: ; 8db25
- callab_hc $24, $55ff ; 23:5b25 ; 23:5b2a
- ret ; 23:5b2b
-
-Function8db2c: ; 8db2c
- ld hl, $d ; 23:5b2c
- add hl, bc ; 23:5b2f
- ld e, [hl] ; 23:5b30
- inc hl ; 23:5b31
- ld d, [hl] ; 23:5b32
- ld hl, $80 ; 23:5b33
- add hl, de ; 23:5b36
- ld e, l ; 23:5b37
- ld d, h ; 23:5b38
- ld hl, $d ; 23:5b39
- add hl, bc ; 23:5b3c
- ld [hl], e ; 23:5b3d
- inc hl ; 23:5b3e
- ld [hl], d ; 23:5b3f
- ld hl, $c ; 23:5b40
- add hl, bc ; 23:5b43
- ld a, [hl] ; 23:5b44
- inc [hl] ; 23:5b45
- inc [hl] ; 23:5b46
- inc [hl] ; 23:5b47
- push af ; 23:5b48
- push de ; 23:5b49
- call Function8dbf6 ; 23:5b4a
- ld hl, $7 ; 23:5b4d
- add hl, bc ; 23:5b50
- ld [hl], a ; 23:5b51
- pop de ; 23:5b52
- pop af ; 23:5b53
- call Function8dbfa ; 23:5b54
- ld hl, $6 ; 23:5b57
- add hl, bc ; 23:5b5a
- ld [hl], a ; 23:5b5b
- ret ; 23:5b5c
-
-Function8db5d: ; 8db5d
- ld hl, $5 ; 23:5b5d
- add hl, bc ; 23:5b60
- ld a, [hl] ; 23:5b61
- and a ; 23:5b62
- ret z ; 23:5b63
- ld hl, $d ; 23:5b64
- add hl, bc ; 23:5b67
- ld a, [hl] ; 23:5b68
- inc [hl] ; 23:5b69
- cp $40 ; 23:5b6a
- ret c ; 23:5b6c
- ld hl, $5 ; 23:5b6d
- add hl, bc ; 23:5b70
- dec [hl] ; 23:5b71
- dec [hl] ; 23:5b72
- ld hl, $f ; 23:5b73
- add hl, bc ; 23:5b76
- ld a, [hl] ; 23:5b77
- ld d, a ; 23:5b78
- cp $40 ; 23:5b79
- jr nc, .asm_8db80 ; 23:5b7b
- add a, $8 ; 23:5b7d
- ld [hl], a ; 23:5b7f
-.asm_8db80
- ld hl, $e ; 23:5b80
- add hl, bc ; 23:5b83
- ld a, [hl] ; 23:5b84
- inc [hl] ; 23:5b85
- call Function8dbfa ; 23:5b86
- ld hl, $6 ; 23:5b89
- add hl, bc ; 23:5b8c
- ld [hl], a ; 23:5b8d
- ret ; 23:5b8e
-
-Function8db8f: ; 8db8f
- ld hl, $4 ; 23:5b8f
- add hl, bc ; 23:5b92
- ld a, [hl] ; 23:5b93
- cp $b8 ; 23:5b94
- jr nc, Function8dbb0 ; 23:5b96
- inc [hl] ; 23:5b98
- inc [hl] ; 23:5b99
- ld hl, $5 ; 23:5b9a
- add hl, bc ; 23:5b9d
- dec [hl] ; 23:5b9e
- ld d, $40 ; 23:5b9f
- ld hl, $c ; 23:5ba1
- add hl, bc ; 23:5ba4
- ld a, [hl] ; 23:5ba5
- inc [hl] ; 23:5ba6
- call Function8dbfa ; 23:5ba7
- ld hl, $6 ; 23:5baa
- add hl, bc ; 23:5bad
- ld [hl], a ; 23:5bae
- ret ; 23:5baf
-
-Function8dbb0: ; 8dbb0
- call DeinitializeSprite ; 23:5bb0
- ret ; 23:5bb3
-
-Function8dbb4: ; 8dbb4
- ld hl, $5 ; 23:5bb4
- add hl, bc ; 23:5bb7
- ld a, [hl] ; 23:5bb8
- cp $54 ; 23:5bb9
- ret z ; 23:5bbb
- ld hl, $5 ; 23:5bbc
- add hl, bc ; 23:5bbf
- inc [hl] ; 23:5bc0
- inc [hl] ; 23:5bc1
- ld hl, $f ; 23:5bc2
- add hl, bc ; 23:5bc5
- ld a, [hl] ; 23:5bc6
- ld d, a ; 23:5bc7
- and a ; 23:5bc8
- jr z, .asm_8dbce ; 23:5bc9
- sub a, $2 ; 23:5bcb
- ld [hl], a ; 23:5bcd
+ ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX
+ add hl, bc
+ ld a, [hl]
+ push af
+ push de
+ call .Sprites_Sine
+
+ ld hl, SPRITEANIMSTRUCT_YOFFSET
+ add hl, bc
+ ld [hl], a
+ pop de
+ pop af
+ call .Sprites_Cosine
+
+ ld hl, SPRITEANIMSTRUCT_XOFFSET
+ add hl, bc
+ ld [hl], a
+
+ ld hl, SPRITEANIMSTRUCT_0D
+ add hl, bc
+ ld a, [hl]
+
+ ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX
+ add hl, bc
+ add [hl]
+ ld [hl], a
+ ret
+
+.asm_8d968
+ ld a, 1
+ ld [wce64], a
+ call DeinitializeSprite
+ ret
+
+.GSIntroSparkle
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld a, [hli]
+ or [hl]
+ jr z, .asm_8d9cc
+
+ ld hl, SPRITEANIMSTRUCT_0F
+ add hl, bc
+ ld d, [hl]
+
+ ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX
+ add hl, bc
+ ld a, [hl]
+ push af
+ push de
+ call .Sprites_Sine
+
+ ld hl, SPRITEANIMSTRUCT_YOFFSET
+ add hl, bc
+ ld [hl], a
+ pop de
+ pop af
+ call .Sprites_Cosine
+
+ ld hl, SPRITEANIMSTRUCT_XOFFSET
+ add hl, bc
+ ld [hl], a
+
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+
+ ld hl, SPRITEANIMSTRUCT_0E
+ add hl, bc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ add hl, de
+ ld e, l
+ ld d, h
+
+ ld hl, SPRITEANIMSTRUCT_0E
+ add hl, bc
+ ld [hl], e
+ inc hl
+ ld [hl], d
+
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld de, -$10
+ add hl, de
+ ld e, l
+ ld d, h
+
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld [hl], e
+ inc hl
+ ld [hl], d
+
+ ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX
+ add hl, bc
+ ld a, [hl]
+ xor $20
+ ld [hl], a
+ ret
+
+.asm_8d9cc
+ call DeinitializeSprite
+ ret
+
+.SlotsGolem:
+ callfar Slots_AnimateGolem
+ ret
+
+.SlotsChansey:
+ callfar Slots_AnimateChansey
+ ld hl, wce64
+ ld a, [hl]
+ cp 2
+ ret nz
+ ld [hl], 3
+ ld a, SPRITE_ANIM_FRAMESET_SLOTS_CHANSEY_2
+ call _ReinitSpriteAnimFrame
+ ret
+
+.SlotsChanseyEgg:
+ ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX
+ add hl, bc
+ ld a, [hl]
+ dec [hl]
+ ld e, a
+ and 1
+ jr z, .move_vertical
+
+ ld hl, SPRITEANIMSTRUCT_XCOORD
+ add hl, bc
+ ld a, [hl]
+ cp 15 * 8
+ jr c, .move_right
+ call DeinitializeSprite
+ ld a, 4
+ ld [wce64], a
+ ld de, SFX_PLACE_PUZZLE_PIECE_DOWN
+ call PlaySFX
+ ret
+
+.move_right
+ inc [hl]
+.move_vertical
+ ld a, e
+ ld d, $20
+ call .Sprites_Sine
+
+ ld hl, SPRITEANIMSTRUCT_YOFFSET
+ add hl, bc
+ ld [hl], a
+ ret
+
+.UnusedCursor
+ callfar ret_e0908
+ ret
+
+.PokegearArrow
+ callfar AnimatePokegearModeIndicatorArrow
+ ret
+
+.DummyGameCursor
+ callfar DummyGame_InterpretJoypad_AnimateCursor
+ ret
+
+.TradePokeBall
+ call .AnonymousJumptable
+ jp hl
+
+; Anonymous dw (see .AnonymousJumptable)
+ dw .TradePokeBall_zero
+ dw .TradePokeBall_one
+ dw .TradePokeBall_two
+ dw .TradePokeBall_three
+ dw .TradePokeBall_four
+ dw .TradePokeBall_five
+
+.TradePokeBall_zero
+ ld a, SPRITE_ANIM_FRAMESET_TRADE_POKE_BALL_WOBBLE
+ call _ReinitSpriteAnimFrame
+
+ ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX
+ add hl, bc
+ ld [hl], $2
+
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld [hl], $20
+ ret
+
+.TradePokeBall_two
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr z, .asm_8da5d
+ dec [hl]
+ ret
+
+.asm_8da5d
+ call .IncrementJumptableIndex
+
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld [hl], $40
+
+.TradePokeBall_three
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld a, [hl]
+ cp $30
+ jr c, .asm_8da7b
+ dec [hl]
+ ld d, $28
+ call .Sprites_Sine
+
+ ld hl, SPRITEANIMSTRUCT_YOFFSET
+ add hl, bc
+ ld [hl], a
+ ret
+
+.asm_8da7b
+ ld de, SFX_GOT_SAFARI_BALLS
+ call PlaySFX
+ jr .TradePokeBall_five
+
+.TradePokeBall_one
+ ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX
+ add hl, bc
+ ld [hl], $4
+
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld [hl], $30
+
+ ld hl, SPRITEANIMSTRUCT_0D
+ add hl, bc
+ ld [hl], $24
+ ret
+
+.TradePokeBall_four
+ ld hl, SPRITEANIMSTRUCT_0D
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr z, .asm_8daca
+ ld d, a
+
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld a, [hl]
+ call Sprites_Sine
+
+ ld hl, SPRITEANIMSTRUCT_YOFFSET
+ add hl, bc
+ ld [hl], a
+
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ inc [hl]
+ ld a, [hl]
+ and $3f
+ ret nz
+
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld [hl], $20
+
+ ld hl, SPRITEANIMSTRUCT_0D
+ add hl, bc
+ ld a, [hl]
+ sub $c
+ ld [hl], a
+ ld de, SFX_SWITCH_POKEMON
+ call PlaySFX
+ ret
+
+.asm_8daca
+ xor a
+
+ ld hl, SPRITEANIMSTRUCT_YOFFSET
+ add hl, bc
+ ld [hl], a
+ call .IncrementJumptableIndex
+ ret
+
+.TradePokeBall_five
+ call DeinitializeSprite
+ ret
+
+.TradeTubeBulge
+ ld hl, SPRITEANIMSTRUCT_XCOORD
+ add hl, bc
+ ld a, [hl]
+ inc [hl]
+ cp $b0
+ jr nc, .delete
+ and $3
+ ret nz
+ ld de, SFX_POKEBALLS_PLACED_ON_TABLE
+ call PlaySFX
+ ret
+
+.delete
+ call DeinitializeSprite
+ ret
+
+.TrademonInTube
+ callfar TradeAnim_AnimateTrademonInTube
+ ret
+
+.RevealNewMon:
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld a, [hl]
+ cp $80
+ jr nc, .finish_EggShell
+ ld d, a
+ add $8
+ ld [hl], a
+
+ ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX
+ add hl, bc
+ ld a, [hl]
+ xor $20
+ ld [hl], a
+
+ push af
+ push de
+ call .Sprites_Sine
+
+ ld hl, SPRITEANIMSTRUCT_YOFFSET
+ add hl, bc
+ ld [hl], a
+
+ pop de
+ pop af
+ call .Sprites_Cosine
+
+ ld hl, SPRITEANIMSTRUCT_XOFFSET
+ add hl, bc
+ ld [hl], a
+ ret
+
+.finish_EggShell
+ call DeinitializeSprite
+ ret
+
+.RadioTuningKnob:
+ callfar AnimateTuningKnob
+ ret
+
+.CutLeaves
+ ld hl, SPRITEANIMSTRUCT_0D
+ add hl, bc
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld hl, $80
+ add hl, de
+ ld e, l
+ ld d, h
+
+ ld hl, SPRITEANIMSTRUCT_0D
+ add hl, bc
+ ld [hl], e
+ inc hl
+ ld [hl], d
+
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld a, [hl]
+ inc [hl]
+ inc [hl]
+ inc [hl]
+ push af
+ push de
+ call .Sprites_Sine
+
+ ld hl, SPRITEANIMSTRUCT_YOFFSET
+ add hl, bc
+ ld [hl], a
+ pop de
+ pop af
+ call .Sprites_Cosine
+
+ ld hl, SPRITEANIMSTRUCT_XOFFSET
+ add hl, bc
+ ld [hl], a
+ ret
+
+.FlyFrom:
+ ld hl, SPRITEANIMSTRUCT_YCOORD
+ add hl, bc
+ ld a, [hl]
+ and a
+ ret z
+
+ ld hl, SPRITEANIMSTRUCT_0D
+ add hl, bc
+ ld a, [hl]
+ inc [hl]
+ cp $40
+ ret c
+
+ ld hl, SPRITEANIMSTRUCT_YCOORD
+ add hl, bc
+ dec [hl]
+ dec [hl]
+
+ ld hl, SPRITEANIMSTRUCT_0F
+ add hl, bc
+ ld a, [hl]
+ ld d, a
+ cp $40
+ jr nc, .skip
+ add $8
+ ld [hl], a
+.skip
+ ld hl, SPRITEANIMSTRUCT_0E
+ add hl, bc
+ ld a, [hl]
+ inc [hl]
+ call .Sprites_Cosine
+
+ ld hl, SPRITEANIMSTRUCT_XOFFSET
+ add hl, bc
+ ld [hl], a
+ ret
+
+.FlyLeaf:
+ ld hl, SPRITEANIMSTRUCT_XCOORD
+ add hl, bc
+ ld a, [hl]
+ cp -9 * 8
+ jr nc, .delete_leaf
+ inc [hl]
+ inc [hl]
+
+ ld hl, SPRITEANIMSTRUCT_YCOORD
+ add hl, bc
+ dec [hl]
+
+ ld d, $40
+ ld hl, SPRITEANIMSTRUCT_0C
+ add hl, bc
+ ld a, [hl]
+ inc [hl]
+ call .Sprites_Cosine
+
+ ld hl, SPRITEANIMSTRUCT_XOFFSET
+ add hl, bc
+ ld [hl], a
+ ret
+
+.delete_leaf
+ call DeinitializeSprite
+ ret
+
+.FlyTo:
+ ld hl, SPRITEANIMSTRUCT_YCOORD
+ add hl, bc
+ ld a, [hl]
+ cp 10 * 8 + 4
+ ret z
+
+ ld hl, SPRITEANIMSTRUCT_YCOORD
+ add hl, bc
+ inc [hl]
+ inc [hl]
+
+ ld hl, SPRITEANIMSTRUCT_0F
+ add hl, bc
+ ld a, [hl]
+ ld d, a
+ and a
+ jr z, .asm_8dbce
+ sub 2
+ ld [hl], a
.asm_8dbce
- ld hl, $e ; 23:5bce
- add hl, bc ; 23:5bd1
- ld a, [hl] ; 23:5bd2
- inc [hl] ; 23:5bd3
- call Function8dbfa ; 23:5bd4
- ld hl, $6 ; 23:5bd7
- add hl, bc ; 23:5bda
- ld [hl], a ; 23:5bdb
- ret ; 23:5bdc
-
-Function8dbdd: ; 8dbdd
- ld hl, [sp+$0] ; 23:5bdd
- ld e, [hl] ; 23:5bdf
- inc hl ; 23:5be0
- ld d, [hl] ; 23:5be1
- inc de ; 23:5be2
- ld hl, $b ; 23:5be3
- add hl, bc ; 23:5be6
- ld l, [hl] ; 23:5be7
- ld h, $0 ; 23:5be8
- add hl, hl ; 23:5bea
- add hl, de ; 23:5beb
- ld a, [hli] ; 23:5bec
- ld h, [hl] ; 23:5bed
- ld l, a ; 23:5bee
- ret ; 23:5bef
-
-Function8dbf0: ; 8dbf0
- ld hl, $b ; 23:5bf0
- add hl, bc ; 23:5bf3
- inc [hl] ; 23:5bf4
- ret ; 23:5bf5
-
-Function8dbf6: ; 8dbf6
- call Sprites_Sine ; 23:5bf6
- ret ; 23:5bf9
-
-Function8dbfa: ; 8dbfa
- call Sprites_Cosine ; 23:5bfa
- ret ; 23:5bfd
+ ld hl, SPRITEANIMSTRUCT_0E
+ add hl, bc
+ ld a, [hl]
+ inc [hl]
+ call .Sprites_Cosine
+
+ ld hl, SPRITEANIMSTRUCT_XOFFSET
+ add hl, bc
+ ld [hl], a
+ ret
+
+.AnonymousJumptable:
+ ld hl, sp+$0
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ inc de
+
+ ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX
+ add hl, bc
+ ld l, [hl]
+ ld h, 0
+ add hl, hl
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ret
+
+.IncrementJumptableIndex:
+ ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX
+ add hl, bc
+ inc [hl]
+ ret
+
+.Sprites_Sine:
+ call Sprites_Sine
+ ret
+
+.Sprites_Cosine:
+ call Sprites_Cosine
+ ret
diff --git a/engine/gfx/sprites.asm b/engine/gfx/sprites.asm
index b9267d66..824ceac4 100755
--- a/engine/gfx/sprites.asm
+++ b/engine/gfx/sprites.asm
@@ -1,645 +1,639 @@
-ClearAnimatedObjects: ; 8d174
- ld hl, $c508 ; 23:5174
- ld bc, $c1 ; 23:5177
+ClearSpriteAnims:
+ ld hl, wSpriteAnimDict
+ ld bc, wSpriteAnimsEnd - wSpriteAnimDict
.loop
- ld [hl], $0 ; 23:517a
- inc hl ; 23:517c
- dec bc ; 23:517d
- ld a, c ; 23:517e
- or b ; 23:517f
- jr nz, .loop ; 23:5180
- ret ; 23:5182
-
-PlayAnimatedObjectationsAndDelayFrame: ; 8d182
- call PlayAnimatedObjectations ; 23:5183
- call $32e ; DelayFrame ; 23:5186
- ret ; 23:5189
-
-PlayAnimatedObjectations: ; 8d189
- push hl ; 23:518a
- push de ; 23:518b
- push bc ; 23:518c
- push af ; 23:518d
-
- ld a, $0 ; 23:518e
- ld [$c5bd], a ; 23:5190
- call DoNextFrameForAllSprites ; 23:5193
-
- pop af ; 23:5196
- pop bc ; 23:5197
- pop de ; 23:5198
- pop hl ; 23:5199
- ret ; 23:519a
-
-DoNextFrameForAllSprites: ; 8d19b
- ld hl, $c51c ; 23:519b
- ld e, $a ; 23:519e
+ ld [hl], 0
+ inc hl
+ dec bc
+ ld a, c
+ or b
+ jr nz, .loop
+ ret
+
+PlaySpriteAnimationsAndDelayFrame:
+ call PlaySpriteAnimations
+ call DelayFrame
+ ret
+
+PlaySpriteAnimations:
+ push hl
+ push de
+ push bc
+ push af
+
+ ld a, LOW(wVirtualOAM)
+ ld [wCurSpriteOAMAddr], a
+ call DoNextFrameForAllSprites
+
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ret
+
+DoNextFrameForAllSprites:
+ ld hl, wSpriteAnimationStructs
+ ld e, NUM_SPRITE_ANIM_STRUCTS
+
.loop
- ld a, [hl] ; 23:51a0
- and a ; 23:51a1
- jr z, .skip_capacity_check ; 23:51a2
- ld c, l ; 23:51a4
- ld b, h ; 23:51a5
- push hl ; 23:51a6
- push de ; 23:51a7
- call DoAnimFrame ; 23:51a8
- call UpdateAnimFrame ; 23:51ab
- pop de ; 23:51ae
- pop hl ; 23:51af
- jr c, .cancel ; 23:51b0
-.skip_capacity_check
- ld bc, $10 ; 23:51b2
- add hl, bc ; 23:51b5
- dec e ; 23:51b6
- jr nz, .loop ; 23:51b7
- ld a, [$c5bd] ; 23:51b9
- ld l, a ; 23:51bc
- ld h, $c3 ; 23:51bd
-.loop2
- ld a, l ; 23:51bf
- cp $a0 ; 23:51c0
- jr nc, .cancel ; 23:51c2
- xor a ; 23:51c4
- ld [hli], a ; 23:51c5
- jr .loop2 ; 23:51c6
-
-.cancel
- ret ; 23:51c8
-
-DoNextFrameForFirst16Sprites: ; 8d1c9
- ld hl, $c51c ; 23:51c9
- ld e, $a ; 23:51cc
+ ld a, [hl]
+ and a
+ jr z, .next ; This struct is deinitialized.
+ ld c, l
+ ld b, h
+ push hl
+ push de
+ call DoAnimFrame ; Uses a massive dw
+ call UpdateAnimFrame
+ pop de
+ pop hl
+ jr c, .done
+
+.next
+ ld bc, SPRITEANIMSTRUCT_LENGTH
+ add hl, bc
+ dec e
+ jr nz, .loop
+
+ ld a, [wCurSpriteOAMAddr]
+ ld l, a
+ ld h, HIGH(wVirtualOAM)
+
+.loop2 ; Clear (wVirtualOAM + [wCurSpriteOAMAddr] --> wVirtualOAMEnd)
+ ld a, l
+ cp LOW(wVirtualOAMEnd)
+ jr nc, .done
+ xor a
+ ld [hli], a
+ jr .loop2
+
+.done
+ ret
+
+DoNextFrameForFirst16Sprites:
+ ld hl, wSpriteAnimationStructs
+ ld e, NUM_SPRITE_ANIM_STRUCTS
+
.loop
- ld a, [hl] ; 23:51ce
- and a ; 23:51cf
- jr z, .skip_capacity_check ; 23:51d0
- ld c, l ; 23:51d2
- ld b, h ; 23:51d3
- push hl ; 23:51d4
- push de ; 23:51d5
- call DoAnimFrame ; 23:51d6
- call UpdateAnimFrame ; 23:51d9
- pop de ; 23:51dc
- pop hl ; 23:51dd
- jr c, .cancel ; 23:51de
-.skip_capacity_check
- ld bc, $10 ; 23:51e0
- add hl, bc ; 23:51e3
- dec e ; 23:51e4
- jr nz, .loop ; 23:51e5
- ld a, [$c5bd] ; 23:51e7
- ld l, a ; 23:51ea
- ld h, $c3 ; 23:51eb
-.loop2
- ld a, l ; 23:51ed
- cp $40 ; 23:51ee
- jr nc, .cancel ; 23:51f0
- xor a ; 23:51f2
- ld [hli], a ; 23:51f3
- jr .loop2 ; 23:51f4
-
-.cancel
- ret ; 23:51f6
-
-_InitSpriteAnimStruct:: ; 8d1f7
- push de ; 23:51f7
- push af ; 23:51f8
- ld hl, $c51c ; 23:51f9
- ld e, $a ; 23:51fc
+ ld a, [hl]
+ and a
+ jr z, .next
+ ld c, l
+ ld b, h
+ push hl
+ push de
+ call DoAnimFrame ; Uses a massive dw
+ call UpdateAnimFrame
+ pop de
+ pop hl
+ jr c, .done
+
+.next
+ ld bc, SPRITEANIMSTRUCT_LENGTH
+ add hl, bc
+ dec e
+ jr nz, .loop
+
+ ld a, [wCurSpriteOAMAddr]
+ ld l, a
+ ld h, HIGH(wVirtualOAMSprite16)
+
+.loop2 ; Clear (wVirtualOAM + [wCurSpriteOAMAddr] --> Sprites + $40)
+ ld a, l
+ cp LOW(wVirtualOAMSprite16)
+ jr nc, .done
+ xor a
+ ld [hli], a
+ jr .loop2
+
+.done
+ ret
+
+_InitSpriteAnimStruct::
+; Initialize animation a at pixel x=e, y=d
+; Find if there's any room in the wSpriteAnimationStructs array, which is 10x16
+ push de
+ push af
+ ld hl, wSpriteAnimationStructs
+ ld e, NUM_SPRITE_ANIM_STRUCTS
.loop
- ld a, [hl] ; 23:51fe
- and a ; 23:51ff
- jr z, .found ; 23:5200
- ld bc, $10 ; 23:5202
- add hl, bc ; 23:5205
- dec e ; 23:5206
- jr nz, .loop ; 23:5207
- pop af ; 23:5209
- pop de ; 23:520a
- scf ; 23:520b
- ret ; 23:520c
-
-.found ; 8d20d
- ld c, l ; 23:520d
- ld b, h ; 23:520e
- ld hl, $c5bc ; 23:520f
- inc [hl] ; 23:5212
- ld a, [hl] ; 23:5213
- and a ; 23:5214
- jr nz, .initialized ; 23:5215
- inc [hl] ; 23:5217
+ ld a, [hl]
+ and a
+ jr z, .found
+ ld bc, SPRITEANIMSTRUCT_LENGTH
+ add hl, bc
+ dec e
+ jr nz, .loop
+; We've reached the end. There is no more room here.
+; Return carry.
+ pop af
+ pop de
+ scf
+ ret
+
+.found
+; Back up the structure address to bc.
+ ld c, l
+ ld b, h
+; Value [wSpriteAnimCount] is initially set to -1. Set it to
+; the number of objects loaded into this array.
+ ld hl, wSpriteAnimCount
+ inc [hl]
+ ld a, [hl]
+ and a
+ jr nz, .initialized
+ inc [hl]
+
.initialized
- pop af ; 23:5218
- ld e, a ; 23:5219
- ld d, $0 ; 23:521a
- ld hl, AnimatedObjectSeqData ; 23:521c
- add hl, de ; 23:521f
- add hl, de ; 23:5220
- add hl, de ; 23:5221
- ld e, l ; 23:5222
- ld d, h ; 23:5223
- ld hl, $0 ; 23:5224
- add hl, bc ; 23:5227
- ld a, [$c5bc] ; 23:5228
- ld [hli], a ; 23:522b
- ld a, [de] ; 23:522c
- ld [hli], a ; 23:522d
- inc de ; 23:522e
- ld a, [de] ; 23:522f
- ld [hli], a ; 23:5230
- inc de ; 23:5231
- ld a, [de] ; 23:5232
- call GetAnimatedObjectVTile ; 23:5233
- ld [hli], a ; 23:5236
- pop de ; 23:5237
- ld hl, $4 ; 23:5238
- add hl, bc ; 23:523b
- ld a, e ; 23:523c
- ld [hli], a ; 23:523d
- ld a, d ; 23:523e
- ld [hli], a ; 23:523f
- xor a ; 23:5240
- ld [hli], a ; 23:5241
- ld [hli], a ; 23:5242
- xor a ; 23:5243
- ld [hli], a ; 23:5244
- ld [hli], a ; 23:5245
- dec a ; 23:5246
- ld [hli], a ; 23:5247
- xor a ; 23:5248
- ld [hli], a ; 23:5249
- ld [hli], a ; 23:524a
- ld [hli], a ; 23:524b
- ld [hli], a ; 23:524c
- ld [hl], a ; 23:524d
- ld a, c ; 23:524e
- ld [$c5c0], a ; 23:524f
- ld a, b ; 23:5252
- ld [$c5c1], a ; 23:5253
- ret ; 23:5256
-
-DeinitializeSprite: ; 8d257
- ld hl, $0 ; 23:5257
- add hl, bc ; 23:525a
- ld [hl], $0 ; 23:525b
- ret ; 23:525d
-
-UpdateAnimFrame: ; 8d25e
- call InitAnimatedObjectBuffer ; 23:525e
- call GetAnimatedObjectFrame ; 23:5261
- cp $fd ; 23:5264
- jr z, .done ; 23:5266
- cp $fc ; 23:5268
- jr z, .delete ; 23:526a
- call GetFrameOAMPointer ; 23:526c
- ld a, [$c5c2] ; 23:526f
- add [hl] ; 23:5272
- ld [$c5c2], a ; 23:5273
- inc hl ; 23:5276
- ld a, [hli] ; 23:5277
- ld h, [hl] ; 23:5278
- ld l, a ; 23:5279
- push bc ; 23:527a
- ld a, [$c5bd] ; 23:527b
- ld e, a ; 23:527e
- ld d, $c3 ; 23:527f
- ld a, [hli] ; 23:5281
- ld c, a ; 23:5282
+; Get row a of SpriteAnimSeqData, copy the pointer into de
+ pop af
+ ld e, a
+ ld d, 0
+ ld hl, SpriteAnimSeqData
+ add hl, de
+ add hl, de
+ add hl, de
+ ld e, l
+ ld d, h
+; Set hl to the first field (field 0) in the current structure.
+ ld hl, SPRITEANIMSTRUCT_INDEX
+ add hl, bc
+; Load the index.
+ ld a, [wSpriteAnimCount]
+ ld [hli], a
+; Copy the table entry to the next two fields.
+ ld a, [de]
+ ld [hli], a
+ inc de
+ ld a, [de]
+ ld [hli], a
+ inc de
+; Look up the third field from the table in the wSpriteAnimDict array (10x2).
+; Take the value and load it in
+ ld a, [de]
+ call GetSpriteAnimVTile
+ ld [hli], a
+ pop de
+; Set hl to field 4 (X coordinate). Kinda pointless, because we're presumably already here.
+ ld hl, SPRITEANIMSTRUCT_XCOORD
+ add hl, bc
+; Load the original value of de into here.
+ ld a, e
+ ld [hli], a
+ ld a, d
+ ld [hli], a
+; load 0 into the next four fields
+ xor a
+ ld [hli], a
+ ld [hli], a
+ xor a
+ ld [hli], a
+ ld [hli], a
+; load -1 into the next field
+ dec a
+ ld [hli], a
+; load 0 into the last five fields
+ xor a
+rept 4
+ ld [hli], a
+endr
+ ld [hl], a
+; back up the address of the first field to wSpriteAnimAddrBackup
+ ld a, c
+ ld [wSpriteAnimAddrBackup], a
+ ld a, b
+ ld [wSpriteAnimAddrBackup + 1], a
+ ret
+
+DeinitializeSprite:
+; Clear the index field of the struct in bc.
+ ld hl, SPRITEANIMSTRUCT_INDEX
+ add hl, bc
+ ld [hl], 0
+ ret
+
+UpdateAnimFrame:
+ call InitSpriteAnimBuffer ; init WRAM
+ call GetSpriteAnimFrame ; read from a memory array
+ cp -3
+ jr z, .done
+ cp -4
+ jr z, .delete
+ call GetFrameOAMPointer
+ ; add byte to [wCurAnimVTile]
+ ld a, [wCurAnimVTile]
+ add [hl]
+ ld [wCurAnimVTile], a
+ inc hl
+ ; load pointer into hl
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ push bc
+ ld a, [wCurSpriteOAMAddr]
+ ld e, a
+ ld d, HIGH(wVirtualOAM)
+ ld a, [hli]
+ ld c, a ; number of objects
.loop
- ld a, [$c5c4] ; 23:5283
- ld b, a ; 23:5286
- ld a, [$c5c6] ; 23:5287
- add b ; 23:528a
- ld b, a ; 23:528b
- ld a, [$c5c7] ; 23:528c
- add b ; 23:528f
- ld b, a ; 23:5290
- call AddOrSubtractX ; 23:5291
- add b ; 23:5294
- ld [de], a ; 23:5295
- inc hl ; 23:5296
- inc de ; 23:5297
- ld a, [$c5c3] ; 23:5298
- ld b, a ; 23:529b
- ld a, [$c5c5] ; 23:529c
- add b ; 23:529f
- ld b, a ; 23:52a0
- ld a, [$c5c8] ; 23:52a1
- add b ; 23:52a4
- ld b, a ; 23:52a5
- call AddOrSubtractY ; 23:52a6
- add b ; 23:52a9
- ld [de], a ; 23:52aa
- inc hl ; 23:52ab
- inc de ; 23:52ac
- ld a, [$c5c2] ; 23:52ad
- add [hl] ; 23:52b0
- ld [de], a ; 23:52b1
- inc hl ; 23:52b2
- inc de ; 23:52b3
- call GetSpriteOAMAttr ; 23:52b4
- ld [de], a ; 23:52b7
- inc hl ; 23:52b8
- inc de ; 23:52b9
- ld a, e ; 23:52ba
- ld [$c5bd], a ; 23:52bb
- cp $a0 ; 23:52be
- jr nc, reached_the_end ; 23:52c0
- dec c ; 23:52c2
- jr nz, .loop ; 23:52c3
- pop bc ; 23:52c5
- jr .done ; 23:52c6
+ ; first byte: y (px)
+ ; [de] = [wCurAnimYCoord] + [wCurAnimYOffset] + [wGlobalAnimYOffset] + AddOrSubtractY([hl])
+ ld a, [wCurAnimYCoord]
+ ld b, a
+ ld a, [wCurAnimYOffset]
+ add b
+ ld b, a
+ ld a, [wGlobalAnimYOffset]
+ add b
+ ld b, a
+ call AddOrSubtractY
+ add b
+ ld [de], a
+ inc hl
+ inc de
+ ; second byte: x (px)
+ ; [de] = [wCurAnimXCoord] + [wCurAnimXOffset] + [wGlobalAnimXOffset] + AddOrSubtractX([hl])
+ ld a, [wCurAnimXCoord]
+ ld b, a
+ ld a, [wCurAnimXOffset]
+ add b
+ ld b, a
+ ld a, [wGlobalAnimXOffset]
+ add b
+ ld b, a
+ call AddOrSubtractX
+ add b
+ ld [de], a
+ inc hl
+ inc de
+ ; third byte: vtile
+ ; [de] = [wCurAnimVTile] + [hl]
+ ld a, [wCurAnimVTile]
+ add [hl]
+ ld [de], a
+ inc hl
+ inc de
+ ; fourth byte: attributes
+ ; [de] = GetSpriteOAMAttr([hl])
+ call GetSpriteOAMAttr
+ ld [de], a
+ inc hl
+ inc de
+ ld a, e
+ ld [wCurSpriteOAMAddr], a
+ cp LOW(wVirtualOAMEnd)
+ jr nc, .reached_the_end
+ dec c
+ jr nz, .loop
+ pop bc
+ jr .done
.delete
- call DeinitializeSprite ; 23:52c8
+ call DeinitializeSprite
.done
- and a ; 23:52cb
- ret ; 23:52cc
-
-reached_the_end
- pop bc ; 23:52cd
- scf ; 23:52ce
- ret ; 23:52cf
-
-AddOrSubtractX: ; 8d2d0
- push hl ; 23:52d0
- ld a, [hl] ; 23:52d1
- ld hl, $c5c0 ; 23:52d2
- bit 6, [hl] ; 23:52d5
- jr z, .ok ; 23:52d7
- add a, $8 ; 23:52d9
- xor $ff ; 23:52db
- inc a ; 23:52dd
+ and a
+ ret
+
+.reached_the_end
+ pop bc
+ scf
+ ret
+
+AddOrSubtractY:
+ push hl
+ ld a, [hl]
+ ld hl, wCurSpriteOAMFlags
+ bit OAM_Y_FLIP, [hl]
+ jr z, .ok
+ ; -8 - a
+ add $8
+ xor $ff
+ inc a
+
.ok
- pop hl ; 23:52de
- ret ; 23:52df
-
-AddOrSubtractY: ; 8d2e0
- push hl ; 23:52e0
- ld a, [hl] ; 23:52e1
- ld hl, $c5c0 ; 23:52e2
- bit 5, [hl] ; 23:52e5
- jr z, .ok ; 23:52e7
- add a, $8 ; 23:52e9
- xor $ff ; 23:52eb
- inc a ; 23:52ed
+ pop hl
+ ret
+
+AddOrSubtractX:
+ push hl
+ ld a, [hl]
+ ld hl, wCurSpriteOAMFlags
+ bit OAM_X_FLIP, [hl]
+ jr z, .ok
+ ; -8 - a
+ add 8
+ xor $ff
+ inc a
+
.ok
- pop hl ; 23:52ee
- ret ; 23:52ef
-
-GetSpriteOAMAttr: ; 8d2f0
- ld a, [$c5c0] ; 23:52f0
- ld b, a ; 23:52f3
- ld a, [hl] ; 23:52f4
- xor b ; 23:52f5
- and $e0 ; 23:52f6
- ld b, a ; 23:52f8
- ld a, [hl] ; 23:52f9
- and $1f ; 23:52fa
- or b ; 23:52fc
- ret ; 23:52fd
-
-InitAnimatedObjectBuffer: ; 8d2fe
- xor a ; 23:52fe
- ld [$c5c0], a ; 23:52ff
- ld hl, $3 ; 23:5302
- add hl, bc ; 23:5305
- ld a, [hli] ; 23:5306
- ld [$c5c2], a ; 23:5307
- ld a, [hli] ; 23:530a
- ld [$c5c3], a ; 23:530b
- ld a, [hli] ; 23:530e
- ld [$c5c4], a ; 23:530f
- ld a, [hli] ; 23:5312
- ld [$c5c5], a ; 23:5313
- ld a, [hli] ; 23:5316
- ld [$c5c6], a ; 23:5317
- ret ; 23:531a
-
-GetAnimatedObjectVTile: ; 8d31b
- push hl ; 23:531b
- push bc ; 23:531c
- ld hl, $c508 ; 23:531d
- ld b, a ; 23:5320
- ld c, $a ; 23:5321
+ pop hl
+ ret
+
+GetSpriteOAMAttr:
+ ld a, [wCurSpriteOAMFlags]
+ ld b, a
+ ld a, [hl]
+ xor b
+ and PRIORITY | Y_FLIP | X_FLIP
+ ld b, a
+ ld a, [hl]
+ and $ff ^ (PRIORITY | Y_FLIP | X_FLIP)
+ or b
+ ret
+
+InitSpriteAnimBuffer:
+ xor a
+ ld [wCurSpriteOAMFlags], a
+ ld hl, SPRITEANIMSTRUCT_TILE_ID
+ add hl, bc
+ ld a, [hli]
+ ld [wCurAnimVTile], a
+ ld a, [hli]
+ ld [wCurAnimXCoord], a
+ ld a, [hli]
+ ld [wCurAnimYCoord], a
+ ld a, [hli]
+ ld [wCurAnimXOffset], a
+ ld a, [hli]
+ ld [wCurAnimYOffset], a
+ ret
+
+GetSpriteAnimVTile:
+; a = wSpriteAnimDict[a] if a in wSpriteAnimDict else 0
+; vTiles offset
+ push hl
+ push bc
+ ld hl, wSpriteAnimDict
+ ld b, a
+ ld c, NUM_SPRITE_ANIM_STRUCTS
.loop
- ld a, [hli] ; 23:5323
- cp b ; 23:5324
- jr z, .ok ; 23:5325
- inc hl ; 23:5327
- dec c ; 23:5328
- jr nz, .loop ; 23:5329
- xor a ; 23:532b
- jr .done ; 23:532c
+ ld a, [hli]
+ cp b
+ jr z, .ok
+ inc hl
+ dec c
+ jr nz, .loop
+ xor a
+ jr .done
.ok
- ld a, [hl] ; 23:532e
+ ld a, [hl]
+
.done
- pop bc ; 23:532f
- pop hl ; 23:5330
- ret ; 23:5331
-
-Function8d332: ; 8d332
- ld hl, $1 ; 23:5332
- add hl, bc ; 23:5335
- ld [hl], a ; 23:5336
- ld hl, $8 ; 23:5337
- add hl, bc ; 23:533a
- ld [hl], $0 ; 23:533b
- ld hl, $a ; 23:533d
- add hl, bc ; 23:5340
- ld [hl], $ff ; 23:5341
- ret ; 23:5343
-
-GetAnimatedObjectFrame: ; 8d344
+ pop bc
+ pop hl
+ ret
+
+_ReinitSpriteAnimFrame::
+ ld hl, SPRITEANIMSTRUCT_FRAMESET_ID
+ add hl, bc
+ ld [hl], a
+ ld hl, SPRITEANIMSTRUCT_DURATION
+ add hl, bc
+ ld [hl], 0
+ ld hl, SPRITEANIMSTRUCT_FRAME
+ add hl, bc
+ ld [hl], -1
+ ret
+
+GetSpriteAnimFrame:
.loop
- ld hl, $8 ; 23:5344
- add hl, bc ; 23:5347
- ld a, [hl] ; 23:5348
- and a ; 23:5349
- jr z, .next_frame ; 23:534a
- dec [hl] ; 23:534c
- call .GetPointer ; 23:534d
- ld a, [hli] ; 23:5350
- push af ; 23:5351
- jr .okay ; 23:5352
+ ld hl, SPRITEANIMSTRUCT_DURATION
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr z, .next_frame ; finished the current sequence
+ dec [hl]
+ call .GetPointer ; load pointer from SpriteAnimFrameData
+ ld a, [hli]
+ push af
+ jr .okay
.next_frame
- ld hl, $a ; 23:5354
- add hl, bc ; 23:5357
- inc [hl] ; 23:5358
- call .GetPointer ; 23:5359
- ld a, [hli] ; 23:535c
- cp $fe ; 23:535d
- jr z, .restart ; 23:535f
- cp $ff ; 23:5361
- jr z, .repeat_last ; 23:5363
- push af ; 23:5365
- ld a, [hl] ; 23:5366
- push hl ; 23:5367
- and $3f ; 23:5368
- ld hl, $9 ; 23:536a
- add hl, bc ; 23:536d
- add [hl] ; 23:536e
- ld hl, $8 ; 23:536f
- add hl, bc ; 23:5372
- ld [hl], a ; 23:5373
- pop hl ; 23:5374
+ ld hl, SPRITEANIMSTRUCT_FRAME
+ add hl, bc
+ inc [hl]
+ call .GetPointer ; load pointer from SpriteAnimFrameData
+ ld a, [hli]
+ cp dorestart_command
+ jr z, .restart
+ cp endanim_command
+ jr z, .repeat_last
+
+ push af
+ ld a, [hl]
+ push hl
+ and $ff ^ (Y_FLIP << 1 | X_FLIP << 1)
+ ld hl, SPRITEANIMSTRUCT_DURATIONOFFSET
+ add hl, bc
+ add [hl]
+ ld hl, SPRITEANIMSTRUCT_DURATION
+ add hl, bc
+ ld [hl], a
+ pop hl
.okay
- ld a, [hl] ; 23:5375
- and $c0 ; 23:5376
- srl a ; 23:5378
- ld [$c5c0], a ; 23:537a
- pop af ; 23:537d
- ret ; 23:537e
-
-.repeat_last ; 8d37f
- xor a ; 23:537f
- ld hl, $8 ; 23:5380
- add hl, bc ; 23:5383
- ld [hl], a ; 23:5384
- ld hl, $a ; 23:5385
- add hl, bc ; 23:5388
- dec [hl] ; 23:5389
- dec [hl] ; 23:538a
- jr .loop ; 23:538b
+ ld a, [hl]
+ and Y_FLIP << 1 | X_FLIP << 1 ; The << 1 is compensated in the "frame" macro
+ srl a
+ ld [wCurSpriteOAMFlags], a
+ pop af
+ ret
+
+.repeat_last
+ xor a
+ ld hl, SPRITEANIMSTRUCT_DURATION
+ add hl, bc
+ ld [hl], a
+
+ ld hl, SPRITEANIMSTRUCT_FRAME
+ add hl, bc
+ dec [hl]
+ dec [hl]
+ jr .loop
.restart
- xor a ; 23:538d
- ld hl, $8 ; 23:538e
- add hl, bc ; 23:5391
- ld [hl], a ; 23:5392
- dec a ; 23:5393
- ld hl, $a ; 23:5394
- add hl, bc ; 23:5397
- ld [hl], a ; 23:5398
- jr .loop ; 23:5399
-
-.GetPointer
- ld hl, $1 ; 23:539b
- add hl, bc ; 23:539e
- ld e, [hl] ; 23:539f
- ld d, $0 ; 23:53a0
- ld hl, AnimatedObjectFrameData ; 23:53a2
- add hl, de ; 23:53a5
- add hl, de ; 23:53a6
- ld e, [hl] ; 23:53a7
- inc hl ; 23:53a8
- ld d, [hl] ; 23:53a9
- ld hl, $a ; 23:53aa
- add hl, bc ; 23:53ad
- ld l, [hl] ; 23:53ae
- ld h, $0 ; 23:53af
- add hl, hl ; 23:53b1
- add hl, de ; 23:53b2
- ret ; 23:53b3
-
-GetFrameOAMPointer: ; 8d3b4
- ld e, a ; 23:53b4
- ld d, $0 ; 23:53b5
- ld hl, AnimatedObjectOAMData ; 23:53b7
- add hl, de ; 23:53ba
- add hl, de ; 23:53bb
- add hl, de ; 23:53bc
- ret ; 23:53bd
-
-BrokenGetStdGraphics: ; 8d3be
- push hl ; 23:53be
- ld l, a ; 23:53bf
- ld h, $0 ; 23:53c0
- add hl, hl ; 23:53c2
- add hl, hl ; 23:53c3
- ld de, $6666 ; 23:53c4
- add hl, de ; 23:53c7
- ld c, [hl] ; 23:53c8
- inc hl ; 23:53c9
- ld b, [hl] ; 23:53ca
- inc hl ; 23:53cb
- ld e, [hl] ; 23:53cc
- inc hl ; 23:53cd
- ld d, [hl] ; 23:53ce
- pop hl ; 23:53cf
- push bc ; 23:53d0
- call $dfe ; Request2bpp ; 23:53d1
- pop bc ; 23:53d4
- ret ; 23:53d5
-
-AnimatedObjectSeqData: ; 8d3d6
- db $01, $01, $00
- db $04, $04, $00
- db $05, $05, $00
- db $06, $06, $00
- db $07, $07, $00
- db $08, $08, $00
- db $09, $09, $01
- db $0a, $09, $01
- db $0b, $0a, $01
- db $0d, $0b, $01
- db $10, $0c, $01
- db $12, $0d, $02
- db $13, $0e, $02
- db $14, $0f, $02
- db $15, $0e, $02
- db $16, $10, $00
- db $0d, $11, $01
- db $10, $12, $01
- db $09, $13, $01
- db $0b, $14, $01
- db $1a, $15, $05
- db $1c, $16, $06
- db $1d, $17, $06
- db $1e, $18, $06
- db $1f, $19, $07
- db $20, $1a, $07
- db $22, $1b, $07
- db $1a, $1c, $05
- db $23, $00, $00
- db $24, $1d, $08
- db $24, $1e, $08
- db $24, $1f, $08
- db $25, $20, $00
- db $27, $00, $00
- db $28, $21, $00
- db $29, $22, $00
- db $2a, $22, $00
- db $2b, $23, $00
- db $2c, $24, $00
- db $2d, $00, $00
- db $2f, $25, $00
- db $30, $00, $00
- db $2f, $27, $00
- db $31, $00, $00
- db $36, $29, $00
- db $37, $00, $00
- db $32, $23, $00
-
-INCLUDE "engine/sprite_anims.asm"
-INCLUDE "data/sprite_engine.asm"
+ xor a
+ ld hl, SPRITEANIMSTRUCT_DURATION
+ add hl, bc
+ ld [hl], a
+
+ dec a
+ ld hl, SPRITEANIMSTRUCT_FRAME
+ add hl, bc
+ ld [hl], a
+ jr .loop
+
+.GetPointer:
+ ; Get the data for the current frame for the current animation sequence
+
+ ; SpriteAnimFrameData[SpriteAnim[SPRITEANIMSTRUCT_FRAMESET_ID]][SpriteAnim[SPRITEANIMSTRUCT_FRAME]]
+ ld hl, SPRITEANIMSTRUCT_FRAMESET_ID
+ add hl, bc
+ ld e, [hl]
+ ld d, 0
+ ld hl, SpriteAnimFrameData
+ add hl, de
+ add hl, de
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld hl, SPRITEANIMSTRUCT_FRAME
+ add hl, bc
+ ld l, [hl]
+ ld h, 0
+ add hl, hl
+ add hl, de
+ ret
+
+GetFrameOAMPointer:
+; Load OAM data pointer
+ ld e, a
+ ld d, 0
+ ld hl, SpriteAnimOAMData
+ add hl, de
+ add hl, de
+ add hl, de
+ ret
+
+Unreferenced_BrokenGetStdGraphics:
+ push hl
+ ld l, a
+ ld h, 0
+ add hl, hl
+ add hl, hl
+ ld de, BrokenStdGFXPointers ; broken 2bpp pointers
+ add hl, de
+ ld c, [hl]
+ inc hl
+ ld b, [hl]
+ inc hl
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ pop hl
+ push bc
+ call Request2bpp
+ pop bc
+ ret
+
+INCLUDE "data/sprite_anims/sequences.asm"
+
+INCLUDE "engine/gfx/sprite_anims.asm"
+
+INCLUDE "data/sprite_anims/framesets.asm"
+
+INCLUDE "data/sprite_anims/oam.asm"
+
+BrokenStdGFXPointers:
+ ; tile count, bank, pointer
+ ; (all pointers were dummied out to .deleted)
+ dbbw 128, $01, .deleted
+ dbbw 128, $01, .deleted
+ dbbw 128, $01, .deleted
+ dbbw 128, $01, .deleted
+ dbbw 16, $37, .deleted
+ dbbw 16, $11, .deleted
+ dbbw 16, $39, .deleted
+ dbbw 16, $24, .deleted
+ dbbw 16, $21, .deleted
+
+.deleted
Sprites_Cosine:
- add a, $10 ; 23:668a
+; a = d * cos(a * pi/32)
+ add %010000 ; cos(x) = sin(x + pi/2)
+ ; fallthrough
Sprites_Sine:
- and $3f ; 23:668c
- cp $20 ; 23:668e
- jr nc, .negative ; 23:6690
- call .ApplySineWave ; 23:6692
- ld a, h ; 23:6695
- ret ; 23:6696
-
-.negative
- and $1f ; 23:6697
- call .ApplySineWave ; 23:6699
- ld a, h ; 23:669c
- xor $ff ; 23:669d
- inc a ; 23:669f
- ret ; 23:66a0
-
-.ApplySineWave:
- ld e, a ; 23:66a1
- ld a, d ; 23:66a2
- ld d, $0 ; 23:66a3
- ld hl, .sinewave ; 23:66a5
- add hl, de ; 23:66a8
- add hl, de ; 23:66a9
- ld e, [hl] ; 23:66aa
- inc hl ; 23:66ab
- ld d, [hl] ; 23:66ac
- ld hl, $0 ; 23:66ad
-.multiply
- srl a ; 23:66b0
- jr nc, .even ; 23:66b2
- add hl, de ; 23:66b4
-.even
- sla e ; 23:66b5
- rl d ; 23:66b7
- and a ; 23:66b9
- jr nz, .multiply ; 23:66ba
- ret ; 23:66bc
-
-.sinewave ; 8e75d
- sine_wave $100
+; a = d * sin(a * pi/32)
+ calc_sine_wave .SineWave
+
+.SineWave:
+ sine_table 256
AnimateEndOfExpBar:
- ldh a, [$ffe9] ; 23:66fd
- ld de, EndOfExpBarGFX ; 23:66ff
- and a ; 23:6702
- jr z, .got_gfx ; 23:6703
- ld de, SGBEndOfExpBarGFX ; 23:6705
-.got_gfx
- ld hl, VTiles0 tile $00 ; 23:6708
- lb bc, BANK(EndOfExpBarGFX), 1 ; 23:670b
- call $dfe ; Request2bpp ; 23:670e
- ld c, $8 ; 23:6711
- ld d, $0 ; 23:6713
+ ldh a, [hSGB]
+ ld de, EndOfExpBarGFX
+ and a
+ jr z, .load
+ ld de, SGBEndOfExpBarGFX
+
+.load
+ ld hl, vTiles0 tile $00
+ lb bc, BANK(EndOfExpBarGFX), 1
+ call Request2bpp
+ ld c, 8
+ ld d, 0
.loop
- push bc ; 23:6715
- call .AnimateFrame ; 23:6716
- call $32e ; DelayFrame ; 23:6719
- pop bc ; 23:671c
- inc d ; 23:671d
- inc d ; 23:671e
- dec c ; 23:671f
- jr nz, .loop ; 23:6720
- call $30ff ; ClearSprites ; 23:6722
- ret ; 23:6725
-
-.AnimateFrame
- ld hl, $c300 ; 23:6726
- ld c, $8 ; 23:6729
+ push bc
+ call .AnimateFrame
+ call DelayFrame
+ pop bc
+ inc d
+ inc d
+ dec c
+ jr nz, .loop
+ call ClearSprites
+ ret
+
+.AnimateFrame:
+ ld hl, wVirtualOAMSprite00
+ ld c, 8 ; number of animated circles
.anim_loop
- ld a, c ; 23:672b
- and a ; 23:672c
- ret z ; 23:672d
- dec c ; 23:672e
- ld a, c ; 23:672f
- sla a ; 23:6730
- sla a ; 23:6732
- sla a ; 23:6734
- push af ; 23:6736
- push de ; 23:6737
- push hl ; 23:6738
- call Sprites_Sine ; 23:6739
- pop hl ; 23:673c
- pop de ; 23:673d
- add a, $68 ; 23:673e
- ld [hli], a ; 23:6740
- pop af ; 23:6741
- push de ; 23:6742
- push hl ; 23:6743
- call Sprites_Cosine ; 23:6744
- pop hl ; 23:6747
- pop de ; 23:6748
- add a, $54 ; 23:6749
- ld [hli], a ; 23:674b
- ld a, $0 ; 23:674c
- ld [hli], a ; 23:674e
- ld a, $6 ; 23:674f
- ld [hli], a ; 23:6751
- jr .anim_loop ; 23:6752
+ ld a, c
+ and a
+ ret z
+ dec c
+ ld a, c
+; multiply by 8
+ sla a
+ sla a
+ sla a
+ push af
+
+ push de
+ push hl
+ call Sprites_Sine
+ pop hl
+ pop de
+ add 13 * TILE_WIDTH
+ ld [hli], a ; y
+
+ pop af
+ push de
+ push hl
+ call Sprites_Cosine
+ pop hl
+ pop de
+ add 10 * TILE_WIDTH + 4
+ ld [hli], a ; x
+
+ ld a, $0
+ ld [hli], a ; tile id
+ ld a, PAL_BATTLE_OB_BLUE
+ ld [hli], a ; attributes
+ jr .anim_loop
EndOfExpBarGFX:
- dr $8e754, $8e764
-
+INCBIN "gfx/battle/expbarend.2bpp"
SGBEndOfExpBarGFX:
- dr $8e764, $8e774
-
-ClearAnimatedObjects2
- push hl ; 23:6774
- push de ; 23:6775
- push bc ; 23:6776
- push af ; 23:6777
- ld hl, $c508 ; 23:6778
- ld bc, $c1 ; 23:677b
+INCBIN "gfx/battle/expbarend_sgb.2bpp"
+
+ClearSpriteAnims2:
+ push hl
+ push de
+ push bc
+ push af
+ ld hl, wSpriteAnimDict
+ ld bc, wSpriteAnimsEnd - wSpriteAnimDict
.loop
- ld [hl], $0 ; 23:677e
- inc hl ; 23:6780
- dec bc ; 23:6781
- ld a, c ; 23:6782
- or b ; 23:6783
- jr nz, .loop ; 23:6784
- pop af ; 23:6786
- pop bc ; 23:6787
- pop de ; 23:6788
- pop hl ; 23:6789
- ret ; 23:678a
-; 8e78a
+ ld [hl], 0
+ inc hl
+ dec bc
+ ld a, c
+ or b
+ jr nz, .loop
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ret
diff --git a/engine/menus/delete_save.asm b/engine/menus/delete_save.asm
new file mode 100755
index 00000000..a3ea661d
--- /dev/null
+++ b/engine/menus/delete_save.asm
@@ -0,0 +1,34 @@
+_DeleteSaveData:
+ call ClearTilemap
+ call GetMemSGBLayout
+ call LoadStandardFont
+ call LoadFontsExtra
+ ld de, MUSIC_MAIN_MENU
+ call PlayMusic
+ ld hl, .ClearAllSaveDataText
+ call PrintText
+ ld hl, .NoYesMenuHeader
+ call CopyMenuHeader
+ call VerticalMenu
+ ret c
+ ld a, [wMenuCursorY]
+ cp 1
+ ret z
+ farcall EmptyAllSRAMBanks
+ ret
+
+.ClearAllSaveDataText:
+ text_far _ClearAllSaveDataText
+ text_end
+
+.NoYesMenuHeader:
+ db 0 ; flags
+ menu_coords 14, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
+ dw .MenuData
+ db 1 ; default option
+
+.MenuData:
+ db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags
+ db 2 ; items
+ db "NO@"
+ db "YES@"
diff --git a/engine/menus/savemenu_copytilemapatonce.asm b/engine/menus/savemenu_copytilemapatonce.asm
new file mode 100755
index 00000000..4b567a58
--- /dev/null
+++ b/engine/menus/savemenu_copytilemapatonce.asm
@@ -0,0 +1,84 @@
+SaveMenu_CopyTilemapAtOnce:
+ ldh a, [hCGB]
+ and a
+ jp z, WaitBGMap
+
+; The following is a modified version of CopyTilemapAtOnce
+; that waits for [rLY] to be $60 instead of $80 - 1.
+ ldh a, [hBGMapMode]
+ push af
+ xor a
+ ldh [hBGMapMode], a
+
+ ldh a, [hMapAnims]
+ push af
+ xor a
+ ldh [hMapAnims], a
+
+.wait
+ ldh a, [rLY]
+ cp $60
+ jr c, .wait
+
+ di
+ ld a, BANK(vBGMap2)
+ ldh [rVBK], a
+ hlcoord 0, 0, wAttrmap
+ call .CopyBGMapViaStack
+ ld a, BANK(vBGMap0)
+ ldh [rVBK], a
+ hlcoord 0, 0
+ call .CopyBGMapViaStack
+
+.wait2
+ ldh a, [rLY]
+ cp $60
+ jr c, .wait2
+ ei
+
+ pop af
+ ldh [hMapAnims], a
+ pop af
+ ldh [hBGMapMode], a
+ ret
+
+.CopyBGMapViaStack:
+; Copy all tiles to vBGMap
+ ld [hSPBuffer], sp
+ ld sp, hl
+ ldh a, [hBGMapAddress + 1]
+ ld h, a
+ ld l, 0
+ ld a, SCREEN_HEIGHT
+ ldh [hTilesPerCycle], a
+ ld b, 1 << 1 ; not in v/hblank
+ ld c, LOW(rSTAT)
+
+.loop
+rept SCREEN_WIDTH / 2
+ pop de
+; if in v/hblank, wait until not in v/hblank
+.loop\@
+ ldh a, [c]
+ and b
+ jr nz, .loop\@
+; load vBGMap
+ ld [hl], e
+ inc l
+ ld [hl], d
+ inc l
+endr
+
+ ld de, BG_MAP_WIDTH - SCREEN_WIDTH
+ add hl, de
+ ldh a, [hTilesPerCycle]
+ dec a
+ ldh [hTilesPerCycle], a
+ jr nz, .loop
+
+ ldh a, [hSPBuffer]
+ ld l, a
+ ldh a, [hSPBuffer + 1]
+ ld h, a
+ ld sp, hl
+ ret
diff --git a/engine/movie/init_hof_credits.asm b/engine/movie/init_hof_credits.asm
new file mode 100755
index 00000000..70a9b6e7
--- /dev/null
+++ b/engine/movie/init_hof_credits.asm
@@ -0,0 +1,60 @@
+InitDisplayForHallOfFame:
+ call ClearBGPalettes
+ call ClearTilemap
+ call ClearSprites
+ call DisableLCD
+ call LoadStandardFont
+ call LoadFontsBattleExtra
+ hlbgcoord 0, 0
+ ld bc, vBGMap1 - vBGMap0
+ ld a, " "
+ call ByteFill
+ hlcoord 0, 0, wAttrmap
+ ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
+ xor a
+ call ByteFill
+ xor a
+ ldh [hSCY], a
+ ldh [hSCX], a
+ call EnableLCD
+ ld hl, .SavingRecordText
+ call PrintText
+ call WaitBGMap2
+ call SetPalettes
+ ret
+
+.SavingRecordText:
+ text_far _SavingRecordText
+ text_end
+
+InitDisplayForRedCredits:
+ call ClearBGPalettes
+ call ClearTilemap
+ call ClearSprites
+ call DisableLCD
+ call LoadStandardFont
+ call LoadFontsBattleExtra
+ hlbgcoord 0, 0
+ ld bc, vBGMap1 - vBGMap0
+ ld a, " "
+ call ByteFill
+ hlcoord 0, 0, wAttrmap
+ ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
+ xor a
+ call ByteFill
+ ld hl, wBGPals1
+ ld c, 4 tiles
+.load_white_palettes
+ ld a, LOW(PALRGB_WHITE)
+ ld [hli], a
+ ld a, HIGH(PALRGB_WHITE)
+ ld [hli], a
+ dec c
+ jr nz, .load_white_palettes
+ xor a
+ ldh [hSCY], a
+ ldh [hSCX], a
+ call EnableLCD
+ call WaitBGMap2
+ call SetPalettes
+ ret
diff --git a/engine/phone/phonering_copytilemapatonce.asm b/engine/phone/phonering_copytilemapatonce.asm
new file mode 100755
index 00000000..6ce141b5
--- /dev/null
+++ b/engine/phone/phonering_copytilemapatonce.asm
@@ -0,0 +1,87 @@
+PhoneRing_CopyTilemapAtOnce:
+ ldh a, [hCGB]
+ and a
+ jp z, WaitBGMap
+ ld a, [wSpriteUpdatesEnabled]
+ cp $0
+ jp z, WaitBGMap
+
+; The following is a modified version of CopyTilemapAtOnce
+; that waits for [rLY] to be LY_VBLANK - 1 instead of $80 - 1.
+ ldh a, [hBGMapMode]
+ push af
+ xor a
+ ldh [hBGMapMode], a
+
+ ldh a, [hMapAnims]
+ push af
+ xor a
+ ldh [hMapAnims], a
+
+.wait
+ ldh a, [rLY]
+ cp LY_VBLANK - 1
+ jr c, .wait
+
+ di
+ ld a, BANK(vBGMap2)
+ ldh [rVBK], a
+ hlcoord 0, 0, wAttrmap
+ call .CopyBGMapViaStack
+ ld a, BANK(vBGMap0)
+ ldh [rVBK], a
+ hlcoord 0, 0
+ call .CopyBGMapViaStack
+
+.wait2
+ ldh a, [rLY]
+ cp LY_VBLANK - 1
+ jr c, .wait2
+ ei
+
+ pop af
+ ldh [hMapAnims], a
+ pop af
+ ldh [hBGMapMode], a
+ ret
+
+.CopyBGMapViaStack:
+; Copy all tiles to vBGMap
+ ld [hSPBuffer], sp
+ ld sp, hl
+ ldh a, [hBGMapAddress + 1]
+ ld h, a
+ ld l, 0
+ ld a, SCREEN_HEIGHT
+ ldh [hTilesPerCycle], a
+ ld b, 1 << 1 ; not in v/hblank
+ ld c, LOW(rSTAT)
+
+.loop
+rept SCREEN_WIDTH / 2
+ pop de
+; if in v/hblank, wait until not in v/hblank
+.loop\@
+ ldh a, [c]
+ and b
+ jr nz, .loop\@
+; load vBGMap
+ ld [hl], e
+ inc l
+ ld [hl], d
+ inc l
+endr
+
+ ld de, BG_MAP_WIDTH - SCREEN_WIDTH
+ add hl, de
+ ldh a, [hTilesPerCycle]
+ dec a
+ ldh [hTilesPerCycle], a
+ jr nz, .loop
+
+ ldh a, [hSPBuffer]
+ ld l, a
+ ldh a, [hSPBuffer + 1]
+ ld h, a
+ ld sp, hl
+ ret
diff --git a/engine/rtc/reset_password.asm b/engine/rtc/reset_password.asm
new file mode 100755
index 00000000..b935d747
--- /dev/null
+++ b/engine/rtc/reset_password.asm
@@ -0,0 +1,254 @@
+_ResetClock:
+ call ClearTilemap
+ call GetMemSGBLayout
+ call LoadStandardFont
+ call LoadFontsExtra
+ ld de, MUSIC_MAIN_MENU
+ call PlayMusic
+ ld hl, .PasswordAskResetClockText
+ call PrintText
+ ld hl, .NoYes_MenuHeader
+ call CopyMenuHeader
+ call VerticalMenu
+ ret c
+ ld a, [wMenuCursorY]
+ cp 1
+ ret z
+ call ClockResetPassword
+ jr c, .wrongpassword
+ ld a, BANK(sRTCStatusFlags)
+ call OpenSRAM
+ ld a, $80
+ ld [sRTCStatusFlags], a
+ call CloseSRAM
+ ld hl, .PasswordAskResetText
+ call PrintText
+ ret
+
+.wrongpassword
+ ld hl, .PasswordWrongText
+ call PrintText
+ ret
+
+.PasswordAskResetText:
+ text_far _PasswordAskResetText
+ text_end
+
+.PasswordWrongText:
+ text_far _PasswordWrongText
+ text_end
+
+.PasswordAskResetClockText:
+ text_far _PasswordAskResetClockText
+ text_end
+
+.NoYes_MenuHeader:
+ db 0 ; flags
+ menu_coords 14, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1
+ dw .NoYes_MenuData
+ db 1 ; default option
+
+.NoYes_MenuData:
+ db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags
+ db 2 ; items
+ db "NO@"
+ db "YES@"
+
+ClockResetPassword:
+ call .CalculatePassword
+ push de
+ ld hl, wStringBuffer2
+ ld bc, 5
+ xor a
+ call ByteFill
+ ld a, 4
+ ld [wStringBuffer2 + 5], a
+ ld hl, .PasswordAskEnterText
+ call PrintText
+.loop
+ call .updateIDdisplay
+.loop2
+ call JoyTextDelay
+ ldh a, [hJoyLast]
+ ld b, a
+ and A_BUTTON
+ jr nz, .confirm
+ ld a, b
+ and D_PAD
+ jr z, .loop2
+ call .dpadinput
+ ld c, 3
+ call DelayFrames
+ jr .loop
+
+.confirm
+ call .ConvertDecIDToBytes
+ pop de
+ ld a, e
+ cp l
+ jr nz, .nope
+ ld a, d
+ cp h
+ jr nz, .nope
+ and a
+ ret
+
+.nope
+ scf
+ ret
+
+.PasswordAskEnterText:
+ text_far _PasswordAskEnterText
+ text_end
+
+.updateIDdisplay
+ hlcoord 14, 15
+ ld de, wStringBuffer2
+ ld c, 5
+.loop3
+ ld a, [de]
+ add "0"
+ ld [hli], a
+ inc de
+ dec c
+ jr nz, .loop3
+ hlcoord 14, 16
+ ld bc, 5
+ ld a, " "
+ call ByteFill
+ hlcoord 14, 16
+ ld a, [wStringBuffer2 + 5]
+ ld e, a
+ ld d, 0
+ add hl, de
+ ld [hl], "▲"
+ ret
+
+.dpadinput
+ ld a, b
+ and D_LEFT
+ jr nz, .left
+ ld a, b
+ and D_RIGHT
+ jr nz, .right
+ ld a, b
+ and D_UP
+ jr nz, .up
+ ld a, b
+ and D_DOWN
+ jr nz, .down
+ ret
+
+.left
+ ld a, [wStringBuffer2 + 5]
+ and a
+ ret z
+ dec a
+ ld [wStringBuffer2 + 5], a
+ ret
+
+.right
+ ld a, [wStringBuffer2 + 5]
+ cp 4
+ ret z
+ inc a
+ ld [wStringBuffer2 + 5], a
+ ret
+
+.up
+ call .getcurrentdigit
+ ld a, [hl]
+ cp 9
+ jr z, .wraparound_up
+ inc a
+ ld [hl], a
+ ret
+
+.wraparound_up
+ ld [hl], 0
+ ret
+
+.down
+ call .getcurrentdigit
+ ld a, [hl]
+ and a
+ jr z, .wraparound_down
+ dec a
+ ld [hl], a
+ ret
+
+.wraparound_down
+ ld [hl], 9
+ ret
+
+.getcurrentdigit
+ ld a, [wStringBuffer2 + 5]
+ ld e, a
+ ld d, $0
+ ld hl, wStringBuffer2
+ add hl, de
+ ret
+
+.ConvertDecIDToBytes:
+ ld hl, 0
+ ld de, wStringBuffer2 + 4
+ ld bc, 1
+ call .ConvertToBytes
+ ld bc, 10
+ call .ConvertToBytes
+ ld bc, 100
+ call .ConvertToBytes
+ ld bc, 1000
+ call .ConvertToBytes
+ ld bc, 10000
+.ConvertToBytes:
+ ld a, [de]
+ dec de
+ push hl
+ ld hl, 0
+ call AddNTimes
+ ld c, l
+ ld b, h
+ pop hl
+ add hl, bc
+ ret
+
+.CalculatePassword:
+ ld a, BANK(sPlayerData)
+ call OpenSRAM
+ ld de, 0
+ ld hl, sPlayerData + (wPlayerID - wPlayerData)
+ ld c, 2
+ call .ComponentFromNumber
+ ld hl, sPlayerData + (wPlayerName - wPlayerData)
+ ld c, NAME_LENGTH_JAPANESE - 1
+ call .ComponentFromString
+ ld hl, sPlayerData + (wMoney - wPlayerData)
+ ld c, 3
+ call .ComponentFromNumber
+ call CloseSRAM
+ ret
+
+.ComponentFromNumber:
+ ld a, [hli]
+ add e
+ ld e, a
+ ld a, 0
+ adc d
+ ld d, a
+ dec c
+ jr nz, .ComponentFromNumber
+ ret
+
+.ComponentFromString:
+ ld a, [hli]
+ cp "@"
+ ret z
+ add e
+ ld e, a
+ ld a, 0
+ adc d
+ ld d, a
+ dec c
+ jr nz, .ComponentFromString
+ ret
diff --git a/engine/tilesets/timeofday_pals.asm b/engine/tilesets/timeofday_pals.asm
new file mode 100755
index 00000000..8a92484a
--- /dev/null
+++ b/engine/tilesets/timeofday_pals.asm
@@ -0,0 +1,317 @@
+DummyPredef35:
+DummyPredef36:
+ ret
+
+UpdateTimeOfDayPal::
+ call UpdateTime
+ ld a, [wTimeOfDay]
+ ld [wCurTimeOfDay], a
+ call GetTimePalette
+ ld [wTimeOfDayPal], a
+ ret
+
+_TimeOfDayPals::
+; return carry if pals are changed
+
+; forced pals?
+ ld hl, wTimeOfDayPalFlags
+ bit 7, [hl]
+ jr nz, .dontchange
+
+; do we need to bother updating?
+ ld a, [wTimeOfDay]
+ ld hl, wCurTimeOfDay
+ cp [hl]
+ jr z, .dontchange
+
+; if so, the time of day has changed
+ ld a, [wTimeOfDay]
+ ld [wCurTimeOfDay], a
+
+; get palette id
+ call GetTimePalette
+
+; same palette as before?
+ ld hl, wTimeOfDayPal
+ cp [hl]
+ jr z, .dontchange
+
+; update palette id
+ ld [wTimeOfDayPal], a
+
+; update sgb pals
+ ld b, SCGB_MAPPALS
+ call GetSGBLayout
+
+; update palettes
+ call _UpdateTimePals
+ call DelayFrame
+
+; successful change
+ scf
+ ret
+
+.dontchange
+; no change occurred
+ and a
+ ret
+
+_UpdateTimePals::
+ ld c, 9 ; normal
+ call GetTimePalFade
+ call DmgToCgbTimePals
+ ret
+
+FadeInPalettes::
+ ld c, 18
+ call GetTimePalFade
+ ld b, 4
+ call ConvertTimePalsDecHL
+ ret
+
+FadeOutPalettes::
+ call FillWhiteBGColor
+ ld c, 9
+ call GetTimePalFade
+ ld b, 4
+ call ConvertTimePalsIncHL
+ ret
+
+FadeInQuickly:
+ ld c, 0
+ call GetTimePalFade
+ ld b, 4
+ call ConvertTimePalsIncHL
+ ret
+
+FadeBlackQuickly:
+ ld c, 9
+ call GetTimePalFade
+ ld b, 4
+ call ConvertTimePalsDecHL
+ ret
+
+FillWhiteBGColor:
+ ld hl, wBGPals1
+ ld a, [hli]
+ ld e, a
+ ld a, [hli]
+ ld d, a
+ ld hl, wBGPals1 + 1 palettes
+ ld c, 6
+.loop
+ ld a, e
+ ld [hli], a
+ ld a, d
+ ld [hli], a
+rept 6
+ inc hl
+endr
+ dec c
+ jr nz, .loop
+ ret
+
+ReplaceTimeOfDayPals::
+ ld hl, .BrightnessLevels
+ ld a, [wMapTimeOfDay]
+ cp 4 ; Dark cave, needs Flash
+ jr z, .DarkCave
+ and 7
+ add l
+ ld l, a
+ ld a, 0
+ adc h
+ ld h, a
+ ld a, [hl]
+ ld [wTimeOfDayPalset], a
+ ret
+
+.DarkCave:
+ ld a, [wStatusFlags]
+ bit STATUSFLAGS_FLASH_F, a
+ jr nz, .UsedFlash
+ ld a, %11111111 ; 3, 3, 3, 3
+ ld [wTimeOfDayPalset], a
+ ret
+
+.UsedFlash:
+ ld a, %10101010 ; 2, 2, 2, 2
+ ld [wTimeOfDayPalset], a
+ ret
+
+.BrightnessLevels:
+ dc 3, 2, 1, 0
+ dc 1, 1, 1, 1
+ dc 2, 2, 2, 2
+ dc 0, 0, 0, 0
+ dc 3, 3, 3, 3
+ dc 3, 2, 1, 0
+ dc 3, 2, 1, 0
+ dc 3, 2, 1, 0
+
+GetTimePalette:
+ ld a, [wTimeOfDay]
+ ld e, a
+ ld d, 0
+ ld hl, .TimePalettes
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp hl
+
+.TimePalettes:
+ dw .MorningPalette
+ dw .DayPalette
+ dw .NitePalette
+ dw .DarknessPalette
+
+.MorningPalette:
+ ld a, [wTimeOfDayPalset]
+ and %00000011 ; 0
+ ret
+
+.DayPalette:
+ ld a, [wTimeOfDayPalset]
+ and %00001100 ; 1
+ srl a
+ srl a
+ ret
+
+.NitePalette:
+ ld a, [wTimeOfDayPalset]
+ and %00110000 ; 2
+ swap a
+ ret
+
+.DarknessPalette:
+ ld a, [wTimeOfDayPalset]
+ and %11000000 ; 3
+ rlca
+ rlca
+ ret
+
+DmgToCgbTimePals:
+ push hl
+ push de
+ ld a, [hli]
+ call DmgToCgbBGPals
+ ld a, [hli]
+ ld e, a
+ ld a, [hli]
+ ld d, a
+ call DmgToCgbObjPals
+ pop de
+ pop hl
+ ret
+
+ConvertTimePalsIncHL:
+.loop
+ call DmgToCgbTimePals
+ inc hl
+ inc hl
+ inc hl
+ ld c, 2
+ call DelayFrames
+ dec b
+ jr nz, .loop
+ ret
+
+ConvertTimePalsDecHL:
+.loop
+ call DmgToCgbTimePals
+ dec hl
+ dec hl
+ dec hl
+ ld c, 2
+ call DelayFrames
+ dec b
+ jr nz, .loop
+ ret
+
+GetTimePalFade:
+; check cgb
+ ldh a, [hCGB]
+ and a
+ jr nz, .cgb
+
+; else: dmg
+
+; index
+ ld a, [wTimeOfDayPal]
+ and %11
+
+; get fade table
+ push bc
+ ld c, a
+ ld b, 0
+ ld hl, .dmgfades
+ add hl, bc
+ add hl, bc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ pop bc
+
+; get place in fade table
+ ld b, 0
+ add hl, bc
+ ret
+
+.cgb
+ ld hl, .cgbfade
+ ld b, 0
+ add hl, bc
+ ret
+
+.dmgfades
+ dw .morn
+ dw .day
+ dw .nite
+ dw .darkness
+
+.morn
+ dc 3,3,3,3, 3,3,3,3, 3,3,3,3
+ dc 3,3,3,2, 3,3,3,2, 3,3,3,2
+ dc 3,3,2,1, 3,2,1,0, 3,2,1,0
+ dc 3,2,1,0, 3,1,0,0, 3,1,0,0
+ dc 2,1,0,0, 2,0,0,0, 2,0,0,0
+ dc 1,0,0,0, 1,0,0,0, 1,0,0,0
+ dc 0,0,0,0, 0,0,0,0, 0,0,0,0
+
+.day
+ dc 3,3,3,3, 3,3,3,3, 3,3,3,3
+ dc 3,3,3,2, 3,3,3,2, 3,3,3,2
+ dc 3,3,2,1, 3,2,1,0, 3,2,1,0
+ dc 3,2,1,0, 3,1,0,0, 3,1,0,0
+ dc 2,1,0,0, 2,0,0,0, 2,0,0,0
+ dc 1,0,0,0, 1,0,0,0, 1,0,0,0
+ dc 0,0,0,0, 0,0,0,0, 0,0,0,0
+
+.nite
+ dc 3,3,3,3, 3,3,3,3, 3,3,3,3
+ dc 3,3,3,2, 3,3,3,2, 3,3,3,2
+ dc 3,3,2,1, 3,2,1,0, 3,2,1,0
+ dc 3,2,2,1, 3,1,0,0, 3,1,0,0
+ dc 2,1,0,0, 2,0,0,0, 2,0,0,0
+ dc 1,0,0,0, 1,0,0,0, 1,0,0,0
+ dc 0,0,0,0, 0,0,0,0, 0,0,0,0
+
+.darkness
+ dc 3,3,3,3, 3,3,3,3, 3,3,3,3
+ dc 3,3,3,2, 3,3,3,2, 3,3,3,3
+ dc 3,3,3,2, 3,2,1,0, 3,3,3,3
+ dc 3,3,3,1, 3,1,0,0, 3,3,3,3
+ dc 3,3,3,1, 2,0,0,0, 3,3,3,3
+ dc 0,0,0,0, 1,0,0,0, 0,0,0,0
+ dc 0,0,0,0, 0,0,0,0, 0,0,0,0
+
+.cgbfade
+ dc 3,3,3,3, 3,3,3,3, 3,3,3,3
+ dc 3,3,3,2, 3,3,3,2, 3,3,3,2
+ dc 3,3,2,1, 3,3,2,1, 3,3,2,1
+ dc 3,2,1,0, 3,2,1,0, 3,2,1,0
+ dc 2,1,0,0, 2,1,0,0, 2,1,0,0
+ dc 1,0,0,0, 1,0,0,0, 1,0,0,0
+ dc 0,0,0,0, 0,0,0,0, 0,0,0,0
diff --git a/gfx/battle/expbarend.2bpp b/gfx/battle/expbarend.2bpp
new file mode 100755
index 00000000..24f32e15
--- /dev/null
+++ b/gfx/battle/expbarend.2bpp
Binary files differ
diff --git a/gfx/battle/expbarend.png b/gfx/battle/expbarend.png
new file mode 100755
index 00000000..51c0e720
--- /dev/null
+++ b/gfx/battle/expbarend.png
Binary files differ
diff --git a/gfx/battle/expbarend_sgb.2bpp b/gfx/battle/expbarend_sgb.2bpp
new file mode 100755
index 00000000..dbeb3fde
--- /dev/null
+++ b/gfx/battle/expbarend_sgb.2bpp
Binary files differ
diff --git a/gfx/battle/expbarend_sgb.png b/gfx/battle/expbarend_sgb.png
new file mode 100755
index 00000000..25eed4a6
--- /dev/null
+++ b/gfx/battle/expbarend_sgb.png
Binary files differ
diff --git a/gfx/icons.asm b/gfx/icons.asm
new file mode 100755
index 00000000..c664516f
--- /dev/null
+++ b/gfx/icons.asm
@@ -0,0 +1,41 @@
+Icons: ; used only for BANK(Icons)
+
+NullIcon:
+PoliwagIcon: INCBIN "gfx/icons/poliwag.2bpp"
+JigglypuffIcon: INCBIN "gfx/icons/jigglypuff.2bpp"
+DiglettIcon: INCBIN "gfx/icons/diglett.2bpp"
+PikachuIcon: INCBIN "gfx/icons/pikachu.2bpp"
+StaryuIcon: INCBIN "gfx/icons/staryu.2bpp"
+FishIcon: INCBIN "gfx/icons/fish.2bpp"
+BirdIcon: INCBIN "gfx/icons/bird.2bpp"
+MonsterIcon: INCBIN "gfx/icons/monster.2bpp"
+ClefairyIcon: INCBIN "gfx/icons/clefairy.2bpp"
+OddishIcon: INCBIN "gfx/icons/oddish.2bpp"
+BugIcon: INCBIN "gfx/icons/bug.2bpp"
+GhostIcon: INCBIN "gfx/icons/ghost.2bpp"
+LaprasIcon: INCBIN "gfx/icons/lapras.2bpp"
+HumanshapeIcon: INCBIN "gfx/icons/humanshape.2bpp"
+FoxIcon: INCBIN "gfx/icons/fox.2bpp"
+EquineIcon: INCBIN "gfx/icons/equine.2bpp"
+ShellIcon: INCBIN "gfx/icons/shell.2bpp"
+BlobIcon: INCBIN "gfx/icons/blob.2bpp"
+SerpentIcon: INCBIN "gfx/icons/serpent.2bpp"
+VoltorbIcon: INCBIN "gfx/icons/voltorb.2bpp"
+SquirtleIcon: INCBIN "gfx/icons/squirtle.2bpp"
+BulbasaurIcon: INCBIN "gfx/icons/bulbasaur.2bpp"
+CharmanderIcon: INCBIN "gfx/icons/charmander.2bpp"
+CaterpillarIcon: INCBIN "gfx/icons/caterpillar.2bpp"
+UnownIcon: INCBIN "gfx/icons/unown.2bpp"
+GeodudeIcon: INCBIN "gfx/icons/geodude.2bpp"
+FighterIcon: INCBIN "gfx/icons/fighter.2bpp"
+EggIcon: INCBIN "gfx/icons/egg.2bpp"
+JellyfishIcon: INCBIN "gfx/icons/jellyfish.2bpp"
+MothIcon: INCBIN "gfx/icons/moth.2bpp"
+BatIcon: INCBIN "gfx/icons/bat.2bpp"
+SnorlaxIcon: INCBIN "gfx/icons/snorlax.2bpp"
+HoOhIcon: INCBIN "gfx/icons/ho_oh.2bpp"
+LugiaIcon: INCBIN "gfx/icons/lugia.2bpp"
+GyaradosIcon: INCBIN "gfx/icons/gyarados.2bpp"
+SlowpokeIcon: INCBIN "gfx/icons/slowpoke.2bpp"
+SudowoodoIcon: INCBIN "gfx/icons/sudowoodo.2bpp"
+BigmonIcon: INCBIN "gfx/icons/bigmon.2bpp"
diff --git a/gfx/icons/bat.2bpp b/gfx/icons/bat.2bpp
new file mode 100755
index 00000000..0e5cd7d4
--- /dev/null
+++ b/gfx/icons/bat.2bpp
Binary files differ
diff --git a/gfx/icons/bat.png b/gfx/icons/bat.png
new file mode 100755
index 00000000..3ea2ea83
--- /dev/null
+++ b/gfx/icons/bat.png
Binary files differ
diff --git a/gfx/icons/bigmon.2bpp b/gfx/icons/bigmon.2bpp
new file mode 100755
index 00000000..6883bd80
--- /dev/null
+++ b/gfx/icons/bigmon.2bpp
Binary files differ
diff --git a/gfx/icons/bigmon.png b/gfx/icons/bigmon.png
new file mode 100755
index 00000000..4a77f1ec
--- /dev/null
+++ b/gfx/icons/bigmon.png
Binary files differ
diff --git a/gfx/icons/bird.2bpp b/gfx/icons/bird.2bpp
new file mode 100755
index 00000000..fb1793da
--- /dev/null
+++ b/gfx/icons/bird.2bpp
Binary files differ
diff --git a/gfx/icons/bird.png b/gfx/icons/bird.png
new file mode 100755
index 00000000..e13bc6cb
--- /dev/null
+++ b/gfx/icons/bird.png
Binary files differ
diff --git a/gfx/icons/blob.2bpp b/gfx/icons/blob.2bpp
new file mode 100755
index 00000000..a855f008
--- /dev/null
+++ b/gfx/icons/blob.2bpp
Binary files differ
diff --git a/gfx/icons/blob.png b/gfx/icons/blob.png
new file mode 100755
index 00000000..aef74ae6
--- /dev/null
+++ b/gfx/icons/blob.png
Binary files differ
diff --git a/gfx/icons/bug.2bpp b/gfx/icons/bug.2bpp
new file mode 100755
index 00000000..e57e4c80
--- /dev/null
+++ b/gfx/icons/bug.2bpp
Binary files differ
diff --git a/gfx/icons/bug.png b/gfx/icons/bug.png
new file mode 100755
index 00000000..97504f72
--- /dev/null
+++ b/gfx/icons/bug.png
Binary files differ
diff --git a/gfx/icons/bulbasaur.2bpp b/gfx/icons/bulbasaur.2bpp
new file mode 100755
index 00000000..56dd284c
--- /dev/null
+++ b/gfx/icons/bulbasaur.2bpp
Binary files differ
diff --git a/gfx/icons/bulbasaur.png b/gfx/icons/bulbasaur.png
new file mode 100755
index 00000000..1de6636f
--- /dev/null
+++ b/gfx/icons/bulbasaur.png
Binary files differ
diff --git a/gfx/icons/caterpillar.2bpp b/gfx/icons/caterpillar.2bpp
new file mode 100755
index 00000000..964b6a6a
--- /dev/null
+++ b/gfx/icons/caterpillar.2bpp
Binary files differ
diff --git a/gfx/icons/caterpillar.png b/gfx/icons/caterpillar.png
new file mode 100755
index 00000000..85558104
--- /dev/null
+++ b/gfx/icons/caterpillar.png
Binary files differ
diff --git a/gfx/icons/charmander.2bpp b/gfx/icons/charmander.2bpp
new file mode 100755
index 00000000..4e218263
--- /dev/null
+++ b/gfx/icons/charmander.2bpp
Binary files differ
diff --git a/gfx/icons/charmander.png b/gfx/icons/charmander.png
new file mode 100755
index 00000000..3d85f131
--- /dev/null
+++ b/gfx/icons/charmander.png
Binary files differ
diff --git a/gfx/icons/clefairy.2bpp b/gfx/icons/clefairy.2bpp
new file mode 100755
index 00000000..6a5aed32
--- /dev/null
+++ b/gfx/icons/clefairy.2bpp
Binary files differ
diff --git a/gfx/icons/clefairy.png b/gfx/icons/clefairy.png
new file mode 100755
index 00000000..0017d9dd
--- /dev/null
+++ b/gfx/icons/clefairy.png
Binary files differ
diff --git a/gfx/icons/diglett.2bpp b/gfx/icons/diglett.2bpp
new file mode 100755
index 00000000..6a997c1c
--- /dev/null
+++ b/gfx/icons/diglett.2bpp
Binary files differ
diff --git a/gfx/icons/diglett.png b/gfx/icons/diglett.png
new file mode 100755
index 00000000..307181f7
--- /dev/null
+++ b/gfx/icons/diglett.png
Binary files differ
diff --git a/gfx/icons/egg.2bpp b/gfx/icons/egg.2bpp
new file mode 100755
index 00000000..03a62377
--- /dev/null
+++ b/gfx/icons/egg.2bpp
Binary files differ
diff --git a/gfx/icons/egg.png b/gfx/icons/egg.png
new file mode 100755
index 00000000..129346fd
--- /dev/null
+++ b/gfx/icons/egg.png
Binary files differ
diff --git a/gfx/icons/equine.2bpp b/gfx/icons/equine.2bpp
new file mode 100755
index 00000000..8853b5bd
--- /dev/null
+++ b/gfx/icons/equine.2bpp
Binary files differ
diff --git a/gfx/icons/equine.png b/gfx/icons/equine.png
new file mode 100755
index 00000000..b3da7181
--- /dev/null
+++ b/gfx/icons/equine.png
Binary files differ
diff --git a/gfx/icons/fighter.2bpp b/gfx/icons/fighter.2bpp
new file mode 100755
index 00000000..671b7e8a
--- /dev/null
+++ b/gfx/icons/fighter.2bpp
Binary files differ
diff --git a/gfx/icons/fighter.png b/gfx/icons/fighter.png
new file mode 100755
index 00000000..9deab976
--- /dev/null
+++ b/gfx/icons/fighter.png
Binary files differ
diff --git a/gfx/icons/fish.2bpp b/gfx/icons/fish.2bpp
new file mode 100755
index 00000000..e99315b5
--- /dev/null
+++ b/gfx/icons/fish.2bpp
Binary files differ
diff --git a/gfx/icons/fish.png b/gfx/icons/fish.png
new file mode 100755
index 00000000..35dbb1d2
--- /dev/null
+++ b/gfx/icons/fish.png
Binary files differ
diff --git a/gfx/icons/fox.2bpp b/gfx/icons/fox.2bpp
new file mode 100755
index 00000000..bbe04c03
--- /dev/null
+++ b/gfx/icons/fox.2bpp
Binary files differ
diff --git a/gfx/icons/fox.png b/gfx/icons/fox.png
new file mode 100755
index 00000000..0419c87c
--- /dev/null
+++ b/gfx/icons/fox.png
Binary files differ
diff --git a/gfx/icons/geodude.2bpp b/gfx/icons/geodude.2bpp
new file mode 100755
index 00000000..ff8bdfde
--- /dev/null
+++ b/gfx/icons/geodude.2bpp
Binary files differ
diff --git a/gfx/icons/geodude.png b/gfx/icons/geodude.png
new file mode 100755
index 00000000..02db8771
--- /dev/null
+++ b/gfx/icons/geodude.png
Binary files differ
diff --git a/gfx/icons/ghost.2bpp b/gfx/icons/ghost.2bpp
new file mode 100755
index 00000000..d47e8b62
--- /dev/null
+++ b/gfx/icons/ghost.2bpp
Binary files differ
diff --git a/gfx/icons/ghost.png b/gfx/icons/ghost.png
new file mode 100755
index 00000000..7ecf8ed0
--- /dev/null
+++ b/gfx/icons/ghost.png
Binary files differ
diff --git a/gfx/icons/gyarados.2bpp b/gfx/icons/gyarados.2bpp
new file mode 100755
index 00000000..ffe536ad
--- /dev/null
+++ b/gfx/icons/gyarados.2bpp
Binary files differ
diff --git a/gfx/icons/gyarados.png b/gfx/icons/gyarados.png
new file mode 100755
index 00000000..fad5d8ae
--- /dev/null
+++ b/gfx/icons/gyarados.png
Binary files differ
diff --git a/gfx/icons/ho_oh.2bpp b/gfx/icons/ho_oh.2bpp
new file mode 100755
index 00000000..db4277a3
--- /dev/null
+++ b/gfx/icons/ho_oh.2bpp
Binary files differ
diff --git a/gfx/icons/ho_oh.png b/gfx/icons/ho_oh.png
new file mode 100755
index 00000000..6ee91781
--- /dev/null
+++ b/gfx/icons/ho_oh.png
Binary files differ
diff --git a/gfx/icons/humanshape.2bpp b/gfx/icons/humanshape.2bpp
new file mode 100755
index 00000000..4dbbac0c
--- /dev/null
+++ b/gfx/icons/humanshape.2bpp
Binary files differ
diff --git a/gfx/icons/humanshape.png b/gfx/icons/humanshape.png
new file mode 100755
index 00000000..f5d0b929
--- /dev/null
+++ b/gfx/icons/humanshape.png
Binary files differ
diff --git a/gfx/icons/item.2bpp b/gfx/icons/item.2bpp
new file mode 100755
index 00000000..5d47aba7
--- /dev/null
+++ b/gfx/icons/item.2bpp
@@ -0,0 +1 @@
+ \ No newline at end of file
diff --git a/gfx/icons/item.png b/gfx/icons/item.png
new file mode 100755
index 00000000..a47d5500
--- /dev/null
+++ b/gfx/icons/item.png
Binary files differ
diff --git a/gfx/icons/jellyfish.2bpp b/gfx/icons/jellyfish.2bpp
new file mode 100755
index 00000000..cfda6ecc
--- /dev/null
+++ b/gfx/icons/jellyfish.2bpp
Binary files differ
diff --git a/gfx/icons/jellyfish.png b/gfx/icons/jellyfish.png
new file mode 100755
index 00000000..8583d5cd
--- /dev/null
+++ b/gfx/icons/jellyfish.png
Binary files differ
diff --git a/gfx/icons/jigglypuff.2bpp b/gfx/icons/jigglypuff.2bpp
new file mode 100755
index 00000000..bc00c535
--- /dev/null
+++ b/gfx/icons/jigglypuff.2bpp
Binary files differ
diff --git a/gfx/icons/jigglypuff.png b/gfx/icons/jigglypuff.png
new file mode 100755
index 00000000..70f87b0d
--- /dev/null
+++ b/gfx/icons/jigglypuff.png
Binary files differ
diff --git a/gfx/icons/lapras.2bpp b/gfx/icons/lapras.2bpp
new file mode 100755
index 00000000..47684bae
--- /dev/null
+++ b/gfx/icons/lapras.2bpp
Binary files differ
diff --git a/gfx/icons/lapras.png b/gfx/icons/lapras.png
new file mode 100755
index 00000000..89ad063d
--- /dev/null
+++ b/gfx/icons/lapras.png
Binary files differ
diff --git a/gfx/icons/lugia.2bpp b/gfx/icons/lugia.2bpp
new file mode 100755
index 00000000..fc146754
--- /dev/null
+++ b/gfx/icons/lugia.2bpp
Binary files differ
diff --git a/gfx/icons/lugia.png b/gfx/icons/lugia.png
new file mode 100755
index 00000000..56dbf283
--- /dev/null
+++ b/gfx/icons/lugia.png
Binary files differ
diff --git a/gfx/icons/mail.2bpp b/gfx/icons/mail.2bpp
new file mode 100755
index 00000000..a04f4eff
--- /dev/null
+++ b/gfx/icons/mail.2bpp
@@ -0,0 +1 @@
+ \ No newline at end of file
diff --git a/gfx/icons/mail.png b/gfx/icons/mail.png
new file mode 100755
index 00000000..53db461e
--- /dev/null
+++ b/gfx/icons/mail.png
Binary files differ
diff --git a/gfx/icons/monster.2bpp b/gfx/icons/monster.2bpp
new file mode 100755
index 00000000..ce8863cd
--- /dev/null
+++ b/gfx/icons/monster.2bpp
Binary files differ
diff --git a/gfx/icons/monster.png b/gfx/icons/monster.png
new file mode 100755
index 00000000..f97c67b6
--- /dev/null
+++ b/gfx/icons/monster.png
Binary files differ
diff --git a/gfx/icons/moth.2bpp b/gfx/icons/moth.2bpp
new file mode 100755
index 00000000..96d5d42f
--- /dev/null
+++ b/gfx/icons/moth.2bpp
Binary files differ
diff --git a/gfx/icons/moth.png b/gfx/icons/moth.png
new file mode 100755
index 00000000..f44440f5
--- /dev/null
+++ b/gfx/icons/moth.png
Binary files differ
diff --git a/gfx/icons/oddish.2bpp b/gfx/icons/oddish.2bpp
new file mode 100755
index 00000000..c9c7665e
--- /dev/null
+++ b/gfx/icons/oddish.2bpp
Binary files differ
diff --git a/gfx/icons/oddish.png b/gfx/icons/oddish.png
new file mode 100755
index 00000000..c069bd44
--- /dev/null
+++ b/gfx/icons/oddish.png
Binary files differ
diff --git a/gfx/icons/pikachu.2bpp b/gfx/icons/pikachu.2bpp
new file mode 100755
index 00000000..ec73af11
--- /dev/null
+++ b/gfx/icons/pikachu.2bpp
Binary files differ
diff --git a/gfx/icons/pikachu.png b/gfx/icons/pikachu.png
new file mode 100755
index 00000000..7b7d23db
--- /dev/null
+++ b/gfx/icons/pikachu.png
Binary files differ
diff --git a/gfx/icons/poliwag.2bpp b/gfx/icons/poliwag.2bpp
new file mode 100755
index 00000000..3d3da674
--- /dev/null
+++ b/gfx/icons/poliwag.2bpp
Binary files differ
diff --git a/gfx/icons/poliwag.png b/gfx/icons/poliwag.png
new file mode 100755
index 00000000..b6b63a81
--- /dev/null
+++ b/gfx/icons/poliwag.png
Binary files differ
diff --git a/gfx/icons/serpent.2bpp b/gfx/icons/serpent.2bpp
new file mode 100755
index 00000000..4be1a62a
--- /dev/null
+++ b/gfx/icons/serpent.2bpp
Binary files differ
diff --git a/gfx/icons/serpent.png b/gfx/icons/serpent.png
new file mode 100755
index 00000000..de575f08
--- /dev/null
+++ b/gfx/icons/serpent.png
Binary files differ
diff --git a/gfx/icons/shell.2bpp b/gfx/icons/shell.2bpp
new file mode 100755
index 00000000..9e9dd787
--- /dev/null
+++ b/gfx/icons/shell.2bpp
Binary files differ
diff --git a/gfx/icons/shell.png b/gfx/icons/shell.png
new file mode 100755
index 00000000..4daf2763
--- /dev/null
+++ b/gfx/icons/shell.png
Binary files differ
diff --git a/gfx/icons/slowpoke.2bpp b/gfx/icons/slowpoke.2bpp
new file mode 100755
index 00000000..045980e5
--- /dev/null
+++ b/gfx/icons/slowpoke.2bpp
@@ -0,0 +1,2 @@
+88GP|c<+<#@O88|xx?  ? ? pp#?(?>1? ?'
+><< ? ? pp \ No newline at end of file
diff --git a/gfx/icons/slowpoke.png b/gfx/icons/slowpoke.png
new file mode 100755
index 00000000..221f3f7a
--- /dev/null
+++ b/gfx/icons/slowpoke.png
Binary files differ
diff --git a/gfx/icons/snorlax.2bpp b/gfx/icons/snorlax.2bpp
new file mode 100755
index 00000000..1adb5c84
--- /dev/null
+++ b/gfx/icons/snorlax.2bpp
Binary files differ
diff --git a/gfx/icons/snorlax.png b/gfx/icons/snorlax.png
new file mode 100755
index 00000000..f2c1b0b7
--- /dev/null
+++ b/gfx/icons/snorlax.png
Binary files differ
diff --git a/gfx/icons/squirtle.2bpp b/gfx/icons/squirtle.2bpp
new file mode 100755
index 00000000..b6558faa
--- /dev/null
+++ b/gfx/icons/squirtle.2bpp
Binary files differ
diff --git a/gfx/icons/squirtle.png b/gfx/icons/squirtle.png
new file mode 100755
index 00000000..614aa21b
--- /dev/null
+++ b/gfx/icons/squirtle.png
Binary files differ
diff --git a/gfx/icons/staryu.2bpp b/gfx/icons/staryu.2bpp
new file mode 100755
index 00000000..890cfe20
--- /dev/null
+++ b/gfx/icons/staryu.2bpp
Binary files differ
diff --git a/gfx/icons/staryu.png b/gfx/icons/staryu.png
new file mode 100755
index 00000000..52361c78
--- /dev/null
+++ b/gfx/icons/staryu.png
Binary files differ
diff --git a/gfx/icons/sudowoodo.2bpp b/gfx/icons/sudowoodo.2bpp
new file mode 100755
index 00000000..1c939093
--- /dev/null
+++ b/gfx/icons/sudowoodo.2bpp
Binary files differ
diff --git a/gfx/icons/sudowoodo.png b/gfx/icons/sudowoodo.png
new file mode 100755
index 00000000..d115356b
--- /dev/null
+++ b/gfx/icons/sudowoodo.png
Binary files differ
diff --git a/gfx/icons/unown.2bpp b/gfx/icons/unown.2bpp
new file mode 100755
index 00000000..b1cddd8b
--- /dev/null
+++ b/gfx/icons/unown.2bpp
Binary files differ
diff --git a/gfx/icons/unown.png b/gfx/icons/unown.png
new file mode 100755
index 00000000..0a4d0e42
--- /dev/null
+++ b/gfx/icons/unown.png
Binary files differ
diff --git a/gfx/icons/voltorb.2bpp b/gfx/icons/voltorb.2bpp
new file mode 100755
index 00000000..b75cafe3
--- /dev/null
+++ b/gfx/icons/voltorb.2bpp
Binary files differ
diff --git a/gfx/icons/voltorb.png b/gfx/icons/voltorb.png
new file mode 100755
index 00000000..ef289541
--- /dev/null
+++ b/gfx/icons/voltorb.png
Binary files differ
diff --git a/gfx/overworld/magnet_train_bg.tilemap b/gfx/overworld/magnet_train_bg.tilemap
new file mode 100755
index 00000000..3a70aecc
--- /dev/null
+++ b/gfx/overworld/magnet_train_bg.tilemap
@@ -0,0 +1 @@
+LM\]LM\]11 11LM\]LM\] \ No newline at end of file
diff --git a/gfx/overworld/magnet_train_fg.tilemap b/gfx/overworld/magnet_train_fg.tilemap
new file mode 100755
index 00000000..2f542683
--- /dev/null
+++ b/gfx/overworld/magnet_train_fg.tilemap
Binary files differ
diff --git a/gfx/overworld/trainer_battle_day.pal b/gfx/overworld/trainer_battle_day.pal
new file mode 100755
index 00000000..b7d67891
--- /dev/null
+++ b/gfx/overworld/trainer_battle_day.pal
@@ -0,0 +1,4 @@
+ RGB 31, 18, 29
+ RGB 31, 11, 15
+ RGB 31, 05, 05
+ RGB 07, 07, 07
diff --git a/gfx/overworld/trainer_battle_nite.pal b/gfx/overworld/trainer_battle_nite.pal
new file mode 100755
index 00000000..d1a35f33
--- /dev/null
+++ b/gfx/overworld/trainer_battle_nite.pal
@@ -0,0 +1,4 @@
+ RGB 31, 18, 29
+ RGB 31, 05, 05
+ RGB 31, 05, 05
+ RGB 31, 05, 05
diff --git a/gfx/overworld/trainer_battle_pokeball_tiles.2bpp b/gfx/overworld/trainer_battle_pokeball_tiles.2bpp
new file mode 100755
index 00000000..09e51fd6
--- /dev/null
+++ b/gfx/overworld/trainer_battle_pokeball_tiles.2bpp
@@ -0,0 +1 @@
+Áý \ No newline at end of file
diff --git a/gfx/overworld/trainer_battle_pokeball_tiles.png b/gfx/overworld/trainer_battle_pokeball_tiles.png
new file mode 100755
index 00000000..a4655d26
--- /dev/null
+++ b/gfx/overworld/trainer_battle_pokeball_tiles.png
Binary files differ
diff --git a/home/tilemap.asm b/home/tilemap.asm
index 176d5be2..fac8d372 100755
--- a/home/tilemap.asm
+++ b/home/tilemap.asm
@@ -70,22 +70,22 @@ CopyTilemapAtOnce::
.wait
ldh a, [rLY]
- cp $7f
+ cp $80 - 1
jr c, .wait
di
- ld a, BANK(vTiles3)
+ ld a, BANK(vBGMap2)
ldh [rVBK], a
hlcoord 0, 0, wAttrmap
- call .StackPointerMagic
- ld a, BANK(vTiles0)
+ call .CopyBGMapViaStack
+ ld a, BANK(vBGMap0)
ldh [rVBK], a
hlcoord 0, 0
- call .StackPointerMagic
+ call .CopyBGMapViaStack
.wait2
ldh a, [rLY]
- cp $7f
+ cp $80 - 1
jr c, .wait2
ei
@@ -95,7 +95,7 @@ CopyTilemapAtOnce::
ldh [hBGMapMode], a
ret
-.StackPointerMagic:
+.CopyBGMapViaStack:
; Copy all tiles to vBGMap
ld [hSPBuffer], sp
ld sp, hl
@@ -115,7 +115,7 @@ rept SCREEN_WIDTH / 2
ldh a, [c]
and b
jr nz, .loop\@
-; load BGMap0
+; load vBGMap
ld [hl], e
inc l
ld [hl], d
diff --git a/macros.asm b/macros.asm
index 30056c9d..e635a2b0 100644
--- a/macros.asm
+++ b/macros.asm
@@ -14,6 +14,7 @@ INCLUDE "macros/scripts/movement.asm"
INCLUDE "macros/scripts/battle_commands.asm"
INCLUDE "macros/scripts/battle_anims.asm"
INCLUDE "macros/scripts/trade_anims.asm"
+INCLUDE "macros/scripts/gfx_anims.asm"
; TODO: Should this be included or not?
; - Leave out for now so no code depending on legacy macros gets introduced
diff --git a/macros/scripts/gfx_anims.asm b/macros/scripts/gfx_anims.asm
new file mode 100755
index 00000000..a6241a0d
--- /dev/null
+++ b/macros/scripts/gfx_anims.asm
@@ -0,0 +1,53 @@
+; pic + oam animations
+
+frame: MACRO
+ db \1
+x = \2
+if _NARG > 2
+rept _NARG - 2
+x = x | (1 << (\3 + 1))
+ shift
+endr
+endc
+ db x
+ENDM
+
+ enum_start $fc
+
+ enum delanim_command ; $fc
+delanim: MACRO
+; Removes the object from the screen, as opposed to `endanim` which just stops all motion
+ db delanim_command
+ENDM
+
+ enum dowait_command ; $fd
+dowait: MACRO
+ db dowait_command
+ db \1 ; frames
+ENDM
+
+ enum dorestart_command ; $fe
+dorestart: MACRO
+ db dorestart_command
+ENDM
+
+ enum endanim_command ; $ff
+endanim: MACRO
+ db endanim_command
+ENDM
+
+
+; Used for pic animations
+__enum__ = $fd
+
+ enum dorepeat_command ; $fd
+dorepeat: MACRO
+ db dorepeat_command
+ db \1 ; command offset to jump to
+ENDM
+
+ enum setrepeat_command ; $fe
+setrepeat: MACRO
+ db setrepeat_command
+ db \1 ; amount of times to repeat
+ENDM
diff --git a/main.asm b/main.asm
index fca530a1..51170d3f 100644
--- a/main.asm
+++ b/main.asm
@@ -228,108 +228,17 @@ INCLUDE "engine/events/halloffame.asm"
SECTION "bank23", ROMX
-SaveMenu_CopyTilemapAtOnce::
- dr $8c000, $8c0b9
-PhoneRing_CopyTilemapAtOnce::
- dr $8c0b9, $8c17a
-_ResetClock::
- dr $8c17a, $8c310
-_DeleteSaveData::
- dr $8c310, $8c355
-DummyPredef35::
-DummyPredef36::
- ret
-UpdateTimeOfDayPal::
- dr $8c356, $8c366
-_TimeOfDayPals::
- dr $8c366, $8c397
-_UpdateTimePals::
- dr $8c397, $8c3a0
-FadeInPalettes::
- dr $8c3a0, $8c3ab
-FadeOutPalettes::
- dr $8c3ab, $8c3b9
-FadeInQuickly::
- dr $8c3b9, $8c3c4
-FadeBlackQuickly::
- dr $8c3c4, $8c3e9
-ReplaceTimeOfDayPals::
- dr $8c3e9, $8c513
-DoBattleTransition::
- dr $8c513, $8ca5e
-PlayWhirlpoolSound::
- dr $8ca5e, $8ca6b
-BlindingFlash::
- dr $8ca6b, $8ca8e
-ShakeHeadbuttTree::
- dr $8ca8e, $8cbb8
-OWCutAnimation::
- dr $8cbb8, $8cd65
-FlyFromAnim::
- dr $8cd65, $8cdab
-FlyToAnim::
- dr $8cdab, $8ce7c
-MagnetTrain::
- dr $8ce7c, $8d174
-
-ClearSpriteAnims::
- dr $8d174, $8d183
-PlaySpriteAnimationsAndDelayFrame::
- dr $8d183, $8d18a
-PlaySpriteAnimations::
- dr $8d18a, $8d1c9
-DoNextFrameForFirst16Sprites::
- dr $8d1c9, $8d1f7
-_InitSpriteAnimStruct::
- dr $8d1f7, $8d332
-
-_ReinitSpriteAnimFrame::
-IF DEF(_GOLD)
- dr $8d332, $8e6fd
-AnimateEndOfExpBar::
- dr $8e6fd, $8e774
-ClearSpriteAnims2::
- dr $8e774, $8e78b
-LoadOverworldMonIcon::
- dr $8e78b, $8e79f
-LoadMenuMonIcon::
- dr $8e79f, $8e88f
-GetSpeciesIcon::
- dr $8e88f, $8e8fb
-FreezeMonIcons::
- dr $8e8fb, $8e922
-UnfreezeMonIcons::
- dr $8e922, $8e93d
-HoldSwitchmonIcon::
- dr $8e93d, $8fdbe
-InitDisplayForHallOfFame::
- dr $8fdbe, $8fdff
-InitDisplayForRedCredits::
- dr $8fdff, $8fe43
-
-ELIF DEF(_SILVER)
- dr $8d332, $8e6e3
-AnimateEndOfExpBar::
- dr $8e6e3, $8e75a
-ClearSpriteAnims2::
- dr $8e75a, $8e771
-LoadOverworldMonIcon::
- dr $8e771, $8e785
-LoadMenuMonIcon::
- dr $8e785, $8e875
-GetSpeciesIcon::
- dr $8e875, $8e8e1
-FreezeMonIcons::
- dr $8e8e1, $8e908
-UnfreezeMonIcons::
- dr $8e908, $8e923
-HoldSwitchmonIcon::
- dr $8e923, $8fda4
-InitDisplayForHallOfFame::
- dr $8fda4, $8fde5
-InitDisplayForRedCredits::
- dr $8fde5, $8fe43
-ENDC
+INCLUDE "engine/menus/savemenu_copytilemapatonce.asm"
+INCLUDE "engine/phone/phonering_copytilemapatonce.asm"
+INCLUDE "engine/rtc/reset_password.asm"
+INCLUDE "engine/menus/delete_save.asm"
+INCLUDE "engine/tilesets/timeofday_pals.asm"
+INCLUDE "engine/battle/battle_transition.asm"
+INCLUDE "engine/events/field_moves.asm"
+INCLUDE "engine/events/magnet_train.asm"
+INCLUDE "engine/gfx/sprites.asm"
+INCLUDE "engine/gfx/mon_icons.asm"
+INCLUDE "engine/movie/init_hof_credits.asm"
SECTION "bank24", ROMX
@@ -422,7 +331,9 @@ INCBIN "gfx/font/font_inversed.1bpp"
SECTION "bank38", ROMX
+ret_e0000:
ret
+; unused
ret
_Diploma::
dr $e0002, $e0009
@@ -431,7 +342,9 @@ PlaceDiplomaOnScreen::
PrintDiplomaPage2::
dr $e00ae, $e081b
RotateUnownFrontpic::
- dr $e081b, $e0909
+ dr $e081b, $e0908
+ret_e0908::
+ ret
_CardFlip::
dr $e0909, $e199d
@@ -439,7 +352,9 @@ _UnownPuzzle::
dr $e199d, $e2668
_DummyGame::
- dr $e2668, $e2b9e
+ dr $e2668, $e29ae
+DummyGame_InterpretJoypad_AnimateCursor::
+ dr $e29ae, $e2b9e
_DepositPKMN::
dr $e2b9e, $e2d71
_WithdrawPKMN::
diff --git a/wram.asm b/wram.asm
index 3c9d1520..63c34287 100644
--- a/wram.asm
+++ b/wram.asm
@@ -419,6 +419,10 @@ wOverworldMapBlocks:: ds 1300 ; c700
wOverworldMapBlocksEnd::
NEXTU ; c700
+; decompress buffer in wram
+wDecompressScratch:: ds 40 tiles
+
+NEXTU ; c700
; GB Printer screen RAM
wGameboyPrinterRAM::
wGameboyPrinterScreen:: ds SCREEN_HEIGHT * SCREEN_WIDTH ; c700
@@ -468,6 +472,12 @@ wLinkData:: ds $514
wLinkDataEnd::
NEXTU ; c700
+; unused (engine/gfx/sprite_anims.asm)
+ ds 4
+wc704:: ds 19
+wc717:: ds 1
+
+NEXTU ; c700
; link data members
wLinkPlayerName:: ds NAME_LENGTH
wLinkPartyCount:: db
@@ -1088,6 +1098,12 @@ wTrainerCardBadgeTileID:: db
wTrainerCardBadgeAttributes:: db
NEXTU ; ce64
+; magnet train
+wMagnetTrainOffset:: db
+wMagnetTrainPosition:: db
+wMagnetTrainWaitCounter:: db
+
+NEXTU ; ce64
; miscellaneous
wFrameCounter::
wMomBankDigitCursorPosition::
@@ -1264,6 +1280,15 @@ UNION ; ceed
wTempMail:: mailmsg wTempMail
NEXTU ; ceed
+; magnet train
+wMagnetTrain:: ; used only for BANK(wMagnetTrain)
+wMagnetTrainDirection:: db
+wMagnetTrainInitPosition:: db
+wMagnetTrainHoldPosition:: db
+wMagnetTrainFinalPosition:: db
+wMagnetTrainPlayerSpriteInitX:: db
+
+NEXTU ; ceed
; credits
wCreditsPos:: dw
wCreditsTimer:: db
@@ -2134,17 +2159,15 @@ wObjectMasks:: ds NUM_OBJECTS ; d545
wVariableSprites:: ds $100 - SPRITE_VARS ; d555
wEnteredMapFromContinue:: db ; d565
-wd566:: ds 1 ; d566
-wd567:: ds 1 ; d567
+ ds 2
wTimeOfDayPal:: db
-wd569:: ds 1 ; d569
-wd56a:: ds 1 ; d56a
-wd56b:: ds 1 ; d56b
-wd56c:: ds 1 ; d56c
-wd56d:: ds 1 ; d56d
+ ds 4
+wTimeOfDayPalFlags:: db ; d56d
wTimeOfDayPalset:: db ; d56e
-wd56f:: ds 1 ; d56f
-wd570:: ds 1 ; d570
+wCurTimeOfDay:: db ; d56f
+
+ ds 1
+
wPlayerData2End::
wPlayerData3::
wStatusFlags::