shithub: pokecrystal

Download patch

ref: b5417fafec7dd37cb4be391f3bd3d4541a2a381e
parent: 2f98c2032fd47ada3484bfc37d590992f286d3d4
author: Remy Oukaour <[email protected]>
date: Tue Dec 26 12:47:05 EST 2017

Split battle/ into data/ and engine/ components

--- a/Makefile
+++ b/Makefile
@@ -169,23 +169,23 @@
 
 gfx/card_flip/card_flip_2.2bpp: tools/gfx += --remove-whitespace
 
-gfx/fx/angels.2bpp: tools/gfx += --trim-whitespace
-gfx/fx/beam.2bpp: tools/gfx += --remove-xflip --remove-yflip --remove-whitespace
-gfx/fx/bubble.2bpp: tools/gfx += --trim-whitespace
-gfx/fx/charge.2bpp: tools/gfx += --trim-whitespace
-gfx/fx/egg.2bpp: tools/gfx += --remove-whitespace
-gfx/fx/explosion.2bpp: tools/gfx += --remove-whitespace
-gfx/fx/hit.2bpp: tools/gfx += --remove-whitespace
-gfx/fx/horn.2bpp: tools/gfx += --remove-whitespace
-gfx/fx/lightning.2bpp: tools/gfx += --remove-whitespace
-gfx/fx/misc.2bpp: tools/gfx += --remove-duplicates --remove-xflip
-gfx/fx/noise.2bpp: tools/gfx += --remove-whitespace
-gfx/fx/objects.2bpp: tools/gfx += --remove-whitespace --remove-xflip
-gfx/fx/pokeball.2bpp: tools/gfx += --remove-xflip --keep-whitespace
-gfx/fx/reflect.2bpp: tools/gfx += --remove-whitespace
-gfx/fx/rocks.2bpp: tools/gfx += --remove-whitespace
-gfx/fx/skyattack.2bpp: tools/gfx += --remove-whitespace
-gfx/fx/status.2bpp: tools/gfx += --remove-whitespace
+gfx/anims/angels.2bpp: tools/gfx += --trim-whitespace
+gfx/anims/beam.2bpp: tools/gfx += --remove-xflip --remove-yflip --remove-whitespace
+gfx/anims/bubble.2bpp: tools/gfx += --trim-whitespace
+gfx/anims/charge.2bpp: tools/gfx += --trim-whitespace
+gfx/anims/egg.2bpp: tools/gfx += --remove-whitespace
+gfx/anims/explosion.2bpp: tools/gfx += --remove-whitespace
+gfx/anims/hit.2bpp: tools/gfx += --remove-whitespace
+gfx/anims/horn.2bpp: tools/gfx += --remove-whitespace
+gfx/anims/lightning.2bpp: tools/gfx += --remove-whitespace
+gfx/anims/misc.2bpp: tools/gfx += --remove-duplicates --remove-xflip
+gfx/anims/noise.2bpp: tools/gfx += --remove-whitespace
+gfx/anims/objects.2bpp: tools/gfx += --remove-whitespace --remove-xflip
+gfx/anims/pokeball.2bpp: tools/gfx += --remove-xflip --keep-whitespace
+gfx/anims/reflect.2bpp: tools/gfx += --remove-whitespace
+gfx/anims/rocks.2bpp: tools/gfx += --remove-whitespace
+gfx/anims/skyattack.2bpp: tools/gfx += --remove-whitespace
+gfx/anims/status.2bpp: tools/gfx += --remove-whitespace
 
 gfx/player/chris.2bpp: rgbgfx += -h
 gfx/player/chris_back.2bpp: rgbgfx += -h
--- a/battle/ai/items.asm
+++ /dev/null
@@ -1,882 +1,0 @@
-AI_SwitchOrTryItem: ; 38000
-	and a
-
-	ld a, [wBattleMode]
-	dec a
-	ret z
-
-	ld a, [wLinkMode]
-	and a
-	ret nz
-
-	farcall CheckEnemyLockedIn
-	ret nz
-
-	ld a, [PlayerSubStatus5]
-	bit SUBSTATUS_CANT_RUN, a
-	jr nz, DontSwitch
-
-	ld a, [wEnemyWrapCount]
-	and a
-	jr nz, DontSwitch
-
-	ld hl, TrainerClassAttributes + TRNATTR_AI_ITEM_SWITCH
-	ld a, [InBattleTowerBattle] ; Load always the first TrainerClass for BattleTower-Trainers
-	and a
-	jr nz, .ok
-
-	ld a, [TrainerClass]
-	dec a
-	ld bc, NUM_TRAINER_ATTRIBUTES
-	call AddNTimes
-.ok
-	bit SWITCH_OFTEN_F, [hl]
-	jp nz, SwitchOften
-	bit SWITCH_RARELY_F, [hl]
-	jp nz, SwitchRarely
-	bit SWITCH_SOMETIMES_F, [hl]
-	jp nz, SwitchSometimes
-	; fallthrough
-
-DontSwitch: ; 38041
-	call AI_TryItem
-	ret
-; 38045
-
-SwitchOften: ; 38045
-	callfar CheckAbleToSwitch
-	ld a, [wEnemySwitchMonParam]
-	and $f0
-	jp z, DontSwitch
-
-	cp $10
-	jr nz, .not_10
-	call Random
-	cp 1 + 50 percent
-	jr c, .switch
-	jp DontSwitch
-.not_10
-
-	cp $20
-	jr nz, .not_20
-	call Random
-	cp -1 + 79 percent
-	jr c, .switch
-	jp DontSwitch
-.not_20
-
-	; $30
-	call Random
-	cp 4 percent
-	jp c, DontSwitch
-
-.switch
-	ld a, [wEnemySwitchMonParam]
-	and $f
-	inc a
-	; In register 'a' is the number (1-6) of the Pkmn to switch to
-	ld [wEnemySwitchMonIndex], a
-	jp AI_TrySwitch
-; 38083
-
-SwitchRarely: ; 38083
-	callfar CheckAbleToSwitch
-	ld a, [wEnemySwitchMonParam]
-	and $f0
-	jp z, DontSwitch
-
-	cp $10
-	jr nz, .not_10
-	call Random
-	cp 8 percent
-	jr c, .switch
-	jp DontSwitch
-.not_10
-
-	cp $20
-	jr nz, .not_20
-	call Random
-	cp 12 percent
-	jr c, .switch
-	jp DontSwitch
-.not_20
-
-	; $30
-	call Random
-	cp -1 + 79 percent
-	jp c, DontSwitch
-
-.switch
-	ld a, [wEnemySwitchMonParam]
-	and $f
-	inc a
-	ld [wEnemySwitchMonIndex], a
-	jp AI_TrySwitch
-; 380c1
-
-SwitchSometimes: ; 380c1
-	callfar CheckAbleToSwitch
-	ld a, [wEnemySwitchMonParam]
-	and $f0
-	jp z, DontSwitch
-
-	cp $10
-	jr nz, .not_10
-	call Random
-	cp -1 + 20 percent
-	jr c, .switch
-	jp DontSwitch
-.not_10
-
-	cp $20
-	jr nz, .not_20
-	call Random
-	cp 1 + 50 percent
-	jr c, .switch
-	jp DontSwitch
-.not_20
-
-	; $30
-	call Random
-	cp -1 + 20 percent
-	jp c, DontSwitch
-
-.switch
-	ld a, [wEnemySwitchMonParam]
-	and $f
-	inc a
-	ld [wEnemySwitchMonIndex], a
-	jp AI_TrySwitch
-; 380ff
-
-
-CheckSubstatusCantRun: ; 380ff
-	ld a, [EnemySubStatus5]
-	bit SUBSTATUS_CANT_RUN, a
-	ret
-; 38105
-
-
-AI_TryItem: ; 38105
-	; items are not allowed in the BattleTower
-	ld a, [InBattleTowerBattle]
-	and a
-	ret nz
-
-	ld a, [wEnemyTrainerItem1]
-	ld b, a
-	ld a, [wEnemyTrainerItem2]
-	or b
-	ret z
-
-	call .IsHighestLevel
-	ret nc
-
-	ld a, [TrainerClass]
-	dec a
-	ld hl, TrainerClassAttributes + TRNATTR_AI_ITEM_SWITCH
-	ld bc, NUM_TRAINER_ATTRIBUTES
-	call AddNTimes
-	ld b, h
-	ld c, l
-	ld hl, AI_Items
-	ld de, wEnemyTrainerItem1
-.loop
-	ld a, [hl]
-	and a
-	inc a
-	ret z
-
-	ld a, [de]
-	cp [hl]
-	jr z, .has_item
-	inc de
-	ld a, [de]
-	cp [hl]
-	jr z, .has_item
-
-	dec de
-	inc hl
-	inc hl
-	inc hl
-	jr .loop
-
-.has_item
-	inc hl
-
-	push hl
-	push de
-	ld de, .callback
-	push de
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	jp hl
-.callback
-	pop de
-	pop hl
-
-	inc hl
-	inc hl
-	jr c, .loop
-
-.used_item
-	xor a
-	ld [de], a
-	inc a
-	ld [wEnemyGoesFirst], a
-
-	ld hl, EnemySubStatus3
-	res SUBSTATUS_BIDE, [hl]
-
-	xor a
-	ld [EnemyFuryCutterCount], a
-	ld [EnemyProtectCount], a
-	ld [wEnemyRageCounter], a
-
-	ld hl, EnemySubStatus4
-	res SUBSTATUS_RAGE, [hl]
-
-	xor a
-	ld [LastEnemyCounterMove], a
-
-	scf
-	ret
-
-
-.IsHighestLevel: ; 38170
-	ld a, [OTPartyCount]
-	ld d, a
-	ld e, 0
-	ld hl, OTPartyMon1Level
-	ld bc, PARTYMON_STRUCT_LENGTH
-.next
-	ld a, [hl]
-	cp e
-	jr c, .ok
-	ld e, a
-.ok
-	add hl, bc
-	dec d
-	jr nz, .next
-
-	ld a, [CurOTMon]
-	ld hl, OTPartyMon1Level
-	call AddNTimes
-	ld a, [hl]
-	cp e
-	jr nc, .yes
-
-.no
-	and a
-	ret
-
-.yes
-	scf
-	ret
-; 38196
-
-
-AI_Items: ; 39196
-	dbw FULL_RESTORE, .FullRestore
-	dbw MAX_POTION,   .MaxPotion
-	dbw HYPER_POTION, .HyperPotion
-	dbw SUPER_POTION, .SuperPotion
-	dbw POTION,       .Potion
-	dbw X_ACCURACY,   .XAccuracy
-	dbw FULL_HEAL,    .FullHeal
-	dbw GUARD_SPEC,   .GuardSpec
-	dbw DIRE_HIT,     .DireHit
-	dbw X_ATTACK,     .XAttack
-	dbw X_DEFEND,     .XDefend
-	dbw X_SPEED,      .XSpeed
-	dbw X_SPECIAL,    .XSpecial
-	db $ff
-; 381be
-
-.FullHeal: ; 381be
-	call .Status
-	jp c, .DontUse
-	call EnemyUsedFullHeal
-	jp .Use
-; 381ca
-
-.Status: ; 381ca (e:41ca)
-	ld a, [EnemyMonStatus]
-	and a
-	jp z, .DontUse
-
-	ld a, [bc]
-	bit CONTEXT_USE_F, a
-	jr nz, .StatusCheckContext
-	ld a, [bc]
-	bit ALWAYS_USE_F, a
-	jp nz, .Use
-	call Random
-	cp -1 + 20 percent
-	jp c, .Use
-	jp .DontUse
-
-.StatusCheckContext:
-	ld a, [EnemySubStatus5]
-	bit SUBSTATUS_TOXIC, a
-	jr z, .FailToxicCheck
-	ld a, [EnemyToxicCount]
-	cp 4
-	jr c, .FailToxicCheck
-	call Random
-	cp 1 + 50 percent
-	jp c, .Use
-.FailToxicCheck:
-	ld a, [EnemyMonStatus]
-	and 1 << FRZ | SLP
-	jp z, .DontUse
-	jp .Use
-; 38208
-
-.FullRestore: ; 38208
-	call .HealItem
-	jp nc, .UseFullRestore
-	ld a, [bc]
-	bit CONTEXT_USE_F, a
-	jp z, .DontUse
-	call .Status
-	jp c, .DontUse
-
-.UseFullRestore:
-	call EnemyUsedFullRestore
-	jp .Use
-; 38220
-
-.MaxPotion: ; 38220
-	call .HealItem
-	jp c, .DontUse
-	call EnemyUsedMaxPotion
-	jp .Use
-
-.HealItem: ; 3822c (e:422c)
-	ld a, [bc]
-	bit CONTEXT_USE_F, a
-	jr nz, .CheckHalfOrQuarterHP
-	callfar AICheckEnemyHalfHP
-	jp c, .DontUse
-	ld a, [bc]
-	bit UNKNOWN_USE_F, a
-	jp nz, .CheckQuarterHP
-	callfar AICheckEnemyQuarterHP
-	jp nc, .UseHealItem
-	call Random
-	cp 1 + 50 percent
-	jp c, .UseHealItem
-	jp .DontUse
-
-.CheckQuarterHP: ; 38254 (e:4254)
-	callfar AICheckEnemyQuarterHP
-	jp c, .DontUse
-	call Random
-	cp -1 + 20 percent
-	jp c, .DontUse
-	jr .UseHealItem
-
-.CheckHalfOrQuarterHP: ; 38267 (e:4267)
-	callfar AICheckEnemyHalfHP
-	jp c, .DontUse
-	callfar AICheckEnemyQuarterHP
-	jp nc, .UseHealItem
-	call Random
-	cp -1 + 20 percent
-	jp nc, .DontUse
-
-.UseHealItem: ; 38281 (e:4281)
-	jp .Use
-; 38284
-
-.HyperPotion: ; 38284
-	call .HealItem
-	jp c, .DontUse
-	ld b, 200
-	call EnemyUsedHyperPotion
-	jp .Use
-; 38292 (e:4292)
-
-.SuperPotion: ; 38292
-	call .HealItem
-	jp c, .DontUse
-	ld b, 50
-	call EnemyUsedSuperPotion
-	jp .Use
-; 382a0
-
-.Potion: ; 382a0
-	call .HealItem
-	jp c, .DontUse
-	ld b, 20
-	call EnemyUsedPotion
-	jp .Use
-; 382ae
-
-.asm_382ae ; This appears to be unused
-	callfar AICheckEnemyMaxHP
-	jr c, .dont_use
-	push bc
-	ld de, EnemyMonMaxHP + 1
-	ld hl, EnemyMonHP + 1
-	ld a, [de]
-	sub [hl]
-	jr z, .check_40_percent
-	dec hl
-	dec de
-	ld c, a
-	sbc [hl]
-	and a
-	jr nz, .check_40_percent
-	ld a, c
-	cp b
-	jp c, .check_50_percent
-	callfar AICheckEnemyQuarterHP
-	jr c, .check_40_percent
-
-.check_50_percent
-	pop bc
-	ld a, [bc]
-	bit UNKNOWN_USE_F, a
-	jp z, .Use
-	call Random
-	cp 1 + 50 percent
-	jp c, .Use
-
-.dont_use
-	jp .DontUse
-
-.check_40_percent
-	pop bc
-	ld a, [bc]
-	bit UNKNOWN_USE_F, a
-	jp z, .DontUse
-	call Random
-	cp 1 + 39 percent
-	jp c, .Use
-	jp .DontUse
-; 382f9
-
-.XAccuracy: ; 382f9
-	call .XItem
-	jp c, .DontUse
-	call EnemyUsedXAccuracy
-	jp .Use
-; 38305
-
-.GuardSpec: ; 38305
-	call .XItem
-	jp c, .DontUse
-	call EnemyUsedGuardSpec
-	jp .Use
-; 38311
-
-.DireHit: ; 38311
-	call .XItem
-	jp c, .DontUse
-	call EnemyUsedDireHit
-	jp .Use
-; 3831d (e:431d)
-
-.XAttack: ; 3831d
-	call .XItem
-	jp c, .DontUse
-	call EnemyUsedXAttack
-	jp .Use
-; 38329
-
-.XDefend: ; 38329
-	call .XItem
-	jp c, .DontUse
-	call EnemyUsedXDefend
-	jp .Use
-; 38335
-
-.XSpeed: ; 38335
-	call .XItem
-	jp c, .DontUse
-	call EnemyUsedXSpeed
-	jp .Use
-; 38341
-
-.XSpecial: ; 38341
-	call .XItem
-	jp c, .DontUse
-	call EnemyUsedXSpecial
-	jp .Use
-; 3834d
-
-.XItem: ; 3834d (e:434d)
-	ld a, [EnemyTurnsTaken]
-	and a
-	jr nz, .notfirstturnout
-	ld a, [bc]
-	bit ALWAYS_USE_F, a
-	jp nz, .Use
-	call Random
-	cp 1 + 50 percent
-	jp c, .DontUse
-	ld a, [bc]
-	bit CONTEXT_USE_F, a
-	jp nz, .Use
-	call Random
-	cp 1 + 50 percent
-	jp c, .DontUse
-	jp .Use
-.notfirstturnout
-	ld a, [bc]
-	bit ALWAYS_USE_F, a
-	jp z, .DontUse
-	call Random
-	cp -1 + 20 percent
-	jp nc, .DontUse
-	jp .Use
-
-.DontUse:
-	scf
-	ret
-
-.Use:
-	and a
-	ret
-
-
-AIUpdateHUD: ; 38387
-	call UpdateEnemyMonInParty
-	farcall UpdateEnemyHUD
-	ld a, $1
-	ld [hBGMapMode], a
-	ld hl, wEnemyItemState
-	dec [hl]
-	scf
-	ret
-; 3839a
-
-AIUsedItemSound: ; 3839a
-	push de
-	ld de, SFX_FULL_HEAL
-	call PlaySFX
-	pop de
-	ret
-; 383a3
-
-
-EnemyUsedFullHeal: ; 383a3 (e:43a3)
-	call AIUsedItemSound
-	call AI_HealStatus
-	ld a, FULL_HEAL
-	jp PrintText_UsedItemOn_AND_AIUpdateHUD
-
-EnemyUsedMaxPotion: ; 383ae (e:43ae)
-	ld a, MAX_POTION
-	ld [CurEnemyItem], a
-	jr FullRestoreContinue
-
-EnemyUsedFullRestore: ; 383b5 (e:43b5)
-	call AI_HealStatus
-	ld a, FULL_RESTORE
-	ld [CurEnemyItem], a
-	ld hl, EnemySubStatus3
-	res SUBSTATUS_CONFUSED, [hl]
-	xor a
-	ld [EnemyConfuseCount], a
-
-FullRestoreContinue: ; 383c6
-	ld de, wCurHPAnimOldHP
-	ld hl, EnemyMonHP + 1
-	ld a, [hld]
-	ld [de], a
-	inc de
-	ld a, [hl]
-	ld [de], a
-	inc de
-	ld hl, EnemyMonMaxHP + 1
-	ld a, [hld]
-	ld [de], a
-	inc de
-	ld [wCurHPAnimMaxHP], a
-	ld [EnemyMonHP + 1], a
-	ld a, [hl]
-	ld [de], a
-	ld [wCurHPAnimMaxHP + 1], a
-	ld [EnemyMonHP], a
-	jr EnemyPotionFinish
-; 383e8 (e:43e8)
-
-EnemyUsedPotion: ; 383e8
-	ld a, POTION
-	ld b, 20
-	jr EnemyPotionContinue
-
-EnemyUsedSuperPotion: ; 383ee
-	ld a, SUPER_POTION
-	ld b, 50
-	jr EnemyPotionContinue
-
-EnemyUsedHyperPotion: ; 383f4 (e:43f4)
-	ld a, HYPER_POTION
-	ld b, 200
-
-EnemyPotionContinue: ; 383f8
-	ld [CurEnemyItem], a
-	ld hl, EnemyMonHP + 1
-	ld a, [hl]
-	ld [wCurHPAnimOldHP], a
-	add b
-	ld [hld], a
-	ld [wCurHPAnimNewHP], a
-	ld a, [hl]
-	ld [wCurHPAnimOldHP + 1], a
-	ld [wCurHPAnimNewHP + 1], a
-	jr nc, .ok
-	inc a
-	ld [hl], a
-	ld [wCurHPAnimNewHP + 1], a
-.ok
-	inc hl
-	ld a, [hld]
-	ld b, a
-	ld de, EnemyMonMaxHP + 1
-	ld a, [de]
-	dec de
-	ld [wCurHPAnimMaxHP], a
-	sub b
-	ld a, [hli]
-	ld b, a
-	ld a, [de]
-	ld [wCurHPAnimMaxHP + 1], a
-	sbc b
-	jr nc, EnemyPotionFinish
-	inc de
-	ld a, [de]
-	dec de
-	ld [hld], a
-	ld [wCurHPAnimNewHP], a
-	ld a, [de]
-	ld [hl], a
-	ld [wCurHPAnimNewHP + 1], a
-
-EnemyPotionFinish: ; 38436
-	call PrintText_UsedItemOn
-	hlcoord 2, 2
-	xor a
-	ld [wWhichHPBar], a
-	call AIUsedItemSound
-	predef AnimateHPBar
-	jp AIUpdateHUD
-
-
-AI_TrySwitch: ; 3844b
-; Determine whether the AI can switch based on how many Pokemon are still alive.
-; If it can switch, it will.
-	ld a, [OTPartyCount]
-	ld c, a
-	ld hl, OTPartyMon1HP
-	ld d, 0
-.SwitchLoop:
-	ld a, [hli]
-	ld b, a
-	ld a, [hld]
-	or b
-	jr z, .fainted
-	inc d
-.fainted
-	push bc
-	ld bc, PARTYMON_STRUCT_LENGTH
-	add hl, bc
-	pop bc
-	dec c
-	jr nz, .SwitchLoop
-
-	ld a, d
-	cp 2
-	jp nc, AI_Switch
-	and a
-	ret
-; 3846c
-
-AI_Switch: ; 3846c
-	ld a, $1
-	ld [wEnemyIsSwitching], a
-	ld [wEnemyGoesFirst], a
-	ld hl, EnemySubStatus4
-	res SUBSTATUS_RAGE, [hl]
-	xor a
-	ld [hBattleTurn], a
-	callfar PursuitSwitch
-
-	push af
-	ld a, [CurOTMon]
-	ld hl, OTPartyMon1Status
-	ld bc, PARTYMON_STRUCT_LENGTH
-	call AddNTimes
-	ld d, h
-	ld e, l
-	ld hl, EnemyMonStatus
-	ld bc, MON_MAXHP - MON_STATUS
-	call CopyBytes
-	pop af
-
-	jr c, .skiptext
-	ld hl, TextJump_EnemyWithdrew
-	call PrintText
-
-.skiptext
-	ld a, 1
-	ld [wBattleHasJustStarted], a
-	callfar NewEnemyMonStatus
-	callfar ResetEnemyStatLevels
-	ld hl, PlayerSubStatus1
-	res SUBSTATUS_IN_LOVE, [hl]
-	farcall EnemySwitch
-	farcall ResetBattleParticipants
-	xor a
-	ld [wBattleHasJustStarted], a
-	ld a, [wLinkMode]
-	and a
-	ret nz
-	scf
-	ret
-; 384d0
-
-TextJump_EnemyWithdrew: ; 384d0
-	text_jump Text_EnemyWithdrew
-	db "@"
-; 384d5
-
-Function384d5: ; This appears to be unused
-	call AIUsedItemSound
-	call AI_HealStatus
-	ld a, FULL_HEAL_RED ; X_SPEED
-	jp PrintText_UsedItemOn_AND_AIUpdateHUD
-; 384e0
-
-AI_HealStatus: ; 384e0
-	ld a, [CurOTMon]
-	ld hl, OTPartyMon1Status
-	ld bc, PARTYMON_STRUCT_LENGTH
-	call AddNTimes
-	xor a
-	ld [hl], a
-	ld [EnemyMonStatus], a
-	; Bug: this should reset SUBSTATUS_NIGHTMARE too
-	; Uncomment the lines below to fix
-	; ld hl, EnemySubStatus1
-	; res SUBSTATUS_NIGHTMARE, [hl]
-	ld hl, EnemySubStatus5
-	res SUBSTATUS_TOXIC, [hl]
-	ret
-; 384f7
-
-EnemyUsedXAccuracy: ; 384f7
-	call AIUsedItemSound
-	ld hl, EnemySubStatus4
-	set SUBSTATUS_X_ACCURACY, [hl]
-	ld a, X_ACCURACY
-	jp PrintText_UsedItemOn_AND_AIUpdateHUD
-; 38504
-
-EnemyUsedGuardSpec: ; 38504
-	call AIUsedItemSound
-	ld hl, EnemySubStatus4
-	set SUBSTATUS_MIST, [hl]
-	ld a, GUARD_SPEC
-	jp PrintText_UsedItemOn_AND_AIUpdateHUD
-; 38511
-
-EnemyUsedDireHit: ; 38511
-	call AIUsedItemSound
-	ld hl, EnemySubStatus4
-	set SUBSTATUS_FOCUS_ENERGY, [hl]
-	ld a, DIRE_HIT
-	jp PrintText_UsedItemOn_AND_AIUpdateHUD
-; 3851e
-
-Function3851e: ; This appears to be unused
-	ld [hDivisor], a
-	ld hl, EnemyMonMaxHP
-	ld a, [hli]
-	ld [hDividend], a
-	ld a, [hl]
-	ld [hDividend + 1], a
-	ld b, 2
-	call Divide
-	ld a, [hQuotient + 2]
-	ld c, a
-	ld a, [hQuotient + 1]
-	ld b, a
-	ld hl, EnemyMonHP + 1
-	ld a, [hld]
-	ld e, a
-	ld a, [hl]
-	ld d, a
-	ld a, d
-	sub b
-	ret nz
-	ld a, e
-	sub c
-	ret
-; 38541
-
-EnemyUsedXAttack: ; 38541
-	ld b, ATTACK
-	ld a, X_ATTACK
-	jr EnemyUsedXItem
-; 38547
-
-EnemyUsedXDefend: ; 38547
-	ld b, DEFENSE
-	ld a, X_DEFEND
-	jr EnemyUsedXItem
-; 3854d
-
-EnemyUsedXSpeed: ; 3854d
-	ld b, SPEED
-	ld a, X_SPEED
-	jr EnemyUsedXItem
-; 38553
-
-EnemyUsedXSpecial: ; 38553
-	ld b, SP_ATTACK
-	ld a, X_SPECIAL
-
-
-; Parameter
-; a = ITEM_CONSTANT
-; b = BATTLE_CONSTANT (ATTACK, DEFENSE, SPEED, SP_ATTACK, SP_DEFENSE, ACCURACY, EVASION)
-EnemyUsedXItem:
-	ld [CurEnemyItem], a
-	push bc
-	call PrintText_UsedItemOn
-	pop bc
-	farcall CheckIfStatCanBeRaised
-	jp AIUpdateHUD
-; 38568
-
-
-; Parameter
-; a = ITEM_CONSTANT
-PrintText_UsedItemOn_AND_AIUpdateHUD: ; 38568
-	ld [CurEnemyItem], a
-	call PrintText_UsedItemOn
-	jp AIUpdateHUD
-; 38571
-
-PrintText_UsedItemOn: ; 38571
-	ld a, [CurEnemyItem]
-	ld [wd265], a
-	call GetItemName
-	ld hl, StringBuffer1
-	ld de, wMonOrItemNameBuffer
-	ld bc, ITEM_NAME_LENGTH
-	call CopyBytes
-	ld hl, TextJump_EnemyUsedOn
-	jp PrintText
-; 3858c
-
-TextJump_EnemyUsedOn: ; 3858c
-	text_jump Text_EnemyUsedOn
-	db "@"
-; 38591
--- a/battle/ai/move.asm
+++ /dev/null
@@ -1,221 +1,0 @@
-AIChooseMove: ; 440ce
-; Score each move in EnemyMonMoves starting from Buffer1. Lower is better.
-; Pick the move with the lowest score.
-
-; Wildmons attack at random.
-	ld a, [wBattleMode]
-	dec a
-	ret z
-
-	ld a, [wLinkMode]
-	and a
-	ret nz
-
-; No use picking a move if there's no choice.
-	farcall CheckEnemyLockedIn
-	ret nz
-
-
-; The default score is 20. Unusable moves are given a score of 80.
-	ld a, 20
-	ld hl, Buffer1
-	ld [hli], a
-	ld [hli], a
-	ld [hli], a
-	ld [hl], a
-
-; Don't pick disabled moves.
-	ld a, [EnemyDisabledMove]
-	and a
-	jr z, .CheckPP
-
-	ld hl, EnemyMonMoves
-	ld c, 0
-.CheckDisabledMove:
-	cp [hl]
-	jr z, .ScoreDisabledMove
-	inc c
-	inc hl
-	jr .CheckDisabledMove
-.ScoreDisabledMove:
-	ld hl, Buffer1
-	ld b, 0
-	add hl, bc
-	ld [hl], 80
-
-; Don't pick moves with 0 PP.
-.CheckPP:
-	ld hl, Buffer1 - 1
-	ld de, EnemyMonPP
-	ld b, 0
-.CheckMovePP:
-	inc b
-	ld a, b
-	cp EnemyMonMovesEnd - EnemyMonMoves + 1
-	jr z, .ApplyLayers
-	inc hl
-	ld a, [de]
-	inc de
-	and $3f
-	jr nz, .CheckMovePP
-	ld [hl], 80
-	jr .CheckMovePP
-
-
-; Apply AI scoring layers depending on the trainer class.
-.ApplyLayers:
-	ld hl, TrainerClassAttributes + TRNATTR_AI_MOVE_WEIGHTS
-
-	; If we have a battle in BattleTower just load the Attributes of the first TrainerClass (Falkner)
-	; so we have always the same AI, regardless of the loaded class of trainer
-	ld a, [InBattleTowerBattle]
-	bit 0, a
-	jr nz, .battle_tower_skip
-
-	ld a, [TrainerClass]
-	dec a
-	ld bc, 7 ; Trainer2AI - Trainer1AI
-	call AddNTimes
-
-.battle_tower_skip
-	lb bc, CHECK_FLAG, 0
-	push bc
-	push hl
-
-.CheckLayer:
-	pop hl
-	pop bc
-
-	ld a, c
-	cp 16 ; up to 16 scoring layers
-	jr z, .DecrementScores
-
-	push bc
-	ld d, BANK(TrainerClassAttributes)
-	predef FlagPredef
-	ld d, c
-	pop bc
-
-	inc c
-	push bc
-	push hl
-
-	ld a, d
-	and a
-	jr z, .CheckLayer
-
-	ld hl, AIScoringPointers
-	dec c
-	ld b, 0
-	add hl, bc
-	add hl, bc
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	ld a, BANK(AIScoring)
-	call FarCall_hl
-
-	jr .CheckLayer
-
-; Decrement the scores of all moves one by one until one reaches 0.
-.DecrementScores:
-	ld hl, Buffer1
-	ld de, EnemyMonMoves
-	ld c, EnemyMonMovesEnd - EnemyMonMoves
-
-.DecrementNextScore:
-	; If the enemy has no moves, this will infinite.
-	ld a, [de]
-	inc de
-	and a
-	jr z, .DecrementScores
-
-	; We are done whenever a score reaches 0
-	dec [hl]
-	jr z, .PickLowestScoreMoves
-
-	; If we just decremented the fourth move's score, go back to the first move
-	inc hl
-	dec c
-	jr z, .DecrementScores
-
-	jr .DecrementNextScore
-
-; In order to avoid bias towards the moves located first in memory, increment the scores
-; that were decremented one more time than the rest (in case there was a tie).
-; This means that the minimum score will be 1.
-.PickLowestScoreMoves:
-	ld a, c
-
-.move_loop
-	inc [hl]
-	dec hl
-	inc a
-	cp NUM_MOVES + 1
-	jr nz, .move_loop
-
-	ld hl, Buffer1
-	ld de, EnemyMonMoves
-	ld c, NUM_MOVES
-
-; Give a score of 0 to a blank move
-.loop2
-	ld a, [de]
-	and a
-	jr nz, .skip_load
-	ld [hl], a
-
-; Disregard the move if its score is not 1
-.skip_load
-	ld a, [hl]
-	dec a
-	jr z, .keep
-	xor a
-	ld [hli], a
-	jr .after_toss
-
-.keep
-	ld a, [de]
-	ld [hli], a
-.after_toss
-	inc de
-	dec c
-	jr nz, .loop2
-
-; Randomly choose one of the moves with a score of 1
-.ChooseMove:
-	ld hl, Buffer1
-	call Random
-	and 3
-	ld c, a
-	ld b, 0
-	add hl, bc
-	ld a, [hl]
-	and a
-	jr z, .ChooseMove
-
-	ld [CurEnemyMove], a
-	ld a, c
-	ld [CurEnemyMoveNum], a
-	ret
-; 441af
-
-
-AIScoringPointers: ; 441af
-	dw AI_Basic
-	dw AI_Setup
-	dw AI_Types
-	dw AI_Offensive
-	dw AI_Smart
-	dw AI_Opportunist
-	dw AI_Aggressive
-	dw AI_Cautious
-	dw AI_Status
-	dw AI_Risky
-	dw AI_None
-	dw AI_None
-	dw AI_None
-	dw AI_None
-	dw AI_None
-	dw AI_None
-; 441cf
--- a/battle/ai/redundant.asm
+++ /dev/null
@@ -1,198 +1,0 @@
-AI_Redundant: ; 2c41a
-; Check if move effect c will fail because it's already been used.
-; Return z if the move is a good choice.
-; Return nz if the move is a bad choice.
-	ld a, c
-	ld de, 3
-	ld hl, .Moves
-	call IsInArray
-	jp nc, .NotRedundant
-	inc hl
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	jp hl
-
-.Moves: ; 2c42c
-	dbw EFFECT_DREAM_EATER,  .DreamEater
-	dbw EFFECT_HEAL,         .Heal
-	dbw EFFECT_LIGHT_SCREEN, .LightScreen
-	dbw EFFECT_MIST,         .Mist
-	dbw EFFECT_FOCUS_ENERGY, .FocusEnergy
-	dbw EFFECT_CONFUSE,      .Confuse
-	dbw EFFECT_TRANSFORM,    .Transform
-	dbw EFFECT_REFLECT,      .Reflect
-	dbw EFFECT_SUBSTITUTE,   .Substitute
-	dbw EFFECT_LEECH_SEED,   .LeechSeed
-	dbw EFFECT_DISABLE,      .Disable
-	dbw EFFECT_ENCORE,       .Encore
-	dbw EFFECT_SNORE,        .Snore
-	dbw EFFECT_SLEEP_TALK,   .SleepTalk
-	dbw EFFECT_MEAN_LOOK,    .MeanLook
-	dbw EFFECT_NIGHTMARE,    .Nightmare
-	dbw EFFECT_SPIKES,       .Spikes
-	dbw EFFECT_FORESIGHT,    .Foresight
-	dbw EFFECT_PERISH_SONG,  .PerishSong
-	dbw EFFECT_SANDSTORM,    .Sandstorm
-	dbw EFFECT_ATTRACT,      .Attract
-	dbw EFFECT_SAFEGUARD,    .Safeguard
-	dbw EFFECT_RAIN_DANCE,   .RainDance
-	dbw EFFECT_SUNNY_DAY,    .SunnyDay
-	dbw EFFECT_TELEPORT,     .Teleport
-	dbw EFFECT_MORNING_SUN,  .MorningSun
-	dbw EFFECT_SYNTHESIS,    .Synthesis
-	dbw EFFECT_MOONLIGHT,    .Moonlight
-	dbw EFFECT_SWAGGER,      .Swagger
-	dbw EFFECT_FUTURE_SIGHT, .FutureSight
-	db -1
-
-.LightScreen: ; 2c487
-	ld a, [EnemyScreens]
-	bit SCREENS_LIGHT_SCREEN, a
-	ret
-
-.Mist: ; 2c48d
-	ld a, [EnemySubStatus4]
-	bit SUBSTATUS_MIST, a
-	ret
-
-.FocusEnergy: ; 2c493
-	ld a, [EnemySubStatus4]
-	bit SUBSTATUS_FOCUS_ENERGY, a
-	ret
-
-.Confuse: ; 2c499
-	ld a, [PlayerSubStatus3]
-	bit SUBSTATUS_CONFUSED, a
-	ret nz
-	ld a, [PlayerScreens]
-	bit SCREENS_SAFEGUARD, a
-	ret
-
-.Transform: ; 2c4a5
-	ld a, [EnemySubStatus5]
-	bit SUBSTATUS_TRANSFORMED, a
-	ret
-
-.Reflect: ; 2c4ab
-	ld a, [EnemyScreens]
-	bit SCREENS_REFLECT, a
-	ret
-
-.Substitute: ; 2c4b1
-	ld a, [EnemySubStatus4]
-	bit SUBSTATUS_SUBSTITUTE, a
-	ret
-
-.LeechSeed: ; 2c4b7
-	ld a, [PlayerSubStatus4]
-	bit SUBSTATUS_LEECH_SEED, a
-	ret
-
-.Disable: ; 2c4bd
-	ld a, [PlayerDisableCount]
-	and a
-	ret
-
-.Encore: ; 2c4c2
-	ld a, [PlayerSubStatus5]
-	bit SUBSTATUS_ENCORED, a
-	ret
-
-.Snore:
-.SleepTalk: ; 2c4c8
-	ld a, [EnemyMonStatus]
-	and SLP
-	jr z, .Redundant
-	jr .NotRedundant
-
-.MeanLook: ; 2c4d1
-	ld a, [EnemySubStatus5]
-	bit SUBSTATUS_CANT_RUN, a
-	ret
-
-.Nightmare: ; 2c4d7
-	ld a, [BattleMonStatus]
-	and a
-	jr z, .Redundant
-	ld a, [PlayerSubStatus1]
-	bit SUBSTATUS_NIGHTMARE, a
-	ret
-
-.Spikes: ; 2c4e3
-	ld a, [PlayerScreens]
-	bit SCREENS_SPIKES, a
-	ret
-
-.Foresight: ; 2c4e9
-	ld a, [PlayerSubStatus1]
-	bit SUBSTATUS_IDENTIFIED, a
-	ret
-
-.PerishSong: ; 2c4ef
-	ld a, [PlayerSubStatus1]
-	bit SUBSTATUS_PERISH, a
-	ret
-
-.Sandstorm: ; 2c4f5
-	ld a, [Weather]
-	cp WEATHER_SANDSTORM
-	jr z, .Redundant
-	jr .NotRedundant
-
-.Attract: ; 2c4fe
-	farcall CheckOppositeGender
-	jr c, .Redundant
-	ld a, [PlayerSubStatus1]
-	bit SUBSTATUS_IN_LOVE, a
-	ret
-
-.Safeguard: ; 2c50c
-	ld a, [EnemyScreens]
-	bit SCREENS_SAFEGUARD, a
-	ret
-
-.RainDance: ; 2c512
-	ld a, [Weather]
-	cp WEATHER_RAIN
-	jr z, .Redundant
-	jr .NotRedundant
-
-.SunnyDay: ; 2c51b
-	ld a, [Weather]
-	cp WEATHER_SUN
-	jr z, .Redundant
-	jr .NotRedundant
-
-.DreamEater: ; 2c524
-	ld a, [BattleMonStatus]
-	and SLP
-	jr z, .Redundant
-	jr .NotRedundant
-
-.Swagger: ; 2c52d
-	ld a, [PlayerSubStatus3]
-	bit SUBSTATUS_CONFUSED, a
-	ret
-
-.FutureSight: ; 2c533
-	ld a, [EnemyScreens]
-	bit 5, a
-	ret
-
-.Heal:
-.MorningSun:
-.Synthesis:
-.Moonlight: ; 2c539
-	farcall AICheckEnemyMaxHP
-	jr nc, .NotRedundant
-
-.Teleport:
-.Redundant: ; 2c541
-	ld a, 1
-	and a
-	ret
-
-.NotRedundant: ; 2c545
-	xor a
-	ret
--- a/battle/ai/scoring.asm
+++ /dev/null
@@ -1,3598 +1,0 @@
-AIScoring: ; 38591
-
-AI_Basic: ; 38591
-; Don't do anything redundant:
-;  -Using status-only moves if the player can't be statused
-;  -Using moves that fail if they've already been used
-
-	ld hl, Buffer1 - 1
-	ld de, EnemyMonMoves
-	ld b, EnemyMonMovesEnd - EnemyMonMoves + 1
-.checkmove
-	dec b
-	ret z
-
-	inc hl
-	ld a, [de]
-	and a
-	ret z
-
-	inc de
-	call AIGetEnemyMove
-
-	ld a, [wEnemyMoveStruct + MOVE_EFFECT]
-	ld c, a
-
-; Dismiss moves with special effects if they are
-; useless or not a good choice right now.
-; For example, healing moves, weather moves, Dream Eater...
-	push hl
-	push de
-	push bc
-	farcall AI_Redundant
-	pop bc
-	pop de
-	pop hl
-	jr nz, .discourage
-
-; Dismiss status-only moves if the player can't be statused.
-	ld a, [wEnemyMoveStruct + MOVE_EFFECT]
-	push hl
-	push de
-	push bc
-	ld hl, .statusonlyeffects
-	ld de, 1
-	call IsInArray
-
-	pop bc
-	pop de
-	pop hl
-	jr nc, .checkmove
-
-	ld a, [BattleMonStatus]
-	and a
-	jr nz, .discourage
-
-; Dismiss Safeguard if it's already active.
-	ld a, [PlayerScreens]
-	bit SCREENS_SAFEGUARD, a
-	jr z, .checkmove
-
-.discourage
-	call AIDiscourageMove
-	jr .checkmove
-; 385db
-
-.statusonlyeffects
-	db EFFECT_SLEEP
-	db EFFECT_TOXIC
-	db EFFECT_POISON
-	db EFFECT_PARALYZE
-	db $ff
-; 385e0
-
-
-
-AI_Setup: ; 385e0
-; Use stat-modifying moves on turn 1.
-
-; 50% chance to greatly encourage stat-up moves during the first turn of enemy's Pokemon.
-; 50% chance to greatly encourage stat-down moves during the first turn of player's Pokemon.
-; Almost 90% chance to greatly discourage stat-modifying moves otherwise.
-
-	ld hl, Buffer1 - 1
-	ld de, EnemyMonMoves
-	ld b, EnemyMonMovesEnd - EnemyMonMoves + 1
-.checkmove
-	dec b
-	ret z
-
-	inc hl
-	ld a, [de]
-	and a
-	ret z
-
-	inc de
-	call AIGetEnemyMove
-
-	ld a, [wEnemyMoveStruct + MOVE_EFFECT]
-
-	cp EFFECT_ATTACK_UP
-	jr c, .checkmove
-	cp EFFECT_EVASION_UP + 1
-	jr c, .statup
-
-;	cp EFFECT_ATTACK_DOWN - 1
-	jr z, .checkmove
-	cp EFFECT_EVASION_DOWN + 1
-	jr c, .statdown
-
-	cp EFFECT_ATTACK_UP_2
-	jr c, .checkmove
-	cp EFFECT_EVASION_UP_2 + 1
-	jr c, .statup
-
-;	cp EFFECT_ATTACK_DOWN_2 - 1
-	jr z, .checkmove
-	cp EFFECT_EVASION_DOWN_2 + 1
-	jr c, .statdown
-
-	jr .checkmove
-
-.statup
-	ld a, [EnemyTurnsTaken]
-	and a
-	jr nz, .discourage
-
-	jr .encourage
-
-.statdown
-	ld a, [PlayerTurnsTaken]
-	and a
-	jr nz, .discourage
-
-.encourage
-	call AI_50_50
-	jr c, .checkmove
-
-	dec [hl]
-	dec [hl]
-	jr .checkmove
-
-.discourage
-	call Random
-	cp 12 percent
-	jr c, .checkmove
-	inc [hl]
-	inc [hl]
-	jr .checkmove
-; 38635
-
-
-
-AI_Types: ; 38635
-; Dismiss any move that the player is immune to.
-; Encourage super-effective moves.
-; Discourage not very effective moves unless
-; all damaging moves are of the same type.
-
-	ld hl, Buffer1 - 1
-	ld de, EnemyMonMoves
-	ld b, EnemyMonMovesEnd - EnemyMonMoves + 1
-.checkmove
-	dec b
-	ret z
-
-	inc hl
-	ld a, [de]
-	and a
-	ret z
-
-	inc de
-	call AIGetEnemyMove
-
-	push hl
-	push bc
-	push de
-	ld a, 1
-	ld [hBattleTurn], a
-	callfar BattleCheckTypeMatchup
-	pop de
-	pop bc
-	pop hl
-
-	ld a, [wd265]
-	and a
-	jr z, .immune
-	cp 10 ; 1.0
-	jr z, .checkmove
-	jr c, .noteffective
-
-; effective
-	ld a, [wEnemyMoveStruct + MOVE_POWER]
-	and a
-	jr z, .checkmove
-	dec [hl]
-	jr .checkmove
-
-.noteffective
-; Discourage this move if there are any moves
-; that do damage of a different type.
-	push hl
-	push de
-	push bc
-	ld a, [wEnemyMoveStruct + MOVE_TYPE]
-	ld d, a
-	ld hl, EnemyMonMoves
-	ld b, EnemyMonMovesEnd - EnemyMonMoves + 1
-	ld c, 0
-.checkmove2
-	dec b
-	jr z, .asm_38693
-
-	ld a, [hli]
-	and a
-	jr z, .asm_38693
-
-	call AIGetEnemyMove
-	ld a, [wEnemyMoveStruct + MOVE_TYPE]
-	cp d
-	jr z, .checkmove2
-	ld a, [wEnemyMoveStruct + MOVE_POWER]
-	and a
-	jr nz, .asm_38692
-	jr .checkmove2
-
-.asm_38692
-	ld c, a
-.asm_38693
-	ld a, c
-	pop bc
-	pop de
-	pop hl
-	and a
-	jr z, .checkmove
-	inc [hl]
-	jr .checkmove
-
-.immune
-	call AIDiscourageMove
-	jr .checkmove
-; 386a2
-
-
-
-AI_Offensive: ; 386a2
-; Greatly discourage non-damaging moves.
-
-	ld hl, Buffer1 - 1
-	ld de, EnemyMonMoves
-	ld b, EnemyMonMovesEnd - EnemyMonMoves + 1
-.checkmove
-	dec b
-	ret z
-
-	inc hl
-	ld a, [de]
-	and a
-	ret z
-
-	inc de
-	call AIGetEnemyMove
-
-	ld a, [wEnemyMoveStruct + MOVE_POWER]
-	and a
-	jr nz, .checkmove
-
-	inc [hl]
-	inc [hl]
-	jr .checkmove
-; 386be
-
-
-
-AI_Smart: ; 386be
-; Context-specific scoring.
-
-	ld hl, Buffer1
-	ld de, EnemyMonMoves
-	ld b, EnemyMonMovesEnd - EnemyMonMoves + 1
-.checkmove
-	dec b
-	ret z
-
-	ld a, [de]
-	inc de
-	and a
-	ret z
-
-	push de
-	push bc
-	push hl
-	call AIGetEnemyMove
-
-	ld a, [wEnemyMoveStruct + MOVE_EFFECT]
-	ld hl, .table_386f2
-	ld de, 3
-	call IsInArray
-
-	inc hl
-	jr nc, .nextmove
-
-	ld a, [hli]
-	ld e, a
-	ld d, [hl]
-
-	pop hl
-	push hl
-
-	ld bc, .nextmove
-	push bc
-
-	push de
-	ret
-
-.nextmove
-	pop hl
-	pop bc
-	pop de
-	inc hl
-	jr .checkmove
-
-.table_386f2
-	dbw EFFECT_SLEEP,            AI_Smart_Sleep
-	dbw EFFECT_LEECH_HIT,        AI_Smart_LeechHit
-	dbw EFFECT_SELFDESTRUCT,     AI_Smart_Selfdestruct
-	dbw EFFECT_DREAM_EATER,      AI_Smart_DreamEater
-	dbw EFFECT_MIRROR_MOVE,      AI_Smart_MirrorMove
-	dbw EFFECT_EVASION_UP,       AI_Smart_EvasionUp
-	dbw EFFECT_ALWAYS_HIT,       AI_Smart_AlwaysHit
-	dbw EFFECT_ACCURACY_DOWN,    AI_Smart_AccuracyDown
-	dbw EFFECT_RESET_STATS,      AI_Smart_ResetStats
-	dbw EFFECT_BIDE,             AI_Smart_Bide
-	dbw EFFECT_FORCE_SWITCH,     AI_Smart_ForceSwitch
-	dbw EFFECT_HEAL,             AI_Smart_Heal
-	dbw EFFECT_TOXIC,            AI_Smart_Toxic
-	dbw EFFECT_LIGHT_SCREEN,     AI_Smart_LightScreen
-	dbw EFFECT_OHKO,             AI_Smart_Ohko
-	dbw EFFECT_RAZOR_WIND,       AI_Smart_RazorWind
-	dbw EFFECT_SUPER_FANG,       AI_Smart_SuperFang
-	dbw EFFECT_TRAP_TARGET,      AI_Smart_TrapTarget
-	dbw EFFECT_UNUSED_2B,        AI_Smart_Unused2B
-	dbw EFFECT_CONFUSE,          AI_Smart_Confuse
-	dbw EFFECT_SP_DEF_UP_2,      AI_Smart_SpDefenseUp2
-	dbw EFFECT_REFLECT,          AI_Smart_Reflect
-	dbw EFFECT_PARALYZE,         AI_Smart_Paralyze
-	dbw EFFECT_SPEED_DOWN_HIT,   AI_Smart_SpeedDownHit
-	dbw EFFECT_SUBSTITUTE,       AI_Smart_Substitute
-	dbw EFFECT_HYPER_BEAM,       AI_Smart_HyperBeam
-	dbw EFFECT_RAGE,             AI_Smart_Rage
-	dbw EFFECT_MIMIC,            AI_Smart_Mimic
-	dbw EFFECT_LEECH_SEED,       AI_Smart_LeechSeed
-	dbw EFFECT_DISABLE,          AI_Smart_Disable
-	dbw EFFECT_COUNTER,          AI_Smart_Counter
-	dbw EFFECT_ENCORE,           AI_Smart_Encore
-	dbw EFFECT_PAIN_SPLIT,       AI_Smart_PainSplit
-	dbw EFFECT_SNORE,            AI_Smart_Snore
-	dbw EFFECT_CONVERSION2,      AI_Smart_Conversion2
-	dbw EFFECT_LOCK_ON,          AI_Smart_LockOn
-	dbw EFFECT_DEFROST_OPPONENT, AI_Smart_DefrostOpponent
-	dbw EFFECT_SLEEP_TALK,       AI_Smart_SleepTalk
-	dbw EFFECT_DESTINY_BOND,     AI_Smart_DestinyBond
-	dbw EFFECT_REVERSAL,         AI_Smart_Reversal
-	dbw EFFECT_SPITE,            AI_Smart_Spite
-	dbw EFFECT_HEAL_BELL,        AI_Smart_HealBell
-	dbw EFFECT_PRIORITY_HIT,     AI_Smart_PriorityHit
-	dbw EFFECT_THIEF,            AI_Smart_Thief
-	dbw EFFECT_MEAN_LOOK,        AI_Smart_MeanLook
-	dbw EFFECT_NIGHTMARE,        AI_Smart_Nightmare
-	dbw EFFECT_FLAME_WHEEL,      AI_Smart_FlameWheel
-	dbw EFFECT_CURSE,            AI_Smart_Curse
-	dbw EFFECT_PROTECT,          AI_Smart_Protect
-	dbw EFFECT_FORESIGHT,        AI_Smart_Foresight
-	dbw EFFECT_PERISH_SONG,      AI_Smart_PerishSong
-	dbw EFFECT_SANDSTORM,        AI_Smart_Sandstorm
-	dbw EFFECT_ENDURE,           AI_Smart_Endure
-	dbw EFFECT_ROLLOUT,          AI_Smart_Rollout
-	dbw EFFECT_SWAGGER,          AI_Smart_Swagger
-	dbw EFFECT_FURY_CUTTER,      AI_Smart_FuryCutter
-	dbw EFFECT_ATTRACT,          AI_Smart_Attract
-	dbw EFFECT_SAFEGUARD,        AI_Smart_Safeguard
-	dbw EFFECT_MAGNITUDE,        AI_Smart_Magnitude
-	dbw EFFECT_BATON_PASS,       AI_Smart_BatonPass
-	dbw EFFECT_PURSUIT,          AI_Smart_Pursuit
-	dbw EFFECT_RAPID_SPIN,       AI_Smart_RapidSpin
-	dbw EFFECT_MORNING_SUN,      AI_Smart_MorningSun
-	dbw EFFECT_SYNTHESIS,        AI_Smart_Synthesis
-	dbw EFFECT_MOONLIGHT,        AI_Smart_Moonlight
-	dbw EFFECT_HIDDEN_POWER,     AI_Smart_HiddenPower
-	dbw EFFECT_RAIN_DANCE,       AI_Smart_RainDance
-	dbw EFFECT_SUNNY_DAY,        AI_Smart_SunnyDay
-	dbw EFFECT_BELLY_DRUM,       AI_Smart_BellyDrum
-	dbw EFFECT_PSYCH_UP,         AI_Smart_PsychUp
-	dbw EFFECT_MIRROR_COAT,      AI_Smart_MirrorCoat
-	dbw EFFECT_SKULL_BASH,       AI_Smart_SkullBash
-	dbw EFFECT_TWISTER,          AI_Smart_Twister
-	dbw EFFECT_EARTHQUAKE,       AI_Smart_Earthquake
-	dbw EFFECT_FUTURE_SIGHT,     AI_Smart_FutureSight
-	dbw EFFECT_GUST,             AI_Smart_Gust
-	dbw EFFECT_STOMP,            AI_Smart_Stomp
-	dbw EFFECT_SOLARBEAM,        AI_Smart_Solarbeam
-	dbw EFFECT_THUNDER,          AI_Smart_Thunder
-	dbw EFFECT_FLY,              AI_Smart_Fly
-	db $ff
-; 387e3
-
-
-AI_Smart_Sleep: ; 387e3
-; Greatly encourage sleep inducing moves if the enemy has either Dream Eater or Nightmare.
-; 50% chance to greatly encourage sleep inducing moves otherwise.
-
-	ld b, EFFECT_DREAM_EATER
-	call AIHasMoveEffect
-	jr c, .asm_387f0
-
-	ld b, EFFECT_NIGHTMARE
-	call AIHasMoveEffect
-	ret nc
-
-.asm_387f0
-	call AI_50_50
-	ret c
-	dec [hl]
-	dec [hl]
-	ret
-; 387f7
-
-
-AI_Smart_LeechHit: ; 387f7
-	push hl
-	ld a, 1
-	ld [hBattleTurn], a
-	callfar BattleCheckTypeMatchup
-	pop hl
-
-; 60% chance to discourage this move if not very effective.
-	ld a, [wd265]
-	cp 10 ; 1.0
-	jr c, .asm_38815
-
-; Do nothing if effectiveness is neutral.
-	ret z
-
-; Do nothing if enemy's HP is full.
-	call AICheckEnemyMaxHP
-	ret c
-
-; 80% chance to encourage this move otherwise.
-	call AI_80_20
-	ret c
-
-	dec [hl]
-	ret
-
-.asm_38815
-	call Random
-	cp 39 percent + 1
-	ret c
-
-	inc [hl]
-	ret
-; 3881d
-
-
-AI_Smart_LockOn: ; 3881d
-	ld a, [PlayerSubStatus5]
-	bit SUBSTATUS_LOCK_ON, a
-	jr nz, .asm_38882
-
-	push hl
-	call AICheckEnemyQuarterHP
-	jr nc, .asm_38877
-
-	call AICheckEnemyHalfHP
-	jr c, .asm_38834
-
-	call AICompareSpeed
-	jr nc, .asm_38877
-
-.asm_38834
-	ld a, [PlayerEvaLevel]
-	cp $a
-	jr nc, .asm_3887a
-	cp $8
-	jr nc, .asm_38875
-
-	ld a, [EnemyAccLevel]
-	cp $5
-	jr c, .asm_3887a
-	cp $7
-	jr c, .asm_38875
-
-	ld hl, EnemyMonMoves
-	ld c, EnemyMonMovesEnd - EnemyMonMoves + 1
-.asm_3884f
-	dec c
-	jr z, .asm_38877
-
-	ld a, [hli]
-	and a
-	jr z, .asm_38877
-
-	call AIGetEnemyMove
-
-	ld a, [wEnemyMoveStruct + MOVE_ACC]
-	cp 180
-	jr nc, .asm_3884f
-
-	ld a, $1
-	ld [hBattleTurn], a
-
-	push hl
-	push bc
-	farcall BattleCheckTypeMatchup
-	ld a, [wd265]
-	cp $a
-	pop bc
-	pop hl
-	jr c, .asm_3884f
-
-.asm_38875
-	pop hl
-	ret
-
-.asm_38877
-	pop hl
-	inc [hl]
-	ret
-
-.asm_3887a
-	pop hl
-	call AI_50_50
-	ret c
-
-	dec [hl]
-	dec [hl]
-	ret
-
-.asm_38882
-	push hl
-	ld hl, Buffer1 - 1
-	ld de, EnemyMonMoves
-	ld c, EnemyMonMovesEnd - EnemyMonMoves + 1
-
-.asm_3888b
-	inc hl
-	dec c
-	jr z, .asm_388a2
-
-	ld a, [de]
-	and a
-	jr z, .asm_388a2
-
-	inc de
-	call AIGetEnemyMove
-
-	ld a, [wEnemyMoveStruct + MOVE_ACC]
-	cp 180
-	jr nc, .asm_3888b
-
-	dec [hl]
-	dec [hl]
-	jr .asm_3888b
-
-.asm_388a2
-	pop hl
-	jp AIDiscourageMove
-; 388a6
-
-
-AI_Smart_Selfdestruct: ; 388a6
-; Selfdestruct, Explosion
-
-; Unless this is the enemy's last Pokemon...
-	push hl
-	farcall FindAliveEnemyMons
-	pop hl
-	jr nc, .asm_388b7
-
-; ...greatly discourage this move unless this is the player's last Pokemon too.
-	push hl
-	call AICheckLastPlayerMon
-	pop hl
-	jr nz, .asm_388c6
-
-.asm_388b7
-; Greatly discourage this move if enemy's HP is above 50%.
-	call AICheckEnemyHalfHP
-	jr c, .asm_388c6
-
-; Do nothing if enemy's HP is below 25%.
-	call AICheckEnemyQuarterHP
-	ret nc
-
-; If enemy's HP is between 25% and 50%,
-; over 90% chance to greatly discourage this move.
-	call Random
-	cp 9 percent - 2
-	ret c
-
-.asm_388c6
-	inc [hl]
-	inc [hl]
-	inc [hl]
-	ret
-; 388ca
-
-
-AI_Smart_DreamEater: ; 388ca
-; 90% chance to greatly encourage this move.
-; The AI_Basic layer will make sure that
-; Dream Eater is only used against sleeping targets.
-	call Random
-	cp 10 percent
-	ret c
-	dec [hl]
-	dec [hl]
-	dec [hl]
-	ret
-; 388d4
-
-
-AI_Smart_EvasionUp: ; 388d4
-
-; Dismiss this move if enemy's evasion can't raise anymore.
-	ld a, [EnemyEvaLevel]
-	cp $d
-	jp nc, AIDiscourageMove
-
-; If enemy's HP is full...
-	call AICheckEnemyMaxHP
-	jr nc, .asm_388f2
-
-; ...greatly encourage this move if player is badly poisoned.
-	ld a, [PlayerSubStatus5]
-	bit SUBSTATUS_TOXIC, a
-	jr nz, .asm_388ef
-
-; ...70% chance to greatly encourage this move if player is not badly poisoned.
-	call Random
-	cp 70 percent
-	jr nc, .asm_38911
-
-.asm_388ef
-	dec [hl]
-	dec [hl]
-	ret
-
-.asm_388f2
-
-; Greatly discourage this move if enemy's HP is below 25%.
-	call AICheckEnemyQuarterHP
-	jr nc, .asm_3890f
-
-; If enemy's HP is above 25% but not full, 4% chance to greatly encourage this move.
-	call Random
-	cp 4 percent
-	jr c, .asm_388ef
-
-; If enemy's HP is between 25% and 50%,...
-	call AICheckEnemyHalfHP
-	jr nc, .asm_3890a
-
-; If enemy's HP is above 50% but not full, 20% chance to greatly encourage this move.
-	call AI_80_20
-	jr c, .asm_388ef
-	jr .asm_38911
-
-.asm_3890a
-; ...50% chance to greatly discourage this move.
-	call AI_50_50
-	jr c, .asm_38911
-
-.asm_3890f
-	inc [hl]
-	inc [hl]
-
-; 30% chance to end up here if enemy's HP is full and player is not badly poisoned.
-; 77% chance to end up here if enemy's HP is above 50% but not full.
-; 96% chance to end up here if enemy's HP is between 25% and 50%.
-; 100% chance to end up here if enemy's HP is below 25%.
-; In other words, we only end up here if the move has not been encouraged or dismissed.
-.asm_38911
-	ld a, [PlayerSubStatus5]
-	bit SUBSTATUS_TOXIC, a
-	jr nz, .asm_38938
-
-	ld a, [PlayerSubStatus4]
-	bit SUBSTATUS_LEECH_SEED, a
-	jr nz, .asm_38941
-
-; Discourage this move if enemy's evasion level is higher than player's accuracy level.
-	ld a, [EnemyEvaLevel]
-	ld b, a
-	ld a, [PlayerAccLevel]
-	cp b
-	jr c, .asm_38936
-
-; Greatly encourage this move if the player is in the middle of Fury Cutter or Rollout.
-	ld a, [PlayerFuryCutterCount]
-	and a
-	jr nz, .asm_388ef
-
-	ld a, [PlayerSubStatus1]
-	bit SUBSTATUS_ROLLOUT, a
-	jr nz, .asm_388ef
-
-
-.asm_38936
-	inc [hl]
-	ret
-
-; Player is badly poisoned.
-; 70% chance to greatly encourage this move.
-; This would counter any previous discouragement.
-.asm_38938
-	call Random
-	cp 31 percent + 1
-	ret c
-	dec [hl]
-	dec [hl]
-	ret
-
-; Player is seeded.
-; 50% chance to encourage this move.
-; This would partly counter any previous discouragement.
-.asm_38941
-	call AI_50_50
-	ret c
-
-	dec [hl]
-	ret
-; 38947
-
-
-AI_Smart_AlwaysHit: ; 38947
-; 80% chance to greatly encourage this move if either...
-
-; ...enemy's accuracy level has been lowered three or more stages
-	ld a, [EnemyAccLevel]
-	cp $5
-	jr c, .asm_38954
-
-; ...or player's evasion level has been raised three or more stages.
-	ld a, [PlayerEvaLevel]
-	cp $a
-	ret c
-
-.asm_38954
-	call AI_80_20
-	ret c
-
-	dec [hl]
-	dec [hl]
-	ret
-; 3895b
-
-
-AI_Smart_MirrorMove: ; 3895b
-
-; If the player did not use any move last turn...
-	ld a, [LastPlayerCounterMove]
-	and a
-	jr nz, .asm_38968
-
-; ...do nothing if enemy is slower than player
-	call AICompareSpeed
-	ret nc
-
-; ...or dismiss this move if enemy is faster than player.
-	jp AIDiscourageMove
-
-; If the player did use a move last turn...
-.asm_38968
-	push hl
-	ld hl, UsefulMoves
-	ld de, 1
-	call IsInArray
-	pop hl
-
-; ...do nothing if he didn't use a useful move.
-	ret nc
-
-; If he did, 50% chance to encourage this move...
-	call AI_50_50
-	ret c
-
-	dec [hl]
-
-; ...and 90% chance to encourage this move again if the enemy is faster.
-	call AICompareSpeed
-	ret nc
-
-	call Random
-	cp 10 percent
-	ret c
-
-	dec [hl]
-	ret
-; 38985
-
-
-AI_Smart_AccuracyDown: ; 38985
-
-; If player's HP is full...
-	call AICheckPlayerMaxHP
-	jr nc, .asm_389a0
-
-; ...and enemy's HP is above 50%...
-	call AICheckEnemyHalfHP
-	jr nc, .asm_389a0
-
-; ...greatly encourage this move if player is badly poisoned.
-	ld a, [PlayerSubStatus5]
-	bit SUBSTATUS_TOXIC, a
-	jr nz, .asm_3899d
-
-; ...70% chance to greatly encourage this move if player is not badly poisoned.
-	call Random
-	cp 70 percent
-	jr nc, .asm_389bf
-
-.asm_3899d
-	dec [hl]
-	dec [hl]
-	ret
-
-.asm_389a0
-
-; Greatly discourage this move if player's HP is below 25%.
-	call AICheckPlayerQuarterHP
-	jr nc, .asm_389bd
-
-; If player's HP is above 25% but not full, 4% chance to greatly encourage this move.
-	call Random
-	cp 4 percent
-	jr c, .asm_3899d
-
-; If player's HP is between 25% and 50%,...
-	call AICheckPlayerHalfHP
-	jr nc, .asm_389b8
-
-; If player's HP is above 50% but not full, 20% chance to greatly encourage this move.
-	call AI_80_20
-	jr c, .asm_3899d
-	jr .asm_389bf
-
-; ...50% chance to greatly discourage this move.
-.asm_389b8
-	call AI_50_50
-	jr c, .asm_389bf
-
-.asm_389bd
-	inc [hl]
-	inc [hl]
-
-; We only end up here if the move has not been already encouraged.
-.asm_389bf
-	ld a, [PlayerSubStatus5]
-	bit SUBSTATUS_TOXIC, a
-	jr nz, .asm_389e6
-
-	ld a, [PlayerSubStatus4]
-	bit SUBSTATUS_LEECH_SEED, a
-	jr nz, .asm_389ef
-
-; Discourage this move if enemy's evasion level is higher than player's accuracy level.
-	ld a, [EnemyEvaLevel]
-	ld b, a
-	ld a, [PlayerAccLevel]
-	cp b
-	jr c, .asm_389e4
-
-; Greatly encourage this move if the player is in the middle of Fury Cutter or Rollout.
-	ld a, [PlayerFuryCutterCount]
-	and a
-	jr nz, .asm_3899d
-
-	ld a, [PlayerSubStatus1]
-	bit SUBSTATUS_ROLLOUT, a
-	jr nz, .asm_3899d
-
-.asm_389e4
-	inc [hl]
-	ret
-
-; Player is badly poisoned.
-; 70% chance to greatly encourage this move.
-; This would counter any previous discouragement.
-.asm_389e6
-	call Random
-	cp 31 percent + 1
-	ret c
-	dec [hl]
-	dec [hl]
-	ret
-
-; Player is seeded.
-; 50% chance to encourage this move.
-; This would partly counter any previous discouragement.
-.asm_389ef
-	call AI_50_50
-	ret c
-
-	dec [hl]
-	ret
-; 389f5
-
-
-AI_Smart_ResetStats: ; 389f5
-
-; 85% chance to encourage this move if any of enemy's stat levels is lower than -2.
-	push hl
-	ld hl, EnemyAtkLevel
-	ld c, $8
-.asm_389fb
-	dec c
-	jr z, .asm_38a05
-	ld a, [hli]
-	cp $5
-	jr c, .asm_38a12
-	jr .asm_389fb
-
-; 85% chance to encourage this move if any of player's stat levels is higher than +2.
-.asm_38a05
-	ld hl, PlayerAtkLevel
-	ld c, $8
-.asm_38a0a
-	dec c
-	jr z, .asm_38a1b
-	ld a, [hli]
-	cp $a
-	jr c, .asm_38a0a
-
-.asm_38a12
-	pop hl
-	call Random
-	cp 16 percent
-	ret c
-	dec [hl]
-	ret
-
-; Discourage this move if neither:
-; Any of enemy's stat levels is	lower than -2.
-; Any of player's stat levels is higher than +2.
-.asm_38a1b
-	pop hl
-	inc [hl]
-	ret
-; 38a1e
-
-
-AI_Smart_Bide: ; 38a1e
-; 90% chance to discourage this move unless enemy's HP is full.
-
-	call AICheckEnemyMaxHP
-	ret c
-	call Random
-	cp 10 percent
-	ret c
-	inc [hl]
-	ret
-; 38a2a
-
-
-AI_Smart_ForceSwitch: ; 38a2a
-; Whirlwind, Roar.
-
-; Discourage this move if the player has not shown
-; a super-effective move against the enemy.
-; Consider player's type(s) if its moves are unknown.
-
-	push hl
-	callfar CheckPlayerMoveTypeMatchups
-	ld a, [wEnemyAISwitchScore]
-	cp 10 ; neutral
-	pop hl
-	ret c
-	inc [hl]
-	ret
-; 38a3a
-
-
-AI_Smart_Heal:
-AI_Smart_MorningSun:
-AI_Smart_Synthesis:
-AI_Smart_Moonlight: ; 38a3a
-; 90% chance to greatly encourage this move if enemy's HP is below 25%.
-; Discourage this move if enemy's HP is higher than 50%.
-; Do nothing otherwise.
-
-	call AICheckEnemyQuarterHP
-	jr nc, .asm_38a45
-	call AICheckEnemyHalfHP
-	ret nc
-	inc [hl]
-	ret
-
-.asm_38a45
-	call Random
-	cp 10 percent
-	ret c
-	dec [hl]
-	dec [hl]
-	ret
-; 38a4e
-
-
-AI_Smart_Toxic:
-AI_Smart_LeechSeed: ; 38a4e
-; Discourage this move if player's HP is below 50%.
-
-	call AICheckPlayerHalfHP
-	ret c
-	inc [hl]
-	ret
-; 38a54
-
-
-AI_Smart_LightScreen:
-AI_Smart_Reflect: ; 38a54
-; Over 90% chance to discourage this move unless enemy's HP is full.
-
-	call AICheckEnemyMaxHP
-	ret c
-	call Random
-	cp 8 percent
-	ret c
-	inc [hl]
-	ret
-; 38a60
-
-
-AI_Smart_Ohko: ; 38a60
-; Dismiss this move if player's level is higher than enemy's level.
-; Else, discourage this move is player's HP is below 50%.
-
-	ld a, [BattleMonLevel]
-	ld b, a
-	ld a, [EnemyMonLevel]
-	cp b
-	jp c, AIDiscourageMove
-	call AICheckPlayerHalfHP
-	ret c
-	inc [hl]
-	ret
-; 38a71
-
-
-AI_Smart_TrapTarget: ; 38a71
-; Bind, Wrap, Fire Spin, Clamp
-
-; 50% chance to discourage this move if the player is already trapped.
-	ld a, [wPlayerWrapCount]
-	and a
-	jr nz, .asm_38a8b
-
-; 50% chance to greatly encourage this move if player is either
-; badly poisoned, in love, identified, stuck in Rollout, or has a Nightmare.
-	ld a, [PlayerSubStatus5]
-	bit SUBSTATUS_TOXIC, a
-	jr nz, .asm_38a91
-
-	ld a, [PlayerSubStatus1]
-	and 1<<SUBSTATUS_IN_LOVE | 1<<SUBSTATUS_ROLLOUT | 1<<SUBSTATUS_IDENTIFIED | 1<<SUBSTATUS_NIGHTMARE
-	jr nz, .asm_38a91
-
-; Else, 50% chance to greatly encourage this move if it's the player's Pokemon first turn.
-	ld a, [PlayerTurnsTaken]
-	and a
-	jr z, .asm_38a91
-
-; 50% chance to discourage this move otherwise.
-.asm_38a8b
-	call AI_50_50
-	ret c
-	inc [hl]
-	ret
-
-.asm_38a91
-	call AICheckEnemyQuarterHP
-	ret nc
-	call AI_50_50
-	ret c
-	dec [hl]
-	dec [hl]
-	ret
-; 38a9c
-
-
-AI_Smart_RazorWind:
-AI_Smart_Unused2B: ; 38a9c
-	ld a, [EnemySubStatus1]
-	bit SUBSTATUS_PERISH, a
-	jr z, .asm_38aaa
-
-	ld a, [EnemyPerishCount]
-	cp 3
-	jr c, .asm_38ad3
-
-.asm_38aaa
-	push hl
-	ld hl, PlayerUsedMoves
-	ld c, 4
-
-.asm_38ab0
-	ld a, [hli]
-	and a
-	jr z, .asm_38ac1
-
-	call AIGetEnemyMove
-
-	ld a, [wEnemyMoveStruct + MOVE_EFFECT]
-	cp EFFECT_PROTECT
-	jr z, .asm_38ad5
-	dec c
-	jr nz, .asm_38ab0
-
-.asm_38ac1
-	pop hl
-	ld a, [EnemySubStatus3]
-	bit SUBSTATUS_CONFUSED, a
-	jr nz, .asm_38acd
-
-	call AICheckEnemyHalfHP
-	ret c
-
-.asm_38acd
-	call Random
-	cp 79 percent - 1
-	ret c
-
-.asm_38ad3
-	inc [hl]
-	ret
-
-.asm_38ad5
-	pop hl
-	ld a, [hl]
-	add 6
-	ld [hl], a
-	ret
-; 38adb
-
-
-AI_Smart_Confuse: ; 38adb
-
-; 90% chance to discourage this move if player's HP is between 25% and 50%.
-	call AICheckPlayerHalfHP
-	ret c
-	call Random
-	cp 10 percent
-	jr c, .asm_38ae7
-	inc [hl]
-
-.asm_38ae7
-; Discourage again if player's HP is below 25%.
-	call AICheckPlayerQuarterHP
-	ret c
-	inc [hl]
-	ret
-; 38aed
-
-
-AI_Smart_SpDefenseUp2: ; 38aed
-
-; Discourage this move if enemy's HP is lower than 50%.
-	call AICheckEnemyHalfHP
-	jr nc, .asm_38b10
-
-; Discourage this move if enemy's special defense level is higher than +3.
-	ld a, [EnemySDefLevel]
-	cp $b
-	jr nc, .asm_38b10
-
-; 80% chance to greatly encourage this move if
-; enemy's Special Defense level is lower than +2, and the player is of a special type.
-	cp $9
-	ret nc
-
-	ld a, [BattleMonType1]
-	cp SPECIAL
-	jr nc, .asm_38b09
-	ld a, [BattleMonType2]
-	cp SPECIAL
-	ret c
-
-.asm_38b09
-	call AI_80_20
-	ret c
-	dec [hl]
-	dec [hl]
-	ret
-
-.asm_38b10
-	inc [hl]
-	ret
-; 38b12
-
-
-AI_Smart_Fly: ; 38b12
-; Fly, Dig
-
-; Greatly encourage this move if the player is
-; flying or underground, and slower than the enemy.
-
-	ld a, [PlayerSubStatus3]
-	and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
-	ret z
-
-	call AICompareSpeed
-	ret nc
-
-	dec [hl]
-	dec [hl]
-	dec [hl]
-	ret
-; 38b20
-
-
-AI_Smart_SuperFang: ; 38b20
-; Discourage this move if player's HP is below 25%.
-
-	call AICheckPlayerQuarterHP
-	ret c
-	inc [hl]
-	ret
-; 38b26
-
-
-AI_Smart_Paralyze: ; 38b26
-
-; 50% chance to discourage this move if player's HP is below 25%.
-	call AICheckPlayerQuarterHP
-	jr nc, .asm_38b3a
-
-; 80% chance to greatly encourage this move
-; if enemy is slower than player and its HP is above 25%.
-	call AICompareSpeed
-	ret c
-	call AICheckEnemyQuarterHP
-	ret nc
-	call AI_80_20
-	ret c
-	dec [hl]
-	dec [hl]
-	ret
-
-.asm_38b3a
-	call AI_50_50
-	ret c
-	inc [hl]
-	ret
-; 38b40
-
-
-AI_Smart_SpeedDownHit: ; 38b40
-; Icy Wind
-
-; Almost 90% chance to greatly encourage this move if the following conditions all meet:
-; Enemy's HP is higher than 25%.
-; It's the first turn of player's Pokemon.
-; Player is faster than enemy.
-
-	ld a, [wEnemyMoveStruct + MOVE_ANIM]
-	cp ICY_WIND
-	ret nz
-	call AICheckEnemyQuarterHP
-	ret nc
-	ld a, [PlayerTurnsTaken]
-	and a
-	ret nz
-	call AICompareSpeed
-	ret c
-	call Random
-	cp 12 percent
-	ret c
-	dec [hl]
-	dec [hl]
-	ret
-; 38b5c
-
-
-AI_Smart_Substitute: ; 38b5c
-; Dismiss this move if enemy's HP is below 50%.
-
-	call AICheckEnemyHalfHP
-	ret c
-	jp AIDiscourageMove
-; 38b63
-
-
-AI_Smart_HyperBeam: ; 38b63
-	call AICheckEnemyHalfHP
-	jr c, .asm_38b72
-
-; 50% chance to encourage this move if enemy's HP is below 25%.
-	call AICheckEnemyQuarterHP
-	ret c
-	call AI_50_50
-	ret c
-	dec [hl]
-	ret
-
-.asm_38b72
-; If enemy's HP is above 50%, discourage this move at random
-	call Random
-	cp 16 percent
-	ret c
-	inc [hl]
-	call AI_50_50
-	ret c
-	inc [hl]
-	ret
-; 38b7f
-
-
-AI_Smart_Rage: ; 38b7f
-	ld a, [EnemySubStatus4]
-	bit SUBSTATUS_RAGE, a
-	jr z, .asm_38b9b
-
-; If enemy's Rage is building, 50% chance to encourage this move.
-	call AI_50_50
-	jr c, .asm_38b8c
-
-	dec [hl]
-
-; Encourage this move based on Rage's counter.
-.asm_38b8c
-	ld a, [wEnemyRageCounter]
-	cp $2
-	ret c
-	dec [hl]
-	ld a, [wEnemyRageCounter]
-	cp $3
-	ret c
-	dec [hl]
-	ret
-
-.asm_38b9b
-; If enemy's Rage is not building, discourage this move if enemy's HP is below 50%.
-	call AICheckEnemyHalfHP
-	jr nc, .asm_38ba6
-
-; 50% chance to encourage this move otherwise.
-	call AI_80_20
-	ret nc
-	dec [hl]
-	ret
-
-.asm_38ba6
-	inc [hl]
-	ret
-; 38ba8
-
-
-AI_Smart_Mimic: ; 38ba8
-	ld a, [LastPlayerCounterMove]
-	and a
-	jr z, .asm_38be9
-
-	call AICheckEnemyHalfHP
-	jr nc, .asm_38bef
-
-	push hl
-	ld a, [LastPlayerCounterMove]
-	call AIGetEnemyMove
-
-	ld a, $1
-	ld [hBattleTurn], a
-	callfar BattleCheckTypeMatchup
-
-	ld a, [wd265]
-	cp $a
-	pop hl
-	jr c, .asm_38bef
-	jr z, .asm_38bd4
-
-	call AI_50_50
-	jr c, .asm_38bd4
-
-	dec [hl]
-
-.asm_38bd4
-	ld a, [LastPlayerCounterMove]
-	push hl
-	ld hl, UsefulMoves
-	ld de, 1
-	call IsInArray
-
-	pop hl
-	ret nc
-	call AI_50_50
-	ret c
-	dec [hl]
-	ret
-
-.asm_38be9
-	call AICompareSpeed
-	jp c, AIDiscourageMove
-
-.asm_38bef
-	inc [hl]
-	ret
-; 38bf1
-
-
-AI_Smart_Counter: ; 38bf1
-	push hl
-	ld hl, PlayerUsedMoves
-	ld c, 4
-	ld b, 0
-
-.asm_38bf9
-	ld a, [hli]
-	and a
-	jr z, .asm_38c0e
-
-	call AIGetEnemyMove
-
-	ld a, [wEnemyMoveStruct + MOVE_POWER]
-	and a
-	jr z, .asm_38c0e
-
-	ld a, [wEnemyMoveStruct + MOVE_TYPE]
-	cp SPECIAL
-	jr nc, .asm_38c0e
-
-	inc b
-
-.asm_38c0e
-	dec c
-	jr nz, .asm_38bf9
-
-	pop hl
-	ld a, b
-	and a
-	jr z, .asm_38c39
-
-	cp $3
-	jr nc, .asm_38c30
-
-	ld a, [LastPlayerCounterMove]
-	and a
-	jr z, .asm_38c38
-
-	call AIGetEnemyMove
-
-	ld a, [wEnemyMoveStruct + MOVE_POWER]
-	and a
-	jr z, .asm_38c38
-
-	ld a, [wEnemyMoveStruct + MOVE_TYPE]
-	cp SPECIAL
-	jr nc, .asm_38c38
-
-
-.asm_38c30
-	call Random
-	cp 39 percent + 1
-	jr c, .asm_38c38
-
-	dec [hl]
-
-.asm_38c38
-	ret
-
-.asm_38c39
-	inc [hl]
-	ret
-; 38c3b
-
-
-AI_Smart_Encore: ; 38c3b
-	call AICompareSpeed
-	jr nc, .asm_38c81
-
-	ld a, [LastPlayerMove]
-	and a
-	jp z, AIDiscourageMove
-
-	call AIGetEnemyMove
-
-	ld a, [wEnemyMoveStruct + MOVE_POWER]
-	and a
-	jr z, .asm_38c68
-
-	push hl
-	ld a, [wEnemyMoveStruct + MOVE_TYPE]
-	ld hl, EnemyMonType1
-	predef CheckTypeMatchup
-
-	pop hl
-	ld a, [wd265]
-	cp $a
-	jr nc, .asm_38c68
-
-	and a
-	ret nz
-	jr .asm_38c78
-
-.asm_38c68
-	push hl
-	ld a, [LastPlayerCounterMove]
-	ld hl, .EncoreMoves
-	ld de, 1
-	call IsInArray
-	pop hl
-	jr nc, .asm_38c81
-
-.asm_38c78
-	call Random
-	cp 28 percent - 1
-	ret c
-	dec [hl]
-	dec [hl]
-	ret
-
-.asm_38c81
-	inc [hl]
-	inc [hl]
-	inc [hl]
-	ret
-
-.EncoreMoves:
-	db SWORDS_DANCE
-	db WHIRLWIND
-	db LEER
-	db ROAR
-	db DISABLE
-	db MIST
-	db LEECH_SEED
-	db GROWTH
-	db POISONPOWDER
-	db STRING_SHOT
-	db MEDITATE
-	db AGILITY
-	db TELEPORT
-	db SCREECH
-	db HAZE
-	db FOCUS_ENERGY
-	db DREAM_EATER
-	db POISON_GAS
-	db SPLASH
-	db SHARPEN
-	db CONVERSION
-	db SUPER_FANG
-	db SUBSTITUTE
-	db TRIPLE_KICK
-	db SPIDER_WEB
-	db MIND_READER
-	db FLAME_WHEEL
-	db AEROBLAST
-	db COTTON_SPORE
-	db POWDER_SNOW
-	db $ff
-; 38ca4
-
-
-AI_Smart_PainSplit: ; 38ca4
-; Discourage this move if [enemy's current HP * 2 > player's current HP].
-
-	push hl
-	ld hl, EnemyMonHP
-	ld b, [hl]
-	inc hl
-	ld c, [hl]
-	sla c
-	rl b
-	ld hl, BattleMonHP + 1
-	ld a, [hld]
-	cp c
-	ld a, [hl]
-	sbc b
-	pop hl
-	ret nc
-	inc [hl]
-	ret
-; 38cba
-
-
-AI_Smart_Snore:
-AI_Smart_SleepTalk: ; 38cba
-; Greatly encourage this move if enemy is fast asleep.
-; Greatly discourage this move otherwise.
-
-	ld a, [EnemyMonStatus]
-	and $7
-	cp $1
-	jr z, .asm_38cc7
-
-	dec [hl]
-	dec [hl]
-	dec [hl]
-	ret
-
-.asm_38cc7
-	inc [hl]
-	inc [hl]
-	inc [hl]
-	ret
-; 38ccb
-
-
-AI_Smart_DefrostOpponent: ; 38ccb
-; Greatly encourage this move if enemy is frozen.
-; No move has EFFECT_DEFROST_OPPONENT, so this layer is unused.
-
-	ld a, [EnemyMonStatus]
-	and $20
-	ret z
-	dec [hl]
-	dec [hl]
-	dec [hl]
-	ret
-; 38cd5
-
-
-AI_Smart_Spite: ; 38cd5
-	ld a, [LastPlayerCounterMove]
-	and a
-	jr nz, .asm_38ce7
-
-	call AICompareSpeed
-	jp c, AIDiscourageMove
-
-	call AI_50_50
-	ret c
-	inc [hl]
-	ret
-
-.asm_38ce7
-	push hl
-	ld b, a
-	ld c, 4
-	ld hl, BattleMonMoves
-	ld de, BattleMonPP
-
-.asm_38cf1
-	ld a, [hli]
-	cp b
-	jr z, .asm_38cfb
-
-	inc de
-	dec c
-	jr nz, .asm_38cf1
-
-	pop hl
-	ret
-
-.asm_38cfb
-	pop hl
-	ld a, [de]
-	cp $6
-	jr c, .asm_38d0d
-	cp $f
-	jr nc, .asm_38d0b
-
-	call Random
-	cp 39 percent + 1
-	ret nc
-
-.asm_38d0b
-	inc [hl]
-	ret
-
-.asm_38d0d
-	call Random
-	cp 39 percent + 1
-	ret c
-	dec [hl]
-	dec [hl]
-	ret
-; 38d16
-
-
-Function_0x38d16; 38d16
-	jp AIDiscourageMove
-; 38d19
-
-
-AI_Smart_DestinyBond:
-AI_Smart_Reversal:
-AI_Smart_SkullBash: ; 38d19
-; Discourage this move if enemy's HP is above 25%.
-
-	call AICheckEnemyQuarterHP
-	ret nc
-	inc [hl]
-	ret
-; 38d1f
-
-
-AI_Smart_HealBell: ; 38d1f
-; Dismiss this move if none of the opponent's Pokemon is statused.
-; Encourage this move if the enemy is statused.
-; 50% chance to greatly encourage this move if the enemy is fast asleep or frozen.
-
-	push hl
-	ld a, [OTPartyCount]
-	ld b, a
-	ld c, 0
-	ld hl, OTPartyMon1HP
-	ld de, PARTYMON_STRUCT_LENGTH
-
-.loop
-	push hl
-	ld a, [hli]
-	or [hl]
-	jr z, .next
-
-	; status
-	dec hl
-	dec hl
-	dec hl
-	ld a, [hl]
-	or c
-	ld c, a
-
-.next
-	pop hl
-	add hl, de
-	dec b
-	jr nz, .loop
-
-	pop hl
-	ld a, c
-	and a
-	jr z, .no_status
-
-	ld a, [EnemyMonStatus]
-	and a
-	jr z, .ok
-	dec [hl]
-.ok
-	and 1 << FRZ | SLP
-	ret z
-	call AI_50_50
-	ret c
-	dec [hl]
-	dec [hl]
-	ret
-
-.no_status
-	ld a, [EnemyMonStatus]
-	and a
-	ret nz
-	jp AIDiscourageMove
-
-; 38d5a
-
-
-AI_Smart_PriorityHit: ; 38d5a
-	call AICompareSpeed
-	ret c
-
-; Dismiss this move if the player is flying or underground.
-	ld a, [PlayerSubStatus3]
-	and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
-	jp nz, AIDiscourageMove
-
-; Greatly encourage this move if it will KO the player.
-	ld a, $1
-	ld [hBattleTurn], a
-	push hl
-	callfar EnemyAttackDamage
-	callfar BattleCommand_DamageCalc
-	callfar BattleCommand_Stab
-	pop hl
-	ld a, [CurDamage + 1]
-	ld c, a
-	ld a, [CurDamage]
-	ld b, a
-	ld a, [BattleMonHP + 1]
-	cp c
-	ld a, [BattleMonHP]
-	sbc b
-	ret nc
-	dec [hl]
-	dec [hl]
-	dec [hl]
-	ret
-; 38d93
-
-
-AI_Smart_Thief: ; 38d93
-; Don't use Thief unless it's the only move available.
-
-	ld a, [hl]
-	add $1e
-	ld [hl], a
-	ret
-; 38d98
-
-
-AI_Smart_Conversion2: ; 38d98
-	ld a, [LastPlayerMove]
-	and a
-	jr nz, .asm_38dc9
-
-	push hl
-	dec a
-	ld hl, Moves + MOVE_TYPE
-	ld bc, MOVE_LENGTH
-	call AddNTimes
-
-	ld a, BANK(Moves)
-	call GetFarByte
-	ld [wPlayerMoveStruct + MOVE_TYPE], a
-
-	xor a
-	ld [hBattleTurn], a
-
-	callfar BattleCheckTypeMatchup
-
-	ld a, [wd265]
-	cp $a
-	pop hl
-	jr c, .asm_38dc9
-	ret z
-
-	call AI_50_50
-	ret c
-
-	dec [hl]
-	ret
-
-.asm_38dc9
-	call Random
-	cp 10 percent
-	ret c
-	inc [hl]
-	ret
-; 38dd1
-
-
-AI_Smart_Disable: ; 38dd1
-	call AICompareSpeed
-	jr nc, .asm_38df3
-
-	push hl
-	ld a, [LastPlayerCounterMove]
-	ld hl, UsefulMoves
-	ld de, 1
-	call IsInArray
-
-	pop hl
-	jr nc, .asm_38dee
-
-	call Random
-	cp 39 percent + 1
-	ret c
-	dec [hl]
-	ret
-
-.asm_38dee
-	ld a, [wEnemyMoveStruct + MOVE_POWER]
-	and a
-	ret nz
-
-.asm_38df3
-	call Random
-	cp 8 percent
-	ret c
-	inc [hl]
-	ret
-; 38dfb
-
-
-AI_Smart_MeanLook: ; 38dfb
-	call AICheckEnemyHalfHP
-	jr nc, .asm_38e24
-
-	push hl
-	call AICheckLastPlayerMon
-	pop hl
-	jp z, AIDiscourageMove
-
-; 80% chance to greatly encourage this move if the enemy is badly poisoned (buggy).
-; Should check PlayerSubStatus5 instead.
-	ld a, [EnemySubStatus5]
-	bit SUBSTATUS_TOXIC, a
-	jr nz, .asm_38e26
-
-; 80% chance to greatly encourage this move if the player is either
-; in love, identified, stuck in Rollout, or has a Nightmare.
-	ld a, [PlayerSubStatus1]
-	and 1<<SUBSTATUS_IN_LOVE | 1<<SUBSTATUS_ROLLOUT | 1<<SUBSTATUS_IDENTIFIED | 1<<SUBSTATUS_NIGHTMARE
-	jr nz, .asm_38e26
-
-; Otherwise, discourage this move unless the player only has not very effective moves against the enemy.
-	push hl
-	callfar CheckPlayerMoveTypeMatchups
-	ld a, [wEnemyAISwitchScore]
-	cp $b ; not very effective
-	pop hl
-	ret nc
-
-.asm_38e24
-	inc [hl]
-	ret
-
-.asm_38e26
-	call AI_80_20
-	ret c
-	dec [hl]
-	dec [hl]
-	dec [hl]
-	ret
-; 38e2e
-
-
-AICheckLastPlayerMon: ; 38e2e
-	ld a, [PartyCount]
-	ld b, a
-	ld c, 0
-	ld hl, PartyMon1HP
-	ld de, PARTYMON_STRUCT_LENGTH
-
-.loop
-	ld a, [CurBattleMon]
-	cp c
-	jr z, .asm_38e44
-
-	ld a, [hli]
-	or [hl]
-	ret nz
-	dec hl
-
-.asm_38e44
-	add hl, de
-	inc c
-	dec b
-	jr nz, .loop
-
-	ret
-; 38e4a
-
-
-AI_Smart_Nightmare: ; 38e4a
-; 50% chance to encourage this move.
-; The AI_Basic layer will make sure that
-; Dream Eater is only used against sleeping targets.
-
-	call AI_50_50
-	ret c
-	dec [hl]
-	ret
-; 38e50
-
-
-AI_Smart_FlameWheel: ; 38e50
-; Use this move if the enemy is frozen.
-
-	ld a, [EnemyMonStatus]
-	bit FRZ, a
-	ret z
-rept 5
-	dec [hl]
-endr
-	ret
-; 38e5c
-
-
-AI_Smart_Curse: ; 38e5c
-	ld a, [EnemyMonType1]
-	cp GHOST
-	jr z, .ghostcurse
-	ld a, [EnemyMonType2]
-	cp GHOST
-	jr z, .ghostcurse
-
-	call AICheckEnemyHalfHP
-	jr nc, .asm_38e93
-
-	ld a, [EnemyAtkLevel]
-	cp $b
-	jr nc, .asm_38e93
-	cp $9
-	ret nc
-
-	ld a, [BattleMonType1]
-	cp GHOST
-	jr z, .asm_38e92
-	cp SPECIAL
-	ret nc
-	ld a, [BattleMonType2]
-	cp SPECIAL
-	ret nc
-	call AI_80_20
-	ret c
-	dec [hl]
-	dec [hl]
-	ret
-
-.asm_38e90
-	inc [hl]
-	inc [hl]
-.asm_38e92
-	inc [hl]
-.asm_38e93
-	inc [hl]
-	ret
-
-.ghostcurse
-	ld a, [PlayerSubStatus1]
-	bit SUBSTATUS_CURSE, a
-	jp nz, AIDiscourageMove
-
-	push hl
-	farcall FindAliveEnemyMons
-	pop hl
-	jr nc, .asm_38eb0
-
-	push hl
-	call AICheckLastPlayerMon
-	pop hl
-	jr nz, .asm_38e90
-
-	jr .asm_38eb7
-
-
-.asm_38eb0
-	push hl
-	call AICheckLastPlayerMon
-	pop hl
-	jr z, .asm_38ecb
-
-
-.asm_38eb7
-	call AICheckEnemyQuarterHP
-	jp nc, .asm_38e90
-
-	call AICheckEnemyHalfHP
-	jr nc, .asm_38e92
-
-	call AICheckEnemyMaxHP
-	ret nc
-
-	ld a, [PlayerTurnsTaken]
-	and a
-	ret nz
-
-.asm_38ecb
-	call AI_50_50
-	ret c
-
-	dec [hl]
-	dec [hl]
-	ret
-; 38ed2
-
-
-AI_Smart_Protect: ; 38ed2
-	ld a, [EnemyProtectCount]
-	and a
-	jr nz, .asm_38f13
-
-	ld a, [PlayerSubStatus5]
-	bit SUBSTATUS_LOCK_ON, a
-	jr nz, .asm_38f14
-
-	ld a, [PlayerFuryCutterCount]
-	cp 3
-	jr nc, .asm_38f0d
-
-	ld a, [PlayerSubStatus3]
-	bit SUBSTATUS_CHARGED, a
-	jr nz, .asm_38f0d
-
-	ld a, [PlayerSubStatus5]
-	bit SUBSTATUS_TOXIC, a
-	jr nz, .asm_38f0d
-	ld a, [PlayerSubStatus4]
-	bit SUBSTATUS_LEECH_SEED, a
-	jr nz, .asm_38f0d
-	ld a, [PlayerSubStatus1]
-	bit SUBSTATUS_CURSE, a
-	jr nz, .asm_38f0d
-
-	bit SUBSTATUS_ROLLOUT, a
-	jr z, .asm_38f14
-
-	ld a, [PlayerRolloutCount]
-	cp 3
-	jr c, .asm_38f14
-
-.asm_38f0d
-	call AI_80_20
-	ret c
-	dec [hl]
-	ret
-
-.asm_38f13
-	inc [hl]
-
-.asm_38f14
-	call Random
-	cp 8 percent
-	ret c
-	inc [hl]
-	inc [hl]
-	ret
-; 38f1d
-
-
-AI_Smart_Foresight: ; 38f1d
-	ld a, [EnemyAccLevel]
-	cp $5
-	jr c, .asm_38f41
-	ld a, [PlayerEvaLevel]
-	cp $a
-	jr nc, .asm_38f41
-
-	ld a, [BattleMonType1]
-	cp GHOST
-	jr z, .asm_38f41
-	ld a, [BattleMonType2]
-	cp GHOST
-	jr z, .asm_38f41
-
-	call Random
-	cp 8 percent
-	ret c
-	inc [hl]
-	ret
-
-.asm_38f41
-	call Random
-	cp 39 percent + 1
-	ret c
-	dec [hl]
-	dec [hl]
-	ret
-; 38f4a
-
-
-AI_Smart_PerishSong: ; 38f4a
-	push hl
-	callfar FindAliveEnemyMons
-	pop hl
-	jr c, .no
-
-	ld a, [PlayerSubStatus5]
-	bit SUBSTATUS_CANT_RUN, a
-	jr nz, .yes
-
-	push hl
-	callfar CheckPlayerMoveTypeMatchups
-	ld a, [wEnemyAISwitchScore]
-	cp 10 ; 1.0
-	pop hl
-	ret c
-
-	call AI_50_50
-	ret c
-
-	inc [hl]
-	ret
-
-.yes
-	call AI_50_50
-	ret c
-
-	dec [hl]
-	ret
-
-.no
-	ld a, [hl]
-	add 5
-	ld [hl], a
-	ret
-; 38f7a
-
-
-AI_Smart_Sandstorm: ; 38f7a
-
-; Greatly discourage this move if the player is immune to Sandstorm damage.
-	ld a, [BattleMonType1]
-	push hl
-	ld hl, .SandstormImmuneTypes
-	ld de, 1
-	call IsInArray
-	pop hl
-	jr c, .asm_38fa5
-
-	ld a, [BattleMonType2]
-	push hl
-	ld hl, .SandstormImmuneTypes
-	ld de, 1
-	call IsInArray
-	pop hl
-	jr c, .asm_38fa5
-
-; Discourage this move if player's HP is below 50%.
-	call AICheckPlayerHalfHP
-	jr nc, .asm_38fa6
-
-; 50% chance to encourage this move otherwise.
-	call AI_50_50
-	ret c
-
-	dec [hl]
-	ret
-
-.asm_38fa5
-	inc [hl]
-
-.asm_38fa6
-	inc [hl]
-	ret
-
-.SandstormImmuneTypes:
-	db ROCK
-	db GROUND
-	db STEEL
-	db $ff
-; 38fac
-
-
-AI_Smart_Endure: ; 38fac
-	ld a, [EnemyProtectCount]
-	and a
-	jr nz, .asm_38fd8
-
-	call AICheckEnemyMaxHP
-	jr c, .asm_38fd8
-
-	call AICheckEnemyQuarterHP
-	jr c, .asm_38fd9
-
-	ld b, EFFECT_REVERSAL
-	call AIHasMoveEffect
-	jr nc, .asm_38fcb
-
-	call AI_80_20
-	ret c
-
-	dec [hl]
-	dec [hl]
-	dec [hl]
-	ret
-
-.asm_38fcb
-	ld a, [EnemySubStatus5]
-	bit SUBSTATUS_LOCK_ON, a
-	ret z
-
-	call AI_50_50
-	ret c
-
-	dec [hl]
-	dec [hl]
-	ret
-
-.asm_38fd8
-	inc [hl]
-
-.asm_38fd9
-	inc [hl]
-	ret
-; 38fdb
-
-
-AI_Smart_FuryCutter: ; 38fdb
-; Encourage this move based on Fury Cutter's count.
-
-	ld a, [EnemyFuryCutterCount]
-	and a
-	jr z, .end
-	dec [hl]
-
-	cp 2
-	jr c, .end
-	dec [hl]
-	dec [hl]
-
-	cp 3
-	jr c, .end
-	dec [hl]
-	dec [hl]
-	dec [hl]
-
-.end
-
-	; fallthrough
-; 38fef
-
-
-AI_Smart_Rollout: ; 38fef
-; Rollout, Fury Cutter
-
-; 80% chance to discourage this move if the enemy is in love, confused, or paralyzed.
-	ld a, [EnemySubStatus1]
-	bit SUBSTATUS_IN_LOVE, a
-	jr nz, .asm_39020
-
-	ld a, [EnemySubStatus3]
-	bit SUBSTATUS_CONFUSED, a
-	jr nz, .asm_39020
-
-	ld a, [EnemyMonStatus]
-	bit PAR, a
-	jr nz, .asm_39020
-
-; 80% chance to discourage this move if the enemy's HP is below 25%,
-; or if accuracy or evasion modifiers favour the player.
-	call AICheckEnemyQuarterHP
-	jr nc, .asm_39020
-
-	ld a, [EnemyAccLevel]
-	cp 7
-	jr c, .asm_39020
-	ld a, [PlayerEvaLevel]
-	cp 8
-	jr nc, .asm_39020
-
-; Otherwise, 80% chance to greatly encourage this move.
-	call Random
-	cp 79 percent - 1
-	ret nc
-	dec [hl]
-	dec [hl]
-	ret
-
-.asm_39020
-	call AI_80_20
-	ret c
-	inc [hl]
-	ret
-; 39026
-
-
-AI_Smart_Swagger:
-AI_Smart_Attract: ; 39026
-; 80% chance to encourage this move during the first turn of player's Pokemon.
-; 80% chance to discourage this move otherwise.
-
-	ld a, [PlayerTurnsTaken]
-	and a
-	jr z, .first_turn
-
-	call AI_80_20
-	ret c
-	inc [hl]
-	ret
-
-.first_turn
-	call Random
-	cp 79 percent - 1
-	ret nc
-	dec [hl]
-	ret
-; 3903a
-
-
-AI_Smart_Safeguard: ; 3903a
-; 80% chance to discourage this move if player's HP is below 50%.
-
-	call AICheckPlayerHalfHP
-	ret c
-	call AI_80_20
-	ret c
-	inc [hl]
-	ret
-; 39044
-
-
-AI_Smart_Magnitude:
-AI_Smart_Earthquake: ; 39044
-
-; Greatly encourage this move if the player is underground and the enemy is faster.
-	ld a, [LastPlayerCounterMove]
-	cp DIG
-	ret nz
-
-	ld a, [PlayerSubStatus3]
-	bit SUBSTATUS_UNDERGROUND, a
-	jr z, .could_dig
-
-	call AICompareSpeed
-	ret nc
-	dec [hl]
-	dec [hl]
-	ret
-
-.could_dig
-	; Try to predict if the player will use Dig this turn.
-
-	; 50% chance to encourage this move if the enemy is slower than the player.
-	call AICompareSpeed
-	ret c
-
-	call AI_50_50
-	ret c
-
-	dec [hl]
-	ret
-; 39062
-
-
-AI_Smart_BatonPass: ; 39062
-; Discourage this move if the player hasn't shown super-effective moves against the enemy.
-; Consider player's type(s) if its moves are unknown.
-
-	push hl
-	callfar CheckPlayerMoveTypeMatchups
-	ld a, [wEnemyAISwitchScore]
-	cp 10 ; neutral
-	pop hl
-	ret c
-	inc [hl]
-	ret
-; 39072
-
-
-AI_Smart_Pursuit: ; 39072
-; 50% chance to greatly encourage this move if player's HP is below 25%.
-; 80% chance to discourage this move otherwise.
-
-	call AICheckPlayerQuarterHP
-	jr nc, .asm_3907d
-	call AI_80_20
-	ret c
-	inc [hl]
-	ret
-
-.asm_3907d
-	call AI_50_50
-	ret c
-	dec [hl]
-	dec [hl]
-	ret
-; 39084
-
-
-AI_Smart_RapidSpin: ; 39084
-; 80% chance to greatly encourage this move if the enemy is
-; trapped (Bind effect), seeded, or scattered with spikes.
-
-	ld a, [wEnemyWrapCount]
-	and a
-	jr nz, .asm_39097
-
-	ld a, [EnemySubStatus4]
-	bit SUBSTATUS_LEECH_SEED, a
-	jr nz, .asm_39097
-
-	ld a, [EnemyScreens]
-	bit SCREENS_SPIKES, a
-	ret z
-
-.asm_39097
-	call AI_80_20
-	ret c
-
-	dec [hl]
-	dec [hl]
-	ret
-; 3909e
-
-
-AI_Smart_HiddenPower: ; 3909e
-	push hl
-	ld a, 1
-	ld [hBattleTurn], a
-
-; Calculate Hidden Power's type and base power based on enemy's DVs.
-	callfar HiddenPowerDamage
-	callfar BattleCheckTypeMatchup
-	pop hl
-
-; Discourage Hidden Power if not very effective.
-	ld a, [wd265]
-	cp 10
-	jr c, .bad
-
-; Discourage Hidden Power if its base power	is lower than 50.
-	ld a, d
-	cp 50
-	jr c, .bad
-
-; Encourage Hidden Power if super-effective.
-	ld a, [wd265]
-	cp 11
-	jr nc, .good
-
-; Encourage Hidden Power if its base power is 70.
-	ld a, d
-	cp 70
-	ret c
-
-.good
-	dec [hl]
-	ret
-
-.bad
-	inc [hl]
-	ret
-; 390cb
-
-
-AI_Smart_RainDance: ; 390cb
-
-; Greatly discourage this move if it would favour the player type-wise.
-; Particularly, if the player is a Water-type.
-	ld a, [BattleMonType1]
-	cp WATER
-	jr z, AIBadWeatherType
-	cp FIRE
-	jr z, AIGoodWeatherType
-
-	ld a, [BattleMonType2]
-	cp WATER
-	jr z, AIBadWeatherType
-	cp FIRE
-	jr z, AIGoodWeatherType
-
-	push hl
-	ld hl, RainDanceMoves
-	jr AI_Smart_WeatherMove
-; 390e7
-
-RainDanceMoves: ; 390e7
-	db WATER_GUN
-	db HYDRO_PUMP
-	db SURF
-	db BUBBLEBEAM
-	db THUNDER
-	db WATERFALL
-	db CLAMP
-	db BUBBLE
-	db CRABHAMMER
-	db OCTAZOOKA
-	db WHIRLPOOL
-	db $ff
-; 390f3
-
-
-AI_Smart_SunnyDay: ; 390f3
-
-; Greatly discourage this move if it would favour the player type-wise.
-; Particularly, if the player is a Fire-type.
-	ld a, [BattleMonType1]
-	cp FIRE
-	jr z, AIBadWeatherType
-	cp WATER
-	jr z, AIGoodWeatherType
-
-	ld a, [BattleMonType2]
-	cp FIRE
-	jr z, AIBadWeatherType
-	cp WATER
-	jr z, AIGoodWeatherType
-
-	push hl
-	ld hl, SunnyDayMoves
-
-	; fallthrough
-; 3910d
-
-
-AI_Smart_WeatherMove: ; 3910d
-; Rain Dance, Sunny Day
-
-; Greatly discourage this move if the enemy doesn't have
-; one of the useful Rain Dance or Sunny Day moves.
-	call AIHasMoveInArray
-	pop hl
-	jr nc, AIBadWeatherType
-
-; Greatly discourage this move if player's HP is below 50%.
-	call AICheckPlayerHalfHP
-	jr nc, AIBadWeatherType
-
-; 50% chance to encourage this move otherwise.
-	call AI_50_50
-	ret c
-
-	dec [hl]
-	ret
-; 3911e
-
-AIBadWeatherType: ; 3911e
-	inc [hl]
-	inc [hl]
-	inc [hl]
-	ret
-; 39122
-
-AIGoodWeatherType: ; 39122
-; Rain Dance, Sunny Day
-
-; Greatly encourage this move if it would disfavour the player type-wise and player's HP is above 50%...
-	call AICheckPlayerHalfHP
-	ret nc
-
-; ...as long as one of the following conditions meet:
-; It's the first turn of the player's Pokemon.
-	ld a, [PlayerTurnsTaken]
-	and a
-	jr z, .good
-
-; Or it's the first turn of the enemy's Pokemon.
-	ld a, [EnemyTurnsTaken]
-	and a
-	ret nz
-
-.good
-	dec [hl]
-	dec [hl]
-	ret
-; 39134
-
-
-SunnyDayMoves: ; 39134
-	db FIRE_PUNCH
-	db EMBER
-	db FLAMETHROWER
-	db FIRE_SPIN
-	db FIRE_BLAST
-	db SACRED_FIRE
-	db MORNING_SUN
-	db SYNTHESIS
-	db $ff
-; 3913d
-
-
-AI_Smart_BellyDrum: ; 3913d
-; Dismiss this move if enemy's attack is higher than +2 or if enemy's HP is below 50%.
-; Else, discourage this move if enemy's HP is not full.
-
-	ld a, [EnemyAtkLevel]
-	cp $a
-	jr nc, .asm_3914d
-
-	call AICheckEnemyMaxHP
-	ret c
-
-	inc [hl]
-
-	call AICheckEnemyHalfHP
-	ret c
-
-.asm_3914d
-	ld a, [hl]
-	add $5
-	ld [hl], a
-	ret
-; 39152
-
-
-AI_Smart_PsychUp: ; 39152
-	push hl
-	ld hl, EnemyAtkLevel
-	ld b, $8
-	ld c, 100
-
-; Calculate the sum of all enemy's stat level modifiers. Add 100 first to prevent underflow.
-; Put the result in c. c will range between 58 and 142.
-.asm_3915a
-	ld a, [hli]
-	sub $7
-	add c
-	ld c, a
-	dec b
-	jr nz, .asm_3915a
-
-; Calculate the sum of all player's stat level modifiers. Add 100 first to prevent underflow.
-; Put the result in d. d will range between 58 and 142.
-	ld hl, PlayerAtkLevel
-	ld b, $8
-	ld d, 100
-
-.asm_39169
-	ld a, [hli]
-	sub $7
-	add d
-	ld d, a
-	dec b
-	jr nz, .asm_39169
-
-; Greatly discourage this move if enemy's stat levels are higher than player's (if c>=d).
-	ld a, c
-	sub d
-	pop hl
-	jr nc, .asm_39188
-
-; Else, 80% chance to encourage this move unless player's accuracy level is lower than -1...
-	ld a, [PlayerAccLevel]
-	cp $6
-	ret c
-
-; ...or enemy's evasion level is higher than +0.
-	ld a, [EnemyEvaLevel]
-	cp $8
-	ret nc
-
-	call AI_80_20
-	ret c
-
-	dec [hl]
-	ret
-
-.asm_39188
-	inc [hl]
-	inc [hl]
-	ret
-; 3918b
-
-
-AI_Smart_MirrorCoat: ; 3918b
-	push hl
-	ld hl, PlayerUsedMoves
-	ld c, $4
-	ld b, $0
-
-.asm_39193
-	ld a, [hli]
-	and a
-	jr z, .asm_391a8
-
-	call AIGetEnemyMove
-
-	ld a, [wEnemyMoveStruct + MOVE_POWER]
-	and a
-	jr z, .asm_391a8
-
-	ld a, [wEnemyMoveStruct + MOVE_TYPE]
-	cp SPECIAL
-	jr c, .asm_391a8
-
-	inc b
-
-.asm_391a8
-	dec c
-	jr nz, .asm_39193
-
-	pop hl
-	ld a, b
-	and a
-	jr z, .asm_391d3
-
-	cp $3
-	jr nc, .asm_391ca
-
-	ld a, [LastPlayerCounterMove]
-	and a
-	jr z, .asm_391d2
-
-	call AIGetEnemyMove
-
-	ld a, [wEnemyMoveStruct + MOVE_POWER]
-	and a
-	jr z, .asm_391d2
-
-	ld a, [wEnemyMoveStruct + MOVE_TYPE]
-	cp SPECIAL
-	jr c, .asm_391d2
-
-
-.asm_391ca
-	call Random
-	cp 100
-	jr c, .asm_391d2
-	dec [hl]
-
-.asm_391d2
-	ret
-
-.asm_391d3
-	inc [hl]
-	ret
-; 391d5
-
-
-AI_Smart_Twister:
-AI_Smart_Gust: ; 391d5
-
-; Greatly encourage this move if the player is flying and the enemy is faster.
-	ld a, [LastPlayerCounterMove]
-	cp FLY
-	ret nz
-
-	ld a, [PlayerSubStatus3]
-	bit SUBSTATUS_FLYING, a
-	jr z, .couldFly
-
-	call AICompareSpeed
-	ret nc
-
-	dec [hl]
-	dec [hl]
-	ret
-
-; Try to predict if the player will use Fly this turn.
-.couldFly
-
-; 50% chance to encourage this move if the enemy is slower than the player.
-	call AICompareSpeed
-	ret c
-	call AI_50_50
-	ret c
-	dec [hl]
-	ret
-; 391f3
-
-
-AI_Smart_FutureSight: ; 391f3
-; Greatly encourage this move if the player is
-; flying or underground, and slower than the enemy.
-
-	call AICompareSpeed
-	ret nc
-
-	ld a, [PlayerSubStatus3]
-	and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
-	ret z
-
-	dec [hl]
-	dec [hl]
-	ret
-; 39200
-
-
-AI_Smart_Stomp: ; 39200
-; 80% chance to encourage this move if the player has used Minimize.
-
-	ld a, [wPlayerMinimized]
-	and a
-	ret z
-
-	call AI_80_20
-	ret c
-
-	dec [hl]
-	ret
-; 3920b
-
-
-AI_Smart_Solarbeam: ; 3920b
-; 80% chance to encourage this move when it's sunny.
-; 90% chance to discourage this move when it's raining.
-
-	ld a, [Weather]
-	cp WEATHER_SUN
-	jr z, .asm_3921e
-
-	cp WEATHER_RAIN
-	ret nz
-
-	call Random
-	cp 10 percent
-	ret c
-
-	inc [hl]
-	inc [hl]
-	ret
-
-.asm_3921e
-	call AI_80_20
-	ret c
-
-	dec [hl]
-	dec [hl]
-	ret
-; 39225
-
-
-AI_Smart_Thunder: ; 39225
-; 90% chance to discourage this move when it's sunny.
-
-	ld a, [Weather]
-	cp WEATHER_SUN
-	ret nz
-
-	call Random
-	cp 10 percent
-	ret c
-
-	inc [hl]
-	ret
-; 39233
-
-
-AICompareSpeed: ; 39233
-; Return carry if enemy is faster than player.
-
-	push bc
-	ld a, [EnemyMonSpeed + 1]
-	ld b, a
-	ld a, [BattleMonSpeed + 1]
-	cp b
-	ld a, [EnemyMonSpeed]
-	ld b, a
-	ld a, [BattleMonSpeed]
-	sbc b
-	pop bc
-	ret
-; 39246
-
-
-AICheckPlayerMaxHP: ; 39246
-	push hl
-	push de
-	push bc
-	ld de, BattleMonHP
-	ld hl, BattleMonMaxHP
-	jr AICheckMaxHP
-; 39251
-
-
-AICheckEnemyMaxHP: ; 39251
-	push hl
-	push de
-	push bc
-	ld de, EnemyMonHP
-	ld hl, EnemyMonMaxHP
-	; fallthrough
-; 3925a
-
-
-AICheckMaxHP: ; 3925a
-; Return carry if hp at de matches max hp at hl.
-
-	ld a, [de]
-	inc de
-	cp [hl]
-	jr nz, .asm_39269
-
-	inc hl
-	ld a, [de]
-	cp [hl]
-	jr nz, .asm_39269
-
-	pop bc
-	pop de
-	pop hl
-	scf
-	ret
-
-.asm_39269
-	pop bc
-	pop de
-	pop hl
-	and a
-	ret
-; 3926e
-
-
-AICheckPlayerHalfHP: ; 3926e
-	push hl
-	ld hl, BattleMonHP
-	ld b, [hl]
-	inc hl
-	ld c, [hl]
-	sla c
-	rl b
-	inc hl
-	inc hl
-	ld a, [hld]
-	cp c
-	ld a, [hl]
-	sbc b
-	pop hl
-	ret
-; 39281
-
-
-AICheckEnemyHalfHP: ; 39281
-	push hl
-	push de
-	push bc
-	ld hl, EnemyMonHP
-	ld b, [hl]
-	inc hl
-	ld c, [hl]
-	sla c
-	rl b
-	inc hl
-	inc hl
-	ld a, [hld]
-	cp c
-	ld a, [hl]
-	sbc b
-	pop bc
-	pop de
-	pop hl
-	ret
-; 39298
-
-
-AICheckEnemyQuarterHP: ; 39298
-	push hl
-	push de
-	push bc
-	ld hl, EnemyMonHP
-	ld b, [hl]
-	inc hl
-	ld c, [hl]
-	sla c
-	rl b
-	sla c
-	rl b
-	inc hl
-	inc hl
-	ld a, [hld]
-	cp c
-	ld a, [hl]
-	sbc b
-	pop bc
-	pop de
-	pop hl
-	ret
-; 392b3
-
-
-AICheckPlayerQuarterHP: ; 392b3
-	push hl
-	ld hl, BattleMonHP
-	ld b, [hl]
-	inc hl
-	ld c, [hl]
-	sla c
-	rl b
-	sla c
-	rl b
-	inc hl
-	inc hl
-	ld a, [hld]
-	cp c
-	ld a, [hl]
-	sbc b
-	pop hl
-	ret
-; 392ca
-
-
-AIHasMoveEffect: ; 392ca
-; Return carry if the enemy has move b.
-
-	push hl
-	ld hl, EnemyMonMoves
-	ld c, EnemyMonMovesEnd - EnemyMonMoves
-
-.checkmove
-	ld a, [hli]
-	and a
-	jr z, .no
-
-	call AIGetEnemyMove
-
-	ld a, [wEnemyMoveStruct + MOVE_EFFECT]
-	cp b
-	jr z, .yes
-
-	dec c
-	jr nz, .checkmove
-
-.no
-	pop hl
-	and a
-	ret
-
-.yes
-	pop hl
-	scf
-	ret
-; 392e6
-
-
-AIHasMoveInArray: ; 392e6
-; Return carry if the enemy has a move in array hl.
-
-	push hl
-	push de
-	push bc
-
-.next
-	ld a, [hli]
-	cp $ff
-	jr z, .done
-
-	ld b, a
-	ld c, EnemyMonMovesEnd - EnemyMonMoves + 1
-	ld de, EnemyMonMoves
-
-.check
-	dec c
-	jr z, .next
-
-	ld a, [de]
-	inc de
-	cp b
-	jr nz, .check
-
-	scf
-
-.done
-	pop bc
-	pop de
-	pop hl
-	ret
-; 39301
-
-
-UsefulMoves: ; 39301
-; Moves that are usable all-around.
-	db DOUBLE_EDGE
-	db SING
-	db FLAMETHROWER
-	db HYDRO_PUMP
-	db SURF
-	db ICE_BEAM
-	db BLIZZARD
-	db HYPER_BEAM
-	db SLEEP_POWDER
-	db THUNDERBOLT
-	db THUNDER
-	db EARTHQUAKE
-	db TOXIC
-	db PSYCHIC_M
-	db HYPNOSIS
-	db RECOVER
-	db FIRE_BLAST
-	db SOFTBOILED
-	db SUPER_FANG
-	db $ff
-; 39315
-
-
-AI_Opportunist: ; 39315
-; Discourage stall moves when the enemy's HP is low.
-
-; Do nothing if enemy's HP is above 50%.
-	call AICheckEnemyHalfHP
-	ret c
-
-; Discourage stall moves if enemy's HP is below 25%.
-	call AICheckEnemyQuarterHP
-	jr nc, .asm_39322
-
-; 50% chance to discourage stall moves if enemy's HP is between 25% and 50%.
-	call AI_50_50
-	ret c
-
-.asm_39322
-	ld hl, Buffer1 - 1
-	ld de, EnemyMonMoves
-	ld c, EnemyMonMovesEnd - EnemyMonMoves + 1
-.checkmove
-	inc hl
-	dec c
-	jr z, .asm_39347
-
-	ld a, [de]
-	inc de
-	and a
-	jr z, .asm_39347
-
-	push hl
-	push de
-	push bc
-	ld hl, .stallmoves
-	ld de, 1
-	call IsInArray
-
-	pop bc
-	pop de
-	pop hl
-	jr nc, .checkmove
-
-	inc [hl]
-	jr .checkmove
-
-.asm_39347
-	ret
-
-.stallmoves
-	db SWORDS_DANCE
-	db TAIL_WHIP
-	db LEER
-	db GROWL
-	db DISABLE
-	db MIST
-	db COUNTER
-	db LEECH_SEED
-	db GROWTH
-	db STRING_SHOT
-	db MEDITATE
-	db AGILITY
-	db RAGE
-	db MIMIC
-	db SCREECH
-	db HARDEN
-	db WITHDRAW
-	db DEFENSE_CURL
-	db BARRIER
-	db LIGHT_SCREEN
-	db HAZE
-	db REFLECT
-	db FOCUS_ENERGY
-	db BIDE
-	db AMNESIA
-	db TRANSFORM
-	db SPLASH
-	db ACID_ARMOR
-	db SHARPEN
-	db CONVERSION
-	db SUBSTITUTE
-	db FLAME_WHEEL
-	db $ff
-; 39369
-
-
-
-AI_Aggressive: ; 39369
-; Use whatever does the most damage.
-
-; Discourage all damaging moves but the one that does the most damage.
-; If no damaging move deals damage to the player (immune),
-; no move will be discouraged
-
-; Figure out which attack does the most damage and put it in c.
-	ld hl, EnemyMonMoves
-	ld bc, 0
-	ld de, 0
-.checkmove
-	inc b
-	ld a, b
-	cp EnemyMonMovesEnd - EnemyMonMoves + 1
-	jr z, .gotstrongestmove
-
-	ld a, [hli]
-	and a
-	jr z, .gotstrongestmove
-
-	push hl
-	push de
-	push bc
-	call AIGetEnemyMove
-	ld a, [wEnemyMoveStruct + MOVE_POWER]
-	and a
-	jr z, .nodamage
-	call AIDamageCalc
-	pop bc
-	pop de
-	pop hl
-
-; Update current move if damage is highest so far
-	ld a, [CurDamage + 1]
-	cp e
-	ld a, [CurDamage]
-	sbc d
-	jr c, .checkmove
-
-	ld a, [CurDamage + 1]
-	ld e, a
-	ld a, [CurDamage]
-	ld d, a
-	ld c, b
-	jr .checkmove
-
-.nodamage
-	pop bc
-	pop de
-	pop hl
-	jr .checkmove
-
-.gotstrongestmove
-; Nothing we can do if no attacks did damage.
-	ld a, c
-	and a
-	jr z, .done
-
-; Discourage moves that do less damage unless they're reckless too.
-	ld hl, Buffer1 - 1
-	ld de, EnemyMonMoves
-	ld b, 0
-.checkmove2
-	inc b
-	ld a, b
-	cp EnemyMonMovesEnd - EnemyMonMoves + 1
-	jr z, .done
-
-; Ignore this move if it is the highest damaging one.
-	cp c
-	ld a, [de]
-	inc de
-	inc hl
-	jr z, .checkmove2
-
-	call AIGetEnemyMove
-
-; Ignore this move if its power is 0 or 1.
-; Moves such as Seismic Toss, Hidden Power,
-; Counter and Fissure have a base power of 1.
-	ld a, [wEnemyMoveStruct + MOVE_POWER]
-	cp 2
-	jr c, .checkmove2
-
-; Ignore this move if it is reckless.
-	push hl
-	push de
-	push bc
-	ld a, [wEnemyMoveStruct + MOVE_EFFECT]
-	ld hl, .RecklessMoves
-	ld de, 1
-	call IsInArray
-	pop bc
-	pop de
-	pop hl
-	jr c, .checkmove2
-
-; If we made it this far, discourage this move.
-	inc [hl]
-	jr .checkmove2
-
-.done
-	ret
-
-.RecklessMoves:
-	db EFFECT_SELFDESTRUCT
-	db EFFECT_RAMPAGE
-	db EFFECT_MULTI_HIT
-	db EFFECT_DOUBLE_HIT
-	db $ff
-; 393e7
-
-
-AIDamageCalc: ; 393e7
-	ld a, 1
-	ld [hBattleTurn], a
-	ld a, [wEnemyMoveStruct + MOVE_EFFECT]
-	ld de, 1
-	ld hl, .ConstantDamageEffects
-	call IsInArray
-	jr nc, .asm_39400
-	callfar BattleCommand_ConstantDamage
-	ret
-
-.asm_39400
-	callfar EnemyAttackDamage
-	callfar BattleCommand_DamageCalc
-	callfar BattleCommand_Stab
-	ret
-
-.ConstantDamageEffects:
-	db EFFECT_SUPER_FANG
-	db EFFECT_STATIC_DAMAGE
-	db EFFECT_LEVEL_DAMAGE
-	db EFFECT_PSYWAVE
-	db $ff
-; 39418
-
-
-AI_Cautious: ; 39418
-; 90% chance to discourage moves with residual effects after the first turn.
-
-	ld a, [EnemyTurnsTaken]
-	and a
-	ret z
-
-	ld hl, Buffer1 - 1
-	ld de, EnemyMonMoves
-	ld c, EnemyMonMovesEnd - EnemyMonMoves + 1
-.asm_39425
-	inc hl
-	dec c
-	ret z
-
-	ld a, [de]
-	inc de
-	and a
-	ret z
-
-	push hl
-	push de
-	push bc
-	ld hl, .residualmoves
-	ld de, 1
-	call IsInArray
-
-	pop bc
-	pop de
-	pop hl
-	jr nc, .asm_39425
-
-	call Random
-	cp 90 percent + 1
-	ret nc
-
-	inc [hl]
-	jr .asm_39425
-
-.residualmoves
-	db MIST
-	db LEECH_SEED
-	db POISONPOWDER
-	db STUN_SPORE
-	db THUNDER_WAVE
-	db FOCUS_ENERGY
-	db BIDE
-	db POISON_GAS
-	db TRANSFORM
-	db CONVERSION
-	db SUBSTITUTE
-	db SPIKES
-	db $ff
-; 39453
-
-
-
-AI_Status: ; 39453
-; Dismiss status moves that don't affect the player.
-
-	ld hl, Buffer1 - 1
-	ld de, EnemyMonMoves
-	ld b, EnemyMonMovesEnd - EnemyMonMoves + 1
-.checkmove
-	dec b
-	ret z
-
-	inc hl
-	ld a, [de]
-	and a
-	ret z
-
-	inc de
-	call AIGetEnemyMove
-
-	ld a, [wEnemyMoveStruct + MOVE_EFFECT]
-	cp EFFECT_TOXIC
-	jr z, .poisonimmunity
-	cp EFFECT_POISON
-	jr z, .poisonimmunity
-	cp EFFECT_SLEEP
-	jr z, .typeimmunity
-	cp EFFECT_PARALYZE
-	jr z, .typeimmunity
-
-	ld a, [wEnemyMoveStruct + MOVE_POWER]
-	and a
-	jr z, .checkmove
-
-	jr .typeimmunity
-
-.poisonimmunity
-	ld a, [BattleMonType1]
-	cp POISON
-	jr z, .immune
-	ld a, [BattleMonType2]
-	cp POISON
-	jr z, .immune
-
-.typeimmunity
-	push hl
-	push bc
-	push de
-	ld a, 1
-	ld [hBattleTurn], a
-	callfar BattleCheckTypeMatchup
-	pop de
-	pop bc
-	pop hl
-
-	ld a, [wd265]
-	and a
-	jr nz, .checkmove
-
-.immune
-	call AIDiscourageMove
-	jr .checkmove
-; 394a9
-
-
-
-AI_Risky: ; 394a9
-; Use any move that will KO the target.
-; Risky moves will often be an exception (see below).
-
-	ld hl, Buffer1 - 1
-	ld de, EnemyMonMoves
-	ld c, EnemyMonMovesEnd - EnemyMonMoves + 1
-.checkmove
-	inc hl
-	dec c
-	ret z
-
-	ld a, [de]
-	inc de
-	and a
-	ret z
-
-	push de
-	push bc
-	push hl
-	call AIGetEnemyMove
-
-	ld a, [wEnemyMoveStruct + MOVE_POWER]
-	and a
-	jr z, .nextmove
-
-; Don't use risky moves at max hp.
-	ld a, [wEnemyMoveStruct + MOVE_EFFECT]
-	ld de, 1
-	ld hl, .RiskyMoves
-	call IsInArray
-	jr nc, .checkko
-
-	call AICheckEnemyMaxHP
-	jr c, .nextmove
-
-; Else, 80% chance to exclude them.
-	call Random
-	cp 79 percent - 1
-	jr c, .nextmove
-
-.checkko
-	call AIDamageCalc
-
-	ld a, [CurDamage + 1]
-	ld e, a
-	ld a, [CurDamage]
-	ld d, a
-	ld a, [BattleMonHP + 1]
-	cp e
-	ld a, [BattleMonHP]
-	sbc d
-	jr nc, .nextmove
-
-	pop hl
-rept 5
-	dec [hl]
-endr
-	push hl
-
-.nextmove
-	pop hl
-	pop bc
-	pop de
-	jr .checkmove
-
-.RiskyMoves:
-	db EFFECT_SELFDESTRUCT
-	db EFFECT_OHKO
-	db $ff
-; 39502
-
-
-
-AI_None: ; 39502
-	ret
-; 39503
-
-
-AIDiscourageMove: ; 39503
-	ld a, [hl]
-	add 10
-	ld [hl], a
-	ret
-; 39508
-
-
-AIGetEnemyMove: ; 39508
-; Load attributes of move a into ram
-
-	push hl
-	push de
-	push bc
-	dec a
-	ld hl, Moves
-	ld bc, MOVE_LENGTH
-	call AddNTimes
-
-	ld de, wEnemyMoveStruct
-	ld a, BANK(Moves)
-	call FarCopyBytes
-
-	pop bc
-	pop de
-	pop hl
-	ret
-; 39521
-
-
-AI_80_20: ; 39521
-	call Random
-	cp 20 percent - 1
-	ret
-; 39527
-
-
-AI_50_50: ; 39527
-	call Random
-	cp 50 percent + 1
-	ret
-; 3952d
--- a/battle/ai/switch.asm
+++ /dev/null
@@ -1,672 +1,0 @@
-CheckPlayerMoveTypeMatchups: ; 3484e
-; Check how well the moves you've already used
-; fare against the enemy's Pokemon.  Used to
-; score a potential switch.
-	push hl
-	push de
-	push bc
-	ld a, 10
-	ld [wEnemyAISwitchScore], a
-	ld hl, PlayerUsedMoves
-	ld a, [hl]
-	and a
-	jr z, .unknown_moves
-
-	ld d, NUM_MOVES
-	ld e, 0
-.loop
-	ld a, [hli]
-	and a
-	jr z, .exit
-	push hl
-	dec a
-	ld hl, Moves + MOVE_POWER
-	call GetMoveAttr
-	and a
-	jr z, .next
-
-	inc hl
-	call GetMoveByte
-	ld hl, EnemyMonType
-	call CheckTypeMatchup
-	ld a, [wTypeMatchup]
-	cp 10 + 1 ; 1.0 + 0.1
-	jr nc, .super_effective
-	and a
-	jr z, .next
-	cp 10 ; 1.0
-	jr nc, .neutral
-
-.not_very_effective
-	ld a, e
-	cp 1 ; 0.1
-	jr nc, .next
-	ld e, 1
-	jr .next
-
-.neutral
-	ld e, 2
-	jr .next
-
-.super_effective
-	call .DecreaseScore
-	pop hl
-	jr .done
-
-.next
-	pop hl
-	dec d
-	jr nz, .loop
-
-.exit
-	ld a, e
-	cp 2
-	jr z, .done
-	call .IncreaseScore
-	ld a, e
-	and a
-	jr nz, .done
-	call .IncreaseScore
-	jr .done
-
-.unknown_moves
-	ld a, [BattleMonType1]
-	ld b, a
-	ld hl, EnemyMonType1
-	call CheckTypeMatchup
-	ld a, [wTypeMatchup]
-	cp 10 + 1 ; 1.0 + 0.1
-	jr c, .ok
-	call .DecreaseScore
-.ok
-	ld a, [BattleMonType2]
-	cp b
-	jr z, .ok2
-	call CheckTypeMatchup
-	ld a, [wTypeMatchup]
-	cp 10 + 1 ; 1.0 + 0.1
-	jr c, .ok2
-	call .DecreaseScore
-.ok2
-
-.done
-	call .CheckEnemyMoveMatchups
-	pop bc
-	pop de
-	pop hl
-	ret
-; 348de
-
-
-.CheckEnemyMoveMatchups: ; 348de
-	ld de, EnemyMonMoves
-	ld b, NUM_MOVES + 1
-	ld c, 0
-
-	ld a, [wTypeMatchup]
-	push af
-.loop2
-	dec b
-	jr z, .exit2
-
-	ld a, [de]
-	and a
-	jr z, .exit2
-
-	inc de
-	dec a
-	ld hl, Moves + MOVE_POWER
-	call GetMoveAttr
-	and a
-	jr z, .loop2
-
-	inc hl
-	call GetMoveByte
-	ld hl, BattleMonType1
-	call CheckTypeMatchup
-
-	ld a, [wTypeMatchup]
-	; immune
-	and a
-	jr z, .loop2
-
-	; not very effective
-	inc c
-	cp 10
-	jr c, .loop2
-
-	; neutral
-	inc c
-	inc c
-	inc c
-	inc c
-	inc c
-	cp 10
-	jr z, .loop2
-
-	; super effective
-	ld c, 100
-	jr .loop2
-
-.exit2
-	pop af
-	ld [wTypeMatchup], a
-
-	ld a, c
-	and a
-	jr z, .doubledown ; double down
-	cp 5
-	jr c, .DecreaseScore ; down
-	cp 100
-	ret c
-	jr .IncreaseScore ; up
-
-.doubledown
-	call .DecreaseScore
-.DecreaseScore: ; 34931
-	ld a, [wEnemyAISwitchScore]
-	dec a
-	ld [wEnemyAISwitchScore], a
-	ret
-; 34939
-
-.IncreaseScore: ; 34939
-	ld a, [wEnemyAISwitchScore]
-	inc a
-	ld [wEnemyAISwitchScore], a
-	ret
-; 34941
-
-CheckAbleToSwitch: ; 34941
-	xor a
-	ld [wEnemySwitchMonParam], a
-	call FindAliveEnemyMons
-	ret c
-
-	ld a, [EnemySubStatus1]
-	bit SUBSTATUS_PERISH, a
-	jr z, .no_perish
-
-	ld a, [EnemyPerishCount]
-	cp 1
-	jr nz, .no_perish
-
-	; Perish count is 1
-
-	call FindAliveEnemyMons
-	call FindEnemyMonsWithAtLeastQuarterMaxHP
-	call FindEnemyMonsThatResistPlayer
-	call FindAliveEnemyMonsWithASuperEffectiveMove
-
-	ld a, e
-	cp 2
-	jr nz, .not_2
-
-	ld a, [wEnemyAISwitchScore]
-	add $30 ; maximum chance
-	ld [wEnemySwitchMonParam], a
-	ret
-
-.not_2
-	call FindAliveEnemyMons
-	sla c
-	sla c
-	ld b, $ff
-
-.loop1
-	inc b
-	sla c
-	jr nc, .loop1
-
-	ld a, b
-	add $30 ; maximum chance
-	ld [wEnemySwitchMonParam], a
-	ret
-
-.no_perish
-	call CheckPlayerMoveTypeMatchups
-	ld a, [wEnemyAISwitchScore]
-	cp 11
-	ret nc
-
-	ld a, [LastPlayerCounterMove]
-	and a
-	jr z, .no_last_counter_move
-
-	call FindEnemyMonsImmuneToLastCounterMove
-	ld a, [wEnemyAISwitchScore]
-	and a
-	jr z, .no_last_counter_move
-
-	ld c, a
-	call FindEnemyMonsWithASuperEffectiveMove
-	ld a, [wEnemyAISwitchScore]
-	cp $ff
-	ret z
-
-	ld b, a
-	ld a, e
-	cp 2
-	jr z, .not_2_again
-
-	call CheckPlayerMoveTypeMatchups
-	ld a, [wEnemyAISwitchScore]
-	cp 10
-	ret nc
-
-	ld a, b
-	add $10
-	ld [wEnemySwitchMonParam], a
-	ret
-
-.not_2_again
-	ld c, $10
-	call CheckPlayerMoveTypeMatchups
-	ld a, [wEnemyAISwitchScore]
-	cp 10
-	jr nc, .okay
-	ld c, $20
-
-.okay
-	ld a, b
-	add c
-	ld [wEnemySwitchMonParam], a
-	ret
-
-.no_last_counter_move
-	call CheckPlayerMoveTypeMatchups
-	ld a, [wEnemyAISwitchScore]
-	cp 10
-	ret nc
-
-	call FindAliveEnemyMons
-	call FindEnemyMonsWithAtLeastQuarterMaxHP
-	call FindEnemyMonsThatResistPlayer
-	call FindAliveEnemyMonsWithASuperEffectiveMove
-
-	ld a, e
-	cp $2
-	ret nz
-
-	ld a, [wEnemyAISwitchScore]
-	add $10
-	ld [wEnemySwitchMonParam], a
-	ret
-; 349f4
-
-
-FindAliveEnemyMons: ; 349f4
-	ld a, [OTPartyCount]
-	cp 2
-	jr c, .only_one
-
-	ld d, a
-	ld e, 0
-	ld b, 1 << (PARTY_LENGTH - 1)
-	ld c, 0
-	ld hl, OTPartyMon1HP
-
-.loop
-	ld a, [CurOTMon]
-	cp e
-	jr z, .next
-
-	push bc
-	ld b, [hl]
-	inc hl
-	ld a, [hld]
-	or b
-	pop bc
-	jr z, .next
-
-	ld a, c
-	or b
-	ld c, a
-
-.next
-	srl b
-	push bc
-	ld bc, PARTYMON_STRUCT_LENGTH
-	add hl, bc
-	pop bc
-	inc e
-	dec d
-	jr nz, .loop
-
-	ld a, c
-	and a
-	jr nz, .more_than_one
-
-.only_one
-	scf
-	ret
-
-.more_than_one
-	and a
-	ret
-; 34a2a
-
-
-FindEnemyMonsImmuneToLastCounterMove: ; 34a2a
-	ld hl, OTPartyMon1
-	ld a, [OTPartyCount]
-	ld b, a
-	ld c, 1 << (PARTY_LENGTH - 1)
-	ld d, 0
-	xor a
-	ld [wEnemyAISwitchScore], a
-
-.loop
-	ld a, [CurOTMon]
-	cp d
-	push hl
-	jr z, .next
-
-	push hl
-	push bc
-
-	; If the Pokemon has at least 1 HP...
-	ld bc, MON_HP
-	add hl, bc
-	pop bc
-	ld a, [hli]
-	or [hl]
-	pop hl
-	jr z, .next
-
-	ld a, [hl]
-	ld [CurSpecies], a
-	call GetBaseData
-
-	; the player's last move is damaging...
-	ld a, [LastPlayerCounterMove]
-	dec a
-	ld hl, Moves + MOVE_POWER
-	call GetMoveAttr
-	and a
-	jr z, .next
-
-	; and the Pokemon is immune to it...
-	inc hl
-	call GetMoveByte
-	ld hl, BaseType
-	call CheckTypeMatchup
-	ld a, [wTypeMatchup]
-	and a
-	jr nz, .next
-
-	; ... encourage that Pokemon.
-	ld a, [wEnemyAISwitchScore]
-	or c
-	ld [wEnemyAISwitchScore], a
-.next
-	pop hl
-	dec b
-	ret z
-
-	push bc
-	ld bc, PARTYMON_STRUCT_LENGTH
-	add hl, bc
-	pop bc
-
-	inc d
-	srl c
-	jr .loop
-; 34a85
-
-
-FindAliveEnemyMonsWithASuperEffectiveMove: ; 34a85
-	push bc
-	ld a, [OTPartyCount]
-	ld e, a
-	ld hl, OTPartyMon1HP
-	ld b, 1 << (PARTY_LENGTH - 1)
-	ld c, 0
-.loop
-	ld a, [hli]
-	or [hl]
-	jr z, .next
-
-	ld a, b
-	or c
-	ld c, a
-
-.next
-	srl b
-	push bc
-	ld bc, PartyMon2HP - (PartyMon1HP + 1)
-	add hl, bc
-	pop bc
-	dec e
-	jr nz, .loop
-
-	ld a, c
-	pop bc
-
-	and c
-	ld c, a
-FindEnemyMonsWithASuperEffectiveMove: ; 34aa7
-
-	ld a, -1
-	ld [wEnemyAISwitchScore], a
-	ld hl, OTPartyMon1Moves
-	ld b, 1 << (PARTY_LENGTH - 1)
-	ld d, 0
-	ld e, 0
-.loop
-	ld a, b
-	and c
-	jr z, .next
-
-	push hl
-	push bc
-	; for move on mon:
-	ld b, NUM_MOVES
-	ld c, 0
-.loop3
-	; if move is None: break
-	ld a, [hli]
-	and a
-	push hl
-	jr z, .break3
-
-	; if move has no power: continue
-	dec a
-	ld hl, Moves + MOVE_POWER
-	call GetMoveAttr
-	and a
-	jr z, .nope
-
-	; check type matchups
-	inc hl
-	call GetMoveByte
-	ld hl, BattleMonType1
-	call CheckTypeMatchup
-
-	; if immune or not very effective: continue
-	ld a, [wTypeMatchup]
-	cp 10
-	jr c, .nope
-
-	; if neutral: load 1 and continue
-	ld e, 1
-	cp 10 + 1
-	jr c, .nope
-
-	; if super-effective: load 2 and break
-	ld e, 2
-	jr .break3
-
-.nope
-	pop hl
-	dec b
-	jr nz, .loop3
-
-	jr .done
-
-.break3
-	pop hl
-.done
-	ld a, e
-	pop bc
-	pop hl
-	cp 2
-	jr z, .done2 ; at least one move is super-effective
-	cp 1
-	jr nz, .next ; no move does more than half damage
-
-	; encourage this pokemon
-	ld a, d
-	or b
-	ld d, a
-	jr .next ; such a long jump
-
-.next
-	; next pokemon?
-	push bc
-	ld bc, PARTYMON_STRUCT_LENGTH
-	add hl, bc
-	pop bc
-	srl b
-	jr nc, .loop
-
-	; if no pokemon has a super-effective move: return
-	ld a, d
-	ld b, a
-	and a
-	ret z
-
-.done2
-	; convert the bit flag to an int and return
-	push bc
-	sla b
-	sla b
-	ld c, $ff
-.loop2
-	inc c
-	sla b
-	jr nc, .loop2
-
-	ld a, c
-	ld [wEnemyAISwitchScore], a
-	pop bc
-	ret
-; 34b20
-
-
-FindEnemyMonsThatResistPlayer: ; 34b20
-	push bc
-	ld hl, OTPartySpecies
-	ld b, 1 << (PARTY_LENGTH - 1)
-	ld c, 0
-
-.loop
-	ld a, [hli]
-	cp $ff
-	jr z, .done
-
-	push hl
-	ld [CurSpecies], a
-	call GetBaseData
-	ld a, [LastPlayerCounterMove]
-	and a
-	jr z, .skip_move
-
-	dec a
-	ld hl, Moves + MOVE_POWER
-	call GetMoveAttr
-	and a
-	jr z, .skip_move
-
-	inc hl
-	call GetMoveByte
-	jr .check_type
-
-.skip_move
-	ld a, [BattleMonType1]
-	ld hl, BaseType
-	call CheckTypeMatchup
-	ld a, [wTypeMatchup]
-	cp 10 + 1
-	jr nc, .dont_choose_mon
-	ld a, [BattleMonType2]
-
-.check_type
-	ld hl, BaseType
-	call CheckTypeMatchup
-	ld a, [wTypeMatchup]
-	cp 10 + 1
-	jr nc, .dont_choose_mon
-
-	ld a, b
-	or c
-	ld c, a
-
-.dont_choose_mon
-	srl b
-	pop hl
-	jr .loop
-
-.done
-	ld a, c
-	pop bc
-	and c
-	ld c, a
-	ret
-; 34b77
-
-
-FindEnemyMonsWithAtLeastQuarterMaxHP: ; 34b77
-	push bc
-	ld de, OTPartySpecies
-	ld b, 1 << (PARTY_LENGTH - 1)
-	ld c, 0
-	ld hl, OTPartyMon1HP
-
-.loop
-	ld a, [de]
-	inc de
-	cp $ff
-	jr z, .done
-
-	push hl
-	push bc
-	ld b, [hl]
-	inc hl
-	ld c, [hl]
-	inc hl
-	inc hl
-; hl = MaxHP + 1
-; bc = [CurHP] * 4
-	srl c
-	rl b
-	srl c
-	rl b
-; if bc >= [hl], encourage
-	ld a, [hld]
-	cp c
-	ld a, [hl]
-	sbc b
-	pop bc
-	jr nc, .next
-
-	ld a, b
-	or c
-	ld c, a
-
-.next
-	srl b
-	pop hl
-	push bc
-	ld bc, PARTYMON_STRUCT_LENGTH
-	add hl, bc
-	pop bc
-	jr .loop
-
-.done
-	ld a, c
-	pop bc
-	and c
-	ld c, a
-	ret
-; 34bb1
--- a/battle/anim_commands.asm
+++ /dev/null
@@ -1,1515 +1,0 @@
-; Battle animation command interpreter.
-
-
-PlayBattleAnim: ; cc0d6
-
-	ld a, [rSVBK]
-	push af
-
-	ld a, 5
-	ld [rSVBK], a
-
-	call _PlayBattleAnim
-
-	pop af
-	ld [rSVBK], a
-	ret
-; cc0e4
-
-_PlayBattleAnim: ; cc0e4
-
-	ld c, 6
-.wait
-	call BattleAnimDelayFrame
-	dec c
-	jr nz, .wait
-
-	call BattleAnimAssignPals
-	call BattleAnimRequestPals
-	call BattleAnimDelayFrame
-
-	ld c, 1
-	ld a, [rKEY1]
-	bit 7, a
-	jr nz, .asm_cc0ff
-	ld c, 3
-
-.asm_cc0ff
-	ld hl, hVBlank
-	ld a, [hl]
-	push af
-
-	ld [hl], c
-	call BattleAnimRunScript
-
-	pop af
-	ld [hVBlank], a
-
-	ld a, $1
-	ld [hBGMapMode], a
-
-	call BattleAnimDelayFrame
-	call BattleAnimDelayFrame
-	call BattleAnimDelayFrame
-	call WaitSFX
-	ret
-; cc11c
-
-BattleAnimRunScript: ; cc11c
-
-	ld a, [FXAnimID + 1]
-	and a
-	jr nz, .hi_byte
-
-	farcall CheckBattleScene
-	jr c, .disabled
-
-	call BattleAnimClearHud
-	call RunBattleAnimScript
-
-	call BattleAnimAssignPals
-	call BattleAnimRequestPals
-
-	xor a
-	ld [hSCX], a
-	ld [hSCY], a
-	call BattleAnimDelayFrame
-	call BattleAnimRestoreHuds
-
-.disabled
-	ld a, [wNumHits]
-	and a
-	jr z, .done
-
-	ld l, a
-	ld h, 0
-	ld de, ANIM_MISS
-	add hl, de
-	ld a, l
-	ld [FXAnimID], a
-	ld a, h
-	ld [FXAnimID + 1], a
-
-.hi_byte
-	call WaitSFX
-	call PlayHitSound
-	call RunBattleAnimScript
-
-.done
-	call BattleAnim_RevertPals
-	ret
-; cc163
-
-RunBattleAnimScript: ; cc163
-
-	call ClearBattleAnims
-
-.playframe
-	call RunBattleAnimCommand
-	call _ExecuteBGEffects
-	call BattleAnim_UpdateOAM_All
-	call PushLYOverrides
-	call BattleAnimRequestPals
-
-; Speed up Rollout's animation.
-	ld a, [FXAnimID + 1]
-	or a
-	jr nz, .not_rollout
-
-	ld a, [FXAnimID]
-	cp ROLLOUT
-	jr nz, .not_rollout
-
-	ld a, $2e
-	ld b, 5
-	ld de, 4
-	ld hl, ActiveBGEffects
-.find
-	cp [hl]
-	jr z, .done
-	add hl, de
-	dec b
-	jr nz, .find
-
-.not_rollout
-	call BattleAnimDelayFrame
-
-.done
-	ld a, [BattleAnimFlags]
-	bit 0, a
-	jr z, .playframe
-
-	call BattleAnim_ClearCGB_OAMFlags
-	ret
-; cc1a1
-
-BattleAnimClearHud: ; cc1a1
-
-	call BattleAnimDelayFrame
-	call WaitTop
-	call ClearActorHud
-	ld a, $1
-	ld [hBGMapMode], a
-	call BattleAnimDelayFrame
-	call BattleAnimDelayFrame
-	call BattleAnimDelayFrame
-	call WaitTop
-	ret
-; cc1bb
-
-BattleAnimRestoreHuds: ; cc1bb
-
-	call BattleAnimDelayFrame
-	call WaitTop
-
-	ld a, [rSVBK]
-	push af
-	ld a, $1
-	ld [rSVBK], a
-
-	ld hl, UpdateBattleHuds
-	ld a, BANK(UpdatePlayerHUD)
-	rst FarCall ; Why not "call UpdateBattleHuds"?
-
-	pop af
-	ld [rSVBK], a
-
-	ld a, $1
-	ld [hBGMapMode], a
-	call BattleAnimDelayFrame
-	call BattleAnimDelayFrame
-	call BattleAnimDelayFrame
-	call WaitTop
-	ret
-; cc1e2
-
-BattleAnimRequestPals: ; cc1e2
-
-	ld a, [hCGB]
-	and a
-	ret z
-
-	ld a, [rBGP]
-	ld b, a
-	ld a, [wBGP]
-	cp b
-	call nz, BattleAnim_SetBGPals
-
-	ld a, [rOBP0]
-	ld b, a
-	ld a, [wOBP0]
-	cp b
-	call nz, BattleAnim_SetOBPals
-	ret
-; cc1fb
-
-BattleAnimDelayFrame: ; cc1fb
-; Like DelayFrame but wastes battery life.
-
-	ld a, 1
-	ld [VBlankOccurred], a
-.wait
-	ld a, [VBlankOccurred]
-	and a
-	jr nz, .wait
-	ret
-; cc207
-
-ClearActorHud: ; cc207
-
-	ld a, [hBattleTurn]
-	and a
-	jr z, .player
-
-	hlcoord 1, 0
-	lb bc, 4, 10
-	call ClearBox
-	ret
-
-.player
-	hlcoord 9, 7
-	lb bc, 5, 11
-	call ClearBox
-	ret
-; cc220
-
-Functioncc220: ; cc220
-; Appears to be unused.
-	xor a
-	ld [hBGMapMode], a
-	ld a, LOW(VBGMap0 tile $28)
-	ld [hBGMapAddress], a
-	ld a, HIGH(VBGMap0 tile $28)
-	ld [hBGMapAddress + 1], a
-	call WaitBGMap2
-	ld a, $60
-	ld [hWY], a
-	xor a ; LOW(VBGMap0)
-	ld [hBGMapAddress], a
-	ld a, HIGH(VBGMap0)
-	ld [hBGMapAddress + 1], a
-	call BattleAnimDelayFrame
-	ret
-; cc23d
-
-
-BattleAnim_ClearCGB_OAMFlags: ; cc23d
-
-	ld a, [BattleAnimFlags]
-	bit 3, a
-	jr z, .delete
-
-	ld hl, Sprites + 3
-	ld c, (SpritesEnd - Sprites) / 4
-.loop
-	ld a, [hl]
-	and $f0
-	ld [hli], a
-	inc hl
-	inc hl
-	inc hl
-	dec c
-	jr nz, .loop
-	ret
-
-.delete
-	ld hl, Sprites
-	ld c, SpritesEnd - Sprites
-	xor a
-.loop2
-	ld [hli], a
-	dec c
-	jr nz, .loop2
-	ret
-; cc25f
-
-RunBattleAnimCommand: ; cc25f
-	call .CheckTimer
-	ret nc
-	call .RunScript
-	ret
-; cc267
-
-.CheckTimer: ; cc267
-	ld a, [BattleAnimDuration]
-	and a
-	jr z, .done
-
-	dec a
-	ld [BattleAnimDuration], a
-	and a
-	ret
-
-.done
-	scf
-	ret
-; cc275
-
-.RunScript: ; cc275
-.loop
-	call GetBattleAnimByte
-
-	cp $ff
-	jr nz, .not_done_with_anim
-
-; Return from a subroutine.
-	ld hl, BattleAnimFlags
-	bit 1, [hl]
-	jr nz, .do_anim
-
-	set 0, [hl]
-	ret
-
-.not_done_with_anim
-	cp $d0
-	jr nc, .do_anim
-
-	ld [BattleAnimDuration], a
-	ret
-
-.do_anim
-	call .DoCommand
-
-	jr .loop
-; cc293
-
-.DoCommand: ; cc293
-; Execute battle animation command in [BattleAnimByte].
-	ld a, [BattleAnimByte]
-	sub $d0
-
-	ld e, a
-	ld d, 0
-	ld hl, BattleAnimCommands
-	add hl, de
-	add hl, de
-
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	jp hl
-; cc2a4
-
-
-BattleAnimCommands:: ; cc2a4 (33:42a4)
-; entries correspond to macros/move_anim.asm enumeration
-	dw BattleAnimCmd_Obj
-	dw BattleAnimCmd_1GFX
-	dw BattleAnimCmd_2GFX
-	dw BattleAnimCmd_3GFX
-	dw BattleAnimCmd_4GFX
-	dw BattleAnimCmd_5GFX
-	dw BattleAnimCmd_IncObj
-	dw BattleAnimCmd_SetObj
-	dw BattleAnimCmd_IncBGEffect
-	dw BattleAnimCmd_EnemyFeetObj
-	dw BattleAnimCmd_PlayerHeadObj
-	dw BattleAnimCmd_CheckPokeball
-	dw BattleAnimCmd_Transform
-	dw BattleAnimCmd_RaiseSub
-	dw BattleAnimCmd_DropSub
-	dw BattleAnimCmd_ResetObp0
-	dw BattleAnimCmd_Sound
-	dw BattleAnimCmd_Cry
-	dw BattleAnimCmd_MinimizeOpp
-	dw BattleAnimCmd_OAMOn
-	dw BattleAnimCmd_OAMOff
-	dw BattleAnimCmd_ClearObjs
-	dw BattleAnimCmd_BeatUp
-	dw BattleAnimCmd_E7
-	dw BattleAnimCmd_UpdateActorPic
-	dw BattleAnimCmd_Minimize
-	dw BattleAnimCmd_EA ; dummy
-	dw BattleAnimCmd_EB ; dummy
-	dw BattleAnimCmd_EC ; dummy
-	dw BattleAnimCmd_ED ; dummy
-	dw BattleAnimCmd_IfParamAnd
-	dw BattleAnimCmd_JumpUntil
-	dw BattleAnimCmd_BGEffect
-	dw BattleAnimCmd_BGP
-	dw BattleAnimCmd_OBP0
-	dw BattleAnimCmd_OBP1
-	dw BattleAnimCmd_ClearSprites
-	dw BattleAnimCmd_F5
-	dw BattleAnimCmd_F6
-	dw BattleAnimCmd_F7
-	dw BattleAnimCmd_IfParamEqual
-	dw BattleAnimCmd_SetVar
-	dw BattleAnimCmd_IncVar
-	dw BattleAnimCmd_IfVarEqual
-	dw BattleAnimCmd_Jump
-	dw BattleAnimCmd_Loop
-	dw BattleAnimCmd_Call
-	dw BattleAnimCmd_Ret
-
-
-BattleAnimCmd_EA:
-BattleAnimCmd_EB:
-BattleAnimCmd_EC:
-BattleAnimCmd_ED: ; cc304 (33:4304)
-	ret
-
-BattleAnimCmd_Ret: ; cc305 (33:4305)
-	ld hl, BattleAnimFlags
-	res 1, [hl]
-	ld hl, BattleAnimParent
-	ld e, [hl]
-	inc hl
-	ld d, [hl]
-	ld hl, BattleAnimAddress
-	ld [hl], e
-	inc hl
-	ld [hl], d
-	ret
-
-BattleAnimCmd_Call: ; cc317 (33:4317)
-	call GetBattleAnimByte
-	ld e, a
-	call GetBattleAnimByte
-	ld d, a
-	push de
-	ld hl, BattleAnimAddress
-	ld e, [hl]
-	inc hl
-	ld d, [hl]
-	ld hl, BattleAnimParent
-	ld [hl], e
-	inc hl
-	ld [hl], d
-	pop de
-	ld hl, BattleAnimAddress
-	ld [hl], e
-	inc hl
-	ld [hl], d
-	ld hl, BattleAnimFlags
-	set 1, [hl]
-	ret
-
-BattleAnimCmd_Jump: ; cc339 (33:4339)
-	call GetBattleAnimByte
-	ld e, a
-	call GetBattleAnimByte
-	ld d, a
-	ld hl, BattleAnimAddress
-	ld [hl], e
-	inc hl
-	ld [hl], d
-	ret
-
-BattleAnimCmd_Loop: ; cc348 (33:4348)
-	call GetBattleAnimByte
-	ld hl, BattleAnimFlags
-	bit 2, [hl]
-	jr nz, .continue_loop
-	and a
-	jr z, .perpetual
-	dec a
-	set 2, [hl]
-	ld [BattleAnimLoops], a
-.continue_loop
-	ld hl, BattleAnimLoops
-	ld a, [hl]
-	and a
-	jr z, .return_from_loop
-	dec [hl]
-.perpetual
-	call GetBattleAnimByte
-	ld e, a
-	call GetBattleAnimByte
-	ld d, a
-	ld hl, BattleAnimAddress
-	ld [hl], e
-	inc hl
-	ld [hl], d
-	ret
-
-.return_from_loop
-	ld hl, BattleAnimFlags
-	res 2, [hl]
-	ld hl, BattleAnimAddress
-	ld e, [hl]
-	inc hl
-	ld d, [hl]
-	inc de
-	inc de
-	ld [hl], d
-	dec hl
-	ld [hl], e
-	ret
-
-BattleAnimCmd_JumpUntil: ; cc383 (33:4383)
-	ld hl, wBattleAnimParam
-	ld a, [hl]
-	and a
-	jr z, .dont_jump
-
-	dec [hl]
-	call GetBattleAnimByte
-	ld e, a
-	call GetBattleAnimByte
-	ld d, a
-	ld hl, BattleAnimAddress
-	ld [hl], e
-	inc hl
-	ld [hl], d
-	ret
-
-.dont_jump
-	ld hl, BattleAnimAddress
-	ld e, [hl]
-	inc hl
-	ld d, [hl]
-	inc de
-	inc de
-	ld [hl], d
-	dec hl
-	ld [hl], e
-	ret
-
-BattleAnimCmd_SetVar: ; cc3a6 (33:43a6)
-	call GetBattleAnimByte
-	ld [BattleAnimVar], a
-	ret
-
-BattleAnimCmd_IncVar: ; cc3ad (33:43ad)
-	ld hl, BattleAnimVar
-	inc [hl]
-	ret
-
-BattleAnimCmd_IfVarEqual: ; cc3b2 (33:43b2)
-	call GetBattleAnimByte
-	ld hl, BattleAnimVar
-	cp [hl]
-	jr z, .jump
-
-	ld hl, BattleAnimAddress
-	ld e, [hl]
-	inc hl
-	ld d, [hl]
-	inc de
-	inc de
-	ld [hl], d
-	dec hl
-	ld [hl], e
-	ret
-
-.jump
-	call GetBattleAnimByte
-	ld e, a
-	call GetBattleAnimByte
-	ld d, a
-	ld hl, BattleAnimAddress
-	ld [hl], e
-	inc hl
-	ld [hl], d
-	ret
-
-BattleAnimCmd_IfParamEqual: ; cc3d6 (33:43d6)
-	call GetBattleAnimByte
-	ld hl, wBattleAnimParam
-	cp [hl]
-	jr z, .jump
-
-	ld hl, BattleAnimAddress
-	ld e, [hl]
-	inc hl
-	ld d, [hl]
-	inc de
-	inc de
-	ld [hl], d
-	dec hl
-	ld [hl], e
-	ret
-
-.jump
-	call GetBattleAnimByte
-	ld e, a
-	call GetBattleAnimByte
-	ld d, a
-	ld hl, BattleAnimAddress
-	ld [hl], e
-	inc hl
-	ld [hl], d
-	ret
-
-BattleAnimCmd_IfParamAnd: ; cc3fa (33:43fa)
-	call GetBattleAnimByte
-	ld e, a
-	ld a, [wBattleAnimParam]
-	and e
-	jr nz, .jump
-
-	ld hl, BattleAnimAddress
-	ld e, [hl]
-	inc hl
-	ld d, [hl]
-	inc de
-	inc de
-	ld [hl], d
-	dec hl
-	ld [hl], e
-	ret
-
-.jump
-	call GetBattleAnimByte
-	ld e, a
-	call GetBattleAnimByte
-	ld d, a
-	ld hl, BattleAnimAddress
-	ld [hl], e
-	inc hl
-	ld [hl], d
-	ret
-
-BattleAnimCmd_Obj: ; cc41f (33:441f)
-; index, x, y, param
-	call GetBattleAnimByte
-	ld [wBattleAnimTemp0], a
-	call GetBattleAnimByte
-	ld [wBattleAnimTemp1], a
-	call GetBattleAnimByte
-	ld [wBattleAnimTemp2], a
-	call GetBattleAnimByte
-	ld [wBattleAnimTemp3], a
-	call QueueBattleAnimation
-	ret
-
-BattleAnimCmd_BGEffect: ; cc43b (33:443b)
-	call GetBattleAnimByte
-	ld [wBattleAnimTemp0], a
-	call GetBattleAnimByte
-	ld [wBattleAnimTemp1], a
-	call GetBattleAnimByte
-	ld [wBattleAnimTemp2], a
-	call GetBattleAnimByte
-	ld [wBattleAnimTemp3], a
-	call _QueueBGEffect
-	ret
-
-BattleAnimCmd_BGP: ; cc457 (33:4457)
-	call GetBattleAnimByte
-	ld [wBGP], a
-	ret
-
-BattleAnimCmd_OBP0: ; cc45e (33:445e)
-	call GetBattleAnimByte
-	ld [wOBP0], a
-	ret
-
-BattleAnimCmd_OBP1: ; cc465 (33:4465)
-	call GetBattleAnimByte
-	ld [wOBP1], a
-	ret
-
-BattleAnimCmd_ResetObp0: ; cc46c (33:446c)
-	ld a, [hSGB]
-	and a
-	ld a, $e0
-	jr z, .not_sgb
-	ld a, $f0
-.not_sgb
-	ld [wOBP0], a
-	ret
-
-BattleAnimCmd_ClearObjs: ; cc479 (33:4479)
-	ld hl, ActiveAnimObjects
-	ld a, $a0
-.loop
-	ld [hl], $0
-	inc hl
-	dec a
-	jr nz, .loop
-	ret
-
-BattleAnimCmd_1GFX:
-BattleAnimCmd_2GFX:
-BattleAnimCmd_3GFX:
-BattleAnimCmd_4GFX:
-BattleAnimCmd_5GFX: ; cc485 (33:4485)
-	ld a, [BattleAnimByte]
-	and $f
-	ld c, a
-	ld hl, wBattleAnimTileDict
-	xor a
-	ld [wBattleAnimTemp0], a
-.loop
-	ld a, [wBattleAnimTemp0]
-	cp (VTiles1 - VTiles0) / $10 - $31
-	ret nc
-	call GetBattleAnimByte
-	ld [hli], a
-	ld a, [wBattleAnimTemp0]
-	ld [hli], a
-	push bc
-	push hl
-	ld l, a
-	ld h, $0
-rept 4
-	add hl, hl
-endr
-	ld de, VTiles0 tile $31
-	add hl, de
-	ld a, [BattleAnimByte]
-	call LoadBattleAnimObj
-	ld a, [wBattleAnimTemp0]
-	add c
-	ld [wBattleAnimTemp0], a
-	pop hl
-	pop bc
-	dec c
-	jr nz, .loop
-	ret
-
-BattleAnimCmd_IncObj: ; cc4c0 (33:44c0)
-	call GetBattleAnimByte
-	ld e, 10
-	ld bc, ActiveAnimObjects
-.loop
-	ld hl, BATTLEANIMSTRUCT_INDEX
-	add hl, bc
-	ld d, [hl]
-	ld a, [BattleAnimByte]
-	cp d
-	jr z, .found
-	ld hl, BATTLEANIMSTRUCT_LENGTH
-	add hl, bc
-	ld c, l
-	ld b, h
-	dec e
-	jr nz, .loop
-	ret
-
-.found
-	ld hl, BATTLEANIMSTRUCT_ANON_JT_INDEX
-	add hl, bc
-	inc [hl]
-	ret
-
-BattleAnimCmd_IncBGEffect: ; cc4e3 (33:44e3)
-	call GetBattleAnimByte
-	ld e, 5
-	ld bc, ActiveBGEffects
-.loop
-	ld hl, $0
-	add hl, bc
-	ld d, [hl]
-	ld a, [BattleAnimByte]
-	cp d
-	jr z, .found
-	ld hl, 4
-	add hl, bc
-	ld c, l
-	ld b, h
-	dec e
-	jr nz, .loop
-	ret
-
-.found
-	ld hl, BG_EFFECT_STRUCT_JT_INDEX
-	add hl, bc
-	inc [hl]
-	ret
-
-BattleAnimCmd_SetObj: ; cc506 (33:4506)
-	call GetBattleAnimByte
-	ld e, 10
-	ld bc, ActiveAnimObjects
-.loop
-	ld hl, BATTLEANIMSTRUCT_INDEX
-	add hl, bc
-	ld d, [hl]
-	ld a, [BattleAnimByte]
-	cp d
-	jr z, .found
-	ld hl, BATTLEANIMSTRUCT_LENGTH
-	add hl, bc
-	ld c, l
-	ld b, h
-	dec e
-	jr nz, .loop
-	ret
-
-.found
-	call GetBattleAnimByte
-	ld hl, BATTLEANIMSTRUCT_ANON_JT_INDEX
-	add hl, bc
-	ld [hl], a
-	ret
-
-BattleAnimCmd_EnemyFeetObj: ; cc52c (33:452c)
-
-	ld hl, wBattleAnimTileDict
-.loop
-	ld a, [hl]
-	and a
-	jr z, .okay
-	inc hl
-	inc hl
-	jr .loop
-
-.okay
-	ld a, $28
-	ld [hli], a
-	ld a, $42
-	ld [hli], a
-	ld a, $29
-	ld [hli], a
-	ld a, $49
-	ld [hl], a
-
-	ld hl, VTiles0 tile $73
-	ld de, VTiles2 tile $06
-	ld a, $70
-	ld [wBattleAnimTemp0], a
-	ld a, $7
-	call .LoadFootprint
-	ld de, VTiles2 tile $31
-	ld a, $60
-	ld [wBattleAnimTemp0], a
-	ld a, $6
-	call .LoadFootprint
-	ret
-
-.LoadFootprint: ; cc561 (33:4561)
-	push af
-	push hl
-	push de
-	lb bc, BANK(BattleAnimCmd_EnemyFeetObj), 1
-	call Request2bpp
-	pop de
-	ld a, [wBattleAnimTemp0]
-	ld l, a
-	ld h, 0
-	add hl, de
-	ld e, l
-	ld d, h
-	pop hl
-	ld bc, 1 tiles
-	add hl, bc
-	pop af
-	dec a
-	jr nz, .LoadFootprint
-	ret
-
-BattleAnimCmd_PlayerHeadObj: ; cc57e (33:457e)
-
-	ld hl, wBattleAnimTileDict
-.loop
-	ld a, [hl]
-	and a
-	jr z, .okay
-	inc hl
-	inc hl
-	jr .loop
-
-.okay
-	ld a, $28
-	ld [hli], a
-	ld a, $35
-	ld [hli], a
-	ld a, $29
-	ld [hli], a
-	ld a, $43
-	ld [hl], a
-
-	ld hl, VTiles0 tile $66
-	ld de, VTiles2 tile $05
-	ld a, $70
-	ld [wBattleAnimTemp0], a
-	ld a, $7
-	call .LoadHead
-	ld de, VTiles2 tile $31
-	ld a, $60
-	ld [wBattleAnimTemp0], a
-	ld a, $6
-	call .LoadHead
-	ret
-
-.LoadHead: ; cc5b3 (33:45b3)
-	push af
-	push hl
-	push de
-	lb bc, BANK(BattleAnimCmd_EnemyFeetObj), 2
-	call Request2bpp
-	pop de
-	ld a, [wBattleAnimTemp0]
-	ld l, a
-	ld h, 0
-	add hl, de
-	ld e, l
-	ld d, h
-	pop hl
-	ld bc, 2 tiles
-	add hl, bc
-	pop af
-	dec a
-	jr nz, .LoadHead
-	ret
-
-BattleAnimCmd_CheckPokeball: ; cc5d0 (33:45d0)
-	callfar GetPokeBallWobble
-	ld a, c
-	ld [BattleAnimVar], a
-	ret
-
-BattleAnimCmd_E7: ; cc5db (33:45db)
-	ret
-
-BattleAnimCmd_Transform: ; cc5dc (33:45dc)
-	ld a, [rSVBK]
-	push af
-	ld a, 1
-	ld [rSVBK], a
-	ld a, [CurPartySpecies] ; CurPartySpecies
-	push af
-
-	ld a, [hBattleTurn]
-	and a
-	jr z, .player
-
-	ld a, [TempBattleMonSpecies] ; TempBattleMonSpecies
-	ld [CurPartySpecies], a ; CurPartySpecies
-	ld hl, BattleMonDVs ; BattleMonDVs
-	predef GetUnownLetter
-	ld de, VTiles0 tile $00
-	predef GetMonFrontpic
-	jr .done
-
-.player
-	ld a, [TempEnemyMonSpecies] ; TempEnemyMonSpecies
-	ld [CurPartySpecies], a ; CurPartySpecies
-	ld hl, EnemyMonDVs ; EnemyMonDVs
-	predef GetUnownLetter
-	ld de, VTiles0 tile $00
-	predef GetMonBackpic
-
-.done
-	pop af
-	ld [CurPartySpecies], a ; CurPartySpecies
-	pop af
-	ld [rSVBK], a
-	ret
-
-BattleAnimCmd_UpdateActorPic: ; cc622 (33:4622)
-
-	ld de, VTiles0 tile $00
-	ld a, [hBattleTurn]
-	and a
-	jr z, .player
-
-	ld hl, VTiles2 tile $00
-	ld b, 0
-	ld c, $31
-	call Request2bpp
-	ret
-
-.player
-	ld hl, VTiles2 tile $31
-	ld b, 0
-	ld c, $24
-	call Request2bpp
-	ret
-
-BattleAnimCmd_RaiseSub: ; cc640 (33:4640)
-
-	ld a, [rSVBK]
-	push af
-	ld a, 1
-	ld [rSVBK], a
-	xor a
-	call GetSRAMBank
-
-GetSubstitutePic: ; cc64c
-
-	ld hl, sScratch
-	ld bc, (7 * 7) tiles
-.loop
-	xor a
-	ld [hli], a
-	dec bc
-	ld a, c
-	or b
-	jr nz, .loop
-
-	ld a, [hBattleTurn]
-	and a
-	jr z, .player
-
-	ld hl, MonsterSpriteGFX + 0 tiles
-	ld de, sScratch + (2 * 7 + 5) tiles
-	call .CopyTile
-	ld hl, MonsterSpriteGFX + 1 tiles
-	ld de, sScratch + (3 * 7 + 5) tiles
-	call .CopyTile
-	ld hl, MonsterSpriteGFX + 2 tiles
-	ld de, sScratch + (2 * 7 + 6) tiles
-	call .CopyTile
-	ld hl, MonsterSpriteGFX + 3 tiles
-	ld de, sScratch + (3 * 7 + 6) tiles
-	call .CopyTile
-
-	ld hl, VTiles2 tile $00
-	ld de, sScratch
-	lb bc, BANK(GetSubstitutePic), 7 * 7
-	call Request2bpp
-	jr .done
-
-.player
-	ld hl, MonsterSpriteGFX + 4 tiles
-	ld de, sScratch + (2 * 6 + 4) tiles
-	call .CopyTile
-	ld hl, MonsterSpriteGFX + 5 tiles
-	ld de, sScratch + (3 * 6 + 4) tiles
-	call .CopyTile
-	ld hl, MonsterSpriteGFX + 6 tiles
-	ld de, sScratch + (2 * 6 + 5) tiles
-	call .CopyTile
-	ld hl, MonsterSpriteGFX + 7 tiles
-	ld de, sScratch + (3 * 6 + 5) tiles
-	call .CopyTile
-
-	ld hl, VTiles2 tile $31
-	ld de, sScratch
-	lb bc, BANK(GetSubstitutePic), 6 * 6
-	call Request2bpp
-
-.done
-	call CloseSRAM
-	pop af
-	ld [rSVBK], a
-	ret
-
-.CopyTile: ; cc6c6 (33:46c6)
-	ld bc, 1 tiles
-	ld a, BANK(MonsterSpriteGFX)
-	call FarCopyBytes
-	ret
-
-BattleAnimCmd_MinimizeOpp: ; cc6cf (33:46cf)
-	ld a, [rSVBK]
-	push af
-	ld a, $1
-	ld [rSVBK], a
-	xor a
-	call GetSRAMBank
-	call GetMinimizePic
-	call Request2bpp
-	call CloseSRAM
-	pop af
-	ld [rSVBK], a
-	ret
-
-GetMinimizePic: ; cc6e7 (33:46e7)
-	ld hl, sScratch
-	ld bc, $31 tiles
-.loop
-	xor a
-	ld [hli], a
-	dec bc
-	ld a, c
-	or b
-	jr nz, .loop
-
-	ld a, [hBattleTurn]
-	and a
-	jr z, .player
-
-	ld de, sScratch + $1a tiles
-	call CopyMinimizePic
-	ld hl, VTiles2 tile $00
-	ld de, sScratch
-	lb bc, BANK(GetMinimizePic), $31
-	ret
-
-.player
-	ld de, sScratch + $160
-	call CopyMinimizePic
-	ld hl, VTiles2 tile $31
-	ld de, sScratch
-	lb bc, BANK(GetMinimizePic), $24
-	ret
-
-CopyMinimizePic: ; cc719 (33:4719)
-	ld hl, MinimizePic
-	ld bc, $10
-	ld a, BANK(MinimizePic)
-	call FarCopyBytes
-	ret
-; cc725 (33:4725)
-
-MinimizePic: ; cc725
-INCBIN "gfx/battle/minimize.2bpp"
-; cc735
-
-BattleAnimCmd_Minimize: ; cc735 (33:4735)
-	ld a, [rSVBK]
-	push af
-	ld a, $1
-	ld [rSVBK], a
-	xor a
-	call GetSRAMBank
-	call GetMinimizePic
-	ld hl, VTiles0 tile $00
-	call Request2bpp
-	call CloseSRAM
-	pop af
-	ld [rSVBK], a
-	ret
-
-BattleAnimCmd_DropSub: ; cc750 (33:4750)
-	ld a, [rSVBK]
-	push af
-	ld a, $1
-	ld [rSVBK], a
-
-	ld a, [CurPartySpecies] ; CurPartySpecies
-	push af
-	ld a, [hBattleTurn]
-	and a
-	jr z, .player
-
-	callfar DropEnemySub
-	jr .done
-
-.player
-	callfar DropPlayerSub
-
-.done
-	pop af
-	ld [CurPartySpecies], a ; CurPartySpecies
-	pop af
-	ld [rSVBK], a
-	ret
-
-BattleAnimCmd_BeatUp: ; cc776 (33:4776)
-	ld a, [rSVBK]
-	push af
-	ld a, $1
-	ld [rSVBK], a
-	ld a, [CurPartySpecies] ; CurPartySpecies
-	push af
-
-	ld a, [wBattleAnimParam]
-	ld [CurPartySpecies], a ; CurPartySpecies
-
-	ld a, [hBattleTurn]
-	and a
-	jr z, .player
-
-	ld hl, BattleMonDVs
-	predef GetUnownLetter
-	ld de, VTiles2 tile $00
-	predef GetMonFrontpic
-	jr .done
-
-.player
-	ld hl, EnemyMonDVs
-	predef GetUnownLetter
-	ld de, VTiles2 tile $31
-	predef GetMonBackpic
-
-.done
-	pop af
-	ld [CurPartySpecies], a ; CurPartySpecies
-	ld b, SCGB_BATTLE_COLORS
-	call GetSGBLayout
-	pop af
-	ld [rSVBK], a
-	ret
-
-BattleAnimCmd_OAMOn: ; cc7bb (33:47bb)
-	xor a
-	ld [hOAMUpdate], a
-	ret
-
-BattleAnimCmd_OAMOff: ; cc7bf (33:47bf)
-	ld a, $1
-	ld [hOAMUpdate], a
-	ret
-
-BattleAnimCmd_ClearSprites: ; cc7c4 (33:47c4)
-	ld hl, BattleAnimFlags
-	set 3, [hl]
-	ret
-
-BattleAnimCmd_F5: ; cc7ca (33:47ca)
-	ret
-
-BattleAnimCmd_F6: ; cc7cb (33:47cb)
-	ret
-
-BattleAnimCmd_F7: ; cc7cc (33:47cc)
-	ret
-
-BattleAnimCmd_Sound: ; cc7cd (33:47cd)
-	call GetBattleAnimByte
-	ld e, a
-	srl a
-	srl a
-	ld [wSFXDuration], a
-	call .GetCryTrack
-	and 3
-	ld [CryTracks], a ; CryTracks
-
-	ld e, a
-	ld d, 0
-	ld hl, .GetPanning
-	add hl, de
-	ld a, [hl]
-	ld [wStereoPanningMask], a
-
-	call GetBattleAnimByte
-	ld e, a
-	ld d, 0
-	callfar PlayStereoSFX
-
-	ret
-; cc7f8 (33:47f8)
-
-.GetPanning: ; cc7f8
-	db $f0, $0f, $f0, $0f
-; cc7fc
-
-.GetCryTrack: ; cc7fc (33:47fc)
-	ld a, [hBattleTurn]
-	and a
-	jr nz, .enemy
-
-	ld a, e
-	ret
-
-.enemy
-	ld a, e
-	xor 1
-	ret
-
-BattleAnimCmd_Cry: ; cc807 (33:4807)
-	call GetBattleAnimByte
-	and 3
-	ld e, a
-	ld d, 0
-	ld hl, .CryData
-rept 4
-	add hl, de
-endr
-
-	ld a, [rSVBK]
-	push af
-	ld a, 1
-	ld [rSVBK], a
-
-	ld a, [hBattleTurn]
-	and a
-	jr nz, .enemy
-
-	ld a, $f0
-	ld [CryTracks], a ; CryTracks
-	ld a, [BattleMonSpecies] ; BattleMonSpecies
-	jr .done_cry_tracks
-
-.enemy
-	ld a, $0f
-	ld [CryTracks], a ; CryTracks
-	ld a, [EnemyMonSpecies] ; EnemyMon
-
-.done_cry_tracks
-	push hl
-	call LoadCryHeader
-	pop hl
-	jr c, .done
-
-	ld a, [hli]
-	ld c, a
-	ld a, [hli]
-	ld b, a
-
-	push hl
-	ld hl, CryPitch
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	add hl, bc
-	ld a, l
-	ld [CryPitch], a
-	ld a, h
-	ld [CryPitch + 1], a
-	pop hl
-
-	ld a, [hli]
-	ld c, a
-	ld b, [hl]
-	ld hl, CryLength ; CryLength
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	add hl, bc
-
-	ld a, l
-	ld [CryLength], a ; CryLength
-	ld a, h
-	ld [CryLength + 1], a
-	ld a, 1
-	ld [wStereoPanningMask], a
-
-	callfar _PlayCryHeader
-
-.done
-	pop af
-	ld [rSVBK], a
-	ret
-; cc871 (33:4871)
-
-.CryData: ; cc871
-; +pitch, +length
-	dw $0000, $00c0
-	dw $0000, $0040
-	dw $0000, $0000
-	dw $0000, $0000
-; cc881
-
-
-PlayHitSound: ; cc881
-	ld a, [wNumHits]
-	cp $1
-	jr z, .okay
-	cp $4
-	ret nz
-
-.okay
-	ld a, [TypeModifier]
-	and $7f
-	ret z
-
-	cp 10
-	ld de, SFX_DAMAGE
-	jr z, .play
-
-	ld de, SFX_SUPER_EFFECTIVE
-	jr nc, .play
-
-	ld de, SFX_NOT_VERY_EFFECTIVE
-
-.play
-	call PlaySFX
-	ret
-; cc8a4
-
-BattleAnimAssignPals: ; cc8a4
-	ld a, [hCGB]
-	and a
-	jr nz, .cgb
-	ld a, [hSGB]
-	and a
-	ld a, %11100000
-	jr z, .sgb
-	ld a, %11110000
-
-.sgb
-	ld [wOBP0], a
-	ld a, %11100100
-	ld [wBGP], a
-	ld [wOBP1], a
-	ret
-
-.cgb
-	ld a, %11100100
-	ld [wBGP], a
-	ld [wOBP0], a
-	ld [wOBP1], a
-	call DmgToCgbBGPals
-	lb de, %11100100, %11100100
-	call DmgToCgbObjPals
-	ret
-; cc8d3
-
-ClearBattleAnims: ; cc8d3
-; Clear animation block
-	ld hl, LYOverrides
-	ld bc, wBattleAnimEnd - LYOverrides
-.loop
-	ld [hl], $0
-	inc hl
-	dec bc
-	ld a, c
-	or b
-	jr nz, .loop
-
-	ld hl, FXAnimID
-	ld e, [hl]
-	inc hl
-	ld d, [hl]
-	ld hl, BattleAnimations
-	add hl, de
-	add hl, de
-	call GetBattleAnimPointer
-	call BattleAnimAssignPals
-	call BattleAnimDelayFrame
-	ret
-; cc8f6
-
-BattleAnim_RevertPals: ; cc8f6
-	call WaitTop
-	ld a, %11100100
-	ld [wBGP], a
-	ld [wOBP0], a
-	ld [wOBP1], a
-	call DmgToCgbBGPals
-	lb de, %11100100, %11100100
-	call DmgToCgbObjPals
-	xor a
-	ld [hSCX], a
-	ld [hSCY], a
-	call BattleAnimDelayFrame
-	ld a, $1
-	ld [hBGMapMode], a
-	ret
-; cc91a
-
-BattleAnim_SetBGPals: ; cc91a
-	ld [rBGP], a
-	ld a, [hCGB]
-	and a
-	ret z
-	ld a, [rSVBK]
-	push af
-	ld a, $5
-	ld [rSVBK], a
-	ld hl, BGPals
-	ld de, UnknBGPals
-	ld a, [rBGP]
-	ld b, a
-	ld c, 7
-	call CopyPals
-	ld hl, OBPals
-	ld de, UnknOBPals
-	ld a, [rBGP]
-	ld b, a
-	ld c, 2
-	call CopyPals
-	pop af
-	ld [rSVBK], a
-	ld a, $1
-	ld [hCGBPalUpdate], a
-	ret
-; cc94b
-
-BattleAnim_SetOBPals: ; cc94b
-	ld [rOBP0], a
-	ld a, [hCGB]
-	and a
-	ret z
-	ld a, [rSVBK]
-	push af
-	ld a, $5
-	ld [rSVBK], a
-	ld hl, OBPals palette PAL_BATTLE_OB_GRAY
-	ld de, UnknOBPals palette PAL_BATTLE_OB_GRAY
-	ld a, [rOBP0]
-	ld b, a
-	ld c, 2
-	call CopyPals
-	pop af
-	ld [rSVBK], a
-	ld a, $1
-	ld [hCGBPalUpdate], a
-	ret
-; cc96e
-
-BattleAnim_UpdateOAM_All: ; cc96e
-	ld a, $0
-	ld [wBattleAnimOAMPointerLo], a
-	ld hl, ActiveAnimObjects
-	ld e, 10
-.loop
-	ld a, [hl]
-	and a
-	jr z, .next
-	ld c, l
-	ld b, h
-	push hl
-	push de
-	call DoBattleAnimFrame
-	call BattleAnimOAMUpdate
-	pop de
-	pop hl
-	jr c, .done
-
-.next
-	ld bc, BATTLEANIMSTRUCT_LENGTH
-	add hl, bc
-	dec e
-	jr nz, .loop
-	ld a, [wBattleAnimOAMPointerLo]
-	ld l, a
-	ld h, HIGH(Sprites)
-.loop2
-	ld a, l
-	cp LOW(SpritesEnd)
-	jr nc, .done
-	xor a
-	ld [hli], a
-	jr .loop2
-
-.done
-	ret
-; cc9a1
--- a/battle/anim_gfx.asm
+++ /dev/null
@@ -1,41 +1,0 @@
-AnimObj00GFX: ; 84a2e
-AnimObjHitGFX:       INCBIN "gfx/fx/hit.2bpp.lz"
-AnimObjCutGFX:       INCBIN "gfx/fx/cut.2bpp.lz"
-AnimObjFireGFX:      INCBIN "gfx/fx/fire.2bpp.lz"
-AnimObjWaterGFX:     INCBIN "gfx/fx/water.2bpp.lz"
-AnimObjLightningGFX: INCBIN "gfx/fx/lightning.2bpp.lz"
-AnimObjSmokeGFX:     INCBIN "gfx/fx/smoke.2bpp.lz"
-AnimObjExplosionGFX: INCBIN "gfx/fx/explosion.2bpp.lz"
-AnimObjIceGFX:       INCBIN "gfx/fx/ice.2bpp.lz"
-AnimObjRocksGFX:     INCBIN "gfx/fx/rocks.2bpp.lz"
-AnimObjPoisonGFX:    INCBIN "gfx/fx/poison.2bpp.lz"
-AnimObjPlantGFX:     INCBIN "gfx/fx/plant.2bpp.lz"
-AnimObjPokeBallGFX:  INCBIN "gfx/fx/pokeball.2bpp.lz"
-AnimObjBubbleGFX:    INCBIN "gfx/fx/bubble.2bpp.lz"
-AnimObjNoiseGFX:     INCBIN "gfx/fx/noise.2bpp.lz"
-AnimObjReflectGFX:   INCBIN "gfx/fx/reflect.2bpp.lz"
-AnimObjPowderGFX:    INCBIN "gfx/fx/powder.2bpp.lz"
-AnimObjBeamGFX:      INCBIN "gfx/fx/beam.2bpp.lz"
-AnimObjSpeedGFX:     INCBIN "gfx/fx/speed.2bpp.lz"
-AnimObjChargeGFX:    INCBIN "gfx/fx/charge.2bpp.lz"
-AnimObjWindGFX:      INCBIN "gfx/fx/wind.2bpp.lz"
-AnimObjWhipGFX:      INCBIN "gfx/fx/whip.2bpp.lz"
-AnimObjRopeGFX:      INCBIN "gfx/fx/rope.2bpp.lz"
-AnimObjEggGFX:       INCBIN "gfx/fx/egg.2bpp.lz"
-AnimObjPsychicGFX:   INCBIN "gfx/fx/psychic.2bpp.lz"
-AnimObjSandGFX:      INCBIN "gfx/fx/sand.2bpp.lz"
-AnimObjWebGFX:       INCBIN "gfx/fx/web.2bpp.lz"
-AnimObjHazeGFX:      INCBIN "gfx/fx/haze.2bpp.lz"
-AnimObjHornGFX:      INCBIN "gfx/fx/horn.2bpp.lz"
-AnimObjFlowerGFX:    INCBIN "gfx/fx/flower.2bpp.lz"
-AnimObjMiscGFX:      INCBIN "gfx/fx/misc.2bpp.lz"
-AnimObjSkyAttackGFX: INCBIN "gfx/fx/skyattack.2bpp.lz"
-AnimObjGlobeGFX:     INCBIN "gfx/fx/globe.2bpp.lz"
-AnimObjShapesGFX:    INCBIN "gfx/fx/shapes.2bpp.lz"
-AnimObjStatusGFX:    INCBIN "gfx/fx/status.2bpp.lz"
-AnimObjObjectsGFX:   INCBIN "gfx/fx/objects.2bpp.lz"
-AnimObjShineGFX:     INCBIN "gfx/fx/shine.2bpp.lz"
-AnimObjAngelsGFX:    INCBIN "gfx/fx/angels.2bpp.lz"
-AnimObjWaveGFX:      INCBIN "gfx/fx/wave.2bpp.lz"
-AnimObjAeroblastGFX: INCBIN "gfx/fx/aeroblast.2bpp.lz"
-; 8640e
--- a/battle/anim_objects.asm
+++ /dev/null
@@ -1,9 +1,0 @@
-; Objects used in battle animations.
-
-INCLUDE "battle/objects/engine.asm"
-INCLUDE "battle/objects/data.asm"
-INCLUDE "battle/objects/functions.asm"
-INCLUDE "battle/objects/helpers.asm"
-INCLUDE "battle/objects/framesets.asm"
-INCLUDE "battle/objects/oam.asm"
-INCLUDE "battle/objects/object_gfx.asm"
--- a/battle/anims.asm
+++ /dev/null
@@ -1,5175 +1,0 @@
-BattleAnimations:: ; c906f
-	dw BattleAnim_0
-	dw BattleAnim_Pound
-	dw BattleAnim_KarateChop
-	dw BattleAnim_Doubleslap
-	dw BattleAnim_CometPunch
-	dw BattleAnim_MegaPunch
-	dw BattleAnim_PayDay
-	dw BattleAnim_FirePunch
-	dw BattleAnim_IcePunch
-	dw BattleAnim_Thunderpunch
-	dw BattleAnim_Scratch
-	dw BattleAnim_Vicegrip
-	dw BattleAnim_Guillotine
-	dw BattleAnim_RazorWind
-	dw BattleAnim_SwordsDance
-	dw BattleAnim_Cut
-	dw BattleAnim_Gust
-	dw BattleAnim_WingAttack
-	dw BattleAnim_Whirlwind
-	dw BattleAnim_Fly
-	dw BattleAnim_Bind
-	dw BattleAnim_Slam
-	dw BattleAnim_VineWhip
-	dw BattleAnim_Stomp
-	dw BattleAnim_DoubleKick
-	dw BattleAnim_MegaKick
-	dw BattleAnim_JumpKick
-	dw BattleAnim_RollingKick
-	dw BattleAnim_SandAttack
-	dw BattleAnim_Headbutt
-	dw BattleAnim_HornAttack
-	dw BattleAnim_FuryAttack
-	dw BattleAnim_HornDrill
-	dw BattleAnim_Tackle
-	dw BattleAnim_BodySlam
-	dw BattleAnim_Wrap
-	dw BattleAnim_TakeDown
-	dw BattleAnim_Thrash
-	dw BattleAnim_DoubleEdge
-	dw BattleAnim_TailWhip
-	dw BattleAnim_PoisonSting
-	dw BattleAnim_Twineedle
-	dw BattleAnim_PinMissile
-	dw BattleAnim_Leer
-	dw BattleAnim_Bite
-	dw BattleAnim_Growl
-	dw BattleAnim_Roar
-	dw BattleAnim_Sing
-	dw BattleAnim_Supersonic
-	dw BattleAnim_Sonicboom
-	dw BattleAnim_Disable
-	dw BattleAnim_Acid
-	dw BattleAnim_Ember
-	dw BattleAnim_Flamethrower
-	dw BattleAnim_Mist
-	dw BattleAnim_WaterGun
-	dw BattleAnim_HydroPump
-	dw BattleAnim_Surf
-	dw BattleAnim_IceBeam
-	dw BattleAnim_Blizzard
-	dw BattleAnim_Psybeam
-	dw BattleAnim_Bubblebeam
-	dw BattleAnim_AuroraBeam
-	dw BattleAnim_HyperBeam
-	dw BattleAnim_Peck
-	dw BattleAnim_DrillPeck
-	dw BattleAnim_Submission
-	dw BattleAnim_LowKick
-	dw BattleAnim_Counter
-	dw BattleAnim_SeismicToss
-	dw BattleAnim_Strength
-	dw BattleAnim_Absorb
-	dw BattleAnim_MegaDrain
-	dw BattleAnim_LeechSeed
-	dw BattleAnim_Growth
-	dw BattleAnim_RazorLeaf
-	dw BattleAnim_Solarbeam
-	dw BattleAnim_Poisonpowder
-	dw BattleAnim_StunSpore
-	dw BattleAnim_SleepPowder
-	dw BattleAnim_PetalDance
-	dw BattleAnim_StringShot
-	dw BattleAnim_DragonRage
-	dw BattleAnim_FireSpin
-	dw BattleAnim_Thundershock
-	dw BattleAnim_Thunderbolt
-	dw BattleAnim_ThunderWave
-	dw BattleAnim_Thunder
-	dw BattleAnim_RockThrow
-	dw BattleAnim_Earthquake
-	dw BattleAnim_Fissure
-	dw BattleAnim_Dig
-	dw BattleAnim_Toxic
-	dw BattleAnim_Confusion
-	dw BattleAnim_PsychicM
-	dw BattleAnim_Hypnosis
-	dw BattleAnim_Meditate
-	dw BattleAnim_Agility
-	dw BattleAnim_QuickAttack
-	dw BattleAnim_Rage
-	dw BattleAnim_Teleport
-	dw BattleAnim_NightShade
-	dw BattleAnim_Mimic
-	dw BattleAnim_Screech
-	dw BattleAnim_DoubleTeam
-	dw BattleAnim_Recover
-	dw BattleAnim_Harden
-	dw BattleAnim_Minimize
-	dw BattleAnim_Smokescreen
-	dw BattleAnim_ConfuseRay
-	dw BattleAnim_Withdraw
-	dw BattleAnim_DefenseCurl
-	dw BattleAnim_Barrier
-	dw BattleAnim_LightScreen
-	dw BattleAnim_Haze
-	dw BattleAnim_Reflect
-	dw BattleAnim_FocusEnergy
-	dw BattleAnim_Bide
-	dw BattleAnim_Metronome
-	dw BattleAnim_MirrorMove
-	dw BattleAnim_Selfdestruct
-	dw BattleAnim_EggBomb
-	dw BattleAnim_Lick
-	dw BattleAnim_Smog
-	dw BattleAnim_Sludge
-	dw BattleAnim_BoneClub
-	dw BattleAnim_FireBlast
-	dw BattleAnim_Waterfall
-	dw BattleAnim_Clamp
-	dw BattleAnim_Swift
-	dw BattleAnim_SkullBash
-	dw BattleAnim_SpikeCannon
-	dw BattleAnim_Constrict
-	dw BattleAnim_Amnesia
-	dw BattleAnim_Kinesis
-	dw BattleAnim_Softboiled
-	dw BattleAnim_HiJumpKick
-	dw BattleAnim_Glare
-	dw BattleAnim_DreamEater
-	dw BattleAnim_PoisonGas
-	dw BattleAnim_Barrage
-	dw BattleAnim_LeechLife
-	dw BattleAnim_LovelyKiss
-	dw BattleAnim_SkyAttack
-	dw BattleAnim_Transform
-	dw BattleAnim_Bubble
-	dw BattleAnim_DizzyPunch
-	dw BattleAnim_Spore
-	dw BattleAnim_Flash
-	dw BattleAnim_Psywave
-	dw BattleAnim_Splash
-	dw BattleAnim_AcidArmor
-	dw BattleAnim_Crabhammer
-	dw BattleAnim_Explosion
-	dw BattleAnim_FurySwipes
-	dw BattleAnim_Bonemerang
-	dw BattleAnim_Rest
-	dw BattleAnim_RockSlide
-	dw BattleAnim_HyperFang
-	dw BattleAnim_Sharpen
-	dw BattleAnim_Conversion
-	dw BattleAnim_TriAttack
-	dw BattleAnim_SuperFang
-	dw BattleAnim_Slash
-	dw BattleAnim_Substitute
-	dw BattleAnim_Struggle
-	dw BattleAnim_Sketch
-	dw BattleAnim_TripleKick
-	dw BattleAnim_Thief
-	dw BattleAnim_SpiderWeb
-	dw BattleAnim_MindReader
-	dw BattleAnim_Nightmare
-	dw BattleAnim_FlameWheel
-	dw BattleAnim_Snore
-	dw BattleAnim_Curse
-	dw BattleAnim_Flail
-	dw BattleAnim_Conversion2
-	dw BattleAnim_Aeroblast
-	dw BattleAnim_CottonSpore
-	dw BattleAnim_Reversal
-	dw BattleAnim_Spite
-	dw BattleAnim_PowderSnow
-	dw BattleAnim_Protect
-	dw BattleAnim_MachPunch
-	dw BattleAnim_ScaryFace
-	dw BattleAnim_FaintAttack
-	dw BattleAnim_SweetKiss
-	dw BattleAnim_BellyDrum
-	dw BattleAnim_SludgeBomb
-	dw BattleAnim_MudSlap
-	dw BattleAnim_Octazooka
-	dw BattleAnim_Spikes
-	dw BattleAnim_ZapCannon
-	dw BattleAnim_Foresight
-	dw BattleAnim_DestinyBond
-	dw BattleAnim_PerishSong
-	dw BattleAnim_IcyWind
-	dw BattleAnim_Detect
-	dw BattleAnim_BoneRush
-	dw BattleAnim_LockOn
-	dw BattleAnim_Outrage
-	dw BattleAnim_Sandstorm
-	dw BattleAnim_GigaDrain
-	dw BattleAnim_Endure
-	dw BattleAnim_Charm
-	dw BattleAnim_Rollout
-	dw BattleAnim_FalseSwipe
-	dw BattleAnim_Swagger
-	dw BattleAnim_MilkDrink
-	dw BattleAnim_Spark
-	dw BattleAnim_FuryCutter
-	dw BattleAnim_SteelWing
-	dw BattleAnim_MeanLook
-	dw BattleAnim_Attract
-	dw BattleAnim_SleepTalk
-	dw BattleAnim_HealBell
-	dw BattleAnim_Return
-	dw BattleAnim_Present
-	dw BattleAnim_Frustration
-	dw BattleAnim_Safeguard
-	dw BattleAnim_PainSplit
-	dw BattleAnim_SacredFire
-	dw BattleAnim_Magnitude
-	dw BattleAnim_Dynamicpunch
-	dw BattleAnim_Megahorn
-	dw BattleAnim_Dragonbreath
-	dw BattleAnim_BatonPass
-	dw BattleAnim_Encore
-	dw BattleAnim_Pursuit
-	dw BattleAnim_RapidSpin
-	dw BattleAnim_SweetScent
-	dw BattleAnim_IronTail
-	dw BattleAnim_MetalClaw
-	dw BattleAnim_VitalThrow
-	dw BattleAnim_MorningSun
-	dw BattleAnim_Synthesis
-	dw BattleAnim_Moonlight
-	dw BattleAnim_HiddenPower
-	dw BattleAnim_CrossChop
-	dw BattleAnim_Twister
-	dw BattleAnim_RainDance
-	dw BattleAnim_SunnyDay
-	dw BattleAnim_Crunch
-	dw BattleAnim_MirrorCoat
-	dw BattleAnim_PsychUp
-	dw BattleAnim_Extremespeed
-	dw BattleAnim_Ancientpower
-	dw BattleAnim_ShadowBall
-	dw BattleAnim_FutureSight
-	dw BattleAnim_RockSmash
-	dw BattleAnim_Whirlpool
-	dw BattleAnim_BeatUp
-	dw BattleAnim_252
-	dw BattleAnim_253
-	dw BattleAnim_254
-	dw BattleAnim_SweetScent2
-; $100
-	dw BattleAnim_ThrowPokeBall
-	dw BattleAnim_SendOutMon
-	dw BattleAnim_ReturnMon
-	dw BattleAnim_Confused
-	dw BattleAnim_Slp
-	dw BattleAnim_Brn
-	dw BattleAnim_Psn
-	dw BattleAnim_Sap
-	dw BattleAnim_Frz
-	dw BattleAnim_Par
-	dw BattleAnim_InLove
-	dw BattleAnim_InSandstorm
-	dw BattleAnim_InNightmare
-	dw BattleAnim_InWhirlpool
-	dw BattleAnim_Miss
-	dw BattleAnim_EnemyDamage
-	dw BattleAnim_EnemyStatDown
-	dw BattleAnim_PlayerStatDown
-	dw BattleAnim_PlayerDamage
-	dw BattleAnim_Wobble
-	dw BattleAnim_Shake
-	dw BattleAnim_HitConfusion
-; c929b
-
-BattleAnim_0: ; c929b
-BattleAnim_252: ; c929b
-BattleAnim_253: ; c929b
-BattleAnim_254: ; c929b
-BattleAnim_MirrorMove: ; c929b
-	anim_ret
-; c929c
-
-BattleAnim_SweetScent2: ; c929c
-	anim_2gfx ANIM_GFX_FLOWER, ANIM_GFX_MISC
-	anim_obj ANIM_OBJ_FLOWER,   8, 0,  12, 0, $2
-	anim_wait 2
-	anim_obj ANIM_OBJ_FLOWER,   8, 0,  10, 0, $2
-	anim_wait 64
-	anim_obj ANIM_OBJ_COTTON, -15, 0,   5, 0, $15
-	anim_obj ANIM_OBJ_COTTON, -15, 0,   5, 0, $2a
-	anim_obj ANIM_OBJ_COTTON, -15, 0,   5, 0, $3f
-	anim_bgeffect ANIM_BG_06, $0, $2, $0
-	anim_wait 128
-	anim_ret
-; c92c1
-
-BattleAnim_ThrowPokeBall
-	anim_if_param_equal NO_ITEM, .TheTrainerBlockedTheBall
-	anim_if_param_equal MASTER_BALL, .MasterBall
-	anim_if_param_equal ULTRA_BALL, .UltraBall
-	anim_if_param_equal GREAT_BALL, .GreatBall
-	; any other ball
-	anim_2gfx ANIM_GFX_POKE_BALL, ANIM_GFX_SMOKE
-	anim_sound 6, 2, SFX_THROW_BALL
-	anim_obj ANIM_OBJ_POKE_BALL,   8, 4,  11, 4, $40
-	anim_wait 36
-	anim_obj ANIM_OBJ_POKE_BALL, -15, 0,   8, 1, $0
-	anim_setobj $2, $7
-	anim_wait 16
-	anim_sound 0, 1, SFX_BALL_POOF
-	anim_obj ANIM_OBJ_BALL_POOF, -15, 0,   8, 0, $10
-	anim_wait 16
-	anim_jump .Shake
-; c92f2
-
-.TheTrainerBlockedTheBall:
-	anim_2gfx ANIM_GFX_POKE_BALL, ANIM_GFX_HIT
-	anim_sound 6, 2, SFX_THROW_BALL
-	anim_obj ANIM_OBJ_POKE_BALL_BLOCKED,   8, 0,  11, 4, $20
-	anim_wait 20
-	anim_obj ANIM_OBJ_01,  14, 0,   5, 0, $0
-	anim_wait 32
-	anim_ret
-; c9305
-
-.UltraBall:
-	anim_2gfx ANIM_GFX_POKE_BALL, ANIM_GFX_SMOKE
-	anim_sound 6, 2, SFX_THROW_BALL
-	anim_obj ANIM_OBJ_POKE_BALL,   8, 4,  11, 4, $40
-	anim_wait 36
-	anim_obj ANIM_OBJ_POKE_BALL, -15, 0,   8, 1, $0
-	anim_setobj $2, $7
-	anim_wait 16
-	anim_sound 0, 1, SFX_BALL_POOF
-	anim_obj ANIM_OBJ_BALL_POOF, -15, 0,   8, 0, $10
-	anim_wait 16
-	anim_jump .Shake
-; c9326
-
-.GreatBall:
-	anim_2gfx ANIM_GFX_POKE_BALL, ANIM_GFX_SMOKE
-	anim_sound 6, 2, SFX_THROW_BALL
-	anim_obj ANIM_OBJ_POKE_BALL,   8, 4,  11, 4, $40
-	anim_wait 36
-	anim_obj ANIM_OBJ_POKE_BALL, -15, 0,   8, 1, $0
-	anim_setobj $2, $7
-	anim_wait 16
-	anim_sound 0, 1, SFX_BALL_POOF
-	anim_obj ANIM_OBJ_BALL_POOF, -15, 0,   8, 0, $10
-	anim_wait 16
-	anim_jump .Shake
-; c9347
-
-.MasterBall:
-	anim_3gfx ANIM_GFX_POKE_BALL, ANIM_GFX_SMOKE, ANIM_GFX_SPEED
-	anim_sound 6, 2, SFX_THROW_BALL
-	anim_obj ANIM_OBJ_POKE_BALL,   8, 0,  11, 4, $20
-	anim_wait 36
-	anim_obj ANIM_OBJ_POKE_BALL, -15, 0,   8, 1, $0
-	anim_setobj $2, $7
-	anim_wait 16
-	anim_sound 0, 1, SFX_BALL_POOF
-	anim_obj ANIM_OBJ_BALL_POOF, -15, 0,   8, 0, $10
-	anim_wait 24
-	anim_sound 0, 1, SFX_MASTER_BALL
-	anim_obj ANIM_OBJ_MASTER_BALL_SPARKLE, -15, 0,   7, 0, $30
-	anim_obj ANIM_OBJ_MASTER_BALL_SPARKLE, -15, 0,   7, 0, $31
-	anim_obj ANIM_OBJ_MASTER_BALL_SPARKLE, -15, 0,   7, 0, $32
-	anim_obj ANIM_OBJ_MASTER_BALL_SPARKLE, -15, 0,   7, 0, $33
-	anim_obj ANIM_OBJ_MASTER_BALL_SPARKLE, -15, 0,   7, 0, $34
-	anim_obj ANIM_OBJ_MASTER_BALL_SPARKLE, -15, 0,   7, 0, $35
-	anim_obj ANIM_OBJ_MASTER_BALL_SPARKLE, -15, 0,   7, 0, $36
-	anim_obj ANIM_OBJ_MASTER_BALL_SPARKLE, -15, 0,   7, 0, $37
-	anim_wait 64
-.Shake:
-	anim_bgeffect ANIM_BG_RETURN_MON, $0, $0, $0
-	anim_wait 8
-	anim_incobj  2
-	anim_wait 16
-	anim_sound 0, 1, SFX_CHANGE_DEX_MODE
-	anim_incobj  1
-	anim_wait 32
-	anim_sound 0, 1, SFX_BALL_BOUNCE
-	anim_wait 32
-	anim_wait 32
-	anim_wait 32
-	anim_wait 8
-	anim_setvar $0
-.Loop:
-	anim_wait 48
-	anim_checkpokeball
-	anim_if_var_equal $1, .Click
-	anim_if_var_equal $2, .BreakFree
-	anim_incobj  1
-	anim_sound 0, 1, SFX_BALL_WIGGLE
-	anim_jump .Loop
-; c93bc
-
-.Click:
-	anim_clearsprites
-	anim_ret
-; c93be
-
-.BreakFree:
-	anim_setobj $1, $b
-	anim_sound 0, 1, SFX_BALL_POOF
-	anim_obj ANIM_OBJ_BALL_POOF, -15, 0,   8, 0, $10
-	anim_wait 2
-	anim_bgeffect ANIM_BG_ENTER_MON, $0, $0, $0
-	anim_wait 32
-	anim_ret
-; c93d1
-
-BattleAnim_SendOutMon: ; c93d1
-	anim_if_param_equal $0, .Normal
-	anim_if_param_equal $1, .Shiny
-	anim_if_param_equal $2, .Unknown
-	anim_1gfx ANIM_GFX_SMOKE
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_bgeffect ANIM_BG_2B, $0, $1, $0
-	anim_sound 0, 0, SFX_BALL_POOF
-	anim_obj ANIM_OBJ_1B,   6, 0,  12, 0, $0
-	anim_bgeffect ANIM_BG_ENTER_MON, $0, $1, $0
-	anim_wait 128
-	anim_wait 4
-	anim_call BattleAnim_ShowMon_0
-	anim_ret
-
-.Unknown:
-	anim_1gfx ANIM_GFX_SMOKE
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_bgeffect ANIM_BG_2A, $0, $1, $0
-	anim_wait 1
-	anim_bgeffect ANIM_BG_SHOW_MON, $0, $1, $0
-	anim_wait 4
-	anim_sound 0, 0, SFX_BALL_POOF
-	anim_obj ANIM_OBJ_1B,   6, 0,  12, 0, $0
-	anim_incbgeffect ANIM_BG_2A
-	anim_wait 96
-	anim_incbgeffect ANIM_BG_2A
-	anim_call BattleAnim_ShowMon_0
-	anim_ret
-
-.Shiny:
-	anim_1gfx ANIM_GFX_SPEED
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $4, $3
-	anim_bgeffect ANIM_BG_06, $0, $2, $0
-	anim_sound 0, 0, SFX_SHINE
-	anim_obj ANIM_OBJ_6D,   6, 0,  12, 0, $0
-	anim_wait 4
-	anim_sound 0, 0, SFX_SHINE
-	anim_obj ANIM_OBJ_6D,   6, 0,  12, 0, $8
-	anim_wait 4
-	anim_sound 0, 0, SFX_SHINE
-	anim_obj ANIM_OBJ_6D,   6, 0,  12, 0, $10
-	anim_wait 4
-	anim_sound 0, 0, SFX_SHINE
-	anim_obj ANIM_OBJ_6D,   6, 0,  12, 0, $18
-	anim_wait 4
-	anim_sound 0, 0, SFX_SHINE
-	anim_obj ANIM_OBJ_6D,   6, 0,  12, 0, $20
-	anim_wait 4
-	anim_sound 0, 0, SFX_SHINE
-	anim_obj ANIM_OBJ_6D,   6, 0,  12, 0, $28
-	anim_wait 4
-	anim_sound 0, 0, SFX_SHINE
-	anim_obj ANIM_OBJ_6D,   6, 0,  12, 0, $30
-	anim_wait 4
-	anim_sound 0, 0, SFX_SHINE
-	anim_obj ANIM_OBJ_6D,   6, 0,  12, 0, $38
-	anim_wait 32
-	anim_ret
-
-.Normal:
-	anim_1gfx ANIM_GFX_SMOKE
-	anim_sound 0, 0, SFX_BALL_POOF
-	anim_obj ANIM_OBJ_BALL_POOF,   5, 4,  12, 0, $0
-	anim_wait 4
-	anim_bgeffect ANIM_BG_ENTER_MON, $0, $1, $0
-	anim_wait 32
-	anim_ret
-; c9483
-
-BattleAnim_ReturnMon: ; c9483
-	anim_sound 0, 0, SFX_BALL_POOF
-BattleAnim_BatonPass_branch_c9486: ; c9486
-	anim_bgeffect ANIM_BG_RETURN_MON, $0, $1, $0
-	anim_wait 32
-	anim_ret
-; c948d
-
-BattleAnim_Confused: ; c948d
-	anim_1gfx ANIM_GFX_STATUS
-	anim_sound 0, 0, SFX_KINESIS
-	anim_obj ANIM_OBJ_CHICK,   5, 4,   7, 0, $15
-	anim_obj ANIM_OBJ_CHICK,   5, 4,   7, 0, $aa
-	anim_obj ANIM_OBJ_CHICK,   5, 4,   7, 0, $bf
-	anim_wait 96
-	anim_ret
-; c94a3
-
-BattleAnim_Slp: ; c94a3
-	anim_1gfx ANIM_GFX_STATUS
-	anim_sound 0, 0, SFX_TAIL_WHIP
-.loop
-	anim_obj ANIM_OBJ_54,   8, 0,  10, 0, $0
-	anim_wait 40
-	anim_loop 3, .loop
-	anim_wait 32
-	anim_ret
-; c94b4
-
-BattleAnim_Brn: ; c94b4
-	anim_1gfx ANIM_GFX_FIRE
-.loop
-	anim_sound 0, 0, SFX_BURN
-	anim_obj ANIM_OBJ_BURNED,   7, 0,  11, 0, $10
-	anim_wait 4
-	anim_loop 3, .loop
-	anim_wait 6
-	anim_ret
-; c94c5
-
-BattleAnim_Psn: ; c94c5
-	anim_1gfx ANIM_GFX_POISON
-	anim_sound 0, 0, SFX_POISON
-	anim_obj ANIM_OBJ_SKULL,   8, 0,   7, 0, $0
-	anim_wait 8
-	anim_sound 0, 0, SFX_POISON
-	anim_obj ANIM_OBJ_SKULL,   6, 0,   7, 0, $0
-	anim_wait 8
-	anim_ret
-; c94da
-
-BattleAnim_Sap: ; c94da
-	anim_1gfx ANIM_GFX_CHARGE
-	anim_sound 6, 3, SFX_WATER_GUN
-	anim_obj ANIM_OBJ_ABSORB,  16, 0,   6, 0, $2
-	anim_wait 6
-	anim_sound 6, 3, SFX_WATER_GUN
-	anim_obj ANIM_OBJ_ABSORB, -15, 0,   8, 0, $3
-	anim_wait 6
-	anim_sound 6, 3, SFX_WATER_GUN
-	anim_obj ANIM_OBJ_ABSORB, -15, 0,   4, 0, $4
-	anim_wait 16
-	anim_ret
-; c94f8
-
-BattleAnim_Frz: ; c94f8
-	anim_1gfx ANIM_GFX_ICE
-	anim_obj ANIM_OBJ_FROZEN,   5, 4,  13, 6, $0
-	anim_sound 0, 0, SFX_SHINE
-	anim_wait 16
-	anim_sound 0, 0, SFX_SHINE
-	anim_wait 16
-	anim_ret
-; c9508
-
-BattleAnim_Par: ; c9508
-	anim_1gfx ANIM_GFX_STATUS
-	anim_bgeffect ANIM_BG_06, $0, $2, $0
-	anim_sound 0, 0, SFX_THUNDERSHOCK
-	anim_obj ANIM_OBJ_PARALYZED,   2, 4,  11, 0, $42
-	anim_obj ANIM_OBJ_PARALYZED,   9, 4,  11, 0, $c2
-	anim_wait 128
-	anim_ret
-; c951e
-
-BattleAnim_InLove: ; c951e
-	anim_1gfx ANIM_GFX_OBJECTS
-	anim_sound 0, 0, SFX_LICK
-	anim_obj ANIM_OBJ_HEART,   8, 0,   9, 4, $0
-	anim_wait 32
-	anim_sound 0, 0, SFX_LICK
-	anim_obj ANIM_OBJ_HEART,   4, 4,   9, 0, $0
-	anim_wait 32
-	anim_ret
-; c9533
-
-BattleAnim_InSandstorm: ; c9533
-	anim_1gfx ANIM_GFX_POWDER
-	anim_obj ANIM_OBJ_A2,  11, 0,   0, 0, $0
-	anim_wait 8
-	anim_obj ANIM_OBJ_A2,   9, 0,   0, 0, $1
-	anim_wait 8
-	anim_obj ANIM_OBJ_A2,   7, 0,   0, 0, $2
-.loop
-	anim_sound 0, 1, SFX_MENU
-	anim_wait 8
-	anim_loop 6, .loop
-	anim_wait 8
-	anim_ret
-; c9550
-
-BattleAnim_InNightmare: ; c9550
-	anim_1gfx ANIM_GFX_ANGELS
-	anim_sound 0, 0, SFX_BUBBLEBEAM
-	anim_obj ANIM_OBJ_95,   8, 4,  10, 0, $0
-	anim_wait 40
-	anim_ret
-; c955c
-
-BattleAnim_InWhirlpool: ; c955c
-	anim_1gfx ANIM_GFX_WIND
-	anim_bgeffect ANIM_BG_WHIRLPOOL, $0, $0, $0
-	anim_sound 0, 1, SFX_SURF
-.loop
-	anim_obj ANIM_OBJ_GUST, -16, 4,   9, 0, $0
-	anim_wait 6
-	anim_loop 6, .loop
-	anim_incbgeffect ANIM_BG_WHIRLPOOL
-	anim_wait 1
-	anim_ret
-; c9574
-
-BattleAnim_HitConfusion: ; c9574
-	anim_1gfx ANIM_GFX_HIT
-	anim_sound 0, 0, SFX_POUND
-	anim_obj ANIM_OBJ_04,   5, 4,  12, 0, $0
-	anim_wait 16
-	anim_ret
-; c9580
-
-BattleAnim_Miss: ; c9580
-	anim_ret
-; c9581
-
-BattleAnim_EnemyDamage: ; c9581
-.loop
-	anim_bgeffect ANIM_BG_HIDE_MON, $0, $0, $0
-	anim_wait 5
-	anim_bgeffect ANIM_BG_SHOW_MON, $0, $0, $0
-	anim_wait 5
-	anim_loop 3, .loop
-	anim_ret
-; c9592
-
-BattleAnim_EnemyStatDown: ; c9592
-	anim_call BattleAnim_FollowEnemyFeet_1
-	anim_bgeffect ANIM_BG_VIBRATE_MON, $0, $0, $0
-	anim_wait 40
-	anim_call BattleAnim_ShowMon_1
-	anim_wait 1
-	anim_ret
-; c95a0
-
-BattleAnim_PlayerStatDown: ; c95a0
-	anim_call BattleAnim_FollowEnemyFeet_1
-	anim_bgeffect ANIM_BG_WOBBLE_MON, $0, $0, $0
-	anim_wait 40
-	anim_call BattleAnim_ShowMon_1
-	anim_wait 1
-	anim_ret
-; c95ae
-
-BattleAnim_PlayerDamage: ; c95ae
-	anim_bgeffect ANIM_BG_20, $20, $2, $20
-	anim_wait 40
-	anim_ret
-; c95b5
-
-BattleAnim_Wobble: ; c95b5
-	anim_bgeffect ANIM_BG_35, $0, $0, $0
-	anim_wait 40
-	anim_ret
-; c95bc
-
-BattleAnim_Shake: ; c95bc
-	anim_bgeffect ANIM_BG_1F, $20, $2, $40
-	anim_wait 40
-	anim_ret
-; c95c3
-
-BattleAnim_Pound: ; c95c3
-	anim_1gfx ANIM_GFX_HIT
-	anim_sound 0, 1, SFX_POUND
-	anim_obj ANIM_OBJ_08, -15, 0,   7, 0, $0
-	anim_wait 6
-	anim_obj ANIM_OBJ_01, -15, 0,   7, 0, $0
-	anim_wait 16
-	anim_ret
-; c95d5
-
-BattleAnim_KarateChop: ; c95d5
-	anim_1gfx ANIM_GFX_HIT
-	anim_sound 0, 1, SFX_KARATE_CHOP
-	anim_obj ANIM_OBJ_08, -15, 0,   5, 0, $0
-	anim_wait 6
-	anim_obj ANIM_OBJ_01, -15, 0,   5, 0, $0
-	anim_wait 6
-	anim_sound 0, 1, SFX_KARATE_CHOP
-	anim_obj ANIM_OBJ_08, -15, 0,   5, 4, $0
-	anim_wait 6
-	anim_obj ANIM_OBJ_01, -15, 0,   5, 4, $0
-	anim_wait 6
-	anim_sound 0, 1, SFX_KARATE_CHOP
-	anim_obj ANIM_OBJ_08, -15, 0,   6, 0, $0
-	anim_wait 6
-	anim_obj ANIM_OBJ_01, -15, 0,   6, 0, $0
-	anim_wait 16
-	anim_ret
-; c9605
-
-BattleAnim_Doubleslap: ; c9605
-	anim_1gfx ANIM_GFX_HIT
-	anim_if_param_equal $1, BattleAnim_Doubleslap_branch_c961b
-	anim_sound 0, 1, SFX_DOUBLESLAP
-	anim_obj ANIM_OBJ_08, -14, 0,   6, 0, $0
-	anim_wait 6
-	anim_obj ANIM_OBJ_01, -14, 0,   6, 0, $0
-	anim_wait 8
-	anim_ret
-; c961b
-
-BattleAnim_Doubleslap_branch_c961b: ; c961b
-	anim_sound 0, 1, SFX_DOUBLESLAP
-	anim_obj ANIM_OBJ_08,  15, 0,   6, 0, $0
-	anim_wait 6
-	anim_obj ANIM_OBJ_01,  15, 0,   6, 0, $0
-	anim_wait 8
-	anim_ret
-; c962b
-
-BattleAnim_CometPunch: ; c962b
-	anim_1gfx ANIM_GFX_HIT
-	anim_if_param_equal $1, BattleAnim_CometPunch_branch_c9641
-	anim_sound 0, 1, SFX_COMET_PUNCH
-	anim_obj ANIM_OBJ_06, -14, 0,   6, 0, $0
-	anim_wait 6
-	anim_obj ANIM_OBJ_01, -14, 0,   6, 0, $0
-	anim_wait 8
-	anim_ret
-; c9641
-
-BattleAnim_CometPunch_branch_c9641: ; c9641
-	anim_sound 0, 1, SFX_COMET_PUNCH
-	anim_obj ANIM_OBJ_06,  15, 0,   8, 0, $0
-	anim_wait 6
-	anim_obj ANIM_OBJ_01,  15, 0,   8, 0, $0
-	anim_wait 8
-	anim_ret
-; c9651
-
-BattleAnim_Bide_branch_c9651: ; c9651
-BattleAnim_MegaPunch: ; c9651
-	anim_1gfx ANIM_GFX_HIT
-	anim_bgeffect ANIM_BG_1F, $40, $2, $0
-	anim_wait 48
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $3
-.loop
-	anim_sound 0, 1, SFX_MEGA_PUNCH
-	anim_obj ANIM_OBJ_06, -15, 0,   7, 0, $0
-	anim_obj ANIM_OBJ_00, -15, 0,   7, 0, $0
-	anim_wait 6
-	anim_obj ANIM_OBJ_06, -15, 0,   7, 0, $0
-	anim_wait 6
-	anim_loop 3, .loop
-	anim_ret
-; c9677
-
-BattleAnim_Stomp: ; c9677
-	anim_1gfx ANIM_GFX_HIT
-	anim_sound 0, 1, SFX_STOMP
-	anim_obj ANIM_OBJ_07, -15, 0,   5, 0, $0
-	anim_wait 6
-	anim_obj ANIM_OBJ_01, -15, 0,   5, 0, $0
-	anim_wait 6
-	anim_sound 0, 1, SFX_STOMP
-	anim_obj ANIM_OBJ_07, -15, 0,   5, 4, $0
-	anim_wait 6
-	anim_obj ANIM_OBJ_01, -15, 0,   5, 4, $0
-	anim_wait 6
-	anim_sound 0, 1, SFX_STOMP
-	anim_obj ANIM_OBJ_07, -15, 0,   6, 0, $0
-	anim_wait 6
-	anim_obj ANIM_OBJ_01, -15, 0,   6, 0, $0
-	anim_wait 16
-	anim_ret
-; c96a7
-
-BattleAnim_DoubleKick: ; c96a7
-	anim_1gfx ANIM_GFX_HIT
-	anim_if_param_equal $1, BattleAnim_DoubleKick_branch_c96bd
-	anim_sound 0, 1, SFX_DOUBLE_KICK
-	anim_obj ANIM_OBJ_07, -14, 0,   6, 0, $0
-	anim_wait 6
-	anim_obj ANIM_OBJ_01, -14, 0,   6, 0, $0
-	anim_wait 8
-	anim_ret
-; c96bd
-
-BattleAnim_DoubleKick_branch_c96bd: ; c96bd
-	anim_sound 0, 1, SFX_DOUBLE_KICK
-	anim_obj ANIM_OBJ_07,  15, 0,   8, 0, $0
-	anim_wait 6
-	anim_obj ANIM_OBJ_01,  15, 0,   8, 0, $0
-	anim_wait 8
-	anim_ret
-; c96cd
-
-BattleAnim_JumpKick: ; c96cd
-	anim_1gfx ANIM_GFX_HIT
-	anim_if_param_equal $1, BattleAnim_JumpKick_branch_c96f1
-	anim_sound 0, 1, SFX_JUMP_KICK
-	anim_obj ANIM_OBJ_07,  14, 0,   9, 0, $0
-	anim_obj ANIM_OBJ_07,  12, 4,   7, 4, $0
-	anim_setobj $1, $2
-	anim_setobj $2, $2
-	anim_wait 24
-	anim_sound 0, 1, SFX_DOUBLE_KICK
-	anim_obj ANIM_OBJ_04, -15, 0,   6, 0, $0
-	anim_wait 16
-	anim_ret
-; c96f1
-
-BattleAnim_JumpKick_branch_c96f1: ; c96f1
-	anim_wait 8
-	anim_sound 0, 0, SFX_DOUBLE_KICK
-	anim_obj ANIM_OBJ_04,   5, 4,  11, 0, $0
-	anim_wait 16
-	anim_ret
-; c96fc
-
-BattleAnim_HiJumpKick: ; c96fc
-	anim_1gfx ANIM_GFX_HIT
-	anim_bgeffect ANIM_BG_1F, $40, $2, $0
-	anim_if_param_equal $1, BattleAnim_HiJumpKick_branch_c971e
-	anim_wait 32
-	anim_sound 0, 1, SFX_JUMP_KICK
-	anim_obj ANIM_OBJ_07,  14, 0,   9, 0, $0
-	anim_setobj $1, $2
-	anim_wait 16
-	anim_sound 0, 1, SFX_DOUBLE_KICK
-	anim_obj ANIM_OBJ_04, -15, 0,   6, 0, $0
-	anim_wait 16
-	anim_ret
-; c971e
-
-BattleAnim_HiJumpKick_branch_c971e: ; c971e
-	anim_wait 16
-	anim_sound 0, 0, SFX_DOUBLE_KICK
-	anim_obj ANIM_OBJ_04,   5, 4,  11, 0, $0
-	anim_wait 16
-	anim_ret
-; c9729
-
-BattleAnim_RollingKick: ; c9729
-	anim_1gfx ANIM_GFX_HIT
-	anim_sound 0, 1, SFX_DOUBLE_KICK
-	anim_obj ANIM_OBJ_07,  14, 0,   7, 0, $0
-	anim_setobj $1, $3
-	anim_wait 12
-	anim_obj ANIM_OBJ_01, -15, 0,   6, 0, $0
-	anim_wait 16
-	anim_ret
-; c973e
-
-BattleAnim_MegaKick: ; c973e
-	anim_1gfx ANIM_GFX_HIT
-	anim_bgeffect ANIM_BG_1F, $40, $2, $0
-	anim_wait 67
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $3
-.loop
-	anim_sound 0, 1, SFX_MEGA_KICK
-	anim_obj ANIM_OBJ_07, -15, 0,   7, 0, $0
-	anim_obj ANIM_OBJ_00, -15, 0,   7, 0, $0
-	anim_wait 6
-	anim_obj ANIM_OBJ_07, -15, 0,   7, 0, $0
-	anim_wait 6
-	anim_loop 3, .loop
-	anim_ret
-; c9764
-
-BattleAnim_HyperFang: ; c9764
-	anim_1gfx ANIM_GFX_HIT
-	anim_bgeffect ANIM_BG_1F, $20, $1, $0
-	anim_sound 0, 1, SFX_BITE
-	anim_obj ANIM_OBJ_09, -15, 0,   7, 0, $0
-	anim_wait 6
-	anim_obj ANIM_OBJ_01, -15, 0,   7, 0, $0
-	anim_wait 16
-	anim_ret
-; c977b
-
-BattleAnim_SuperFang: ; c977b
-	anim_1gfx ANIM_GFX_HIT
-	anim_bgeffect ANIM_BG_1F, $40, $2, $0
-	anim_wait 48
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $3
-.loop
-	anim_sound 0, 1, SFX_BITE
-	anim_obj ANIM_OBJ_09, -15, 0,   7, 0, $0
-	anim_obj ANIM_OBJ_00, -15, 0,   7, 0, $0
-	anim_wait 6
-	anim_obj ANIM_OBJ_09, -15, 0,   7, 0, $0
-	anim_wait 6
-	anim_loop 3, .loop
-	anim_ret
-; c97a1
-
-BattleAnim_Ember: ; c97a1
-	anim_1gfx ANIM_GFX_FIRE
-	anim_sound 6, 2, SFX_EMBER
-	anim_obj ANIM_OBJ_0B,   8, 0,  12, 0, $12
-	anim_wait 4
-	anim_sound 6, 2, SFX_EMBER
-	anim_obj ANIM_OBJ_0B,   8, 0,  12, 4, $14
-	anim_wait 4
-	anim_sound 6, 2, SFX_EMBER
-	anim_obj ANIM_OBJ_0B,   8, 0,  10, 4, $13
-	anim_wait 16
-	anim_incobj  1
-	anim_incobj  2
-	anim_incobj  3
-	anim_sound 0, 1, SFX_EMBER
-	anim_obj ANIM_OBJ_0B,  15, 0,   8, 4, $30
-	anim_obj ANIM_OBJ_0B, -16, 4,   8, 4, $30
-	anim_obj ANIM_OBJ_0B, -14, 0,   8, 4, $30
-	anim_wait 32
-	anim_ret
-; c97d8
-
-BattleAnim_FirePunch: ; c97d8
-	anim_2gfx ANIM_GFX_HIT, ANIM_GFX_FIRE
-	anim_obj ANIM_OBJ_0A, -15, 0,   7, 0, $43
-	anim_call BattleAnim_FirePunch_branch_cbbcc
-	anim_wait 16
-	anim_ret
-; c97e5
-
-BattleAnim_FireSpin: ; c97e5
-	anim_1gfx ANIM_GFX_FIRE
-.loop
-	anim_sound 6, 2, SFX_EMBER
-	anim_obj ANIM_OBJ_0E,   8, 0,  11, 0, $4
-	anim_wait 2
-	anim_sound 6, 2, SFX_EMBER
-	anim_obj ANIM_OBJ_0E,   8, 0,  12, 0, $3
-	anim_wait 2
-	anim_sound 6, 2, SFX_EMBER
-	anim_obj ANIM_OBJ_0E,   8, 0,  11, 0, $3
-	anim_wait 2
-	anim_sound 6, 2, SFX_EMBER
-	anim_obj ANIM_OBJ_0E,   8, 0,  12, 0, $4
-	anim_wait 2
-	anim_loop 2, .loop
-	anim_wait 96
-	anim_ret
-; c9811
-
-BattleAnim_DragonRage: ; c9811
-	anim_1gfx ANIM_GFX_FIRE
-.loop
-	anim_sound 6, 2, SFX_EMBER
-	anim_obj ANIM_OBJ_0C,   8, 0,  11, 4, $0
-	anim_wait 3
-	anim_loop 16, .loop
-	anim_wait 64
-	anim_ret
-; c9822
-
-BattleAnim_Flamethrower: ; c9822
-	anim_1gfx ANIM_GFX_FIRE
-	anim_sound 6, 2, SFX_EMBER
-	anim_obj ANIM_OBJ_0D,   8, 0,  11, 4, $3
-	anim_wait 2
-	anim_obj ANIM_OBJ_0D,   9, 3,  10, 6, $5
-	anim_wait 2
-	anim_obj ANIM_OBJ_0D,  10, 5,  10, 1, $7
-	anim_wait 2
-	anim_obj ANIM_OBJ_0D,  12, 0,   9, 4, $9
-	anim_wait 2
-	anim_obj ANIM_OBJ_0D,  13, 2,   8, 7, $b
-	anim_wait 2
-	anim_obj ANIM_OBJ_0D,  14, 4,   8, 2, $c
-	anim_wait 2
-	anim_obj ANIM_OBJ_0D,  15, 6,   7, 5, $a
-	anim_wait 2
-	anim_obj ANIM_OBJ_0D, -15, 0,   7, 0, $8
-	anim_wait 16
-.loop
-	anim_sound 0, 1, SFX_EMBER
-	anim_wait 16
-	anim_loop 6, .loop
-	anim_wait 16
-	anim_ret
-; c9861
-
-BattleAnim_FireBlast: ; c9861
-	anim_1gfx ANIM_GFX_FIRE
-.loop1
-	anim_sound 6, 2, SFX_EMBER
-	anim_obj ANIM_OBJ_0F,   8, 0,  11, 4, $7
-	anim_wait 6
-	anim_loop 10, .loop1
-.loop2
-	anim_sound 0, 1, SFX_EMBER
-	anim_wait 8
-	anim_loop 10, .loop2
-	anim_incobj  1
-	anim_incobj  2
-	anim_incobj  3
-	anim_incobj  4
-	anim_incobj  5
-	anim_incobj  6
-	anim_incobj  7
-	anim_incobj  8
-	anim_incobj  9
-	anim_incobj 10
-	anim_wait 2
-.loop3
-	anim_sound 0, 1, SFX_EMBER
-	anim_obj ANIM_OBJ_0F, -15, 0,   7, 0, $1
-	anim_obj ANIM_OBJ_0F, -15, 0,   7, 0, $2
-	anim_obj ANIM_OBJ_0F, -15, 0,   7, 0, $3
-	anim_obj ANIM_OBJ_0F, -15, 0,   7, 0, $4
-	anim_obj ANIM_OBJ_0F, -15, 0,   7, 0, $5
-	anim_wait 16
-	anim_loop 2, .loop3
-	anim_wait 32
-	anim_ret
-; c98b0
-
-BattleAnim_IcePunch: ; c98b0
-	anim_2gfx ANIM_GFX_HIT, ANIM_GFX_ICE
-	anim_obj ANIM_OBJ_0A, -15, 0,   7, 0, $43
-	anim_call BattleAnim_IcePunch_branch_cbbdf
-	anim_wait 32
-	anim_ret
-; c98bd
-
-BattleAnim_IceBeam: ; c98bd
-	anim_1gfx ANIM_GFX_ICE
-.loop
-	anim_sound 6, 2, SFX_SHINE
-	anim_obj ANIM_OBJ_ICE_BEAM,   8, 0,  11, 4, $4
-	anim_wait 4
-	anim_loop 5, .loop
-	anim_obj ANIM_OBJ_ICE_BUILDUP, -15, 0,   9, 2, $10
-.loop2
-	anim_sound 6, 2, SFX_SHINE
-	anim_obj ANIM_OBJ_ICE_BEAM,   8, 0,  11, 4, $4
-	anim_wait 4
-	anim_loop 15, .loop2
-	anim_wait 48
-	anim_sound 0, 1, SFX_SHINE
-	anim_wait 8
-	anim_sound 0, 1, SFX_SHINE
-	anim_wait 8
-	anim_ret
-; c98e8
-
-BattleAnim_Blizzard: ; c98e8
-	anim_1gfx ANIM_GFX_ICE
-.loop
-	anim_sound 6, 2, SFX_SHINE
-	anim_obj ANIM_OBJ_BLIZZARD,   8, 0,  11, 0, $63
-	anim_wait 2
-	anim_sound 6, 2, SFX_SHINE
-	anim_obj ANIM_OBJ_BLIZZARD,   8, 0,  10, 0, $64
-	anim_wait 2
-	anim_sound 6, 2, SFX_SHINE
-	anim_obj ANIM_OBJ_BLIZZARD,   8, 0,  12, 0, $63
-	anim_wait 2
-	anim_loop 3, .loop
-	anim_bgeffect ANIM_BG_WHITE_HUES, $0, $8, $0
-	anim_wait 32
-	anim_obj ANIM_OBJ_ICE_BUILDUP, -15, 0,   9, 2, $10
-	anim_wait 128
-	anim_sound 0, 1, SFX_SHINE
-	anim_wait 8
-	anim_sound 0, 1, SFX_SHINE
-	anim_wait 24
-	anim_ret
-; c991e
-
-BattleAnim_Bubble: ; c991e
-	anim_1gfx ANIM_GFX_BUBBLE
-	anim_sound 32, 2, SFX_WATER_GUN
-	anim_obj ANIM_OBJ_BUBBLE,   8, 0,  11, 4, $c1
-	anim_wait 6
-	anim_sound 32, 2, SFX_WATER_GUN
-	anim_obj ANIM_OBJ_BUBBLE,   8, 0,  11, 4, $e1
-	anim_wait 6
-	anim_sound 32, 2, SFX_WATER_GUN
-	anim_obj ANIM_OBJ_BUBBLE,   8, 0,  11, 4, $d1
-	anim_wait 128
-	anim_wait 32
-	anim_ret
-; c993d
-
-BattleAnim_Bubblebeam: ; c993d
-	anim_1gfx ANIM_GFX_BUBBLE
-.loop
-	anim_sound 16, 2, SFX_BUBBLEBEAM
-	anim_obj ANIM_OBJ_BUBBLE,   8, 0,  11, 4, $92
-	anim_wait 6
-	anim_sound 16, 2, SFX_BUBBLEBEAM
-	anim_obj ANIM_OBJ_BUBBLE,   8, 0,  11, 4, $b3
-	anim_wait 6
-	anim_sound 16, 2, SFX_BUBBLEBEAM
-	anim_obj ANIM_OBJ_BUBBLE,   8, 0,  11, 4, $f4
-	anim_wait 8
-	anim_loop 3, .loop
-	anim_wait 64
-	anim_clearobjs
-	anim_bgeffect ANIM_BG_30, $0, $0, $0
-	anim_wait 1
-	anim_call BattleAnim_FollowPlayerHead_1
-	anim_bgeffect ANIM_BG_31, $1c, $0, $0
-	anim_wait 19
-	anim_call BattleAnim_ShowMon_1
-	anim_bgeffect ANIM_BG_32, $0, $0, $0
-	anim_wait 8
-	anim_ret
-; c9979
-
-BattleAnim_WaterGun: ; c9979
-	anim_bgeffect ANIM_BG_30, $0, $0, $0
-	anim_1gfx ANIM_GFX_WATER
-	anim_call BattleAnim_FollowPlayerHead_1
-	anim_sound 16, 2, SFX_WATER_GUN
-	anim_obj ANIM_OBJ_24,   8, 0,  11, 0, $0
-	anim_wait 8
-	anim_obj ANIM_OBJ_24,   8, 0,   9, 4, $0
-	anim_wait 8
-	anim_obj ANIM_OBJ_24,   8, 0,  10, 2, $0
-	anim_wait 24
-	anim_bgeffect ANIM_BG_31, $1c, $0, $0
-	anim_wait 8
-	anim_bgeffect ANIM_BG_31, $8, $0, $0
-	anim_wait 8
-	anim_bgeffect ANIM_BG_31, $30, $0, $0
-	anim_wait 32
-	anim_call BattleAnim_ShowMon_1
-	anim_bgeffect ANIM_BG_32, $0, $0, $0
-	anim_wait 16
-	anim_ret
-; c99b4
-
-BattleAnim_HydroPump: ; c99b4
-	anim_bgeffect ANIM_BG_30, $0, $0, $0
-	anim_1gfx ANIM_GFX_WATER
-	anim_call BattleAnim_FollowPlayerHead_1
-	anim_sound 0, 1, SFX_HYDRO_PUMP
-	anim_obj ANIM_OBJ_25,  13, 4,   9, 0, $0
-	anim_bgeffect ANIM_BG_31, $1c, $0, $0
-	anim_wait 8
-	anim_sound 0, 1, SFX_HYDRO_PUMP
-	anim_obj ANIM_OBJ_25,  14, 4,   9, 0, $0
-	anim_bgeffect ANIM_BG_31, $8, $0, $0
-	anim_wait 8
-	anim_sound 0, 1, SFX_HYDRO_PUMP
-	anim_obj ANIM_OBJ_25,  15, 4,   9, 0, $0
-	anim_bgeffect ANIM_BG_31, $30, $0, $0
-	anim_wait 8
-	anim_sound 0, 1, SFX_HYDRO_PUMP
-	anim_obj ANIM_OBJ_25, -16, 4,   9, 0, $0
-	anim_bgeffect ANIM_BG_31, $1c, $0, $0
-	anim_wait 8
-	anim_sound 0, 1, SFX_HYDRO_PUMP
-	anim_obj ANIM_OBJ_25, -15, 4,   9, 0, $0
-	anim_bgeffect ANIM_BG_31, $8, $0, $0
-	anim_wait 8
-	anim_sound 0, 1, SFX_HYDRO_PUMP
-	anim_obj ANIM_OBJ_25, -14, 4,   9, 0, $0
-	anim_bgeffect ANIM_BG_31, $30, $0, $0
-	anim_wait 8
-	anim_sound 0, 1, SFX_HYDRO_PUMP
-	anim_obj ANIM_OBJ_25, -13, 4,   9, 0, $0
-	anim_bgeffect ANIM_BG_31, $1c, $0, $0
-	anim_wait 32
-	anim_call BattleAnim_ShowMon_1
-	anim_bgeffect ANIM_BG_32, $0, $0, $0
-	anim_wait 16
-	anim_ret
-; c9a2a
-
-BattleAnim_Surf: ; c9a2a
-	anim_1gfx ANIM_GFX_BUBBLE
-	anim_bgeffect ANIM_BG_SURF, $0, $0, $0
-	anim_obj ANIM_OBJ_22,  11, 0,  13, 0, $8
-.loop
-	anim_sound 0, 1, SFX_SURF
-	anim_wait 32
-	anim_loop 4, .loop
-	anim_incobj  1
-	anim_wait 56
-	anim_ret
-; c9a42
-
-BattleAnim_VineWhip: ; c9a42
-	anim_1gfx ANIM_GFX_WHIP
-	anim_sound 0, 1, SFX_VINE_WHIP
-	anim_obj ANIM_OBJ_40,  14, 4,   6, 4, $80
-	anim_wait 4
-	anim_sound 0, 1, SFX_VINE_WHIP
-	anim_obj ANIM_OBJ_3F,  16, 0,   7, 4, $0
-	anim_wait 4
-	anim_incobj  1
-	anim_wait 4
-	anim_ret
-; c9a5a
-
-BattleAnim_LeechSeed: ; c9a5a
-	anim_1gfx ANIM_GFX_PLANT
-	anim_sound 16, 2, SFX_VINE_WHIP
-	anim_obj ANIM_OBJ_LEECH_SEED,   6, 0,  10, 0, $20
-	anim_wait 8
-	anim_sound 16, 2, SFX_VINE_WHIP
-	anim_obj ANIM_OBJ_LEECH_SEED,   6, 0,  10, 0, $30
-	anim_wait 8
-	anim_sound 16, 2, SFX_VINE_WHIP
-	anim_obj ANIM_OBJ_LEECH_SEED,   6, 0,  10, 0, $28
-	anim_wait 32
-	anim_sound 0, 1, SFX_CHARGE
-	anim_wait 128
-	anim_ret
-; c9a7c
-
-BattleAnim_RazorLeaf: ; c9a7c
-	anim_1gfx ANIM_GFX_PLANT
-	anim_sound 0, 0, SFX_VINE_WHIP
-	anim_obj ANIM_OBJ_RAZOR_LEAF,   6, 0,  10, 0, $28
-	anim_obj ANIM_OBJ_RAZOR_LEAF,   6, 0,  10, 0, $5c
-	anim_obj ANIM_OBJ_RAZOR_LEAF,   6, 0,  10, 0, $10
-	anim_obj ANIM_OBJ_RAZOR_LEAF,   6, 0,  10, 0, $e8
-	anim_obj ANIM_OBJ_RAZOR_LEAF,   6, 0,  10, 0, $9c
-	anim_obj ANIM_OBJ_RAZOR_LEAF,   6, 0,  10, 0, $d0
-	anim_wait 6
-	anim_obj ANIM_OBJ_RAZOR_LEAF,   6, 0,  10, 0, $1c
-	anim_obj ANIM_OBJ_RAZOR_LEAF,   6, 0,  10, 0, $50
-	anim_obj ANIM_OBJ_RAZOR_LEAF,   6, 0,  10, 0, $dc
-	anim_obj ANIM_OBJ_RAZOR_LEAF,   6, 0,  10, 0, $90
-	anim_wait 80
-	anim_sound 16, 2, SFX_VINE_WHIP
-	anim_incobj  3
-	anim_wait 2
-	anim_sound 16, 2, SFX_VINE_WHIP
-	anim_incobj  5
-	anim_wait 2
-	anim_sound 16, 2, SFX_VINE_WHIP
-	anim_incobj  7
-	anim_wait 2
-	anim_sound 16, 2, SFX_VINE_WHIP
-	anim_incobj  9
-	anim_wait 2
-	anim_sound 16, 2, SFX_VINE_WHIP
-	anim_incobj  1
-	anim_wait 2
-	anim_sound 16, 2, SFX_VINE_WHIP
-	anim_incobj  2
-	anim_wait 2
-	anim_sound 16, 2, SFX_VINE_WHIP
-	anim_incobj  4
-	anim_wait 2
-	anim_sound 16, 2, SFX_VINE_WHIP
-	anim_incobj  6
-	anim_wait 2
-	anim_sound 16, 2, SFX_VINE_WHIP
-	anim_incobj  8
-	anim_wait 2
-	anim_sound 16, 2, SFX_VINE_WHIP
-	anim_incobj 10
-	anim_wait 64
-	anim_ret
-; c9af2
-
-BattleAnim_Solarbeam: ; c9af2
-	anim_if_param_equal $0, .FireSolarBeam
-	; charge turn
-	anim_1gfx ANIM_GFX_CHARGE
-	anim_sound 0, 0, SFX_CHARGE
-	anim_obj ANIM_OBJ_3D,   6, 0,  10, 4, $0
-	anim_obj ANIM_OBJ_3C,   6, 0,  10, 4, $0
-	anim_obj ANIM_OBJ_3C,   6, 0,  10, 4, $8
-	anim_obj ANIM_OBJ_3C,   6, 0,  10, 4, $10
-	anim_obj ANIM_OBJ_3C,   6, 0,  10, 4, $18
-	anim_obj ANIM_OBJ_3C,   6, 0,  10, 4, $20
-	anim_obj ANIM_OBJ_3C,   6, 0,  10, 4, $28
-	anim_obj ANIM_OBJ_3C,   6, 0,  10, 4, $30
-	anim_obj ANIM_OBJ_3C,   6, 0,  10, 4, $38
-	anim_wait 104
-	anim_bgeffect ANIM_BG_FLASH_WHITE, $0, $4, $2
-	anim_wait 64
-	anim_ret
-; c9b30
-
-.FireSolarBeam
-	anim_1gfx ANIM_GFX_BEAM
-	anim_bgeffect ANIM_BG_06, $0, $2, $0
-	anim_call BattleAnim_Solarbeam_branch_cbb39
-	anim_wait 48
-	anim_ret
-; c9b3c
-
-BattleAnim_Thunderpunch: ; c9b3c
-	anim_2gfx ANIM_GFX_HIT, ANIM_GFX_LIGHTNING
-	anim_obj ANIM_OBJ_0A, -15, 0,   7, 0, $43
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $2
-	anim_sound 0, 1, SFX_THUNDER
-	anim_obj ANIM_OBJ_2F, -13, 0,   8, 4, $0
-	anim_wait 64
-	anim_ret
-; c9b53
-
-BattleAnim_Thundershock: ; c9b53
-	anim_2gfx ANIM_GFX_LIGHTNING, ANIM_GFX_EXPLOSION
-	anim_obj ANIM_OBJ_34, -15, 0,   7, 0, $2
-	anim_wait 16
-	anim_sound 0, 1, SFX_THUNDERSHOCK
-	anim_obj ANIM_OBJ_33, -15, 0,   7, 0, $0
-	anim_wait 96
-	anim_ret
-; c9b66
-
-BattleAnim_Thunderbolt: ; c9b66
-	anim_2gfx ANIM_GFX_LIGHTNING, ANIM_GFX_EXPLOSION
-	anim_obj ANIM_OBJ_LIGHTNING_BOLT, -15, 0,   7, 0, $2
-	anim_wait 16
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $4, $2
-	anim_sound 0, 1, SFX_THUNDERSHOCK
-	anim_obj ANIM_OBJ_31, -15, 0,   7, 0, $0
-	anim_wait 64
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $4, $2
-	anim_wait 64
-	anim_ret
-; c9b84
-
-BattleAnim_ThunderWave: ; c9b84
-	anim_1gfx ANIM_GFX_LIGHTNING
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $4, $3
-	anim_sound 0, 1, SFX_THUNDERSHOCK
-	anim_obj ANIM_OBJ_30, -15, 0,   7, 0, $0
-	anim_wait 20
-	anim_bgp $1b
-	anim_incobj  1
-	anim_wait 96
-	anim_ret
-; c9b9a
-
-BattleAnim_Thunder: ; c9b9a
-	anim_1gfx ANIM_GFX_LIGHTNING
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $6, $20
-	anim_sound 0, 1, SFX_THUNDER
-	anim_obj ANIM_OBJ_2E,  15, 0,   8, 4, $0
-	anim_wait 16
-	anim_sound 0, 1, SFX_THUNDER
-	anim_obj ANIM_OBJ_2F, -13, 0,   8, 4, $0
-	anim_wait 16
-	anim_sound 0, 1, SFX_THUNDER
-	anim_obj ANIM_OBJ_2D, -15, 0,   8, 4, $0
-	anim_wait 48
-	anim_ret
-; c9bbd
-
-BattleAnim_RazorWind: ; c9bbd
-	anim_if_param_equal $1, BattleAnim_RazorWind_branch_c9fb5
-	anim_1gfx ANIM_GFX_WHIP
-	anim_bgeffect ANIM_BG_06, $0, $1, $0
-.loop
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $4, $2
-	anim_sound 0, 1, SFX_RAZOR_WIND
-	anim_obj ANIM_OBJ_42, -13, 0,   5, 0, $3
-	anim_wait 4
-	anim_sound 0, 1, SFX_RAZOR_WIND
-	anim_obj ANIM_OBJ_42, -15, 0,   7, 0, $3
-	anim_wait 4
-	anim_sound 0, 1, SFX_RAZOR_WIND
-	anim_obj ANIM_OBJ_42, -13, 0,   8, 0, $3
-	anim_wait 4
-	anim_sound 0, 1, SFX_RAZOR_WIND
-	anim_obj ANIM_OBJ_41,  15, 0,   5, 0, $83
-	anim_wait 4
-	anim_sound 0, 1, SFX_RAZOR_WIND
-	anim_obj ANIM_OBJ_41,  15, 0,   8, 0, $83
-	anim_wait 4
-	anim_loop 3, .loop
-	anim_wait 24
-	anim_ret
-; c9c00
-
-BattleAnim_Sonicboom_JP: ; c9c00
-	anim_2gfx ANIM_GFX_WHIP, ANIM_GFX_HIT
-.loop
-	anim_sound 3, 0, SFX_RAZOR_WIND
-	anim_obj ANIM_OBJ_43,   8, 0,  10, 0, $3
-	anim_wait 8
-	anim_sound 3, 0, SFX_RAZOR_WIND
-	anim_obj ANIM_OBJ_43,   8, 0,  11, 0, $2
-	anim_wait 8
-	anim_sound 3, 0, SFX_RAZOR_WIND
-	anim_obj ANIM_OBJ_43,   8, 0,  12, 0, $4
-	anim_wait 8
-	anim_loop 2, .loop
-	anim_wait 32
-	anim_incobj  1
-	anim_incobj  2
-	anim_incobj  3
-	anim_incobj  4
-	anim_incobj  5
-	anim_incobj  6
-	anim_obj ANIM_OBJ_01, -15, 0,   7, 0, $0
-	anim_wait 16
-	anim_ret
-; c9c36
-
-BattleAnim_Gust: ; c9c36
-BattleAnim_Sonicboom: ; c9c36
-	anim_2gfx ANIM_GFX_WIND, ANIM_GFX_HIT
-.loop
-	anim_sound 0, 1, SFX_RAZOR_WIND
-	anim_obj ANIM_OBJ_GUST, -15, 0,   9, 0, $0
-	anim_wait 6
-	anim_loop 9, .loop
-	anim_obj ANIM_OBJ_01, -14, 0,   8, 0, $18
-	anim_wait 8
-	anim_obj ANIM_OBJ_01,  16, 0,   4, 0, $18
-	anim_wait 16
-	anim_ret
-; c9c53
-
-BattleAnim_Selfdestruct: ; c9c53
-	anim_1gfx ANIM_GFX_EXPLOSION
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $24
-	anim_if_param_equal $1, .loop
-	anim_call BattleAnim_Selfdestruct_branch_cbb8f
-	anim_wait 16
-	anim_ret
-; c9c63
-
-.loop
-	anim_call BattleAnim_Selfdestruct_branch_cbb62
-	anim_wait 5
-	anim_bgeffect ANIM_BG_HIDE_MON, $0, $1, $0
-	anim_loop 2, .loop
-	anim_wait 16
-	anim_ret
-; c9c72
-
-BattleAnim_Explosion: ; c9c72
-	anim_1gfx ANIM_GFX_EXPLOSION
-	anim_bgeffect ANIM_BG_1F, $60, $4, $10
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $24
-	anim_if_param_equal $1, .loop
-	anim_call BattleAnim_Explosion_branch_cbb8f
-	anim_wait 16
-	anim_ret
-; c9c87
-
-.loop
-	anim_call BattleAnim_Explosion_branch_cbb62
-	anim_wait 5
-	anim_bgeffect ANIM_BG_HIDE_MON, $0, $1, $0
-	anim_loop 2, .loop
-	anim_wait 16
-	anim_ret
-; c9c96
-
-BattleAnim_Acid: ; c9c96
-	anim_1gfx ANIM_GFX_POISON
-	anim_call BattleAnim_Acid_branch_cbc35
-	anim_wait 64
-	anim_ret
-; c9c9d
-
-BattleAnim_RockThrow: ; c9c9d
-	anim_1gfx ANIM_GFX_ROCKS
-	anim_bgeffect ANIM_BG_1F, $60, $1, $0
-	anim_sound 0, 1, SFX_STRENGTH
-	anim_obj ANIM_OBJ_1E,  16, 0,   8, 0, $40
-	anim_wait 2
-	anim_sound 0, 1, SFX_STRENGTH
-	anim_obj ANIM_OBJ_1D,  15, 0,   8, 4, $30
-	anim_wait 2
-	anim_sound 0, 1, SFX_STRENGTH
-	anim_obj ANIM_OBJ_1E, -13, 0,   8, 4, $30
-	anim_wait 2
-	anim_sound 0, 1, SFX_STRENGTH
-	anim_obj ANIM_OBJ_1D, -14, 0,   8, 0, $40
-	anim_wait 2
-	anim_sound 0, 1, SFX_STRENGTH
-	anim_obj ANIM_OBJ_1E, -15, 0,   8, 4, $30
-	anim_wait 96
-	anim_ret
-; c9cd2
-
-BattleAnim_RockSlide: ; c9cd2
-	anim_1gfx ANIM_GFX_ROCKS
-	anim_bgeffect ANIM_BG_1F, $c0, $1, $0
-.loop
-	anim_sound 0, 1, SFX_STRENGTH
-	anim_obj ANIM_OBJ_1E,  16, 0,   8, 0, $40
-	anim_wait 4
-	anim_sound 0, 1, SFX_STRENGTH
-	anim_obj ANIM_OBJ_1D,  15, 0,   8, 4, $30
-	anim_wait 4
-	anim_sound 0, 1, SFX_STRENGTH
-	anim_obj ANIM_OBJ_1E, -13, 0,   8, 4, $30
-	anim_wait 4
-	anim_sound 0, 1, SFX_STRENGTH
-	anim_obj ANIM_OBJ_1D, -14, 0,   8, 0, $40
-	anim_wait 4
-	anim_sound 0, 1, SFX_STRENGTH
-	anim_obj ANIM_OBJ_1E, -15, 0,   8, 4, $30
-	anim_wait 16
-	anim_loop 4, .loop
-	anim_wait 96
-	anim_ret
-; c9d0c
-
-BattleAnim_Sing: ; c9d0c
-	anim_1gfx ANIM_GFX_NOISE
-	anim_sound 16, 2, SFX_SING
-.loop
-	anim_obj ANIM_OBJ_23,   8, 0,  11, 4, $0
-	anim_wait 8
-	anim_obj ANIM_OBJ_23,   8, 0,  11, 4, $1
-	anim_wait 8
-	anim_obj ANIM_OBJ_23,   8, 0,  11, 4, $2
-	anim_wait 8
-	anim_obj ANIM_OBJ_23,   8, 0,  11, 4, $0
-	anim_wait 8
-	anim_obj ANIM_OBJ_23,   8, 0,  11, 4, $2
-	anim_wait 8
-	anim_loop 4, .loop
-	anim_wait 64
-	anim_ret
-; c9d35
-
-BattleAnim_Poisonpowder: ; c9d35
-BattleAnim_SleepPowder: ; c9d35
-BattleAnim_Spore: ; c9d35
-BattleAnim_StunSpore: ; c9d35
-	anim_1gfx ANIM_GFX_POWDER
-.loop
-	anim_sound 0, 1, SFX_POWDER
-	anim_obj ANIM_OBJ_26,  13, 0,   2, 0, $0
-	anim_wait 4
-	anim_sound 0, 1, SFX_POWDER
-	anim_obj ANIM_OBJ_26, -15, 0,   2, 0, $0
-	anim_wait 4
-	anim_sound 0, 1, SFX_POWDER
-	anim_obj ANIM_OBJ_26,  14, 0,   2, 0, $0
-	anim_wait 4
-	anim_sound 0, 1, SFX_POWDER
-	anim_obj ANIM_OBJ_26,  16, 0,   2, 0, $0
-	anim_wait 4
-	anim_sound 0, 1, SFX_POWDER
-	anim_obj ANIM_OBJ_26,  15, 0,   2, 0, $0
-	anim_wait 4
-	anim_loop 2, .loop
-	anim_wait 96
-	anim_ret
-; c9d6a
-
-BattleAnim_HyperBeam: ; c9d6a
-	anim_1gfx ANIM_GFX_BEAM
-	anim_bgeffect ANIM_BG_1F, $30, $4, $10
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $40
-	anim_bgeffect ANIM_BG_06, $0, $2, $0
-	anim_call BattleAnim_HyperBeam_branch_cbb39
-	anim_wait 48
-	anim_ret
-; c9d80
-
-BattleAnim_AuroraBeam: ; c9d80
-	anim_1gfx ANIM_GFX_BEAM
-	anim_bgeffect ANIM_BG_06, $0, $2, $0
-	anim_bgeffect ANIM_BG_ALTERNATE_HUES, $0, $2, $0
-	anim_wait 64
-	anim_call BattleAnim_AuroraBeam_branch_cbb39
-	anim_wait 48
-	anim_incobj  5
-	anim_wait 64
-	anim_ret
-; c9d95
-
-BattleAnim_Vicegrip: ; c9d95
-	anim_1gfx ANIM_GFX_CUT
-	anim_sound 0, 1, SFX_VICEGRIP
-	anim_obj ANIM_OBJ_37, -13, 0,   5, 0, $0
-	anim_obj ANIM_OBJ_39,  15, 0,   9, 0, $0
-	anim_wait 32
-	anim_ret
-; c9da6
-
-BattleAnim_Scratch: ; c9da6
-	anim_1gfx ANIM_GFX_CUT
-	anim_sound 0, 1, SFX_SCRATCH
-	anim_obj ANIM_OBJ_37, -14, 0,   6, 0, $0
-	anim_obj ANIM_OBJ_37, -15, 4,   5, 4, $0
-	anim_obj ANIM_OBJ_37, -15, 0,   5, 0, $0
-	anim_wait 32
-	anim_ret
-; c9dbc
-
-BattleAnim_FurySwipes: ; c9dbc
-	anim_1gfx ANIM_GFX_CUT
-	anim_if_param_equal $1, BattleAnim_FurySwipes_branch_c9dd9
-	anim_sound 0, 1, SFX_SCRATCH
-	anim_obj ANIM_OBJ_37, -14, 0,   6, 0, $0
-	anim_obj ANIM_OBJ_37, -15, 4,   5, 4, $0
-	anim_obj ANIM_OBJ_37, -15, 0,   5, 0, $0
-	anim_sound 0, 1, SFX_SCRATCH
-	anim_wait 32
-	anim_ret
-; c9dd9
-
-BattleAnim_FurySwipes_branch_c9dd9: ; c9dd9
-	anim_sound 0, 1, SFX_SCRATCH
-	anim_obj ANIM_OBJ_38,  15, 0,   6, 0, $0
-	anim_obj ANIM_OBJ_38,  15, 4,   5, 4, $0
-	anim_obj ANIM_OBJ_38,  16, 0,   5, 0, $0
-	anim_sound 0, 1, SFX_SCRATCH
-	anim_wait 32
-	anim_ret
-; c9df0
-
-BattleAnim_Cut: ; c9df0
-	anim_1gfx ANIM_GFX_CUT
-	anim_sound 0, 1, SFX_CUT
-	anim_obj ANIM_OBJ_3A, -13, 0,   5, 0, $0
-	anim_wait 32
-	anim_ret
-; c9dfc
-
-BattleAnim_Slash: ; c9dfc
-	anim_1gfx ANIM_GFX_CUT
-	anim_sound 0, 1, SFX_CUT
-	anim_obj ANIM_OBJ_3A, -13, 0,   5, 0, $0
-	anim_obj ANIM_OBJ_3A, -14, 4,   4, 4, $0
-	anim_wait 32
-	anim_ret
-; c9e0d
-
-BattleAnim_Clamp: ; c9e0d
-	anim_2gfx ANIM_GFX_CUT, ANIM_GFX_HIT
-	anim_obj ANIM_OBJ_35, -15, 0,   7, 0, $a0
-	anim_obj ANIM_OBJ_35, -15, 0,   7, 0, $20
-	anim_wait 16
-	anim_sound 0, 1, SFX_BITE
-	anim_obj ANIM_OBJ_01, -14, 0,   6, 0, $18
-	anim_wait 32
-	anim_sound 0, 1, SFX_BITE
-	anim_obj ANIM_OBJ_01,  16, 0,   8, 0, $18
-	anim_wait 16
-	anim_ret
-; c9e2e
-
-BattleAnim_Bite: ; c9e2e
-	anim_2gfx ANIM_GFX_CUT, ANIM_GFX_HIT
-	anim_obj ANIM_OBJ_36, -15, 0,   7, 0, $98
-	anim_obj ANIM_OBJ_36, -15, 0,   7, 0, $18
-	anim_wait 8
-	anim_sound 0, 1, SFX_BITE
-	anim_obj ANIM_OBJ_01, -14, 0,   6, 0, $18
-	anim_wait 16
-	anim_sound 0, 1, SFX_BITE
-	anim_obj ANIM_OBJ_01,  16, 0,   8, 0, $18
-	anim_wait 8
-	anim_ret
-; c9e4f
-
-BattleAnim_Teleport: ; c9e4f
-	anim_1gfx ANIM_GFX_SPEED
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_bgeffect ANIM_BG_TELEPORT, $0, $1, $0
-	anim_wait 32
-	anim_bgeffect ANIM_BG_HIDE_MON, $0, $1, $0
-	anim_wait 3
-	anim_incbgeffect ANIM_BG_TELEPORT
-	anim_call BattleAnim_ShowMon_0
-	anim_bgeffect ANIM_BG_06, $0, $1, $0
-	anim_call BattleAnim_Teleport_branch_cbb12
-	anim_wait 64
-	anim_ret
-; c9e6f
-
-BattleAnim_Fly: ; c9e6f
-	anim_if_param_equal $1, BattleAnim_Fly_branch_c9e89
-	anim_if_param_equal $2, BattleAnim_Fly_branch_c9e82
-	anim_1gfx ANIM_GFX_HIT
-	anim_sound 0, 1, SFX_WING_ATTACK
-	anim_obj ANIM_OBJ_01, -15, 0,   7, 0, $0
-	anim_wait 32
-BattleAnim_Fly_branch_c9e82: ; c9e82
-	anim_bgeffect ANIM_BG_SHOW_MON, $0, $1, $0
-	anim_wait 32
-	anim_ret
-; c9e89
-
-BattleAnim_Fly_branch_c9e89: ; c9e89
-	anim_1gfx ANIM_GFX_SPEED
-	anim_bgeffect ANIM_BG_06, $0, $1, $0
-	anim_bgeffect ANIM_BG_HIDE_MON, $0, $1, $0
-	anim_call BattleAnim_Fly_branch_cbb12
-	anim_wait 64
-	anim_ret
-; c9e9a
-
-BattleAnim_DoubleTeam: ; c9e9a
-	anim_call BattleAnim_FollowPlayerHead_0
-	anim_sound 0, 0, SFX_PSYBEAM
-	anim_bgeffect ANIM_BG_DOUBLE_TEAM, $0, $1, $0
-	anim_wait 96
-	anim_incbgeffect ANIM_BG_DOUBLE_TEAM
-	anim_wait 24
-	anim_incbgeffect ANIM_BG_DOUBLE_TEAM
-	anim_call BattleAnim_ShowMon_0
-	anim_ret
-; c9eaf
-
-BattleAnim_Recover: ; c9eaf
-	anim_1gfx ANIM_GFX_BUBBLE
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_sound 0, 0, SFX_FULL_HEAL
-	anim_bgeffect ANIM_BG_18, $0, $1, $40
-	anim_obj ANIM_OBJ_2C,   5, 4,  11, 0, $30
-	anim_obj ANIM_OBJ_2C,   5, 4,  11, 0, $31
-	anim_obj ANIM_OBJ_2C,   5, 4,  11, 0, $32
-	anim_obj ANIM_OBJ_2C,   5, 4,  11, 0, $33
-	anim_obj ANIM_OBJ_2C,   5, 4,  11, 0, $34
-	anim_obj ANIM_OBJ_2C,   5, 4,  11, 0, $35
-	anim_obj ANIM_OBJ_2C,   5, 4,  11, 0, $36
-	anim_obj ANIM_OBJ_2C,   5, 4,  11, 0, $37
-	anim_wait 64
-	anim_incbgeffect ANIM_BG_18
-	anim_call BattleAnim_ShowMon_0
-	anim_ret
-; c9eeb
-
-BattleAnim_Absorb: ; c9eeb
-	anim_1gfx ANIM_GFX_CHARGE
-	anim_obj ANIM_OBJ_3D,   5, 4,  11, 0, $0
-.loop
-	anim_sound 6, 3, SFX_WATER_GUN
-	anim_obj ANIM_OBJ_ABSORB,  16, 0,   6, 0, $2
-	anim_wait 6
-	anim_sound 6, 3, SFX_WATER_GUN
-	anim_obj ANIM_OBJ_ABSORB, -15, 0,   8, 0, $3
-	anim_wait 6
-	anim_sound 6, 3, SFX_WATER_GUN
-	anim_obj ANIM_OBJ_ABSORB, -15, 0,   4, 0, $4
-	anim_wait 6
-	anim_loop 5, .loop
-	anim_wait 32
-	anim_ret
-; c9f13
-
-BattleAnim_MegaDrain: ; c9f13
-	anim_1gfx ANIM_GFX_CHARGE
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_bgeffect ANIM_BG_1C, $0, $0, $10
-	anim_setvar $0
-.loop
-	anim_sound 6, 3, SFX_WATER_GUN
-	anim_obj ANIM_OBJ_ABSORB,  16, 0,   6, 0, $2
-	anim_wait 6
-	anim_sound 6, 3, SFX_WATER_GUN
-	anim_obj ANIM_OBJ_ABSORB, -15, 0,   8, 0, $3
-	anim_wait 6
-	anim_sound 6, 3, SFX_WATER_GUN
-	anim_obj ANIM_OBJ_ABSORB, -15, 0,   4, 0, $4
-	anim_wait 6
-	anim_incvar
-	anim_if_var_equal $7, .done
-	anim_if_var_equal $2, .spawn
-	anim_jump .loop
-; c9f46
-
-.spawn
-	anim_obj ANIM_OBJ_3D,   5, 4,  11, 0, $0
-	anim_jump .loop
-; c9f4e
-
-.done
-	anim_wait 32
-	anim_incbgeffect ANIM_BG_1C
-	anim_call BattleAnim_ShowMon_0
-	anim_ret
-; c9f55
-
-BattleAnim_EggBomb: ; c9f55
-	anim_2gfx ANIM_GFX_EGG, ANIM_GFX_EXPLOSION
-	anim_sound 0, 0, SFX_SWITCH_POKEMON
-	anim_obj ANIM_OBJ_46,   5, 4,  13, 0, $1
-	anim_wait 128
-	anim_wait 96
-	anim_incobj  1
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $3
-	anim_sound 0, 1, SFX_EGG_BOMB
-	anim_obj ANIM_OBJ_18,  16, 0,   8, 0, $0
-	anim_wait 8
-	anim_sound 0, 1, SFX_EGG_BOMB
-	anim_obj ANIM_OBJ_18, -14, 0,   8, 4, $0
-	anim_wait 8
-	anim_sound 0, 1, SFX_EGG_BOMB
-	anim_obj ANIM_OBJ_18, -15, 0,   9, 0, $0
-	anim_wait 24
-	anim_ret
-; c9f85
-
-BattleAnim_Softboiled: ; c9f85
-	anim_2gfx ANIM_GFX_EGG, ANIM_GFX_BUBBLE
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_sound 0, 0, SFX_SWITCH_POKEMON
-	anim_obj ANIM_OBJ_46,   5, 4,  13, 0, $6
-	anim_wait 128
-	anim_incobj  2
-	anim_obj ANIM_OBJ_46,   9, 4,  13, 0, $b
-	anim_wait 16
-	anim_bgeffect ANIM_BG_18, $0, $1, $40
-	anim_sound 0, 0, SFX_METRONOME
-.loop
-	anim_obj ANIM_OBJ_2C,   5, 4,  11, 0, $20
-	anim_wait 8
-	anim_loop 8, .loop
-	anim_wait 128
-	anim_incbgeffect ANIM_BG_18
-	anim_call BattleAnim_ShowMon_0
-	anim_ret
-; c9fb5
-
-BattleAnim_FocusEnergy: ; c9fb5
-BattleAnim_RazorWind_branch_c9fb5: ; c9fb5
-BattleAnim_SkullBash_branch_c9fb5: ; c9fb5
-BattleAnim_SkyAttack_branch_c9fb5: ; c9fb5
-	anim_1gfx ANIM_GFX_SPEED
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_bgeffect ANIM_BG_16, $0, $1, $40
-	anim_bgeffect ANIM_BG_06, $0, $2, $0
-.loop
-	anim_sound 0, 0, SFX_SWORDS_DANCE
-	anim_obj ANIM_OBJ_47,   5, 4,  13, 4, $6
-	anim_wait 2
-	anim_obj ANIM_OBJ_47,   4, 4,  13, 4, $6
-	anim_wait 2
-	anim_obj ANIM_OBJ_47,   6, 4,  13, 4, $8
-	anim_wait 2
-	anim_obj ANIM_OBJ_47,   3, 4,  13, 4, $8
-	anim_wait 2
-	anim_obj ANIM_OBJ_47,   7, 4,  13, 4, $6
-	anim_wait 2
-	anim_obj ANIM_OBJ_47,   2, 4,  13, 4, $8
-	anim_wait 2
-	anim_obj ANIM_OBJ_47,   8, 4,  13, 4, $8
-	anim_wait 2
-	anim_loop 3, .loop
-	anim_wait 8
-	anim_incbgeffect ANIM_BG_16
-	anim_call BattleAnim_ShowMon_0
-	anim_ret
-; c9ffc
-
-BattleAnim_Bide: ; c9ffc
-	anim_if_param_equal $0, BattleAnim_Bide_branch_c9651
-	anim_1gfx ANIM_GFX_HIT
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_sound 0, 0, SFX_ESCAPE_ROPE
-	anim_bgeffect ANIM_BG_1A, $0, $1, $20
-	anim_wait 72
-	anim_incbgeffect ANIM_BG_1A
-	anim_call BattleAnim_ShowMon_0
-	anim_ret
-; ca014
-
-BattleAnim_Bind: ; ca014
-	anim_1gfx ANIM_GFX_ROPE
-	anim_sound 0, 1, SFX_BIND
-	anim_obj ANIM_OBJ_48, -16, 4,   8, 0, $0
-	anim_wait 8
-	anim_obj ANIM_OBJ_49, -16, 4,   7, 0, $0
-	anim_wait 8
-	anim_obj ANIM_OBJ_48, -16, 4,   6, 0, $0
-	anim_wait 64
-	anim_sound 0, 1, SFX_BIND
-	anim_incobj  1
-	anim_incobj  2
-	anim_incobj  3
-	anim_wait 96
-	anim_ret
-; ca036
-
-BattleAnim_Wrap: ; ca036
-	anim_1gfx ANIM_GFX_ROPE
-	anim_sound 0, 1, SFX_BIND
-	anim_obj ANIM_OBJ_48, -16, 4,   8, 0, $0
-	anim_wait 8
-	anim_obj ANIM_OBJ_48, -16, 4,   7, 0, $0
-	anim_wait 8
-	anim_obj ANIM_OBJ_48, -16, 4,   6, 0, $0
-	anim_wait 64
-	anim_sound 0, 1, SFX_BIND
-	anim_incobj  1
-	anim_incobj  2
-	anim_incobj  3
-	anim_wait 96
-	anim_ret
-; ca058
-
-BattleAnim_Confusion: ; ca058
-	anim_1gfx ANIM_GFX_HIT
-	anim_call BattleAnim_FollowPlayerHead_1
-	anim_sound 0, 1, SFX_PSYCHIC
-	anim_bgeffect ANIM_BG_NIGHT_SHADE, $0, $0, $8
-	anim_wait 128
-	anim_incbgeffect ANIM_BG_NIGHT_SHADE
-	anim_call BattleAnim_ShowMon_1
-	anim_ret
-; ca06c
-
-BattleAnim_Constrict: ; ca06c
-	anim_1gfx ANIM_GFX_ROPE
-	anim_sound 0, 1, SFX_BIND
-	anim_obj ANIM_OBJ_49, -16, 4,   8, 0, $0
-	anim_wait 8
-	anim_obj ANIM_OBJ_48, -16, 4,   6, 0, $0
-	anim_wait 8
-	anim_obj ANIM_OBJ_49, -16, 4,   5, 0, $0
-	anim_wait 8
-	anim_obj ANIM_OBJ_48, -16, 4,   7, 0, $0
-	anim_wait 64
-	anim_ret
-; ca08a
-
-BattleAnim_Earthquake: ; ca08a
-	anim_bgeffect ANIM_BG_1F, $60, $4, $10
-.loop
-	anim_sound 0, 1, SFX_EMBER
-	anim_wait 24
-	anim_loop 4, .loop
-	anim_ret
-; ca098
-
-BattleAnim_Fissure: ; ca098
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $40
-	anim_bgeffect ANIM_BG_1F, $60, $4, $0
-.loop
-	anim_sound 0, 1, SFX_EMBER
-	anim_wait 24
-	anim_loop 4, .loop
-	anim_ret
-; ca0ab
-
-BattleAnim_Growl: ; ca0ab
-	anim_1gfx ANIM_GFX_NOISE
-	anim_enemyfeetobj
-	anim_bgeffect ANIM_BG_06, $0, $2, $0
-	anim_cry $0
-.loop
-	anim_call BattleAnim_Growl_branch_cbbbc
-	anim_wait 16
-	anim_loop 3, .loop
-	anim_wait 9
-	anim_bgeffect ANIM_BG_FEET_FOLLOW, $0, $1, $0
-	anim_wait 8
-	anim_bgeffect ANIM_BG_19, $0, $0, $40
-	anim_wait 64
-	anim_incbgeffect ANIM_BG_19
-	anim_wait 1
-	anim_bgeffect ANIM_BG_SHOW_MON, $0, $1, $0
-	anim_wait 5
-	anim_incobj 10
-	anim_wait 8
-	anim_ret
-; ca0d7
-
-BattleAnim_Roar: ; ca0d7
-	anim_1gfx ANIM_GFX_NOISE
-	anim_bgeffect ANIM_BG_06, $0, $2, $0
-	anim_cry $1
-.loop
-	anim_call BattleAnim_Roar_branch_cbbbc
-	anim_wait 16
-	anim_loop 3, .loop
-	anim_wait 16
-	anim_if_param_equal $0, .done
-	anim_bgeffect ANIM_BG_27, $0, $0, $0
-	anim_wait 64
-.done
-	anim_ret
-; ca0f4
-
-BattleAnim_Supersonic: ; ca0f4
-	anim_1gfx ANIM_GFX_PSYCHIC
-.loop
-	anim_sound 6, 2, SFX_SUPERSONIC
-	anim_obj ANIM_OBJ_4C,   8, 0,  11, 0, $2
-	anim_wait 4
-	anim_loop 10, .loop
-	anim_wait 64
-	anim_ret
-; ca105
-
-BattleAnim_Screech: ; ca105
-	anim_1gfx ANIM_GFX_PSYCHIC
-	anim_bgeffect ANIM_BG_1F, $8, $1, $20
-	anim_sound 6, 2, SFX_SCREECH
-.loop
-	anim_obj ANIM_OBJ_4C,   8, 0,  11, 0, $2
-	anim_wait 2
-	anim_loop 2, .loop
-	anim_wait 64
-	anim_ret
-; ca11b
-
-BattleAnim_ConfuseRay: ; ca11b
-	anim_1gfx ANIM_GFX_SPEED
-	anim_bgeffect ANIM_BG_06, $0, $2, $0
-	anim_bgeffect ANIM_BG_08, $0, $4, $0
-	anim_obj ANIM_OBJ_4D,   8, 0,  11, 0, $0
-	anim_obj ANIM_OBJ_4D,   8, 0,  11, 0, $80
-	anim_obj ANIM_OBJ_4D,   8, 0,  11, 0, $88
-	anim_obj ANIM_OBJ_4D,   8, 0,  11, 0, $90
-	anim_obj ANIM_OBJ_4D,   8, 0,  11, 0, $98
-	anim_obj ANIM_OBJ_4D,   8, 0,  11, 0, $a0
-	anim_obj ANIM_OBJ_4D,   8, 0,  11, 0, $a8
-	anim_obj ANIM_OBJ_4D,   8, 0,  11, 0, $b0
-	anim_obj ANIM_OBJ_4D,   8, 0,  11, 0, $b8
-.loop
-	anim_sound 6, 2, SFX_WHIRLWIND
-	anim_wait 16
-	anim_loop 8, .loop
-	anim_wait 32
-	anim_ret
-; ca15e
-
-BattleAnim_Leer: ; ca15e
-	anim_1gfx ANIM_GFX_BEAM
-	anim_bgeffect ANIM_BG_06, $0, $2, $0
-	anim_call BattleAnim_Leer_branch_cbadc
-	anim_wait 16
-	anim_ret
-; ca16a
-
-BattleAnim_Reflect: ; ca16a
-	anim_1gfx ANIM_GFX_REFLECT
-	anim_bgeffect ANIM_BG_06, $0, $2, $0
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $4, $2
-	anim_sound 0, 0, SFX_SHINE
-	anim_obj ANIM_OBJ_50,   9, 0,  10, 0, $0
-	anim_wait 24
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $4, $2
-	anim_sound 0, 0, SFX_SHINE
-	anim_obj ANIM_OBJ_50,   9, 0,  10, 0, $0
-	anim_wait 64
-	anim_ret
-; ca18e
-
-BattleAnim_LightScreen: ; ca18e
-	anim_2gfx ANIM_GFX_SPEED, ANIM_GFX_REFLECT
-	anim_bgeffect ANIM_BG_06, $0, $2, $0
-	anim_sound 0, 0, SFX_FLASH
-	anim_obj ANIM_OBJ_50,   9, 0,  10, 0, $0
-	anim_wait 4
-	anim_obj ANIM_OBJ_6D,   9, 0,  10, 0, $0
-	anim_wait 4
-	anim_obj ANIM_OBJ_6D,   9, 0,  10, 0, $8
-	anim_wait 4
-	anim_obj ANIM_OBJ_6D,   9, 0,  10, 0, $10
-	anim_wait 4
-	anim_obj ANIM_OBJ_6D,   9, 0,  10, 0, $18
-	anim_wait 4
-	anim_obj ANIM_OBJ_50,   9, 0,  10, 0, $0
-	anim_obj ANIM_OBJ_6D,   9, 0,  10, 0, $20
-	anim_wait 4
-	anim_obj ANIM_OBJ_6D,   9, 0,  10, 0, $28
-	anim_wait 4
-	anim_obj ANIM_OBJ_6D,   9, 0,  10, 0, $30
-	anim_wait 4
-	anim_obj ANIM_OBJ_6D,   9, 0,  10, 0, $38
-	anim_wait 64
-	anim_ret
-; ca1d5
-
-BattleAnim_Amnesia: ; ca1d5
-	anim_1gfx ANIM_GFX_STATUS
-	anim_sound 0, 0, SFX_LICK
-	anim_obj ANIM_OBJ_53,   8, 0,  10, 0, $2
-	anim_wait 16
-	anim_obj ANIM_OBJ_53,   8, 4,  10, 0, $1
-	anim_wait 16
-	anim_obj ANIM_OBJ_53,   9, 0,  10, 0, $0
-	anim_wait 64
-	anim_ret
-; ca1ed
-
-BattleAnim_DizzyPunch: ; ca1ed
-	anim_2gfx ANIM_GFX_STATUS, ANIM_GFX_HIT
-	anim_sound 0, 1, SFX_MEGA_PUNCH
-	anim_obj ANIM_OBJ_00, -15, 0,   5, 0, $0
-	anim_obj ANIM_OBJ_02, -15, 0,   8, 0, $0
-	anim_wait 16
-	anim_sound 0, 1, SFX_KINESIS
-	anim_obj ANIM_OBJ_CHICK, -15, 0,   3, 0, $15
-	anim_obj ANIM_OBJ_CHICK, -15, 0,   3, 0, $aa
-	anim_obj ANIM_OBJ_CHICK, -15, 0,   3, 0, $bf
-	anim_wait 96
-	anim_ret
-; ca212
-
-BattleAnim_Rest: ; ca212
-	anim_1gfx ANIM_GFX_STATUS
-	anim_sound 0, 0, SFX_TAIL_WHIP
-.loop
-	anim_obj ANIM_OBJ_54,   8, 0,  10, 0, $0
-	anim_wait 40
-	anim_loop 3, .loop
-	anim_wait 32
-	anim_ret
-; ca223
-
-BattleAnim_AcidArmor: ; ca223
-	anim_1gfx ANIM_GFX_HIT
-	anim_call BattleAnim_FollowPlayerHead_0
-	anim_bgeffect ANIM_BG_ACID_ARMOR, $0, $1, $8
-	anim_sound 0, 0, SFX_MEGA_PUNCH
-	anim_wait 64
-	anim_incbgeffect ANIM_BG_ACID_ARMOR
-	anim_call BattleAnim_ShowMon_0
-	anim_ret
-; ca237
-
-BattleAnim_Splash: ; ca237
-	anim_1gfx ANIM_GFX_HIT
-	anim_sound 0, 0, SFX_VICEGRIP
-	anim_call BattleAnim_FollowPlayerHead_0
-	anim_bgeffect ANIM_BG_BOUNCE_DOWN, $0, $1, $0
-	anim_wait 96
-	anim_incbgeffect ANIM_BG_BOUNCE_DOWN
-	anim_call BattleAnim_ShowMon_0
-	anim_ret
-; ca24b
-
-BattleAnim_Dig: ; ca24b
-	anim_2gfx ANIM_GFX_SAND, ANIM_GFX_HIT
-	anim_if_param_equal $0, .hit
-	anim_if_param_equal $2, .fail
-	anim_call BattleAnim_FollowPlayerHead_0
-	anim_bgeffect ANIM_BG_DIG, $0, $1, $1
-	anim_obj ANIM_OBJ_57,   9, 0,  13, 0, $0
-.loop
-	anim_sound 0, 0, SFX_RAZOR_WIND
-	anim_obj ANIM_OBJ_56,   7, 0,  13, 0, $0
-	anim_wait 16
-	anim_loop 6, .loop
-	anim_wait 32
-	anim_bgeffect ANIM_BG_HIDE_MON, $0, $1, $0
-	anim_wait 8
-	anim_incbgeffect ANIM_BG_DIG
-	anim_call BattleAnim_ShowMon_0
-	anim_ret
-
-.hit
-	anim_sound 0, 1, SFX_MEGA_PUNCH
-	anim_obj ANIM_OBJ_01, -15, 0,   7, 0, $0
-	anim_wait 32
-.fail
-	anim_bgeffect ANIM_BG_ENTER_MON, $0, $1, $0
-	anim_wait 32
-	anim_ret
-; ca28d
-
-BattleAnim_SandAttack: ; ca28d
-	anim_1gfx ANIM_GFX_SAND
-	anim_call BattleAnim_SandAttack_branch_cbc5b
-	anim_ret
-; ca293
-
-BattleAnim_StringShot: ; ca293
-	anim_1gfx ANIM_GFX_WEB
-	anim_bgeffect ANIM_BG_07, $0, $2, $0
-	anim_sound 6, 2, SFX_MENU
-	anim_obj ANIM_OBJ_5A,   8, 0,  10, 0, $0
-	anim_wait 4
-	anim_sound 0, 1, SFX_MENU
-	anim_obj ANIM_OBJ_5A, -16, 4,   6, 0, $1
-	anim_wait 4
-	anim_sound 6, 2, SFX_MENU
-	anim_obj ANIM_OBJ_5A,   8, 0,  11, 0, $0
-	anim_wait 4
-	anim_sound 0, 1, SFX_MENU
-	anim_obj ANIM_OBJ_5A, -16, 4,   8, 0, $1
-	anim_wait 4
-	anim_sound 6, 2, SFX_MENU
-	anim_obj ANIM_OBJ_5A,   8, 0,  10, 4, $0
-	anim_wait 4
-	anim_sound 0, 1, SFX_MENU
-	anim_obj ANIM_OBJ_5A, -16, 4,   7, 0, $2
-	anim_wait 64
-	anim_ret
-; ca2d1
-
-BattleAnim_Headbutt: ; ca2d1
-	anim_1gfx ANIM_GFX_HIT
-	anim_bgeffect ANIM_BG_1F, $14, $2, $0
-	anim_wait 32
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_bgeffect ANIM_BG_TACKLE, $0, $1, $0
-	anim_wait 4
-	anim_sound 0, 1, SFX_HEADBUTT
-	anim_obj ANIM_OBJ_01, -15, 0,   7, 0, $0
-	anim_wait 8
-	anim_call BattleAnim_ShowMon_0
-	anim_ret
-; ca2ef
-
-BattleAnim_Tackle: ; ca2ef
-	anim_1gfx ANIM_GFX_HIT
-	anim_call BattleAnim_FollowPlayerHead_0
-	anim_bgeffect ANIM_BG_TACKLE, $0, $1, $0
-	anim_wait 4
-	anim_sound 0, 1, SFX_TACKLE
-	anim_obj ANIM_OBJ_00, -15, 0,   6, 0, $0
-	anim_wait 8
-	anim_call BattleAnim_ShowMon_0
-	anim_ret
-; ca307
-
-BattleAnim_BodySlam: ; ca307
-	anim_1gfx ANIM_GFX_HIT
-	anim_call BattleAnim_FollowPlayerHead_0
-	anim_bgeffect ANIM_BG_BOUNCE_DOWN, $0, $1, $0
-	anim_wait 32
-	anim_incbgeffect ANIM_BG_BOUNCE_DOWN
-	anim_wait 4
-	anim_bgeffect ANIM_BG_25, $0, $1, $0
-	anim_wait 3
-	anim_sound 0, 1, SFX_TACKLE
-	anim_obj ANIM_OBJ_01, -15, 0,   6, 0, $0
-	anim_wait 6
-	anim_sound 0, 1, SFX_TACKLE
-	anim_obj ANIM_OBJ_01, -14, 0,   6, 0, $0
-	anim_wait 3
-	anim_call BattleAnim_ShowMon_0
-	anim_ret
-; ca331
-
-BattleAnim_TakeDown: ; ca331
-	anim_1gfx ANIM_GFX_HIT
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_bgeffect ANIM_BG_TACKLE, $0, $1, $0
-	anim_wait 3
-	anim_sound 0, 1, SFX_TACKLE
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $4, $2
-	anim_obj ANIM_OBJ_01,  16, 0,   7, 0, $0
-	anim_wait 6
-	anim_sound 0, 1, SFX_TACKLE
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $4, $2
-	anim_obj ANIM_OBJ_01, -14, 0,   6, 0, $0
-	anim_wait 3
-	anim_call BattleAnim_ShowMon_0
-	anim_ret
-; ca35c
-
-BattleAnim_DoubleEdge: ; ca35c
-	anim_1gfx ANIM_GFX_HIT
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $4, $10
-	anim_bgeffect ANIM_BG_TACKLE, $0, $1, $0
-	anim_wait 3
-	anim_sound 0, 1, SFX_TACKLE
-	anim_obj ANIM_OBJ_00,  16, 0,   6, 0, $0
-	anim_wait 6
-	anim_sound 0, 1, SFX_TACKLE
-	anim_obj ANIM_OBJ_00, -14, 0,   6, 0, $0
-	anim_wait 3
-	anim_call BattleAnim_ShowMon_0
-	anim_ret
-; ca382
-
-BattleAnim_Submission: ; ca382
-	anim_1gfx ANIM_GFX_HIT
-	anim_call BattleAnim_FollowEnemyFeet_1
-	anim_bgeffect ANIM_BG_26, $0, $0, $0
-	anim_sound 0, 1, SFX_SUBMISSION
-	anim_wait 32
-	anim_obj ANIM_OBJ_01,  15, 0,   6, 0, $0
-	anim_wait 32
-	anim_obj ANIM_OBJ_01, -13, 0,   7, 0, $0
-	anim_wait 32
-	anim_obj ANIM_OBJ_01, -15, 0,   6, 4, $0
-	anim_wait 32
-	anim_incbgeffect ANIM_BG_26
-	anim_call BattleAnim_ShowMon_1
-	anim_ret
-; ca3a8
-
-BattleAnim_Whirlwind: ; ca3a8
-	anim_1gfx ANIM_GFX_WIND
-.loop
-	anim_sound 0, 0, SFX_RAZOR_WIND
-	anim_obj ANIM_OBJ_GUST,   8, 0,  14, 0, $0
-	anim_wait 6
-	anim_loop 9, .loop
-	anim_incobj  1
-	anim_incobj  2
-	anim_incobj  3
-	anim_incobj  4
-	anim_incobj  5
-	anim_incobj  6
-	anim_incobj  7
-	anim_incobj  8
-	anim_incobj  9
-	anim_sound 16, 2, SFX_WHIRLWIND
-	anim_wait 128
-	anim_if_param_equal $0, .done
-	anim_bgeffect ANIM_BG_27, $0, $0, $0
-	anim_wait 64
-.done
-	anim_ret
-; ca3d8
-
-BattleAnim_Hypnosis: ; ca3d8
-	anim_1gfx ANIM_GFX_PSYCHIC
-.loop
-	anim_sound 6, 2, SFX_SUPERSONIC
-	anim_obj ANIM_OBJ_4C,   8, 0,  11, 0, $2
-	anim_obj ANIM_OBJ_4C,   7, 0,  10, 0, $2
-	anim_wait 8
-	anim_loop 3, .loop
-	anim_wait 56
-	anim_ret
-; ca3ee
-
-BattleAnim_Haze: ; ca3ee
-	anim_1gfx ANIM_GFX_HAZE
-	anim_sound 0, 1, SFX_SURF
-.loop
-	anim_obj ANIM_OBJ_HAZE,   6, 0,   7, 0, $0
-	anim_obj ANIM_OBJ_HAZE, -16, 4,   2, 0, $0
-	anim_wait 12
-	anim_loop 5, .loop
-	anim_wait 96
-	anim_ret
-; ca404
-
-BattleAnim_Mist: ; ca404
-	anim_obp0 $54
-	anim_1gfx ANIM_GFX_HAZE
-	anim_sound 0, 0, SFX_SURF
-.loop
-	anim_obj ANIM_OBJ_MIST,   6, 0,   7, 0, $0
-	anim_wait 8
-	anim_loop 10, .loop
-	anim_wait 96
-	anim_ret
-; ca417
-
-BattleAnim_Smog: ; ca417
-	anim_1gfx ANIM_GFX_HAZE
-	anim_sound 0, 1, SFX_BUBBLEBEAM
-.loop
-	anim_obj ANIM_OBJ_SMOG, -16, 4,   2, 0, $0
-	anim_wait 8
-	anim_loop 10, .loop
-	anim_wait 96
-	anim_ret
-; ca428
-
-BattleAnim_PoisonGas: ; ca428
-	anim_1gfx ANIM_GFX_HAZE
-	anim_sound 16, 2, SFX_BUBBLEBEAM
-.loop
-	anim_obj ANIM_OBJ_POISON_GAS,   5, 4,  10, 0, $2
-	anim_wait 8
-	anim_loop 10, .loop
-	anim_wait 128
-	anim_ret
-; ca439
-
-BattleAnim_HornAttack: ; ca439
-	anim_2gfx ANIM_GFX_HORN, ANIM_GFX_HIT
-	anim_obj ANIM_OBJ_HORN,   9, 0,  10, 0, $1
-	anim_wait 16
-	anim_sound 0, 1, SFX_HORN_ATTACK
-	anim_obj ANIM_OBJ_01, -15, 0,   7, 0, $0
-	anim_wait 16
-	anim_ret
-; ca44c
-
-BattleAnim_FuryAttack: ; ca44c
-	anim_2gfx ANIM_GFX_HORN, ANIM_GFX_HIT
-	anim_obj ANIM_OBJ_HORN,   9, 0,   9, 0, $2
-	anim_wait 8
-	anim_sound 0, 1, SFX_HORN_ATTACK
-	anim_obj ANIM_OBJ_04,  16, 0,   5, 0, $0
-	anim_wait 8
-	anim_obj ANIM_OBJ_HORN,  10, 0,  11, 0, $2
-	anim_wait 8
-	anim_sound 0, 1, SFX_HORN_ATTACK
-	anim_obj ANIM_OBJ_04, -15, 0,   7, 0, $0
-	anim_wait 8
-	anim_obj ANIM_OBJ_HORN,   9, 4,  10, 0, $2
-	anim_wait 8
-	anim_sound 0, 1, SFX_HORN_ATTACK
-	anim_obj ANIM_OBJ_04, -16, 4,   6, 0, $0
-	anim_wait 8
-	anim_ret
-; ca47d
-
-BattleAnim_HornDrill: ; ca47d
-	anim_2gfx ANIM_GFX_HORN, ANIM_GFX_HIT
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $40
-	anim_obj ANIM_OBJ_HORN,   9, 0,  10, 0, $3
-	anim_wait 8
-.loop
-	anim_sound 0, 1, SFX_HORN_ATTACK
-	anim_obj ANIM_OBJ_00, -16, 4,   5, 0, $0
-	anim_wait 8
-	anim_sound 0, 1, SFX_HORN_ATTACK
-	anim_obj ANIM_OBJ_00, -15, 4,   6, 0, $0
-	anim_wait 8
-	anim_sound 0, 1, SFX_HORN_ATTACK
-	anim_obj ANIM_OBJ_00, -16, 4,   7, 0, $0
-	anim_wait 8
-	anim_sound 0, 1, SFX_HORN_ATTACK
-	anim_obj ANIM_OBJ_00,  15, 4,   6, 0, $0
-	anim_wait 8
-	anim_loop 3, .loop
-	anim_ret
-; ca4b4
-
-BattleAnim_PoisonSting: ; ca4b4
-	anim_2gfx ANIM_GFX_HORN, ANIM_GFX_HIT
-	anim_obj ANIM_OBJ_60,   8, 0,  11, 4, $14
-	anim_wait 16
-	anim_sound 0, 1, SFX_POISON_STING
-	anim_obj ANIM_OBJ_05, -15, 0,   7, 0, $0
-	anim_wait 16
-	anim_ret
-; ca4c7
-
-BattleAnim_Twineedle: ; ca4c7
-	anim_2gfx ANIM_GFX_HORN, ANIM_GFX_HIT
-	anim_sound 0, 1, SFX_POISON_STING
-	anim_obj ANIM_OBJ_60,   8, 0,  11, 4, $14
-	anim_obj ANIM_OBJ_60,   7, 0,  10, 4, $14
-	anim_wait 16
-	anim_sound 0, 1, SFX_POISON_STING
-	anim_obj ANIM_OBJ_05, -15, 0,   7, 0, $0
-	anim_obj ANIM_OBJ_05,  16, 0,   6, 0, $0
-	anim_wait 16
-	anim_ret
-; ca4e7
-
-BattleAnim_PinMissile: ; ca4e7
-	anim_2gfx ANIM_GFX_HORN, ANIM_GFX_HIT
-.loop
-	anim_obj ANIM_OBJ_60,   8, 0,  11, 4, $28
-	anim_wait 8
-	anim_obj ANIM_OBJ_60,   7, 0,  10, 4, $28
-	anim_sound 0, 1, SFX_POISON_STING
-	anim_obj ANIM_OBJ_05, -15, 0,   7, 0, $0
-	anim_wait 8
-	anim_obj ANIM_OBJ_60,   6, 4,  11, 0, $28
-	anim_sound 0, 1, SFX_POISON_STING
-	anim_obj ANIM_OBJ_05,  16, 0,   6, 0, $0
-	anim_wait 8
-	anim_sound 0, 1, SFX_POISON_STING
-	anim_obj ANIM_OBJ_05, -16, 4,   6, 4, $0
-	anim_loop 3, .loop
-	anim_wait 16
-	anim_ret
-; ca51a
-
-BattleAnim_SpikeCannon: ; ca51a
-	anim_2gfx ANIM_GFX_HORN, ANIM_GFX_HIT
-.loop
-	anim_obj ANIM_OBJ_60,   8, 0,  11, 4, $18
-	anim_wait 8
-	anim_obj ANIM_OBJ_60,   7, 0,  10, 4, $18
-	anim_sound 0, 1, SFX_POISON_STING
-	anim_obj ANIM_OBJ_05, -15, 0,   7, 0, $0
-	anim_wait 8
-	anim_obj ANIM_OBJ_60,   6, 4,  11, 0, $18
-	anim_sound 0, 1, SFX_POISON_STING
-	anim_obj ANIM_OBJ_05,  16, 0,   6, 0, $0
-	anim_wait 8
-	anim_sound 0, 1, SFX_POISON_STING
-	anim_obj ANIM_OBJ_05, -16, 4,   6, 4, $0
-	anim_loop 3, .loop
-	anim_wait 16
-	anim_ret
-; ca54d
-
-BattleAnim_Transform: ; ca54d
-	anim_1gfx ANIM_GFX_HIT
-	anim_call BattleAnim_FollowPlayerHead_0
-	anim_transform
-	anim_sound 0, 0, SFX_PSYBEAM
-	anim_bgeffect ANIM_BG_WAVE_DEFORM_USER, $0, $1, $0
-	anim_wait 48
-	anim_updateactorpic
-	anim_incbgeffect ANIM_BG_WAVE_DEFORM_USER
-	anim_wait 48
-	anim_call BattleAnim_ShowMon_0
-	anim_ret
-; ca564
-
-BattleAnim_PetalDance: ; ca564
-	anim_sound 0, 0, SFX_MENU
-	anim_2gfx ANIM_GFX_FLOWER, ANIM_GFX_HIT
-.loop
-	anim_obj ANIM_OBJ_61,   6, 0,   7, 0, $0
-	anim_wait 11
-	anim_loop 8, .loop
-	anim_wait 128
-	anim_wait 64
-	anim_sound 0, 1, SFX_COMET_PUNCH
-	anim_obj ANIM_OBJ_00, -15, 0,   7, 0, $0
-	anim_wait 16
-	anim_ret
-; ca580
-
-BattleAnim_Barrage: ; ca580
-	anim_2gfx ANIM_GFX_EGG, ANIM_GFX_EXPLOSION
-	anim_sound 6, 2, SFX_THROW_BALL
-	anim_obj ANIM_OBJ_62,   8, 0,  11, 4, $10
-	anim_wait 36
-	anim_sound 0, 1, SFX_EGG_BOMB
-	anim_obj ANIM_OBJ_18, -15, 0,   7, 0, $0
-	anim_wait 16
-	anim_ret
-; ca596
-
-BattleAnim_PayDay: ; ca596
-	anim_2gfx ANIM_GFX_HIT, ANIM_GFX_STATUS
-	anim_sound 0, 1, SFX_POUND
-	anim_obj ANIM_OBJ_01,  16, 0,   7, 0, $0
-	anim_wait 16
-	anim_sound 0, 1, SFX_PAY_DAY
-	anim_obj ANIM_OBJ_63,  15, 0,   9, 4, $1
-	anim_wait 64
-	anim_ret
-; ca5ac
-
-BattleAnim_Mimic: ; ca5ac
-	anim_1gfx ANIM_GFX_SPEED
-	anim_obp0 $fc
-	anim_sound 63, 3, SFX_LICK
-	anim_obj ANIM_OBJ_65, -16, 4,   5, 4, $0
-	anim_obj ANIM_OBJ_65, -16, 4,   5, 4, $8
-	anim_obj ANIM_OBJ_65, -16, 4,   5, 4, $10
-	anim_obj ANIM_OBJ_65, -16, 4,   5, 4, $18
-	anim_obj ANIM_OBJ_65, -16, 4,   5, 4, $20
-	anim_obj ANIM_OBJ_65, -16, 4,   5, 4, $28
-	anim_obj ANIM_OBJ_65, -16, 4,   5, 4, $30
-	anim_obj ANIM_OBJ_65, -16, 4,   5, 4, $38
-	anim_wait 128
-	anim_wait 48
-	anim_ret
-; ca5de
-
-BattleAnim_LovelyKiss: ; ca5de
-	anim_2gfx ANIM_GFX_OBJECTS, ANIM_GFX_ANGELS
-	anim_bgeffect ANIM_BG_07, $0, $2, $0
-	anim_obj ANIM_OBJ_96, -13, 0,   5, 0, $0
-	anim_wait 32
-	anim_sound 0, 1, SFX_LICK
-	anim_obj ANIM_OBJ_HEART,  16, 0,   5, 0, $0
-	anim_wait 40
-	anim_ret
-; ca5f6
-
-BattleAnim_Bonemerang: ; ca5f6
-	anim_2gfx ANIM_GFX_MISC, ANIM_GFX_HIT
-	anim_sound 6, 2, SFX_HYDRO_PUMP
-	anim_obj ANIM_OBJ_67,  11, 0,   7, 0, $1c
-	anim_wait 24
-	anim_sound 0, 1, SFX_MOVE_PUZZLE_PIECE
-	anim_obj ANIM_OBJ_01, -15, 0,   7, 0, $0
-	anim_wait 24
-	anim_ret
-; ca60c
-
-BattleAnim_Swift: ; ca60c
-	anim_1gfx ANIM_GFX_OBJECTS
-	anim_sound 6, 2, SFX_METRONOME
-	anim_obj ANIM_OBJ_6A,   8, 0,  11, 0, $4
-	anim_wait 4
-	anim_obj ANIM_OBJ_6A,   8, 0,   9, 0, $4
-	anim_wait 4
-	anim_obj ANIM_OBJ_6A,   8, 0,   9, 4, $4
-	anim_wait 64
-	anim_ret
-; ca624
-
-BattleAnim_Crabhammer: ; ca624
-	anim_1gfx ANIM_GFX_HIT
-	anim_bgeffect ANIM_BG_1F, $40, $2, $0
-	anim_wait 48
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $3
-.loop
-	anim_sound 0, 1, SFX_MEGA_PUNCH
-	anim_obj ANIM_OBJ_00, -15, 0,   7, 0, $0
-	anim_wait 12
-	anim_loop 3, .loop
-	anim_ret
-; ca63f
-
-BattleAnim_SkullBash: ; ca63f
-	anim_if_param_equal $1, BattleAnim_SkullBash_branch_c9fb5
-	anim_1gfx ANIM_GFX_HIT
-	anim_bgeffect ANIM_BG_1F, $14, $2, $0
-	anim_wait 32
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $3
-	anim_bgeffect ANIM_BG_TACKLE, $0, $1, $0
-	anim_wait 4
-.loop
-	anim_sound 0, 1, SFX_HEADBUTT
-	anim_obj ANIM_OBJ_01, -15, 0,   7, 0, $0
-	anim_wait 8
-	anim_loop 3, .loop
-	anim_call BattleAnim_ShowMon_0
-	anim_ret
-; ca66a
-
-BattleAnim_Kinesis: ; ca66a
-	anim_2gfx ANIM_GFX_MISC, ANIM_GFX_NOISE
-	anim_bgeffect ANIM_BG_06, $0, $2, $0
-	anim_obj ANIM_OBJ_6B,  10, 0,   9, 4, $0
-	anim_wait 32
-.loop
-	anim_sound 0, 0, SFX_KINESIS
-	anim_obj ANIM_OBJ_4B,   8, 0,  11, 0, $0
-	anim_wait 32
-	anim_loop 3, .loop
-	anim_wait 32
-	anim_sound 0, 0, SFX_KINESIS_2
-	anim_wait 32
-	anim_ret
-; ca68b
-
-BattleAnim_Peck: ; ca68b
-	anim_1gfx ANIM_GFX_HIT
-	anim_sound 0, 1, SFX_PECK
-	anim_obj ANIM_OBJ_02,  16, 0,   6, 0, $0
-	anim_wait 8
-	anim_sound 0, 1, SFX_PECK
-	anim_obj ANIM_OBJ_02, -15, 0,   7, 0, $0
-	anim_wait 16
-	anim_ret
-; ca6a0
-
-BattleAnim_DrillPeck: ; ca6a0
-	anim_1gfx ANIM_GFX_HIT
-.loop
-	anim_sound 0, 1, SFX_PECK
-	anim_obj ANIM_OBJ_02,  15, 4,   7, 0, $0
-	anim_wait 4
-	anim_sound 0, 1, SFX_PECK
-	anim_obj ANIM_OBJ_02, -16, 4,   6, 0, $0
-	anim_wait 4
-	anim_sound 0, 1, SFX_PECK
-	anim_obj ANIM_OBJ_02, -15, 4,   7, 0, $0
-	anim_wait 4
-	anim_sound 0, 1, SFX_PECK
-	anim_obj ANIM_OBJ_02, -16, 4,   8, 0, $0
-	anim_wait 4
-	anim_loop 5, .loop
-	anim_wait 16
-	anim_ret
-; ca6cc
-
-BattleAnim_Guillotine: ; ca6cc
-	anim_1gfx ANIM_GFX_CUT
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $10
-	anim_bgeffect ANIM_BG_1F, $40, $2, $0
-	anim_sound 0, 1, SFX_VICEGRIP
-	anim_obj ANIM_OBJ_37, -13, 4,   5, 4, $0
-	anim_obj ANIM_OBJ_37, -13, 0,   5, 0, $0
-	anim_obj ANIM_OBJ_37, -14, 4,   4, 4, $0
-	anim_obj ANIM_OBJ_39,  15, 4,   9, 4, $0
-	anim_obj ANIM_OBJ_39,  15, 0,   9, 0, $0
-	anim_obj ANIM_OBJ_39,  14, 4,   8, 4, $0
-	anim_obj ANIM_OBJ_39,  15, 0,   9, 0, $0
-	anim_wait 32
-	anim_ret
-; ca700
-
-BattleAnim_Flash: ; ca700
-	anim_1gfx ANIM_GFX_SPEED
-	anim_sound 0, 1, SFX_FLASH
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $6, $20
-	anim_wait 4
-	anim_obj ANIM_OBJ_6C, -15, 0,   7, 0, $0
-	anim_wait 4
-	anim_obj ANIM_OBJ_6C, -15, 0,   7, 0, $8
-	anim_wait 4
-	anim_obj ANIM_OBJ_6C, -15, 0,   7, 0, $10
-	anim_wait 4
-	anim_obj ANIM_OBJ_6C, -15, 0,   7, 0, $18
-	anim_wait 4
-	anim_obj ANIM_OBJ_6C, -15, 0,   7, 0, $20
-	anim_wait 4
-	anim_obj ANIM_OBJ_6C, -15, 0,   7, 0, $28
-	anim_wait 4
-	anim_obj ANIM_OBJ_6C, -15, 0,   7, 0, $30
-	anim_wait 4
-	anim_obj ANIM_OBJ_6C, -15, 0,   7, 0, $38
-	anim_wait 32
-	anim_ret
-; ca73c
-
-BattleAnim_Substitute: ; ca73c
-	anim_sound 0, 0, SFX_SURF
-	anim_if_param_equal $3, BattleAnim_Substitute_branch_ca77c
-	anim_if_param_equal $2, BattleAnim_Substitute_branch_ca76e
-	anim_if_param_equal $1, BattleAnim_Substitute_branch_ca760
-	anim_1gfx ANIM_GFX_SMOKE
-	anim_bgeffect ANIM_BG_27, $0, $1, $0
-	anim_wait 48
-	anim_raisesub
-	anim_obj ANIM_OBJ_BALL_POOF,   6, 0,  12, 0, $0
-	anim_bgeffect ANIM_BG_ENTER_MON, $0, $1, $0
-	anim_wait 32
-	anim_ret
-; ca760
-
-BattleAnim_Substitute_branch_ca760: ; ca760
-	anim_bgeffect ANIM_BG_27, $0, $1, $0
-	anim_wait 48
-	anim_dropsub
-	anim_bgeffect ANIM_BG_SHOW_MON, $0, $1, $0
-	anim_wait 32
-	anim_ret
-; ca76e
-
-BattleAnim_Substitute_branch_ca76e: ; ca76e
-	anim_bgeffect ANIM_BG_27, $0, $1, $0
-	anim_wait 48
-	anim_raisesub
-	anim_bgeffect ANIM_BG_SHOW_MON, $0, $1, $0
-	anim_wait 32
-	anim_ret
-; ca77c
-
-BattleAnim_Substitute_branch_ca77c: ; ca77c
-	anim_bgeffect ANIM_BG_HIDE_MON, $0, $1, $0
-	anim_wait 48
-	anim_dropsub
-	anim_bgeffect ANIM_BG_SHOW_MON, $0, $1, $0
-	anim_wait 32
-	anim_ret
-; ca78a
-
-BattleAnim_Minimize: ; ca78a
-	anim_sound 0, 0, SFX_SURF
-	anim_1gfx ANIM_GFX_HIT
-	anim_call BattleAnim_FollowPlayerHead_0
-	anim_minimize
-	anim_bgeffect ANIM_BG_WAVE_DEFORM_USER, $0, $1, $0
-	anim_wait 48
-	anim_updateactorpic
-	anim_incbgeffect ANIM_BG_WAVE_DEFORM_USER
-	anim_wait 48
-	anim_call BattleAnim_ShowMon_0
-	anim_ret
-; ca7a1
-
-BattleAnim_SkyAttack: ; ca7a1
-	anim_if_param_equal $1, BattleAnim_SkyAttack_branch_c9fb5
-	anim_1gfx ANIM_GFX_SKY_ATTACK
-	anim_bgeffect ANIM_BG_27, $0, $1, $0
-	anim_wait 32
-	anim_sound 0, 0, SFX_HYPER_BEAM
-	anim_obj ANIM_OBJ_SKY_ATTACK_FEAROW,   6, 0,  11, 0, $40
-	anim_wait 64
-	anim_incobj  1
-	anim_wait 21
-	anim_sound 0, 1, SFX_HYPER_BEAM
-	anim_bgeffect ANIM_BG_ALTERNATE_HUES, $0, $2, $0
-	anim_wait 64
-	anim_incobj  1
-	anim_wait 32
-	anim_bgeffect ANIM_BG_SHOW_MON, $0, $1, $0
-	anim_wait 16
-	anim_ret
-; ca7cc
-
-BattleAnim_NightShade: ; ca7cc
-	anim_1gfx ANIM_GFX_HIT
-	anim_bgp $1b
-	anim_obp1 $1b
-	anim_wait 32
-	anim_call BattleAnim_FollowPlayerHead_1
-	anim_bgeffect ANIM_BG_NIGHT_SHADE, $0, $0, $8
-	anim_sound 0, 1, SFX_PSYCHIC
-	anim_wait 96
-	anim_incbgeffect ANIM_BG_NIGHT_SHADE
-	anim_call BattleAnim_ShowMon_1
-	anim_ret
-; ca7e5
-
-BattleAnim_Lick: ; ca7e5
-	anim_1gfx ANIM_GFX_WATER
-	anim_sound 0, 1, SFX_LICK
-	anim_obj ANIM_OBJ_LICK, -15, 0,   7, 0, $0
-	anim_wait 64
-	anim_ret
-; ca7f1
-
-BattleAnim_TriAttack: ; ca7f1
-	anim_3gfx ANIM_GFX_FIRE, ANIM_GFX_ICE, ANIM_GFX_LIGHTNING
-	anim_call BattleAnim_TriAttack_branch_cbbcc
-	anim_wait 16
-	anim_call BattleAnim_TriAttack_branch_cbbdf
-	anim_wait 16
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $4, $4
-	anim_sound 0, 1, SFX_THUNDER
-	anim_obj ANIM_OBJ_2F, -13, 0,   8, 4, $0
-	anim_wait 16
-	anim_ret
-; ca80c
-
-BattleAnim_Withdraw: ; ca80c
-	anim_1gfx ANIM_GFX_REFLECT
-	anim_call BattleAnim_FollowPlayerHead_0
-	anim_bgeffect ANIM_BG_WITHDRAW, $0, $1, $50
-	anim_wait 48
-	anim_sound 0, 0, SFX_SHINE
-	anim_obj ANIM_OBJ_WITHDRAW,   6, 0,  11, 0, $0
-	anim_wait 64
-	anim_incobj  2
-	anim_wait 1
-	anim_incbgeffect ANIM_BG_WITHDRAW
-	anim_call BattleAnim_ShowMon_0
-	anim_ret
-; ca829
-
-BattleAnim_Psybeam: ; ca829
-	anim_1gfx ANIM_GFX_PSYCHIC
-	anim_bgeffect ANIM_BG_06, $0, $2, $0
-	anim_bgeffect ANIM_BG_08, $0, $4, $0
-.loop
-	anim_sound 6, 2, SFX_PSYBEAM
-	anim_obj ANIM_OBJ_4C,   8, 0,  11, 0, $4
-	anim_wait 4
-	anim_loop 10, .loop
-	anim_wait 48
-	anim_ret
-; ca844
-
-BattleAnim_DreamEater: ; ca844
-	anim_1gfx ANIM_GFX_BUBBLE
-	anim_bgp $1b
-	anim_obp0 $27
-	anim_sound 6, 3, SFX_WATER_GUN
-	anim_call BattleAnim_DreamEater_branch_cbab3
-	anim_wait 128
-	anim_wait 48
-	anim_ret
-; ca853
-
-BattleAnim_LeechLife: ; ca853
-	anim_1gfx ANIM_GFX_BUBBLE
-	anim_sound 6, 3, SFX_WATER_GUN
-	anim_call BattleAnim_LeechLife_branch_cbab3
-	anim_wait 128
-	anim_wait 48
-	anim_ret
-; ca85e
-
-BattleAnim_Harden: ; ca85e
-	anim_1gfx ANIM_GFX_REFLECT
-	anim_obp0 $0
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_call BattleAnim_Harden_branch_cbc43
-	anim_call BattleAnim_ShowMon_0
-	anim_ret
-; ca86c
-
-BattleAnim_Psywave: ; ca86c
-	anim_1gfx ANIM_GFX_PSYCHIC
-	anim_bgeffect ANIM_BG_PSYCHIC, $0, $0, $0
-.loop
-	anim_sound 6, 2, SFX_PSYCHIC
-	anim_obj ANIM_OBJ_4C,   8, 0,  10, 0, $2
-	anim_wait 8
-	anim_sound 6, 2, SFX_PSYCHIC
-	anim_obj ANIM_OBJ_4C,   8, 0,  11, 0, $3
-	anim_wait 8
-	anim_sound 6, 2, SFX_PSYCHIC
-	anim_obj ANIM_OBJ_4C,   8, 0,  12, 0, $4
-	anim_wait 8
-	anim_loop 3, .loop
-	anim_wait 32
-	anim_incbgeffect ANIM_BG_PSYCHIC
-	anim_wait 4
-	anim_ret
-; ca897
-
-BattleAnim_Glare: ; ca897
-	anim_1gfx ANIM_GFX_BEAM
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $20
-	anim_bgeffect ANIM_BG_06, $0, $2, $0
-	anim_call BattleAnim_Glare_branch_cbadc
-	anim_wait 16
-	anim_ret
-; ca8a8
-
-BattleAnim_Thrash: ; ca8a8
-	anim_1gfx ANIM_GFX_HIT
-	anim_sound 0, 1, SFX_POUND
-	anim_obj ANIM_OBJ_08,  15, 0,   9, 0, $0
-	anim_obj ANIM_OBJ_00,  15, 0,   9, 0, $0
-	anim_wait 6
-	anim_sound 0, 1, SFX_MOVE_PUZZLE_PIECE
-	anim_obj ANIM_OBJ_06, -15, 0,   7, 0, $0
-	anim_obj ANIM_OBJ_00, -15, 0,   7, 0, $0
-	anim_wait 6
-	anim_sound 0, 1, SFX_DOUBLE_KICK
-	anim_obj ANIM_OBJ_07, -13, 0,   5, 0, $0
-	anim_obj ANIM_OBJ_00, -13, 0,   5, 0, $0
-	anim_wait 16
-	anim_ret
-; ca8d5
-
-BattleAnim_Growth: ; ca8d5
-	anim_bgeffect ANIM_BG_WHITE_HUES, $0, $8, $0
-	anim_1gfx ANIM_GFX_CHARGE
-	anim_sound 0, 0, SFX_SWORDS_DANCE
-	anim_obj ANIM_OBJ_72,   6, 0,  13, 4, $0
-	anim_obj ANIM_OBJ_72,   6, 0,  13, 4, $8
-	anim_obj ANIM_OBJ_72,   6, 0,  13, 4, $10
-	anim_obj ANIM_OBJ_72,   6, 0,  13, 4, $18
-	anim_obj ANIM_OBJ_72,   6, 0,  13, 4, $20
-	anim_obj ANIM_OBJ_72,   6, 0,  13, 4, $28
-	anim_obj ANIM_OBJ_72,   6, 0,  13, 4, $30
-	anim_obj ANIM_OBJ_72,   6, 0,  13, 4, $38
-	anim_wait 64
-	anim_ret
-; ca909
-
-BattleAnim_Conversion2: ; ca909
-	anim_1gfx ANIM_GFX_EXPLOSION
-	anim_sound 63, 3, SFX_SHARPEN
-	anim_obj ANIM_OBJ_73, -16, 4,   5, 4, $0
-	anim_obj ANIM_OBJ_73, -16, 4,   5, 4, $8
-	anim_obj ANIM_OBJ_73, -16, 4,   5, 4, $10
-	anim_obj ANIM_OBJ_73, -16, 4,   5, 4, $18
-	anim_obj ANIM_OBJ_73, -16, 4,   5, 4, $20
-	anim_obj ANIM_OBJ_73, -16, 4,   5, 4, $28
-	anim_obj ANIM_OBJ_73, -16, 4,   5, 4, $30
-	anim_obj ANIM_OBJ_73, -16, 4,   5, 4, $38
-	anim_wait 128
-	anim_wait 48
-	anim_ret
-; ca939
-
-BattleAnim_Smokescreen: ; ca939
-	anim_3gfx ANIM_GFX_HAZE, ANIM_GFX_EGG, ANIM_GFX_SMOKE
-	anim_sound 6, 2, SFX_THROW_BALL
-	anim_obj ANIM_OBJ_75,   8, 0,  11, 4, $6c
-	anim_wait 24
-	anim_incobj  1
-	anim_sound 0, 1, SFX_BALL_POOF
-	anim_obj ANIM_OBJ_BALL_POOF,  13, 4,   8, 6, $10
-	anim_wait 8
-.loop
-	anim_sound 0, 1, SFX_MENU
-	anim_obj ANIM_OBJ_74, -16, 4,   7, 4, $20
-	anim_wait 8
-	anim_loop 5, .loop
-	anim_wait 128
-	anim_ret
-; ca960
-
-BattleAnim_Strength: ; ca960
-	anim_2gfx ANIM_GFX_ROCKS, ANIM_GFX_HIT
-	anim_bgeffect ANIM_BG_20, $10, $1, $20
-	anim_sound 0, 0, SFX_STRENGTH
-	anim_obj ANIM_OBJ_1F,   8, 0,  13, 0, $1
-	anim_wait 128
-	anim_incobj  1
-	anim_wait 20
-	anim_sound 0, 1, SFX_MEGA_PUNCH
-	anim_obj ANIM_OBJ_00, -16, 4,   5, 0, $0
-	anim_wait 16
-	anim_ret
-; ca97e
-
-BattleAnim_SwordsDance: ; ca97e
-	anim_1gfx ANIM_GFX_WHIP
-	anim_sound 0, 0, SFX_SWORDS_DANCE
-	anim_obj ANIM_OBJ_76,   6, 0,  13, 4, $0
-	anim_obj ANIM_OBJ_76,   6, 0,  13, 4, $d
-	anim_obj ANIM_OBJ_76,   6, 0,  13, 4, $1a
-	anim_obj ANIM_OBJ_76,   6, 0,  13, 4, $27
-	anim_obj ANIM_OBJ_76,   6, 0,  13, 4, $34
-	anim_wait 56
-	anim_ret
-; ca99e
-
-BattleAnim_QuickAttack: ; ca99e
-	anim_2gfx ANIM_GFX_SPEED, ANIM_GFX_HIT
-	anim_sound 0, 0, SFX_MENU
-	anim_bgeffect ANIM_BG_HIDE_MON, $0, $1, $0
-	anim_obj ANIM_OBJ_77,   3, 0,  11, 0, $2
-	anim_obj ANIM_OBJ_77,   4, 0,  11, 0, $1
-	anim_obj ANIM_OBJ_77,   5, 0,  11, 0, $0
-	anim_obj ANIM_OBJ_77,   6, 0,  11, 0, $80
-	anim_obj ANIM_OBJ_77,   7, 0,  11, 0, $81
-	anim_obj ANIM_OBJ_77,   8, 0,  11, 0, $82
-	anim_wait 12
-	anim_sound 0, 1, SFX_COMET_PUNCH
-	anim_obj ANIM_OBJ_01, -15, 0,   7, 0, $0
-	anim_wait 8
-	anim_bgeffect ANIM_BG_SHOW_MON, $0, $1, $0
-	anim_wait 16
-	anim_ret
-; ca9d8
-
-BattleAnim_Meditate: ; ca9d8
-	anim_1gfx ANIM_GFX_HIT
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_sound 0, 0, SFX_PSYBEAM
-	anim_bgeffect ANIM_BG_WAVE_DEFORM_USER, $0, $1, $0
-	anim_wait 48
-	anim_incbgeffect ANIM_BG_WAVE_DEFORM_USER
-	anim_wait 48
-	anim_call BattleAnim_ShowMon_0
-	anim_ret
-; ca9ed
-
-BattleAnim_Sharpen: ; ca9ed
-	anim_1gfx ANIM_GFX_SHAPES
-	anim_obp0 $e4
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_sound 0, 0, SFX_SHARPEN
-	anim_bgeffect ANIM_BG_18, $0, $1, $40
-	anim_obj ANIM_OBJ_78,   6, 0,  11, 0, $0
-	anim_wait 96
-	anim_incobj  2
-	anim_incbgeffect ANIM_BG_18
-	anim_call BattleAnim_ShowMon_0
-	anim_ret
-; caa0a
-
-BattleAnim_DefenseCurl: ; caa0a
-	anim_1gfx ANIM_GFX_SHAPES
-	anim_obp0 $e4
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_sound 0, 0, SFX_SHARPEN
-	anim_bgeffect ANIM_BG_18, $0, $1, $40
-	anim_obj ANIM_OBJ_79,   6, 0,  11, 0, $0
-	anim_wait 96
-	anim_incobj  2
-	anim_incbgeffect ANIM_BG_18
-	anim_call BattleAnim_ShowMon_0
-	anim_ret
-; caa27
-
-BattleAnim_SeismicToss: ; caa27
-	anim_2gfx ANIM_GFX_GLOBE, ANIM_GFX_HIT
-	anim_bgeffect ANIM_BG_20, $10, $1, $20
-	anim_sound 0, 0, SFX_STRENGTH
-	anim_obj ANIM_OBJ_20,   8, 0,  13, 0, $1
-	anim_wait 128
-	anim_incobj  1
-	anim_wait 20
-	anim_sound 0, 1, SFX_MEGA_PUNCH
-	anim_obj ANIM_OBJ_00, -16, 4,   5, 0, $0
-	anim_wait 16
-	anim_ret
-; caa45
-
-BattleAnim_Rage: ; caa45
-	anim_1gfx ANIM_GFX_HIT
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_bgeffect ANIM_BG_1A, $0, $1, $20
-	anim_sound 0, 0, SFX_RAGE
-	anim_wait 72
-	anim_incbgeffect ANIM_BG_1A
-	anim_call BattleAnim_ShowMon_0
-	anim_sound 0, 1, SFX_MOVE_PUZZLE_PIECE
-	anim_obj ANIM_OBJ_00,  15, 0,   9, 0, $0
-	anim_wait 6
-	anim_sound 0, 1, SFX_COMET_PUNCH
-	anim_obj ANIM_OBJ_00, -15, 0,   7, 0, $0
-	anim_wait 6
-	anim_sound 0, 1, SFX_MEGA_PUNCH
-	anim_obj ANIM_OBJ_00, -13, 0,   5, 0, $0
-	anim_wait 16
-	anim_ret
-; caa74
-
-BattleAnim_Agility: ; caa74
-	anim_1gfx ANIM_GFX_WIND
-	anim_obp0 $fc
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_bgeffect ANIM_BG_18, $0, $1, $40
-	anim_obj ANIM_OBJ_7D,   1, 0,   3, 0, $10
-	anim_obj ANIM_OBJ_7D,   1, 0,   6, 0, $2
-	anim_obj ANIM_OBJ_7D,   1, 0,  11, 0, $8
-	anim_wait 4
-	anim_obj ANIM_OBJ_7D,   1, 0,   4, 0, $6
-	anim_obj ANIM_OBJ_7D,   1, 0,   7, 0, $c
-	anim_obj ANIM_OBJ_7D,   1, 0,  10, 0, $4
-	anim_obj ANIM_OBJ_7D,   1, 0,  13, 0, $e
-.loop
-	anim_sound 0, 0, SFX_RAZOR_WIND
-	anim_wait 4
-	anim_loop 18, .loop
-	anim_incbgeffect ANIM_BG_18
-	anim_call BattleAnim_ShowMon_0
-	anim_ret
-; caab2
-
-BattleAnim_BoneClub: ; caab2
-	anim_2gfx ANIM_GFX_HIT, ANIM_GFX_MISC
-	anim_obj ANIM_OBJ_68,   8, 0,  11, 0, $2
-	anim_wait 32
-	anim_sound 0, 1, SFX_BONE_CLUB
-	anim_obj ANIM_OBJ_01, -15, 0,   7, 0, $0
-	anim_wait 16
-	anim_ret
-; caac5
-
-BattleAnim_Barrier: ; caac5
-	anim_1gfx ANIM_GFX_REFLECT
-	anim_enemyfeetobj
-	anim_bgeffect ANIM_BG_06, $0, $2, $0
-	anim_wait 8
-	anim_sound 0, 0, SFX_SHINE
-	anim_obj ANIM_OBJ_50,   9, 0,  10, 0, $0
-	anim_wait 32
-	anim_sound 0, 0, SFX_SHINE
-	anim_obj ANIM_OBJ_50,   9, 0,  10, 0, $0
-	anim_wait 32
-	anim_ret
-; caae1
-
-BattleAnim_Waterfall: ; caae1
-	anim_1gfx ANIM_GFX_HIT
-	anim_call BattleAnim_FollowPlayerHead_0
-	anim_bgeffect ANIM_BG_25, $0, $1, $0
-	anim_wait 16
-	anim_call BattleAnim_ShowMon_0
-	anim_sound 0, 1, SFX_LICK
-	anim_obj ANIM_OBJ_01, -15, 0,   7, 0, $0
-	anim_wait 3
-	anim_sound 0, 1, SFX_LICK
-	anim_obj ANIM_OBJ_01, -15, 0,   6, 0, $0
-	anim_wait 3
-	anim_sound 0, 1, SFX_LICK
-	anim_obj ANIM_OBJ_01, -15, 0,   5, 0, $0
-	anim_wait 3
-	anim_sound 0, 1, SFX_LICK
-	anim_obj ANIM_OBJ_01, -15, 0,   4, 0, $0
-	anim_wait 3
-	anim_sound 0, 1, SFX_LICK
-	anim_obj ANIM_OBJ_01, -15, 0,   3, 0, $0
-	anim_wait 8
-	anim_ret
-; cab1d
-
-BattleAnim_PsychicM: ; cab1d
-	anim_1gfx ANIM_GFX_PSYCHIC
-	anim_bgeffect ANIM_BG_ALTERNATE_HUES, $0, $2, $0
-	anim_bgeffect ANIM_BG_PSYCHIC, $0, $0, $0
-.loop
-	anim_sound 6, 2, SFX_PSYCHIC
-	anim_obj ANIM_OBJ_4C,   8, 0,  11, 0, $2
-	anim_wait 8
-	anim_loop 8, .loop
-	anim_wait 96
-	anim_incbgeffect ANIM_BG_PSYCHIC
-	anim_wait 4
-	anim_ret
-; cab3b
-
-BattleAnim_Sludge: ; cab3b
-	anim_1gfx ANIM_GFX_POISON
-	anim_call BattleAnim_Sludge_branch_cbc15
-	anim_wait 56
-	anim_ret
-; cab42
-
-BattleAnim_Toxic: ; cab42
-	anim_1gfx ANIM_GFX_POISON
-	anim_bgeffect ANIM_BG_BLACK_HUES, $0, $8, $0
-	anim_call BattleAnim_Toxic_branch_cbc35
-	anim_wait 32
-	anim_call BattleAnim_Toxic_branch_cbc15
-	anim_wait 64
-	anim_ret
-; cab52
-
-BattleAnim_Metronome: ; cab52
-	anim_2gfx ANIM_GFX_MISC, ANIM_GFX_SPEED
-	anim_sound 0, 0, SFX_METRONOME
-	anim_obj ANIM_OBJ_7A,   9, 0,  11, 0, $0
-.loop
-	anim_obj ANIM_OBJ_7B,   9, 0,  10, 0, $0
-	anim_wait 8
-	anim_loop 5, .loop
-	anim_wait 48
-	anim_ret
-; cab69
-
-BattleAnim_Counter: ; cab69
-	anim_1gfx ANIM_GFX_HIT
-.loop
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $6, $2
-	anim_sound 0, 1, SFX_POUND
-	anim_obj ANIM_OBJ_08,  15, 0,   9, 0, $0
-	anim_obj ANIM_OBJ_00,  15, 0,   9, 0, $0
-	anim_wait 6
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $6, $2
-	anim_sound 0, 1, SFX_COMET_PUNCH
-	anim_obj ANIM_OBJ_06, -15, 0,   5, 0, $0
-	anim_obj ANIM_OBJ_00, -15, 0,   5, 0, $0
-	anim_wait 6
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $6, $2
-	anim_sound 0, 1, SFX_MEGA_KICK
-	anim_obj ANIM_OBJ_07, -13, 0,   7, 0, $0
-	anim_obj ANIM_OBJ_00, -13, 0,   7, 0, $0
-	anim_wait 6
-	anim_loop 3, .loop
-	anim_wait 16
-	anim_ret
-; cabaa
-
-BattleAnim_LowKick: ; cabaa
-	anim_1gfx ANIM_GFX_HIT
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $4, $2
-	anim_sound 0, 1, SFX_DOUBLE_KICK
-	anim_obj ANIM_OBJ_07,  15, 4,   8, 0, $0
-	anim_obj ANIM_OBJ_00,  15, 4,   8, 0, $0
-	anim_wait 6
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $4, $2
-	anim_sound 0, 1, SFX_DOUBLE_KICK
-	anim_obj ANIM_OBJ_07, -16, 4,   8, 0, $0
-	anim_obj ANIM_OBJ_00, -16, 4,   8, 0, $0
-	anim_wait 6
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $4, $2
-	anim_sound 0, 1, SFX_DOUBLE_KICK
-	anim_obj ANIM_OBJ_07, -15, 4,   8, 0, $0
-	anim_obj ANIM_OBJ_00, -15, 4,   8, 0, $0
-	anim_wait 16
-	anim_ret
-; cabe6
-
-BattleAnim_WingAttack: ; cabe6
-	anim_1gfx ANIM_GFX_HIT
-	anim_sound 0, 1, SFX_WING_ATTACK
-	anim_obj ANIM_OBJ_01, -14, 4,   7, 0, $0
-	anim_obj ANIM_OBJ_01,  14, 4,   7, 0, $0
-	anim_wait 6
-	anim_sound 0, 1, SFX_WING_ATTACK
-	anim_obj ANIM_OBJ_01, -14, 0,   7, 0, $0
-	anim_obj ANIM_OBJ_01,  15, 0,   7, 0, $0
-	anim_wait 6
-	anim_sound 0, 1, SFX_WING_ATTACK
-	anim_obj ANIM_OBJ_01, -15, 4,   7, 0, $0
-	anim_obj ANIM_OBJ_01,  15, 4,   7, 0, $0
-	anim_wait 16
-	anim_ret
-; cac13
-
-BattleAnim_Slam: ; cac13
-	anim_1gfx ANIM_GFX_HIT
-	anim_sound 0, 1, SFX_WING_ATTACK
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $2
-	anim_obj ANIM_OBJ_01,  15, 4,   5, 0, $0
-	anim_wait 16
-	anim_ret
-; cac24
-
-BattleAnim_Disable: ; cac24
-	anim_2gfx ANIM_GFX_LIGHTNING, ANIM_GFX_STATUS
-	anim_bgeffect ANIM_BG_06, $0, $2, $0
-	anim_obj ANIM_OBJ_7C, -16, 4,   7, 0, $0
-	anim_wait 16
-	anim_sound 0, 1, SFX_BIND
-	anim_obj ANIM_OBJ_PARALYZED,  13, 0,   7, 0, $42
-	anim_obj ANIM_OBJ_PARALYZED, -12, 0,   7, 0, $c2
-	anim_wait 96
-	anim_ret
-; cac41
-
-BattleAnim_TailWhip: ; cac41
-	anim_1gfx ANIM_GFX_HIT
-	anim_call BattleAnim_FollowPlayerHead_0
-	anim_sound 0, 0, SFX_TAIL_WHIP
-	anim_bgeffect ANIM_BG_26, $0, $1, $0
-	anim_wait 32
-	anim_incbgeffect ANIM_BG_26
-	anim_call BattleAnim_ShowMon_0
-	anim_ret
-; cac55
-
-BattleAnim_Struggle: ; cac55
-	anim_1gfx ANIM_GFX_HIT
-	anim_sound 0, 1, SFX_POUND
-	anim_obj ANIM_OBJ_01, -15, 0,   7, 0, $0
-	anim_wait 16
-	anim_ret
-; cac61
-
-BattleAnim_Sketch: ; cac61
-	anim_1gfx ANIM_GFX_OBJECTS
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_bgeffect ANIM_BG_1A, $0, $1, $20
-	anim_sound 0, 0, SFX_SKETCH
-	anim_obj ANIM_OBJ_98,   9, 0,  10, 0, $0
-	anim_wait 80
-	anim_incbgeffect ANIM_BG_1A
-	anim_call BattleAnim_ShowMon_0
-	anim_wait 1
-	anim_ret
-; cac7b
-
-BattleAnim_TripleKick: ; cac7b
-	anim_1gfx ANIM_GFX_HIT
-	anim_if_param_equal $1, BattleAnim_TripleKick_branch_cac95
-	anim_if_param_equal $2, BattleAnim_TripleKick_branch_caca5
-	anim_sound 0, 1, SFX_MEGA_KICK
-	anim_obj ANIM_OBJ_07, -14, 0,   6, 0, $0
-	anim_wait 6
-	anim_obj ANIM_OBJ_01, -14, 0,   6, 0, $0
-	anim_wait 8
-	anim_ret
-; cac95
-
-BattleAnim_TripleKick_branch_cac95: ; cac95
-	anim_sound 0, 1, SFX_DOUBLE_KICK
-	anim_obj ANIM_OBJ_07,  15, 0,   8, 0, $0
-	anim_wait 6
-	anim_obj ANIM_OBJ_01,  15, 0,   8, 0, $0
-	anim_wait 8
-	anim_ret
-; caca5
-
-BattleAnim_TripleKick_branch_caca5: ; caca5
-	anim_sound 0, 1, SFX_DOUBLE_KICK
-	anim_obj ANIM_OBJ_07, -16, 4,   4, 0, $0
-	anim_wait 6
-	anim_obj ANIM_OBJ_01, -16, 4,   4, 0, $0
-	anim_wait 8
-	anim_ret
-; cacb5
-
-BattleAnim_Thief: ; cacb5
-	anim_1gfx ANIM_GFX_HIT
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_bgeffect ANIM_BG_TACKLE, $0, $1, $0
-	anim_wait 16
-	anim_sound 0, 1, SFX_THIEF
-	anim_obj ANIM_OBJ_01,  16, 0,   6, 0, $0
-	anim_wait 16
-	anim_call BattleAnim_ShowMon_0
-	anim_wait 1
-	anim_1gfx ANIM_GFX_STATUS
-	anim_sound 0, 1, SFX_THIEF_2
-	anim_obj ANIM_OBJ_8B,  15, 0,   9, 4, $1
-	anim_wait 64
-	anim_ret
-; cacd9
-
-BattleAnim_SpiderWeb: ; cacd9
-	anim_1gfx ANIM_GFX_WEB
-	anim_bgeffect ANIM_BG_07, $0, $2, $0
-	anim_obj ANIM_OBJ_92, -16, 4,   6, 0, $0
-	anim_sound 6, 2, SFX_SPIDER_WEB
-	anim_obj ANIM_OBJ_5A,   8, 0,  10, 0, $0
-	anim_wait 4
-	anim_obj ANIM_OBJ_5A,   8, 0,  11, 0, $0
-	anim_wait 4
-	anim_obj ANIM_OBJ_5A,   8, 0,  10, 4, $0
-	anim_wait 64
-	anim_ret
-; cacfb
-
-BattleAnim_MindReader: ; cacfb
-	anim_1gfx ANIM_GFX_MISC
-	anim_sound 0, 1, SFX_MIND_READER
-.loop
-	anim_obj ANIM_OBJ_88, -16, 4,   6, 0, $3
-	anim_obj ANIM_OBJ_88, -16, 4,   6, 0, $12
-	anim_obj ANIM_OBJ_88, -16, 4,   6, 0, $20
-	anim_obj ANIM_OBJ_88, -16, 4,   6, 0, $31
-	anim_wait 16
-	anim_loop 2, .loop
-	anim_wait 32
-	anim_ret
-; cad1b
-
-BattleAnim_Nightmare: ; cad1b
-	anim_1gfx ANIM_GFX_ANGELS
-	anim_bgp $1b
-	anim_obp0 $f
-	anim_obj ANIM_OBJ_94, -16, 4,   5, 0, $0
-	anim_obj ANIM_OBJ_94, -16, 4,   5, 0, $a0
-	anim_sound 0, 1, SFX_NIGHTMARE
-	anim_wait 96
-	anim_ret
-; cad30
-
-BattleAnim_FlameWheel: ; cad30
-	anim_1gfx ANIM_GFX_FIRE
-.loop
-	anim_sound 0, 0, SFX_EMBER
-	anim_obj ANIM_OBJ_7F,   6, 0,  12, 0, $0
-	anim_wait 6
-	anim_loop 8, .loop
-	anim_wait 96
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_bgeffect ANIM_BG_TACKLE, $0, $1, $0
-	anim_wait 4
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $4, $3
-	anim_sound 0, 1, SFX_EMBER
-	anim_obj ANIM_OBJ_0F, -15, 0,   6, 0, $1
-	anim_obj ANIM_OBJ_0F, -15, 0,   6, 0, $4
-	anim_obj ANIM_OBJ_0F, -15, 0,   6, 0, $5
-	anim_wait 8
-	anim_bgeffect ANIM_BG_SHOW_MON, $0, $0, $0
-	anim_wait 4
-	anim_incobj  9
-	anim_wait 8
-	anim_ret
-; cad6b
-
-BattleAnim_Snore: ; cad6b
-	anim_2gfx ANIM_GFX_STATUS, ANIM_GFX_NOISE
-	anim_obj ANIM_OBJ_54,   8, 0,  10, 0, $0
-	anim_wait 32
-	anim_bgeffect ANIM_BG_1F, $60, $2, $0
-	anim_sound 0, 0, SFX_SNORE
-.loop
-	anim_call BattleAnim_Snore_branch_cbbbc
-	anim_wait 16
-	anim_loop 2, .loop
-	anim_wait 8
-	anim_ret
-; cad86
-
-BattleAnim_Curse: ; cad86
-	anim_if_param_equal $1, .NotGhost
-	anim_2gfx ANIM_GFX_HIT, ANIM_GFX_OBJECTS
-	anim_obj ANIM_OBJ_A5,   8, 4,   9, 0, $0
-	anim_sound 0, 0, SFX_CURSE
-	anim_wait 32
-	anim_incobj  1
-	anim_wait 12
-	anim_sound 0, 0, SFX_POISON_STING
-	anim_obj ANIM_OBJ_04,   5, 4,  12, 0, $0
-	anim_wait 16
-	anim_ret
-; cada3
-
-.NotGhost: ; cada3
-	anim_1gfx ANIM_GFX_SPEED
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_bgeffect ANIM_BG_19, $0, $1, $40
-	anim_sound 0, 0, SFX_SHARPEN
-	anim_wait 64
-	anim_incbgeffect ANIM_BG_19
-	anim_wait 1
-	anim_bgeffect ANIM_BG_16, $0, $1, $40
-.loop
-	anim_sound 0, 0, SFX_SWORDS_DANCE
-	anim_obj ANIM_OBJ_47,   5, 4,  13, 4, $6
-	anim_wait 2
-	anim_obj ANIM_OBJ_47,   4, 4,  13, 4, $6
-	anim_wait 2
-	anim_obj ANIM_OBJ_47,   6, 4,  13, 4, $8
-	anim_wait 2
-	anim_obj ANIM_OBJ_47,   3, 4,  13, 4, $8
-	anim_wait 2
-	anim_obj ANIM_OBJ_47,   7, 4,  13, 4, $6
-	anim_wait 2
-	anim_obj ANIM_OBJ_47,   2, 4,  13, 4, $8
-	anim_wait 2
-	anim_obj ANIM_OBJ_47,   8, 4,  13, 4, $8
-	anim_wait 2
-	anim_loop 3, .loop
-	anim_wait 8
-	anim_incbgeffect ANIM_BG_16
-	anim_call BattleAnim_ShowMon_0
-	anim_ret
-; cadf1
-
-BattleAnim_Flail: ; cadf1
-	anim_1gfx ANIM_GFX_HIT
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_sound 0, 0, SFX_SUBMISSION
-	anim_bgeffect ANIM_BG_2C, $0, $1, $0
-	anim_wait 8
-	anim_obj ANIM_OBJ_01,  15, 0,   6, 0, $0
-	anim_wait 8
-	anim_obj ANIM_OBJ_01, -13, 0,   6, 0, $0
-	anim_wait 8
-	anim_obj ANIM_OBJ_01, -15, 0,   6, 0, $0
-	anim_wait 8
-	anim_incbgeffect ANIM_BG_2C
-	anim_call BattleAnim_ShowMon_0
-	anim_ret
-; cae17
-
-BattleAnim_Conversion: ; cae17
-	anim_1gfx ANIM_GFX_EXPLOSION
-	anim_bgeffect ANIM_BG_ALTERNATE_HUES, $0, $2, $0
-	anim_sound 63, 3, SFX_SHARPEN
-	anim_obj ANIM_OBJ_91,   6, 0,  11, 0, $0
-	anim_obj ANIM_OBJ_91,   6, 0,  11, 0, $8
-	anim_obj ANIM_OBJ_91,   6, 0,  11, 0, $10
-	anim_obj ANIM_OBJ_91,   6, 0,  11, 0, $18
-	anim_obj ANIM_OBJ_91,   6, 0,  11, 0, $20
-	anim_obj ANIM_OBJ_91,   6, 0,  11, 0, $28
-	anim_obj ANIM_OBJ_91,   6, 0,  11, 0, $30
-	anim_obj ANIM_OBJ_91,   6, 0,  11, 0, $38
-	anim_wait 128
-	anim_ret
-; cae4b
-
-BattleAnim_Aeroblast: ; cae4b
-	anim_2gfx ANIM_GFX_BEAM, ANIM_GFX_AEROBLAST
-	anim_bgp $1b
-	anim_bgeffect ANIM_BG_1F, $50, $4, $10
-	anim_bgeffect ANIM_BG_06, $0, $2, $0
-	anim_sound 0, 0, SFX_AEROBLAST
-	anim_obj ANIM_OBJ_B3,   9, 0,  11, 0, $0
-	anim_wait 32
-	anim_sound 0, 0, SFX_HYPER_BEAM
-	anim_obj ANIM_OBJ_27,  10, 0,  10, 4, $0
-	anim_wait 2
-	anim_sound 0, 1, SFX_HYPER_BEAM
-	anim_obj ANIM_OBJ_27,  12, 0,   9, 4, $0
-	anim_wait 2
-	anim_sound 0, 1, SFX_HYPER_BEAM
-	anim_obj ANIM_OBJ_27,  14, 0,   8, 4, $0
-	anim_obj ANIM_OBJ_28,  15, 6,   7, 6, $0
-	anim_wait 48
-	anim_ret
-; cae84
-
-BattleAnim_CottonSpore: ; cae84
-	anim_obp0 $54
-	anim_1gfx ANIM_GFX_MISC
-	anim_sound 0, 1, SFX_POWDER
-.loop ; cae8b
-	anim_obj ANIM_OBJ_COTTON_SPORE, -16, 4,   4, 0, $0
-	anim_wait 8
-	anim_loop 5, .loop
-	anim_wait 96
-	anim_ret
-; cae97
-
-BattleAnim_Reversal: ; cae97
-	anim_2gfx ANIM_GFX_SHINE, ANIM_GFX_HIT
-	anim_bgeffect ANIM_BG_07, $0, $0, $0
-	anim_sound 0, 1, SFX_MEGA_PUNCH
-	anim_obj ANIM_OBJ_04,  14, 0,   8, 0, $0
-	anim_wait 2
-	anim_sound 0, 1, SFX_SHINE
-	anim_obj ANIM_OBJ_A7,  15, 0,   7, 0, $0
-	anim_wait 2
-	anim_sound 0, 1, SFX_MEGA_PUNCH
-	anim_obj ANIM_OBJ_04,  16, 0,   7, 0, $0
-	anim_wait 2
-	anim_sound 0, 1, SFX_SHINE
-	anim_obj ANIM_OBJ_A7, -15, 0,   6, 0, $0
-	anim_wait 2
-	anim_sound 0, 1, SFX_MEGA_PUNCH
-	anim_obj ANIM_OBJ_04, -14, 0,   6, 0, $0
-	anim_wait 2
-	anim_sound 0, 1, SFX_SHINE
-	anim_obj ANIM_OBJ_A7, -13, 0,   5, 0, $0
-	anim_wait 24
-	anim_ret
-; caed6
-
-BattleAnim_Spite: ; caed6
-	anim_1gfx ANIM_GFX_ANGELS
-	anim_obj ANIM_OBJ_A4, -16, 4,   2, 0, $0
-	anim_sound 0, 1, SFX_SPITE
-	anim_wait 96
-	anim_ret
-; caee2
-
-BattleAnim_PowderSnow: ; caee2
-	anim_1gfx ANIM_GFX_ICE
-.loop ; caee4
-	anim_sound 6, 2, SFX_SHINE
-	anim_obj ANIM_OBJ_8F,   8, 0,  11, 0, $23
-	anim_wait 2
-	anim_sound 6, 2, SFX_SHINE
-	anim_obj ANIM_OBJ_8F,   8, 0,  10, 0, $24
-	anim_wait 2
-	anim_sound 6, 2, SFX_SHINE
-	anim_obj ANIM_OBJ_8F,   8, 0,  12, 0, $23
-	anim_wait 2
-	anim_loop 2, .loop
-	anim_bgeffect ANIM_BG_WHITE_HUES, $0, $8, $0
-	anim_wait 40
-	anim_call BattleAnim_PowderSnow_branch_cbbdf
-	anim_wait 32
-	anim_ret
-; caf0e
-
-BattleAnim_Protect: ; caf0e
-	anim_1gfx ANIM_GFX_OBJECTS
-	anim_bgeffect ANIM_BG_07, $0, $2, $0
-	anim_obj ANIM_OBJ_8A,  10, 0,  10, 0, $0
-	anim_obj ANIM_OBJ_8A,  10, 0,  10, 0, $d
-	anim_obj ANIM_OBJ_8A,  10, 0,  10, 0, $1a
-	anim_obj ANIM_OBJ_8A,  10, 0,  10, 0, $27
-	anim_obj ANIM_OBJ_8A,  10, 0,  10, 0, $34
-	anim_sound 0, 0, SFX_PROTECT
-	anim_wait 96
-	anim_ret
-; caf33
-
-BattleAnim_MachPunch: ; caf33
-	anim_2gfx ANIM_GFX_SPEED, ANIM_GFX_HIT
-	anim_bgeffect ANIM_BG_HIDE_MON, $0, $1, $0
-	anim_sound 0, 0, SFX_MENU
-	anim_obj ANIM_OBJ_77,   3, 0,  11, 0, $2
-	anim_obj ANIM_OBJ_77,   4, 0,  11, 0, $1
-	anim_obj ANIM_OBJ_77,   5, 0,  11, 0, $0
-	anim_obj ANIM_OBJ_77,   6, 0,  11, 0, $80
-	anim_obj ANIM_OBJ_77,   7, 0,  11, 0, $81
-	anim_obj ANIM_OBJ_77,   8, 0,  11, 0, $82
-	anim_wait 12
-	anim_sound 0, 1, SFX_MEGA_PUNCH
-	anim_obj ANIM_OBJ_06, -15, 0,   7, 0, $0
-	anim_wait 6
-	anim_obj ANIM_OBJ_01, -15, 0,   7, 0, $0
-	anim_wait 8
-	anim_bgeffect ANIM_BG_SHOW_MON, $0, $1, $0
-	anim_wait 16
-	anim_ret
-; caf73
-
-BattleAnim_ScaryFace: ; caf73
-	anim_1gfx ANIM_GFX_BEAM
-	anim_bgeffect ANIM_BG_ALTERNATE_HUES, $0, $2, $0
-	anim_bgeffect ANIM_BG_06, $0, $2, $0
-	anim_call BattleAnim_ScaryFace_branch_cbadc
-	anim_wait 64
-	anim_ret
-; caf84
-
-BattleAnim_FaintAttack: ; caf84
-	anim_1gfx ANIM_GFX_HIT
-	anim_sound 0, 0, SFX_CURSE
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_bgeffect ANIM_BG_1D, $0, $1, $80
-	anim_wait 96
-	anim_sound 0, 1, SFX_COMET_PUNCH
-	anim_obj ANIM_OBJ_04,  15, 0,   4, 0, $0
-	anim_wait 8
-	anim_sound 0, 1, SFX_COMET_PUNCH
-	anim_obj ANIM_OBJ_04, -13, 0,   5, 0, $0
-	anim_wait 8
-	anim_sound 0, 1, SFX_COMET_PUNCH
-	anim_obj ANIM_OBJ_04, -15, 0,   6, 0, $0
-	anim_wait 32
-	anim_incbgeffect ANIM_BG_1D
-	anim_call BattleAnim_ShowMon_0
-	anim_wait 4
-	anim_ret
-; cafb4
-
-BattleAnim_SweetKiss: ; cafb4
-	anim_2gfx ANIM_GFX_OBJECTS, ANIM_GFX_ANGELS
-	anim_bgeffect ANIM_BG_07, $0, $2, $0
-	anim_obj ANIM_OBJ_97,  12, 0,   5, 0, $0
-	anim_sound 0, 1, SFX_SWEET_KISS
-	anim_wait 32
-	anim_sound 0, 1, SFX_SWEET_KISS_2
-	anim_obj ANIM_OBJ_HEART,  15, 0,   5, 0, $0
-	anim_wait 40
-	anim_ret
-; cafcf
-
-BattleAnim_BellyDrum: ; cafcf
-	anim_2gfx ANIM_GFX_HIT, ANIM_GFX_NOISE
-	anim_sound 0, 0, SFX_BELLY_DRUM
-	anim_obj ANIM_OBJ_AA,   8, 0,  13, 0, $0
-	anim_obj ANIM_OBJ_AB,   8, 0,  11, 4, $f8
-	anim_wait 24
-	anim_sound 0, 0, SFX_BELLY_DRUM
-	anim_obj ANIM_OBJ_AA,   8, 0,  13, 0, $0
-	anim_obj ANIM_OBJ_AB,   8, 0,  11, 4, $f8
-	anim_wait 24
-	anim_sound 0, 0, SFX_BELLY_DRUM
-	anim_obj ANIM_OBJ_AA,   8, 0,  13, 0, $0
-	anim_obj ANIM_OBJ_AB,   8, 0,  11, 4, $f8
-	anim_wait 12
-	anim_sound 0, 0, SFX_BELLY_DRUM
-	anim_obj ANIM_OBJ_AA,   8, 0,  13, 0, $0
-	anim_obj ANIM_OBJ_AB,   8, 0,  11, 4, $f8
-	anim_wait 12
-	anim_sound 0, 0, SFX_BELLY_DRUM
-	anim_obj ANIM_OBJ_AA,   8, 0,  13, 0, $0
-	anim_obj ANIM_OBJ_AB,   8, 0,  11, 4, $f8
-	anim_wait 24
-	anim_sound 0, 0, SFX_BELLY_DRUM
-	anim_obj ANIM_OBJ_AA,   8, 0,  13, 0, $0
-	anim_obj ANIM_OBJ_AB,   8, 0,  11, 4, $f8
-	anim_wait 12
-	anim_sound 0, 0, SFX_BELLY_DRUM
-	anim_obj ANIM_OBJ_AA,   8, 0,  13, 0, $0
-	anim_obj ANIM_OBJ_AB,   8, 0,  11, 4, $f8
-	anim_wait 12
-	anim_sound 0, 0, SFX_BELLY_DRUM
-	anim_obj ANIM_OBJ_AA,   8, 0,  13, 0, $0
-	anim_obj ANIM_OBJ_AB,   8, 0,  11, 4, $f8
-	anim_wait 12
-	anim_sound 0, 0, SFX_BELLY_DRUM
-	anim_obj ANIM_OBJ_AA,   8, 0,  13, 0, $0
-	anim_obj ANIM_OBJ_AB,   8, 0,  11, 4, $f8
-	anim_wait 12
-	anim_ret
-; cb051
-
-BattleAnim_SludgeBomb: ; cb051
-	anim_2gfx ANIM_GFX_EGG, ANIM_GFX_POISON
-	anim_bgeffect ANIM_BG_BLACK_HUES, $0, $8, $0
-	anim_sound 6, 2, SFX_SLUDGE_BOMB
-	anim_obj ANIM_OBJ_62,   8, 0,  11, 4, $10
-	anim_wait 36
-	anim_call BattleAnim_SludgeBomb_branch_cbc15
-	anim_wait 64
-	anim_ret
-; cb067
-
-BattleAnim_MudSlap: ; cb067
-	anim_1gfx ANIM_GFX_SAND
-	anim_obp0 $fc
-	anim_call BattleAnim_MudSlap_branch_cbc5b
-	anim_ret
-; cb06f
-
-BattleAnim_Octazooka: ; cb06f
-	anim_3gfx ANIM_GFX_HAZE, ANIM_GFX_EGG, ANIM_GFX_SMOKE
-	anim_sound 6, 2, SFX_SLUDGE_BOMB
-	anim_obj ANIM_OBJ_8C,   8, 0,  11, 4, $4
-	anim_wait 16
-	anim_obj ANIM_OBJ_BALL_POOF, -16, 4,   7, 0, $10
-	anim_wait 8
-	anim_if_param_equal $0, .done
-.loop
-	anim_obj ANIM_OBJ_74, -16, 4,   7, 4, $20
-	anim_wait 8
-	anim_loop 5, .loop
-	anim_wait 128
-.done
-	anim_ret
-; cb092
-
-BattleAnim_Spikes: ; cb092
-	anim_1gfx ANIM_GFX_MISC
-	anim_sound 6, 2, SFX_MENU
-	anim_obj ANIM_OBJ_SPIKES,   6, 0,  11, 0, $20
-	anim_wait 8
-	anim_sound 6, 2, SFX_MENU
-	anim_obj ANIM_OBJ_SPIKES,   6, 0,  11, 0, $30
-	anim_wait 8
-	anim_sound 6, 2, SFX_MENU
-	anim_obj ANIM_OBJ_SPIKES,   6, 0,  11, 0, $28
-	anim_wait 64
-	anim_ret
-; cb0b0
-
-BattleAnim_ZapCannon: ; cb0b0
-	anim_2gfx ANIM_GFX_LIGHTNING, ANIM_GFX_EXPLOSION
-	anim_bgp $1b
-	anim_obp0 $30
-	anim_sound 6, 2, SFX_ZAP_CANNON
-	anim_obj ANIM_OBJ_A3,   8, 0,  11, 4, $2
-	anim_wait 40
-	anim_sound 0, 1, SFX_THUNDERSHOCK
-	anim_obj ANIM_OBJ_LIGHTNING_BOLT, -15, 0,   7, 0, $2
-	anim_wait 16
-	anim_obj ANIM_OBJ_31, -15, 0,   7, 0, $0
-	anim_wait 128
-	anim_ret
-; cb0d0
-
-BattleAnim_Foresight: ; cb0d0
-	anim_1gfx ANIM_GFX_SHINE
-	anim_call BattleAnim_FollowEnemyFeet_1
-	anim_bgeffect ANIM_BG_07, $0, $0, $0
-	anim_sound 0, 1, SFX_FORESIGHT
-	anim_obj ANIM_OBJ_A7, -16, 4,   5, 0, $0
-	anim_wait 24
-	anim_bgeffect ANIM_BG_19, $0, $0, $40
-	anim_wait 64
-	anim_incbgeffect ANIM_BG_19
-	anim_call BattleAnim_ShowMon_1
-	anim_wait 8
-	anim_ret
-; cb0f0
-
-BattleAnim_DestinyBond: ; cb0f0
-	anim_1gfx ANIM_GFX_ANGELS
-	anim_bgp $1b
-	anim_obp0 $0
-	anim_if_param_equal $1, BattleAnim_DestinyBond_branch_cb104
-	anim_sound 6, 2, SFX_WHIRLWIND
-	anim_obj ANIM_OBJ_9B,   5, 4,  15, 0, $2
-	anim_wait 128
-	anim_ret
-; cb104
-
-BattleAnim_DestinyBond_branch_cb104: ; cb104
-	anim_obj ANIM_OBJ_9B, -16, 4,   9, 4, $0
-	anim_sound 0, 1, SFX_KINESIS
-	anim_bgeffect ANIM_BG_RETURN_MON, $0, $0, $0
-	anim_wait 32
-	anim_ret
-; cb113
-
-BattleAnim_PerishSong: ; cb113
-	anim_1gfx ANIM_GFX_NOISE
-	anim_bgeffect ANIM_BG_06, $0, $2, $0
-	anim_bgeffect ANIM_BG_ALTERNATE_HUES, $0, $2, $0
-	anim_sound 0, 2, SFX_PERISH_SONG
-	anim_obj ANIM_OBJ_PERISH_SONG,  11, 0,   0, 0, $0
-	anim_obj ANIM_OBJ_PERISH_SONG,  11, 0,   0, 0, $8
-	anim_obj ANIM_OBJ_PERISH_SONG,  11, 0,   0, 0, $10
-	anim_obj ANIM_OBJ_PERISH_SONG,  11, 0,   0, 0, $18
-	anim_obj ANIM_OBJ_PERISH_SONG,  11, 0,   0, 0, $20
-	anim_obj ANIM_OBJ_PERISH_SONG,  11, 0,   0, 0, $28
-	anim_obj ANIM_OBJ_PERISH_SONG,  11, 0,   0, 0, $30
-	anim_obj ANIM_OBJ_PERISH_SONG,  11, 0,   0, 0, $38
-	anim_wait 112
-	anim_ret
-; cb14c
-
-BattleAnim_IcyWind: ; cb14c
-	anim_1gfx ANIM_GFX_SPEED
-	anim_bgeffect ANIM_BG_06, $0, $2, $0
-	anim_bgeffect ANIM_BG_ALTERNATE_HUES, $0, $2, $0
-	anim_playerheadobj
-	anim_sound 0, 0, SFX_PSYCHIC
-.loop
-	anim_wait 8
-	anim_obj ANIM_OBJ_AE,   8, 0,  11, 0, $4
-	anim_wait 8
-	anim_obj ANIM_OBJ_AE,   8, 0,  10, 0, $4
-	anim_wait 8
-	anim_obj ANIM_OBJ_AE,   8, 0,  12, 0, $4
-	anim_wait 8
-	anim_loop 2, .loop
-	anim_wait 16
-	anim_bgeffect ANIM_BG_HEAD_FOLLOW, $0, $1, $0
-	anim_wait 6
-	anim_bgeffect ANIM_BG_NIGHT_SHADE, $0, $0, $8
-	anim_wait 64
-	anim_incbgeffect ANIM_BG_NIGHT_SHADE
-	anim_bgeffect ANIM_BG_SHOW_MON, $0, $1, $0
-	anim_wait 4
-	anim_incobj  7
-	anim_wait 1
-	anim_ret
-; cb18c
-
-BattleAnim_Detect: ; cb18c
-	anim_1gfx ANIM_GFX_SHINE
-	anim_bgeffect ANIM_BG_07, $0, $0, $0
-	anim_sound 0, 0, SFX_FORESIGHT
-	anim_obj ANIM_OBJ_A7,   8, 0,  11, 0, $0
-	anim_wait 24
-	anim_ret
-; cb19d
-
-BattleAnim_BoneRush: ; cb19d
-	anim_2gfx ANIM_GFX_HIT, ANIM_GFX_MISC
-	anim_sound 0, 1, SFX_BONE_CLUB
-	anim_obj ANIM_OBJ_69, -16, 4,   7, 0, $2
-	anim_wait 16
-	anim_sound 0, 1, SFX_COMET_PUNCH
-	anim_obj ANIM_OBJ_01,  15, 0,   6, 0, $0
-	anim_wait 16
-	anim_sound 0, 1, SFX_COMET_PUNCH
-	anim_obj ANIM_OBJ_01, -14, 0,   8, 0, $0
-	anim_wait 16
-	anim_ret
-; cb1bc
-
-BattleAnim_LockOn: ; cb1bc
-	anim_1gfx ANIM_GFX_MISC
-	anim_sound 0, 1, SFX_MIND_READER
-.loop
-	anim_obj ANIM_OBJ_87, -16, 4,   6, 0, $3
-	anim_obj ANIM_OBJ_87, -16, 4,   6, 0, $12
-	anim_obj ANIM_OBJ_87, -16, 4,   6, 0, $20
-	anim_obj ANIM_OBJ_87, -16, 4,   6, 0, $31
-	anim_wait 16
-	anim_loop 2, .loop
-	anim_wait 32
-	anim_ret
-; cb1dc
-
-BattleAnim_Outrage: ; cb1dc
-	anim_1gfx ANIM_GFX_HIT
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_bgeffect ANIM_BG_1A, $0, $1, $20
-	anim_sound 0, 0, SFX_OUTRAGE
-	anim_wait 72
-	anim_incbgeffect ANIM_BG_1A
-	anim_call BattleAnim_ShowMon_0
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $4, $3
-	anim_sound 0, 1, SFX_MOVE_PUZZLE_PIECE
-	anim_obj ANIM_OBJ_00,  15, 0,   9, 0, $0
-	anim_wait 6
-	anim_sound 0, 1, SFX_COMET_PUNCH
-	anim_obj ANIM_OBJ_00, -15, 0,   7, 0, $0
-	anim_wait 6
-	anim_sound 0, 1, SFX_MEGA_PUNCH
-	anim_obj ANIM_OBJ_00, -13, 0,   5, 0, $0
-	anim_wait 16
-	anim_ret
-; cb210
-
-BattleAnim_Sandstorm: ; cb210
-	anim_1gfx ANIM_GFX_POWDER
-	anim_obj ANIM_OBJ_A2,  11, 0,   0, 0, $0
-	anim_wait 8
-	anim_obj ANIM_OBJ_A2,   9, 0,   0, 0, $1
-	anim_wait 8
-	anim_obj ANIM_OBJ_A2,   7, 0,   0, 0, $2
-.loop
-	anim_sound 0, 1, SFX_MENU
-	anim_wait 8
-	anim_loop 16, .loop
-	anim_wait 8
-	anim_ret
-; cb22d
-
-BattleAnim_GigaDrain: ; cb22d
-	anim_2gfx ANIM_GFX_BUBBLE, ANIM_GFX_CHARGE
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_bgeffect ANIM_BG_1C, $0, $0, $10
-	anim_sound 6, 3, SFX_GIGA_DRAIN
-	anim_call BattleAnim_GigaDrain_branch_cbab3
-	anim_wait 48
-	anim_wait 128
-	anim_incbgeffect ANIM_BG_1C
-	anim_call BattleAnim_ShowMon_0
-	anim_wait 1
-	anim_1gfx ANIM_GFX_SHINE
-	anim_bgeffect ANIM_BG_07, $0, $0, $0
-.loop
-	anim_sound 0, 0, SFX_METRONOME
-	anim_obj ANIM_OBJ_9D,   3, 0,   8, 0, $0
-	anim_wait 5
-	anim_obj ANIM_OBJ_9D,   7, 0,  13, 0, $0
-	anim_wait 5
-	anim_obj ANIM_OBJ_9D,   3, 0,  13, 0, $0
-	anim_wait 5
-	anim_obj ANIM_OBJ_9D,   7, 0,   8, 0, $0
-	anim_wait 5
-	anim_obj ANIM_OBJ_9D,   5, 0,  10, 4, $0
-	anim_wait 5
-	anim_loop 2, .loop
-	anim_wait 32
-	anim_ret
-; cb274
-
-BattleAnim_Endure: ; cb274
-	anim_1gfx ANIM_GFX_SPEED
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_bgeffect ANIM_BG_1A, $0, $1, $20
-	anim_bgeffect ANIM_BG_07, $0, $2, $0
-.loop
-	anim_sound 0, 0, SFX_SWORDS_DANCE
-	anim_obj ANIM_OBJ_47,   5, 4,  13, 4, $6
-	anim_wait 2
-	anim_obj ANIM_OBJ_47,   4, 4,  13, 4, $6
-	anim_wait 2
-	anim_obj ANIM_OBJ_47,   6, 4,  13, 4, $8
-	anim_wait 2
-	anim_obj ANIM_OBJ_47,   3, 4,  13, 4, $8
-	anim_wait 2
-	anim_obj ANIM_OBJ_47,   7, 4,  13, 4, $6
-	anim_wait 2
-	anim_obj ANIM_OBJ_47,   2, 4,  13, 4, $8
-	anim_wait 2
-	anim_obj ANIM_OBJ_47,   8, 4,  13, 4, $8
-	anim_wait 2
-	anim_loop 5, .loop
-	anim_wait 8
-	anim_incbgeffect ANIM_BG_1A
-	anim_call BattleAnim_ShowMon_0
-	anim_ret
-; cb2bb
-
-BattleAnim_Charm: ; cb2bb
-	anim_1gfx ANIM_GFX_OBJECTS
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_bgeffect ANIM_BG_26, $0, $1, $0
-	anim_sound 0, 0, SFX_ATTRACT
-	anim_obj ANIM_OBJ_HEART,   8, 0,  10, 0, $0
-	anim_wait 32
-	anim_incbgeffect ANIM_BG_26
-	anim_call BattleAnim_ShowMon_0
-	anim_wait 4
-	anim_ret
-; cb2d5
-
-BattleAnim_Rollout: ; cb2d5
-	anim_1gfx ANIM_GFX_HIT
-	anim_sound 0, 0, SFX_SPARK
-	anim_call BattleAnim_FollowPlayerHead_0
-	anim_bgeffect ANIM_BG_2E, $60, $1, $1
-	anim_bgeffect ANIM_BG_25, $0, $1, $0
-	anim_wait 4
-	anim_sound 0, 1, SFX_MEGA_PUNCH
-	anim_obj ANIM_OBJ_03, -15, 0,   5, 0, $0
-	anim_wait 8
-	anim_call BattleAnim_ShowMon_0
-	anim_ret
-; cb2f5
-
-BattleAnim_FalseSwipe: ; cb2f5
-	anim_2gfx ANIM_GFX_SHINE, ANIM_GFX_CUT
-	anim_bgeffect ANIM_BG_07, $0, $0, $0
-	anim_sound 0, 1, SFX_CUT
-	anim_obj ANIM_OBJ_3A, -13, 0,   5, 0, $0
-	anim_wait 4
-	anim_obj ANIM_OBJ_9D, -15, 0,   5, 0, $0
-	anim_wait 32
-	anim_ret
-; cb30d
-
-BattleAnim_Swagger: ; cb30d
-	anim_2gfx ANIM_GFX_MISC, ANIM_GFX_WIND
-.loop
-	anim_sound 0, 0, SFX_MENU
-	anim_obj ANIM_OBJ_A9,   9, 0,  11, 0, $44
-	anim_wait 32
-	anim_loop 2, .loop
-	anim_wait 32
-	anim_sound 0, 1, SFX_KINESIS_2
-	anim_obj ANIM_OBJ_83,  13, 0,   5, 0, $0
-	anim_wait 40
-	anim_ret
-; cb328
-
-BattleAnim_MilkDrink: ; cb328
-	anim_2gfx ANIM_GFX_MISC, ANIM_GFX_BUBBLE
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_obj ANIM_OBJ_82,   9, 2,  13, 0, $0
-	anim_wait 16
-	anim_bgeffect ANIM_BG_18, $0, $1, $40
-	anim_sound 0, 0, SFX_MILK_DRINK
-.loop
-	anim_obj ANIM_OBJ_2C,   5, 4,  11, 0, $20
-	anim_wait 8
-	anim_loop 8, .loop
-	anim_wait 128
-	anim_incbgeffect ANIM_BG_18
-	anim_call BattleAnim_ShowMon_0
-	anim_ret
-; cb34d
-
-BattleAnim_Spark: ; cb34d
-	anim_2gfx ANIM_GFX_LIGHTNING, ANIM_GFX_EXPLOSION
-	anim_sound 0, 0, SFX_ZAP_CANNON
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $4, $3
-	anim_obj ANIM_OBJ_30,   6, 0,  11, 4, $0
-	anim_wait 24
-	anim_setobj $1, $3
-	anim_wait 1
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_bgeffect ANIM_BG_TACKLE, $0, $1, $0
-	anim_sound 0, 0, SFX_SPARK
-	anim_wait 16
-	anim_bgeffect ANIM_BG_SHOW_MON, $0, $0, $0
-	anim_wait 4
-	anim_incobj  2
-	anim_wait 1
-	anim_sound 0, 1, SFX_THUNDERSHOCK
-	anim_obj ANIM_OBJ_LIGHTNING_BOLT, -15, 0,   7, 0, $2
-	anim_obj ANIM_OBJ_33, -15, 0,   7, 0, $0
-	anim_wait 32
-	anim_ret
-; cb386
-
-BattleAnim_FuryCutter: ; cb386
-	anim_1gfx ANIM_GFX_CUT
-.loop
-	anim_sound 0, 1, SFX_CUT
-	anim_if_param_and %00000001, .obj1
-	anim_obj ANIM_OBJ_3A, -13, 0,   5, 0, $0
-	anim_jump .okay
-
-.obj1
-	anim_obj ANIM_OBJ_3B,  14, 0,   5, 0, $0
-.okay
-	anim_wait 16
-	anim_jumpuntil .loop
-	anim_ret
-; cb3a1
-
-BattleAnim_SteelWing: ; cb3a1
-	anim_1gfx ANIM_GFX_REFLECT
-	anim_obp0 $0
-	anim_sound 0, 0, SFX_RAGE
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_call BattleAnim_SteelWing_branch_cbc43
-	anim_call BattleAnim_ShowMon_0
-	anim_1gfx ANIM_GFX_HIT
-	anim_resetobp0
-	anim_sound 0, 1, SFX_WING_ATTACK
-	anim_obj ANIM_OBJ_01, -14, 4,   7, 0, $0
-	anim_obj ANIM_OBJ_01,  14, 4,   7, 0, $0
-	anim_wait 6
-	anim_sound 0, 1, SFX_WING_ATTACK
-	anim_obj ANIM_OBJ_01, -14, 0,   7, 0, $0
-	anim_obj ANIM_OBJ_01,  15, 0,   7, 0, $0
-	anim_wait 6
-	anim_sound 0, 1, SFX_WING_ATTACK
-	anim_obj ANIM_OBJ_01, -15, 4,   7, 0, $0
-	anim_obj ANIM_OBJ_01,  15, 4,   7, 0, $0
-	anim_wait 16
-	anim_ret
-; cb3df
-
-BattleAnim_MeanLook: ; cb3df
-	anim_1gfx ANIM_GFX_PSYCHIC
-	anim_obp0 $e0
-	anim_sound 0, 1, SFX_MEAN_LOOK
-	anim_obj ANIM_OBJ_AC, -14, 4,   4, 0, $0
-	anim_wait 5
-	anim_obj ANIM_OBJ_AC,  14, 4,   8, 0, $0
-	anim_wait 5
-	anim_obj ANIM_OBJ_AC, -14, 4,   8, 0, $0
-	anim_wait 5
-	anim_obj ANIM_OBJ_AC,  14, 4,   4, 0, $0
-	anim_wait 5
-	anim_obj ANIM_OBJ_AC, -16, 4,   6, 0, $0
-	anim_wait 128
-	anim_ret
-; cb405
-
-BattleAnim_Attract: ; cb405
-	anim_1gfx ANIM_GFX_OBJECTS
-.loop
-	anim_sound 0, 0, SFX_ATTRACT
-	anim_obj ANIM_OBJ_66,   5, 4,  10, 0, $2
-	anim_wait 8
-	anim_loop 5, .loop
-	anim_wait 128
-	anim_wait 64
-	anim_ret
-; cb417
-
-BattleAnim_SleepTalk: ; cb417
-	anim_1gfx ANIM_GFX_STATUS
-.loop
-	anim_sound 0, 0, SFX_STRENGTH
-	anim_obj ANIM_OBJ_54,   8, 0,  10, 0, $0
-	anim_wait 40
-	anim_loop 2, .loop
-	anim_wait 32
-	anim_ret
-; cb428
-
-BattleAnim_HealBell: ; cb428
-	anim_2gfx ANIM_GFX_MISC, ANIM_GFX_NOISE
-	anim_obj ANIM_OBJ_84,   9, 0,   7, 0, $0
-	anim_wait 32
-.loop
-	anim_sound 0, 0, SFX_HEAL_BELL
-	anim_obj ANIM_OBJ_85,   9, 0,   6, 4, $0
-	anim_wait 8
-	anim_sound 0, 0, SFX_HEAL_BELL
-	anim_obj ANIM_OBJ_85,   9, 0,   6, 4, $1
-	anim_wait 8
-	anim_sound 0, 0, SFX_HEAL_BELL
-	anim_obj ANIM_OBJ_85,   9, 0,   6, 4, $2
-	anim_wait 8
-	anim_sound 0, 0, SFX_HEAL_BELL
-	anim_obj ANIM_OBJ_85,   9, 0,   6, 4, $0
-	anim_wait 8
-	anim_sound 0, 0, SFX_HEAL_BELL
-	anim_obj ANIM_OBJ_85,   9, 0,   6, 4, $2
-	anim_wait 8
-	anim_loop 4, .loop
-	anim_wait 64
-	anim_ret
-; cb464
-
-BattleAnim_Return: ; cb464
-	anim_1gfx ANIM_GFX_HIT
-	anim_call BattleAnim_FollowPlayerHead_0
-	anim_bgeffect ANIM_BG_BOUNCE_DOWN, $0, $1, $0
-	anim_sound 0, 0, SFX_RETURN
-	anim_wait 64
-	anim_incbgeffect ANIM_BG_BOUNCE_DOWN
-	anim_wait 32
-	anim_bgeffect ANIM_BG_25, $0, $1, $0
-	anim_wait 4
-	anim_sound 0, 1, SFX_COMET_PUNCH
-	anim_obj ANIM_OBJ_03, -15, 0,   5, 0, $0
-	anim_wait 8
-	anim_call BattleAnim_ShowMon_0
-	anim_ret
-; cb488
-
-BattleAnim_Present: ; cb488
-	anim_2gfx ANIM_GFX_STATUS, ANIM_GFX_BUBBLE
-	anim_sound 0, 1, SFX_PRESENT
-	anim_obj ANIM_OBJ_8D,   8, 0,  11, 0, $6c
-	anim_wait 56
-	anim_obj ANIM_OBJ_53,  13, 0,   6, 0, $0
-	anim_wait 48
-	anim_incobj  2
-	anim_if_param_equal $3, .heal
-	anim_incobj  1
-	anim_wait 1
-	anim_1gfx ANIM_GFX_EXPLOSION
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $12
-.loop
-	anim_call BattleAnim_Present_branch_cbb8f
-	anim_wait 16
-	anim_jumpuntil .loop
-	anim_ret
-
-.heal
-	anim_sound 0, 1, SFX_METRONOME
-.loop2
-	anim_obj ANIM_OBJ_2C, -16, 4,   6, 0, $24
-	anim_wait 8
-	anim_loop 8, .loop2
-	anim_wait 128
-	anim_ret
-; cb4c1
-
-BattleAnim_Frustration: ; cb4c1
-	anim_1gfx ANIM_GFX_MISC
-	anim_sound 0, 0, SFX_KINESIS_2
-	anim_obj ANIM_OBJ_83,   9, 0,  10, 0, $0
-	anim_wait 40
-	anim_1gfx ANIM_GFX_HIT
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_bgeffect ANIM_BG_26, $0, $1, $0
-	anim_wait 8
-	anim_sound 0, 1, SFX_COMET_PUNCH
-	anim_obj ANIM_OBJ_01,  15, 0,   6, 0, $0
-	anim_wait 8
-	anim_sound 0, 1, SFX_COMET_PUNCH
-	anim_obj ANIM_OBJ_01, -13, 0,   6, 0, $0
-	anim_wait 8
-	anim_sound 0, 1, SFX_COMET_PUNCH
-	anim_obj ANIM_OBJ_01, -15, 0,   6, 0, $0
-	anim_wait 8
-	anim_incbgeffect ANIM_BG_26
-	anim_wait 1
-	anim_call BattleAnim_ShowMon_0
-	anim_ret
-; cb4f9
-
-BattleAnim_Safeguard: ; cb4f9
-	anim_1gfx ANIM_GFX_MISC
-	anim_bgeffect ANIM_BG_06, $0, $2, $0
-	anim_obj ANIM_OBJ_89,  10, 0,  10, 0, $0
-	anim_obj ANIM_OBJ_89,  10, 0,  10, 0, $d
-	anim_obj ANIM_OBJ_89,  10, 0,  10, 0, $1a
-	anim_obj ANIM_OBJ_89,  10, 0,  10, 0, $27
-	anim_obj ANIM_OBJ_89,  10, 0,  10, 0, $34
-	anim_sound 0, 0, SFX_PROTECT
-	anim_wait 96
-	anim_ret
-; cb51e
-
-BattleAnim_PainSplit: ; cb51e
-	anim_2gfx ANIM_GFX_HIT, ANIM_GFX_OBJECTS
-	anim_call BattleAnim_FollowPlayerHead_0
-	anim_bgeffect ANIM_BG_25, $0, $1, $0
-	anim_wait 4
-	anim_sound 0, 1, SFX_TACKLE
-	anim_obj ANIM_OBJ_04,  14, 0,   6, 0, $0
-	anim_obj ANIM_OBJ_04,   9, 4,  12, 0, $0
-	anim_wait 8
-	anim_call BattleAnim_ShowMon_0
-	anim_wait 1
-	anim_ret
-; cb53d
-
-BattleAnim_SacredFire: ; cb53d
-	anim_1gfx ANIM_GFX_FIRE
-	anim_bgeffect ANIM_BG_06, $0, $2, $0
-	anim_bgeffect ANIM_BG_ALTERNATE_HUES, $0, $2, $0
-.loop
-	anim_sound 0, 0, SFX_EMBER
-	anim_obj ANIM_OBJ_80,   6, 0,  13, 0, $0
-	anim_wait 8
-	anim_loop 8, .loop
-	anim_wait 96
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_bgeffect ANIM_BG_TACKLE, $0, $1, $0
-	anim_wait 4
-	anim_sound 0, 1, SFX_EMBER
-	anim_obj ANIM_OBJ_0F, -15, 0,   6, 0, $1
-	anim_obj ANIM_OBJ_0F, -15, 0,   6, 0, $4
-	anim_obj ANIM_OBJ_0F, -15, 0,   6, 0, $5
-	anim_wait 8
-	anim_bgeffect ANIM_BG_SHOW_MON, $0, $0, $0
-	anim_wait 4
-	anim_incobj  9
-	anim_wait 8
-	anim_ret
-; cb57d
-
-BattleAnim_Magnitude: ; cb57d
-	anim_1gfx ANIM_GFX_ROCKS
-.loop
-	anim_bgeffect ANIM_BG_1F, $e, $4, $0
-	anim_sound 0, 1, SFX_STRENGTH
-	anim_obj ANIM_OBJ_1E,  16, 0,   8, 0, $40
-	anim_wait 2
-	anim_obj ANIM_OBJ_1E,  15, 0,   8, 4, $30
-	anim_wait 2
-	anim_obj ANIM_OBJ_1E, -13, 0,   8, 4, $30
-	anim_wait 2
-	anim_obj ANIM_OBJ_1E, -14, 0,   8, 0, $40
-	anim_wait 2
-	anim_obj ANIM_OBJ_1E, -15, 0,   8, 4, $30
-	anim_wait 2
-	anim_jumpuntil .loop
-	anim_wait 96
-	anim_ret
-; cb5aa
-
-BattleAnim_Dynamicpunch: ; cb5aa
-	anim_2gfx ANIM_GFX_HIT, ANIM_GFX_EXPLOSION
-	anim_sound 0, 1, SFX_COMET_PUNCH
-	anim_obj ANIM_OBJ_0A, -15, 0,   7, 0, $43
-	anim_wait 16
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $12
-	anim_call BattleAnim_Dynamicpunch_branch_cbb8f
-	anim_wait 16
-	anim_ret
-; cb5c0
-
-BattleAnim_Megahorn: ; cb5c0
-	anim_2gfx ANIM_GFX_HORN, ANIM_GFX_HIT
-	anim_bgeffect ANIM_BG_1F, $40, $2, $0
-	anim_wait 48
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $3
-	anim_obj ANIM_OBJ_HORN,   9, 0,  10, 0, $1
-	anim_sound 0, 1, SFX_HORN_ATTACK
-	anim_wait 16
-	anim_obj ANIM_OBJ_00, -15, 0,   7, 0, $0
-	anim_wait 16
-	anim_ret
-; cb5de
-
-BattleAnim_Dragonbreath: ; cb5de
-	anim_1gfx ANIM_GFX_FIRE
-	anim_sound 6, 2, SFX_EMBER
-.loop
-	anim_obj ANIM_OBJ_90,   8, 0,  11, 4, $4
-	anim_wait 4
-	anim_loop 10, .loop
-	anim_wait 64
-	anim_ret
-; cb5ef
-
-BattleAnim_BatonPass: ; cb5ef
-	anim_1gfx ANIM_GFX_MISC
-	anim_obj ANIM_OBJ_86,   5, 4,  13, 0, $20
-	anim_sound 0, 0, SFX_BATON_PASS
-	anim_call BattleAnim_BatonPass_branch_c9486
-	anim_wait 64
-	anim_ret
-; cb5fe
-
-BattleAnim_Encore: ; cb5fe
-	anim_1gfx ANIM_GFX_OBJECTS
-	anim_obj ANIM_OBJ_99,   8, 0,  10, 0, $90
-	anim_obj ANIM_OBJ_99,   8, 0,  10, 0, $10
-	anim_sound 0, 0, SFX_ENCORE
-	anim_wait 16
-	anim_obj ANIM_OBJ_9A,   8, 0,   9, 0, $2c
-	anim_wait 32
-	anim_obj ANIM_OBJ_9A,   8, 0,   9, 0, $34
-	anim_wait 16
-	anim_ret
-; cb61b
-
-BattleAnim_Pursuit: ; cb61b
-	anim_1gfx ANIM_GFX_HIT
-	anim_if_param_equal $1, BattleAnim_Pursuit_branch_cb62b
-	anim_sound 0, 1, SFX_COMET_PUNCH
-	anim_obj ANIM_OBJ_01, -15, 0,   7, 0, $0
-	anim_wait 16
-	anim_ret
-; cb62b
-
-BattleAnim_Pursuit_branch_cb62b: ; cb62b
-	anim_bgeffect ANIM_BG_HIDE_MON, $0, $0, $0
-	anim_wait 4
-	anim_call BattleAnim_FollowEnemyFeet_1
-	anim_obj ANIM_OBJ_AD, -16, 4,   8, 0, $0
-	anim_wait 64
-	anim_obj ANIM_OBJ_AD, -16, 4,   8, 0, $1
-	anim_sound 0, 1, SFX_BALL_POOF
-	anim_bgeffect ANIM_BG_ENTER_MON, $0, $0, $0
-	anim_wait 64
-	anim_incobj  3
-	anim_wait 16
-	anim_sound 0, 1, SFX_MEGA_PUNCH
-	anim_obj ANIM_OBJ_00,  15, 0,   7, 0, $0
-	anim_bgeffect ANIM_BG_2D, $0, $0, $0
-	anim_wait 16
-	anim_call BattleAnim_ShowMon_1
-	anim_wait 1
-	anim_ret
-; cb65e
-
-BattleAnim_RapidSpin: ; cb65e
-	anim_2gfx ANIM_GFX_WIND, ANIM_GFX_HIT
-	anim_obp0 $e4
-.loop
-	anim_sound 0, 0, SFX_MENU
-	anim_obj ANIM_OBJ_A8,   5, 4,  14, 0, $0
-	anim_wait 2
-	anim_loop 5, .loop
-	anim_wait 24
-	anim_call BattleAnim_FollowPlayerHead_0
-	anim_bgeffect ANIM_BG_25, $0, $1, $0
-	anim_wait 4
-	anim_resetobp0
-	anim_sound 0, 1, SFX_MEGA_KICK
-	anim_obj ANIM_OBJ_04, -15, 0,   5, 0, $0
-	anim_wait 8
-	anim_bgeffect ANIM_BG_SHOW_MON, $0, $0, $0
-	anim_wait 4
-	anim_incobj  6
-	anim_wait 1
-	anim_ret
-; cb68e
-
-BattleAnim_SweetScent: ; cb68e
-	anim_2gfx ANIM_GFX_FLOWER, ANIM_GFX_MISC
-	anim_sound 0, 0, SFX_SWEET_SCENT
-	anim_obj ANIM_OBJ_FLOWER,   8, 0,  12, 0, $2
-	anim_wait 2
-	anim_obj ANIM_OBJ_FLOWER,   8, 0,  10, 0, $2
-	anim_wait 96
-	anim_obp0 $54
-	anim_sound 0, 1, SFX_SWEET_SCENT_2
-	anim_obj ANIM_OBJ_COTTON, -15, 0,   5, 0, $15
-	anim_obj ANIM_OBJ_COTTON, -15, 0,   5, 0, $2a
-	anim_obj ANIM_OBJ_COTTON, -15, 0,   5, 0, $3f
-	anim_wait 128
-	anim_ret
-; cb6b6
-
-BattleAnim_IronTail: ; cb6b6
-	anim_1gfx ANIM_GFX_REFLECT
-	anim_obp0 $0
-	anim_sound 0, 0, SFX_RAGE
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_call BattleAnim_IronTail_branch_cbc43
-	anim_wait 4
-	anim_1gfx ANIM_GFX_HIT
-	anim_resetobp0
-	anim_bgeffect ANIM_BG_26, $0, $1, $0
-	anim_wait 16
-	anim_sound 0, 1, SFX_MEGA_KICK
-	anim_obj ANIM_OBJ_00, -15, 0,   6, 0, $0
-	anim_wait 16
-	anim_incbgeffect ANIM_BG_26
-	anim_call BattleAnim_ShowMon_0
-	anim_ret
-; cb6dc
-
-BattleAnim_MetalClaw: ; cb6dc
-	anim_1gfx ANIM_GFX_REFLECT
-	anim_obp0 $0
-	anim_sound 0, 0, SFX_RAGE
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_call BattleAnim_MetalClaw_branch_cbc43
-	anim_call BattleAnim_ShowMon_0
-	anim_1gfx ANIM_GFX_CUT
-	anim_resetobp0
-	anim_sound 0, 1, SFX_SCRATCH
-	anim_obj ANIM_OBJ_37, -14, 0,   6, 0, $0
-	anim_obj ANIM_OBJ_37, -15, 4,   5, 4, $0
-	anim_obj ANIM_OBJ_37, -15, 0,   5, 0, $0
-	anim_wait 32
-	anim_ret
-; cb703
-
-BattleAnim_VitalThrow: ; cb703
-	anim_1gfx ANIM_GFX_HIT
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_bgeffect ANIM_BG_2F, $0, $1, $0
-	anim_wait 16
-	anim_sound 0, 0, SFX_MENU
-	anim_obj ANIM_OBJ_04,   8, 0,  12, 0, $0
-	anim_wait 8
-	anim_sound 0, 0, SFX_MENU
-	anim_obj ANIM_OBJ_04,   7, 0,  11, 0, $0
-	anim_wait 8
-	anim_sound 0, 0, SFX_MENU
-	anim_obj ANIM_OBJ_04,   8, 4,  13, 0, $0
-	anim_wait 8
-	anim_incbgeffect ANIM_BG_2F
-	anim_wait 16
-	anim_call BattleAnim_ShowMon_0
-	anim_sound 0, 1, SFX_MEGA_PUNCH
-	anim_obj ANIM_OBJ_03, -16, 4,   7, 0, $0
-	anim_wait 16
-	anim_ret
-; cb739
-
-BattleAnim_MorningSun: ; cb739
-	anim_1gfx ANIM_GFX_SHINE
-	anim_bgeffect ANIM_BG_07, $0, $0, $0
-	anim_sound 0, 0, SFX_MORNING_SUN
-.loop
-	anim_obj ANIM_OBJ_9C,   2, 0,   6, 0, $88
-	anim_wait 6
-	anim_loop 5, .loop
-	anim_wait 32
-	anim_if_param_equal 0, .zero
-	anim_call BattleAnim_MorningSun_branch_cbc6a
-	anim_ret
-; cb756
-
-.zero
-	anim_call BattleAnim_MorningSun_branch_cbc80
-	anim_ret
-; cb75a
-
-BattleAnim_Synthesis: ; cb75a
-	anim_1gfx ANIM_GFX_SHINE
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_bgeffect ANIM_BG_18, $0, $1, $40
-	anim_bgeffect ANIM_BG_07, $0, $0, $0
-	anim_sound 0, 0, SFX_OUTRAGE
-	anim_wait 72
-	anim_incbgeffect ANIM_BG_18
-	anim_call BattleAnim_ShowMon_0
-	anim_if_param_equal $1, .one
-	anim_call BattleAnim_Synthesis_branch_cbc6a
-	anim_ret
-; cb77a
-
-.one
-	anim_call BattleAnim_Synthesis_branch_cbc80
-	anim_ret
-; cb77e
-
-BattleAnim_Crunch: ; cb77e
-	anim_2gfx ANIM_GFX_CUT, ANIM_GFX_HIT
-	anim_bgp $1b
-	anim_obp0 $c0
-	anim_bgeffect ANIM_BG_1F, $20, $2, $0
-	anim_obj ANIM_OBJ_36, -15, 0,   7, 0, $a8
-	anim_obj ANIM_OBJ_36, -15, 0,   7, 0, $28
-	anim_wait 8
-	anim_sound 0, 1, SFX_BITE
-	anim_obj ANIM_OBJ_00, -14, 0,   6, 0, $18
-	anim_wait 16
-	anim_sound 0, 1, SFX_BITE
-	anim_obj ANIM_OBJ_00,  16, 0,   8, 0, $18
-	anim_wait 8
-	anim_ret
-; cb7a8
-
-BattleAnim_Moonlight: ; cb7a8
-	anim_1gfx ANIM_GFX_SHINE
-	anim_bgp $1b
-	anim_bgeffect ANIM_BG_07, $0, $0, $0
-	anim_obj ANIM_OBJ_9E,   0, 0,   5, 0, $0
-	anim_obj ANIM_OBJ_9E,   2, 0,   7, 0, $0
-	anim_obj ANIM_OBJ_9E,   4, 0,   9, 0, $0
-	anim_obj ANIM_OBJ_9E,   6, 0,  11, 0, $0
-	anim_obj ANIM_OBJ_9E,   8, 0,  13, 0, $0
-	anim_wait 1
-	anim_sound 0, 0, SFX_MOONLIGHT
-	anim_wait 63
-	anim_if_param_equal $3, .three
-	anim_call BattleAnim_Moonlight_branch_cbc6a
-	anim_ret
-
-.three
-	anim_call BattleAnim_Moonlight_branch_cbc80
-	anim_ret
-; cb7db
-
-BattleAnim_HiddenPower: ; cb7db
-	anim_1gfx ANIM_GFX_CHARGE
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_bgeffect ANIM_BG_1A, $0, $1, $20
-	anim_bgeffect ANIM_BG_07, $0, $2, $0
-	anim_obj ANIM_OBJ_9F,   5, 4,  11, 0, $0
-	anim_obj ANIM_OBJ_9F,   5, 4,  11, 0, $8
-	anim_obj ANIM_OBJ_9F,   5, 4,  11, 0, $10
-	anim_obj ANIM_OBJ_9F,   5, 4,  11, 0, $18
-	anim_obj ANIM_OBJ_9F,   5, 4,  11, 0, $20
-	anim_obj ANIM_OBJ_9F,   5, 4,  11, 0, $28
-	anim_obj ANIM_OBJ_9F,   5, 4,  11, 0, $30
-	anim_obj ANIM_OBJ_9F,   5, 4,  11, 0, $38
-.loop
-	anim_sound 0, 0, SFX_SWORDS_DANCE
-	anim_wait 8
-	anim_loop 12, .loop
-	anim_incbgeffect ANIM_BG_1A
-	anim_call BattleAnim_ShowMon_0
-	anim_wait 1
-	anim_incobj  2
-	anim_incobj  3
-	anim_incobj  4
-	anim_incobj  5
-	anim_incobj  6
-	anim_incobj  7
-	anim_incobj  8
-	anim_incobj  9
-	anim_wait 16
-	anim_1gfx ANIM_GFX_HIT
-	anim_obj ANIM_OBJ_00, -15, 0,   7, 0, $0
-	anim_wait 32
-	anim_ret
-; cb83a
-
-BattleAnim_CrossChop: ; cb83a
-	anim_1gfx ANIM_GFX_CUT
-	anim_sound 0, 1, SFX_CUT
-	anim_obj ANIM_OBJ_A0, -13, 0,   5, 0, $0
-	anim_obj ANIM_OBJ_A1,  15, 0,   9, 0, $0
-	anim_wait 8
-	anim_bgeffect ANIM_BG_1F, $58, $2, $0
-	anim_wait 92
-	anim_sound 0, 1, SFX_VICEGRIP
-	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $10
-	anim_wait 16
-	anim_ret
-; cb85a
-
-BattleAnim_Twister: ; cb85a
-	anim_2gfx ANIM_GFX_WIND, ANIM_GFX_HIT
-.loop1
-	anim_sound 0, 0, SFX_RAZOR_WIND
-	anim_obj ANIM_OBJ_GUST,   8, 0,  14, 0, $0
-	anim_wait 6
-	anim_loop 9, .loop1
-.loop2
-	anim_sound 0, 0, SFX_RAZOR_WIND
-	anim_wait 8
-	anim_loop 8, .loop2
-	anim_incobj  1
-	anim_incobj  2
-	anim_incobj  3
-	anim_incobj  4
-	anim_incobj  5
-	anim_incobj  6
-	anim_incobj  7
-	anim_incobj  8
-	anim_incobj  9
-	anim_wait 64
-	anim_obj ANIM_OBJ_01, -14, 0,   8, 0, $18
-.loop3
-	anim_sound 0, 1, SFX_RAZOR_WIND
-	anim_wait 8
-	anim_loop 4, .loop3
-	anim_obj ANIM_OBJ_01,  16, 0,   4, 0, $18
-.loop4
-	anim_sound 0, 1, SFX_RAZOR_WIND
-	anim_wait 8
-	anim_loop 4, .loop4
-	anim_incobj  1
-	anim_incobj  2
-	anim_incobj  3
-	anim_incobj  4
-	anim_incobj  5
-	anim_incobj  6
-	anim_incobj  7
-	anim_incobj  8
-	anim_incobj  9
-	anim_wait 32
-	anim_ret
-; cb8b3
-
-BattleAnim_RainDance: ; cb8b3
-	anim_1gfx ANIM_GFX_WATER
-	anim_bgp $f8
-	anim_obp0 $7c
-	anim_sound 0, 1, SFX_RAIN_DANCE
-	anim_obj ANIM_OBJ_AF,  11, 0,   0, 0, $0
-	anim_wait 8
-	anim_obj ANIM_OBJ_AF,  11, 0,   0, 0, $1
-	anim_wait 8
-	anim_obj ANIM_OBJ_AF,  11, 0,   0, 0, $2
-	anim_wait 128
-	anim_ret
-; cb8cf
-
-BattleAnim_SunnyDay: ; cb8cf
-	anim_1gfx ANIM_GFX_WATER
-	anim_bgp $90
-	anim_sound 0, 1, SFX_MORNING_SUN
-	anim_obj ANIM_OBJ_AF,  11, 0,   0, 0, $2
-	anim_wait 8
-	anim_obj ANIM_OBJ_AF,  11, 0,   0, 0, $2
-	anim_wait 8
-	anim_obj ANIM_OBJ_AF,  11, 0,   0, 0, $2
-	anim_wait 128
-	anim_ret
-; cb8e9
-
-BattleAnim_MirrorCoat: ; cb8e9
-	anim_2gfx ANIM_GFX_REFLECT, ANIM_GFX_SPEED
-	anim_bgeffect ANIM_BG_06, $0, $2, $0
-.loop
-	anim_sound 0, 0, SFX_SHINE
-	anim_obj ANIM_OBJ_50,   9, 0,  10, 0, $0
-	anim_obj ANIM_OBJ_AE,   8, 0,   9, 0, $4
-	anim_wait 8
-	anim_obj ANIM_OBJ_AE,   8, 0,  11, 0, $4
-	anim_wait 8
-	anim_obj ANIM_OBJ_AE,   8, 0,  10, 0, $4
-	anim_wait 8
-	anim_obj ANIM_OBJ_AE,   8, 0,  12, 0, $4
-	anim_wait 8
-	anim_loop 3, .loop
-	anim_wait 32
-	anim_ret
-; cb917
-
-BattleAnim_PsychUp: ; cb917
-	anim_1gfx ANIM_GFX_STATUS
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_bgeffect ANIM_BG_1A, $0, $1, $20
-	anim_sound 0, 0, SFX_PSYBEAM
-	anim_obj ANIM_OBJ_B1,   5, 4,  11, 0, $0
-	anim_obj ANIM_OBJ_B1,   5, 4,  11, 0, $10
-	anim_obj ANIM_OBJ_B1,   5, 4,  11, 0, $20
-	anim_obj ANIM_OBJ_B1,   5, 4,  11, 0, $30
-	anim_wait 64
-	anim_incbgeffect ANIM_BG_1A
-	anim_call BattleAnim_ShowMon_0
-	anim_wait 16
-	anim_ret
-; cb940
-
-BattleAnim_Extremespeed: ; cb940
-	anim_2gfx ANIM_GFX_SPEED, ANIM_GFX_CUT
-	anim_bgeffect ANIM_BG_HIDE_MON, $0, $1, $0
-	anim_sound 0, 0, SFX_MENU
-	anim_obj ANIM_OBJ_77,   3, 0,  11, 0, $2
-	anim_obj ANIM_OBJ_77,   4, 0,  11, 0, $1
-	anim_obj ANIM_OBJ_77,   5, 0,  11, 0, $0
-	anim_obj ANIM_OBJ_77,   6, 0,  11, 0, $80
-	anim_obj ANIM_OBJ_77,   7, 0,  11, 0, $81
-	anim_obj ANIM_OBJ_77,   8, 0,  11, 0, $82
-	anim_wait 12
-	anim_sound 0, 1, SFX_CUT
-	anim_obj ANIM_OBJ_3A, -13, 0,   5, 0, $0
-	anim_wait 32
-	anim_bgeffect ANIM_BG_SHOW_MON, $0, $1, $0
-	anim_wait 16
-	anim_ret
-; cb97a
-
-BattleAnim_Ancientpower: ; cb97a
-	anim_2gfx ANIM_GFX_ROCKS, ANIM_GFX_HIT
-	anim_sound 0, 0, SFX_SPARK
-	anim_obj ANIM_OBJ_B2,   8, 0,  13, 4, $20
-	anim_wait 8
-	anim_sound 0, 0, SFX_SPARK
-	anim_obj ANIM_OBJ_B2,   9, 3,  12, 6, $20
-	anim_wait 8
-	anim_sound 0, 0, SFX_SPARK
-	anim_obj ANIM_OBJ_B2,  10, 5,  12, 1, $20
-	anim_wait 8
-	anim_sound 0, 0, SFX_SPARK
-	anim_obj ANIM_OBJ_B2,  12, 0,  11, 4, $20
-	anim_wait 8
-	anim_sound 0, 1, SFX_SPARK
-	anim_obj ANIM_OBJ_B2,  13, 2,  10, 7, $20
-	anim_wait 8
-	anim_sound 0, 1, SFX_SPARK
-	anim_obj ANIM_OBJ_B2,  14, 4,  10, 2, $20
-	anim_wait 8
-	anim_sound 0, 1, SFX_SPARK
-	anim_obj ANIM_OBJ_B2,  15, 6,   9, 5, $20
-	anim_wait 8
-	anim_sound 0, 1, SFX_SPARK
-	anim_obj ANIM_OBJ_00, -15, 0,   7, 0, $0
-	anim_wait 6
-	anim_ret
-; cb9c6
-
-BattleAnim_ShadowBall: ; cb9c6
-	anim_2gfx ANIM_GFX_EGG, ANIM_GFX_SMOKE
-	anim_bgp $1b
-	anim_sound 6, 2, SFX_SLUDGE_BOMB
-	anim_obj ANIM_OBJ_B4,   8, 0,  11, 4, $2
-	anim_wait 32
-	anim_obj ANIM_OBJ_BALL_POOF, -16, 4,   7, 0, $10
-	anim_wait 24
-	anim_ret
-; cb9db
-
-BattleAnim_FutureSight: ; cb9db
-	anim_1gfx ANIM_GFX_WIND
-	anim_bgeffect ANIM_BG_06, $0, $2, $0
-	anim_bgeffect ANIM_BG_ALTERNATE_HUES, $0, $2, $0
-	anim_bgeffect ANIM_BG_PSYCHIC, $0, $0, $0
-	anim_obj ANIM_OBJ_7D,   1, 0,   3, 0, $10
-	anim_obj ANIM_OBJ_7D,   1, 0,   6, 0, $2
-	anim_obj ANIM_OBJ_7D,   1, 0,  11, 0, $8
-	anim_wait 4
-	anim_obj ANIM_OBJ_7D,   1, 0,   4, 0, $6
-	anim_obj ANIM_OBJ_7D,   1, 0,   7, 0, $c
-	anim_obj ANIM_OBJ_7D,   1, 0,  10, 0, $4
-	anim_obj ANIM_OBJ_7D,   1, 0,  13, 0, $e
-.loop
-	anim_sound 0, 0, SFX_THROW_BALL
-	anim_wait 16
-	anim_loop 4, .loop
-	anim_incbgeffect ANIM_BG_PSYCHIC
-	anim_ret
-; cba1b
-
-BattleAnim_RockSmash: ; cba1b
-	anim_2gfx ANIM_GFX_ROCKS, ANIM_GFX_HIT
-	anim_sound 0, 1, SFX_SPARK
-	anim_obj ANIM_OBJ_01,  16, 0,   7, 0, $0
-	anim_sound 0, 1, SFX_SPARK
-	anim_obj ANIM_OBJ_B5,  16, 0,   8, 0, $28
-	anim_obj ANIM_OBJ_B5,  16, 0,   8, 0, $5c
-	anim_sound 0, 1, SFX_SPARK
-	anim_obj ANIM_OBJ_B5,  16, 0,   8, 0, $10
-	anim_obj ANIM_OBJ_B5,  16, 0,   8, 0, $e8
-	anim_sound 0, 1, SFX_SPARK
-	anim_obj ANIM_OBJ_B5,  16, 0,   8, 0, $9c
-	anim_obj ANIM_OBJ_B5,  16, 0,   8, 0, $d0
-	anim_wait 6
-	anim_sound 0, 1, SFX_SPARK
-	anim_obj ANIM_OBJ_B5,  16, 0,   8, 0, $1c
-	anim_obj ANIM_OBJ_B5,  16, 0,   8, 0, $50
-	anim_sound 0, 1, SFX_SPARK
-	anim_obj ANIM_OBJ_B5,  16, 0,   8, 0, $dc
-	anim_obj ANIM_OBJ_B5,  16, 0,   8, 0, $90
-	anim_wait 32
-	anim_ret
-; cba6a
-
-BattleAnim_Whirlpool: ; cba6a
-	anim_1gfx ANIM_GFX_WIND
-	anim_bgeffect ANIM_BG_WHIRLPOOL, $0, $0, $0
-	anim_sound 0, 1, SFX_SURF
-	anim_wait 16
-.loop
-	anim_obj ANIM_OBJ_GUST, -16, 4,   9, 0, $0
-	anim_wait 6
-	anim_loop 9, .loop
-	anim_wait 64
-	anim_incbgeffect ANIM_BG_WHIRLPOOL
-	anim_wait 1
-	anim_ret
-; cba84
-
-BattleAnim_BeatUp: ; cba84
-	anim_if_param_equal $0, .current_mon
-	anim_sound 0, 0, SFX_BALL_POOF
-	anim_bgeffect ANIM_BG_RETURN_MON, $0, $1, $0
-	anim_wait 16
-	anim_beatup
-	anim_sound 0, 0, SFX_BALL_POOF
-	anim_bgeffect ANIM_BG_ENTER_MON, $0, $1, $0
-	anim_wait 16
-.current_mon
-	anim_1gfx ANIM_GFX_HIT
-	anim_call BattleAnim_FollowEnemyFeet_0
-	anim_bgeffect ANIM_BG_TACKLE, $0, $1, $0
-	anim_wait 4
-	anim_sound 0, 1, SFX_BEAT_UP
-	anim_obj ANIM_OBJ_00, -15, 0,   6, 0, $0
-	anim_wait 8
-	anim_call BattleAnim_ShowMon_0
-	anim_ret
-; cbab3
-
-BattleAnim_DreamEater_branch_cbab3: ; cbab3
-BattleAnim_GigaDrain_branch_cbab3: ; cbab3
-BattleAnim_LeechLife_branch_cbab3: ; cbab3
-	anim_obj ANIM_OBJ_71, -16, 4,   5, 4, $0
-	anim_obj ANIM_OBJ_71, -16, 4,   5, 4, $8
-	anim_obj ANIM_OBJ_71, -16, 4,   5, 4, $10
-	anim_obj ANIM_OBJ_71, -16, 4,   5, 4, $18
-	anim_obj ANIM_OBJ_71, -16, 4,   5, 4, $20
-	anim_obj ANIM_OBJ_71, -16, 4,   5, 4, $28
-	anim_obj ANIM_OBJ_71, -16, 4,   5, 4, $30
-	anim_obj ANIM_OBJ_71, -16, 4,   5, 4, $38
-	anim_ret
-; cbadc
-
-BattleAnim_Glare_branch_cbadc: ; cbadc
-BattleAnim_Leer_branch_cbadc: ; cbadc
-BattleAnim_ScaryFace_branch_cbadc: ; cbadc
-	anim_sound 6, 2, SFX_LEER
-	anim_obj ANIM_OBJ_4E,   9, 0,  10, 4, $0
-	anim_obj ANIM_OBJ_4E,   8, 0,  10, 0, $0
-	anim_obj ANIM_OBJ_4E,  11, 0,   9, 4, $0
-	anim_obj ANIM_OBJ_4E,  10, 0,   9, 0, $0
-	anim_obj ANIM_OBJ_4E,  13, 0,   8, 4, $0
-	anim_obj ANIM_OBJ_4E,  12, 0,   8, 0, $0
-	anim_obj ANIM_OBJ_4E,  15, 0,   7, 4, $0
-	anim_obj ANIM_OBJ_4E,  14, 0,   7, 0, $0
-	anim_obj ANIM_OBJ_4F, -16, 2,   6, 6, $0
-	anim_obj ANIM_OBJ_4F,  15, 2,   6, 2, $0
-	anim_ret
-; cbb12
-
-BattleAnim_Fly_branch_cbb12: ; cbb12
-BattleAnim_Teleport_branch_cbb12: ; cbb12
-	anim_sound 0, 0, SFX_WARP_TO
-	anim_obj ANIM_OBJ_44,   5, 4,  13, 4, $0
-	anim_obj ANIM_OBJ_44,   5, 4,  12, 4, $0
-	anim_obj ANIM_OBJ_44,   5, 4,  11, 4, $0
-	anim_obj ANIM_OBJ_44,   5, 4,  10, 4, $0
-	anim_obj ANIM_OBJ_44,   5, 4,   9, 4, $0
-	anim_obj ANIM_OBJ_44,   5, 4,   8, 4, $0
-	anim_obj ANIM_OBJ_44,   5, 4,   7, 4, $0
-	anim_ret
-; cbb39
-
-BattleAnim_AuroraBeam_branch_cbb39: ; cbb39
-BattleAnim_HyperBeam_branch_cbb39: ; cbb39
-BattleAnim_Solarbeam_branch_cbb39: ; cbb39
-	anim_sound 0, 0, SFX_HYPER_BEAM
-	anim_obj ANIM_OBJ_27,   8, 0,  11, 4, $0
-	anim_wait 4
-	anim_sound 0, 0, SFX_HYPER_BEAM
-	anim_obj ANIM_OBJ_27,  10, 0,  10, 4, $0
-	anim_wait 4
-	anim_sound 0, 1, SFX_HYPER_BEAM
-	anim_obj ANIM_OBJ_27,  12, 0,   9, 4, $0
-	anim_wait 4
-	anim_sound 0, 1, SFX_HYPER_BEAM
-	anim_obj ANIM_OBJ_27,  14, 0,   8, 4, $0
-	anim_obj ANIM_OBJ_28,  15, 6,   7, 6, $0
-	anim_ret
-; cbb62
-
-BattleAnim_Explosion_branch_cbb62: ; cbb62
-BattleAnim_Selfdestruct_branch_cbb62: ; cbb62
-	anim_sound 0, 0, SFX_EGG_BOMB
-	anim_obj ANIM_OBJ_17,   3, 0,   8, 0, $0
-	anim_wait 5
-	anim_sound 0, 0, SFX_EGG_BOMB
-	anim_obj ANIM_OBJ_17,   7, 0,  13, 0, $0
-	anim_wait 5
-	anim_sound 0, 0, SFX_EGG_BOMB
-	anim_obj ANIM_OBJ_17,   3, 0,  13, 0, $0
-	anim_wait 5
-	anim_sound 0, 0, SFX_EGG_BOMB
-	anim_obj ANIM_OBJ_17,   7, 0,   8, 0, $0
-	anim_wait 5
-	anim_sound 0, 0, SFX_EGG_BOMB
-	anim_obj ANIM_OBJ_17,   5, 0,  10, 4, $0
-	anim_ret
-; cbb8f
-
-BattleAnim_Dynamicpunch_branch_cbb8f: ; cbb8f
-BattleAnim_Explosion_branch_cbb8f: ; cbb8f
-BattleAnim_Present_branch_cbb8f: ; cbb8f
-BattleAnim_Selfdestruct_branch_cbb8f: ; cbb8f
-	anim_sound 0, 1, SFX_EGG_BOMB
-	anim_obj ANIM_OBJ_17, -14, 4,   4, 0, $0
-	anim_wait 5
-	anim_sound 0, 1, SFX_EGG_BOMB
-	anim_obj ANIM_OBJ_17,  14, 4,   9, 0, $0
-	anim_wait 5
-	anim_sound 0, 1, SFX_EGG_BOMB
-	anim_obj ANIM_OBJ_17, -14, 4,   9, 0, $0
-	anim_wait 5
-	anim_sound 0, 1, SFX_EGG_BOMB
-	anim_obj ANIM_OBJ_17,  14, 4,   4, 0, $0
-	anim_wait 5
-	anim_sound 0, 1, SFX_EGG_BOMB
-	anim_obj ANIM_OBJ_17, -16, 4,   6, 4, $0
-	anim_ret
-; cbbbc
-
-BattleAnim_Growl_branch_cbbbc: ; cbbbc
-BattleAnim_Roar_branch_cbbbc: ; cbbbc
-BattleAnim_Snore_branch_cbbbc: ; cbbbc
-	anim_obj ANIM_OBJ_4B,   8, 0,   9, 4, $0
-	anim_obj ANIM_OBJ_4B,   8, 0,  11, 0, $1
-	anim_obj ANIM_OBJ_4B,   8, 0,  12, 4, $2
-	anim_ret
-; cbbcc
-
-BattleAnim_FirePunch_branch_cbbcc: ; cbbcc
-BattleAnim_TriAttack_branch_cbbcc: ; cbbcc
-	anim_sound 0, 1, SFX_EMBER
-.loop
-	anim_obj ANIM_OBJ_BURNED, -15, 0,   7, 0, $10
-	anim_obj ANIM_OBJ_BURNED, -15, 0,   7, 0, $90
-	anim_wait 4
-	anim_loop 4, .loop
-	anim_ret
-; cbbdf
-
-BattleAnim_IcePunch_branch_cbbdf: ; cbbdf
-BattleAnim_PowderSnow_branch_cbbdf: ; cbbdf
-BattleAnim_TriAttack_branch_cbbdf: ; cbbdf
-	anim_sound 0, 1, SFX_SHINE
-	anim_obj ANIM_OBJ_12,  16, 0,   5, 2, $0
-	anim_wait 6
-	anim_sound 0, 1, SFX_SHINE
-	anim_obj ANIM_OBJ_12, -14, 0,   8, 6, $0
-	anim_wait 6
-	anim_sound 0, 1, SFX_SHINE
-	anim_obj ANIM_OBJ_12,  15, 0,   7, 0, $0
-	anim_wait 6
-	anim_sound 0, 1, SFX_SHINE
-	anim_obj ANIM_OBJ_12, -13, 0,   7, 0, $0
-	anim_wait 6
-	anim_sound 0, 1, SFX_SHINE
-	anim_obj ANIM_OBJ_12, -14, 0,   5, 2, $0
-	anim_wait 6
-	anim_sound 0, 1, SFX_SHINE
-	anim_obj ANIM_OBJ_12,  16, 0,   8, 6, $0
-	anim_ret
-; cbc15
-
-BattleAnim_SludgeBomb_branch_cbc15: ; cbc15
-BattleAnim_Sludge_branch_cbc15: ; cbc15
-BattleAnim_Toxic_branch_cbc15: ; cbc15
-.loop
-	anim_sound 0, 1, SFX_UNKNOWN_7F
-	anim_obj ANIM_OBJ_1A, -16, 4,   9, 0, $0
-	anim_wait 8
-	anim_sound 0, 1, SFX_UNKNOWN_7F
-	anim_obj ANIM_OBJ_1A,  14, 4,   9, 0, $0
-	anim_wait 8
-	anim_sound 0, 1, SFX_UNKNOWN_7F
-	anim_obj ANIM_OBJ_1A, -14, 4,   9, 0, $0
-	anim_wait 8
-	anim_loop 5, .loop
-	anim_ret
-; cbc35
-
-BattleAnim_Acid_branch_cbc35: ; cbc35
-BattleAnim_Toxic_branch_cbc35: ; cbc35
-.loop
-	anim_sound 6, 2, SFX_BUBBLEBEAM
-	anim_obj ANIM_OBJ_19,   8, 0,  11, 4, $10
-	anim_wait 5
-	anim_loop 8, .loop
-	anim_ret
-; cbc43
-
-BattleAnim_Harden_branch_cbc43: ; cbc43
-BattleAnim_IronTail_branch_cbc43: ; cbc43
-BattleAnim_MetalClaw_branch_cbc43: ; cbc43
-BattleAnim_SteelWing_branch_cbc43: ; cbc43
-	anim_sound 0, 0, SFX_SHINE
-	anim_bgeffect ANIM_BG_17, $0, $1, $40
-	anim_wait 8
-	anim_obj ANIM_OBJ_51,   6, 0,  10, 4, $0
-	anim_wait 32
-	anim_obj ANIM_OBJ_51,   6, 0,  10, 4, $0
-	anim_wait 64
-	anim_incbgeffect ANIM_BG_17
-	anim_ret
-; cbc5b
-
-BattleAnim_MudSlap_branch_cbc5b: ; cbc5b
-BattleAnim_SandAttack_branch_cbc5b: ; cbc5b
-.loop
-	anim_sound 6, 2, SFX_MENU
-	anim_obj ANIM_OBJ_58,   8, 0,  11, 4, $4
-	anim_wait 4
-	anim_loop 8, .loop
-	anim_wait 32
-	anim_ret
-; cbc6a
-
-BattleAnim_Moonlight_branch_cbc6a: ; cbc6a
-BattleAnim_MorningSun_branch_cbc6a: ; cbc6a
-BattleAnim_Synthesis_branch_cbc6a: ; cbc6a
-	anim_sound 0, 0, SFX_METRONOME
-	anim_obj ANIM_OBJ_9D,   5, 4,   8, 0, $0
-	anim_wait 5
-	anim_obj ANIM_OBJ_9D,   3, 0,  12, 0, $0
-	anim_wait 5
-	anim_obj ANIM_OBJ_9D,   7, 0,  13, 0, $0
-	anim_wait 21
-	anim_ret
-; cbc80
-
-BattleAnim_Moonlight_branch_cbc80: ; cbc80
-BattleAnim_MorningSun_branch_cbc80: ; cbc80
-BattleAnim_Synthesis_branch_cbc80: ; cbc80
-	anim_sound 0, 0, SFX_METRONOME
-.loop
-	anim_obj ANIM_OBJ_9D,   3, 0,   8, 0, $0
-	anim_wait 5
-	anim_obj ANIM_OBJ_9D,   7, 0,  13, 0, $0
-	anim_wait 5
-	anim_obj ANIM_OBJ_9D,   3, 0,  13, 0, $0
-	anim_wait 5
-	anim_obj ANIM_OBJ_9D,   7, 0,   8, 0, $0
-	anim_wait 5
-	anim_obj ANIM_OBJ_9D,   5, 0,  10, 4, $0
-	anim_wait 5
-	anim_loop 2, .loop
-	anim_wait 16
-	anim_ret
-; cbca7
-
-BattleAnim_FollowEnemyFeet_0: ; cbca7
-	anim_enemyfeetobj
-	anim_bgeffect ANIM_BG_FEET_FOLLOW, $0, $0, $0
-	anim_wait 6
-	anim_ret
-; cbcaf
-
-BattleAnim_FollowPlayerHead_0: ; cbcaf
-	anim_playerheadobj
-	anim_bgeffect ANIM_BG_HEAD_FOLLOW, $0, $0, $0
-	anim_wait 6
-	anim_ret
-; cbcb7
-
-BattleAnim_ShowMon_0: ; cbcb7
-	anim_wait 1
-	anim_bgeffect ANIM_BG_SHOW_MON, $0, $0, $0
-	anim_wait 5
-	anim_incobj  1
-	anim_wait 1
-	anim_ret
-; cbcc2
-
-BattleAnim_FollowEnemyFeet_1: ; cbcc2
-	anim_enemyfeetobj
-	anim_bgeffect ANIM_BG_FEET_FOLLOW, $0, $1, $0
-	anim_wait 6
-	anim_ret
-; cbcca
-
-BattleAnim_FollowPlayerHead_1: ; cbcca
-	anim_playerheadobj
-	anim_bgeffect ANIM_BG_HEAD_FOLLOW, $0, $1, $0
-	anim_wait 4
-	anim_ret
-; cbcd2
-
-BattleAnim_ShowMon_1: ; cbcd2
-	anim_wait 1
-	anim_bgeffect ANIM_BG_SHOW_MON, $0, $1, $0
-	anim_wait 4
-	anim_incobj  1
-	anim_wait 1
-	anim_ret
-; cbcdd
--- a/battle/bg_effects.asm
+++ /dev/null
@@ -1,2957 +1,0 @@
-	const_def
-	const BGSQUARE_SIX
-	const BGSQUARE_FOUR
-	const BGSQUARE_TWO
-	const BGSQUARE_SEVEN
-	const BGSQUARE_FIVE
-	const BGSQUARE_THREE
-
-; BG effects for use in battle animations.
-
-ExecuteBGEffects: ; c8000 (32:4000)
-	ld hl, ActiveBGEffects
-	ld e, 5
-.loop
-	ld a, [hl]
-	and a
-	jr z, .next
-	ld c, l
-	ld b, h
-	push hl
-	push de
-	call DoBattleBGEffectFunction
-	pop de
-	pop hl
-.next
-	ld bc, 4
-	add hl, bc
-	dec e
-	jr nz, .loop
-	ret
-
-QueueBGEffect: ; c801a (32:401a)
-	ld hl, ActiveBGEffects
-	ld e, 5
-.loop
-	ld a, [hl]
-	and a
-	jr z, .load
-	ld bc, 4
-	add hl, bc
-	dec e
-	jr nz, .loop
-	scf
-	ret
-
-.load
-	ld c, l
-	ld b, h
-	ld hl, BG_EFFECT_STRUCT_FUNCTION
-	add hl, bc
-	ld a, [wBattleAnimTemp0]
-	ld [hli], a
-	ld a, [wBattleAnimTemp1]
-	ld [hli], a
-	ld a, [wBattleAnimTemp2]
-	ld [hli], a
-	ld a, [wBattleAnimTemp3]
-	ld [hl], a
-	ret
-
-EndBattleBGEffect: ; c8043 (32:4043)
-	ld hl, BG_EFFECT_STRUCT_FUNCTION
-	add hl, bc
-	ld [hl], 0
-	ret
-
-DoBattleBGEffectFunction: ; c804a (32:404a)
-	ld hl, BG_EFFECT_STRUCT_FUNCTION
-	add hl, bc
-	ld e, [hl]
-	ld d, 0
-	ld hl, BattleBGEffects
-	add hl, de
-	add hl, de
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	jp hl
-
-BattleBGEffects: ; c805a (32:405a)
-	dw BattleBGEffect_End
-	dw BattleBGEffect_FlashInverted
-	dw BattleBGEffect_FlashWhite
-	dw BattleBGEffect_WhiteHues
-	dw BattleBGEffect_BlackHues
-	dw BattleBGEffect_AlternateHues
-	dw BattleBGEffect_06
-	dw BattleBGEffect_07
-	dw BattleBGEffect_08
-	dw BattleBGEffect_HideMon
-	dw BattleBGEffect_ShowMon
-	dw BattleBGEffect_EnterMon
-	dw BattleBGEffect_ReturnMon
-	dw BattleBGEffect_Surf
-	dw BattleBGEffect_Whirlpool
-	dw BattleBGEffect_Teleport
-	dw BattleBGEffect_NightShade
-	dw BattleBGEffect_FeetFollow
-	dw BattleBGEffect_HeadFollow
-	dw BattleBGEffect_DoubleTeam
-	dw BattleBGEffect_AcidArmor
-	dw BattleBGEffect_RapidFlash
-	dw BattleBGEffect_16
-	dw BattleBGEffect_17
-	dw BattleBGEffect_18
-	dw BattleBGEffect_19
-	dw BattleBGEffect_1a
-	dw BattleBGEffect_1b
-	dw BattleBGEffect_1c
-	dw BattleBGEffect_1d
-	dw BattleBGEffect_1e
-	dw BattleBGEffect_1f
-	dw BattleBGEffect_20
-	dw BattleBGEffect_Withdraw
-	dw BattleBGEffect_BounceDown
-	dw BattleBGEffect_Dig
-	dw BattleBGEffect_Tackle
-	dw BattleBGEffect_25
-	dw BattleBGEffect_26
-	dw BattleBGEffect_27
-	dw BattleBGEffect_28
-	dw BattleBGEffect_Psychic
-	dw BattleBGEffect_2a
-	dw BattleBGEffect_2b
-	dw BattleBGEffect_2c
-	dw BattleBGEffect_2d
-	dw BattleBGEffect_2e
-	dw BattleBGEffect_2f
-	dw BattleBGEffect_30
-	dw BattleBGEffect_31
-	dw BattleBGEffect_32
-	dw BattleBGEffect_VibrateMon
-	dw BattleBGEffect_WobbleMon
-	dw BattleBGEffect_35
-
-
-BattleBGEffect_End: ; c80c6 (32:40c6)
-	call EndBattleBGEffect
-	ret
-
-BatttleBGEffects_GetNamedJumptablePointer: ; c80ca (32:40ca)
-	ld hl, BG_EFFECT_STRUCT_JT_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
-
-BattleBGEffects_AnonJumptable: ; c80d7 (32:40d7)
-	pop de
-	ld hl, BG_EFFECT_STRUCT_JT_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
-	jp hl
-
-BattleBGEffects_IncrementJumptable: ; c80e5 (32:40e5)
-	ld hl, BG_EFFECT_STRUCT_JT_INDEX
-	add hl, bc
-	inc [hl]
-	ret
-
-BattleBGEffect_FlashInverted: ; c80eb (32:40eb)
-	ld de, .inverted
-	jp BattleBGEffect_FlashContinue
-
-.inverted
-	db %11100100 ; 3210
-	db %00011011 ; 0123
-; c80f3
-
-BattleBGEffect_FlashWhite: ; c80f3 (32:40f3)
-	ld de, .white
-	jp BattleBGEffect_FlashContinue
-
-.white
-	db %11100100 ; 3210
-	db %00000000 ; 0000
-; c80fb
-
-BattleBGEffect_FlashContinue: ; c80fb (32:40fb)
-; current timer, flash duration, number of flashes
-	ld a, $1
-	ld [wBattleAnimTemp0], a
-	ld hl, BG_EFFECT_STRUCT_JT_INDEX
-	add hl, bc
-	ld a, [hl]
-	and a
-	jr z, .init
-	dec [hl]
-	ret
-
-.init
-	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
-	add hl, bc
-	ld a, [hl]
-	ld hl, BG_EFFECT_STRUCT_JT_INDEX
-	add hl, bc
-	ld [hl], a
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld a, [hl]
-	and a
-	jr nz, .apply_pal
-	call EndBattleBGEffect
-	ret
-
-.apply_pal
-	dec a
-	ld [hl], a
-	and 1
-	ld l, a
-	ld h, 0
-	add hl, de
-	ld a, [hl]
-	ld [wBGP], a
-	ret
-
-BattleBGEffect_WhiteHues: ; c812d (32:412d)
-	ld de, .Pals
-	call BattleBGEffect_GetNthDMGPal
-	jr c, .quit
-	ld [wBGP], a
-	ret
-
-.quit
-	call EndBattleBGEffect
-	ret
-
-.Pals:
-	db %11100100
-	db %11100000
-	db %11010000
-	db -1
-; c8141
-
-BattleBGEffect_BlackHues: ; c8141 (32:4141)
-	ld de, .Pals
-	call BattleBGEffect_GetNthDMGPal
-	jr c, .quit
-	ld [wBGP], a
-	ret
-
-.quit
-	call EndBattleBGEffect
-	ret
-
-.Pals:
-	db %11100100
-	db %11110100
-	db %11111000
-	db -1
-; c8155
-
-BattleBGEffect_AlternateHues: ; c8155 (32:4155)
-	ld de, .Pals
-	call BattleBGEffect_GetNthDMGPal
-	jr c, .quit
-	ld [wBGP], a
-	ld [wOBP1], a
-	ret
-
-.quit
-	call EndBattleBGEffect
-	ret
-
-.Pals:
-	db %11100100
-	db %11111000
-	db %11111100
-	db %11111000
-	db %11100100
-	db %10010000
-	db %01000000
-	db %10010000
-	db -2
-; c8171
-
-BattleBGEffect_06: ; c8171 (32:4171)
-	call BattleBGEffects_CheckSGB
-	jr nz, .sgb
-	ld de, .PalsCGB
-	jr .okay
-
-.sgb
-	ld de, .PalsSGB
-.okay
-	call BattleBGEffect_GetNthDMGPal
-	ld [wOBP0], a
-	ret
-
-.PalsCGB:
-	db %11100100
-	db %10010000
-	db -2
-
-.PalsSGB:
-	db %11110000
-	db %11000000
-	db -2
-; c818b
-
-BattleBGEffect_07: ; c818b (32:418b)
-	call BattleBGEffects_CheckSGB
-	jr nz, .sgb
-	ld de, .PalsCGB
-	jr .okay
-
-.sgb
-	ld de, .PalsSGB
-.okay
-	call BattleBGEffect_GetNthDMGPal
-	ld [wOBP0], a
-	ret
-
-.PalsCGB:
-	db %11100100
-	db %11011000
-	db -2
-
-.PalsSGB:
-	db %11110000
-	db %11001100
-	db -2
-; c81a5
-
-BattleBGEffect_08: ; c81a5 (32:41a5)
-	ld de, .Pals
-	call BattleBGEffect_GetNthDMGPal
-	ld [wBGP], a
-	ret
-
-.Pals:
-	db %00011011
-	db %01100011
-	db %10000111
-	db -2
-; c81b3
-
-BattleBGEffect_HideMon: ; c81b3 (32:41b3)
-	call BattleBGEffects_AnonJumptable
-.anon_dw
-	dw .zero
-	dw BattleBGEffects_IncrementJumptable
-	dw BattleBGEffects_IncrementJumptable
-	dw BattleBGEffects_IncrementJumptable
-	dw .four
-
-
-.zero
-	call BattleBGEffects_IncrementJumptable
-	push bc
-	call BGEffect_CheckBattleTurn
-	jr nz, .player_side
-	hlcoord 12, 0
-	lb bc, 7, 7
-	jr .got_pointer
-
-.player_side
-	hlcoord 2, 6
-	lb bc, 6, 6
-.got_pointer
-	call ClearBox
-	pop bc
-	xor a
-	ld [hBGMapThird], a
-	ld a, $1
-	ld [hBGMapMode], a
-	ret
-
-.four
-	xor a
-	ld [hBGMapMode], a
-	call EndBattleBGEffect
-	ret
-
-BattleBGEffect_ShowMon: ; c81ea (32:41ea)
-	call BGEffect_CheckFlyDigStatus
-	jr z, .not_flying
-	call EndBattleBGEffect
-	ret
-
-.not_flying
-	call BGEffect_CheckBattleTurn
-	jr nz, .player_side
-	ld de, .EnemyData
-	jr .got_pointer
-
-.player_side
-	ld de, .PlayerData
-.got_pointer
-	ld a, e
-	ld [wBattleAnimTemp1], a
-	ld a, d
-	ld [wBattleAnimTemp2], a
-	call BattleBGEffect_RunPicResizeScript
-	ret
-
-.PlayerData:
-	db  0, $31, 0
-	db -1
-.EnemyData:
-	db  3, $00, 3
-	db -1
-; c8214
-
-BattleBGEffect_FeetFollow: ; c8214 (32:4214)
-	call BattleBGEffects_AnonJumptable
-.anon_dw
-	dw .zero
-	dw .one
-	dw BattleBGEffects_IncrementJumptable
-	dw BattleBGEffects_IncrementJumptable
-	dw BattleBGEffects_IncrementJumptable
-	dw .five
-
-
-.zero
-	call BGEffect_CheckFlyDigStatus
-	jr z, .not_flying_digging
-	ld hl, wNumActiveBattleAnims
-	inc [hl]
-	call EndBattleBGEffect
-	ret
-
-.not_flying_digging
-	call BattleBGEffects_IncrementJumptable
-	push bc
-	call BGEffect_CheckBattleTurn
-	jr nz, .player_turn
-	ld a, ANIM_OBJ_PLAYERFEETFOLLOW
-	ld [wBattleAnimTemp0], a
-	ld a, 16 * 8 + 4
-	jr .okay
-
-.player_turn
-	ld a, ANIM_OBJ_ENEMYFEETFOLLOW
-	ld [wBattleAnimTemp0], a
-	ld a, 6 * 8
-.okay
-	ld [wBattleAnimTemp1], a
-	ld a, 8 * 8
-	ld [wBattleAnimTemp2], a
-	xor a
-	ld [wBattleAnimTemp3], a
-	call _QueueBattleAnimation
-	pop bc
-	ret
-
-.one
-	call BattleBGEffects_IncrementJumptable
-	push bc
-	call BGEffect_CheckBattleTurn
-	jr nz, .player_turn_2
-	hlcoord 12, 6
-	lb bc, 1, 7
-	jr .okay2
-
-.player_turn_2
-	hlcoord 2, 6
-	lb bc, 1, 6
-.okay2
-	call ClearBox
-	ld a, $1
-	ld [hBGMapMode], a
-	pop bc
-	ret
-
-.five
-	xor a
-	ld [hBGMapMode], a
-	call EndBattleBGEffect
-	ret
-
-BattleBGEffect_HeadFollow: ; c8281 (32:4281)
-	call BattleBGEffects_AnonJumptable
-.anon_dw
-	dw .zero
-	dw .one
-	dw BattleBGEffects_IncrementJumptable
-	dw BattleBGEffects_IncrementJumptable
-	dw BattleBGEffects_IncrementJumptable
-	dw .five
-
-
-.zero
-	call BGEffect_CheckFlyDigStatus
-	jr z, .not_flying_digging
-	ld hl, wNumActiveBattleAnims
-	inc [hl]
-	call EndBattleBGEffect
-	ret
-
-.not_flying_digging
-	call BattleBGEffects_IncrementJumptable
-	push bc
-	call BGEffect_CheckBattleTurn
-	jr nz, .player_turn
-	ld a, ANIM_OBJ_BA
-	ld [wBattleAnimTemp0], a
-	ld a, 16 * 8 + 4
-	jr .okay
-
-.player_turn
-	ld a, ANIM_OBJ_BB
-	ld [wBattleAnimTemp0], a
-	ld a, 6 * 8
-.okay
-	ld [wBattleAnimTemp1], a
-	ld a, 8 * 8
-	ld [wBattleAnimTemp2], a
-	xor a
-	ld [wBattleAnimTemp3], a
-	call _QueueBattleAnimation
-	pop bc
-	ret
-
-.one
-	call BattleBGEffects_IncrementJumptable
-	push bc
-	call BGEffect_CheckBattleTurn
-	jr nz, .player_turn_2
-	hlcoord 12, 5
-	lb bc, 2, 7
-	jr .okay2
-
-.player_turn_2
-	hlcoord 2, 6
-	lb bc, 2, 6
-.okay2
-	call ClearBox
-	ld a, $1
-	ld [hBGMapMode], a
-	pop bc
-	ret
-
-.five
-	xor a
-	ld [hBGMapMode], a
-	call EndBattleBGEffect
-	ret
-
-_QueueBattleAnimation: ; c82ee (32:42ee)
-	callfar QueueBattleAnimation
-	ret
-
-BattleBGEffect_27: ; c82f5 (32:42f5)
-	call BattleBGEffects_AnonJumptable
-.anon_dw
-	dw .zero
-	dw .one
-	dw BattleBGEffects_IncrementJumptable
-	dw BattleBGEffects_IncrementJumptable
-	dw .four
-
-
-.zero
-	call BattleBGEffects_IncrementJumptable
-	call BGEffect_CheckBattleTurn
-	ld [hl], a
-	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
-	add hl, bc
-	ld a, [hl]
-	and a
-	jr z, .user
-	ld a, $9
-	jr .okay
-
-.user
-	ld a, $8
-.okay
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld [hl], a
-	ret
-
-.one
-	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
-	add hl, bc
-	ld a, [hl]
-	and a
-	jr z, .user_2
-	hlcoord 0, 6
-	lb de, 8, 6
-.row1
-	push de
-	push hl
-.col1
-	inc hl
-	ld a, [hld]
-	ld [hli], a
-	dec d
-	jr nz, .col1
-	pop hl
-	ld de, SCREEN_WIDTH
-	add hl, de
-	pop de
-	dec e
-	jr nz, .row1
-	jr .okay2
-
-.user_2
-	hlcoord 19, 0
-	lb de, 8, 7
-.row2
-	push de
-	push hl
-.col2
-	dec hl
-	ld a, [hli]
-	ld [hld], a
-	dec d
-	jr nz, .col2
-	pop hl
-	ld de, SCREEN_WIDTH
-	add hl, de
-	pop de
-	dec e
-	jr nz, .row2
-.okay2
-	xor a
-	ld [hBGMapThird], a
-	ld a, $1
-	ld [hBGMapMode], a
-	call BattleBGEffects_IncrementJumptable
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	dec [hl]
-	ret
-
-.four
-	xor a
-	ld [hBGMapMode], a
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld a, [hl]
-	and a
-	jr z, .done
-	ld hl, BG_EFFECT_STRUCT_JT_INDEX
-	add hl, bc
-	ld [hl], $1
-	ret
-
-.done
-	call EndBattleBGEffect
-	ret
-
-BattleBGEffect_EnterMon: ; c837b (32:437b)
-	call BGEffect_CheckBattleTurn
-	jr nz, .player_turn
-	ld de, .EnemyData
-	jr .okay
-
-.player_turn
-	ld de, .PlayerData
-.okay
-	ld a, e
-	ld [wBattleAnimTemp1], a
-	ld a, d
-	ld [wBattleAnimTemp2], a
-	call BattleBGEffect_RunPicResizeScript
-	ret
-
-.PlayerData:
-	db  2, $31, 2
-	db  1, $31, 1
-	db  0, $31, 0
-	db -1
-.EnemyData:
-	db  5, $00, 5
-	db  4, $00, 4
-	db  3, $00, 3
-	db -1
-; c83a8
-
-BattleBGEffect_ReturnMon: ; c83a8 (32:43a8)
-	call BGEffect_CheckBattleTurn
-	jr nz, .player_turn
-	ld de, .EnemyData
-	jr .okay
-
-.player_turn
-	ld de, .PlayerData
-.okay
-	ld a, e
-	ld [wBattleAnimTemp1], a
-	ld a, d
-	ld [wBattleAnimTemp2], a
-	call BattleBGEffect_RunPicResizeScript
-	ret
-
-.PlayerData:
-	db  0, $31, 0
-	db -2, $66, 0
-	db  1, $31, 1
-	db -2, $44, 1
-	db  2, $31, 2
-	db -2, $22, 2
-	db -3, $00, 0
-	db -1
-.EnemyData:
-	db  3, $00, 3
-	db -2, $77, 3
-	db  4, $00, 4
-	db -2, $55, 4
-	db  5, $00, 5
-	db -2, $33, 5
-	db -3, $00, 0
-	db -1
-; c83ed
-
-BattleBGEffect_RunPicResizeScript: ; c83ed (32:43ed)
-	call BattleBGEffects_AnonJumptable
-.anon_dw
-	dw .zero
-	dw BattleBGEffects_IncrementJumptable
-	dw BattleBGEffects_IncrementJumptable
-	dw .restart
-	dw .end
-
-
-.zero
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld e, [hl]
-	ld d, $0
-	inc [hl]
-	ld a, [wBattleAnimTemp1]
-	ld l, a
-	ld a, [wBattleAnimTemp2]
-	ld h, a
-	add hl, de
-	add hl, de
-	add hl, de
-	ld a, [hl]
-	cp -1
-	jr z, .end
-	cp -2
-	jr z, .clear
-	cp -3
-	jr z, .skip
-	call .PlaceGraphic
-.skip
-	call BattleBGEffects_IncrementJumptable
-	ld a, $1
-	ld [hBGMapMode], a
-	ret
-
-.clear
-	call .ClearBox
-	jr .zero
-
-.restart
-	xor a
-	ld [hBGMapMode], a
-	ld hl, BG_EFFECT_STRUCT_JT_INDEX
-	add hl, bc
-	ld [hl], $0
-	ret
-
-.end
-	xor a
-	ld [hBGMapMode], a
-	call EndBattleBGEffect
-	ret
-
-.ClearBox:
-; get dims
-	push bc
-	inc hl
-	ld a, [hli]
-	ld b, a
-	and $f
-	ld c, a
-	ld a, b
-	swap a
-	and $f
-	ld b, a
-; get coords
-	ld e, [hl]
-	ld d, 0
-	ld hl, .Coords
-	add hl, de
-	add hl, de
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	call ClearBox
-	pop bc
-	ret
-
-.PlaceGraphic:
-; get dims
-	push bc
-	push hl
-	ld e, [hl]
-	ld d, 0
-	ld hl, .BGSquares
-	add hl, de
-	add hl, de
-	add hl, de
-	ld a, [hli]
-	ld b, a
-	and $f
-	ld c, a
-	ld a, b
-	swap a
-	and $f
-	ld b, a
-; store pointer
-	ld e, [hl]
-	inc hl
-	ld d, [hl]
-; get byte
-	pop hl
-	inc hl
-	ld a, [hli]
-	ld [wBattleAnimTemp0], a
-; get coord
-	push de
-	ld e, [hl]
-	ld d, 0
-	ld hl, .Coords
-	add hl, de
-	add hl, de
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	pop de
-; fill box
-.row
-	push bc
-	push hl
-	ld a, [wBattleAnimTemp0]
-	ld b, a
-.col
-	ld a, [de]
-	add b
-	ld [hli], a
-	inc de
-	dec c
-	jr nz, .col
-	pop hl
-	ld bc, SCREEN_WIDTH
-	add hl, bc
-	pop bc
-	dec b
-	jr nz, .row
-	pop bc
-	ret
-
-.Coords:
-	dwcoord  2,  6
-	dwcoord  3,  8
-	dwcoord  4, 10
-	dwcoord 12,  0
-	dwcoord 13,  2
-	dwcoord 14,  4
-
-.BGSquares:
-bgsquare: MACRO
-	dn \1, \2
-	dw \3
-endm
-
-	bgsquare 6, 6, .SixBySix
-	bgsquare 4, 4, .FourByFour
-	bgsquare 2, 2, .TwoByTwo
-	bgsquare 7, 7, .SevenBySeven
-	bgsquare 5, 5, .FiveByFive
-	bgsquare 3, 3, .ThreeByThree
-
-.SixBySix:
-	db $00, $06, $0c, $12, $18, $1e
-	db $01, $07, $0d, $13, $19, $1f
-	db $02, $08, $0e, $14, $1a, $20
-	db $03, $09, $0f, $15, $1b, $21
-	db $04, $0a, $10, $16, $1c, $22
-	db $05, $0b, $11, $17, $1d, $23
-
-.FourByFour:
-	db $00, $0c, $12, $1e
-	db $02, $0e, $14, $20
-	db $03, $0f, $15, $21
-	db $05, $11, $17, $23
-
-.TwoByTwo:
-	db $00, $1e
-	db $05, $23
-
-.SevenBySeven:
-	db $00, $07, $0e, $15, $1c, $23, $2a
-	db $01, $08, $0f, $16, $1d, $24, $2b
-	db $02, $09, $10, $17, $1e, $25, $2c
-	db $03, $0a, $11, $18, $1f, $26, $2d
-	db $04, $0b, $12, $19, $20, $27, $2e
-	db $05, $0c, $13, $1a, $21, $28, $2f
-	db $06, $0d, $14, $1b, $22, $29, $30
-
-.FiveByFive:
-	db $00, $07, $15, $23, $2a
-	db $01, $08, $16, $24, $2b
-	db $03, $0a, $18, $26, $2d
-	db $05, $0c, $1a, $28, $2f
-	db $06, $0d, $1b, $29, $30
-
-.ThreeByThree:
-	db $00, $15, $2a
-	db $03, $18, $2d
-	db $06, $1b, $30
-; c8545
-
-BattleBGEffect_Surf: ; c8545 (32:4545)
-	call BattleBGEffects_AnonJumptable
-.anon_dw
-	dw .zero
-	dw .one
-	dw .two
-
-
-.zero
-	call BattleBGEffects_IncrementJumptable
-	lb de, 2, 2
-	call InitSurfWaves
-
-.one
-	ld a, [hLCDCPointer]
-	and a
-	ret z
-	push bc
-	call .RotatewSurfWaveBGEffect
-	pop bc
-	ret
-
-.two
-	call BattleAnim_ResetLCDStatCustom
-	ret
-
-.RotatewSurfWaveBGEffect:
-	ld hl, wSurfWaveBGEffect
-	ld de, wSurfWaveBGEffect + 1
-	ld c, wSurfWaveBGEffectEnd - wSurfWaveBGEffect - 1
-	ld a, [hl]
-	push af
-.loop
-	ld a, [de]
-	inc de
-	ld [hli], a
-	dec c
-	jr nz, .loop
-	pop af
-	ld [hl], a
-	ld de, LYOverridesBackup
-	ld hl, wSurfWaveBGEffect
-	ld bc, $0
-.loop2
-	ld a, [hLYOverrideStart]
-	cp e
-	jr nc, .load_zero
-	push hl
-	add hl, bc
-	ld a, [hl]
-	pop hl
-	jr .okay
-
-.load_zero
-	xor a
-.okay
-	ld [de], a
-	ld a, c
-	inc a
-	and $3f
-	ld c, a
-	inc de
-	ld a, e
-	cp $5f
-	jr c, .loop2
-	ret
-
-BattleBGEffect_Whirlpool: ; c8599 (32:4599)
-	call BattleBGEffects_AnonJumptable
-.anon_dw
-	dw .zero
-	dw .one
-	dw .two
-
-
-.zero
-	call BattleBGEffects_IncrementJumptable
-	call BattleBGEffects_ClearLYOverrides
-	ld a, rSCY - $ff00
-	ld [hLCDCPointer], a
-	xor a
-	ld [hLYOverrideStart], a
-	ld a, $5e
-	ld [hLYOverrideEnd], a
-	lb de, 2, 2
-	call Functionc8f2e
-	ret
-
-.one
-	call BattleBGEffect_WavyScreenFX
-	ret
-
-.two
-	call BattleAnim_ResetLCDStatCustom
-	ret
-
-BattleBGEffect_30: ; c85c2 (32:45c2)
-	call BattleBGEffects_ClearLYOverrides
-	ld a, rSCY - $ff00
-	call BattleBGEffect_SetLCDStatCustoms1
-	call EndBattleBGEffect
-	ret
-
-BattleBGEffect_31: ; c85ce (32:45ce)
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld a, [hl]
-	ld e, a
-	add $4
-	ld [hl], a
-	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
-	add hl, bc
-	ld a, [hl]
-	and $f0
-	swap a
-	xor $ff
-	add $4
-	ld d, a
-	ld hl, BG_EFFECT_STRUCT_JT_INDEX
-	add hl, bc
-	ld a, [hl]
-	ld [wBattleAnimTemp0], a
-	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
-	add hl, bc
-	ld a, [hl]
-	cp $20
-	jr nc, .done
-	inc [hl]
-	inc [hl]
-	call Functionc8f9a
-	ret
-
-.done
-	call BattleBGEffects_ClearLYOverrides
-	call EndBattleBGEffect
-	ret
-
-BattleBGEffect_32: ; c8603 (32:4603)
-	call BattleAnim_ResetLCDStatCustom
-	ret
-
-BattleBGEffect_Psychic: ; c8607 (32:4607)
-	call BattleBGEffects_AnonJumptable
-.anon_dw
-	dw .zero
-	dw .one
-	dw .two
-
-
-.zero
-	call BattleBGEffects_IncrementJumptable
-	call BattleBGEffects_ClearLYOverrides
-	ld a, rSCX - $ff00
-	ld [hLCDCPointer], a
-	xor a
-	ld [hLYOverrideStart], a
-	ld a, $5f
-	ld [hLYOverrideEnd], a
-	lb de, 6, 5
-	call Functionc8f2e
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld [hl], $0
-	ret
-
-.one
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld a, [hl]
-	inc [hl]
-	and $3
-	ret nz
-	call BattleBGEffect_WavyScreenFX
-	ret
-
-.two
-	call BattleAnim_ResetLCDStatCustom
-	ret
-
-BattleBGEffect_Teleport: ; c863f (32:463f)
-	call BattleBGEffects_AnonJumptable
-.anon_dw
-	dw .zero
-	dw .one
-	dw .two
-
-
-.zero
-	call BattleBGEffects_IncrementJumptable
-	call BattleBGEffects_ClearLYOverrides
-	ld a, rSCX - $ff00
-	call BattleBGEffect_SetLCDStatCustoms1
-	lb de, 6, 5
-	call Functionc8f2e
-	ret
-
-.one
-	call BattleBGEffect_WavyScreenFX
-	ret
-
-.two
-	call BattleAnim_ResetLCDStatCustom
-	ret
-
-BattleBGEffect_NightShade: ; c8662 (32:4662)
-	call BattleBGEffects_AnonJumptable
-.anon_dw
-	dw .zero
-	dw .one
-	dw .two
-
-
-.zero
-	call BattleBGEffects_IncrementJumptable
-	call BattleBGEffects_ClearLYOverrides
-	ld a, rSCY - $ff00
-	call BattleBGEffect_SetLCDStatCustoms1
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld e, [hl]
-	ld d, 2
-	call Functionc8f2e
-	ret
-
-.one
-	call BattleBGEffect_WavyScreenFX
-	ret
-
-.two
-	call BattleAnim_ResetLCDStatCustom
-	ret
-
-BattleBGEffect_DoubleTeam: ; c8689 (32:4689)
-	call BattleBGEffects_AnonJumptable
-.anon_dw
-	dw .zero
-	dw .one
-	dw .two
-	dw .three
-	dw .four
-	dw .five
-
-
-.zero
-	call BattleBGEffects_IncrementJumptable
-	call BattleBGEffects_ClearLYOverrides
-	ld a, rSCX - $ff00
-	call BattleBGEffect_SetLCDStatCustoms1
-	ld a, [hLYOverrideEnd]
-	inc a
-	ld [hLYOverrideEnd], a
-	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
-	add hl, bc
-	ld [hl], $0
-	ret
-
-.one
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld a, [hl]
-	cp $10
-	jr nc, .next
-	inc [hl]
-	call .UpdateLYOverrides
-	ret
-
-.three
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld a, [hl]
-	cp $ff
-	jr z, .next
-	dec [hl]
-	call .UpdateLYOverrides
-	ret
-
-.next
-	call BattleBGEffects_IncrementJumptable
-	ret
-
-.two
-	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
-	add hl, bc
-	ld a, [hl]
-	ld d, $2
-	call BattleBGEffects_Sine
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	add [hl]
-	call .UpdateLYOverrides
-	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
-	add hl, bc
-	ld a, [hl]
-	add $4
-	ld [hl], a
-
-.four
-	ret
-
-.UpdateLYOverrides:
-	ld e, a
-	xor $ff
-	inc a
-	ld d, a
-	ld h, HIGH(LYOverridesBackup)
-	ld a, [hLYOverrideStart]
-	ld l, a
-	ld a, [hLYOverrideEnd]
-	sub l
-	srl a
-	push af
-.loop
-	ld [hl], e
-	inc hl
-	ld [hl], d
-	inc hl
-	dec a
-	jr nz, .loop
-	pop af
-	ret nc
-	ld [hl], e
-	ret
-
-.five
-	call BattleAnim_ResetLCDStatCustom
-	ret
-
-BattleBGEffect_AcidArmor: ; c8709 (32:4709)
-	call BattleBGEffects_AnonJumptable
-.anon_dw
-	dw .zero
-	dw .one
-	dw .two
-
-
-.zero
-	call BattleBGEffects_IncrementJumptable
-	call BattleBGEffects_ClearLYOverrides
-	ld a, rSCY - $ff00
-	call BattleBGEffect_SetLCDStatCustoms1
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld e, [hl]
-	ld d, 2
-	call Functionc8f2e
-	ld h, HIGH(LYOverridesBackup)
-	ld a, [hLYOverrideEnd]
-	ld l, a
-	ld [hl], $0
-	dec l
-	ld [hl], $0
-	ret
-
-.one
-	ld a, [hLYOverrideEnd]
-	ld l, a
-	ld h, HIGH(LYOverridesBackup)
-	ld e, l
-	ld d, h
-	dec de
-.loop
-	ld a, [de]
-	dec de
-	ld [hld], a
-	ld a, [hLYOverrideStart]
-	cp l
-	jr nz, .loop
-	ld [hl], $90
-	ld a, [hLYOverrideEnd]
-	ld l, a
-	ld a, [hl]
-	cp $1
-	jr c, .okay
-	cp $90
-	jr z, .okay
-	ld [hl], $0
-.okay
-	dec l
-	ld a, [hl]
-	cp $2
-	ret c
-	cp $90
-	ret z
-	ld [hl], $0
-	ret
-
-.two
-	call BattleAnim_ResetLCDStatCustom
-	ret
-
-BattleBGEffect_Withdraw: ; c8761 (32:4761)
-	call BattleBGEffects_AnonJumptable
-.anon_dw
-	dw .zero
-	dw .one
-	dw .two
-
-
-.zero
-	call BattleBGEffects_IncrementJumptable
-	call BattleBGEffects_ClearLYOverrides
-	ld a, rSCY - $ff00
-	call BattleBGEffect_SetLCDStatCustoms1
-	ld a, [hLYOverrideEnd]
-	inc a
-	ld [hLYOverrideEnd], a
-	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
-	add hl, bc
-	ld [hl], $1
-	ret
-
-.one
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld a, [hl]
-	and $3f
-	ld d, a
-	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
-	add hl, bc
-	ld a, [hl]
-	cp d
-	ret nc
-	call BGEffect_DisplaceLYOverridesBackup
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld a, [hl]
-	rlca
-	rlca
-	and $3
-	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
-	add hl, bc
-	add [hl]
-	ld [hl], a
-	ret
-
-.two
-	call BattleAnim_ResetLCDStatCustom
-	ret
-
-BattleBGEffect_Dig: ; c87a7 (32:47a7)
-	call BattleBGEffects_AnonJumptable
-.anon_dw
-	dw .zero
-	dw .one
-	dw .two
-	dw .three
-
-
-.zero
-	call BattleBGEffects_IncrementJumptable
-	call BattleBGEffects_ClearLYOverrides
-	ld a, rSCY - $ff00
-	call BattleBGEffect_SetLCDStatCustoms1
-	ld a, [hLYOverrideEnd]
-	inc a
-	ld [hLYOverrideEnd], a
-	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
-	add hl, bc
-	ld [hl], $2
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld [hl], $0
-	ret
-
-.one
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld a, [hl]
-	and a
-	jr z, .next
-	dec [hl]
-	ret
-
-.next
-	ld [hl], $10
-	call BattleBGEffects_IncrementJumptable
-.two
-	ld a, [hLYOverrideStart]
-	ld l, a
-	ld a, [hLYOverrideEnd]
-	sub l
-	dec a
-	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
-	add hl, bc
-	cp [hl]
-	ret c
-	ld a, [hl]
-	push af
-	and $7
-	jr nz, .skip
-	ld hl, BG_EFFECT_STRUCT_JT_INDEX
-	add hl, bc
-	dec [hl]
-.skip
-	pop af
-	call BGEffect_DisplaceLYOverridesBackup
-	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
-	add hl, bc
-	inc [hl]
-	inc [hl]
-	ret
-
-.three
-	call BattleAnim_ResetLCDStatCustom
-	ret
-
-BattleBGEffect_Tackle: ; c8805 (32:4805)
-	call BattleBGEffects_AnonJumptable
-.anon_dw
-	dw .zero
-	dw Tackle_BGEffect25_2d_one
-	dw Tackle_BGEffect25_2d_two
-	dw .three
-
-
-.zero
-	call BattleBGEffects_IncrementJumptable
-	call BattleBGEffects_ClearLYOverrides
-	ld a, rSCX - $ff00
-	call BattleBGEffect_SetLCDStatCustoms1
-	ld a, [hLYOverrideEnd]
-	inc a
-	ld [hLYOverrideEnd], a
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld [hl], $0
-	call BGEffect_CheckBattleTurn
-	jr nz, .player_side
-	ld a, 2
-	jr .okay
-
-.player_side
-	ld a, -2
-.okay
-	ld [hl], a
-	ret
-
-.three
-	call BattleAnim_ResetLCDStatCustom
-	ret
-
-BattleBGEffect_25: ; c8837 (32:4837)
-	call BattleBGEffects_AnonJumptable
-.anon_dw
-	dw .zero
-	dw Tackle_BGEffect25_2d_one
-	dw Tackle_BGEffect25_2d_two
-	dw .three
-
-
-.zero
-	call BattleBGEffects_IncrementJumptable
-	call BattleBGEffects_ClearLYOverrides
-	ld a, rSCX - $ff00
-	call BattleBGEffect_SetLCDStatCustoms2
-	ld a, [hLYOverrideEnd]
-	inc a
-	ld [hLYOverrideEnd], a
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld [hl], $0
-	call BGEffect_CheckBattleTurn
-	jr nz, .player_side
-	ld a,  2
-	jr .okay
-
-.player_side
-	ld a, -2
-.okay
-	ld [hl], a
-	ret
-
-.three
-	call BattleAnim_ResetLCDStatCustom
-	ret
-
-Tackle_BGEffect25_2d_one:
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld a, [hl]
-	cp -8
-	jr z, .reached_limit
-	cp  8
-	jr nz, .finish
-.reached_limit
-	call BattleBGEffects_IncrementJumptable
-.finish
-	call Functionc88a5
-	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
-	add hl, bc
-	ld a, [hl]
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	add [hl]
-	ld [hl], a
-	ret
-
-Tackle_BGEffect25_2d_two:
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld a, [hl]
-	and a
-	jr nz, .asm_c8893
-	call BattleBGEffects_IncrementJumptable
-.asm_c8893
-	call Functionc88a5
-	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
-	add hl, bc
-	ld a, [hl]
-	xor $ff
-	inc a
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	add [hl]
-	ld [hl], a
-	ret
-
-Functionc88a5: ; c88a5 (32:48a5)
-	push af
-	ld a, [FXAnimID + 1] ; FXAnimID + 1
-	or a
-	jr nz, .not_rollout
-	ld a, [FXAnimID] ; FXAnimID
-	cp ROLLOUT
-	jr z, .rollout
-.not_rollout
-	pop af
-	jp BGEffect_FillLYOverridesBackup
-
-.rollout
-	ld a, [hLYOverrideStart]
-	ld d, a
-	ld a, [hLYOverrideEnd]
-	sub d
-	ld d, a
-	ld h, HIGH(LYOverridesBackup)
-	ld a, [hSCY]
-	or a
-	jr nz, .skip1
-	ld a, [hLYOverrideStart]
-	or a
-	jr z, .skip2
-	dec a
-	ld l, a
-	ld [hl], $0
-	jr .skip2
-
-.skip1
-	ld a, [hLYOverrideEnd]
-	dec a
-	ld l, a
-	ld [hl], $0
-.skip2
-	ld a, [hSCY]
-	ld l, a
-	ld a, [hLYOverrideStart]
-	sub l
-	jr nc, .skip3
-	xor a
-	dec d
-.skip3
-	ld l, a
-	pop af
-.loop
-	ld [hli], a
-	dec d
-	jr nz, .loop
-	ret
-
-BattleBGEffect_2d: ; c88e7 (32:48e7)
-	call BattleBGEffects_AnonJumptable
-.anon_dw
-	dw BGEffect2d_2f_zero
-	dw Tackle_BGEffect25_2d_one
-	dw Tackle_BGEffect25_2d_two
-	dw .three
-
-
-.three
-	call BattleAnim_ResetLCDStatCustom
-	ret
-
-BGEffect2d_2f_zero:
-	call BattleBGEffects_IncrementJumptable
-	call BattleBGEffects_ClearLYOverrides
-	ld a, rSCX - $ff00
-	call BattleBGEffect_SetLCDStatCustoms1
-	ld a, [hLYOverrideEnd]
-	inc a
-	ld [hLYOverrideEnd], a
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld [hl], $0
-	call BGEffect_CheckBattleTurn
-	jr nz, .player_turn
-	ld a, -2
-	jr .okay
-
-.player_turn
-	ld a, 2
-.okay
-	ld [hl], a
-	ret
-
-BattleBGEffect_2f: ; c8919 (32:4919)
-	call BattleBGEffects_AnonJumptable
-.anon_dw
-	dw BGEffect2d_2f_zero
-	dw Tackle_BGEffect25_2d_one
-	dw .two
-	dw Tackle_BGEffect25_2d_two
-	dw .four
-
-.four
-	call BattleAnim_ResetLCDStatCustom
-.two
-	ret
-
-BattleBGEffect_26: ; c892a (32:492a)
-	call BattleBGEffects_AnonJumptable
-.anon_dw
-	dw .zero
-	dw .one
-	dw .two
-
-
-.zero
-	call BattleBGEffects_IncrementJumptable
-	call BattleBGEffects_ClearLYOverrides
-	ld a, rSCX - $ff00
-	call BattleBGEffect_SetLCDStatCustoms1
-	ld a, [hLYOverrideEnd]
-	inc a
-	ld [hLYOverrideEnd], a
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld [hl], $0
-	ret
-
-.one
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld a, [hl]
-	ld d, $8
-	call BattleBGEffects_Sine
-	call BGEffect_FillLYOverridesBackup
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld a, [hl]
-	add $4
-	ld [hl], a
-	ret
-
-.two
-	call BattleAnim_ResetLCDStatCustom
-	ret
-
-BattleBGEffect_2c: ; c8964 (32:4964)
-	call BattleBGEffects_AnonJumptable
-.anon_dw
-	dw .zero
-	dw .one
-	dw .two
-
-
-.zero
-	call BattleBGEffects_IncrementJumptable
-	call BattleBGEffects_ClearLYOverrides
-	ld a, rSCX - $ff00
-	call BattleBGEffect_SetLCDStatCustoms1
-	ld a, [hLYOverrideEnd]
-	inc a
-	ld [hLYOverrideEnd], a
-	xor a
-	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
-	add hl, bc
-	ld [hli], a
-	ld [hl], a
-	ret
-
-.one
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld a, [hl]
-	ld d, $6
-	call BattleBGEffects_Sine
-	push af
-	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
-	add hl, bc
-	ld a, [hl]
-	ld d, $2
-	call BattleBGEffects_Sine
-	ld e, a
-	pop af
-	add e
-	call BGEffect_FillLYOverridesBackup
-	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
-	add hl, bc
-	ld a, [hl]
-	add $8
-	ld [hl], a
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld a, [hl]
-	add $2
-	ld [hl], a
-	ret
-
-.two
-	call BattleAnim_ResetLCDStatCustom
-	ret
-
-BattleBGEffect_28: ; c89b5 (32:49b5)
-	call BattleBGEffects_AnonJumptable
-.anon_dw
-	dw .zero
-	dw .one
-	dw .two
-
-
-.zero
-	call BattleBGEffects_IncrementJumptable
-	call BattleBGEffects_ClearLYOverrides
-	ld a, rSCX - $ff00
-	call BattleBGEffect_SetLCDStatCustoms1
-	ret
-
-.one
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld a, [hl]
-	cp $20
-	ret nc
-	inc [hl]
-	ld d, a
-	ld e, 4
-	call Functionc8f2e
-	ret
-
-.two
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld a, [hl]
-	and a
-	jr z, .reset
-	dec [hl]
-	ld d, a
-	ld e, 4
-	call Functionc8f2e
-	ret
-
-.reset
-	call BattleAnim_ResetLCDStatCustom
-	ret
-
-BattleBGEffect_BounceDown: ; c89ee (32:49ee)
-	call BattleBGEffects_AnonJumptable
-.anon_dw
-	dw .zero
-	dw .one
-	dw .two
-
-
-.zero
-	call BattleBGEffects_IncrementJumptable
-	call BattleBGEffects_ClearLYOverrides
-	ld a, rSCY - $ff00
-	call BattleBGEffect_SetLCDStatCustoms2
-	ld a, [hLYOverrideEnd]
-	inc a
-	ld [hLYOverrideEnd], a
-	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
-	add hl, bc
-	ld [hl], $1
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld [hl], $20
-	ret
-
-.one
-	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
-	add hl, bc
-	ld a, [hl]
-	cp $38
-	ret nc
-	push af
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld a, [hl]
-	ld d, $10
-	call BattleBGEffects_Cosine
-	add $10
-	ld d, a
-	pop af
-	add d
-	call BGEffect_DisplaceLYOverridesBackup
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	inc [hl]
-	inc [hl]
-	ret
-
-.two
-	call BattleAnim_ResetLCDStatCustom
-	ret
-
-BattleBGEffect_2a: ; c8a3a (32:4a3a)
-	call BattleBGEffects_AnonJumptable
-.anon_dw
-	dw .zero
-	dw .one
-	dw .two
-	dw .three
-	dw .four
-	dw .five
-
-.zero
-	call BattleBGEffects_IncrementJumptable
-	ld a, $e4
-	call BattleBGEffects_SetLYOverrides
-	ld a, $47
-	call BattleBGEffect_SetLCDStatCustoms1
-	ld a, [hLYOverrideEnd]
-	inc a
-	ld [hLYOverrideEnd], a
-	ld a, [hLYOverrideStart]
-	ld l, a
-	ld h, HIGH(LYOverridesBackup)
-.loop
-	ld a, [hLYOverrideEnd]
-	cp l
-	jr z, .done
-	xor a
-	ld [hli], a
-	jr .loop
-
-.done
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld [hl], $0
-.one
-.four
-	ret
-
-.two
-	call .GetLYOverride
-	jr nc, .next
-	call .SetLYOverridesBackup
-	ret
-
-.next
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld [hl], $0
-	ld a, [hLYOverrideStart]
-	inc a
-	ld [hLYOverrideStart], a
-	call BattleBGEffects_IncrementJumptable
-	ret
-
-.three
-	call .GetLYOverride
-	jr nc, .finish
-	call .SetLYOverridesBackup
-	ld a, [hLYOverrideEnd]
-	dec a
-	ld l, a
-	ld [hl], e
-	ret
-
-.finish
-	call BattleBGEffects_IncrementJumptable
-	ret
-
-.SetLYOverridesBackup:
-	ld e, a
-	ld a, [hLYOverrideStart]
-	ld l, a
-	ld a, [hLYOverrideEnd]
-	sub l
-	srl a
-	ld h, HIGH(LYOverridesBackup)
-.loop2
-	ld [hl], e
-	inc hl
-	inc hl
-	dec a
-	jr nz, .loop2
-	ret
-
-.five
-	call BattleBGEffects_ResetVideoHRAM
-	ret
-
-.GetLYOverride:
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld a, [hl]
-	inc [hl]
-	srl a
-	srl a
-	srl a
-	ld e, a
-	ld d, 0
-	ld hl, .data
-	add hl, de
-	ld a, [hl]
-	cp $ff
-	ret
-
-.data
-	db $00, $40, $90, $e4
-	db -1
-; c8acc
-
-BattleBGEffect_2b: ; c8acc (32:4acc)
-	call BattleBGEffects_AnonJumptable
-.anon_dw
-	dw .zero
-	dw .one
-
-
-.zero
-	call BattleBGEffects_IncrementJumptable
-	call BattleBGEffects_ClearLYOverrides
-	ld a, rSCX - $ff00
-	call BattleBGEffect_SetLCDStatCustoms1
-	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
-	add hl, bc
-	ld [hl], $40
-	ret
-
-.one
-	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
-	add hl, bc
-	ld a, [hl]
-	and a
-	jr z, .done
-	dec [hl]
-	srl a
-	srl a
-	srl a
-	and $f
-	ld d, a
-	ld e, a
-	call Functionc8f2e
-	ret
-
-.done
-	call BattleAnim_ResetLCDStatCustom
-	ret
-
-BattleBGEffect_1c: ; c8b00 (32:4b00)
-	ld a, [hCGB]
-	and a
-	jr nz, .cgb
-	call BattleBGEffects_AnonJumptable
-.anon_dw
-	dw .zero
-	dw .one
-	dw .two
-
-
-.zero
-	call BattleBGEffects_IncrementJumptable
-	ld a, $e4
-	call BattleBGEffects_SetLYOverrides
-	ld a, rBGP - $ff00
-	ld [hLCDCPointer], a
-	xor a
-	ld [hLYOverrideStart], a
-	ld a, $60
-	ld [hLYOverrideEnd], a
-	ret
-
-.one
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld a, [hl]
-	inc [hl]
-	ld e, a
-	and $7
-	ret nz
-	ld a, e
-	and $18
-	sla a
-	swap a
-	sla a
-	ld e, a
-	ld d, $0
-	push bc
-	call BGEffect_CheckBattleTurn
-	jr nz, .player
-	ld hl, .CGB_DMGEnemyData
-	add hl, de
-	ld a, [hli]
-	ld [wOBP1], a
-	ld d, a
-	ld e, [hl]
-	lb bc, $2f, $30
-	jr .okay
-
-.player
-	ld hl, .DMG_PlayerData
-	add hl, de
-	ld d, [hl]
-	inc hl
-	ld a, [hl]
-	ld [wOBP1], a
-	ld e, a
-	lb bc, $37, $28
-.okay
-	call .DMG_LYOverrideLoads
-	pop bc
-	ret
-
-.two
-	call BattleBGEffects_ResetVideoHRAM
-	ld a, $e4
-	ld [wBGP], a
-	ld [wOBP1], a
-	ret
-
-.DMG_LYOverrideLoads:
-	ld hl, LYOverridesBackup
-.loop1
-	ld [hl], d
-	inc hl
-	dec b
-	jr nz, .loop1
-.loop2
-	ld [hl], e
-	inc hl
-	dec c
-	jr nz, .loop2
-	ret
-
-.cgb
-	ld de, .Jumptable
-	call BatttleBGEffects_GetNamedJumptablePointer
-	jp hl
-
-.Jumptable:
-	dw .cgb_zero
-	dw .cgb_one
-	dw .cgb_two
-.cgb_zero
-	call BattleBGEffects_IncrementJumptable
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld [hl], $0
-	ret
-
-.cgb_one
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld a, [hl]
-	inc [hl]
-	ld e, a
-	and $7
-	ret nz
-	ld a, e
-	and $18
-	sla a
-	swap a
-	sla a
-	ld e, a
-	ld d, 0
-	call BGEffect_CheckBattleTurn
-	jr nz, .player_2
-	ld hl, .CGB_DMGEnemyData
-	add hl, de
-	ld a, [hli]
-	push hl
-	call BGEffects_LoadBGPal1_OBPal0
-	pop hl
-	ld a, [hl]
-	call BGEffects_LoadBGPal0_OBPal1
-	ret
-
-.player_2
-	ld hl, .CGB_DMGEnemyData
-	add hl, de
-	ld a, [hli]
-	push hl
-	call BGEffects_LoadBGPal0_OBPal1
-	pop hl
-	ld a, [hl]
-	call BGEffects_LoadBGPal1_OBPal0
-	ret
-
-.cgb_two
-	ld a, $e4
-	call BGEffects_LoadBGPal0_OBPal1
-	ld a, $e4
-	call BGEffects_LoadBGPal1_OBPal0
-	call EndBattleBGEffect
-	ret
-
-.CGB_DMGEnemyData:
-	db $e4, $e4
-	db $f8, $90
-	db $fc, $40
-	db $f8, $90
-.DMG_PlayerData:
-	db $e4, $e4
-	db $90, $f8
-	db $40, $fc
-	db $90, $f8
-; c8be8
-
-BattleBGEffect_RapidFlash: ; c8be8 (32:4be8)
-	ld de, .FlashPals
-	call BGEffect_RapidCyclePals
-	ret
-
-.FlashPals:
-	db $e4, $6c, $fe
-; c8bf2
-
-BattleBGEffect_16: ; c8bf2 (32:4bf2)
-	ld de, .Pals
-	call BGEffect_RapidCyclePals
-	ret
-
-.Pals:
-	db $e4, $90, $40, $ff
-; c8bfd
-
-BattleBGEffect_17: ; c8bfd (32:4bfd)
-	ld de, .Pals
-	call BGEffect_RapidCyclePals
-	ret
-
-.Pals:
-	db $e4, $f8, $fc, $ff
-; c8c08
-
-BattleBGEffect_18: ; c8c08 (32:4c08)
-	ld de, .Pals
-	call BGEffect_RapidCyclePals
-	ret
-
-.Pals:
-	db $e4, $90, $40, $90, $fe
-; c8c14
-
-BattleBGEffect_19: ; c8c14 (32:4c14)
-	ld de, .Pals
-	call BGEffect_RapidCyclePals
-	ret
-
-.Pals:
-	db $e4, $f8, $fc, $f8, $fe
-; c8c20
-
-BattleBGEffect_1a: ; c8c20 (32:4c20)
-	ld de, .Pals
-	call BGEffect_RapidCyclePals
-	ret
-
-.Pals:
-	db $e4, $f8, $fc, $f8, $e4, $90, $40, $90, $fe
-; c8c30
-
-BattleBGEffect_1b: ; c8c30 (32:4c30)
-	ld de, .Pals
-	call BGEffect_RapidCyclePals
-	ret
-
-.Pals:
-	db $e4, $fc, $e4, $00, $fe
-; c8c3c
-
-BattleBGEffect_1d: ; c8c3c (32:4c3c)
-	ld de, .Pals
-	call BGEffect_RapidCyclePals
-	ret
-
-.Pals:
-	db $e4, $90, $40, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $40, $90, $e4, $ff
-; c8c55
-
-BattleBGEffect_1e: ; c8c55 (32:4c55)
-	ld de, .Pals
-	call BGEffect_RapidCyclePals
-	ret
-
-.Pals:
-	db $00, $40, $90, $e4, $ff
-; c8c61
-
-BattleBGEffect_VibrateMon: ; c8c61 (32:4c61)
-	call BattleBGEffects_AnonJumptable
-.anon_dw
-	dw .zero
-	dw .one
-
-
-.zero ; c8c68 (32:4c68)
-	call BattleBGEffects_IncrementJumptable
-	call BattleBGEffects_ClearLYOverrides
-	ld a, rSCX - $ff00
-	call BattleBGEffect_SetLCDStatCustoms1
-	ld a, [hLYOverrideEnd]
-	inc a
-	ld [hLYOverrideEnd], a
-	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
-	add hl, bc
-	ld [hl], $1
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld [hl], $20
-	ret
-
-.one ; c8c85 (32:4c85)
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld a, [hl]
-	and a
-	jr z, .finish
-	dec [hl]
-	and $1
-	ret nz
-	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
-	add hl, bc
-	ld a, [hl]
-	xor $ff
-	inc a
-	ld [hl], a
-	call BGEffect_FillLYOverridesBackup
-	ret
-
-.finish
-	call BattleAnim_ResetLCDStatCustom
-	ret
-
-BattleBGEffect_WobbleMon: ; c8ca2 (32:4ca2)
-	call BattleBGEffects_AnonJumptable
-.anon_dw
-	dw .zero
-	dw .one
-	dw .two
-
-
-.zero ; c8cab (32:4cab)
-	call BattleBGEffects_IncrementJumptable
-	call BattleBGEffects_ClearLYOverrides
-	ld a, rSCX - $ff00
-	ld [hLCDCPointer], a
-	xor a
-	ld [hLYOverrideStart], a
-	ld a, $37
-	ld [hLYOverrideEnd], a
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld [hl], $0
-	ret
-
-.one ; c8cc3 (32:4cc3)
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld a, [hl]
-	cp $40
-	jr nc, .two
-	ld d, $6
-	call BattleBGEffects_Sine
-	call BGEffect_FillLYOverridesBackup
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld a, [hl]
-	add $2
-	ld [hl], a
-	ret
-
-.two ; c8cdd (32:4cdd)
-	call BattleAnim_ResetLCDStatCustom
-	ret
-
-BattleBGEffect_2e: ; c8ce1 (32:4ce1)
-	call Functionc8d0b
-	jr c, .xor_a
-	bit 7, a
-	jr z, .okay
-.xor_a
-	xor a
-.okay
-	push af
-	call DelayFrame
-	pop af
-	ld [hSCY], a
-	xor $ff
-	inc a
-	ld [AnimObject01_YOffset], a
-	ret
-
-BattleBGEffect_1f: ; c8cf9 (32:4cf9)
-	call Functionc8d0b
-	jr nc, .skip
-	xor a
-.skip
-	ld [hSCX], a
-	ret
-
-BattleBGEffect_20: ; c8d02 (32:4d02)
-	call Functionc8d0b
-	jr nc, .skip
-	xor a
-.skip
-	ld [hSCY], a
-	ret
-
-Functionc8d0b: ; c8d0b (32:4d0b)
-	ld hl, BG_EFFECT_STRUCT_JT_INDEX
-	add hl, bc
-	ld a, [hl]
-	and a
-	jr nz, .okay
-	call EndBattleBGEffect
-	scf
-	ret
-
-.okay
-	dec [hl]
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld a, [hl]
-	and $f
-	jr z, .every_16_frames
-	dec [hl]
-	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
-	add hl, bc
-	ld a, [hl]
-	and a
-	ret
-
-.every_16_frames
-	ld a, [hl]
-	swap a
-	or [hl]
-	ld [hl], a
-	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
-	add hl, bc
-	ld a, [hl]
-	xor $ff
-	inc a
-	ld [hl], a
-	and a
-	ret
-
-BattleBGEffect_35: ; c8d3a (32:4d3a)
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld a, [hl]
-	cp $40
-	jr nc, .finish
-	ld d, $6
-	call BattleBGEffects_Sine
-	ld [hSCX], a
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld a, [hl]
-	add $2
-	ld [hl], a
-	ret
-
-.finish
-	xor a
-	ld [hSCX], a
-	ret
-
-BattleBGEffect_GetNthDMGPal: ; c8d57 (32:4d57)
-	ld hl, BG_EFFECT_STRUCT_JT_INDEX
-	add hl, bc
-	ld a, [hl]
-	and a
-	jr z, .zero
-	dec [hl]
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld a, [hl]
-	call BattleBGEffect_GetNextDMGPal
-	ret
-
-.zero
-	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
-	add hl, bc
-	ld a, [hl]
-	ld hl, BG_EFFECT_STRUCT_JT_INDEX
-	add hl, bc
-	ld [hl], a
-	call BattleBGEffect_GetFirstDMGPal
-	ret
-
-BGEffect_RapidCyclePals: ; c8d77 (32:4d77)
-	ld a, [hCGB]
-	and a
-	jr nz, .cgb
-	push de
-	ld de, .Jumptable_DMG
-	call BatttleBGEffects_GetNamedJumptablePointer
-	pop de
-	jp hl
-
-.Jumptable_DMG:
-	dw .zero_dmg
-	dw .one_dmg
-	dw .two_dmg
-
-
-.zero_dmg ; c8d8b (32:4d8b)
-	call BattleBGEffects_IncrementJumptable
-	ld a, $e4
-	call BattleBGEffects_SetLYOverrides
-	ld a, $47
-	call BattleBGEffect_SetLCDStatCustoms1
-	ld a, [hLYOverrideEnd]
-	inc a
-	ld [hLYOverrideEnd], a
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld a, [hl]
-	ld [hl], $0
-	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
-	add hl, bc
-	ld [hl], a
-	ret
-
-.one_dmg ; c8daa (32:4daa)
-	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
-	add hl, bc
-	ld a, [hl]
-	and $f
-	jr z, .okay_1_dmg
-	dec [hl]
-	ret
-
-.okay_1_dmg
-	ld a, [hl]
-	swap a
-	or [hl]
-	ld [hl], a
-	call BattleBGEffect_GetFirstDMGPal
-	jr c, .okay_2_dmg
-	call BGEffect_FillLYOverridesBackup
-	ret
-
-.okay_2_dmg
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	dec [hl]
-	ret
-
-.two_dmg ; c8dc9 (32:4dc9)
-	call BattleBGEffects_ResetVideoHRAM
-	ld a, %11100100
-	ld [rBGP], a
-	call EndBattleBGEffect
-	ret
-
-.cgb
-	push de
-	ld de, .Jumptable_CGB
-	call BatttleBGEffects_GetNamedJumptablePointer
-	pop de
-	jp hl
-
-.Jumptable_CGB: ; c8ddd (32:4ddd)
-	dw .zero_cgb
-	dw .one_cgb
-	dw .two_cgb
-	dw .three_cgb
-	dw .four_cgb
-
-
-.zero_cgb ; c8de7 (32:4de7)
-	call BGEffect_CheckBattleTurn
-	jr nz, .player_turn_cgb
-	call BattleBGEffects_IncrementJumptable
-	call BattleBGEffects_IncrementJumptable
-.player_turn_cgb
-	call BattleBGEffects_IncrementJumptable
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld a, [hl]
-	ld [hl], $0
-	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
-	add hl, bc
-	ld [hl], a
-	ret
-
-.one_cgb ; c8e02 (32:4e02)
-	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
-	add hl, bc
-	ld a, [hl]
-	and $f
-	jr z, .okay_1_cgb
-	dec [hl]
-	ret
-
-.okay_1_cgb
-	ld a, [hl]
-	swap a
-	or [hl]
-	ld [hl], a
-	call BattleBGEffect_GetFirstDMGPal
-	jr c, .okay_2_cgb
-	call BGEffects_LoadBGPal0_OBPal1
-	ret
-
-.okay_2_cgb
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	dec [hl]
-	ret
-
-.two_cgb ; c8e21 (32:4e21)
-	ld a, $e4
-	call BGEffects_LoadBGPal0_OBPal1
-	call EndBattleBGEffect
-	ret
-
-.three_cgb ; c8e2a (32:4e2a)
-	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
-	add hl, bc
-	ld a, [hl]
-	and $f
-	jr z, .okay_3_cgb
-	dec [hl]
-	ret
-
-.okay_3_cgb
-	ld a, [hl]
-	swap a
-	or [hl]
-	ld [hl], a
-	call BattleBGEffect_GetFirstDMGPal
-	jr c, .okay_4_cgb
-	call BGEffects_LoadBGPal1_OBPal0
-	ret
-
-.okay_4_cgb
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	dec [hl]
-	ret
-
-.four_cgb ; c8e49 (32:4e49)
-	ld a, $e4
-	call BGEffects_LoadBGPal1_OBPal0
-	call EndBattleBGEffect
-	ret
-
-BGEffects_LoadBGPal0_OBPal1: ; c8e52 (32:4e52)
-	ld h, a
-	ld a, [rSVBK]
-	push af
-	ld a, $5
-	ld [rSVBK], a
-	ld a, h
-	push bc
-	push af
-	ld hl, BGPals
-	ld de, UnknBGPals
-	ld b, a
-	ld c, $1
-	call CopyPals
-	ld hl, OBPals + 8
-	ld de, UnknOBPals + 8
-	pop af
-	ld b, a
-	ld c, $1
-	call CopyPals
-	pop bc
-	pop af
-	ld [rSVBK], a
-	ld a, $1
-	ld [hCGBPalUpdate], a
-	ret
-
-BGEffects_LoadBGPal1_OBPal0: ; c8e7f (32:4e7f)
-	ld h, a
-	ld a, [rSVBK]
-	push af
-	ld a, $5
-	ld [rSVBK], a
-	ld a, h
-	push bc
-	push af
-	ld hl, BGPals + 8
-	ld de, UnknBGPals + 8
-	ld b, a
-	ld c, $1
-	call CopyPals
-	ld hl, OBPals ; OBPals
-	ld de, UnknOBPals ; wd040
-	pop af
-	ld b, a
-	ld c, $1
-	call CopyPals
-	pop bc
-	pop af
-	ld [rSVBK], a
-	ld a, $1
-	ld [hCGBPalUpdate], a
-	ret
-
-BattleBGEffect_GetFirstDMGPal: ; c8eac (32:4eac)
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld a, [hl]
-	inc [hl]
-BattleBGEffect_GetNextDMGPal: ; c8eb2 (32:4eb2)
-	ld l, a
-	ld h, $0
-	add hl, de
-	ld a, [hl]
-	cp -1
-	jr z, .quit
-	cp -2
-	jr nz, .repeat
-	ld a, [de]
-	ld hl, BG_EFFECT_STRUCT_03
-	add hl, bc
-	ld [hl], $0
-.repeat
-	and a
-	ret
-
-.quit
-	scf
-	ret
-
-BattleBGEffects_ClearLYOverrides: ; c8eca (32:4eca)
-	xor a
-BattleBGEffects_SetLYOverrides: ; c8ecb (32:4ecb)
-	ld hl, LYOverrides ; wListPointer
-	ld e, $99
-.loop1
-	ld [hli], a
-	dec e
-	jr nz, .loop1
-	ld hl, LYOverridesBackup
-	ld e, $91
-.loop2
-	ld [hli], a
-	dec e
-	jr nz, .loop2
-	ret
-
-BattleBGEffect_SetLCDStatCustoms1: ; c8ede (32:4ede)
-	ld [hLCDCPointer], a
-	call BGEffect_CheckBattleTurn
-	jr nz, .player_turn
-	lb de, $00, $36
-	jr .okay
-
-.player_turn
-	lb de, $2f, $5e
-.okay
-	ld a, d
-	ld [hLYOverrideStart], a
-	ld a, e
-	ld [hLYOverrideEnd], a
-	ret
-
-BattleBGEffect_SetLCDStatCustoms2: ; c8ef4 (32:4ef4)
-	ld [hLCDCPointer], a
-	call BGEffect_CheckBattleTurn
-	jr nz, .player_turn
-	lb de, $00, $36
-	jr .okay
-
-.player_turn
-	lb de, $2d, $5e
-.okay
-	ld a, d
-	ld [hLYOverrideStart], a
-	ld a, e
-	ld [hLYOverrideEnd], a
-	ret
-
-BattleAnim_ResetLCDStatCustom: ; c8f0a (32:4f0a)
-	xor a
-	ld [hLYOverrideStart], a
-	ld [hLYOverrideEnd], a
-	call BattleBGEffects_ClearLYOverrides
-	xor a
-	ld [hLCDCPointer], a
-	call EndBattleBGEffect
-	ret
-
-BattleBGEffects_ResetVideoHRAM: ; c8f19 (32:4f19)
-	xor a
-	ld [hLCDCPointer], a
-	ld a, %11100100
-	ld [rBGP], a
-	ld [wBGP], a
-	ld [wOBP1], a
-	ld [hLYOverrideStart], a
-	ld [hLYOverrideEnd], a
-	call BattleBGEffects_ClearLYOverrides
-	ret
-
-Functionc8f2e: ; c8f2e (32:4f2e)
-	push bc
-	xor a
-	ld [wBattleAnimTemp0], a
-	ld a, e
-	ld [wBattleAnimTemp1], a
-	ld a, d
-	ld [wBattleAnimTemp2], a
-	ld a, $80
-	ld [wBattleAnimTemp3], a
-	ld bc, LYOverridesBackup
-.loop
-	ld a, [hLYOverrideStart]
-	cp c
-	jr nc, .next
-	ld a, [hLYOverrideEnd]
-	cp c
-	jr c, .next
-	ld a, [wBattleAnimTemp2]
-	ld d, a
-	ld a, [wBattleAnimTemp0]
-	call BattleBGEffects_Sine
-	ld [bc], a
-.next
-	inc bc
-	ld a, [wBattleAnimTemp1]
-	ld hl, wBattleAnimTemp0
-	add [hl]
-	ld [hl], a
-	ld hl, wBattleAnimTemp3
-	dec [hl]
-	jr nz, .loop
-	pop bc
-	ret
-
-InitSurfWaves: ; c8f69 (32:4f69)
-	push bc
-	xor a
-	ld [wBattleAnimTemp0], a
-	ld a, e
-	ld [wBattleAnimTemp1], a
-	ld a, d
-	ld [wBattleAnimTemp2], a
-	ld a, $40
-	ld [wBattleAnimTemp3], a
-	ld bc, wSurfWaveBGEffect
-.loop
-	ld a, [wBattleAnimTemp2]
-	ld d, a
-	ld a, [wBattleAnimTemp0]
-	call BattleBGEffects_Sine
-	ld [bc], a
-	inc bc
-	ld a, [wBattleAnimTemp1]
-	ld hl, wBattleAnimTemp0
-	add [hl]
-	ld [hl], a
-	ld hl, wBattleAnimTemp3
-	dec [hl]
-	jr nz, .loop
-	pop bc
-	ret
-
-Functionc8f9a: ; c8f9a (32:4f9a)
-	push bc
-	ld [wBattleAnimTemp3], a
-	ld a, e
-	ld [wBattleAnimTemp1], a
-	ld a, d
-	ld [wBattleAnimTemp2], a
-	call .GetLYOverrideBackupAddrOffset
-	ld hl, LYOverridesBackup
-	add hl, de
-	ld c, l
-	ld b, h
-.loop
-	ld a, [wBattleAnimTemp3]
-	and a
-	jr z, .done
-	dec a
-	ld [wBattleAnimTemp3], a
-	push af
-	ld a, [wBattleAnimTemp2]
-	ld d, a
-	ld a, [wBattleAnimTemp1]
-	push hl
-	call BattleBGEffects_Sine
-	ld e, a
-	pop hl
-	ld a, [hLYOverrideEnd]
-	cp c
-	jr c, .skip1
-	ld a, e
-	ld [bc], a
-	inc bc
-.skip1
-	ld a, [hLYOverrideStart]
-	cp l
-	jr nc, .skip2
-	ld [hl], e
-	dec hl
-.skip2
-	ld a, [wBattleAnimTemp1]
-	add $4
-	ld [wBattleAnimTemp1], a
-	pop af
-	jr .loop
-
-.done
-	pop bc
-	and a
-	ret
-
-.GetLYOverrideBackupAddrOffset:
-	ld a, [hLYOverrideStart]
-	ld e, a
-	ld a, [wBattleAnimTemp0]
-	add e
-	ld e, a
-	ld d, $0
-	ret
-
-BattleBGEffect_WavyScreenFX: ; c8fef (32:4fef)
-	push bc
-	ld a, [hLYOverrideStart]
-	ld l, a
-	inc a
-	ld e, a
-	ld h, HIGH(LYOverridesBackup)
-	ld d, h
-	ld a, [hLYOverrideEnd]
-	sub l
-	and a
-	jr z, .done
-	ld c, a
-	ld a, [hl]
-	push af
-.loop
-	ld a, [de]
-	inc de
-	ld [hli], a
-	dec c
-	jr nz, .loop
-	pop af
-	ld [hl], a
-.done
-	pop bc
-	ret
-
-BGEffect_FillLYOverridesBackup: ; c900b (32:500b)
-	push af
-	ld h, HIGH(LYOverridesBackup)
-	ld a, [hLYOverrideStart]
-	ld l, a
-	ld a, [hLYOverrideEnd]
-	sub l
-	ld d, a
-	pop af
-.loop
-	ld [hli], a
-	dec d
-	jr nz, .loop
-	ret
-
-BGEffect_DisplaceLYOverridesBackup: ; c901b (32:501b)
-	; e = a; d = [hLYOverrideEnd] - [hLYOverrideStart] - a
-	push af
-	ld e, a
-	ld a, [hLYOverrideStart]
-	ld l, a
-	ld a, [hLYOverrideEnd]
-	sub l
-	sub e
-	ld d, a
-	ld h, HIGH(LYOverridesBackup)
-	ld a, [hLYOverrideStart]
-	ld l, a
-	ld a, $90
-.loop
-	ld [hli], a
-	dec e
-	jr nz, .loop
-	pop af
-	xor $ff
-.loop2
-	ld [hli], a
-	dec d
-	jr nz, .loop2
-	ret
-
-BGEffect_CheckBattleTurn: ; c9038 (32:5038)
-	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
-	add hl, bc
-	ld a, [hBattleTurn]
-	and $1
-	xor [hl]
-	ret
-
-BGEffect_CheckFlyDigStatus: ; c9042 (32:5042)
-	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
-	add hl, bc
-	ld a, [hBattleTurn]
-	and $1
-	xor [hl]
-	jr nz, .player
-	ld a, [EnemySubStatus3] ; EnemySubStatus3
-	and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
-	ret
-
-.player
-	ld a, [PlayerSubStatus3] ; PlayerSubStatus3
-	and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
-	ret
-
-BattleBGEffects_CheckSGB: ; c9059 (32:5059)
-	ld a, [hSGB]
-	and a
-	ret
-
-BattleBGEffects_Sine: ; c905d (32:505d)
-	ld e, a
-	callfar BattleAnim_Sine_e
-	ld a, e
-	ret
-
-BattleBGEffects_Cosine: ; c9066 (32:5066)
-	ld e, a
-	callfar BattleAnim_Cosine_e
-	ld a, e
-	ret
-
-; c906f (32:506f)
--- a/battle/core.asm
+++ /dev/null
@@ -1,9511 +1,0 @@
-; Core components of the battle engine.
-BattleCore:
-DoBattle: ; 3c000
-	xor a
-	ld [wBattleParticipantsNotFainted], a
-	ld [wBattleParticipantsIncludingFainted], a
-	ld [wPlayerAction], a
-	ld [BattleEnded], a
-	inc a
-	ld [wBattleHasJustStarted], a
-	ld hl, OTPartyMon1HP
-	ld bc, PARTYMON_STRUCT_LENGTH - 1
-	ld d, BATTLEACTION_SWITCH1 - 1
-.loop
-	inc d
-	ld a, [hli]
-	or [hl]
-	jr nz, .alive
-	add hl, bc
-	jr .loop
-
-.alive
-	ld a, d
-	ld [wBattleAction], a
-	ld a, [wLinkMode]
-	and a
-	jr z, .not_linked
-
-	ld a, [hLinkPlayerNumber]
-	cp $2
-	jr z, .player_2
-
-.not_linked
-	ld a, [wBattleMode]
-	dec a
-	jr z, .wild
-	xor a
-	ld [wEnemySwitchMonIndex], a
-	call NewEnemyMonStatus
-	call ResetEnemyStatLevels
-	call BreakAttraction
-	call EnemySwitch
-
-.wild
-	ld c, 40
-	call DelayFrames
-
-.player_2
-	call LoadTileMapToTempTileMap
-	call CheckPlayerPartyForFitPkmn
-	ld a, d
-	and a
-	jp z, LostBattle
-	call Call_LoadTempTileMapToTileMap
-	ld a, [BattleType]
-	cp BATTLETYPE_DEBUG
-	jp z, .tutorial_debug
-	cp BATTLETYPE_TUTORIAL
-	jp z, .tutorial_debug
-	xor a
-	ld [CurPartyMon], a
-.loop2
-	call CheckIfCurPartyMonIsFitToFight
-	jr nz, .alive2
-	ld hl, CurPartyMon
-	inc [hl]
-	jr .loop2
-
-.alive2
-	ld a, [CurBattleMon]
-	ld [LastPlayerMon], a
-	ld a, [CurPartyMon]
-	ld [CurBattleMon], a
-	inc a
-	ld hl, PartySpecies - 1
-	ld c, a
-	ld b, 0
-	add hl, bc
-	ld a, [hl]
-	ld [CurPartySpecies], a
-	ld [TempBattleMonSpecies], a
-	hlcoord 1, 5
-	ld a, 9
-	call SlideBattlePicOut
-	call LoadTileMapToTempTileMap
-	call ResetBattleParticipants
-	call InitBattleMon
-	call ResetPlayerStatLevels
-	call SendOutPkmnText
-	call NewBattleMonStatus
-	call BreakAttraction
-	call SendOutPlayerMon
-	call EmptyBattleTextBox
-	call LoadTileMapToTempTileMap
-	call SetPlayerTurn
-	call SpikesDamage
-	ld a, [wLinkMode]
-	and a
-	jr z, .not_linked_2
-	ld a, [hLinkPlayerNumber]
-	cp $2
-	jr nz, .not_linked_2
-	xor a
-	ld [wEnemySwitchMonIndex], a
-	call NewEnemyMonStatus
-	call ResetEnemyStatLevels
-	call BreakAttraction
-	call EnemySwitch
-	call SetEnemyTurn
-	call SpikesDamage
-
-.not_linked_2
-	jp BattleTurn
-
-.tutorial_debug
-	jp BattleMenu
-; 3c0e5
-
-WildFled_EnemyFled_LinkBattleCanceled: ; 3c0e5
-	call Call_LoadTempTileMapToTileMap
-	ld a, [wBattleResult]
-	and $c0
-	add $2
-	ld [wBattleResult], a
-	ld a, [wLinkMode]
-	and a
-	ld hl, BattleText_WildFled
-	jr z, .print_text
-
-	ld a, [wBattleResult]
-	and $c0
-	ld [wBattleResult], a
-	ld hl, BattleText_EnemyFled
-	call CheckMobileBattleError
-	jr nc, .print_text
-
-	ld hl, wcd2a
-	bit 4, [hl]
-	jr nz, .skip_text
-
-	ld hl, BattleText_LinkErrorBattleCanceled
-
-.print_text
-	call StdBattleTextBox
-
-.skip_text
-	call StopDangerSound
-	call CheckMobileBattleError
-	jr c, .skip_sfx
-
-	ld de, SFX_RUN
-	call PlaySFX
-
-.skip_sfx
-	call SetPlayerTurn
-	ld a, 1
-	ld [BattleEnded], a
-	ret
-; 3c12f
-
-BattleTurn: ; 3c12f
-.loop
-	call MobileFn_3c1bf
-	call CheckContestBattleOver
-	jp c, .quit
-
-	xor a
-	ld [wPlayerIsSwitching], a
-	ld [wEnemyIsSwitching], a
-	ld [wBattleHasJustStarted], a
-	ld [wPlayerJustGotFrozen], a
-	ld [wEnemyJustGotFrozen], a
-	ld [CurDamage], a
-	ld [CurDamage + 1], a
-
-	call HandleBerserkGene
-	call UpdateBattleMonInParty
-	farcall AIChooseMove
-
-	call IsMobileBattle
-	jr nz, .not_disconnected
-	farcall Function100da5
-	farcall StartMobileInactivityTimer
-	farcall Function100dd8
-	jp c, .quit
-.not_disconnected
-
-	call CheckPlayerLockedIn
-	jr c, .skip_iteration
-.loop1
-	call BattleMenu
-	jr c, .quit
-	ld a, [BattleEnded]
-	and a
-	jr nz, .quit
-	ld a, [wForcedSwitch] ; roared/whirlwinded/teleported
-	and a
-	jr nz, .quit
-.skip_iteration
-	call ParsePlayerAction
-	jr nz, .loop1
-
-	call EnemyTriesToFlee
-	jr c, .quit
-
-	call DetermineMoveOrder
-	jr c, .false
-	call Battle_EnemyFirst
-	jr .proceed
-.false
-	call Battle_PlayerFirst
-.proceed
-	call CheckMobileBattleError
-	jr c, .quit
-
-	ld a, [wForcedSwitch]
-	and a
-	jr nz, .quit
-
-	ld a, [BattleEnded]
-	and a
-	jr nz, .quit
-
-	call HandleBetweenTurnEffects
-	ld a, [BattleEnded]
-	and a
-	jr nz, .quit
-	jp .loop
-
-.quit
-	ret
-; 3c1bf
-
-MobileFn_3c1bf: mobile
-	ld a, $5
-	call GetSRAMBank
-	ld hl, $a89b ; s5_a89b
-	inc [hl]
-	jr nz, .finish
-	dec hl
-	inc [hl]
-	jr nz, .finish
-	dec [hl]
-	inc hl
-	dec [hl]
-
-.finish
-	call CloseSRAM
-	ret
-; 3c1d6
-
-HandleBetweenTurnEffects: ; 3c1d6
-	ld a, [hLinkPlayerNumber]
-	cp $1
-	jr z, .CheckEnemyFirst
-	call CheckFaint_PlayerThenEnemy
-	ret c
-	call HandleFutureSight
-	call CheckFaint_PlayerThenEnemy
-	ret c
-	call HandleWeather
-	call CheckFaint_PlayerThenEnemy
-	ret c
-	call HandleWrap
-	call CheckFaint_PlayerThenEnemy
-	ret c
-	call HandlePerishSong
-	call CheckFaint_PlayerThenEnemy
-	ret c
-	jr .NoMoreFaintingConditions
-
-.CheckEnemyFirst:
-	call CheckFaint_EnemyThenPlayer
-	ret c
-	call HandleFutureSight
-	call CheckFaint_EnemyThenPlayer
-	ret c
-	call HandleWeather
-	call CheckFaint_EnemyThenPlayer
-	ret c
-	call HandleWrap
-	call CheckFaint_EnemyThenPlayer
-	ret c
-	call HandlePerishSong
-	call CheckFaint_EnemyThenPlayer
-	ret c
-
-.NoMoreFaintingConditions:
-	call HandleLeftovers
-	call HandleMysteryberry
-	call HanleDefrost
-	call HandleSafeguard
-	call HandleScreens
-	call HandleStatBoostingHeldItems
-	call HandleHealingItems
-	call UpdateBattleMonInParty
-	call LoadTileMapToTempTileMap
-	jp HandleEncore
-; 3c23c
-
-CheckFaint_PlayerThenEnemy: ; 3c23c
-	call HasPlayerFainted
-	jr nz, .PlayerNotFainted
-	call HandlePlayerMonFaint
-	ld a, [BattleEnded]
-	and a
-	jr nz, .BattleIsOver
-
-.PlayerNotFainted:
-	call HasEnemyFainted
-	jr nz, .BattleContinues
-	call HandleEnemyMonFaint
-	ld a, [BattleEnded]
-	and a
-	jr nz, .BattleIsOver
-
-.BattleContinues:
-	and a
-	ret
-
-.BattleIsOver:
-	scf
-	ret
-; 3c25c
-
-CheckFaint_EnemyThenPlayer: ; 3c25c
-	call HasEnemyFainted
-	jr nz, .EnemyNotFainted
-	call HandleEnemyMonFaint
-	ld a, [BattleEnded]
-	and a
-	jr nz, .BattleIsOver
-
-.EnemyNotFainted:
-	call HasPlayerFainted
-	jr nz, .BattleContinues
-	call HandlePlayerMonFaint
-	ld a, [BattleEnded]
-	and a
-	jr nz, .BattleIsOver
-
-.BattleContinues:
-	and a
-	ret
-
-.BattleIsOver:
-	scf
-	ret
-; 3c27c
-
-HandleBerserkGene: ; 3c27c
-	ld a, [hLinkPlayerNumber]
-	cp $1
-	jr z, .reverse
-
-	call .player
-	jr .enemy
-
-.reverse
-	call .enemy
-;	jr .player
-
-.player
-	call SetPlayerTurn
-	ld de, PartyMon1Item
-	ld a, [CurBattleMon]
-	ld b, a
-	jr .go
-
-.enemy
-	call SetEnemyTurn
-	ld de, OTPartyMon1Item
-	ld a, [CurOTMon]
-	ld b, a
-;	jr .go
-
-.go
-	push de
-	push bc
-	callfar GetUserItem
-	ld a, [hl]
-	ld [wd265], a
-	sub BERSERK_GENE
-	pop bc
-	pop de
-	ret nz
-
-	ld [hl], a
-
-	ld h, d
-	ld l, e
-	ld a, b
-	call GetPartyLocation
-	xor a
-	ld [hl], a
-	ld a, BATTLE_VARS_SUBSTATUS3
-	call GetBattleVarAddr
-	push af
-	set SUBSTATUS_CONFUSED, [hl]
-	ld a, BATTLE_VARS_MOVE_ANIM
-	call GetBattleVarAddr
-	push hl
-	push af
-	xor a
-	ld [hl], a
-	ld [AttackMissed], a
-	ld [EffectFailed], a
-	farcall BattleCommand_AttackUp2
-	pop af
-	pop hl
-	ld [hl], a
-	call GetItemName
-	ld hl, BattleText_UsersStringBuffer1Activated
-	call StdBattleTextBox
-	callfar BattleCommand_StatUpMessage
-	pop af
-	bit SUBSTATUS_CONFUSED, a
-	ret nz
-	xor a
-	ld [wNumHits], a
-	ld de, ANIM_CONFUSED
-	call Call_PlayBattleAnim_OnlyIfVisible
-	call SwitchTurnCore
-	ld hl, BecameConfusedText
-	jp StdBattleTextBox
-; 3c300
-
-EnemyTriesToFlee: ; 3c300
-	ld a, [wLinkMode]
-	and a
-	jr z, .not_linked
-	ld a, [wBattleAction]
-	cp BATTLEACTION_FORFEIT
-	jr z, .forfeit
-
-.not_linked
-	and a
-	ret
-
-.forfeit
-	call WildFled_EnemyFled_LinkBattleCanceled
-	scf
-	ret
-; 3c314
-
-DetermineMoveOrder: ; 3c314
-	ld a, [wLinkMode]
-	and a
-	jr z, .use_move
-	ld a, [wBattleAction]
-	cp BATTLEACTION_E
-	jr z, .use_move
-	cp BATTLEACTION_D
-	jr z, .use_move
-	sub BATTLEACTION_SWITCH1
-	jr c, .use_move
-	ld a, [wPlayerAction]
-	cp $2
-	jr nz, .switch
-	ld a, [hLinkPlayerNumber]
-	cp $2
-	jr z, .player_2
-
-	call BattleRandom
-	cp 1 + (50 percent)
-	jp c, .player_first
-	jp .enemy_first
-
-.player_2
-	call BattleRandom
-	cp 1 + (50 percent)
-	jp c, .enemy_first
-	jp .player_first
-
-.switch
-	callfar AI_Switch
-	call SetEnemyTurn
-	call SpikesDamage
-	jp .enemy_first
-
-.use_move
-	ld a, [wPlayerAction]
-	and a
-	jp nz, .player_first
-	call CompareMovePriority
-	jr z, .equal_priority
-	jp c, .player_first ; player goes first
-	jp .enemy_first
-
-.equal_priority
-	call SetPlayerTurn
-	callfar GetUserItem
-	push bc
-	callfar GetOpponentItem
-	pop de
-	ld a, d
-	cp HELD_QUICK_CLAW
-	jr nz, .player_no_quick_claw
-	ld a, b
-	cp HELD_QUICK_CLAW
-	jr z, .both_have_quick_claw
-	call BattleRandom
-	cp e
-	jr nc, .speed_check
-	jp .player_first
-
-.player_no_quick_claw
-	ld a, b
-	cp HELD_QUICK_CLAW
-	jr nz, .speed_check
-	call BattleRandom
-	cp c
-	jr nc, .speed_check
-	jp .enemy_first
-
-.both_have_quick_claw
-	ld a, [hLinkPlayerNumber]
-	cp $2
-	jr z, .player_2b
-	call BattleRandom
-	cp c
-	jp c, .enemy_first
-	call BattleRandom
-	cp e
-	jp c, .player_first
-	jr .speed_check
-
-.player_2b
-	call BattleRandom
-	cp e
-	jp c, .player_first
-	call BattleRandom
-	cp c
-	jp c, .enemy_first
-	jr .speed_check
-
-.speed_check
-	ld de, BattleMonSpeed
-	ld hl, EnemyMonSpeed
-	ld c, 2
-	call StringCmp
-	jr z, .speed_tie
-	jp nc, .player_first
-	jp .enemy_first
-
-.speed_tie
-	ld a, [hLinkPlayerNumber]
-	cp $2
-	jr z, .player_2c
-	call BattleRandom
-	cp 1 + (50 percent)
-	jp c, .player_first
-	jp .enemy_first
-
-.player_2c
-	call BattleRandom
-	cp 1 + (50 percent)
-	jp c, .enemy_first
-.player_first
-	scf
-	ret
-; 3c3f3
-
-.enemy_first ; 3c3f3
-	and a
-	ret
-; 3c3f5
-
-CheckContestBattleOver: ; 3c3f5
-	ld a, [BattleType]
-	cp BATTLETYPE_CONTEST
-	jr nz, .contest_not_over
-	ld a, [wParkBallsRemaining]
-	and a
-	jr nz, .contest_not_over
-	ld a, [wBattleResult]
-	and $c0
-	add $2
-	ld [wBattleResult], a
-	scf
-	ret
-
-.contest_not_over
-	and a
-	ret
-; 3c410
-
-CheckPlayerLockedIn: ; 3c410
-	ld a, [PlayerSubStatus4]
-	and 1 << SUBSTATUS_RECHARGE
-	jp nz, .quit
-
-	ld hl, EnemySubStatus3
-	res SUBSTATUS_FLINCHED, [hl]
-	ld hl, PlayerSubStatus3
-	res SUBSTATUS_FLINCHED, [hl]
-
-	ld a, [hl]
-	and 1 << SUBSTATUS_CHARGED | 1 << SUBSTATUS_RAMPAGE
-	jp nz, .quit
-
-	ld hl, PlayerSubStatus1
-	bit SUBSTATUS_ROLLOUT, [hl]
-	jp nz, .quit
-
-	and a
-	ret
-
-.quit
-	scf
-	ret
-; 3c434
-
-ParsePlayerAction: ; 3c434
-	call CheckPlayerLockedIn
-	jp c, .locked_in
-	ld hl, PlayerSubStatus5
-	bit SUBSTATUS_ENCORED, [hl]
-	jr z, .not_encored
-	ld a, [LastPlayerMove]
-	ld [CurPlayerMove], a
-	jr .encored
-
-.not_encored
-	ld a, [wPlayerAction]
-	cp $2
-	jr z, .reset_rage
-	and a
-	jr nz, .reset_bide
-	ld a, [PlayerSubStatus3]
-	and 1 << SUBSTATUS_BIDE
-	jr nz, .locked_in
-	xor a
-	ld [wMoveSelectionMenuType], a
-	inc a ; POUND
-	ld [FXAnimID], a
-	call MoveSelectionScreen
-	push af
-	call Call_LoadTempTileMapToTileMap
-	call UpdateBattleHuds
-	ld a, [CurPlayerMove]
-	cp STRUGGLE
-	jr z, .struggle
-	call PlayClickSFX
-
-.struggle
-	ld a, $1
-	ld [hBGMapMode], a
-	pop af
-	ret nz
-
-.encored
-	call SetPlayerTurn
-	callfar UpdateMoveData
-	xor a
-	ld [wPlayerCharging], a
-	ld a, [wPlayerMoveStruct + MOVE_EFFECT]
-	cp EFFECT_FURY_CUTTER
-	jr z, .continue_fury_cutter
-	xor a
-	ld [PlayerFuryCutterCount], a
-
-.continue_fury_cutter
-	ld a, [wPlayerMoveStruct + MOVE_EFFECT]
-	cp EFFECT_RAGE
-	jr z, .continue_rage
-	ld hl, PlayerSubStatus4
-	res SUBSTATUS_RAGE, [hl]
-	xor a
-	ld [wPlayerRageCounter], a
-
-.continue_rage
-	ld a, [wPlayerMoveStruct + MOVE_EFFECT]
-	cp EFFECT_PROTECT
-	jr z, .continue_protect
-	cp EFFECT_ENDURE
-	jr z, .continue_protect
-	xor a
-	ld [PlayerProtectCount], a
-	jr .continue_protect
-
-.reset_bide
-	ld hl, PlayerSubStatus3
-	res SUBSTATUS_BIDE, [hl]
-
-.locked_in
-	xor a
-	ld [PlayerFuryCutterCount], a
-	ld [PlayerProtectCount], a
-	ld [wPlayerRageCounter], a
-	ld hl, PlayerSubStatus4
-	res SUBSTATUS_RAGE, [hl]
-
-.continue_protect
-	call ParseEnemyAction
-	xor a
-	ret
-
-.reset_rage
-	xor a
-	ld [PlayerFuryCutterCount], a
-	ld [PlayerProtectCount], a
-	ld [wPlayerRageCounter], a
-	ld hl, PlayerSubStatus4
-	res SUBSTATUS_RAGE, [hl]
-	xor a
-	ret
-; 3c4df
-
-HandleEncore: ; 3c4df
-	ld a, [hLinkPlayerNumber]
-	cp $1
-	jr z, .player_1
-	call .do_player
-	jr .do_enemy
-
-.player_1
-	call .do_enemy
-.do_player
-	ld hl, PlayerSubStatus5
-	bit SUBSTATUS_ENCORED, [hl]
-	ret z
-	ld a, [PlayerEncoreCount]
-	dec a
-	ld [PlayerEncoreCount], a
-	jr z, .end_player_encore
-	ld hl, BattleMonPP
-	ld a, [CurMoveNum]
-	ld c, a
-	ld b, 0
-	add hl, bc
-	ld a, [hl]
-	and $3f
-	ret nz
-
-.end_player_encore
-	ld hl, PlayerSubStatus5
-	res SUBSTATUS_ENCORED, [hl]
-	call SetEnemyTurn
-	ld hl, BattleText_TargetsEncoreEnded
-	jp StdBattleTextBox
-
-.do_enemy
-	ld hl, EnemySubStatus5
-	bit SUBSTATUS_ENCORED, [hl]
-	ret z
-	ld a, [EnemyEncoreCount]
-	dec a
-	ld [EnemyEncoreCount], a
-	jr z, .end_enemy_encore
-	ld hl, EnemyMonPP
-	ld a, [CurEnemyMoveNum]
-	ld c, a
-	ld b, 0
-	add hl, bc
-	ld a, [hl]
-	and $3f
-	ret nz
-
-.end_enemy_encore
-	ld hl, EnemySubStatus5
-	res SUBSTATUS_ENCORED, [hl]
-	call SetPlayerTurn
-	ld hl, BattleText_TargetsEncoreEnded
-	jp StdBattleTextBox
-; 3c543
-
-TryEnemyFlee: ; 3c543
-	ld a, [wBattleMode]
-	dec a
-	jr nz, .Stay
-
-	ld a, [PlayerSubStatus5]
-	bit SUBSTATUS_CANT_RUN, a
-	jr nz, .Stay
-
-	ld a, [wEnemyWrapCount]
-	and a
-	jr nz, .Stay
-
-	ld a, [EnemyMonStatus]
-	and 1 << FRZ | SLP
-	jr nz, .Stay
-
-	ld a, [TempEnemyMonSpecies]
-	ld de, 1
-	ld hl, AlwaysFleeMons
-	call IsInArray
-	jr c, .Flee
-
-	call BattleRandom
-	ld b, a
-	cp 1 + (50 percent)
-	jr nc, .Stay
-
-	push bc
-	ld a, [TempEnemyMonSpecies]
-	ld de, 1
-	ld hl, OftenFleeMons
-	call IsInArray
-	pop bc
-	jr c, .Flee
-
-	ld a, b
-	cp 1 + (10 percent)
-	jr nc, .Stay
-
-	ld a, [TempEnemyMonSpecies]
-	ld de, 1
-	ld hl, SometimesFleeMons
-	call IsInArray
-	jr c, .Flee
-
-.Stay:
-	and a
-	ret
-
-.Flee:
-	scf
-	ret
-; 3c59a
-
-INCLUDE "data/battle/flee_mons.asm"
-
-CompareMovePriority: ; 3c5b4
-; Compare the priority of the player and enemy's moves.
-; Return carry if the player goes first, or z if they match.
-
-	ld a, [CurPlayerMove]
-	call GetMovePriority
-	ld b, a
-	push bc
-	ld a, [CurEnemyMove]
-	call GetMovePriority
-	pop bc
-	cp b
-	ret
-; 3c5c5
-
-GetMovePriority: ; 3c5c5
-; Return the priority (0-3) of move a.
-
-	ld b, a
-
-	; Vital Throw goes last.
-	cp VITAL_THROW
-	ld a, 0
-	ret z
-
-	call GetMoveEffect
-	ld hl, MoveEffectPriorities
-.loop
-	ld a, [hli]
-	cp b
-	jr z, .done
-	inc hl
-	cp -1
-	jr nz, .loop
-
-	ld a, 1
-	ret
-
-.done
-	ld a, [hl]
-	ret
-; 3c5df
-
-MoveEffectPriorities: ; 3c5df
-	db EFFECT_PROTECT,      3
-	db EFFECT_ENDURE,       3
-	db EFFECT_PRIORITY_HIT, 2
-	db EFFECT_FORCE_SWITCH, 0
-	db EFFECT_COUNTER,      0
-	db EFFECT_MIRROR_COAT,  0
-	db -1
-; 3c5ec
-
-GetMoveEffect: ; 3c5ec
-	ld a, b
-	dec a
-	ld hl, Moves + MOVE_EFFECT
-	ld bc, MOVE_LENGTH
-	call AddNTimes
-	ld a, BANK(Moves)
-	call GetFarByte
-	ld b, a
-	ret
-; 3c5fe
-
-Battle_EnemyFirst: ; 3c5fe
-	call LoadTileMapToTempTileMap
-	call TryEnemyFlee
-	jp c, WildFled_EnemyFled_LinkBattleCanceled
-	call SetEnemyTurn
-	ld a, $1
-	ld [wEnemyGoesFirst], a
-	callfar AI_SwitchOrTryItem
-	jr c, .switch_item
-	call EnemyTurn_EndOpponentProtectEndureDestinyBond
-	call CheckMobileBattleError
-	ret c
-	ld a, [wForcedSwitch]
-	and a
-	ret nz
-	call HasPlayerFainted
-	jp z, HandlePlayerMonFaint
-	call HasEnemyFainted
-	jp z, HandleEnemyMonFaint
-
-.switch_item
-	call SetEnemyTurn
-	call ResidualDamage
-	jp z, HandleEnemyMonFaint
-	call RefreshBattleHuds
-	call PlayerTurn_EndOpponentProtectEndureDestinyBond
-	call CheckMobileBattleError
-	ret c
-	ld a, [wForcedSwitch]
-	and a
-	ret nz
-	call HasEnemyFainted
-	jp z, HandleEnemyMonFaint
-	call HasPlayerFainted
-	jp z, HandlePlayerMonFaint
-	call SetPlayerTurn
-	call ResidualDamage
-	jp z, HandlePlayerMonFaint
-	call RefreshBattleHuds
-	xor a
-	ld [wPlayerAction], a
-	ret
-; 3c664
-
-Battle_PlayerFirst: ; 3c664
-	xor a
-	ld [wEnemyGoesFirst], a
-	call SetEnemyTurn
-	callfar AI_SwitchOrTryItem
-	push af
-	call PlayerTurn_EndOpponentProtectEndureDestinyBond
-	pop bc
-	ld a, [wForcedSwitch]
-	and a
-	ret nz
-	call CheckMobileBattleError
-	ret c
-	call HasEnemyFainted
-	jp z, HandleEnemyMonFaint
-	call HasPlayerFainted
-	jp z, HandlePlayerMonFaint
-	push bc
-	call SetPlayerTurn
-	call ResidualDamage
-	pop bc
-	jp z, HandlePlayerMonFaint
-	push bc
-	call RefreshBattleHuds
-	pop af
-	jr c, .switched_or_used_item
-	call LoadTileMapToTempTileMap
-	call TryEnemyFlee
-	jp c, WildFled_EnemyFled_LinkBattleCanceled
-	call EnemyTurn_EndOpponentProtectEndureDestinyBond
-	call CheckMobileBattleError
-	ret c
-	ld a, [wForcedSwitch]
-	and a
-	ret nz
-	call HasPlayerFainted
-	jp z, HandlePlayerMonFaint
-	call HasEnemyFainted
-	jp z, HandleEnemyMonFaint
-
-.switched_or_used_item
-	call SetEnemyTurn
-	call ResidualDamage
-	jp z, HandleEnemyMonFaint
-	call RefreshBattleHuds
-	xor a
-	ld [wPlayerAction], a
-	ret
-; 3c6cf
-
-PlayerTurn_EndOpponentProtectEndureDestinyBond: ; 3c6cf
-	call SetPlayerTurn
-	call EndUserDestinyBond
-	callfar DoPlayerTurn
-	jp EndOpponentProtectEndureDestinyBond
-; 3c6de
-
-EnemyTurn_EndOpponentProtectEndureDestinyBond: ; 3c6de
-	call SetEnemyTurn
-	call EndUserDestinyBond
-	callfar DoEnemyTurn
-	jp EndOpponentProtectEndureDestinyBond
-; 3c6ed
-
-EndOpponentProtectEndureDestinyBond: ; 3c6ed
-	ld a, BATTLE_VARS_SUBSTATUS1_OPP
-	call GetBattleVarAddr
-	res SUBSTATUS_PROTECT, [hl]
-	res SUBSTATUS_ENDURE, [hl]
-	ld a, BATTLE_VARS_SUBSTATUS5_OPP
-	call GetBattleVarAddr
-	res SUBSTATUS_DESTINY_BOND, [hl]
-	ret
-; 3c6fe
-
-EndUserDestinyBond: ; 3c6fe
-	ld a, BATTLE_VARS_SUBSTATUS5
-	call GetBattleVarAddr
-	res SUBSTATUS_DESTINY_BOND, [hl]
-	ret
-; 3c706
-
-HasUserFainted: ; 3c706
-	ld a, [hBattleTurn]
-	and a
-	jr z, HasPlayerFainted
-HasEnemyFainted: ; 3c70b
-	ld hl, EnemyMonHP
-	jr CheckIfHPIsZero
-
-HasPlayerFainted: ; 3c710
-	ld hl, BattleMonHP
-
-CheckIfHPIsZero: ; 3c713
-	ld a, [hli]
-	or [hl]
-	ret
-; 3c716
-
-ResidualDamage: ; 3c716
-; Return z if the user fainted before
-; or as a result of residual damage.
-; For Sandstorm damage, see HandleWeather.
-
-	call HasUserFainted
-	ret z
-
-	ld a, BATTLE_VARS_STATUS
-	call GetBattleVar
-	and 1 << PSN | 1 << BRN
-	jr z, .did_psn_brn
-
-	ld hl, HurtByPoisonText
-	ld de, ANIM_PSN
-	and 1 << BRN
-	jr z, .got_anim
-	ld hl, HurtByBurnText
-	ld de, ANIM_BRN
-.got_anim
-
-	push de
-	call StdBattleTextBox
-	pop de
-
-	xor a
-	ld [wNumHits], a
-	call Call_PlayBattleAnim_OnlyIfVisible
-	call GetEighthMaxHP
-	ld de, PlayerToxicCount
-	ld a, [hBattleTurn]
-	and a
-	jr z, .check_toxic
-	ld de, EnemyToxicCount
-.check_toxic
-
-	ld a, BATTLE_VARS_SUBSTATUS5
-	call GetBattleVar
-	bit SUBSTATUS_TOXIC, a
-	jr z, .did_toxic
-	call GetSixteenthMaxHP
-	ld a, [de]
-	inc a
-	ld [de], a
-	ld hl, 0
-.add
-	add hl, bc
-	dec a
-	jr nz, .add
-	ld b, h
-	ld c, l
-.did_toxic
-
-	call SubtractHPFromUser
-.did_psn_brn
-
-	call HasUserFainted
-	jp z, .fainted
-
-	ld a, BATTLE_VARS_SUBSTATUS4
-	call GetBattleVarAddr
-	bit SUBSTATUS_LEECH_SEED, [hl]
-	jr z, .not_seeded
-
-	call SwitchTurnCore
-	xor a
-	ld [wNumHits], a
-	ld de, ANIM_SAP
-	ld a, BATTLE_VARS_SUBSTATUS3_OPP
-	call GetBattleVar
-	and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
-	call z, Call_PlayBattleAnim_OnlyIfVisible
-	call SwitchTurnCore
-
-	call GetEighthMaxHP
-	call SubtractHPFromUser
-	ld a, $1
-	ld [hBGMapMode], a
-	call RestoreHP
-	ld hl, LeechSeedSapsText
-	call StdBattleTextBox
-.not_seeded
-
-	call HasUserFainted
-	jr z, .fainted
-
-	ld a, BATTLE_VARS_SUBSTATUS1
-	call GetBattleVarAddr
-	bit SUBSTATUS_NIGHTMARE, [hl]
-	jr z, .not_nightmare
-	xor a
-	ld [wNumHits], a
-	ld de, ANIM_IN_NIGHTMARE
-	call Call_PlayBattleAnim_OnlyIfVisible
-	call GetQuarterMaxHP
-	call SubtractHPFromUser
-	ld hl, HasANightmareText
-	call StdBattleTextBox
-.not_nightmare
-
-	call HasUserFainted
-	jr z, .fainted
-
-	ld a, BATTLE_VARS_SUBSTATUS1
-	call GetBattleVarAddr
-	bit SUBSTATUS_CURSE, [hl]
-	jr z, .not_cursed
-
-	xor a
-	ld [wNumHits], a
-	ld de, ANIM_IN_NIGHTMARE
-	call Call_PlayBattleAnim_OnlyIfVisible
-	call GetQuarterMaxHP
-	call SubtractHPFromUser
-	ld hl, HurtByCurseText
-	call StdBattleTextBox
-
-.not_cursed
-	ld hl, BattleMonHP
-	ld a, [hBattleTurn]
-	and a
-	jr z, .check_fainted
-	ld hl, EnemyMonHP
-
-.check_fainted
-	ld a, [hli]
-	or [hl]
-	ret nz
-
-.fainted
-	call RefreshBattleHuds
-	ld c, 20
-	call DelayFrames
-	xor a
-	ret
-; 3c801
-
-HandlePerishSong: ; 3c801
-	ld a, [hLinkPlayerNumber]
-	cp $1
-	jr z, .EnemyFirst
-	call SetPlayerTurn
-	call .do_it
-	call SetEnemyTurn
-	jp .do_it
-
-.EnemyFirst:
-	call SetEnemyTurn
-	call .do_it
-	call SetPlayerTurn
-
-.do_it
-	ld hl, PlayerPerishCount
-	ld a, [hBattleTurn]
-	and a
-	jr z, .got_count
-	ld hl, EnemyPerishCount
-
-.got_count
-	ld a, BATTLE_VARS_SUBSTATUS1
-	call GetBattleVar
-	bit SUBSTATUS_PERISH, a
-	ret z
-	dec [hl]
-	ld a, [hl]
-	ld [wd265], a
-	push af
-	ld hl, PerishCountText
-	call StdBattleTextBox
-	pop af
-	ret nz
-	ld a, BATTLE_VARS_SUBSTATUS1
-	call GetBattleVarAddr
-	res SUBSTATUS_PERISH, [hl]
-	ld a, [hBattleTurn]
-	and a
-	jr nz, .kill_enemy
-	ld hl, BattleMonHP
-	xor a
-	ld [hli], a
-	ld [hl], a
-	ld hl, PartyMon1HP
-	ld a, [CurBattleMon]
-	call GetPartyLocation
-	xor a
-	ld [hli], a
-	ld [hl], a
-	ret
-
-.kill_enemy
-	ld hl, EnemyMonHP
-	xor a
-	ld [hli], a
-	ld [hl], a
-	ld a, [wBattleMode]
-	dec a
-	ret z
-	ld hl, OTPartyMon1HP
-	ld a, [CurOTMon]
-	call GetPartyLocation
-	xor a
-	ld [hli], a
-	ld [hl], a
-	ret
-; 3c874
-
-HandleWrap: ; 3c874
-	ld a, [hLinkPlayerNumber]
-	cp $1
-	jr z, .EnemyFirst
-	call SetPlayerTurn
-	call .do_it
-	call SetEnemyTurn
-	jp .do_it
-
-.EnemyFirst:
-	call SetEnemyTurn
-	call .do_it
-	call SetPlayerTurn
-
-.do_it
-	ld hl, wPlayerWrapCount
-	ld de, wPlayerTrappingMove
-	ld a, [hBattleTurn]
-	and a
-	jr z, .got_addrs
-	ld hl, wEnemyWrapCount
-	ld de, wEnemyTrappingMove
-
-.got_addrs
-	ld a, [hl]
-	and a
-	ret z
-
-	ld a, BATTLE_VARS_SUBSTATUS4
-	call GetBattleVar
-	bit SUBSTATUS_SUBSTITUTE, a
-	ret nz
-
-	ld a, [de]
-	ld [wd265], a
-	ld [FXAnimID], a
-	call GetMoveName
-	dec [hl]
-	jr z, .release_from_bounds
-
-	ld a, BATTLE_VARS_SUBSTATUS3
-	call GetBattleVar
-	and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
-	jr nz, .skip_anim
-
-	call SwitchTurnCore
-	xor a
-	ld [wNumHits], a
-	ld [FXAnimID + 1], a
-	predef PlayBattleAnim
-	call SwitchTurnCore
-
-.skip_anim
-	call GetSixteenthMaxHP
-	call SubtractHPFromUser
-	ld hl, BattleText_UsersHurtByStringBuffer1
-	jr .print_text
-
-.release_from_bounds
-	ld hl, BattleText_UserWasReleasedFromStringBuffer1
-
-.print_text
-	jp StdBattleTextBox
-; 3c8e4
-
-SwitchTurnCore: ; 3c8e4
-	ld a, [hBattleTurn]
-	xor 1
-	ld [hBattleTurn], a
-	ret
-; 3c8eb
-
-HandleLeftovers: ; 3c8eb
-	ld a, [hLinkPlayerNumber]
-	cp $1
-	jr z, .DoEnemyFirst
-	call SetPlayerTurn
-	call .do_it
-	call SetEnemyTurn
-	jp .do_it
-
-.DoEnemyFirst:
-	call SetEnemyTurn
-	call .do_it
-	call SetPlayerTurn
-.do_it
-
-	callfar GetUserItem
-	ld a, [hl]
-	ld [wd265], a
-	call GetItemName
-	ld a, b
-	cp HELD_LEFTOVERS
-	ret nz
-
-	ld hl, BattleMonHP
-	ld a, [hBattleTurn]
-	and a
-	jr z, .got_hp
-	ld hl, EnemyMonHP
-
-.got_hp
-; Don't restore if we're already at max HP
-	ld a, [hli]
-	ld b, a
-	ld a, [hli]
-	ld c, a
-	ld a, [hli]
-	cp b
-	jr nz, .restore
-	ld a, [hl]
-	cp c
-	ret z
-
-.restore
-	call GetSixteenthMaxHP
-	call SwitchTurnCore
-	call RestoreHP
-	ld hl, BattleText_TargetRecoveredWithItem
-	jp StdBattleTextBox
-; 3c93c
-
-HandleMysteryberry: ; 3c93c
-	ld a, [hLinkPlayerNumber]
-	cp $1
-	jr z, .DoEnemyFirst
-	call SetPlayerTurn
-	call .do_it
-	call SetEnemyTurn
-	jp .do_it
-
-.DoEnemyFirst:
-	call SetEnemyTurn
-	call .do_it
-	call SetPlayerTurn
-
-.do_it
-	callfar GetUserItem
-	ld a, b
-	cp HELD_RESTORE_PP
-	jr nz, .quit
-	ld hl, PartyMon1PP
-	ld a, [CurBattleMon]
-	call GetPartyLocation
-	ld d, h
-	ld e, l
-	ld hl, PartyMon1Moves
-	ld a, [CurBattleMon]
-	call GetPartyLocation
-	ld a, [hBattleTurn]
-	and a
-	jr z, .wild
-	ld de, wWildMonPP
-	ld hl, wWildMonMoves
-	ld a, [wBattleMode]
-	dec a
-	jr z, .wild
-	ld hl, OTPartyMon1PP
-	ld a, [CurOTMon]
-	call GetPartyLocation
-	ld d, h
-	ld e, l
-	ld hl, OTPartyMon1Moves
-	ld a, [CurOTMon]
-	call GetPartyLocation
-
-.wild
-	ld c, $0
-.loop
-	ld a, [hl]
-	and a
-	jr z, .quit
-	ld a, [de]
-	and $3f
-	jr z, .restore
-	inc hl
-	inc de
-	inc c
-	ld a, c
-	cp NUM_MOVES
-	jr nz, .loop
-
-.quit
-	ret
-
-.restore
-	; lousy hack
-	ld a, [hl]
-	cp SKETCH
-	ld b, 1
-	jr z, .sketch
-	ld b, 5
-.sketch
-	ld a, [de]
-	add b
-	ld [de], a
-	push bc
-	push bc
-	ld a, [hl]
-	ld [wd265], a
-	ld de, BattleMonMoves - 1
-	ld hl, BattleMonPP
-	ld a, [hBattleTurn]
-	and a
-	jr z, .player_pp
-	ld de, EnemyMonMoves - 1
-	ld hl, EnemyMonPP
-.player_pp
-	inc de
-	pop bc
-	ld b, 0
-	add hl, bc
-	push hl
-	ld h, d
-	ld l, e
-	add hl, bc
-	pop de
-	pop bc
-
-	ld a, [wd265]
-	cp [hl]
-	jr nz, .skip_checks
-	ld a, [hBattleTurn]
-	and a
-	ld a, [PlayerSubStatus5]
-	jr z, .check_transform
-	ld a, [EnemySubStatus5]
-.check_transform
-	bit SUBSTATUS_TRANSFORMED, a
-	jr nz, .skip_checks
-	ld a, [de]
-	add b
-	ld [de], a
-.skip_checks
-	callfar GetUserItem
-	ld a, [hl]
-	ld [wd265], a
-	xor a
-	ld [hl], a
-	call GetPartymonItem
-	ld a, [hBattleTurn]
-	and a
-	jr z, .consume_item
-	ld a, [wBattleMode]
-	dec a
-	jr z, .skip_consumption
-	call GetOTPartymonItem
-
-.consume_item
-	xor a
-	ld [hl], a
-
-.skip_consumption
-	call GetItemName
-	call SwitchTurnCore
-	call ItemRecoveryAnim
-	call SwitchTurnCore
-	ld hl, BattleText_UserRecoveredPPUsing
-	jp StdBattleTextBox
-; 3ca26
-
-HandleFutureSight: ; 3ca26
-	ld a, [hLinkPlayerNumber]
-	cp $1
-	jr z, .enemy_first
-	call SetPlayerTurn
-	call .do_it
-	call SetEnemyTurn
-	jp .do_it
-
-.enemy_first
-	call SetEnemyTurn
-	call .do_it
-	call SetPlayerTurn
-
-.do_it
-	ld hl, wPlayerFutureSightCount
-	ld a, [hBattleTurn]
-	and a
-	jr z, .okay
-	ld hl, wEnemyFutureSightCount
-
-.okay
-	ld a, [hl]
-	and a
-	ret z
-	dec a
-	ld [hl], a
-	cp $1
-	ret nz
-
-	ld hl, BattleText_TargetWasHitByFutureSight
-	call StdBattleTextBox
-
-	ld a, BATTLE_VARS_MOVE
-	call GetBattleVarAddr
-	push af
-	ld a, FUTURE_SIGHT
-	ld [hl], a
-
-	callfar UpdateMoveData
-	xor a
-	ld [AttackMissed], a
-	ld [AlreadyDisobeyed], a
-	ld a, 10
-	ld [TypeModifier], a
-	callfar DoMove
-	xor a
-	ld [CurDamage], a
-	ld [CurDamage + 1], a
-
-	ld a, BATTLE_VARS_MOVE
-	call GetBattleVarAddr
-	pop af
-	ld [hl], a
-
-	call UpdateBattleMonInParty
-	jp UpdateEnemyMonInParty
-; 3ca8f
-
-HanleDefrost: ; 3ca8f
-	ld a, [hLinkPlayerNumber]
-	cp $1
-	jr z, .enemy_first
-	call .do_player_turn
-	jr .do_enemy_turn
-
-.enemy_first
-	call .do_enemy_turn
-.do_player_turn
-	ld a, [BattleMonStatus]
-	bit FRZ, a
-	ret z
-
-	ld a, [wPlayerJustGotFrozen]
-	and a
-	ret nz
-
-	call BattleRandom
-	cp 10 percent
-	ret nc
-	xor a
-	ld [BattleMonStatus], a
-	ld a, [CurBattleMon]
-	ld hl, PartyMon1Status
-	call GetPartyLocation
-	ld [hl], 0
-	call UpdateBattleHuds
-	call SetEnemyTurn
-	ld hl, DefrostedOpponentText
-	jp StdBattleTextBox
-
-.do_enemy_turn
-	ld a, [EnemyMonStatus]
-	bit FRZ, a
-	ret z
-	ld a, [wEnemyJustGotFrozen]
-	and a
-	ret nz
-	call BattleRandom
-	cp 10 percent
-	ret nc
-	xor a
-	ld [EnemyMonStatus], a
-
-	ld a, [wBattleMode]
-	dec a
-	jr z, .wild
-	ld a, [CurOTMon]
-	ld hl, OTPartyMon1Status
-	call GetPartyLocation
-	ld [hl], 0
-.wild
-
-	call UpdateBattleHuds
-	call SetPlayerTurn
-	ld hl, DefrostedOpponentText
-	jp StdBattleTextBox
-; 3cafb
-
-HandleSafeguard: ; 3cafb
-	ld a, [hLinkPlayerNumber]
-	cp $1
-	jr z, .player1
-	call .CheckPlayer
-	jr .CheckEnemy
-
-.player1
-	call .CheckEnemy
-.CheckPlayer:
-	ld a, [PlayerScreens]
-	bit SCREENS_SAFEGUARD, a
-	ret z
-	ld hl, PlayerSafeguardCount
-	dec [hl]
-	ret nz
-	res SCREENS_SAFEGUARD, a
-	ld [PlayerScreens], a
-	xor a
-	jr .print
-
-.CheckEnemy:
-	ld a, [EnemyScreens]
-	bit SCREENS_SAFEGUARD, a
-	ret z
-	ld hl, EnemySafeguardCount
-	dec [hl]
-	ret nz
-	res SCREENS_SAFEGUARD, a
-	ld [EnemyScreens], a
-	ld a, $1
-
-.print
-	ld [hBattleTurn], a
-	ld hl, BattleText_SafeguardFaded
-	jp StdBattleTextBox
-
-HandleScreens: ; 3cb36
-	ld a, [hLinkPlayerNumber]
-	cp 1
-	jr z, .Both
-	call .CheckPlayer
-	jr .CheckEnemy
-
-.Both:
-	call .CheckEnemy
-
-.CheckPlayer:
-	call SetPlayerTurn
-	ld de, .Your
-	call .Copy
-	ld hl, PlayerScreens
-	ld de, PlayerLightScreenCount
-	jr .TickScreens
-
-.CheckEnemy:
-	call SetEnemyTurn
-	ld de, .Enemy
-	call .Copy
-	ld hl, EnemyScreens
-	ld de, EnemyLightScreenCount
-
-.TickScreens:
-	bit SCREENS_LIGHT_SCREEN, [hl]
-	call nz, .LightScreenTick
-	bit SCREENS_REFLECT, [hl]
-	call nz, .ReflectTick
-	ret
-
-.Copy:
-	ld hl, StringBuffer1
-	jp CopyName2
-; 3cb75
-
-.Your:
-	db "Your@"
-.Enemy:
-	db "Enemy@"
-; 3cb80
-
-.LightScreenTick: ; 3cb80
-	ld a, [de]
-	dec a
-	ld [de], a
-	ret nz
-	res SCREENS_LIGHT_SCREEN, [hl]
-	push hl
-	push de
-	ld hl, BattleText_PkmnLightScreenFell
-	call StdBattleTextBox
-	pop de
-	pop hl
-	ret
-; 3cb91
-
-.ReflectTick: ; 3cb91
-	inc de
-	ld a, [de]
-	dec a
-	ld [de], a
-	ret nz
-	res SCREENS_REFLECT, [hl]
-	ld hl, BattleText_PkmnReflectFaded
-	jp StdBattleTextBox
-; 3cb9e
-
-HandleWeather: ; 3cb9e
-	ld a, [Weather]
-	cp WEATHER_NONE
-	ret z
-
-	ld hl, WeatherCount
-	dec [hl]
-	jr z, .ended
-
-	ld hl, .WeatherMessages
-	call .PrintWeatherMessage
-
-	ld a, [Weather]
-	cp WEATHER_SANDSTORM
-	ret nz
-
-	ld a, [hLinkPlayerNumber]
-	cp 1
-	jr z, .enemy_first
-
-.player_first
-	call SetPlayerTurn
-	call .SandstormDamage
-	call SetEnemyTurn
-	jr .SandstormDamage
-
-.enemy_first
-	call SetEnemyTurn
-	call .SandstormDamage
-	call SetPlayerTurn
-
-.SandstormDamage:
-	ld a, BATTLE_VARS_SUBSTATUS3
-	call GetBattleVar
-	bit SUBSTATUS_UNDERGROUND, a
-	ret nz
-
-	ld hl, BattleMonType1
-	ld a, [hBattleTurn]
-	and a
-	jr z, .ok
-	ld hl, EnemyMonType1
-.ok
-	ld a, [hli]
-	cp ROCK
-	ret z
-	cp GROUND
-	ret z
-	cp STEEL
-	ret z
-
-	ld a, [hl]
-	cp ROCK
-	ret z
-	cp GROUND
-	ret z
-	cp STEEL
-	ret z
-
-	call SwitchTurnCore
-	xor a
-	ld [wNumHits], a
-	ld de, ANIM_IN_SANDSTORM
-	call Call_PlayBattleAnim
-	call SwitchTurnCore
-	call GetEighthMaxHP
-	call SubtractHPFromUser
-
-	ld hl, SandstormHitsText
-	jp StdBattleTextBox
-
-.ended
-	ld hl, .WeatherEndedMessages
-	call .PrintWeatherMessage
-	xor a
-	ld [Weather], a
-	ret
-
-.PrintWeatherMessage:
-	ld a, [Weather]
-	dec a
-	ld c, a
-	ld b, 0
-	add hl, bc
-	add hl, bc
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	jp StdBattleTextBox
-; 3cc2d
-
-.WeatherMessages:
-	dw BattleText_RainContinuesToFall
-	dw BattleText_TheSunlightIsStrong
-	dw BattleText_TheSandstormRages
-.WeatherEndedMessages:
-	dw BattleText_TheRainStopped
-	dw BattleText_TheSunlightFaded
-	dw BattleText_TheSandstormSubsided
-; 3cc39
-
-SubtractHPFromTarget: ; 3cc39
-	call SubtractHP
-	jp UpdateHPBar
-; 3cc3f
-
-SubtractHPFromUser: ; 3cc3f
-; Subtract HP from Pkmn
-	call SubtractHP
-	jp UpdateHPBarBattleHuds
-; 3cc45
-
-SubtractHP: ; 3cc45
-	ld hl, BattleMonHP
-	ld a, [hBattleTurn]
-	and a
-	jr z, .ok
-	ld hl, EnemyMonHP
-.ok
-	inc hl
-	ld a, [hl]
-	ld [Buffer3], a
-	sub c
-	ld [hld], a
-	ld [Buffer5], a
-	ld a, [hl]
-	ld [Buffer4], a
-	sbc b
-	ld [hl], a
-	ld [Buffer6], a
-	ret nc
-
-	ld a, [Buffer3]
-	ld c, a
-	ld a, [Buffer4]
-	ld b, a
-	xor a
-	ld [hli], a
-	ld [hl], a
-	ld [Buffer5], a
-	ld [Buffer6], a
-	ret
-; 3cc76
-
-GetSixteenthMaxHP: ; 3cc76
-	call GetQuarterMaxHP
-	; quarter result
-	srl c
-	srl c
-	; round up
-	ld a, c
-	and a
-	jr nz, .ok
-	inc c
-.ok
-	ret
-; 3cc83
-
-GetEighthMaxHP: ; 3cc83
-; output: bc
-	call GetQuarterMaxHP
-; assumes nothing can have 1024 or more hp
-; halve result
-	srl c
-; round up
-	ld a, c
-	and a
-	jr nz, .end
-	inc c
-.end
-	ret
-; 3cc8e
-
-GetQuarterMaxHP: ; 3cc8e
-; output: bc
-	call GetMaxHP
-
-; quarter result
-	srl b
-	rr c
-	srl b
-	rr c
-
-; assumes nothing can have 1024 or more hp
-; round up
-	ld a, c
-	and a
-	jr nz, .end
-	inc c
-.end
-	ret
-; 3cc9f
-
-GetHalfMaxHP: ; 3cc9f
-; output: bc
-	call GetMaxHP
-
-; halve result
-	srl b
-	rr c
-
-; floor = 1
-	ld a, c
-	or b
-	jr nz, .end
-	inc c
-.end
-	ret
-; 3ccac
-
-GetMaxHP: ; 3ccac
-; output: bc, Buffer1-2
-
-	ld hl, BattleMonMaxHP
-	ld a, [hBattleTurn]
-	and a
-	jr z, .ok
-	ld hl, EnemyMonMaxHP
-.ok
-	ld a, [hli]
-	ld [Buffer2], a
-	ld b, a
-
-	ld a, [hl]
-	ld [Buffer1], a
-	ld c, a
-	ret
-; 3ccc2
-
-GetHalfHP: ; 3ccc2
-; unreferenced
-	ld hl, BattleMonHP
-	ld a, [hBattleTurn]
-	and a
-	jr z, .ok
-	ld hl, EnemyMonHP
-.ok
-	ld a, [hli]
-	ld b, a
-	ld a, [hli]
-	ld c, a
-	srl b
-	rr c
-	ld a, [hli]
-	ld [Buffer2], a
-	ld a, [hl]
-	ld [Buffer1], a
-	ret
-; 3ccde
-
-CheckUserHasEnoughHP: ; 3ccde
-	ld hl, BattleMonHP + 1
-	ld a, [hBattleTurn]
-	and a
-	jr z, .ok
-	ld hl, EnemyMonHP + 1
-.ok
-	ld a, c
-	sub [hl]
-	dec hl
-	ld a, b
-	sbc [hl]
-	ret
-; 3ccef
-
-RestoreHP ; 3ccef
-	ld hl, EnemyMonMaxHP
-	ld a, [hBattleTurn]
-	and a
-	jr z, .ok
-	ld hl, BattleMonMaxHP
-.ok
-	ld a, [hli]
-	ld [Buffer2], a
-	ld a, [hld]
-	ld [Buffer1], a
-	dec hl
-	ld a, [hl]
-	ld [Buffer3], a
-	add c
-	ld [hld], a
-	ld [Buffer5], a
-	ld a, [hl]
-	ld [Buffer4], a
-	adc b
-	ld [hli], a
-	ld [Buffer6], a
-
-	ld a, [Buffer1]
-	ld c, a
-	ld a, [hld]
-	sub c
-	ld a, [Buffer2]
-	ld b, a
-	ld a, [hl]
-	sbc b
-	jr c, .asm_3cd2d
-	ld a, b
-	ld [hli], a
-	ld [Buffer6], a
-	ld a, c
-	ld [hl], a
-	ld [Buffer5], a
-.asm_3cd2d
-
-	call SwitchTurnCore
-	call UpdateHPBarBattleHuds
-	jp SwitchTurnCore
-; 3cd36
-
-UpdateHPBarBattleHuds: ; 3cd36
-	call UpdateHPBar
-	jp UpdateBattleHuds
-; 3cd3c
-
-UpdateHPBar: ; 3cd3c
-	hlcoord 10, 9
-	ld a, [hBattleTurn]
-	and a
-	ld a, 1
-	jr z, .ok
-	hlcoord 2, 2
-	xor a
-.ok
-	push bc
-	ld [wWhichHPBar], a
-	predef AnimateHPBar
-	pop bc
-	ret
-; 3cd55
-
-HandleEnemyMonFaint: ; 3cd55
-	call FaintEnemyPokemon
-	ld hl, BattleMonHP
-	ld a, [hli]
-	or [hl]
-	call z, FaintYourPokemon
-	xor a
-	ld [wWhichMonFaintedFirst], a
-	call UpdateBattleStateAndExperienceAfterEnemyFaint
-	call CheckPlayerPartyForFitPkmn
-	ld a, d
-	and a
-	jp z, LostBattle
-
-	ld hl, BattleMonHP
-	ld a, [hli]
-	or [hl]
-	call nz, UpdatePlayerHUD
-
-	ld a, $1
-	ld [hBGMapMode], a
-	ld c, 60
-	call DelayFrames
-
-	ld a, [wBattleMode]
-	dec a
-	jr nz, .trainer
-
-	ld a, 1
-	ld [BattleEnded], a
-	ret
-
-.trainer
-	call CheckEnemyTrainerDefeated
-	jp z, WinTrainerBattle
-
-	ld hl, BattleMonHP
-	ld a, [hli]
-	or [hl]
-	jr nz, .player_mon_not_fainted
-
-	call AskUseNextPokemon
-	jr nc, .dont_flee
-
-	ld a, 1
-	ld [BattleEnded], a
-	ret
-
-.dont_flee
-	call ForcePlayerMonChoice
-	call CheckMobileBattleError
-	jp c, WildFled_EnemyFled_LinkBattleCanceled
-
-	ld a, $1
-	ld [wPlayerAction], a
-	call HandleEnemySwitch
-	jp z, WildFled_EnemyFled_LinkBattleCanceled
-	jr DoubleSwitch
-
-.player_mon_not_fainted
-	ld a, $1
-	ld [wPlayerAction], a
-	call HandleEnemySwitch
-	jp z, WildFled_EnemyFled_LinkBattleCanceled
-	xor a
-	ld [wPlayerAction], a
-	ret
-; 3cdca
-
-DoubleSwitch: ; 3cdca
-	ld a, [hLinkPlayerNumber]
-	cp $1
-	jr z, .player_1
-	call ClearSprites
-	hlcoord 1, 0
-	lb bc, 4, 10
-	call ClearBox
-	call PlayerPartyMonEntrance
-	ld a, $1
-	call EnemyPartyMonEntrance
-	jr .done
-
-.player_1
-	ld a, [CurPartyMon]
-	push af
-	ld a, $1
-	call EnemyPartyMonEntrance
-	call ClearSprites
-	call LoadTileMapToTempTileMap
-	pop af
-	ld [CurPartyMon], a
-	call PlayerPartyMonEntrance
-
-.done
-	xor a
-	ld [wPlayerAction], a
-	ret
-; 3ce01
-
-UpdateBattleStateAndExperienceAfterEnemyFaint: ; 3ce01
-	call UpdateBattleMonInParty
-	ld a, [wBattleMode]
-	dec a
-	jr z, .wild
-	ld a, [CurOTMon]
-	ld hl, OTPartyMon1HP
-	call GetPartyLocation
-	xor a
-	ld [hli], a
-	ld [hl], a
-
-.wild
-	ld hl, PlayerSubStatus3
-	res SUBSTATUS_IN_LOOP, [hl]
-	xor a
-	ld hl, EnemyDamageTaken
-	ld [hli], a
-	ld [hl], a
-	call NewEnemyMonStatus
-	call BreakAttraction
-	ld a, [wBattleMode]
-	dec a
-	jr z, .wild2
-	jr .trainer
-
-.wild2
-	call StopDangerSound
-	ld a, $1
-	ld [wDanger], a
-
-.trainer
-	ld hl, BattleMonHP
-	ld a, [hli]
-	or [hl]
-	jr nz, .player_mon_did_not_faint
-	ld a, [wWhichMonFaintedFirst]
-	and a
-	jr nz, .player_mon_did_not_faint
-	call PlayerMonFaintHappinessMod
-
-.player_mon_did_not_faint
-	call CheckPlayerPartyForFitPkmn
-	ld a, d
-	and a
-	ret z
-	ld a, [wBattleMode]
-	dec a
-	call z, PlayVictoryMusic
-	call EmptyBattleTextBox
-	call LoadTileMapToTempTileMap
-	ld a, [wBattleResult]
-	and $c0
-	ld [wBattleResult], a
-	call IsAnyMonHoldingExpShare
-	jr z, .skip_exp
-	ld hl, EnemyMonBaseStats
-	ld b, EnemyMonEnd - EnemyMonBaseStats
-.loop
-	srl [hl]
-	inc hl
-	dec b
-	jr nz, .loop
-
-.skip_exp
-	ld hl, EnemyMonBaseStats
-	ld de, wBackupEnemyMonBaseStats
-	ld bc, EnemyMonEnd - EnemyMonBaseStats
-	call CopyBytes
-	xor a
-	ld [wGivingExperienceToExpShareHolders], a
-	call GiveExperiencePoints
-	call IsAnyMonHoldingExpShare
-	ret z
-
-	ld a, [wBattleParticipantsNotFainted]
-	push af
-	ld a, d
-	ld [wBattleParticipantsNotFainted], a
-	ld hl, wBackupEnemyMonBaseStats
-	ld de, EnemyMonBaseStats
-	ld bc, EnemyMonEnd - EnemyMonBaseStats
-	call CopyBytes
-	ld a, $1
-	ld [wGivingExperienceToExpShareHolders], a
-	call GiveExperiencePoints
-	pop af
-	ld [wBattleParticipantsNotFainted], a
-	ret
-; 3ceaa
-
-IsAnyMonHoldingExpShare: ; 3ceaa
-	ld a, [PartyCount]
-	ld b, a
-	ld hl, PartyMon1
-	ld c, 1
-	ld d, 0
-.loop
-	push hl
-	push bc
-	ld bc, MON_HP
-	add hl, bc
-	ld a, [hli]
-	or [hl]
-	pop bc
-	pop hl
-	jr z, .next
-
-	push hl
-	push bc
-	ld bc, MON_ITEM
-	add hl, bc
-	pop bc
-	ld a, [hl]
-	pop hl
-
-	cp EXP_SHARE
-	jr nz, .next
-	ld a, d
-	or c
-	ld d, a
-
-.next
-	sla c
-	push de
-	ld de, PARTYMON_STRUCT_LENGTH
-	add hl, de
-	pop de
-	dec b
-	jr nz, .loop
-
-	ld a, d
-	ld e, 0
-	ld b, PARTY_LENGTH
-.loop2
-	srl a
-	jr nc, .okay
-	inc e
-
-.okay
-	dec b
-	jr nz, .loop2
-	ld a, e
-	and a
-	ret
-; 3ceec
-
-StopDangerSound: ; 3ceec
-	xor a
-	ld [Danger], a
-	ret
-; 3cef1
-
-FaintYourPokemon: ; 3cef1
-	call StopDangerSound
-	call WaitSFX
-	ld a, $f0
-	ld [CryTracks], a
-	ld a, [BattleMonSpecies]
-	call PlayStereoCry
-	call PlayerMonFaintedAnimation
-	hlcoord 9, 7
-	lb bc, 5, 11
-	call ClearBox
-	ld hl, BattleText_PkmnFainted
-	jp StdBattleTextBox
-; 3cf14
-
-FaintEnemyPokemon: ; 3cf14
-	call WaitSFX
-	ld de, SFX_KINESIS
-	call PlaySFX
-	call EnemyMonFaintedAnimation
-	ld de, SFX_FAINT
-	call PlaySFX
-	hlcoord 1, 0
-	lb bc, 4, 10
-	call ClearBox
-	ld hl, BattleText_EnemyPkmnFainted
-	jp StdBattleTextBox
-; 3cf35
-
-CheckEnemyTrainerDefeated: ; 3cf35
-	ld a, [OTPartyCount]
-	ld b, a
-	xor a
-	ld hl, OTPartyMon1HP
-	ld de, PARTYMON_STRUCT_LENGTH
-
-.loop
-	or [hl]
-	inc hl
-	or [hl]
-	dec hl
-	add hl, de
-	dec b
-	jr nz, .loop
-
-	and a
-	ret
-; 3cf4a
-
-HandleEnemySwitch: ; 3cf4a
-	ld hl, EnemyHPPal
-	ld e, HP_BAR_LENGTH_PX
-	call UpdateHPPal
-	call WaitBGMap
-	farcall EnemySwitch_TrainerHud
-	ld a, [wLinkMode]
-	and a
-	jr z, .not_linked
-
-	call LinkBattleSendReceiveAction
-	ld a, [wBattleAction]
-	cp BATTLEACTION_FORFEIT
-	ret z
-
-	call Call_LoadTempTileMapToTileMap
-
-.not_linked
-	ld hl, BattleMonHP
-	ld a, [hli]
-	or [hl]
-	ld a, $0
-	jr nz, EnemyPartyMonEntrance
-	inc a
-	ret
-; 3cf78
-
-EnemyPartyMonEntrance: ; 3cf78
-	push af
-	xor a
-	ld [wEnemySwitchMonIndex], a
-	call NewEnemyMonStatus
-	call ResetEnemyStatLevels
-	call BreakAttraction
-	pop af
-	and a
-	jr nz, .set
-	call EnemySwitch
-	jr .done_switch
-
-.set
-	call EnemySwitch_SetMode
-.done_switch
-	call ResetBattleParticipants
-	call SetEnemyTurn
-	call SpikesDamage
-	xor a
-	ld [wEnemyMoveStruct + MOVE_ANIM], a
-	ld [wPlayerAction], a
-	inc a
-	ret
-; 3cfa4
-
-WinTrainerBattle: ; 3cfa4
-; Player won the battle
-	call StopDangerSound
-	ld a, $1
-	ld [wDanger], a
-	ld [BattleEnded], a
-	ld a, [wLinkMode]
-	and a
-	ld a, b
-	call z, PlayVictoryMusic
-	callfar Battle_GetTrainerName
-	ld hl, BattleText_EnemyWasDefeated
-	call StdBattleTextBox
-
-	call IsMobileBattle
-	jr z, .mobile
-	ld a, [wLinkMode]
-	and a
-	ret nz
-
-	ld a, [InBattleTowerBattle]
-	bit 0, a
-	jr nz, .battle_tower
-
-	call BattleWinSlideInEnemyTrainerFrontpic
-	ld c, 40
-	call DelayFrames
-	ld a, [BattleType]
-	cp BATTLETYPE_CANLOSE
-	jr nz, .skip_heal
-	predef HealParty
-.skip_heal
-	ld a, [wMonStatusFlags]
-	bit 0, a
-	jr nz, .skip_win_loss_text
-	call PrintWinLossText
-
-.skip_win_loss_text
-	jp .GiveMoney
-
-.mobile
-	call BattleWinSlideInEnemyTrainerFrontpic
-	ld c, 40
-	call DelayFrames
-	ld c, $4 ; win
-	farcall Mobile_PrintOpponentBattleMessage
-	ret
-
-.battle_tower
-	call BattleWinSlideInEnemyTrainerFrontpic
-	ld c, 40
-	call DelayFrames
-	call EmptyBattleTextBox
-	ld c, $3
-	farcall BattleTowerText
-	call WaitPressAorB_BlinkCursor
-	ld hl, wPayDayMoney
-	ld a, [hli]
-	or [hl]
-	inc hl
-	or [hl]
-	ret nz
-	call ClearTileMap
-	call ClearBGPalettes
-	ret
-
-.GiveMoney:
-	ld a, [wAmuletCoin]
-	and a
-	call nz, .DoubleReward
-	call .CheckMaxedOutMomMoney
-	push af
-	ld a, $0
-	jr nc, .okay
-	ld a, [wMomSavingMoney]
-	and $7
-	cp $3
-	jr nz, .okay
-	inc a
-
-.okay
-	ld b, a
-	ld c, $4
-.loop
-	ld a, b
-	and a
-	jr z, .loop2
-	call .SendMoneyToMom
-	dec c
-	dec b
-	jr .loop
-
-.loop2
-	ld a, c
-	and a
-	jr z, .done
-	call .AddMoneyToWallet
-	dec c
-	jr .loop2
-
-.done
-	call .DoubleReward
-	call .DoubleReward
-	pop af
-	jr nc, .KeepItAll
-	ld a, [wMomSavingMoney]
-	and $7
-	jr z, .KeepItAll
-	ld hl, .SentToMomTexts
-	dec a
-	ld c, a
-	ld b, 0
-	add hl, bc
-	add hl, bc
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	jp StdBattleTextBox
-
-.KeepItAll:
-	ld hl, GotMoneyForWinningText
-	jp StdBattleTextBox
-; 3d081
-
-.SendMoneyToMom: ; 3d081
-	push bc
-	ld hl, wBattleReward + 2
-	ld de, wMomsMoney + 2
-	call AddBattleMoneyToAccount
-	pop bc
-	ret
-; 3d08d
-
-.AddMoneyToWallet: ; 3d08d
-	push bc
-	ld hl, wBattleReward + 2
-	ld de, Money + 2
-	call AddBattleMoneyToAccount
-	pop bc
-	ret
-; 3d099
-
-.DoubleReward: ; 3d099
-	ld hl, wBattleReward + 2
-	sla [hl]
-	dec hl
-	rl [hl]
-	dec hl
-	rl [hl]
-	ret nc
-	ld a, $ff
-	ld [hli], a
-	ld [hli], a
-	ld [hl], a
-	ret
-; 3d0ab
-
-.SentToMomTexts: ; 3d0ab
-	dw SentSomeToMomText
-	dw SentHalfToMomText
-	dw SentAllToMomText
-; 3d0b1
-
-.CheckMaxedOutMomMoney: ; 3d0b1
-	ld hl, wMomsMoney + 2
-	ld a, [hld]
-	cp LOW(MAX_MONEY)
-	ld a, [hld]
-	sbc HIGH(MAX_MONEY) ; mid
-	ld a, [hl]
-	sbc HIGH(MAX_MONEY >> 8)
-	ret
-; 3d0be
-
-AddBattleMoneyToAccount: ; 3d0be
-	ld c, $3
-	and a
-	push de
-	push hl
-	push bc
-	ld b, h
-	ld c, l
-	farcall TrainerRankings_AddToBattlePayouts
-	pop bc
-	pop hl
-.loop
-	ld a, [de]
-	adc [hl]
-	ld [de], a
-	dec de
-	dec hl
-	dec c
-	jr nz, .loop
-	pop hl
-	ld a, [hld]
-	cp LOW(MAX_MONEY)
-	ld a, [hld]
-	sbc HIGH(MAX_MONEY) ; mid
-	ld a, [hl]
-	sbc HIGH(MAX_MONEY >> 8)
-	ret c
-	ld [hl], HIGH(MAX_MONEY >> 8)
-	inc hl
-	ld [hl], HIGH(MAX_MONEY) ; mid
-	inc hl
-	ld [hl], LOW(MAX_MONEY)
-	ret
-; 3d0ea
-
-PlayVictoryMusic: ; 3d0ea
-	push de
-	ld de, MUSIC_NONE
-	call PlayMusic
-	call DelayFrame
-	ld de, MUSIC_WILD_VICTORY
-	ld a, [wBattleMode]
-	dec a
-	jr nz, .trainer_victory
-	push de
-	call IsAnyMonHoldingExpShare
-	pop de
-	jr nz, .play_music
-	ld hl, wPayDayMoney
-	ld a, [hli]
-	or [hl]
-	jr nz, .play_music
-	ld a, [wBattleParticipantsNotFainted]
-	and a
-	jr z, .lost
-	jr .play_music
-
-.trainer_victory
-	ld de, MUSIC_GYM_VICTORY
-	call IsJohtoGymLeader
-	jr c, .play_music
-	ld de, MUSIC_TRAINER_VICTORY
-
-.play_music
-	call PlayMusic
-
-.lost
-	pop de
-	ret
-; 3d123
-
-; These functions check if the current opponent is a gym leader or one of a
-; few other special trainers.
-
-; Note: KantoGymLeaders is a subset of JohtoGymLeaders. If you wish to
-; differentiate between the two, call IsKantoGymLeader first.
-
-; The Lance and Red entries are unused for music checks; those trainers are
-; accounted for elsewhere.
-
-IsKantoGymLeader: ; 0x3d123
-	ld hl, KantoGymLeaders
-	jr IsGymLeaderCommon
-
-IsJohtoGymLeader: ; 0x3d128
-	ld hl, JohtoGymLeaders
-IsGymLeaderCommon:
-	push de
-	ld a, [OtherTrainerClass]
-	ld de, $0001
-	call IsInArray
-	pop de
-	ret
-; 0x3d137
-
-JohtoGymLeaders:
-	db FALKNER
-	db WHITNEY
-	db BUGSY
-	db MORTY
-	db PRYCE
-	db JASMINE
-	db CHUCK
-	db CLAIR
-	db WILL
-	db BRUNO
-	db KAREN
-	db KOGA
-; fallthrough
-; these two entries are unused
-	db CHAMPION
-	db RED
-; fallthrough
-KantoGymLeaders:
-	db BROCK
-	db MISTY
-	db LT_SURGE
-	db ERIKA
-	db JANINE
-	db SABRINA
-	db BLAINE
-	db BLUE
-	db -1
-
-HandlePlayerMonFaint: ; 3d14e
-	call FaintYourPokemon
-	ld hl, EnemyMonHP
-	ld a, [hli]
-	or [hl]
-	call z, FaintEnemyPokemon
-	ld a, $1
-	ld [wWhichMonFaintedFirst], a
-	call PlayerMonFaintHappinessMod
-	call CheckPlayerPartyForFitPkmn
-	ld a, d
-	and a
-	jp z, LostBattle
-	ld hl, EnemyMonHP
-	ld a, [hli]
-	or [hl]
-	jr nz, .notfainted
-	call UpdateBattleStateAndExperienceAfterEnemyFaint
-	ld a, [wBattleMode]
-	dec a
-	jr nz, .trainer
-	ld a, $1
-	ld [BattleEnded], a
-	ret
-
-.trainer
-	call CheckEnemyTrainerDefeated
-	jp z, WinTrainerBattle
-
-.notfainted
-	call AskUseNextPokemon
-	jr nc, .switch
-	ld a, $1
-	ld [BattleEnded], a
-	ret
-
-.switch
-	call ForcePlayerMonChoice
-	call CheckMobileBattleError
-	jp c, WildFled_EnemyFled_LinkBattleCanceled
-	ld a, c
-	and a
-	ret nz
-	ld a, $1
-	ld [wPlayerAction], a
-	call HandleEnemySwitch
-	jp z, WildFled_EnemyFled_LinkBattleCanceled
-	jp DoubleSwitch
-; 3d1aa
-
-PlayerMonFaintHappinessMod: ; 3d1aa
-	ld a, [CurBattleMon]
-	ld c, a
-	ld hl, wBattleParticipantsNotFainted
-	ld b, RESET_FLAG
-	predef FlagPredef
-	ld hl, EnemySubStatus3
-	res SUBSTATUS_IN_LOOP, [hl]
-	xor a
-	ld [Danger], a
-	ld hl, PlayerDamageTaken
-	ld [hli], a
-	ld [hl], a
-	ld [BattleMonStatus], a
-	call UpdateBattleMonInParty
-	ld c, HAPPINESS_FAINTED
-	; If TheirLevel > (YourLevel + 30), use a different parameter
-	ld a, [BattleMonLevel]
-	add 30
-	ld b, a
-	ld a, [EnemyMonLevel]
-	cp b
-	jr c, .got_param
-	ld c, HAPPINESS_BEATENBYSTRONGFOE
-
-.got_param
-	ld a, [CurBattleMon]
-	ld [CurPartyMon], a
-	callfar ChangeHappiness
-	ld a, [wBattleResult]
-	and %11000000
-	add $1
-	ld [wBattleResult], a
-	ld a, [wWhichMonFaintedFirst]
-	and a
-	ret z
-	ret ; ??????????
-; 3d1f8
-
-AskUseNextPokemon: ; 3d1f8
-	call EmptyBattleTextBox
-	call LoadTileMapToTempTileMap
-; We don't need to be here if we're in a Trainer battle,
-; as that decision is made for us.
-	ld a, [wBattleMode]
-	and a
-	dec a
-	ret nz
-
-	ld hl, BattleText_UseNextMon
-	call StdBattleTextBox
-.loop
-	lb bc, 1, 7
-	call PlaceYesNoBox
-	ld a, [wMenuCursorY]
-	jr c, .pressed_b
-	and a
-	ret
-
-.pressed_b
-	ld a, [wMenuCursorY]
-	cp $1 ; YES
-	jr z, .loop
-	ld hl, PartyMon1Speed
-	ld de, EnemyMonSpeed
-	jp TryToRunAwayFromBattle
-; 3d227
-
-ForcePlayerMonChoice: ; 3d227
-	call EmptyBattleTextBox
-	call LoadStandardMenuDataHeader
-	call SetUpBattlePartyMenu_NoLoop
-	call ForcePickPartyMonInBattle
-	ld a, [wLinkMode]
-	and a
-	jr z, .skip_link
-	ld a, $1
-	ld [wPlayerAction], a
-	call LinkBattleSendReceiveAction
-
-.skip_link
-	xor a
-	ld [wPlayerAction], a
-	call CheckMobileBattleError
-	jr c, .enemy_fainted_mobile_error
-	ld hl, EnemyMonHP
-	ld a, [hli]
-	or [hl]
-	jr nz, .send_out_pokemon
-
-.enemy_fainted_mobile_error
-	call ClearSprites
-	call ClearBGPalettes
-	call _LoadHPBar
-	call ExitMenu
-	call LoadTileMapToTempTileMap
-	call WaitBGMap
-	call GetMemSGBLayout
-	call SetPalettes
-	xor a
-	ld c, a
-	ret
-
-.send_out_pokemon
-	call ClearSprites
-	ld a, [CurBattleMon]
-	ld [LastPlayerMon], a
-	ld a, [CurPartyMon]
-	ld [CurBattleMon], a
-	call AddBattleParticipant
-	call InitBattleMon
-	call ResetPlayerStatLevels
-	call ClearPalettes
-	call DelayFrame
-	call _LoadHPBar
-	call CloseWindow
-	call GetMemSGBLayout
-	call SetPalettes
-	call SendOutPkmnText
-	call NewBattleMonStatus
-	call BreakAttraction
-	call SendOutPlayerMon
-	call EmptyBattleTextBox
-	call LoadTileMapToTempTileMap
-	call SetPlayerTurn
-	call SpikesDamage
-	ld a, $1
-	and a
-	ld c, a
-	ret
-; 3d2b3
-
-PlayerPartyMonEntrance: ; 3d2b3
-	ld a, [CurBattleMon]
-	ld [LastPlayerMon], a
-	ld a, [CurPartyMon]
-	ld [CurBattleMon], a
-	call AddBattleParticipant
-	call InitBattleMon
-	call ResetPlayerStatLevels
-	call SendOutPkmnText
-	call NewBattleMonStatus
-	call BreakAttraction
-	call SendOutPlayerMon
-	call EmptyBattleTextBox
-	call LoadTileMapToTempTileMap
-	call SetPlayerTurn
-	jp SpikesDamage
-; 3d2e0
-
-CheckMobileBattleError: ; 3d2e0
-	ld a, [wLinkMode]
-	cp LINK_MOBILE
-	jr nz, .not_mobile ; It's not a mobile battle
-
-	ld a, [wcd2b]
-	and a
-	jr z, .not_mobile
-
-; We have a mobile battle and something else happened
-	scf
-	ret
-
-.not_mobile
-	xor a
-	ret
-; 3d2f1
-
-IsMobileBattle: ; 3d2f1
-	ld a, [wLinkMode]
-	cp LINK_MOBILE
-	ret
-; 3d2f7
-
-SetUpBattlePartyMenu_NoLoop: ; 3d2f7
-	call ClearBGPalettes
-SetUpBattlePartyMenu: ; switch to fullscreen menu?
-	farcall LoadPartyMenuGFX
-	farcall InitPartyMenuWithCancel
-	farcall InitPartyMenuBGPal7
-	farcall InitPartyMenuGFX
-	ret
-; 3d313
-
-JumpToPartyMenuAndPrintText: ; 3d313
-	farcall WritePartyMenuTilemap
-	farcall PrintPartyMenuText
-	call WaitBGMap
-	call SetPalettes
-	call DelayFrame
-	ret
-; 3d329
-
-SelectBattleMon: ; 3d329
-	call IsMobileBattle
-	jr z, .mobile
-	farcall PartyMenuSelect
-	ret
-
-.mobile
-	farcall Mobile_PartyMenuSelect
-	ret
-; 3d33c
-
-PickPartyMonInBattle: ; 3d33c
-.loop
-	ld a, PARTYMENUACTION_SWITCH ; Which PKMN?
-	ld [PartyMenuActionText], a
-	call JumpToPartyMenuAndPrintText
-	call SelectBattleMon
-	ret c
-	call CheckIfCurPartyMonIsFitToFight
-	jr z, .loop
-	xor a
-	ret
-; 3d34f
-
-SwitchMonAlreadyOut: ; 3d34f
-	ld hl, CurBattleMon
-	ld a, [CurPartyMon]
-	cp [hl]
-	jr nz, .notout
-
-	ld hl, BattleText_PkmnIsAlreadyOut
-	call StdBattleTextBox
-	scf
-	ret
-
-.notout
-	xor a
-	ret
-; 3d362
-
-ForcePickPartyMonInBattle: ; 3d362
-; Can't back out.
-
-.pick
-	call PickPartyMonInBattle
-	ret nc
-	call CheckMobileBattleError
-	ret c
-
-	ld de, SFX_WRONG
-	call PlaySFX
-	call WaitSFX
-	jr .pick
-; 3d375
-
-PickSwitchMonInBattle: ; 3d375
-.pick
-	call PickPartyMonInBattle
-	ret c
-	call SwitchMonAlreadyOut
-	jr c, .pick
-	xor a
-	ret
-; 3d380
-
-ForcePickSwitchMonInBattle: ; 3d380
-; Can't back out.
-
-.pick
-	call ForcePickPartyMonInBattle
-	call CheckMobileBattleError
-	ret c
-	call SwitchMonAlreadyOut
-	jr c, .pick
-
-	xor a
-	ret
-; 3d38e
-
-LostBattle: ; 3d38e
-	ld a, 1
-	ld [BattleEnded], a
-
-	ld a, [InBattleTowerBattle]
-	bit 0, a
-	jr nz, .battle_tower
-
-	ld a, [BattleType]
-	cp BATTLETYPE_CANLOSE
-	jr nz, .not_canlose
-
-; Remove the enemy from the screen.
-	hlcoord 0, 0
-	lb bc, 8, 21
-	call ClearBox
-	call BattleWinSlideInEnemyTrainerFrontpic
-
-	ld c, 40
-	call DelayFrames
-
-	ld a, [wMonStatusFlags]
-	bit 0, a
-	jr nz, .skip_win_loss_text
-	call PrintWinLossText
-.skip_win_loss_text
-	ret
-
-.battle_tower
-; Remove the enemy from the screen.
-	hlcoord 0, 0
-	lb bc, 8, 21
-	call ClearBox
-	call BattleWinSlideInEnemyTrainerFrontpic
-
-	ld c, 40
-	call DelayFrames
-
-	call EmptyBattleTextBox
-	ld c, 2
-	farcall BattleTowerText
-	call WaitPressAorB_BlinkCursor
-	call ClearTileMap
-	call ClearBGPalettes
-	ret
-
-.not_canlose
-	ld a, [wLinkMode]
-	and a
-	jr nz, .LostLinkBattle
-
-; Greyscale
-	ld b, SCGB_BATTLE_GRAYSCALE
-	call GetSGBLayout
-	call SetPalettes
-	jr .end
-
-.LostLinkBattle:
-	call UpdateEnemyMonInParty
-	call CheckEnemyTrainerDefeated
-	jr nz, .not_tied
-	ld hl, TiedAgainstText
-	ld a, [wBattleResult]
-	and $c0
-	add 2
-	ld [wBattleResult], a
-	jr .text
-
-.not_tied
-	ld hl, LostAgainstText
-	call IsMobileBattle
-	jr z, .mobile
-
-.text
-	call StdBattleTextBox
-
-.end
-	scf
-	ret
-
-.mobile
-; Remove the enemy from the screen.
-	hlcoord 0, 0
-	lb bc, 8, 21
-	call ClearBox
-	call BattleWinSlideInEnemyTrainerFrontpic
-
-	ld c, 40
-	call DelayFrames
-
-	ld c, $3 ; lost
-	farcall Mobile_PrintOpponentBattleMessage
-	scf
-	ret
-; 3d432
-
-EnemyMonFaintedAnimation: ; 3d432
-	hlcoord 12, 5
-	decoord 12, 6
-	jp MonFaintedAnimation
-; 3d43b
-
-PlayerMonFaintedAnimation: ; 3d43b
-	hlcoord 1, 10
-	decoord 1, 11
-	jp MonFaintedAnimation
-; 3d444
-
-MonFaintedAnimation: ; 3d444
-	ld a, [wcfbe]
-	push af
-	set 6, a
-	ld [wcfbe], a
-	ld b, 7
-
-.OuterLoop:
-	push bc
-	push de
-	push hl
-	ld b, 6
-
-.InnerLoop:
-	push bc
-	push hl
-	push de
-	ld bc, 7
-	call CopyBytes
-	pop de
-	pop hl
-	ld bc, -SCREEN_WIDTH
-	add hl, bc
-	push hl
-	ld h, d
-	ld l, e
-	add hl, bc
-	ld d, h
-	ld e, l
-	pop hl
-	pop bc
-	dec b
-	jr nz, .InnerLoop
-
-	ld bc, 20
-	add hl, bc
-	ld de, .Spaces
-	call PlaceString
-	ld c, 2
-	call DelayFrames
-	pop hl
-	pop de
-	pop bc
-	dec b
-	jr nz, .OuterLoop
-
-	pop af
-	ld [wcfbe], a
-	ret
-; 3d488
-
-.Spaces:
-	db "       @"
-; 3d490
-
-SlideBattlePicOut: ; 3d490
-	ld [hMapObjectIndexBuffer], a
-	ld c, a
-.loop
-	push bc
-	push hl
-	ld b, $7
-.loop2
-	push hl
-	call .DoFrame
-	pop hl
-	ld de, SCREEN_WIDTH
-	add hl, de
-	dec b
-	jr nz, .loop2
-	ld c, 2
-	call DelayFrames
-	pop hl
-	pop bc
-	dec c
-	jr nz, .loop
-	ret
-; 3d4ae
-
-.DoFrame: ; 3d4ae
-	ld a, [hMapObjectIndexBuffer]
-	ld c, a
-	cp $8
-	jr nz, .back
-.forward
-	ld a, [hli]
-	ld [hld], a
-	dec hl
-	dec c
-	jr nz, .forward
-	ret
-
-.back
-	ld a, [hld]
-	ld [hli], a
-	inc hl
-	dec c
-	jr nz, .back
-	ret
-; 3d4c3
-
-ForceEnemySwitch: ; 3d4c3
-	call ResetEnemyBattleVars
-	ld a, [wEnemySwitchMonIndex]
-	dec a
-	ld b, a
-	call LoadEnemyPkmnToSwitchTo
-	call ClearEnemyMonBox
-	call NewEnemyMonStatus
-	call ResetEnemyStatLevels
-	call Function_SetEnemyPkmnAndSendOutAnimation
-	call BreakAttraction
-	call ResetBattleParticipants
-	ret
-; 3d4e1
-
-EnemySwitch: ; 3d4e1
-	call CheckWhetherToAskSwitch
-	jr nc, EnemySwitch_SetMode
-	; Shift Mode
-	call ResetEnemyBattleVars
-	call CheckWhetherSwitchmonIsPredetermined
-	jr c, .skip
-	call FindPkmnInOTPartyToSwitchIntoBattle
-.skip
-	; 'b' contains the PartyNr of the Pkmn the AI will switch to
-	call LoadEnemyPkmnToSwitchTo
-	call OfferSwitch
-	push af
-	call ClearEnemyMonBox
-	call Function_BattleTextEnemySentOut
-	call Function_SetEnemyPkmnAndSendOutAnimation
-	pop af
-	ret c
-	; If we're here, then we're switching too
-	xor a
-	ld [wBattleParticipantsNotFainted], a
-	ld [wBattleParticipantsIncludingFainted], a
-	ld [wPlayerAction], a
-	inc a
-	ld [wEnemyIsSwitching], a
-	call LoadTileMapToTempTileMap
-	jp PlayerSwitch
-; 3d517
-
-EnemySwitch_SetMode: ; 3d517
-	call ResetEnemyBattleVars
-	call CheckWhetherSwitchmonIsPredetermined
-	jr c, .skip
-	call FindPkmnInOTPartyToSwitchIntoBattle
-.skip
-	; 'b' contains the PartyNr of the Pkmn the AI will switch to
-	call LoadEnemyPkmnToSwitchTo
-	ld a, 1
-	ld [wEnemyIsSwitching], a
-	call ClearEnemyMonBox
-	call Function_BattleTextEnemySentOut
-	jp Function_SetEnemyPkmnAndSendOutAnimation
-; 3d533
-
-CheckWhetherSwitchmonIsPredetermined: ; 3d533
-; returns carry if: ???
-	ld a, [wLinkMode]
-	and a
-	jr z, .not_linked
-
-	ld a, [wBattleAction]
-	sub BATTLEACTION_SWITCH1
-	ld b, a
-	jr .return_carry
-
-.not_linked
-	ld a, [wEnemySwitchMonIndex]
-	and a
-	jr z, .check_wBattleHasJustStarted
-
-	dec a
-	ld b, a
-	jr .return_carry
-
-.check_wBattleHasJustStarted
-	ld a, [wBattleHasJustStarted]
-	and a
-	ld b, $0
-	jr nz, .return_carry
-
-	and a
-	ret
-
-.return_carry
-	scf
-	ret
-; 3d557
-
-ResetEnemyBattleVars: ; 3d557
-; and draw empty TextBox
-	xor a
-	ld [LastPlayerCounterMove], a
-	ld [LastEnemyCounterMove], a
-	ld [LastEnemyMove], a
-	ld [CurEnemyMove], a
-	dec a
-	ld [wEnemyItemState], a
-	xor a
-	ld [wPlayerWrapCount], a
-	hlcoord 18, 0
-	ld a, 8
-	call SlideBattlePicOut
-	call EmptyBattleTextBox
-	jp LoadStandardMenuDataHeader
-; 3d57a
-
-ResetBattleParticipants: ; 3d57a
-	xor a
-	ld [wBattleParticipantsNotFainted], a
-	ld [wBattleParticipantsIncludingFainted], a
-AddBattleParticipant: ; 3d581
-	ld a, [CurBattleMon]
-	ld c, a
-	ld hl, wBattleParticipantsNotFainted
-	ld b, SET_FLAG
-	push bc
-	predef FlagPredef
-	pop bc
-	ld hl, wBattleParticipantsIncludingFainted
-	predef_jump FlagPredef
-; 3d599
-
-FindPkmnInOTPartyToSwitchIntoBattle: ; 3d599
-	ld b, $ff
-	ld a, $1
-	ld [Buffer1], a
-	ld [Buffer2], a
-.loop
-	ld hl, Buffer1
-	sla [hl]
-	inc hl
-	sla [hl]
-	inc b
-	ld a, [OTPartyCount]
-	cp b
-	jp z, ScoreMonTypeMatchups
-	ld a, [CurOTMon]
-	cp b
-	jr z, .discourage
-	ld hl, OTPartyMon1HP
-	push bc
-	ld a, b
-	call GetPartyLocation
-	ld a, [hli]
-	ld c, a
-	ld a, [hl]
-	or c
-	pop bc
-	jr z, .discourage
-	call LookUpTheEffectivenessOfEveryMove
-	call IsThePlayerPkmnTypesEffectiveAgainstOTPkmn
-	jr .loop
-
-.discourage
-	ld hl, Buffer2
-	set 0, [hl]
-	jr .loop
-; 3d5d7
-
-LookUpTheEffectivenessOfEveryMove: ; 3d5d7
-	push bc
-	ld hl, OTPartyMon1Moves
-	ld a, b
-	call GetPartyLocation
-	pop bc
-	ld e, NUM_MOVES + 1
-.loop
-	dec e
-	jr z, .done
-	ld a, [hli]
-	and a
-	jr z, .done
-	push hl
-	push de
-	push bc
-	dec a
-	ld hl, Moves
-	ld bc, MOVE_LENGTH
-	call AddNTimes
-	ld de, wEnemyMoveStruct
-	ld a, BANK(Moves)
-	call FarCopyBytes
-	call SetEnemyTurn
-	callfar BattleCheckTypeMatchup
-	pop bc
-	pop de
-	pop hl
-	ld a, [wd265] ; Get The Effectiveness Modifier
-	cp 10 + 1 ; 1.0 + 0.1
-	jr c, .loop
-	ld hl, Buffer1
-	set 0, [hl]
-	ret
-.done
-	ret
-; 3d618
-
-IsThePlayerPkmnTypesEffectiveAgainstOTPkmn: ; 3d618
-; Calculates the effectiveness of the types of the PlayerPkmn
-; against the OTPkmn
-	push bc
-	ld hl, OTPartyCount
-	ld a, b
-	inc a
-	ld c, a
-	ld b, 0
-	add hl, bc
-	ld a, [hl]
-	dec a
-	ld hl, BaseData + BASE_TYPES
-	ld bc, BASE_DATA_SIZE
-	call AddNTimes
-	ld de, EnemyMonType
-	ld bc, BASE_CATCH_RATE - BASE_TYPES
-	ld a, BANK(BaseData)
-	call FarCopyBytes
-	ld a, [BattleMonType1]
-	ld [wPlayerMoveStruct + MOVE_TYPE], a
-	call SetPlayerTurn
-	callfar BattleCheckTypeMatchup
-	ld a, [wd265]
-	cp 10 + 1 ; 1.0 + 0.1
-	jr nc, .super_effective
-	ld a, [BattleMonType2]
-	ld [wPlayerMoveStruct + MOVE_TYPE], a
-	callfar BattleCheckTypeMatchup
-	ld a, [wd265]
-	cp 10 + 1 ; 1.0 + 0.1
-	jr nc, .super_effective
-	pop bc
-	ret
-
-.super_effective
-	pop bc
-	ld hl, Buffer1
-	bit 0, [hl]
-	jr nz, .reset
-	inc hl
-	set 0, [hl]
-	ret
-
-.reset
-	res 0, [hl]
-	ret
-; 3d672
-
-ScoreMonTypeMatchups: ; 3d672
-.loop1
-	ld hl, Buffer1
-	sla [hl]
-	inc hl
-	sla [hl]
-	jr nc, .loop1
-	ld a, [OTPartyCount]
-	ld b, a
-	ld c, [hl]
-.loop2
-	sla c
-	jr nc, .okay
-	dec b
-	jr z, .loop5
-	jr .loop2
-
-.okay
-	ld a, [Buffer1]
-	and a
-	jr z, .okay2
-	ld b, $ff
-	ld c, a
-.loop3
-	inc b
-	sla c
-	jr nc, .loop3
-	jr .quit
-
-.okay2
-	ld b, $ff
-	ld a, [Buffer2]
-	ld c, a
-.loop4
-	inc b
-	sla c
-	jr c, .loop4
-	jr .quit
-
-.loop5
-	ld a, [OTPartyCount]
-	ld b, a
-	call BattleRandom
-	and $7
-	cp b
-	jr nc, .loop5
-	ld b, a
-	ld a, [CurOTMon]
-	cp b
-	jr z, .loop5
-	ld hl, OTPartyMon1HP
-	push bc
-	ld a, b
-	call GetPartyLocation
-	pop bc
-	ld a, [hli]
-	ld c, a
-	ld a, [hl]
-	or c
-	jr z, .loop5
-
-.quit
-	ret
-; 3d6ca
-
-LoadEnemyPkmnToSwitchTo: ; 3d6ca
-	; 'b' contains the PartyNr of the Pkmn the AI will switch to
-	ld a, b
-	ld [CurPartyMon], a
-	ld hl, OTPartyMon1Level
-	call GetPartyLocation
-	ld a, [hl]
-	ld [CurPartyLevel], a
-	ld a, [CurPartyMon]
-	inc a
-	ld hl, OTPartyCount
-	ld c, a
-	ld b, 0
-	add hl, bc
-	ld a, [hl]
-	ld [TempEnemyMonSpecies], a
-	ld [CurPartySpecies], a
-	call LoadEnemyMon
-
-	ld a, [CurPartySpecies]
-	cp UNOWN
-	jr nz, .skip_unown
-	ld a, [wFirstUnownSeen]
-	and a
-	jr nz, .skip_unown
-	ld hl, EnemyMonDVs
-	predef GetUnownLetter
-	ld a, [UnownLetter]
-	ld [wFirstUnownSeen], a
-.skip_unown
-
-	ld hl, EnemyMonHP
-	ld a, [hli]
-	ld [wEnemyHPAtTimeOfPlayerSwitch], a
-	ld a, [hl]
-	ld [wEnemyHPAtTimeOfPlayerSwitch + 1], a
-	ret
-; 3d714
-
-CheckWhetherToAskSwitch: ; 3d714
-	ld a, [wBattleHasJustStarted]
-	dec a
-	jp z, .return_nc
-	ld a, [PartyCount]
-	dec a
-	jp z, .return_nc
-	ld a, [wLinkMode]
-	and a
-	jp nz, .return_nc
-	ld a, [Options]
-	bit BATTLE_SHIFT, a
-	jr nz, .return_nc
-	ld a, [CurPartyMon]
-	push af
-	ld a, [CurBattleMon]
-	ld [CurPartyMon], a
-	farcall CheckCurPartyMonFainted
-	pop bc
-	ld a, b
-	ld [CurPartyMon], a
-	jr c, .return_nc
-	scf
-	ret
-
-.return_nc
-	and a
-	ret
-; 3d74b
-
-OfferSwitch: ; 3d74b
-	ld a, [CurPartyMon]
-	push af
-	callfar Battle_GetTrainerName
-	ld hl, BattleText_EnemyIsAboutToUseWillPlayerChangePkmn
-	call StdBattleTextBox
-	lb bc, 1, 7
-	call PlaceYesNoBox
-	ld a, [wMenuCursorY]
-	dec a
-	jr nz, .said_no
-	call SetUpBattlePartyMenu_NoLoop
-	call PickSwitchMonInBattle
-	jr c, .canceled_switch
-	ld a, [CurBattleMon]
-	ld [LastPlayerMon], a
-	ld a, [CurPartyMon]
-	ld [CurBattleMon], a
-	call ClearPalettes
-	call DelayFrame
-	call _LoadHPBar
-	pop af
-	ld [CurPartyMon], a
-	xor a
-	ld [CurEnemyMove], a
-	ld [CurPlayerMove], a
-	and a
-	ret
-
-.canceled_switch
-	call ClearPalettes
-	call DelayFrame
-	call _LoadHPBar
-
-.said_no
-	pop af
-	ld [CurPartyMon], a
-	scf
-	ret
-; 3d7a0
-
-ClearEnemyMonBox: ; 3d7a0
-	xor a
-	ld [hBGMapMode], a
-	call ExitMenu
-	call ClearSprites
-	hlcoord 1, 0
-	lb bc, 4, 10
-	call ClearBox
-	call WaitBGMap
-	jp FinishBattleAnim
-; 3d7b8
-
-Function_BattleTextEnemySentOut: ; 3d7b8
-	callfar Battle_GetTrainerName
-	ld hl, BattleText_EnemySentOut
-	call StdBattleTextBox
-	jp WaitBGMap
-; 3d7c7
-
-Function_SetEnemyPkmnAndSendOutAnimation: ; 3d7c7
-	ld a, [TempEnemyMonSpecies]
-	ld [CurPartySpecies], a
-	ld [CurSpecies], a
-	call GetBaseData
-	ld a, OTPARTYMON
-	ld [MonType], a
-	predef CopyPkmnToTempMon
-	call GetEnemyMonFrontpic
-
-	xor a
-	ld [wNumHits], a
-	ld [wBattleAnimParam], a
-	call SetEnemyTurn
-	ld de, ANIM_SEND_OUT_MON
-	call Call_PlayBattleAnim
-
-	call BattleCheckEnemyShininess
-	jr nc, .not_shiny
-	ld a, 1 ; shiny anim
-	ld [wBattleAnimParam], a
-	ld de, ANIM_SEND_OUT_MON
-	call Call_PlayBattleAnim
-.not_shiny
-
-	ld bc, TempMonSpecies
-	farcall CheckFaintedFrzSlp
-	jr c, .skip_cry
-	farcall CheckBattleScene
-	jr c, .cry_no_anim
-	hlcoord 12, 0
-	ld d, $0
-	ld e, ANIM_MON_SLOW
-	predef AnimateFrontpic
-	jr .skip_cry
-
-.cry_no_anim
-	ld a, $f
-	ld [CryTracks], a
-	ld a, [TempEnemyMonSpecies]
-	call PlayStereoCry
-
-.skip_cry
-	call UpdateEnemyHUD
-	ld a, $1
-	ld [hBGMapMode], a
-	ret
-; 3d834
-
-NewEnemyMonStatus: ; 3d834
-	xor a
-	ld [LastPlayerCounterMove], a
-	ld [LastEnemyCounterMove], a
-	ld [LastEnemyMove], a
-	ld hl, EnemySubStatus1
-rept 4
-	ld [hli], a
-endr
-	ld [hl], a
-	ld [EnemyDisableCount], a
-	ld [EnemyFuryCutterCount], a
-	ld [EnemyProtectCount], a
-	ld [wEnemyRageCounter], a
-	ld [EnemyDisabledMove], a
-	ld [wEnemyMinimized], a
-	ld [wPlayerWrapCount], a
-	ld [wEnemyWrapCount], a
-	ld [EnemyTurnsTaken], a
-	ld hl, PlayerSubStatus5
-	res SUBSTATUS_CANT_RUN, [hl]
-	ret
-; 3d867
-
-ResetEnemyStatLevels: ; 3d867
-	ld a, BASE_STAT_LEVEL
-	ld b, NUM_LEVEL_STATS
-	ld hl, EnemyStatLevels
-.loop
-	ld [hli], a
-	dec b
-	jr nz, .loop
-	ret
-; 3d873
-
-CheckPlayerPartyForFitPkmn: ; 3d873
-; Has the player any Pkmn in his Party that can fight?
-	ld a, [PartyCount]
-	ld e, a
-	xor a
-	ld hl, PartyMon1HP
-	ld bc, PartyMon2 - (PartyMon1 + 1)
-.loop
-	or [hl]
-	inc hl
-	or [hl]
-	add hl, bc
-	dec e
-	jr nz, .loop
-	ld d, a
-	ret
-; 3d887
-
-CheckIfCurPartyMonIsFitToFight: ; 3d887
-	ld a, [CurPartyMon]
-	ld hl, PartyMon1HP
-	call GetPartyLocation
-	ld a, [hli]
-	or [hl]
-	ret nz
-
-	ld a, [wBattleHasJustStarted]
-	and a
-	jr nz, .finish_fail
-	ld hl, PartySpecies
-	ld a, [CurPartyMon]
-	ld c, a
-	ld b, 0
-	add hl, bc
-	ld a, [hl]
-	cp EGG
-	ld hl, BattleText_AnEGGCantBattle
-	jr z, .print_textbox
-
-	ld hl, BattleText_TheresNoWillToBattle
-
-.print_textbox
-	call StdBattleTextBox
-
-.finish_fail
-	xor a
-	ret
-; 3d8b3
-
-TryToRunAwayFromBattle: ; 3d8b3
-; Run away from battle, with or without item
-	ld a, [BattleType]
-	cp BATTLETYPE_DEBUG
-	jp z, .can_escape
-	cp BATTLETYPE_CONTEST
-	jp z, .can_escape
-	cp BATTLETYPE_TRAP
-	jp z, .cant_escape
-	cp BATTLETYPE_CELEBI
-	jp z, .cant_escape
-	cp BATTLETYPE_SHINY
-	jp z, .cant_escape
-	cp BATTLETYPE_SUICUNE
-	jp z, .cant_escape
-
-	ld a, [wLinkMode]
-	and a
-	jp nz, .can_escape
-
-	ld a, [wBattleMode]
-	dec a
-	jp nz, .cant_run_from_trainer
-
-	ld a, [EnemySubStatus5]
-	bit SUBSTATUS_CANT_RUN, a
-	jp nz, .cant_escape
-
-	ld a, [wPlayerWrapCount]
-	and a
-	jp nz, .cant_escape
-
-	push hl
-	push de
-	ld a, [BattleMonItem]
-	ld [wd265], a
-	ld b, a
-	callfar GetItemHeldEffect
-	ld a, b
-	cp HELD_ESCAPE
-	pop de
-	pop hl
-	jr nz, .no_flee_item
-
-	call SetPlayerTurn
-	call GetItemName
-	ld hl, BattleText_UserFledUsingAStringBuffer1
-	call StdBattleTextBox
-	jp .can_escape
-
-.no_flee_item
-	ld a, [wNumFleeAttempts]
-	inc a
-	ld [wNumFleeAttempts], a
-	ld a, [hli]
-	ld [hStringCmpString2 + 0], a
-	ld a, [hl]
-	ld [hStringCmpString2 + 1], a
-	ld a, [de]
-	inc de
-	ld [hStringCmpString1 + 0], a
-	ld a, [de]
-	ld [hStringCmpString1 + 1], a
-	call Call_LoadTempTileMapToTileMap
-	ld de, hStringCmpString2
-	ld hl, hStringCmpString1
-	ld c, $2
-	call StringCmp
-	jr nc, .can_escape
-
-	xor a
-	ld [hMultiplicand], a
-	ld a, $20
-	ld [hMultiplier], a
-	call Multiply
-	ld a, [hProduct + 2]
-	ld [hDividend + 0], a
-	ld a, [hProduct + 3]
-	ld [hDividend + 1], a
-	ld a, [hStringCmpString1 + 0]
-	ld b, a
-	ld a, [hStringCmpString1 + 1]
-	srl b
-	rr a
-	srl b
-	rr a
-	and a
-	jr z, .can_escape
-	ld [hDivisor], a
-	ld b, 2
-	call Divide
-	ld a, [hQuotient + 1]
-	and a
-	jr nz, .can_escape
-	ld a, [wNumFleeAttempts]
-	ld c, a
-.loop
-	dec c
-	jr z, .cant_escape_2
-	ld b, 30
-	ld a, [hQuotient + 2]
-	add b
-	ld [hQuotient + 2], a
-	jr c, .can_escape
-	jr .loop
-
-.cant_escape_2
-	call BattleRandom
-	ld b, a
-	ld a, [hQuotient + 2]
-	cp b
-	jr nc, .can_escape
-	ld a, $1
-	ld [wPlayerAction], a
-	ld hl, BattleText_CantEscape2
-	jr .print_inescapable_text
-
-.cant_escape
-	ld hl, BattleText_CantEscape
-	jr .print_inescapable_text
-
-.cant_run_from_trainer
-	ld hl, BattleText_TheresNoEscapeFromTrainerBattle
-
-.print_inescapable_text
-	call StdBattleTextBox
-	ld a, $1
-	ld [wFailedToFlee], a
-	call LoadTileMapToTempTileMap
-	and a
-	ret
-
-.can_escape
-	ld a, [wLinkMode]
-	and a
-	ld a, DRAW
-	jr z, .fled
-	call LoadTileMapToTempTileMap
-	xor a
-	ld [wPlayerAction], a
-	ld a, $f
-	ld [CurMoveNum], a
-	xor a
-	ld [CurPlayerMove], a
-	call LinkBattleSendReceiveAction
-	call Call_LoadTempTileMapToTileMap
-	call CheckMobileBattleError
-	jr c, .mobile
-
-	; Got away safely
-	ld a, [wBattleAction]
-	cp BATTLEACTION_FORFEIT
-	ld a, DRAW
-	jr z, .fled
-	dec a
-.fled
-	ld b, a
-	ld a, [wBattleResult]
-	and $c0
-	add b
-	ld [wBattleResult], a
-	call StopDangerSound
-	push de
-	ld de, SFX_RUN
-	call WaitPlaySFX
-	pop de
-	call WaitSFX
-	ld hl, BattleText_GotAwaySafely
-	call StdBattleTextBox
-	call WaitSFX
-	call LoadTileMapToTempTileMap
-	scf
-	ret
-
-.mobile
-	call StopDangerSound
-	ld hl, wcd2a
-	bit 4, [hl]
-	jr nz, .skip_link_error
-	ld hl, BattleText_LinkErrorBattleCanceled
-	call StdBattleTextBox
-
-.skip_link_error
-	call WaitSFX
-	call LoadTileMapToTempTileMap
-	scf
-	ret
-; 3da0d
-
-InitBattleMon: ; 3da0d
-	ld a, MON_SPECIES
-	call GetPartyParamLocation
-	ld de, BattleMonSpecies
-	ld bc, MON_ID
-	call CopyBytes
-	ld bc, MON_DVS - MON_ID
-	add hl, bc
-	ld de, BattleMonDVs
-	ld bc, MON_PKRUS - MON_DVS
-	call CopyBytes
-	inc hl
-	inc hl
-	inc hl
-	ld de, BattleMonLevel
-	ld bc, PARTYMON_STRUCT_LENGTH - MON_LEVEL
-	call CopyBytes
-	ld a, [BattleMonSpecies]
-	ld [TempBattleMonSpecies], a
-	ld [CurPartySpecies], a
-	ld [CurSpecies], a
-	call GetBaseData
-	ld a, [BaseType1]
-	ld [BattleMonType1], a
-	ld a, [BaseType2]
-	ld [BattleMonType2], a
-	ld hl, PartyMonNicknames
-	ld a, [CurBattleMon]
-	call SkipNames
-	ld de, BattleMonNick
-	ld bc, PKMN_NAME_LENGTH
-	call CopyBytes
-	ld hl, BattleMonAttack
-	ld de, PlayerStats
-	ld bc, PARTYMON_STRUCT_LENGTH - MON_ATK
-	call CopyBytes
-	call ApplyStatusEffectOnPlayerStats
-	call BadgeStatBoosts
-	ret
-; 3da74
-
-BattleCheckPlayerShininess: ; 3da74
-	call GetPartyMonDVs
-	jr BattleCheckShininess
-
-BattleCheckEnemyShininess: ; 3da79
-	call GetEnemyMonDVs
-
-BattleCheckShininess: ; 3da7c
-	ld b, h
-	ld c, l
-	callfar CheckShininess
-	ret
-; 3da85
-
-GetPartyMonDVs: ; 3da85
-	ld hl, BattleMonDVs
-	ld a, [PlayerSubStatus5]
-	bit SUBSTATUS_TRANSFORMED, a
-	ret z
-	ld hl, PartyMon1DVs
-	ld a, [CurBattleMon]
-	jp GetPartyLocation
-; 3da97
-
-GetEnemyMonDVs: ; 3da97
-	ld hl, EnemyMonDVs
-	ld a, [EnemySubStatus5]
-	bit SUBSTATUS_TRANSFORMED, a
-	ret z
-	ld hl, wEnemyBackupDVs
-	ld a, [wBattleMode]
-	dec a
-	ret z
-	ld hl, OTPartyMon1DVs
-	ld a, [CurOTMon]
-	jp GetPartyLocation
-; 3dab1
-
-ResetPlayerStatLevels: ; 3dab1
-	ld a, BASE_STAT_LEVEL
-	ld b, NUM_LEVEL_STATS
-	ld hl, PlayerStatLevels
-.loop
-	ld [hli], a
-	dec b
-	jr nz, .loop
-	ret
-; 3dabd
-
-InitEnemyMon: ; 3dabd
-	ld a, [CurPartyMon]
-	ld hl, OTPartyMon1Species
-	call GetPartyLocation
-	ld de, EnemyMonSpecies
-	ld bc, MON_ID
-	call CopyBytes
-	ld bc, MON_DVS - MON_ID
-	add hl, bc
-	ld de, EnemyMonDVs
-	ld bc, MON_PKRUS - MON_DVS
-	call CopyBytes
-	inc hl
-	inc hl
-	inc hl
-	ld de, EnemyMonLevel
-	ld bc, PARTYMON_STRUCT_LENGTH - MON_LEVEL
-	call CopyBytes
-	ld a, [EnemyMonSpecies]
-	ld [CurSpecies], a
-	call GetBaseData
-	ld hl, OTPartyMonNicknames
-	ld a, [CurPartyMon]
-	call SkipNames
-	ld de, EnemyMonNick
-	ld bc, PKMN_NAME_LENGTH
-	call CopyBytes
-	ld hl, EnemyMonAttack
-	ld de, EnemyStats
-	ld bc, PARTYMON_STRUCT_LENGTH - MON_ATK
-	call CopyBytes
-	call ApplyStatusEffectOnEnemyStats
-	ld hl, BaseType1
-	ld de, EnemyMonType1
-	ld a, [hli]
-	ld [de], a
-	inc de
-	ld a, [hl]
-	ld [de], a
-	ld hl, BaseStats
-	ld de, EnemyMonBaseStats
-	ld b, 5
-.loop
-	ld a, [hli]
-	ld [de], a
-	inc de
-	dec b
-	jr nz, .loop
-	ld a, [CurPartyMon]
-	ld [CurOTMon], a
-	ret
-; 3db32
-
-SwitchPlayerMon: ; 3db32
-	call ClearSprites
-	ld a, [CurBattleMon]
-	ld [LastPlayerMon], a
-	ld a, [CurPartyMon]
-	ld [CurBattleMon], a
-	call AddBattleParticipant
-	call InitBattleMon
-	call ResetPlayerStatLevels
-	call NewBattleMonStatus
-	call BreakAttraction
-	call SendOutPlayerMon
-	call EmptyBattleTextBox
-	call LoadTileMapToTempTileMap
-	ld hl, EnemyMonHP
-	ld a, [hli]
-	or [hl]
-	ret
-; 3db5f
-
-SendOutPlayerMon: ; 3db5f
-	ld hl, BattleMonDVs
-	predef GetUnownLetter
-	hlcoord 1, 5
-	ld b, 7
-	ld c, 8
-	call ClearBox
-	call WaitBGMap
-	xor a
-	ld [hBGMapMode], a
-	call GetBattleMonBackpic
-	xor a
-	ld [hGraphicStartTile], a
-	ld [wBattleMenuCursorBuffer], a
-	ld [CurMoveNum], a
-	ld [TypeModifier], a
-	ld [wPlayerMoveStruct + MOVE_ANIM], a
-	ld [LastPlayerCounterMove], a
-	ld [LastEnemyCounterMove], a
-	ld [LastPlayerMove], a
-	call CheckAmuletCoin
-	call FinishBattleAnim
-	xor a
-	ld [wEnemyWrapCount], a
-	call SetPlayerTurn
-	xor a
-	ld [wNumHits], a
-	ld [wBattleAnimParam], a
-	ld de, ANIM_SEND_OUT_MON
-	call Call_PlayBattleAnim
-	call BattleCheckPlayerShininess
-	jr nc, .not_shiny
-	ld a, 1
-	ld [wBattleAnimParam], a
-	ld de, ANIM_SEND_OUT_MON
-	call Call_PlayBattleAnim
-
-.not_shiny
-	ld a, MON_SPECIES
-	call GetPartyParamLocation
-	ld b, h
-	ld c, l
-	farcall CheckFaintedFrzSlp
-	jr c, .statused
-	ld a, $f0
-	ld [CryTracks], a
-	ld a, [CurPartySpecies]
-	call PlayStereoCry
-
-.statused
-	call UpdatePlayerHUD
-	ld a, $1
-	ld [hBGMapMode], a
-	ret
-; 3dbde
-
-NewBattleMonStatus: ; 3dbde
-	xor a
-	ld [LastPlayerCounterMove], a
-	ld [LastEnemyCounterMove], a
-	ld [LastPlayerMove], a
-	ld hl, PlayerSubStatus1
-rept 4
-	ld [hli], a
-endr
-	ld [hl], a
-	ld hl, PlayerUsedMoves
-	ld [hli], a
-	ld [hli], a
-	ld [hli], a
-	ld [hl], a
-	ld [PlayerDisableCount], a
-	ld [PlayerFuryCutterCount], a
-	ld [PlayerProtectCount], a
-	ld [wPlayerRageCounter], a
-	ld [DisabledMove], a
-	ld [wPlayerMinimized], a
-	ld [wEnemyWrapCount], a
-	ld [wPlayerWrapCount], a
-	ld [PlayerTurnsTaken], a
-	ld hl, EnemySubStatus5
-	res SUBSTATUS_CANT_RUN, [hl]
-	ret
-; 3dc18
-
-BreakAttraction: ; 3dc18
-	ld hl, PlayerSubStatus1
-	res SUBSTATUS_IN_LOVE, [hl]
-	ld hl, EnemySubStatus1
-	res SUBSTATUS_IN_LOVE, [hl]
-	ret
-; 3dc23
-
-SpikesDamage: ; 3dc23
-	ld hl, PlayerScreens
-	ld de, BattleMonType
-	ld bc, UpdatePlayerHUD
-	ld a, [hBattleTurn]
-	and a
-	jr z, .ok
-	ld hl, EnemyScreens
-	ld de, EnemyMonType
-	ld bc, UpdateEnemyHUD
-.ok
-
-	bit SCREENS_SPIKES, [hl]
-	ret z
-
-	; Flying-types aren't affected by Spikes.
-	ld a, [de]
-	cp FLYING
-	ret z
-	inc de
-	ld a, [de]
-	cp FLYING
-	ret z
-
-	push bc
-
-	ld hl, BattleText_UserHurtBySpikes ; "hurt by SPIKES!"
-	call StdBattleTextBox
-
-	call GetEighthMaxHP
-	call SubtractHPFromTarget
-
-	pop hl
-	call .hl
-
-	jp WaitBGMap
-
-.hl
-	jp hl
-; 3dc5b
-
-PursuitSwitch: ; 3dc5b
-	ld a, BATTLE_VARS_MOVE
-	call GetBattleVar
-	ld b, a
-	call GetMoveEffect
-	ld a, b
-	cp EFFECT_PURSUIT
-	jr nz, .done
-
-	ld a, [CurBattleMon]
-	push af
-
-	ld hl, DoPlayerTurn
-	ld a, [hBattleTurn]
-	and a
-	jr z, .do_turn
-	ld hl, DoEnemyTurn
-	ld a, [LastPlayerMon]
-	ld [CurBattleMon], a
-.do_turn
-	ld a, BANK(DoPlayerTurn)
-	rst FarCall
-
-	ld a, BATTLE_VARS_MOVE
-	call GetBattleVarAddr
-	ld a, $ff
-	ld [hl], a
-
-	pop af
-	ld [CurBattleMon], a
-
-	ld a, [hBattleTurn]
-	and a
-	jr z, .check_enemy_fainted
-
-	ld a, [LastPlayerMon]
-	call UpdateBattleMon
-	ld hl, BattleMonHP
-	ld a, [hli]
-	or [hl]
-	jr nz, .done
-
-	ld a, $f0
-	ld [CryTracks], a
-	ld a, [BattleMonSpecies]
-	call PlayStereoCry
-	ld a, [LastPlayerMon]
-	ld c, a
-	ld hl, wBattleParticipantsNotFainted
-	ld b, RESET_FLAG
-	predef FlagPredef
-	call PlayerMonFaintedAnimation
-	ld hl, BattleText_PkmnFainted
-	jr .done_fainted
-
-.check_enemy_fainted
-	ld hl, EnemyMonHP
-	ld a, [hli]
-	or [hl]
-	jr nz, .done
-
-	ld de, SFX_KINESIS
-	call PlaySFX
-	call WaitSFX
-	ld de, SFX_FAINT
-	call PlaySFX
-	call WaitSFX
-	call EnemyMonFaintedAnimation
-	ld hl, BattleText_EnemyPkmnFainted
-
-.done_fainted
-	call StdBattleTextBox
-	scf
-	ret
-
-.done
-	and a
-	ret
-; 3dce6
-
-RecallPlayerMon: ; 3dce6
-	ld a, [hBattleTurn]
-	push af
-	xor a
-	ld [hBattleTurn], a
-	ld [wNumHits], a
-	ld de, ANIM_RETURN_MON
-	call Call_PlayBattleAnim
-	pop af
-	ld [hBattleTurn], a
-	ret
-; 3dcf9
-
-HandleHealingItems: ; 3dcf9
-	ld a, [hLinkPlayerNumber]
-	cp $1
-	jr z, .player_1
-	call SetPlayerTurn
-	call HandleHPHealingItem
-	call UseHeldStatusHealingItem
-	call UseConfusionHealingItem
-	call SetEnemyTurn
-	call HandleHPHealingItem
-	call UseHeldStatusHealingItem
-	jp UseConfusionHealingItem
-
-.player_1
-	call SetEnemyTurn
-	call HandleHPHealingItem
-	call UseHeldStatusHealingItem
-	call UseConfusionHealingItem
-	call SetPlayerTurn
-	call HandleHPHealingItem
-	call UseHeldStatusHealingItem
-	jp UseConfusionHealingItem
-; 3dd2f
-
-HandleHPHealingItem: ; 3dd2f
-	callfar GetOpponentItem
-	ld a, b
-	cp HELD_BERRY
-	ret nz
-	ld de, EnemyMonHP + 1
-	ld hl, EnemyMonMaxHP
-	ld a, [hBattleTurn]
-	and a
-	jr z, .go
-	ld de, BattleMonHP + 1
-	ld hl, BattleMonMaxHP
-
-.go
-; If, and only if, Pokemon's HP is less than half max, use the item.
-; Store current HP in Buffer 3/4
-	push bc
-	ld a, [de]
-	ld [Buffer3], a
-	add a
-	ld c, a
-	dec de
-	ld a, [de]
-	inc de
-	ld [Buffer4], a
-	adc a
-	ld b, a
-	ld a, b
-	cp [hl]
-	ld a, c
-	pop bc
-	jr z, .equal
-	jr c, .less
-	ret
-
-.equal
-	inc hl
-	cp [hl]
-	dec hl
-	ret nc
-
-.less
-	call ItemRecoveryAnim
-	; store max HP in Buffer1/2
-	ld a, [hli]
-	ld [Buffer2], a
-	ld a, [hl]
-	ld [Buffer1], a
-	ld a, [de]
-	add c
-	ld [Buffer5], a
-	ld c, a
-	dec de
-	ld a, [de]
-	adc $0
-	ld [Buffer6], a
-	ld b, a
-	ld a, [hld]
-	cp c
-	ld a, [hl]
-	sbc b
-	jr nc, .okay
-	ld a, [hli]
-	ld [Buffer6], a
-	ld a, [hl]
-	ld [Buffer5], a
-
-.okay
-	ld a, [Buffer6]
-	ld [de], a
-	inc de
-	ld a, [Buffer5]
-	ld [de], a
-	ld a, [hBattleTurn]
-	ld [wWhichHPBar], a
-	and a
-	hlcoord 2, 2
-	jr z, .got_hp_bar_coords
-	hlcoord 10, 9
-
-.got_hp_bar_coords
-	ld [wWhichHPBar], a
-	predef AnimateHPBar
-UseOpponentItem:
-	call RefreshBattleHuds
-	callfar GetOpponentItem
-	ld a, [hl]
-	ld [wNamedObjectIndexBuffer], a
-	call GetItemName
-	callfar ConsumeHeldItem
-	ld hl, RecoveredUsingText
-	jp StdBattleTextBox
-; 3ddc8
-
-ItemRecoveryAnim: ; 3ddc8
-	push hl
-	push de
-	push bc
-	call EmptyBattleTextBox
-	ld a, RECOVER
-	ld [FXAnimID], a
-	call SwitchTurnCore
-	xor a
-	ld [wNumHits], a
-	ld [FXAnimID + 1], a
-	predef PlayBattleAnim
-	call SwitchTurnCore
-	pop bc
-	pop de
-	pop hl
-	ret
-; 3dde9
-
-UseHeldStatusHealingItem: ; 3dde9
-	callfar GetOpponentItem
-	ld hl, .Statuses
-.loop
-	ld a, [hli]
-	cp $ff
-	ret z
-	inc hl
-	cp b
-	jr nz, .loop
-	dec hl
-	ld b, [hl]
-	ld a, BATTLE_VARS_STATUS_OPP
-	call GetBattleVarAddr
-	and b
-	ret z
-	xor a
-	ld [hl], a
-	push bc
-	call UpdateOpponentInParty
-	pop bc
-	ld a, BATTLE_VARS_SUBSTATUS5_OPP
-	call GetBattleVarAddr
-	and [hl]
-	res SUBSTATUS_TOXIC, [hl]
-	ld a, BATTLE_VARS_SUBSTATUS1_OPP
-	call GetBattleVarAddr
-	and [hl]
-	res SUBSTATUS_NIGHTMARE, [hl]
-	ld a, b
-	cp ALL_STATUS
-	jr nz, .skip_confuse
-	ld a, BATTLE_VARS_SUBSTATUS3_OPP
-	call GetBattleVarAddr
-	res SUBSTATUS_CONFUSED, [hl]
-
-.skip_confuse
-	ld hl, CalcEnemyStats
-	ld a, [hBattleTurn]
-	and a
-	jr z, .got_pointer
-	ld hl, CalcPlayerStats
-
-.got_pointer
-	call SwitchTurnCore
-	ld a, BANK(CalcEnemyStats)
-	rst FarCall
-	call SwitchTurnCore
-	call ItemRecoveryAnim
-	call UseOpponentItem
-	ld a, $1
-	and a
-	ret
-; 3de44
-
-.Statuses: ; 3de44
-	db HELD_HEAL_POISON, 1 << PSN
-	db HELD_HEAL_FREEZE, 1 << FRZ
-	db HELD_HEAL_BURN, 1 << BRN
-	db HELD_HEAL_SLEEP, SLP
-	db HELD_HEAL_PARALYZE, 1 << PAR
-	db HELD_HEAL_STATUS, ALL_STATUS
-	db $ff
-; 3de51
-
-UseConfusionHealingItem: ; 3de51
-	ld a, BATTLE_VARS_SUBSTATUS3_OPP
-	call GetBattleVar
-	bit SUBSTATUS_CONFUSED, a
-	ret z
-	callfar GetOpponentItem
-	ld a, b
-	cp HELD_HEAL_CONFUSION
-	jr z, .heal_status
-	cp HELD_HEAL_STATUS
-	ret nz
-
-.heal_status
-	ld a, [hl]
-	ld [wd265], a
-	ld a, BATTLE_VARS_SUBSTATUS3_OPP
-	call GetBattleVarAddr
-	res SUBSTATUS_CONFUSED, [hl]
-	call GetItemName
-	call ItemRecoveryAnim
-	ld hl, BattleText_ItemHealedConfusion
-	call StdBattleTextBox
-	ld a, [hBattleTurn]
-	and a
-	jr nz, .do_partymon
-	call GetOTPartymonItem
-	xor a
-	ld [bc], a
-	ld a, [wBattleMode]
-	dec a
-	ret z
-	ld [hl], $0
-	ret
-
-.do_partymon
-	call GetPartymonItem
-	xor a
-	ld [bc], a
-	ld [hl], a
-	ret
-; 3de97
-
-HandleStatBoostingHeldItems: ; 3de97
-; The effects handled here are not used in-game.
-	ld a, [hLinkPlayerNumber]
-	cp $1
-	jr z, .player_1
-	call .DoPlayer
-	jp .DoEnemy
-
-.player_1
-	call .DoEnemy
-	jp .DoPlayer
-; 3dea9
-
-.DoPlayer: ; 3dea9
-	call GetPartymonItem
-	ld a, $0
-	jp .HandleItem
-; 3deb1
-
-.DoEnemy: ; 3deb1
-	call GetOTPartymonItem
-	ld a, $1
-.HandleItem: ; 3deb6
-	ld [hBattleTurn], a
-	ld d, h
-	ld e, l
-	push de
-	push bc
-	ld a, [bc]
-	ld b, a
-	callfar GetItemHeldEffect
-	ld hl, .StatUpItems
-.loop
-	ld a, [hli]
-	cp $ff
-	jr z, .finish
-	inc hl
-	inc hl
-	cp b
-	jr nz, .loop
-	pop bc
-	ld a, [bc]
-	ld [wd265], a
-	push bc
-	dec hl
-	dec hl
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	ld a, BANK(BattleCommand_AttackUp)
-	rst FarCall
-	pop bc
-	pop de
-	ld a, [FailedMessage]
-	and a
-	ret nz
-	xor a
-	ld [bc], a
-	ld [de], a
-	call GetItemName
-	ld hl, BattleText_UsersStringBuffer1Activated
-	call StdBattleTextBox
-	callfar BattleCommand_StatUpMessage
-	ret
-
-.finish
-	pop bc
-	pop de
-	ret
-; 3defc
-
-.StatUpItems:
-	dbw HELD_ATTACK_UP,     BattleCommand_AttackUp
-	dbw HELD_DEFENSE_UP,    BattleCommand_DefenseUp
-	dbw HELD_SPEED_UP,      BattleCommand_SpeedUp
-	dbw HELD_SP_ATTACK_UP,  BattleCommand_SpecialAttackUp
-	dbw HELD_SP_DEFENSE_UP, BattleCommand_SpecialDefenseUp
-	dbw HELD_ACCURACY_UP,   BattleCommand_AccuracyUp
-	dbw HELD_EVASION_UP,    BattleCommand_EvasionUp
-	db $ff
-; 3df12
-
-GetPartymonItem: ; 3df12
-	ld hl, PartyMon1Item
-	ld a, [CurBattleMon]
-	call GetPartyLocation
-	ld bc, BattleMonItem
-	ret
-; 3df1f
-
-GetOTPartymonItem: ; 3df1f
-	ld hl, OTPartyMon1Item
-	ld a, [CurOTMon]
-	call GetPartyLocation
-	ld bc, EnemyMonItem
-	ret
-; 3df2c
-
-UpdateBattleHUDs: ; 3df2c
-	push hl
-	push de
-	push bc
-	call DrawPlayerHUD
-	ld hl, PlayerHPPal
-	call SetHPPal
-	call CheckDanger
-	call DrawEnemyHUD
-	ld hl, EnemyHPPal
-	call SetHPPal
-	pop bc
-	pop de
-	pop hl
-	ret
-; 3df48
-
-UpdatePlayerHUD:: ; 3df48
-	push hl
-	push de
-	push bc
-	call DrawPlayerHUD
-	call UpdatePlayerHPPal
-	call CheckDanger
-	pop bc
-	pop de
-	pop hl
-	ret
-; 3df58
-
-DrawPlayerHUD: ; 3df58
-	xor a
-	ld [hBGMapMode], a
-
-	; Clear the area
-	hlcoord 9, 7
-	lb bc, 5, 11
-	call ClearBox
-
-	farcall DrawPlayerHUDBorder
-
-	hlcoord 18, 9
-	ld [hl], $73 ; vertical bar
-	call PrintPlayerHUD
-
-	; HP bar
-	hlcoord 10, 9
-	ld b, 1
-	xor a ; PARTYMON
-	ld [MonType], a
-	predef DrawPlayerHP
-
-	; Exp bar
-	push de
-	ld a, [CurBattleMon]
-	ld hl, PartyMon1Exp + 2
-	call GetPartyLocation
-	ld d, h
-	ld e, l
-
-	hlcoord 10, 11
-	ld a, [TempMonLevel]
-	ld b, a
-	call FillInExpBar
-	pop de
-	ret
-; 3df98
-
-UpdatePlayerHPPal: ; 3df98
-	ld hl, PlayerHPPal
-	jp UpdateHPPal
-; 3df9e
-
-CheckDanger: ; 3df9e
-	ld hl, BattleMonHP
-	ld a, [hli]
-	or [hl]
-	jr z, .no_danger
-	ld a, [wDanger]
-	and a
-	jr nz, .done
-	ld a, [PlayerHPPal]
-	cp HP_RED
-	jr z, .danger
-
-.no_danger
-	ld hl, Danger
-	res DANGER_ON_F, [hl]
-	jr .done
-
-.danger
-	ld hl, Danger
-	set DANGER_ON_F, [hl]
-
-.done
-	ret
-; 3dfbf
-
-PrintPlayerHUD: ; 3dfbf
-	ld de, BattleMonNick
-	hlcoord 10, 7
-	call ret_3e138
-	call PlaceString
-
-	push bc
-
-	ld a, [CurBattleMon]
-	ld hl, PartyMon1DVs
-	call GetPartyLocation
-	ld de, TempMonDVs
-	ld a, [hli]
-	ld [de], a
-	inc de
-	ld a, [hl]
-	ld [de], a
-	ld hl, BattleMonLevel
-	ld de, TempMonLevel
-	ld bc, $0011
-	call CopyBytes
-	ld a, [CurBattleMon]
-	ld hl, PartyMon1Species
-	call GetPartyLocation
-	ld a, [hl]
-	ld [CurPartySpecies], a
-	ld [CurSpecies], a
-	call GetBaseData
-
-	pop hl
-	dec hl
-
-	ld a, TEMPMON
-	ld [MonType], a
-	callfar GetGender
-	ld a, " "
-	jr c, .got_gender_char
-	ld a, "♂"
-	jr nz, .got_gender_char
-	ld a, "♀"
-
-.got_gender_char
-	hlcoord 17, 8
-	ld [hl], a
-	hlcoord 14, 8
-	push af ; back up gender
-	push hl
-	ld de, BattleMonStatus
-	predef PlaceNonFaintStatus
-	pop hl
-	pop bc
-	ret nz
-	ld a, b
-	cp " "
-	jr nz, .copy_level ; male or female
-	dec hl ; genderless
-
-.copy_level
-	ld a, [BattleMonLevel]
-	ld [TempMonLevel], a
-	jp PrintLevel
-; 3e036
-
-UpdateEnemyHUD:: ; 3e036
-	push hl
-	push de
-	push bc
-	call DrawEnemyHUD
-	call UpdateEnemyHPPal
-	pop bc
-	pop de
-	pop hl
-	ret
-; 3e043
-
-DrawEnemyHUD: ; 3e043
-	xor a
-	ld [hBGMapMode], a
-
-	hlcoord 1, 0
-	lb bc, 4, 11
-	call ClearBox
-
-	farcall DrawEnemyHUDBorder
-
-	ld a, [TempEnemyMonSpecies]
-	ld [CurSpecies], a
-	ld [CurPartySpecies], a
-	call GetBaseData
-	ld de, EnemyMonNick
-	hlcoord 1, 0
-	call ret_3e138
-	call PlaceString
-	ld h, b
-	ld l, c
-	dec hl
-
-	ld hl, EnemyMonDVs
-	ld de, TempMonDVs
-	ld a, [EnemySubStatus5]
-	bit SUBSTATUS_TRANSFORMED, a
-	jr z, .ok
-	ld hl, wEnemyBackupDVs
-.ok
-	ld a, [hli]
-	ld [de], a
-	inc de
-	ld a, [hl]
-	ld [de], a
-
-	ld a, TEMPMON
-	ld [MonType], a
-	callfar GetGender
-	ld a, " "
-	jr c, .got_gender
-	ld a, "♂"
-	jr nz, .got_gender
-	ld a, "♀"
-
-.got_gender
-	hlcoord 9, 1
-	ld [hl], a
-
-	hlcoord 6, 1
-	push af
-	push hl
-	ld de, EnemyMonStatus
-	predef PlaceNonFaintStatus
-	pop hl
-	pop bc
-	jr nz, .skip_level
-	ld a, b
-	cp " "
-	jr nz, .print_level
-	dec hl
-.print_level
-	ld a, [EnemyMonLevel]
-	ld [TempMonLevel], a
-	call PrintLevel
-.skip_level
-
-	ld hl, EnemyMonHP
-	ld a, [hli]
-	ld [hMultiplicand + 1], a
-	ld a, [hld]
-	ld [hMultiplicand + 2], a
-	or [hl]
-	jr nz, .not_fainted
-
-	ld c, a
-	ld e, a
-	ld d, HP_BAR_LENGTH
-	jp .draw_bar
-
-.not_fainted
-	xor a
-	ld [hMultiplicand], a
-	ld a, HP_BAR_LENGTH_PX
-	ld [hMultiplier], a
-	call Multiply
-	ld hl, EnemyMonMaxHP
-	ld a, [hli]
-	ld b, a
-	ld a, [hl]
-	ld [hMultiplier], a
-	ld a, b
-	and a
-	jr z, .less_than_256_max
-	ld a, [hMultiplier]
-	srl b
-	rr a
-	srl b
-	rr a
-	ld [hDivisor], a
-	ld a, [hProduct + 2]
-	ld b, a
-	srl b
-	ld a, [hProduct + 3]
-	rr a
-	srl b
-	rr a
-	ld [hProduct + 3], a
-	ld a, b
-	ld [hProduct + 2], a
-
-.less_than_256_max
-	ld a, [hProduct + 2]
-	ld [hDividend + 0], a
-	ld a, [hProduct + 3]
-	ld [hDividend + 1], a
-	ld a, 2
-	ld b, a
-	call Divide
-	ld a, [hQuotient + 2]
-	ld e, a
-	ld a, HP_BAR_LENGTH
-	ld d, a
-	ld c, a
-
-.draw_bar
-	xor a
-	ld [wWhichHPBar], a
-	hlcoord 2, 2
-	ld b, 0
-	call DrawBattleHPBar
-	ret
-; 3e127
-
-UpdateEnemyHPPal: ; 3e127
-	ld hl, EnemyHPPal
-	call UpdateHPPal
-	ret
-; 3e12e
-
-UpdateHPPal: ; 3e12e
-	ld b, [hl]
-	call SetHPPal
-	ld a, [hl]
-	cp b
-	ret z
-	jp FinishBattleAnim
-; 3e138
-
-ret_3e138: ; 3e138
-	ret
-; 3e139
-
-BattleMenu: ; 3e139
-	xor a
-	ld [hBGMapMode], a
-	call LoadTempTileMapToTileMap
-
-	ld a, [BattleType]
-	cp BATTLETYPE_DEBUG
-	jr z, .ok
-	cp BATTLETYPE_TUTORIAL
-	jr z, .ok
-	call EmptyBattleTextBox
-	call UpdateBattleHuds
-	call EmptyBattleTextBox
-	call LoadTileMapToTempTileMap
-.ok
-
-.loop
-	ld a, [BattleType]
-	cp BATTLETYPE_CONTEST
-	jr nz, .not_contest
-	farcall ContestBattleMenu
-	jr .next
-.not_contest
-
-	; Auto input: choose "ITEM"
-	ld a, [InputType]
-	or a
-	jr z, .skip_dude_pack_select
-	farcall _DudeAutoInput_DownA
-.skip_dude_pack_select
-	call LoadBattleMenu2
-	ret c
-
-.next
-	ld a, $1
-	ld [hBGMapMode], a
-	ld a, [wBattleMenuCursorBuffer]
-	cp $1
-	jp z, BattleMenu_Fight
-	cp $3
-	jp z, BattleMenu_Pack
-	cp $2
-	jp z, BattleMenu_PKMN
-	cp $4
-	jp z, BattleMenu_Run
-	jr .loop
-; 3e192
-
-BattleMenu_Fight: ; 3e192
-	xor a
-	ld [wNumFleeAttempts], a
-	call Call_LoadTempTileMapToTileMap
-	and a
-	ret
-; 3e19b
-
-LoadBattleMenu2: ; 3e19b
-	call IsMobileBattle
-	jr z, .mobile
-
-	farcall LoadBattleMenu
-	and a
-	ret
-
-.mobile
-	farcall Function100b12
-	ld a, [wcd2b]
-	and a
-	ret z
-
-	ld hl, wcd2a
-	bit 4, [hl]
-	jr nz, .error
-	ld hl, BattleText_LinkErrorBattleCanceled
-	call StdBattleTextBox
-	ld c, 60
-	call DelayFrames
-.error
-	scf
-	ret
-; 3e1c7
-
-BattleMenu_Pack: ; 3e1c7
-	ld a, [wLinkMode]
-	and a
-	jp nz, .ItemsCantBeUsed
-
-	ld a, [InBattleTowerBattle]
-	and a
-	jp nz, .ItemsCantBeUsed
-
-	call LoadStandardMenuDataHeader
-
-	ld a, [BattleType]
-	cp BATTLETYPE_TUTORIAL
-	jr z, .tutorial
-	cp BATTLETYPE_CONTEST
-	jr z, .contest
-
-	farcall BattlePack
-	ld a, [wPlayerAction]
-	and a
-	jr z, .didnt_use_item
-	jr .got_item
-
-.tutorial
-	farcall TutorialPack
-	ld a, POKE_BALL
-	ld [CurItem], a
-	call DoItemEffect
-	jr .got_item
-
-.contest
-	ld a, PARK_BALL
-	ld [CurItem], a
-	call DoItemEffect
-
-.got_item
-	call .UseItem
-	ret
-
-.didnt_use_item
-	call ClearPalettes
-	call DelayFrame
-	call _LoadBattleFontsHPBar
-	call GetBattleMonBackpic
-	call GetEnemyMonFrontpic
-	call ExitMenu
-	call WaitBGMap
-	call FinishBattleAnim
-	call LoadTileMapToTempTileMap
-	jp BattleMenu
-; 3e22b
-
-.ItemsCantBeUsed: ; 3e22b
-	ld hl, BattleText_ItemsCantBeUsedHere
-	call StdBattleTextBox
-	jp BattleMenu
-; 3e234
-
-.UseItem: ; 3e234
-	ld a, [wWildMon]
-	and a
-	jr nz, .run
-	callfar CheckItemPocket
-	ld a, [wItemAttributeParamBuffer]
-	cp BALL
-	jr z, .ball
-	call ClearBGPalettes
-
-.ball
-	xor a
-	ld [hBGMapMode], a
-	call _LoadBattleFontsHPBar
-	call ClearSprites
-	ld a, [BattleType]
-	cp BATTLETYPE_TUTORIAL
-	jr z, .tutorial2
-	call GetBattleMonBackpic
-
-.tutorial2
-	call GetEnemyMonFrontpic
-	ld a, $1
-	ld [wMenuCursorY], a
-	call ExitMenu
-	call UpdateBattleHUDs
-	call WaitBGMap
-	call LoadTileMapToTempTileMap
-	call ClearWindowData
-	call FinishBattleAnim
-	and a
-	ret
-
-.run
-	xor a
-	ld [wWildMon], a
-	ld a, [wBattleResult]
-	and $c0
-	ld [wBattleResult], a
-	call ClearWindowData
-	call SetPalettes
-	scf
-	ret
-; 3e28d
-
-BattleMenu_PKMN: ; 3e28d
-	call LoadStandardMenuDataHeader
-BattleMenuPKMN_ReturnFromStats:
-	call ExitMenu
-	call LoadStandardMenuDataHeader
-	call ClearBGPalettes
-BattleMenuPKMN_Loop:
-	call SetUpBattlePartyMenu
-	xor a
-	ld [PartyMenuActionText], a
-	call JumpToPartyMenuAndPrintText
-	call SelectBattleMon
-	jr c, .Cancel
-.loop
-	farcall FreezeMonIcons
-	call .GetMenu
-	jr c, .PressedB
-	call PlaceHollowCursor
-	ld a, [wMenuCursorY]
-	cp $1 ; SWITCH
-	jp z, TryPlayerSwitch
-	cp $2 ; STATS
-	jr z, .Stats
-	cp $3 ; CANCEL
-	jr z, .Cancel
-	jr .loop
-
-.PressedB:
-	call CheckMobileBattleError
-	jr c, .Cancel
-	jr BattleMenuPKMN_Loop
-
-.Stats:
-	call Battle_StatsScreen
-	call CheckMobileBattleError
-	jr c, .Cancel
-	jp BattleMenuPKMN_ReturnFromStats
-
-.Cancel:
-	call ClearSprites
-	call ClearPalettes
-	call DelayFrame
-	call _LoadHPBar
-	call CloseWindow
-	call LoadTileMapToTempTileMap
-	call GetMemSGBLayout
-	call SetPalettes
-	jp BattleMenu
-; 3e2f5
-
-.GetMenu: ; 3e2f5
-	call IsMobileBattle
-	jr z, .mobile
-	farcall BattleMonMenu
-	ret
-
-.mobile
-	farcall MobileBattleMonMenu
-	ret
-; 3e308
-
-Battle_StatsScreen: ; 3e308
-	call DisableLCD
-
-	ld hl, VTiles2 tile $31
-	ld de, VTiles0
-	ld bc, $11 tiles
-	call CopyBytes
-
-	ld hl, VTiles2
-	ld de, VTiles0 tile $11
-	ld bc, $31 tiles
-	call CopyBytes
-
-	call EnableLCD
-
-	call ClearSprites
-	call LowVolume
-	xor a ; PARTYMON
-	ld [MonType], a
-	farcall BattleStatsScreenInit
-	call MaxVolume
-
-	call DisableLCD
-
-	ld hl, VTiles0
-	ld de, VTiles2 tile $31
-	ld bc, $11 tiles
-	call CopyBytes
-
-	ld hl, VTiles0 tile $11
-	ld de, VTiles2
-	ld bc, $31 tiles
-	call CopyBytes
-
-	call EnableLCD
-	ret
-; 3e358
-
-TryPlayerSwitch: ; 3e358
-	ld a, [CurBattleMon]
-	ld d, a
-	ld a, [CurPartyMon]
-	cp d
-	jr nz, .check_trapped
-	ld hl, BattleText_PkmnIsAlreadyOut
-	call StdBattleTextBox
-	jp BattleMenuPKMN_Loop
-
-.check_trapped
-	ld a, [wPlayerWrapCount]
-	and a
-	jr nz, .trapped
-	ld a, [EnemySubStatus5]
-	bit SUBSTATUS_CANT_RUN, a
-	jr z, .try_switch
-
-.trapped
-	ld hl, BattleText_PkmnCantBeRecalled
-	call StdBattleTextBox
-	jp BattleMenuPKMN_Loop
-
-.try_switch
-	call CheckIfCurPartyMonIsFitToFight
-	jp z, BattleMenuPKMN_Loop
-	ld a, [CurBattleMon]
-	ld [LastPlayerMon], a
-	ld a, $2
-	ld [wPlayerAction], a
-	call ClearPalettes
-	call DelayFrame
-	call ClearSprites
-	call _LoadHPBar
-	call CloseWindow
-	call GetMemSGBLayout
-	call SetPalettes
-	ld a, [CurPartyMon]
-	ld [CurBattleMon], a
-PlayerSwitch: ; 3e3ad
-	ld a, 1
-	ld [wPlayerIsSwitching], a
-	ld a, [wLinkMode]
-	and a
-	jr z, .not_linked
-	call LoadStandardMenuDataHeader
-	call LinkBattleSendReceiveAction
-	call CloseWindow
-
-.not_linked
-	call ParseEnemyAction
-	ld a, [wLinkMode]
-	and a
-	jr nz, .linked
-
-.switch
-	call BattleMonEntrance
-	and a
-	ret
-
-.linked
-	ld a, [wBattleAction]
-	cp BATTLEACTION_E
-	jp z, .switch
-	cp BATTLEACTION_D
-	jp z, .switch
-	cp BATTLEACTION_SWITCH1
-	jp c, .switch
-	cp BATTLEACTION_FORFEIT
-	jr nz, .dont_run
-	call WildFled_EnemyFled_LinkBattleCanceled
-	ret
-
-.dont_run
-	ld a, [hLinkPlayerNumber]
-	cp $1
-	jr z, .player_1
-	call BattleMonEntrance
-	call EnemyMonEntrance
-	and a
-	ret
-
-.player_1
-	call EnemyMonEntrance
-	call BattleMonEntrance
-	and a
-	ret
-; 3e3ff
-
-EnemyMonEntrance: ; 3e3ff
-	callfar AI_Switch
-	call SetEnemyTurn
-	jp SpikesDamage
-; 3e40b
-
-BattleMonEntrance: ; 3e40b
-	call WithdrawPkmnText
-
-	ld c, 50
-	call DelayFrames
-
-	ld hl, PlayerSubStatus4
-	res SUBSTATUS_RAGE, [hl]
-
-	call SetEnemyTurn
-	call PursuitSwitch
-	jr c, .ok
-	call RecallPlayerMon
-.ok
-
-	hlcoord 9, 7
-	lb bc, 5, 11
-	call ClearBox
-
-	ld a, [CurBattleMon]
-	ld [CurPartyMon], a
-	call AddBattleParticipant
-	call InitBattleMon
-	call ResetPlayerStatLevels
-	call SendOutPkmnText
-	call NewBattleMonStatus
-	call BreakAttraction
-	call SendOutPlayerMon
-	call EmptyBattleTextBox
-	call LoadTileMapToTempTileMap
-	call SetPlayerTurn
-	call SpikesDamage
-	ld a, $2
-	ld [wMenuCursorY], a
-	ret
-; 3e459
-
-PassedBattleMonEntrance: ; 3e459
-	ld c, 50
-	call DelayFrames
-
-	hlcoord 9, 7
-	lb bc, 5, 11
-	call ClearBox
-
-	ld a, [CurPartyMon]
-	ld [CurBattleMon], a
-	call AddBattleParticipant
-	call InitBattleMon
-	xor a
-	ld [wd265], a
-	call ApplyStatLevelMultiplierOnAllStats
-	call SendOutPlayerMon
-	call EmptyBattleTextBox
-	call LoadTileMapToTempTileMap
-	call SetPlayerTurn
-	jp SpikesDamage
-; 3e489
-
-BattleMenu_Run: ; 3e489
-	call Call_LoadTempTileMapToTileMap
-	ld a, $3
-	ld [wMenuCursorY], a
-	ld hl, BattleMonSpeed
-	ld de, EnemyMonSpeed
-	call TryToRunAwayFromBattle
-	ld a, $0
-	ld [wFailedToFlee], a
-	ret c
-	ld a, [wPlayerAction]
-	and a
-	ret nz
-	jp BattleMenu
-; 3e4a8
-
-CheckAmuletCoin: ; 3e4a8
-	ld a, [BattleMonItem]
-	ld b, a
-	callfar GetItemHeldEffect
-	ld a, b
-	cp HELD_AMULET_COIN
-	ret nz
-	ld a, 1
-	ld [wAmuletCoin], a
-	ret
-; 3e4bc
-
-MoveSelectionScreen: ; 3e4bc
-	call IsMobileBattle
-	jr nz, .not_mobile
-	farcall MobileMoveSelectionScreen
-	ret
-
-.not_mobile
-	ld hl, EnemyMonMoves
-	ld a, [wMoveSelectionMenuType]
-	dec a
-	jr z, .got_menu_type
-	dec a
-	jr z, .ether_elixer_menu
-	call CheckPlayerHasUsableMoves
-	ret z ; use Struggle
-	ld hl, BattleMonMoves
-	jr .got_menu_type
-
-.ether_elixer_menu
-	ld a, MON_MOVES
-	call GetPartyParamLocation
-
-.got_menu_type
-	ld de, wListMoves_MoveIndicesBuffer
-	ld bc, NUM_MOVES
-	call CopyBytes
-	xor a
-	ld [hBGMapMode], a
-
-	hlcoord 4, 17 - NUM_MOVES - 1
-	ld b, 4
-	ld c, 14
-	ld a, [wMoveSelectionMenuType]
-	cp $2
-	jr nz, .got_dims
-	hlcoord 4, 17 - NUM_MOVES - 1 - 4
-	ld b, 4
-	ld c, 14
-.got_dims
-	call TextBox
-
-	hlcoord 6, 17 - NUM_MOVES
-	ld a, [wMoveSelectionMenuType]
-	cp $2
-	jr nz, .got_start_coord
-	hlcoord 6, 17 - NUM_MOVES - 4
-.got_start_coord
-	ld a, SCREEN_WIDTH
-	ld [Buffer1], a
-	predef ListMoves
-
-	ld b, 5
-	ld a, [wMoveSelectionMenuType]
-	cp $2
-	ld a, 17 - NUM_MOVES
-	jr nz, .got_default_coord
-	ld b, 5
-	ld a, 17 - NUM_MOVES - 4
-
-.got_default_coord
-	ld [w2DMenuCursorInitY], a
-	ld a, b
-	ld [w2DMenuCursorInitX], a
-	ld a, [wMoveSelectionMenuType]
-	cp $1
-	jr z, .skip_inc
-	ld a, [CurMoveNum]
-	inc a
-
-.skip_inc
-	ld [wMenuCursorY], a
-	ld a, $1
-	ld [wMenuCursorX], a
-	ld a, [wNumMoves]
-	inc a
-	ld [w2DMenuNumRows], a
-	ld a, $1
-	ld [w2DMenuNumCols], a
-	ld c, $2c
-	ld a, [wMoveSelectionMenuType]
-	dec a
-	ld b, D_DOWN | D_UP | A_BUTTON
-	jr z, .okay
-	dec a
-	ld b, D_DOWN | D_UP | A_BUTTON | B_BUTTON
-	jr z, .okay
-	ld a, [wLinkMode]
-	and a
-	jr nz, .okay
-	ld b, D_DOWN | D_UP | A_BUTTON | B_BUTTON | SELECT
-
-.okay
-	ld a, b
-	ld [wMenuJoypadFilter], a
-	ld a, c
-	ld [w2DMenuFlags1], a
-	xor a
-	ld [w2DMenuFlags2], a
-	ld a, $10
-	ld [w2DMenuCursorOffsets], a
-.menu_loop
-	ld a, [wMoveSelectionMenuType]
-	and a
-	jr z, .battle_player_moves
-	dec a
-	jr nz, .interpret_joypad
-	hlcoord 11, 14
-	ld de, .string_3e61c
-	call PlaceString
-	jr .interpret_joypad
-
-.battle_player_moves
-	call MoveInfoBox
-	ld a, [wMoveSwapBuffer]
-	and a
-	jr z, .interpret_joypad
-	hlcoord 5, 13
-	ld bc, SCREEN_WIDTH
-	dec a
-	call AddNTimes
-	ld [hl], "▷"
-
-.interpret_joypad
-	ld a, $1
-	ld [hBGMapMode], a
-	call ScrollingMenuJoypad
-	bit D_UP_F, a
-	jp nz, .pressed_up
-	bit D_DOWN_F, a
-	jp nz, .pressed_down
-	bit SELECT_F, a
-	jp nz, .pressed_select
-	bit B_BUTTON_F, a
-	; A button
-	push af
-
-	xor a
-	ld [wMoveSwapBuffer], a
-	ld a, [wMenuCursorY]
-	dec a
-	ld [wMenuCursorY], a
-	ld b, a
-	ld a, [wMoveSelectionMenuType]
-	dec a
-	jr nz, .not_enemy_moves_process_b
-
-	pop af
-	ret
-
-.not_enemy_moves_process_b
-	dec a
-	ld a, b
-	ld [CurMoveNum], a
-	jr nz, .use_move
-
-	pop af
-	ret
-
-.use_move
-	pop af
-	ret nz
-
-	ld hl, BattleMonPP
-	ld a, [wMenuCursorY]
-	ld c, a
-	ld b, 0
-	add hl, bc
-	ld a, [hl]
-	and $3f
-	jr z, .no_pp_left
-	ld a, [PlayerDisableCount]
-	swap a
-	and $f
-	dec a
-	cp c
-	jr z, .move_disabled
-	ld a, [wUnusedPlayerLockedMove]
-	and a
-	jr nz, .skip2
-	ld a, [wMenuCursorY]
-	ld hl, BattleMonMoves
-	ld c, a
-	ld b, 0
-	add hl, bc
-	ld a, [hl]
-
-.skip2
-	ld [CurPlayerMove], a
-	xor a
-	ret
-
-.move_disabled
-	ld hl, BattleText_TheMoveIsDisabled
-	jr .place_textbox_start_over
-
-.no_pp_left
-	ld hl, BattleText_TheresNoPPLeftForThisMove
-
-.place_textbox_start_over
-	call StdBattleTextBox
-	call Call_LoadTempTileMapToTileMap
-	jp MoveSelectionScreen
-; 3e61c
-
-.string_3e61c ; 3e61c
-	db "@"
-; 3e61d
-
-.pressed_up
-	ld a, [wMenuCursorY]
-	and a
-	jp nz, .menu_loop
-	ld a, [wNumMoves]
-	inc a
-	ld [wMenuCursorY], a
-	jp .menu_loop
-; 3e62e
-
-.pressed_down ; 3e62e
-	ld a, [wMenuCursorY]
-	ld b, a
-	ld a, [wNumMoves]
-	inc a
-	inc a
-	cp b
-	jp nz, .menu_loop
-	ld a, $1
-	ld [wMenuCursorY], a
-	jp .menu_loop
-; 3e643
-
-.pressed_select ; 3e643
-	ld a, [wMoveSwapBuffer]
-	and a
-	jr z, .start_swap
-	ld hl, BattleMonMoves
-	call .swap_bytes
-	ld hl, BattleMonPP
-	call .swap_bytes
-	ld hl, PlayerDisableCount
-	ld a, [hl]
-	swap a
-	and $f
-	ld b, a
-	ld a, [wMenuCursorY]
-	cp b
-	jr nz, .not_swapping_disabled_move
-	ld a, [hl]
-	and $f
-	ld b, a
-	ld a, [wMoveSwapBuffer]
-	swap a
-	add b
-	ld [hl], a
-	jr .swap_moves_in_party_struct
-
-.not_swapping_disabled_move
-	ld a, [wMoveSwapBuffer]
-	cp b
-	jr nz, .swap_moves_in_party_struct
-	ld a, [hl]
-	and $f
-	ld b, a
-	ld a, [wMenuCursorY]
-	swap a
-	add b
-	ld [hl], a
-
-.swap_moves_in_party_struct
-; Fixes the COOLTRAINER glitch
-	ld a, [PlayerSubStatus5]
-	bit SUBSTATUS_TRANSFORMED, a
-	jr nz, .transformed
-	ld hl, PartyMon1Moves
-	ld a, [CurBattleMon]
-	call GetPartyLocation
-	push hl
-	call .swap_bytes
-	pop hl
-	ld bc, MON_PP - MON_MOVES
-	add hl, bc
-	call .swap_bytes
-
-.transformed
-	xor a
-	ld [wMoveSwapBuffer], a
-	jp MoveSelectionScreen
-
-.swap_bytes
-	push hl
-	ld a, [wMoveSwapBuffer]
-	dec a
-	ld c, a
-	ld b, 0
-	add hl, bc
-	ld d, h
-	ld e, l
-	pop hl
-	ld a, [wMenuCursorY]
-	dec a
-	ld c, a
-	ld b, 0
-	add hl, bc
-	ld a, [de]
-	ld b, [hl]
-	ld [hl], a
-	ld a, b
-	ld [de], a
-	ret
-
-.start_swap
-	ld a, [wMenuCursorY]
-	ld [wMoveSwapBuffer], a
-	jp MoveSelectionScreen
-; 3e6c8
-
-MoveInfoBox: ; 3e6c8
-	xor a
-	ld [hBGMapMode], a
-
-	hlcoord 0, 8
-	ld b, 3
-	ld c, 9
-	call TextBox
-	call MobileTextBorder
-
-	ld a, [PlayerDisableCount]
-	and a
-	jr z, .not_disabled
-
-	swap a
-	and $f
-	ld b, a
-	ld a, [wMenuCursorY]
-	cp b
-	jr nz, .not_disabled
-
-	hlcoord 1, 10
-	ld de, .Disabled
-	call PlaceString
-	jr .done
-
-.not_disabled
-	ld hl, wMenuCursorY
-	dec [hl]
-	call SetPlayerTurn
-	ld hl, BattleMonMoves
-	ld a, [wMenuCursorY]
-	ld c, a
-	ld b, 0
-	add hl, bc
-	ld a, [hl]
-	ld [CurPlayerMove], a
-
-	ld a, [CurBattleMon]
-	ld [CurPartyMon], a
-	ld a, WILDMON
-	ld [MonType], a
-	callfar GetMaxPPOfMove
-
-	ld hl, wMenuCursorY
-	ld c, [hl]
-	inc [hl]
-	ld b, 0
-	ld hl, BattleMonPP
-	add hl, bc
-	ld a, [hl]
-	and $3f
-	ld [StringBuffer1], a
-	call .PrintPP
-
-	hlcoord 1, 9
-	ld de, .Type
-	call PlaceString
-
-	hlcoord 7, 11
-	ld [hl], "/"
-
-	callfar UpdateMoveData
-	ld a, [wPlayerMoveStruct + MOVE_ANIM]
-	ld b, a
-	hlcoord 2, 10
-	predef PrintMoveType
-
-.done
-	ret
-; 3e74f
-
-.Disabled:
-	db "Disabled!@"
-.Type:
-	db "TYPE/@"
-; 3e75f
-
-.PrintPP: ; 3e75f
-	hlcoord 5, 11
-	ld a, [wLinkMode] ; What's the point of this check?
-	cp LINK_MOBILE
-	jr c, .ok
-	hlcoord 5, 11
-.ok
-	push hl
-	ld de, StringBuffer1
-	lb bc, 1, 2
-	call PrintNum
-	pop hl
-	inc hl
-	inc hl
-	ld [hl], "/"
-	inc hl
-	ld de, wNamedObjectIndexBuffer
-	lb bc, 1, 2
-	call PrintNum
-	ret
-; 3e786
-
-CheckPlayerHasUsableMoves: ; 3e786
-	ld a, STRUGGLE
-	ld [CurPlayerMove], a
-	ld a, [PlayerDisableCount]
-	and a
-	ld hl, BattleMonPP
-	jr nz, .disabled
-
-	ld a, [hli]
-	or [hl]
-	inc hl
-	or [hl]
-	inc hl
-	or [hl]
-	and $3f
-	ret nz
-	jr .force_struggle
-
-.disabled
-	swap a
-	and $f
-	ld b, a
-	ld d, NUM_MOVES + 1
-	xor a
-.loop
-	dec d
-	jr z, .done
-	ld c, [hl]
-	inc hl
-	dec b
-	jr z, .loop
-	or c
-	jr .loop
-
-.done
-	; Bug: this will result in a move with PP Up confusing the game.
-	; Replace with "and $3f" to fix.
-	and a
-	ret nz
-
-.force_struggle
-	ld hl, BattleText_PkmnHasNoMovesLeft
-	call StdBattleTextBox
-	ld c, 60
-	call DelayFrames
-	xor a
-	ret
-; 3e7c1
-
-ParseEnemyAction: ; 3e7c1
-	ld a, [wEnemyIsSwitching]
-	and a
-	ret nz
-	ld a, [wLinkMode]
-	and a
-	jr z, .not_linked
-	call EmptyBattleTextBox
-	call LoadTileMapToTempTileMap
-	ld a, [wPlayerAction]
-	and a
-	call z, LinkBattleSendReceiveAction
-	call Call_LoadTempTileMapToTileMap
-	ld a, [wBattleAction]
-	cp BATTLEACTION_E
-	jp z, .struggle
-	cp BATTLEACTION_D
-	jp z, .battle_action_d
-	cp BATTLEACTION_SWITCH1
-	jp nc, ResetVarsForSubstatusRage
-	ld [CurEnemyMoveNum], a
-	ld c, a
-	ld a, [EnemySubStatus1]
-	bit SUBSTATUS_ROLLOUT, a
-	jp nz, .skip_load
-	ld a, [EnemySubStatus3]
-	and 1 << SUBSTATUS_CHARGED | 1 << SUBSTATUS_RAMPAGE | 1 << SUBSTATUS_BIDE
-	jp nz, .skip_load
-
-	ld hl, EnemySubStatus5
-	bit SUBSTATUS_ENCORED, [hl]
-	ld a, [LastEnemyMove]
-	jp nz, .finish
-	ld hl, EnemyMonMoves
-	ld b, 0
-	add hl, bc
-	ld a, [hl]
-	jp .finish
-
-.not_linked
-	ld hl, EnemySubStatus5
-	bit SUBSTATUS_ENCORED, [hl]
-	jr z, .skip_encore
-	ld a, [LastEnemyMove]
-	jp .finish
-
-.skip_encore
-	call CheckEnemyLockedIn
-	jp nz, ResetVarsForSubstatusRage
-	jr .continue
-
-.battle_action_d
-	ld a, $ff
-	jr .finish
-
-.continue
-	ld hl, EnemyMonMoves
-	ld de, EnemyMonPP
-	ld b, NUM_MOVES
-.loop
-	ld a, [hl]
-	and a
-	jp z, .struggle
-	ld a, [EnemyDisabledMove]
-	cp [hl]
-	jr z, .disabled
-	ld a, [de]
-	and $3f
-	jr nz, .enough_pp
-
-.disabled
-	inc hl
-	inc de
-	dec b
-	jr nz, .loop
-	jr .struggle
-
-.enough_pp
-	ld a, [wBattleMode]
-	dec a
-	jr nz, .skip_load
-; wild
-.loop2
-	ld hl, EnemyMonMoves
-	call BattleRandom
-	and 3 ; TODO factor in NUM_MOVES
-	ld c, a
-	ld b, 0
-	add hl, bc
-	ld a, [EnemyDisableCount]
-	swap a
-	and $f
-	dec a
-	cp c
-	jr z, .loop2
-	ld a, [hl]
-	and a
-	jr z, .loop2
-	ld hl, EnemyMonPP
-	add hl, bc
-	ld b, a
-	ld a, [hl]
-	and $3f
-	jr z, .loop2
-	ld a, c
-	ld [CurEnemyMoveNum], a
-	ld a, b
-
-.finish
-	ld [CurEnemyMove], a
-
-.skip_load
-	call SetEnemyTurn
-	callfar UpdateMoveData
-	call CheckEnemyLockedIn
-	jr nz, .raging
-	xor a
-	ld [wEnemyCharging], a
-
-.raging
-	ld a, [wEnemyMoveStruct + MOVE_EFFECT]
-	cp EFFECT_FURY_CUTTER
-	jr z, .fury_cutter
-	xor a
-	ld [EnemyFuryCutterCount], a
-
-.fury_cutter
-	ld a, [wEnemyMoveStruct + MOVE_EFFECT]
-	cp EFFECT_RAGE
-	jr z, .no_rage
-	ld hl, EnemySubStatus4
-	res SUBSTATUS_RAGE, [hl]
-	xor a
-	ld [wEnemyRageCounter], a
-
-.no_rage
-	ld a, [wEnemyMoveStruct + MOVE_EFFECT]
-	cp EFFECT_PROTECT
-	ret z
-	cp EFFECT_ENDURE
-	ret z
-	xor a
-	ld [EnemyProtectCount], a
-	ret
-
-.struggle
-	ld a, STRUGGLE
-	jr .finish
-; 3e8c1
-
-ResetVarsForSubstatusRage: ; 3e8c1
-	xor a
-	ld [EnemyFuryCutterCount], a
-	ld [EnemyProtectCount], a
-	ld [wEnemyRageCounter], a
-	ld hl, EnemySubStatus4
-	res SUBSTATUS_RAGE, [hl]
-	ret
-; 3e8d1
-
-CheckEnemyLockedIn: ; 3e8d1
-	ld a, [EnemySubStatus4]
-	and 1 << SUBSTATUS_RECHARGE
-	ret nz
-
-	ld hl, EnemySubStatus3
-	ld a, [hl]
-	and 1 << SUBSTATUS_CHARGED | 1 << SUBSTATUS_RAMPAGE | 1 << SUBSTATUS_BIDE
-	ret nz
-
-	ld hl, EnemySubStatus1
-	bit SUBSTATUS_ROLLOUT, [hl]
-	ret
-; 3e8e4
-
-LinkBattleSendReceiveAction: ; 3e8e4
-	farcall _LinkBattleSendReceiveAction
-	ret
-; 3e8eb
-
-LoadEnemyMon: ; 3e8eb
-; Initialize enemy monster parameters
-; To do this we pull the species from TempEnemyMonSpecies
-
-; Notes:
-;   BattleRandom is used to ensure sync between Game Boys
-
-; Clear the whole EnemyMon struct
-	xor a
-	ld hl, EnemyMonSpecies
-	ld bc, EnemyMonEnd - EnemyMon
-	call ByteFill
-
-; We don't need to be here if we're in a link battle
-	ld a, [wLinkMode]
-	and a
-	jp nz, InitEnemyMon
-
-; and also not in a BattleTower-Battle
-	ld a, [InBattleTowerBattle] ; ????
-	bit 0, a
-	jp nz, InitEnemyMon
-
-; Make sure everything knows what species we're working with
-	ld a, [TempEnemyMonSpecies]
-	ld [EnemyMonSpecies], a
-	ld [CurSpecies], a
-	ld [CurPartySpecies], a
-
-; Grab the BaseData for this species
-	call GetBaseData
-
-; Let's get the item:
-
-; Is the item predetermined?
-	ld a, [wBattleMode]
-	dec a
-	jr z, .WildItem
-
-; If we're in a trainer battle, the item is in the party struct
-	ld a, [CurPartyMon]
-	ld hl, OTPartyMon1Item
-	call GetPartyLocation ; bc = PartyMon[CurPartyMon] - PartyMons
-	ld a, [hl]
-	jr .UpdateItem
-
-.WildItem:
-; In a wild battle, we pull from the item slots in BaseData
-
-; Force Item1
-; Used for Ho-Oh, Lugia and Snorlax encounters
-	ld a, [BattleType]
-	cp BATTLETYPE_FORCEITEM
-	ld a, [BaseItems]
-	jr z, .UpdateItem
-
-; Failing that, it's all up to chance
-;  Effective chances:
-;    75% None
-;    23% Item1
-;     2% Item2
-
-; 25% chance of getting an item
-	call BattleRandom
-	cp 1 + (75 percent)
-	ld a, NO_ITEM
-	jr c, .UpdateItem
-
-; From there, an 8% chance for Item2
-	call BattleRandom
-	cp 8 percent ; 8% of 25% = 2% Item2
-	ld a, [BaseItems]
-	jr nc, .UpdateItem
-	ld a, [BaseItems+1]
-
-.UpdateItem:
-	ld [EnemyMonItem], a
-
-; Initialize DVs
-
-; If we're in a trainer battle, DVs are predetermined
-	ld a, [wBattleMode]
-	and a
-	jr z, .InitDVs
-
-	ld a, [EnemySubStatus5]
-	bit SUBSTATUS_TRANSFORMED, a
-	jr z, .InitDVs
-
-; Unknown
-	ld hl, wEnemyBackupDVs
-	ld de, EnemyMonDVs
-	ld a, [hli]
-	ld [de], a
-	inc de
-	ld a, [hl]
-	ld [de], a
-	jp .Happiness
-
-.InitDVs:
-
-; Trainer DVs
-
-; All trainers have preset DVs, determined by class
-; See GetTrainerDVs for more on that
-	farcall GetTrainerDVs
-; These are the DVs we'll use if we're actually in a trainer battle
-	ld a, [wBattleMode]
-	dec a
-	jr nz, .UpdateDVs
-
-; Wild DVs
-; Here's where the fun starts
-
-; Roaming monsters (Entei, Raikou) work differently
-; They have their own structs, which are shorter than normal
-	ld a, [BattleType]
-	cp BATTLETYPE_ROAMING
-	jr nz, .NotRoaming
-
-; Grab HP
-	call GetRoamMonHP
-	ld a, [hl]
-; Check if the HP has been initialized
-	and a
-; We'll do something with the result in a minute
-	push af
-
-; Grab DVs
-	call GetRoamMonDVs
-	inc hl
-	ld a, [hld]
-	ld c, a
-	ld b, [hl]
-
-; Get back the result of our check
-	pop af
-; If the RoamMon struct has already been initialized, we're done
-	jr nz, .UpdateDVs
-
-; If it hasn't, we need to initialize the DVs
-; (HP is initialized at the end of the battle)
-	call GetRoamMonDVs
-	inc hl
-	call BattleRandom
-	ld [hld], a
-	ld c, a
-	call BattleRandom
-	ld [hl], a
-	ld b, a
-; We're done with DVs
-	jr .UpdateDVs
-
-.NotRoaming:
-; Register a contains BattleType
-
-; Forced shiny battle type
-; Used by Red Gyarados at Lake of Rage
-	cp BATTLETYPE_SHINY
-	jr nz, .GenerateDVs
-
-	ld b, ATKDEFDV_SHINY ; $ea
-	ld c, SPDSPCDV_SHINY ; $aa
-	jr .UpdateDVs
-
-.GenerateDVs:
-; Generate new random DVs
-	call BattleRandom
-	ld b, a
-	call BattleRandom
-	ld c, a
-
-.UpdateDVs:
-; Input DVs in register bc
-	ld hl, EnemyMonDVs
-	ld a, b
-	ld [hli], a
-	ld [hl], c
-
-; We've still got more to do if we're dealing with a wild monster
-	ld a, [wBattleMode]
-	dec a
-	jr nz, .Happiness
-
-; Species-specfic:
-
-; Unown
-	ld a, [TempEnemyMonSpecies]
-	cp UNOWN
-	jr nz, .Magikarp
-
-; Get letter based on DVs
-	ld hl, EnemyMonDVs
-	predef GetUnownLetter
-; Can't use any letters that haven't been unlocked
-; If combined with forced shiny battletype, causes an infinite loop
-	call CheckUnownLetter
-	jr c, .GenerateDVs ; try again
-
-.Magikarp:
-; Skimming this part recommended
-
-	ld a, [TempEnemyMonSpecies]
-	cp MAGIKARP
-	jr nz, .Happiness
-
-; Get Magikarp's length
-	ld de, EnemyMonDVs
-	ld bc, PlayerID
-	callfar CalcMagikarpLength
-
-; We're clear if the length is < 1536
-	ld a, [wMagikarpLength]
-	cp HIGH(1536)
-	jr nz, .CheckMagikarpArea
-
-; 5% chance of skipping both size checks
-	call Random
-	cp 5 percent
-	jr c, .CheckMagikarpArea
-; Try again if > 1614
-	ld a, [wMagikarpLength + 1]
-	cp LOW(1614) + 2
-	jr nc, .GenerateDVs
-
-; 20% chance of skipping this check
-	call Random
-	cp 20 percent - 1
-	jr c, .CheckMagikarpArea
-; Try again if > 1598
-	ld a, [wMagikarpLength + 1]
-	cp LOW(1598) + 2
-	jr nc, .GenerateDVs
-
-.CheckMagikarpArea:
-; The z checks are supposed to be nz
-; Instead, all maps in GROUP_LAKE_OF_RAGE (mahogany area)
-; and routes 20 and 44 are treated as Lake of Rage
-
-; This also means Lake of Rage Magikarp can be smaller than ones
-; caught elsewhere rather than the other way around
-
-; Intended behavior enforces a minimum size at Lake of Rage
-; The real behavior prevents size flooring in the Lake of Rage area
-	ld a, [MapGroup]
-	cp GROUP_LAKE_OF_RAGE
-	jr z, .Happiness
-	ld a, [MapNumber]
-	cp MAP_LAKE_OF_RAGE
-	jr z, .Happiness
-; 40% chance of not flooring
-	call Random
-	cp 40 percent - 2
-	jr c, .Happiness
-; Floor at length 1024
-	ld a, [wMagikarpLength]
-	cp HIGH(1024)
-	jr c, .GenerateDVs ; try again
-
-; Finally done with DVs
-
-.Happiness:
-; Set happiness
-	ld a, BASE_HAPPINESS
-	ld [EnemyMonHappiness], a
-; Set level
-	ld a, [CurPartyLevel]
-	ld [EnemyMonLevel], a
-; Fill stats
-	ld de, EnemyMonMaxHP
-	ld b, FALSE
-	ld hl, EnemyMonDVs - (MON_DVS - MON_STAT_EXP + 1) ; LinkBattleRNs + 7 ; ?
-	predef CalcPkmnStats
-
-; If we're in a trainer battle,
-; get the rest of the parameters from the party struct
-	ld a, [wBattleMode]
-	cp TRAINER_BATTLE
-	jr z, .OpponentParty
-
-; If we're in a wild battle, check wild-specific stuff
-	and a
-	jr z, .TreeMon
-
-	ld a, [EnemySubStatus5]
-	bit SUBSTATUS_TRANSFORMED, a
-	jp nz, .Moves
-
-.TreeMon:
-; If we're headbutting trees, some monsters enter battle asleep
-	call CheckSleepingTreeMon
-	ld a, TREEMON_SLEEP_TURNS
-	jr c, .UpdateStatus
-; Otherwise, no status
-	xor a
-
-.UpdateStatus:
-	ld hl, EnemyMonStatus
-	ld [hli], a
-
-; Unused byte
-	xor a
-	ld [hli], a
-
-; Full HP..
-	ld a, [EnemyMonMaxHP]
-	ld [hli], a
-	ld a, [EnemyMonMaxHP + 1]
-	ld [hl], a
-
-; ..unless it's a RoamMon
-	ld a, [BattleType]
-	cp BATTLETYPE_ROAMING
-	jr nz, .Moves
-
-; Grab HP
-	call GetRoamMonHP
-	ld a, [hl]
-; Check if it's been initialized again
-	and a
-	jr z, .InitRoamHP
-; Update from the struct if it has
-	ld a, [hl]
-	ld [EnemyMonHP + 1], a
-	jr .Moves
-
-.InitRoamHP:
-; HP only uses the lo byte in the RoamMon struct since
-; Raikou/Entei/Suicune will have < 256 hp at level 40
-	ld a, [EnemyMonHP + 1]
-	ld [hl], a
-	jr .Moves
-
-.OpponentParty:
-; Get HP from the party struct
-	ld hl, (OTPartyMon1HP + 1)
-	ld a, [CurPartyMon]
-	call GetPartyLocation
-	ld a, [hld]
-	ld [EnemyMonHP + 1], a
-	ld a, [hld]
-	ld [EnemyMonHP], a
-
-; Make sure everything knows which monster the opponent is using
-	ld a, [CurPartyMon]
-	ld [CurOTMon], a
-
-; Get status from the party struct
-	dec hl
-	ld a, [hl] ; OTPartyMonStatus
-	ld [EnemyMonStatus], a
-
-.Moves:
-	ld hl, BaseType1
-	ld de, EnemyMonType1
-	ld a, [hli]
-	ld [de], a
-	inc de
-	ld a, [hl]
-	ld [de], a
-
-; Get moves
-	ld de, EnemyMonMoves
-; Are we in a trainer battle?
-	ld a, [wBattleMode]
-	cp TRAINER_BATTLE
-	jr nz, .WildMoves
-; Then copy moves from the party struct
-	ld hl, OTPartyMon1Moves
-	ld a, [CurPartyMon]
-	call GetPartyLocation
-	ld bc, NUM_MOVES
-	call CopyBytes
-	jr .PP
-
-.WildMoves:
-; Clear EnemyMonMoves
-	xor a
-	ld h, d
-	ld l, e
-	ld [hli], a
-	ld [hli], a
-	ld [hli], a
-	ld [hl], a
-; Make sure the predef knows this isn't a partymon
-	ld [wEvolutionOldSpecies], a
-; Fill moves based on level
-	predef FillMoves
-
-.PP:
-; Trainer battle?
-	ld a, [wBattleMode]
-	cp TRAINER_BATTLE
-	jr z, .TrainerPP
-
-; Fill wild PP
-	ld hl, EnemyMonMoves
-	ld de, EnemyMonPP
-	predef FillPP
-	jr .Finish
-
-.TrainerPP:
-; Copy PP from the party struct
-	ld hl, OTPartyMon1PP
-	ld a, [CurPartyMon]
-	call GetPartyLocation
-	ld de, EnemyMonPP
-	ld bc, NUM_MOVES
-	call CopyBytes
-
-.Finish:
-; Only the first five base stats are copied..
-	ld hl, BaseStats
-	ld de, EnemyMonBaseStats
-	ld b, BaseSpecialDefense - BaseStats
-.loop
-	ld a, [hli]
-	ld [de], a
-	inc de
-	dec b
-	jr nz, .loop
-
-	ld a, [BaseCatchRate]
-	ld [de], a
-	inc de
-
-	ld a, [BaseExp]
-	ld [de], a
-
-	ld a, [TempEnemyMonSpecies]
-	ld [wd265], a
-
-	call GetPokemonName
-
-; Did we catch it?
-	ld a, [wBattleMode]
-	and a
-	ret z
-
-; Update enemy nick
-	ld hl, StringBuffer1
-	ld de, EnemyMonNick
-	ld bc, PKMN_NAME_LENGTH
-	call CopyBytes
-
-; Saw this mon
-	ld a, [TempEnemyMonSpecies]
-	dec a
-	ld c, a
-	ld b, SET_FLAG
-	ld hl, PokedexSeen
-	predef FlagPredef
-
-	ld hl, EnemyMonStats
-	ld de, EnemyStats
-	ld bc, EnemyMonStatsEnd - EnemyMonStats
-	call CopyBytes
-
-	ret
-; 3eb38
-
-CheckSleepingTreeMon: ; 3eb38
-; Return carry if species is in the list
-; for the current time of day
-
-; Don't do anything if this isn't a tree encounter
-	ld a, [BattleType]
-	cp BATTLETYPE_TREE
-	jr nz, .NotSleeping
-
-; Get list for the time of day
-	ld hl, .Morn
-	ld a, [TimeOfDay]
-	cp DAY_F
-	jr c, .Check
-	ld hl, .Day
-	jr z, .Check
-	ld hl, .Nite
-
-.Check:
-	ld a, [TempEnemyMonSpecies]
-	ld de, 1 ; length of species id
-	call IsInArray
-; If it's a match, the opponent is asleep
-	ret c
-
-.NotSleeping:
-	and a
-	ret
-
-.Nite:
-	db CATERPIE
-	db METAPOD
-	db BUTTERFREE
-	db WEEDLE
-	db KAKUNA
-	db BEEDRILL
-	db SPEAROW
-	db EKANS
-	db EXEGGCUTE
-	db LEDYBA
-	db AIPOM
-	db -1 ; end
-
-.Day:
-	db VENONAT
-	db HOOTHOOT
-	db NOCTOWL
-	db SPINARAK
-	db HERACROSS
-	db -1 ; end
-
-.Morn:
-	db VENONAT
-	db HOOTHOOT
-	db NOCTOWL
-	db SPINARAK
-	db HERACROSS
-	db -1 ; end
-; 3eb75
-
-CheckUnownLetter: ; 3eb75
-; Return carry if the Unown letter hasn't been unlocked yet
-
-	ld a, [UnlockedUnowns]
-	ld c, a
-	ld de, 0
-
-.loop
-
-; Don't check this set unless it's been unlocked
-	srl c
-	jr nc, .next
-
-; Is our letter in the set?
-	ld hl, .LetterSets
-	add hl, de
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-
-	push de
-	ld a, [UnownLetter]
-	ld de, 1
-	push bc
-	call IsInArray
-	pop bc
-	pop de
-
-	jr c, .match
-
-.next
-; Make sure we haven't gone past the end of the table
-	inc e
-	inc e
-	ld a, e
-	cp .Set1 - .LetterSets
-	jr c, .loop
-
-; Hasn't been unlocked, or the letter is invalid
-	scf
-	ret
-
-.match
-; Valid letter
-	and a
-	ret
-
-.LetterSets:
-	dw .Set1
-	dw .Set2
-	dw .Set3
-	dw .Set4
-
-.Set1:
-	;  A   B   C   D   E   F   G   H   I   J   K
-	db 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, $ff
-.Set2:
-	;  L   M   N   O   P   Q   R
-	db 12, 13, 14, 15, 16, 17, 18, $ff
-.Set3:
-	;  S   T   U   V   W
-	db 19, 20, 21, 22, 23, $ff
-.Set4:
-	;  X   Y   Z
-	db 24, 25, 26, $ff
-
-; 3ebc7
-
-SwapBattlerLevels: ; 3ebc7
-; unreferenced
-	push bc
-	ld a, [BattleMonLevel]
-	ld b, a
-	ld a, [EnemyMonLevel]
-	ld [BattleMonLevel], a
-	ld a, b
-	ld [EnemyMonLevel], a
-	pop bc
-	ret
-; 3ebd8
-
-BattleWinSlideInEnemyTrainerFrontpic: ; 3ebd8
-	xor a
-	ld [TempEnemyMonSpecies], a
-	call FinishBattleAnim
-	ld a, [OtherTrainerClass]
-	ld [TrainerClass], a
-	ld de, VTiles2
-	callfar GetTrainerPic
-	hlcoord 19, 0
-	ld c, 0
-
-.outer_loop
-	inc c
-	ld a, c
-	cp 7
-	ret z
-	xor a
-	ld [hBGMapMode], a
-	ld [hBGMapThird], a
-	ld d, $0
-	push bc
-	push hl
-
-.inner_loop
-	call .CopyColumn
-	inc hl
-	ld a, 7
-	add d
-	ld d, a
-	dec c
-	jr nz, .inner_loop
-
-	ld a, $1
-	ld [hBGMapMode], a
-	ld c, 4
-	call DelayFrames
-	pop hl
-	pop bc
-	dec hl
-	jr .outer_loop
-; 3ec1a
-
-.CopyColumn: ; 3ec1a
-	push hl
-	push de
-	push bc
-	ld e, 7
-
-.loop
-	ld [hl], d
-	ld bc, SCREEN_WIDTH
-	add hl, bc
-	inc d
-	dec e
-	jr nz, .loop
-
-	pop bc
-	pop de
-	pop hl
-	ret
-; 3ec2c
-
-ApplyStatusEffectOnPlayerStats: ; 3ec2c
-	ld a, 1
-	jr ApplyStatusEffectOnStats
-; 3ec30
-
-ApplyStatusEffectOnEnemyStats: ; 3ec30
-	xor a
-; 3ec31
-
-ApplyStatusEffectOnStats: ; 3ec31
-	ld [hBattleTurn], a
-	call ApplyPrzEffectOnSpeed
-	jp ApplyBrnEffectOnAttack
-; 3ec39
-
-ApplyPrzEffectOnSpeed: ; 3ec39
-	ld a, [hBattleTurn]
-	and a
-	jr z, .enemy
-	ld a, [BattleMonStatus]
-	and 1 << PAR
-	ret z
-	ld hl, BattleMonSpeed + 1
-	ld a, [hld]
-	ld b, a
-	ld a, [hl]
-	srl a
-	rr b
-	srl a
-	rr b
-	ld [hli], a
-	or b
-	jr nz, .player_ok
-	ld b, $1 ; min speed
-
-.player_ok
-	ld [hl], b
-	ret
-
-.enemy
-	ld a, [EnemyMonStatus]
-	and 1 << PAR
-	ret z
-	ld hl, EnemyMonSpeed + 1
-	ld a, [hld]
-	ld b, a
-	ld a, [hl]
-	srl a
-	rr b
-	srl a
-	rr b
-	ld [hli], a
-	or b
-	jr nz, .enemy_ok
-	ld b, $1 ; min speed
-
-.enemy_ok
-	ld [hl], b
-	ret
-; 3ec76
-
-ApplyBrnEffectOnAttack: ; 3ec76
-	ld a, [hBattleTurn]
-	and a
-	jr z, .enemy
-	ld a, [BattleMonStatus]
-	and 1 << BRN
-	ret z
-	ld hl, BattleMonAttack + 1
-	ld a, [hld]
-	ld b, a
-	ld a, [hl]
-	srl a
-	rr b
-	ld [hli], a
-	or b
-	jr nz, .player_ok
-	ld b, $1 ; min attack
-
-.player_ok
-	ld [hl], b
-	ret
-
-.enemy
-	ld a, [EnemyMonStatus]
-	and 1 << BRN
-	ret z
-	ld hl, EnemyMonAttack + 1
-	ld a, [hld]
-	ld b, a
-	ld a, [hl]
-	srl a
-	rr b
-	ld [hli], a
-	or b
-	jr nz, .enemy_ok
-	ld b, $1 ; min attack
-
-.enemy_ok
-	ld [hl], b
-	ret
-; 3ecab
-
-ApplyStatLevelMultiplierOnAllStats: ; 3ecab
-; Apply StatLevelMultipliers on all 5 Stats
-	ld c, 0
-.stat_loop
-	call ApplyStatLevelMultiplier
-	inc c
-	ld a, c
-	cp 5
-	jr nz, .stat_loop
-	ret
-; 3ecb7
-
-ApplyStatLevelMultiplier: ; 3ecb7
-	push bc
-	push bc
-	ld a, [wd265]
-	and a
-	ld a, c
-	ld hl, BattleMonAttack
-	ld de, PlayerStats
-	ld bc, PlayerAtkLevel
-	jr z, .got_pointers
-	ld hl, EnemyMonAttack
-	ld de, EnemyStats
-	ld bc, EnemyAtkLevel
-
-.got_pointers
-	add c
-	ld c, a
-	jr nc, .okay
-	inc b
-.okay
-	ld a, [bc]
-	pop bc
-	ld b, a
-	push bc
-	sla c
-	ld b, 0
-	add hl, bc
-	ld a, c
-	add e
-	ld e, a
-	jr nc, .okay2
-	inc d
-.okay2
-	pop bc
-	push hl
-	ld hl, .StatLevelMultipliers
-	dec b
-	sla b
-	ld c, b
-	ld b, 0
-	add hl, bc
-	xor a
-	ld [hMultiplicand + 0], a
-	ld a, [de]
-	ld [hMultiplicand + 1], a
-	inc de
-	ld a, [de]
-	ld [hMultiplicand + 2], a
-	ld a, [hli]
-	ld [hMultiplier], a
-	call Multiply
-	ld a, [hl]
-	ld [hDivisor], a
-	ld b, $4
-	call Divide
-	pop hl
-
-; Cap at 999.
-	ld a, [hQuotient + 2]
-	sub LOW(MAX_STAT_VALUE)
-	ld a, [hQuotient + 1]
-	sbc HIGH(MAX_STAT_VALUE)
-	jp c, .okay3
-
-	ld a, HIGH(MAX_STAT_VALUE)
-	ld [hQuotient + 1], a
-	ld a, LOW(MAX_STAT_VALUE)
-	ld [hQuotient + 2], a
-
-.okay3
-	ld a, [hQuotient + 1]
-	ld [hli], a
-	ld b, a
-	ld a, [hQuotient + 2]
-	ld [hl], a
-	or b
-	jr nz, .okay4
-	inc [hl]
-
-.okay4
-	pop bc
-	ret
-; 3ed2b
-
-.StatLevelMultipliers:
-;	      /
-	db 25, 100 ; 25%
-	db 28, 100 ; 28%
-	db 33, 100 ; 33%
-	db 40, 100 ; 40%
-	db 50, 100 ; 50%
-	db 66, 100 ; 66%
-
-	db  1,  1 ; 100%
-
-	db 15, 10 ; 150%
-	db  2,  1 ; 200%
-	db 25, 10 ; 250%
-	db  3,  1 ; 300%
-	db 35, 10 ; 350%
-	db  4,  1 ; 400%
-; 3ed45
-
-BadgeStatBoosts: ; 3ed45
-; Raise BattleMon stats depending on which badges have been obtained.
-
-; Every other badge boosts a stat, starting from the first.
-
-; 	ZephyrBadge:  Attack
-; 	PlainBadge:   Speed
-; 	MineralBadge: Defense
-; 	GlacierBadge: Special Attack
-; 	RisingBadge:  Special Defense
-
-; The boosted stats are in order, except PlainBadge and MineralBadge's boosts are swapped.
-
-	ld a, [wLinkMode]
-	and a
-	ret nz
-
-	ld a, [InBattleTowerBattle]
-	and a
-	ret nz
-
-	ld a, [JohtoBadges]
-
-; Swap badges 3 (PlainBadge) and 5 (MineralBadge).
-	ld d, a
-	and (1 << PLAINBADGE)
-	add a
-	add a
-	ld b, a
-	ld a, d
-	and (1 << MINERALBADGE)
-	rrca
-	rrca
-	ld c, a
-	ld a, d
-	and ((1 << ZEPHYRBADGE) | (1 << HIVEBADGE) | (1 << FOGBADGE) | (1 << STORMBADGE) | (1 << GLACIERBADGE) | (1 << RISINGBADGE))
-	or b
-	or c
-	ld b, a
-
-	ld hl, BattleMonAttack
-	ld c, 4
-.CheckBadge:
-	ld a, b
-	srl b
-	call c, BoostStat
-	inc hl
-	inc hl
-; Check every other badge.
-	srl b
-	dec c
-	jr nz, .CheckBadge
-; And the last one (RisingBadge) too.
-	srl a
-	call c, BoostStat
-	ret
-; 3ed7c
-
-BoostStat: ; 3ed7c
-; Raise stat at hl by 1/8.
-
-	ld a, [hli]
-	ld d, a
-	ld e, [hl]
-	srl d
-	rr e
-	srl d
-	rr e
-	srl d
-	rr e
-	ld a, [hl]
-	add e
-	ld [hld], a
-	ld a, [hl]
-	adc d
-	ld [hli], a
-
-; Cap at 999.
-	ld a, [hld]
-	sub LOW(MAX_STAT_VALUE)
-	ld a, [hl]
-	sbc HIGH(MAX_STAT_VALUE)
-	ret c
-	ld a, HIGH(MAX_STAT_VALUE)
-	ld [hli], a
-	ld a, LOW(MAX_STAT_VALUE)
-	ld [hld], a
-	ret
-; 3ed9f
-
-_LoadBattleFontsHPBar: ; 3ed9f
-	callfar LoadBattleFontsHPBar
-	ret
-; 3eda6
-
-_LoadHPBar: ; 3eda6
-	callfar LoadHPBar
-	ret
-; 3edad
-
-LoadHPExpBarGFX: ; unreferenced
-	ld de, EnemyHPBarBorderGFX
-	ld hl, VTiles2 tile $6c
-	lb bc, BANK(EnemyHPBarBorderGFX), 4
-	call Get1bpp
-	ld de, HPExpBarBorderGFX
-	ld hl, VTiles2 tile $73
-	lb bc, BANK(HPExpBarBorderGFX), 6
-	call Get1bpp
-	ld de, ExpBarGFX
-	ld hl, VTiles2 tile $55
-	lb bc, BANK(ExpBarGFX), 8
-	jp Get2bpp
-; 3edd1
-
-EmptyBattleTextBox: ; 3edd1
-	ld hl, .empty
-	jp BattleTextBox
-.empty
-	db "@"
-; 3edd8
-
-_BattleRandom:: ; 3edd8
-; If the normal RNG is used in a link battle it'll desync.
-; To circumvent this a shared PRNG is used instead.
-
-; But if we're in a non-link battle we're safe to use it
-	ld a, [wLinkMode]
-	and a
-	jp z, Random
-
-; The PRNG operates in streams of 10 values.
-
-; Which value are we trying to pull?
-	push hl
-	push bc
-	ld a, [LinkBattleRNCount]
-	ld c, a
-	ld b, 0
-	ld hl, LinkBattleRNs
-	add hl, bc
-	inc a
-	ld [LinkBattleRNCount], a
-
-; If we haven't hit the end yet, we're good
-	cp 10 - 1 ; Exclude last value. See the closing comment
-	ld a, [hl]
-	pop bc
-	pop hl
-	ret c
-
-; If we have, we have to generate new pseudorandom data
-; Instead of having multiple PRNGs, ten seeds are used
-	push hl
-	push bc
-	push af
-
-; Reset count to 0
-	xor a
-	ld [LinkBattleRNCount], a
-	ld hl, LinkBattleRNs
-	ld b, 10 ; number of seeds
-
-; Generate next number in the sequence for each seed
-; a[n+1] = (a[n] * 5 + 1) % 256
-.loop
-	; get last #
-	ld a, [hl]
-
-	; a * 5 + 1
-	ld c, a
-	add a
-	add a
-	add c
-	inc a
-
-	; update #
-	ld [hli], a
-	dec b
-	jr nz, .loop
-
-; This has the side effect of pulling the last value first,
-; then wrapping around. As a result, when we check to see if
-; we've reached the end, we check the one before it.
-
-	pop af
-	pop bc
-	pop hl
-	ret
-; 3ee0f
-
-Call_PlayBattleAnim_OnlyIfVisible: ; 3ee0f
-	ld a, BATTLE_VARS_SUBSTATUS3
-	call GetBattleVar
-	and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
-	ret nz
-; 3ee17
-
-Call_PlayBattleAnim: ; 3ee17
-	ld a, e
-	ld [FXAnimID], a
-	ld a, d
-	ld [FXAnimID + 1], a
-	call WaitBGMap
-	predef_jump PlayBattleAnim
-; 3ee27
-
-FinishBattleAnim: ; 3ee27
-	push af
-	push bc
-	push de
-	push hl
-	ld b, SCGB_BATTLE_COLORS
-	call GetSGBLayout
-	call SetPalettes
-	call DelayFrame
-	pop hl
-	pop de
-	pop bc
-	pop af
-	ret
-; 3ee3b
-
-GiveExperiencePoints: ; 3ee3b
-; Give experience.
-; Don't give experience if linked or in the Battle Tower.
-	ld a, [wLinkMode]
-	and a
-	ret nz
-
-	ld a, [InBattleTowerBattle]
-	bit 0, a
-	ret nz
-
-	call .EvenlyDivideExpAmongParticipants
-	xor a
-	ld [CurPartyMon], a
-	ld bc, PartyMon1Species
-
-.loop
-	ld hl, MON_HP
-	add hl, bc
-	ld a, [hli]
-	or [hl]
-	jp z, .skip_stats ; fainted
-
-	push bc
-	ld hl, wBattleParticipantsNotFainted
-	ld a, [CurPartyMon]
-	ld c, a
-	ld b, CHECK_FLAG
-	ld d, $0
-	predef FlagPredef
-	ld a, c
-	and a
-	pop bc
-	jp z, .skip_stats
-
-; give stat exp
-	ld hl, MON_STAT_EXP + 1
-	add hl, bc
-	ld d, h
-	ld e, l
-	ld hl, EnemyMonBaseStats - 1
-	push bc
-	ld c, $5
-.loop1
-	inc hl
-	ld a, [de]
-	add [hl]
-	ld [de], a
-	jr nc, .okay1
-	dec de
-	ld a, [de]
-	inc a
-	jr z, .next
-	ld [de], a
-	inc de
-
-.okay1
-	push hl
-	push bc
-	ld a, MON_PKRUS
-	call GetPartyParamLocation
-	ld a, [hl]
-	and a
-	pop bc
-	pop hl
-	jr z, .skip
-	ld a, [de]
-	add [hl]
-	ld [de], a
-	jr nc, .skip
-	dec de
-	ld a, [de]
-	inc a
-	jr z, .next
-	ld [de], a
-	inc de
-	jr .skip
-
-.next
-	ld a, $ff
-	ld [de], a
-	inc de
-	ld [de], a
-
-.skip
-	inc de
-	inc de
-	dec c
-	jr nz, .loop1
-	xor a
-	ld [hMultiplicand + 0], a
-	ld [hMultiplicand + 1], a
-	ld a, [EnemyMonBaseExp]
-	ld [hMultiplicand + 2], a
-	ld a, [EnemyMonLevel]
-	ld [hMultiplier], a
-	call Multiply
-	ld a, 7
-	ld [hDivisor], a
-	ld b, 4
-	call Divide
-; Boost Experience for traded Pokemon
-	pop bc
-	ld hl, MON_ID
-	add hl, bc
-	ld a, [PlayerID]
-	cp [hl]
-	jr nz, .boosted
-	inc hl
-	ld a, [PlayerID + 1]
-	cp [hl]
-	ld a, $0
-	jr z, .no_boost
-
-.boosted
-	call BoostExp
-	ld a, $1
-
-.no_boost
-; Boost experience for a Trainer Battle
-	ld [StringBuffer2 + 2], a
-	ld a, [wBattleMode]
-	dec a
-	call nz, BoostExp
-; Boost experience for Lucky Egg
-	push bc
-	ld a, MON_ITEM
-	call GetPartyParamLocation
-	ld a, [hl]
-	cp LUCKY_EGG
-	call z, BoostExp
-	ld a, [hQuotient + 2]
-	ld [StringBuffer2 + 1], a
-	ld a, [hQuotient + 1]
-	ld [StringBuffer2], a
-	ld a, [CurPartyMon]
-	ld hl, PartyMonNicknames
-	call GetNick
-	ld hl, Text_PkmnGainedExpPoint
-	call BattleTextBox
-	ld a, [StringBuffer2 + 1]
-	ld [hQuotient + 2], a
-	ld a, [StringBuffer2]
-	ld [hQuotient + 1], a
-	pop bc
-	call AnimateExpBar
-	push bc
-	call LoadTileMapToTempTileMap
-	pop bc
-	ld hl, MON_STAT_EXP - 1
-	add hl, bc
-	ld d, [hl]
-	ld a, [hQuotient + 2]
-	add d
-	ld [hld], a
-	ld d, [hl]
-	ld a, [hQuotient + 1]
-	adc d
-	ld [hl], a
-	jr nc, .skip2
-	dec hl
-	inc [hl]
-	jr nz, .skip2
-	ld a, $ff
-	ld [hli], a
-	ld [hli], a
-	ld [hl], a
-
-.skip2
-	ld a, [CurPartyMon]
-	ld e, a
-	ld d, $0
-	ld hl, PartySpecies
-	add hl, de
-	ld a, [hl]
-	ld [CurSpecies], a
-	call GetBaseData
-	push bc
-	ld d, MAX_LEVEL
-	callfar CalcExpAtLevel
-	pop bc
-	ld hl, MON_STAT_EXP - 1
-	add hl, bc
-	push bc
-	ld a, [hQuotient]
-	ld b, a
-	ld a, [hQuotient + 1]
-	ld c, a
-	ld a, [hQuotient + 2]
-	ld d, a
-	ld a, [hld]
-	sub d
-	ld a, [hld]
-	sbc c
-	ld a, [hl]
-	sbc b
-	jr c, .not_max_exp
-	ld a, b
-	ld [hli], a
-	ld a, c
-	ld [hli], a
-	ld a, d
-	ld [hld], a
-
-.not_max_exp
-	xor a ; PARTYMON
-	ld [MonType], a
-	predef CopyPkmnToTempMon
-	callfar CalcLevel
-	pop bc
-	ld hl, MON_LEVEL
-	add hl, bc
-	ld a, [hl]
-	cp MAX_LEVEL
-	jp nc, .skip_stats
-	cp d
-	jp z, .skip_stats
-; <NICKNAME> grew to level ##!
-	ld [wTempLevel], a
-	ld a, [CurPartyLevel]
-	push af
-	ld a, d
-	ld [CurPartyLevel], a
-	ld [hl], a
-	ld hl, MON_SPECIES
-	add hl, bc
-	ld a, [hl]
-	ld [CurSpecies], a
-	ld [wd265], a
-	call GetBaseData
-	ld hl, MON_MAXHP + 1
-	add hl, bc
-	ld a, [hld]
-	ld e, a
-	ld d, [hl]
-	push de
-	ld hl, MON_MAXHP
-	add hl, bc
-	ld d, h
-	ld e, l
-	ld hl, MON_STAT_EXP - 1
-	add hl, bc
-	push bc
-	ld b, TRUE
-	predef CalcPkmnStats
-	pop bc
-	pop de
-	ld hl, MON_MAXHP + 1
-	add hl, bc
-	ld a, [hld]
-	sub e
-	ld e, a
-	ld a, [hl]
-	sbc d
-	ld d, a
-	dec hl
-	ld a, [hl]
-	add e
-	ld [hld], a
-	ld a, [hl]
-	adc d
-	ld [hl], a
-	ld a, [CurBattleMon]
-	ld d, a
-	ld a, [CurPartyMon]
-	cp d
-	jr nz, .skip_animation
-	ld de, BattleMonHP
-	ld a, [hli]
-	ld [de], a
-	inc de
-	ld a, [hli]
-	ld [de], a
-	ld de, BattleMonMaxHP
-	push bc
-	ld bc, PARTYMON_STRUCT_LENGTH - MON_MAXHP
-	call CopyBytes
-	pop bc
-	ld hl, MON_LEVEL
-	add hl, bc
-	ld a, [hl]
-	ld [BattleMonLevel], a
-	ld a, [PlayerSubStatus5]
-	bit SUBSTATUS_TRANSFORMED, a
-	jr nz, .transformed
-	ld hl, MON_ATK
-	add hl, bc
-	ld de, PlayerStats
-	ld bc, PARTYMON_STRUCT_LENGTH - MON_ATK
-	call CopyBytes
-
-.transformed
-	xor a
-	ld [wd265], a
-	call ApplyStatLevelMultiplierOnAllStats
-	callfar ApplyStatusEffectOnPlayerStats
-	callfar BadgeStatBoosts
-	callfar UpdatePlayerHUD
-	call EmptyBattleTextBox
-	call LoadTileMapToTempTileMap
-	ld a, $1
-	ld [hBGMapMode], a
-
-.skip_animation
-	farcall LevelUpHappinessMod
-	ld a, [CurBattleMon]
-	ld b, a
-	ld a, [CurPartyMon]
-	cp b
-	jr z, .skip_animation2
-	ld de, SFX_HIT_END_OF_EXP_BAR
-	call PlaySFX
-	call WaitSFX
-	ld hl, BattleText_StringBuffer1GrewToLevel
-	call StdBattleTextBox
-	call LoadTileMapToTempTileMap
-
-.skip_animation2
-	xor a ; PARTYMON
-	ld [MonType], a
-	predef CopyPkmnToTempMon
-	hlcoord 9, 0
-	ld b, $a
-	ld c, $9
-	call TextBox
-	hlcoord 11, 1
-	ld bc, 4
-	predef PrintTempMonStats
-	ld c, $1e
-	call DelayFrames
-	call WaitPressAorB_BlinkCursor
-	call Call_LoadTempTileMapToTileMap
-	xor a ; PARTYMON
-	ld [MonType], a
-	ld a, [CurSpecies]
-	ld [wd265], a
-	ld a, [CurPartyLevel]
-	push af
-	ld c, a
-	ld a, [wTempLevel]
-	ld b, a
-
-.level_loop
-	inc b
-	ld a, b
-	ld [CurPartyLevel], a
-	push bc
-	predef LearnLevelMoves
-	pop bc
-	ld a, b
-	cp c
-	jr nz, .level_loop
-	pop af
-	ld [CurPartyLevel], a
-	ld hl, EvolvableFlags
-	ld a, [CurPartyMon]
-	ld c, a
-	ld b, SET_FLAG
-	predef FlagPredef
-	pop af
-	ld [CurPartyLevel], a
-
-.skip_stats
-	ld a, [PartyCount]
-	ld b, a
-	ld a, [CurPartyMon]
-	inc a
-	cp b
-	jr z, .done
-	ld [CurPartyMon], a
-	ld a, MON_SPECIES
-	call GetPartyParamLocation
-	ld b, h
-	ld c, l
-	jp .loop
-
-.done
-	jp ResetBattleParticipants
-; 3f0d4
-
-.EvenlyDivideExpAmongParticipants:
-; count number of battle participants
-	ld a, [wBattleParticipantsNotFainted]
-	ld b, a
-	ld c, PARTY_LENGTH
-	ld d, 0
-.count_loop
-	xor a
-	srl b
-	adc d
-	ld d, a
-	dec c
-	jr nz, .count_loop
-	cp 2
-	ret c
-
-	ld [wd265], a
-	ld hl, EnemyMonBaseStats
-	ld c, EnemyMonEnd - EnemyMonBaseStats
-.count_loop2
-	xor a
-	ld [hDividend + 0], a
-	ld a, [hl]
-	ld [hDividend + 1], a
-	ld a, [wd265]
-	ld [hDivisor], a
-	ld b, 2
-	call Divide
-	ld a, [hQuotient + 2]
-	ld [hli], a
-	dec c
-	jr nz, .count_loop2
-	ret
-; 3f106
-
-BoostExp: ; 3f106
-; Multiply experience by 1.5x
-	push bc
-; load experience value
-	ld a, [hProduct + 2]
-	ld b, a
-	ld a, [hProduct + 3]
-	ld c, a
-; halve it
-	srl b
-	rr c
-; add it back to the whole exp value
-	add c
-	ld [hProduct + 3], a
-	ld a, [hProduct + 2]
-	adc b
-	ld [hProduct + 2], a
-	pop bc
-	ret
-; 3f11b
-
-Text_PkmnGainedExpPoint: ; 3f11b
-	text_jump Text_Gained
-	start_asm
-	ld hl, TextJump_StringBuffer2ExpPoints
-	ld a, [StringBuffer2 + 2] ; IsTradedMon
-	and a
-	ret z
-
-	ld hl, TextJump_ABoostedStringBuffer2ExpPoints
-	ret
-; 3f12c
-
-TextJump_ABoostedStringBuffer2ExpPoints: ; 3f12c
-	text_jump Text_ABoostedStringBuffer2ExpPoints
-	db "@"
-; 3f131
-
-TextJump_StringBuffer2ExpPoints: ; 3f131
-	text_jump Text_StringBuffer2ExpPoints
-	db "@"
-; 3f136
-
-AnimateExpBar: ; 3f136
-	push bc
-
-	ld hl, CurPartyMon
-	ld a, [CurBattleMon]
-	cp [hl]
-	jp nz, .finish
-
-	ld a, [BattleMonLevel]
-	cp MAX_LEVEL
-	jp nc, .finish
-
-	ld a, [hProduct + 3]
-	ld [wd004], a
-	push af
-	ld a, [hProduct + 2]
-	ld [wd003], a
-	push af
-	xor a
-	ld [wd002], a
-	xor a ; PARTYMON
-	ld [MonType], a
-	predef CopyPkmnToTempMon
-	ld a, [TempMonLevel]
-	ld b, a
-	ld e, a
-	push de
-	ld de, TempMonExp + 2
-	call CalcExpBar
-	push bc
-	ld hl, TempMonExp + 2
-	ld a, [wd004]
-	add [hl]
-	ld [hld], a
-	ld a, [wd003]
-	adc [hl]
-	ld [hld], a
-	jr nc, .NoOverflow
-	inc [hl]
-	jr nz, .NoOverflow
-	ld a, $ff
-	ld [hli], a
-	ld [hli], a
-	ld [hl], a
-
-.NoOverflow:
-	ld d, MAX_LEVEL
-	callfar CalcExpAtLevel
-	ld a, [hProduct + 1]
-	ld b, a
-	ld a, [hProduct + 2]
-	ld c, a
-	ld a, [hProduct + 3]
-	ld d, a
-	ld hl, TempMonExp + 2
-	ld a, [hld]
-	sub d
-	ld a, [hld]
-	sbc c
-	ld a, [hl]
-	sbc b
-	jr c, .AlreadyAtMaxExp
-	ld a, b
-	ld [hli], a
-	ld a, c
-	ld [hli], a
-	ld a, d
-	ld [hld], a
-
-.AlreadyAtMaxExp:
-	callfar CalcLevel
-	ld a, d
-	pop bc
-	pop de
-	ld d, a
-	cp e
-	jr nc, .LoopLevels
-	ld a, e
-	ld d, a
-
-.LoopLevels:
-	ld a, e
-	cp MAX_LEVEL
-	jr nc, .FinishExpBar
-	cp d
-	jr z, .FinishExpBar
-	inc a
-	ld [TempMonLevel], a
-	ld [CurPartyLevel], a
-	ld [BattleMonLevel], a
-	push de
-	call .PlayExpBarSound
-	ld c, $40
-	call .LoopBarAnimation
-	call PrintPlayerHUD
-	ld hl, BattleMonNick
-	ld de, StringBuffer1
-	ld bc, PKMN_NAME_LENGTH
-	call CopyBytes
-	call TerminateExpBarSound
-	ld de, SFX_HIT_END_OF_EXP_BAR
-	call PlaySFX
-	farcall AnimateEndOfExpBar
-	call WaitSFX
-	ld hl, BattleText_StringBuffer1GrewToLevel
-	call StdBattleTextBox
-	pop de
-	inc e
-	ld b, $0
-	jr .LoopLevels
-
-.FinishExpBar:
-	push bc
-	ld b, d
-	ld de, TempMonExp + 2
-	call CalcExpBar
-	ld a, b
-	pop bc
-	ld c, a
-	call .PlayExpBarSound
-	call .LoopBarAnimation
-	call TerminateExpBarSound
-	pop af
-	ld [hProduct + 2], a
-	pop af
-	ld [hProduct + 3], a
-
-.finish
-	pop bc
-	ret
-
-.PlayExpBarSound:
-	push bc
-	call WaitSFX
-	ld de, SFX_EXP_BAR
-	call PlaySFX
-	ld c, 10
-	call DelayFrames
-	pop bc
-	ret
-
-.LoopBarAnimation:
-	ld d, 3
-	dec b
-.anim_loop
-	inc b
-	push bc
-	push de
-	hlcoord 17, 11
-	call PlaceExpBar
-	pop de
-	ld a, $1
-	ld [hBGMapMode], a
-	ld c, d
-	call DelayFrames
-	xor a
-	ld [hBGMapMode], a
-	pop bc
-	ld a, c
-	cp b
-	jr z, .end_animation
-	inc b
-	push bc
-	push de
-	hlcoord 17, 11
-	call PlaceExpBar
-	pop de
-	ld a, $1
-	ld [hBGMapMode], a
-	ld c, d
-	call DelayFrames
-	xor a
-	ld [hBGMapMode], a
-	dec d
-	jr nz, .min_number_of_frames
-	ld d, 1
-.min_number_of_frames
-	pop bc
-	ld a, c
-	cp b
-	jr nz, .anim_loop
-.end_animation
-	ld a, $1
-	ld [hBGMapMode], a
-	ret
-
-SendOutPkmnText: ; 3f26d
-	ld a, [wLinkMode]
-	and a
-	jr z, .not_linked
-
-	ld hl, JumpText_GoPkmn ; If we're in a LinkBattle print just "Go <PlayerMon>"
-
-	ld a, [wBattleHasJustStarted] ; unless this (unidentified) variable is set
-	and a
-	jr nz, .skip_to_textbox
-
-.not_linked
-; Depending on the HP of the enemy Pkmn, the game prints a different text
-	ld hl, EnemyMonHP
-	ld a, [hli]
-	or [hl]
-	ld hl, JumpText_GoPkmn
-	jr z, .skip_to_textbox
-
-	; compute enemy helth remaining as a percentage
-	xor a
-	ld [hMultiplicand + 0], a
-	ld hl, EnemyMonHP
-	ld a, [hli]
-	ld [wEnemyHPAtTimeOfPlayerSwitch], a
-	ld [hMultiplicand + 1], a
-	ld a, [hl]
-	ld [wEnemyHPAtTimeOfPlayerSwitch + 1], a
-	ld [hMultiplicand + 2], a
-	ld a, 25
-	ld [hMultiplier], a
-	call Multiply
-	ld hl, EnemyMonMaxHP
-	ld a, [hli]
-	ld b, [hl]
-	srl a
-	rr b
-	srl a
-	rr b
-	ld a, b
-	ld b, 4
-	ld [hDivisor], a
-	call Divide
-
-	ld a, [hQuotient + 2]
-	ld hl, JumpText_GoPkmn
-	cp 70
-	jr nc, .skip_to_textbox
-
-	ld hl, JumpText_DoItPkmn
-	cp 40
-	jr nc, .skip_to_textbox
-
-	ld hl, JumpText_GoForItPkmn
-	cp 10
-	jr nc, .skip_to_textbox
-
-	ld hl, JumpText_YourFoesWeakGetmPkmn
-.skip_to_textbox
-	jp BattleTextBox
-; 3f2d1
-
-JumpText_GoPkmn: ; 3f2d1
-	text_jump Text_GoPkmn
-	start_asm
-	jr Function_TextJump_BattleMonNick01
-; 3f2d6
-
-JumpText_DoItPkmn: ; 3f2d8
-	text_jump Text_DoItPkmn
-	start_asm
-	jr Function_TextJump_BattleMonNick01
-; 3f2dd
-
-JumpText_GoForItPkmn: ; 3f2df
-	text_jump Text_GoForItPkmn
-	start_asm
-	jr Function_TextJump_BattleMonNick01
-; 3f2e4
-
-JumpText_YourFoesWeakGetmPkmn: ; 3f2e6
-	text_jump Text_YourFoesWeakGetmPkmn
-	start_asm
-Function_TextJump_BattleMonNick01: ; 3f2eb
-	ld hl, TextJump_BattleMonNick01
-	ret
-; 3f2ef
-
-TextJump_BattleMonNick01: ; 3f2ef
-	text_jump Text_BattleMonNick01
-	db "@"
-; 3f2f4
-
-WithdrawPkmnText: ; 3f2f4
-	ld hl, .WithdrawPkmnText
-	jp BattleTextBox
-
-.WithdrawPkmnText:
-	text_jump Text_BattleMonNickComma
-	start_asm
-; Print text to withdraw Pkmn
-; depending on HP the message is different
-	push de
-	push bc
-	ld hl, EnemyMonHP + 1
-	ld de, wEnemyHPAtTimeOfPlayerSwitch + 1
-	ld b, [hl]
-	dec hl
-	ld a, [de]
-	sub b
-	ld [hMultiplicand + 2], a
-	dec de
-	ld b, [hl]
-	ld a, [de]
-	sbc b
-	ld [hMultiplicand + 1], a
-	ld a, 25
-	ld [hMultiplier], a
-	call Multiply
-	ld hl, EnemyMonMaxHP
-	ld a, [hli]
-	ld b, [hl]
-	srl a
-	rr b
-	srl a
-	rr b
-	ld a, b
-	ld b, 4
-	ld [hDivisor], a
-	call Divide
-	pop bc
-	pop de
-	ld a, [hQuotient + 2]
-	ld hl, TextJump_ThatsEnoughComeBack
-	and a
-	ret z
-
-	ld hl, TextJump_ComeBack
-	cp 30
-	ret c
-
-	ld hl, TextJump_OKComeBack
-	cp 70
-	ret c
-
-	ld hl, TextJump_GoodComeBack
-	ret
-; 3f348
-
-TextJump_ThatsEnoughComeBack: ; 3f348
-	text_jump Text_ThatsEnoughComeBack
-	db "@"
-; 3f34d
-
-TextJump_OKComeBack: ; 3f34d
-	text_jump Text_OKComeBack
-	db "@"
-; 3f352
-
-TextJump_GoodComeBack: ; 3f352
-	text_jump Text_GoodComeBack
-	db "@"
-; 3f357
-
-UnusedFunction_TextJump_ComeBack: ; 3f357
-; this function doesn't seem to be used
-	ld hl, TextJump_ComeBack
-	ret
-; 3f35b
-
-TextJump_ComeBack: ; 3f35b
-	text_jump Text_ComeBack
-	db "@"
-; 3f360
-
-HandleSafariAngerEatingStatus: ; unreferenced
-	ld hl, wSafariMonEating
-	ld a, [hl]
-	and a
-	jr z, .angry
-	dec [hl]
-	ld hl, BattleText_WildPkmnIsEating
-	jr .finish
-
-.angry
-	dec hl ; wSafariMonAngerCount
-	ld a, [hl]
-	and a
-	ret z
-	dec [hl]
-	ld hl, BattleText_WildPkmnIsAngry
-	jr nz, .finish
-	push hl
-	ld a, [EnemyMonSpecies]
-	ld [CurSpecies], a
-	call GetBaseData
-	ld a, [BaseCatchRate]
-	ld [EnemyMonCatchRate], a
-	pop hl
-
-.finish
-	push hl
-	call Call_LoadTempTileMapToTileMap
-	pop hl
-	jp StdBattleTextBox
-; 3f390
-
-FillInExpBar: ; 3f390
-	push hl
-	call CalcExpBar
-	pop hl
-	ld de, 7
-	add hl, de
-	jp PlaceExpBar
-; 3f39c
-
-CalcExpBar: ; 3f39c
-; Calculate the percent exp between this level and the next
-; Level in b
-	push de
-	ld d, b
-	push de
-	callfar CalcExpAtLevel
-	pop de
-; exp at current level gets pushed to the stack
-	ld hl, hMultiplicand
-	ld a, [hli]
-	push af
-	ld a, [hli]
-	push af
-	ld a, [hl]
-	push af
-; next level
-	inc d
-	callfar CalcExpAtLevel
-; back up the next level exp, and subtract the two levels
-	ld hl, hMultiplicand + 2
-	ld a, [hl]
-	ld [hMathBuffer + 2], a
-	pop bc
-	sub b
-	ld [hld], a
-	ld a, [hl]
-	ld [hMathBuffer + 1], a
-	pop bc
-	sbc b
-	ld [hld], a
-	ld a, [hl]
-	ld [hMathBuffer], a
-	pop bc
-	sbc b
-	ld [hl], a
-	pop de
-
-	ld hl, hMultiplicand + 1
-	ld a, [hli]
-	push af
-	ld a, [hl]
-	push af
-
-; get the amount of exp remaining to the next level
-	ld a, [de]
-	dec de
-	ld c, a
-	ld a, [hMathBuffer + 2]
-	sub c
-	ld [hld], a
-	ld a, [de]
-	dec de
-	ld b, a
-	ld a, [hMathBuffer + 1]
-	sbc b
-	ld [hld], a
-	ld a, [de]
-	ld c, a
-	ld a, [hMathBuffer]
-	sbc c
-	ld [hld], a
-	xor a
-	ld [hl], a
-; multiply by 64
-	ld a, $40
-	ld [hMultiplier], a
-	call Multiply
-	pop af
-	ld c, a
-	pop af
-	ld b, a
-.loop
-	ld a, b
-	and a
-	jr z, .done
-	srl b
-	rr c
-	ld hl, hProduct
-	srl [hl]
-	inc hl
-	rr [hl]
-	inc hl
-	rr [hl]
-	inc hl
-	rr [hl]
-	jr .loop
-
-.done
-	ld a, c
-	ld [hDivisor], a
-	ld b, 4
-	call Divide
-	ld a, [hQuotient + 2]
-	ld b, a
-	ld a, $40
-	sub b
-	ld b, a
-	ret
-; 3f41c
-
-PlaceExpBar: ; 3f41c
-	ld c, $8 ; number of tiles
-.loop1
-	ld a, b
-	sub $8
-	jr c, .next
-	ld b, a
-	ld a, $6a ; full bar
-	ld [hld], a
-	dec c
-	jr z, .finish
-	jr .loop1
-
-.next
-	add $8
-	jr z, .loop2
-	add $54 ; tile to the left of small exp bar tile
-	jr .skip
-
-.loop2
-	ld a, $62 ; empty bar
-
-.skip
-	ld [hld], a
-	ld a, $62 ; empty bar
-	dec c
-	jr nz, .loop2
-
-.finish
-	ret
-; 3f43d
-
-GetBattleMonBackpic: ; 3f43d
-	ld a, [PlayerSubStatus4]
-	bit SUBSTATUS_SUBSTITUTE, a
-	ld hl, BattleAnimCmd_RaiseSub
-	jr nz, GetBattleMonBackpic_DoAnim ; substitute
-
-DropPlayerSub: ; 3f447
-	ld a, [wPlayerMinimized]
-	and a
-	ld hl, BattleAnimCmd_MinimizeOpp
-	jr nz, GetBattleMonBackpic_DoAnim
-	ld a, [CurPartySpecies]
-	push af
-	ld a, [BattleMonSpecies]
-	ld [CurPartySpecies], a
-	ld hl, BattleMonDVs
-	predef GetUnownLetter
-	ld de, VTiles2 tile $31
-	predef GetMonBackpic
-	pop af
-	ld [CurPartySpecies], a
-	ret
-; 3f46f
-
-GetBattleMonBackpic_DoAnim: ; 3f46f
-	ld a, [hBattleTurn]
-	push af
-	xor a
-	ld [hBattleTurn], a
-	ld a, BANK(BattleAnimCommands)
-	rst FarCall
-	pop af
-	ld [hBattleTurn], a
-	ret
-; 3f47c
-
-GetEnemyMonFrontpic: ; 3f47c
-	ld a, [EnemySubStatus4]
-	bit SUBSTATUS_SUBSTITUTE, a
-	ld hl, BattleAnimCmd_RaiseSub
-	jr nz, GetEnemyMonFrontpic_DoAnim
-
-DropEnemySub: ; 3f486
-	ld a, [wEnemyMinimized]
-	and a
-	ld hl, BattleAnimCmd_MinimizeOpp
-	jr nz, GetEnemyMonFrontpic_DoAnim
-
-	ld a, [CurPartySpecies]
-	push af
-	ld a, [EnemyMonSpecies]
-	ld [CurSpecies], a
-	ld [CurPartySpecies], a
-	call GetBaseData
-	ld hl, EnemyMonDVs
-	predef GetUnownLetter
-	ld de, VTiles2
-	predef GetAnimatedFrontpicPredef
-	pop af
-	ld [CurPartySpecies], a
-	ret
-; 3f4b4
-
-GetEnemyMonFrontpic_DoAnim: ; 3f4b4
-	ld a, [hBattleTurn]
-	push af
-	call SetEnemyTurn
-	ld a, BANK(BattleAnimCommands)
-	rst FarCall
-	pop af
-	ld [hBattleTurn], a
-	ret
-; 3f4c1
-
-StartBattle: ; 3f4c1
-; This check prevents you from entering a battle without any Pokemon.
-; Those using walk-through-walls to bypass getting a Pokemon experience
-; the effects of this check.
-	ld a, [PartyCount]
-	and a
-	ret z
-
-	ld a, [TimeOfDayPal]
-	push af
-	call BattleIntro
-	call DoBattle
-	call ExitBattle
-	pop af
-	ld [TimeOfDayPal], a
-	scf
-	ret
-; 3f4d9
-
-_DoBattle: ; 3f4d9
-; unreferenced
-	call DoBattle
-	ret
-; 3f4dd
-
-BattleIntro: ; 3f4dd
-	farcall TrainerRankings_Battles ; mobile
-	call LoadTrainerOrWildMonPic
-	xor a
-	ld [TempBattleMonSpecies], a
-	ld [wBattleMenuCursorBuffer], a
-	xor a
-	ld [hMapAnims], a
-	farcall PlayBattleMusic
-	farcall ShowLinkBattleParticipants
-	farcall FindFirstAliveMonAndStartBattle
-	call DisableSpriteUpdates
-	farcall ClearBattleRAM
-	call InitEnemy
-	call BackUpVBGMap2
-	ld b, SCGB_BATTLE_GRAYSCALE
-	call GetSGBLayout
-	ld hl, rLCDC
-	res 6, [hl]
-	call InitBattleDisplay
-	call BattleStartMessage
-	ld hl, rLCDC
-	set 6, [hl]
-	xor a
-	ld [hBGMapMode], a
-	call EmptyBattleTextBox
-	hlcoord 9, 7
-	lb bc, 5, 11
-	call ClearBox
-	hlcoord 1, 0
-	lb bc, 4, 10
-	call ClearBox
-	call ClearSprites
-	ld a, [wBattleMode]
-	cp WILD_BATTLE
-	call z, UpdateEnemyHUD
-	ld a, $1
-	ld [hBGMapMode], a
-	ret
-; 3f54e
-
-LoadTrainerOrWildMonPic: ; 3f54e
-	ld a, [OtherTrainerClass]
-	and a
-	jr nz, .Trainer
-	ld a, [TempWildMonSpecies]
-	ld [CurPartySpecies], a
-
-.Trainer:
-	ld [TempEnemyMonSpecies], a
-	ret
-; 3f55e
-
-InitEnemy: ; 3f55e
-	ld a, [OtherTrainerClass]
-	and a
-	jp nz, InitEnemyTrainer ; trainer
-	jp InitEnemyWildmon ; wild
-; 3f568
-
-BackUpVBGMap2: ; 3f568
-	ld a, [rSVBK]
-	push af
-	ld a, $6 ; BANK(wDecompressScratch)
-	ld [rSVBK], a
-	ld hl, wDecompressScratch
-	ld bc, $40 tiles ; VBGMap3 - VBGMap2
-	ld a, $2
-	call ByteFill
-	ld a, [rVBK]
-	push af
-	ld a, $1
-	ld [rVBK], a
-	ld de, wDecompressScratch
-	hlbgcoord 0, 0 ; VBGMap2
-	lb bc, BANK(BackUpVBGMap2), $40
-	call Request2bpp
-	pop af
-	ld [rVBK], a
-	pop af
-	ld [rSVBK], a
-	ret
-; 3f594
-
-InitEnemyTrainer: ; 3f594
-	ld [TrainerClass], a
-	farcall TrainerRankings_TrainerBattles
-	xor a
-	ld [TempEnemyMonSpecies], a
-	callfar GetTrainerAttributes
-	callfar ReadTrainerParty
-
-	ld a, [TrainerClass]
-	cp RIVAL1
-	jr nz, .ok
-	xor a
-	ld [OTPartyMon1Item], a
-.ok
-
-	ld de, VTiles2
-	callfar GetTrainerPic
-	xor a
-	ld [hGraphicStartTile], a
-	dec a
-	ld [wEnemyItemState], a
-	hlcoord 12, 0
-	lb bc, 7, 7
-	predef PlaceGraphic
-	ld a, -1
-	ld [CurOTMon], a
-	ld a, TRAINER_BATTLE
-	ld [wBattleMode], a
-
-	call IsJohtoGymLeader
-	jr nc, .done
-	xor a
-	ld [CurPartyMon], a
-	ld a, [PartyCount]
-	ld b, a
-.partyloop
-	push bc
-	ld a, MON_HP
-	call GetPartyParamLocation
-	ld a, [hli]
-	or [hl]
-	jr z, .skipfaintedmon
-	ld c, HAPPINESS_GYMBATTLE
-	callfar ChangeHappiness
-.skipfaintedmon
-	pop bc
-	dec b
-	jr z, .done
-	ld hl, CurPartyMon
-	inc [hl]
-	jr .partyloop
-.done
-	ret
-; 3f607
-
-InitEnemyWildmon: ; 3f607
-	ld a, WILD_BATTLE
-	ld [wBattleMode], a
-	farcall TrainerRankings_WildBattles
-	call LoadEnemyMon
-	ld hl, EnemyMonMoves
-	ld de, wWildMonMoves
-	ld bc, NUM_MOVES
-	call CopyBytes
-	ld hl, EnemyMonPP
-	ld de, wWildMonPP
-	ld bc, NUM_MOVES
-	call CopyBytes
-	ld hl, EnemyMonDVs
-	predef GetUnownLetter
-	ld a, [CurPartySpecies]
-	cp UNOWN
-	jr nz, .skip_unown
-	ld a, [wFirstUnownSeen]
-	and a
-	jr nz, .skip_unown
-	ld a, [UnownLetter]
-	ld [wFirstUnownSeen], a
-.skip_unown
-	ld de, VTiles2
-	predef GetAnimatedFrontpicPredef
-	xor a
-	ld [TrainerClass], a
-	ld [hGraphicStartTile], a
-	hlcoord 12, 0
-	lb bc, 7, 7
-	predef PlaceGraphic
-	ret
-; 3f662
-
-Function3f662: ; 3f662
-; XXX
-	ld hl, EnemyMonMoves
-	ld de, wListMoves_MoveIndicesBuffer
-	ld b, NUM_MOVES
-.loop
-	ld a, [de]
-	inc de
-	ld [hli], a
-	and a
-	jr z, .clearpp
-
-	push bc
-	push hl
-
-	push hl
-	dec a
-	ld hl, Moves + MOVE_PP
-	ld bc, MOVE_LENGTH
-	call AddNTimes
-	ld a, BANK(Moves)
-	call GetFarByte
-	pop hl
-
-	ld bc, EnemyMonPP - (EnemyMonMoves + 1)
-	add hl, bc
-	ld [hl], a
-
-	pop hl
-	pop bc
-
-	dec b
-	jr nz, .loop
-	ret
-
-.clear
-	xor a
-	ld [hli], a
-
-.clearpp
-	push bc
-	push hl
-	ld bc, EnemyMonPP - (EnemyMonMoves + 1)
-	add hl, bc
-	xor a
-	ld [hl], a
-	pop hl
-	pop bc
-	dec b
-	jr nz, .clear
-	ret
-; 3f69e
-
-ExitBattle: ; 3f69e
-	call .HandleEndOfBattle
-	call CleanUpBattleRAM
-	ret
-; 3f6a5
-
-.HandleEndOfBattle: ; 3f6a5
-	ld a, [wLinkMode]
-	and a
-	jr z, .not_linked
-	call ShowLinkBattleParticipantsAfterEnd
-	ld c, 150
-	call DelayFrames
-	call DisplayLinkBattleResult
-	ret
-
-.not_linked
-	ld a, [wBattleResult]
-	and $f
-	ret nz
-	call CheckPayDay
-	xor a
-	ld [wForceEvolution], a
-	predef EvolveAfterBattle
-	farcall GivePokerusAndConvertBerries
-	ret
-; 3f6d0
-
-CleanUpBattleRAM: ; 3f6d0
-	call BattleEnd_HandleRoamMons
-	xor a
-	ld [Danger], a
-	ld [wBattleMode], a
-	ld [BattleType], a
-	ld [AttackMissed], a
-	ld [TempWildMonSpecies], a
-	ld [OtherTrainerClass], a
-	ld [wFailedToFlee], a
-	ld [wNumFleeAttempts], a
-	ld [wForcedSwitch], a
-	ld [wPartyMenuCursor], a
-	ld [wKeyItemsPocketCursor], a
-	ld [wItemsPocketCursor], a
-	ld [wBattleMenuCursorBuffer], a
-	ld [CurMoveNum], a
-	ld [wBallsPocketCursor], a
-	ld [wLastPocket], a
-	ld [wMenuScrollPosition], a
-	ld [wKeyItemsPocketScrollPosition], a
-	ld [wItemsPocketScrollPosition], a
-	ld [wBallsPocketScrollPosition], a
-	ld hl, PlayerSubStatus1
-	ld b, EnemyFuryCutterCount - PlayerSubStatus1
-.loop
-	ld [hli], a
-	dec b
-	jr nz, .loop
-	call WaitSFX
-	ret
-; 3f71d
-
-CheckPayDay: ; 3f71d
-	ld hl, wPayDayMoney
-	ld a, [hli]
-	or [hl]
-	inc hl
-	or [hl]
-	ret z
-	ld a, [wAmuletCoin]
-	and a
-	jr z, .okay
-	ld hl, wPayDayMoney + 2
-	sla [hl]
-	dec hl
-	rl [hl]
-	dec hl
-	rl [hl]
-	jr nc, .okay
-	ld a, $ff
-	ld [hli], a
-	ld [hli], a
-	ld [hl], a
-
-.okay
-	ld hl, wPayDayMoney + 2
-	ld de, Money + 2
-	call AddBattleMoneyToAccount
-	ld hl, BattleText_PlayerPickedUpPayDayMoney
-	call StdBattleTextBox
-	ld a, [InBattleTowerBattle]
-	bit 0, a
-	ret z
-	call ClearTileMap
-	call ClearBGPalettes
-	ret
-; 3f759
-
-ShowLinkBattleParticipantsAfterEnd: ; 3f759
-	farcall TrainerRankings_LinkBattles
-	farcall BackupMobileEventIndex
-	ld a, [CurOTMon]
-	ld hl, OTPartyMon1Status
-	call GetPartyLocation
-	ld a, [EnemyMonStatus]
-	ld [hl], a
-	call ClearTileMap
-	farcall _ShowLinkBattleParticipants
-	ret
-; 3f77c
-
-DisplayLinkBattleResult: ; 3f77c
-	farcall CheckMobileBattleError
-	jp c, .Mobile_InvalidBattle
-	call IsMobileBattle2
-	jr nz, .proceed
-
-	ld hl, wcd2a
-	bit 4, [hl]
-	jr z, .proceed
-
-	farcall DetermineLinkBattleResult
-
-.proceed
-	ld a, [wBattleResult]
-	and $f
-	cp $1
-	jr c, .victory
-	jr z, .loss
-	farcall TrainerRankings_ColosseumDraws
-	ld de, .Draw
-	jr .store_result
-
-.victory
-	farcall TrainerRankings_ColosseumWins
-	ld de, .Win
-	jr .store_result
-
-.loss
-	farcall TrainerRankings_ColosseumLosses
-	ld de, .Lose
-	jr .store_result
-
-.store_result
-	hlcoord 6, 8
-	call PlaceString
-	farcall BackupMobileEventIndex
-	ld c, 200
-	call DelayFrames
-
-	ld a, BANK(sLinkBattleStats)
-	call GetSRAMBank
-
-	call AddLastMobileBattleToLinkRecord
-	call ReadAndPrintLinkBattleRecord
-
-	call CloseSRAM
-
-	call IsMobileBattle2
-	jr z, .mobile
-	call WaitPressAorB_BlinkCursor
-	call ClearTileMap
-	ret
-
-.mobile
-	ld c, 200
-	call DelayFrames
-	call ClearTileMap
-	ret
-; 3f7f7
-
-.Win:
-	db "YOU WIN@"
-.Lose:
-	db "YOU LOSE@"
-.Draw:
-	db "  DRAW@"
-; 3f80f
-
-.Mobile_InvalidBattle: ; 3f80f
-	hlcoord 6, 8
-	ld de, .Invalid
-	call PlaceString
-	ld c, 200
-	call DelayFrames
-	call ClearTileMap
-	ret
-; 3f821
-
-.Invalid:
-	db "INVALID BATTLE@"
-; 3f830
-
-IsMobileBattle2: ; 3f830
-	ld a, [wLinkMode]
-	cp LINK_MOBILE
-	ret
-; 3f836
-
-DisplayLinkRecord: ; 3f836
-	ld a, BANK(sLinkBattleStats)
-	call GetSRAMBank
-
-	call ReadAndPrintLinkBattleRecord
-
-	call CloseSRAM
-	hlcoord 0, 0, AttrMap
-	xor a
-	ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
-	call ByteFill
-	call WaitBGMap2
-	ld b, SCGB_DIPLOMA
-	call GetSGBLayout
-	call SetPalettes
-	ld c, 8
-	call DelayFrames
-	call WaitPressAorB_BlinkCursor
-	ret
-; 3f85f
-
-ReadAndPrintLinkBattleRecord: ; 3f85f
-	call ClearTileMap
-	call ClearSprites
-	call .PrintBattleRecord
-	hlcoord 0, 8
-	ld b, 5
-	ld de, sLinkBattleRecord + 2
-.loop
-	push bc
-	push hl
-	push de
-	ld a, [de]
-	and a
-	jr z, .PrintFormatString
-	ld a, [wSavedAtLeastOnce]
-	and a
-	jr z, .PrintFormatString
-	push hl
-	push hl
-	ld h, d
-	ld l, e
-	ld de, wd002
-	ld bc, 10
-	call CopyBytes
-	ld a, "@"
-	ld [de], a
-	inc de
-	ld bc, 6
-	call CopyBytes
-	ld de, wd002
-	pop hl
-	call PlaceString
-	pop hl
-	ld de, 26
-	add hl, de
-	push hl
-	ld de, wd00d
-	lb bc, 2, 4
-	call PrintNum
-	pop hl
-	ld de, 5
-	add hl, de
-	push hl
-	ld de, wd00f
-	lb bc, 2, 4
-	call PrintNum
-	pop hl
-	ld de, 5
-	add hl, de
-	ld de, wd011
-	lb bc, 2, 4
-	call PrintNum
-	jr .next
-
-.PrintFormatString:
-	ld de, .Format
-	call PlaceString
-.next
-	pop hl
-	ld bc, 18
-	add hl, bc
-	ld d, h
-	ld e, l
-	pop hl
-	ld bc, 2 * SCREEN_WIDTH
-	add hl, bc
-	pop bc
-	dec b
-	jr nz, .loop
-	ret
-
-.PrintBattleRecord:
-	hlcoord 1, 0
-	ld de, .Record
-	call PlaceString
-
-	hlcoord 0, 6
-	ld de, .Result
-	call PlaceString
-
-	hlcoord 0, 2
-	ld de, .Total
-	call PlaceString
-
-	hlcoord 6, 4
-	ld de, sLinkBattleWins
-	call .PrintZerosIfNoSaveFileExists
-	jr c, .quit
-
-	lb bc, 2, 4
-	call PrintNum
-
-	hlcoord 11, 4
-	ld de, sLinkBattleLosses
-	call .PrintZerosIfNoSaveFileExists
-
-	lb bc, 2, 4
-	call PrintNum
-
-	hlcoord 16, 4
-	ld de, sLinkBattleDraws
-	call .PrintZerosIfNoSaveFileExists
-
-	lb bc, 2, 4
-	call PrintNum
-
-.quit
-	ret
-
-.PrintZerosIfNoSaveFileExists:
-	ld a, [wSavedAtLeastOnce]
-	and a
-	ret nz
-	ld de, .Scores
-	call PlaceString
-	scf
-	ret
-; 3f938
-
-.Scores:
-	db "   0    0    0@"
-; 3f947
-
-.Format: ; 3f947
-	db "  ---  <LNBRK>"
-	db "         -    -    -@"
-.Record: ; 3f964
-	db "<PLAYER>'s RECORD@"
-.Result: ; 3f96e
-	db "RESULT WIN LOSE DRAW@"
-.Total: ; 3f983
-	db "TOTAL  WIN LOSE DRAW@"
-; 3f998
-
-BattleEnd_HandleRoamMons: ; 3f998
-	ld a, [BattleType]
-	cp BATTLETYPE_ROAMING
-	jr nz, .not_roaming
-	ld a, [wBattleResult]
-	and $f
-	jr z, .caught_or_defeated_roam_mon
-	call GetRoamMonHP
-	ld a, [EnemyMonHP + 1]
-	ld [hl], a
-	jr .update_roam_mons
-
-.caught_or_defeated_roam_mon
-	call GetRoamMonHP
-	ld [hl], $0
-	call GetRoamMonMapGroup
-	ld [hl], $ff
-	call GetRoamMonMapNumber
-	ld [hl], $ff
-	call GetRoamMonSpecies
-	ld [hl], $0
-	ret
-
-.not_roaming
-	call BattleRandom
-	and $f
-	ret nz
-
-.update_roam_mons
-	callfar UpdateRoamMons
-	ret
-; 3f9d1
-
-GetRoamMonMapGroup: ; 3f9d1
-	ld a, [TempEnemyMonSpecies]
-	ld b, a
-	ld a, [wRoamMon1Species]
-	cp b
-	ld hl, wRoamMon1MapGroup
-	ret z
-	ld a, [wRoamMon2Species]
-	cp b
-	ld hl, wRoamMon2MapGroup
-	ret z
-	ld hl, wRoamMon3MapGroup
-	ret
-; 3f9e9
-
-GetRoamMonMapNumber: ; 3f9e9
-	ld a, [TempEnemyMonSpecies]
-	ld b, a
-	ld a, [wRoamMon1Species]
-	cp b
-	ld hl, wRoamMon1MapNumber
-	ret z
-	ld a, [wRoamMon2Species]
-	cp b
-	ld hl, wRoamMon2MapNumber
-	ret z
-	ld hl, wRoamMon3MapNumber
-	ret
-; 3fa01
-
-GetRoamMonHP: ; 3fa01
-; output: hl = wRoamMonHP
-	ld a, [TempEnemyMonSpecies]
-	ld b, a
-	ld a, [wRoamMon1Species]
-	cp b
-	ld hl, wRoamMon1HP
-	ret z
-	ld a, [wRoamMon2Species]
-	cp b
-	ld hl, wRoamMon2HP
-	ret z
-	ld hl, wRoamMon3HP
-	ret
-; 3fa19
-
-GetRoamMonDVs: ; 3fa19
-; output: hl = wRoamMonDVs
-	ld a, [TempEnemyMonSpecies]
-	ld b, a
-	ld a, [wRoamMon1Species]
-	cp b
-	ld hl, wRoamMon1DVs
-	ret z
-	ld a, [wRoamMon2Species]
-	cp b
-	ld hl, wRoamMon2DVs
-	ret z
-	ld hl, wRoamMon3DVs
-	ret
-; 3fa31
-
-GetRoamMonSpecies: ; 3fa31
-	ld a, [TempEnemyMonSpecies]
-	ld hl, wRoamMon1Species
-	cp [hl]
-	ret z
-	ld hl, wRoamMon2Species
-	cp [hl]
-	ret z
-	ld hl, wRoamMon3Species
-	ret
-; 3fa42
-
-AddLastMobileBattleToLinkRecord: ; 3fa42
-	ld hl, OTPlayerID
-	ld de, StringBuffer1
-	ld bc, 2
-	call CopyBytes
-	ld hl, OTPlayerName
-	ld bc, NAME_LENGTH - 1
-	call CopyBytes
-	ld hl, sLinkBattleResults
-	call .StoreResult
-	ld hl, sLinkBattleRecord
-	ld d, 5
-.loop
-	push hl
-	inc hl
-	inc hl
-	ld a, [hl]
-	dec hl
-	dec hl
-	and a
-	jr z, .copy
-	push de
-	ld bc, 12
-	ld de, StringBuffer1
-	call CompareLong
-	pop de
-	pop hl
-	jr c, .done
-	ld bc, 18
-	add hl, bc
-	dec d
-	jr nz, .loop
-	ld bc, -18
-	add hl, bc
-	push hl
-
-.copy
-	ld d, h
-	ld e, l
-	ld hl, StringBuffer1
-	ld bc, 12
-	call CopyBytes
-	ld b, 6
-	xor a
-.loop2
-	ld [de], a
-	inc de
-	dec b
-	jr nz, .loop2
-	pop hl
-
-.done
-	call .StoreResult
-	call .FindOpponentAndAppendRecord
-	ret
-; 3faa0
-.StoreResult: ; 3faa0
-	ld a, [wBattleResult]
-	and $f
-	cp $1
-	ld bc, sLinkBattleWins + 1 - sLinkBattleResults
-	jr c, .okay
-	ld bc, sLinkBattleLosses + 1 - sLinkBattleResults
-	jr z, .okay
-	ld bc, sLinkBattleDraws + 1 - sLinkBattleResults
-.okay
-	add hl, bc
-	call .CheckOverflow
-	ret nc
-	inc [hl]
-	ret nz
-	dec hl
-	inc [hl]
-	ret
-; 3fabe
-
-.CheckOverflow: ; 3fabe
-	dec hl
-	ld a, [hl]
-	inc hl
-	cp HIGH(MAX_LINK_RECORD)
-	ret c
-	ld a, [hl]
-	cp LOW(MAX_LINK_RECORD)
-	ret
-; 3fac8
-
-.FindOpponentAndAppendRecord: ; 3fac8
-	ld b, 5
-	ld hl, sLinkBattleRecord + 17
-	ld de, wd002
-.loop3
-	push bc
-	push de
-	push hl
-	call .LoadPointer
-	pop hl
-	ld a, e
-	pop de
-	ld [de], a
-	inc de
-	ld a, b
-	ld [de], a
-	inc de
-	ld a, c
-	ld [de], a
-	inc de
-	ld bc, 18
-	add hl, bc
-	pop bc
-	dec b
-	jr nz, .loop3
-	ld b, $0
-	ld c, $1
-.loop4
-	ld a, b
-	add b
-	add b
-	ld e, a
-	ld d, $0
-	ld hl, wd002
-	add hl, de
-	push hl
-	ld a, c
-	add c
-	add c
-	ld e, a
-	ld d, $0
-	ld hl, wd002
-	add hl, de
-	ld d, h
-	ld e, l
-	pop hl
-	push bc
-	ld c, 3
-	call StringCmp
-	pop bc
-	jr z, .equal
-	jr nc, .done2
-
-.equal
-	inc c
-	ld a, c
-	cp $5
-	jr nz, .loop4
-	inc b
-	ld c, b
-	inc c
-	ld a, b
-	cp $4
-	jr nz, .loop4
-	ret
-
-.done2
-	push bc
-	ld a, b
-	ld bc, 18
-	ld hl, sLinkBattleRecord
-	call AddNTimes
-	push hl
-	ld de, wd002
-	ld bc, 18
-	call CopyBytes
-	pop hl
-	pop bc
-	push hl
-	ld a, c
-	ld bc, 18
-	ld hl, sLinkBattleRecord
-	call AddNTimes
-	pop de
-	push hl
-	ld bc, 18
-	call CopyBytes
-	ld hl, wd002
-	ld bc, 18
-	pop de
-	call CopyBytes
-	ret
-; 3fb54
-
-.LoadPointer: ; 3fb54
-	ld e, $0
-	ld a, [hld]
-	ld c, a
-	ld a, [hld]
-	ld b, a
-	ld a, [hld]
-	add c
-	ld c, a
-	ld a, [hld]
-	adc b
-	ld b, a
-	jr nc, .okay2
-	inc e
-
-.okay2
-	ld a, [hld]
-	add c
-	ld c, a
-	ld a, [hl]
-	adc b
-	ld b, a
-	ret nc
-	inc e
-	ret
-; 3fb6c
-
-InitBattleDisplay: ; 3fb6c
-	call .InitBackPic
-	hlcoord 0, 12
-	ld b, 4
-	ld c, 18
-	call TextBox
-	farcall MobileTextBorder
-	hlcoord 1, 5
-	lb bc, 3, 7
-	call ClearBox
-	call LoadStandardFont
-	call _LoadBattleFontsHPBar
-	call .BlankBGMap
-	xor a
-	ld [hMapAnims], a
-	ld [hSCY], a
-	ld a, $90
-	ld [hWY], a
-	ld [rWY], a
-	call WaitBGMap
-	xor a
-	ld [hBGMapMode], a
-	farcall BattleIntroSlidingPics
-	ld a, $1
-	ld [hBGMapMode], a
-	ld a, $31
-	ld [hGraphicStartTile], a
-	hlcoord 2, 6
-	lb bc, 6, 6
-	predef PlaceGraphic
-	xor a
-	ld [hWY], a
-	ld [rWY], a
-	call WaitBGMap
-	call HideSprites
-	ld b, SCGB_BATTLE_COLORS
-	call GetSGBLayout
-	call SetPalettes
-	ld a, $90
-	ld [hWY], a
-	xor a
-	ld [hSCX], a
-	ret
-; 3fbd6
-
-.BlankBGMap: ; 3fbd6
-	ld a, [rSVBK]
-	push af
-	ld a, $6
-	ld [rSVBK], a
-
-	ld hl, wDecompressScratch
-	ld bc, wScratchAttrMap - wDecompressScratch
-	ld a, " "
-	call ByteFill
-
-	ld de, wDecompressScratch
-	hlbgcoord 0, 0
-	lb bc, BANK(.BlankBGMap), $40
-	call Request2bpp
-
-	pop af
-	ld [rSVBK], a
-	ret
-; 3fbf8
-
-.InitBackPic: ; 3fbf8
-	call GetTrainerBackpic
-	call CopyBackpic
-	ret
-; 3fbff
-
-GetTrainerBackpic: ; 3fbff
-; Load the player character's backpic (6x6) into VRAM starting from VTiles2 tile $31.
-
-; Special exception for Dude.
-	ld b, BANK(DudeBackpic)
-	ld hl, DudeBackpic
-	ld a, [BattleType]
-	cp BATTLETYPE_TUTORIAL
-	jr z, .Decompress
-
-; What gender are we?
-	ld a, [wPlayerSpriteSetupFlags]
-	bit 2, a ; transformed to male
-	jr nz, .Chris
-	ld a, [PlayerGender]
-	bit 0, a
-	jr z, .Chris
-
-; It's a girl.
-	farcall GetKrisBackpic
-	ret
-
-.Chris:
-; It's a boy.
-	ld b, BANK(ChrisBackpic)
-	ld hl, ChrisBackpic
-
-.Decompress:
-	ld de, VTiles2 tile $31
-	ld c, $31
-	predef DecompressPredef
-	ret
-; 3fc30
-
-CopyBackpic: ; 3fc30
-	ld a, [rSVBK]
-	push af
-	ld a, $6
-	ld [rSVBK], a
-	ld hl, VTiles0
-	ld de, VTiles2 tile $31
-	ld a, [hROMBank]
-	ld b, a
-	ld c, $31
-	call Get2bpp
-	pop af
-	ld [rSVBK], a
-	call .LoadTrainerBackpicAsOAM
-	ld a, $31
-	ld [hGraphicStartTile], a
-	hlcoord 2, 6
-	lb bc, 6, 6
-	predef PlaceGraphic
-	ret
-; 3fc5b
-
-.LoadTrainerBackpicAsOAM: ; 3fc5b
-	ld hl, Sprites
-	xor a
-	ld [hMapObjectIndexBuffer], a
-	ld b, $6
-	ld e, 21 * 8
-.outer_loop
-	ld c, $3
-	ld d, 8 * 8
-.inner_loop
-	ld [hl], d
-	inc hl
-	ld [hl], e
-	inc hl
-	ld a, [hMapObjectIndexBuffer]
-	ld [hli], a
-	inc a
-	ld [hMapObjectIndexBuffer], a
-	ld a, $1
-	ld [hli], a
-	ld a, d
-	add $8
-	ld d, a
-	dec c
-	jr nz, .inner_loop
-	ld a, [hMapObjectIndexBuffer]
-	add $3
-	ld [hMapObjectIndexBuffer], a
-	ld a, e
-	add $8
-	ld e, a
-	dec b
-	jr nz, .outer_loop
-	ret
-; 3fc8b
-
-BattleStartMessage: ; 3fc8b
-	ld a, [wBattleMode]
-	dec a
-	jr z, .wild
-
-	ld de, SFX_SHINE
-	call PlaySFX
-	call WaitSFX
-
-	ld c, 20
-	call DelayFrames
-
-	farcall Battle_GetTrainerName
-
-	ld hl, WantsToBattleText
-	jr .PlaceBattleStartText
-
-.wild
-	call BattleCheckEnemyShininess
-	jr nc, .not_shiny
-
-	xor a
-	ld [wNumHits], a
-	ld a, 1
-	ld [hBattleTurn], a
-	ld a, 1
-	ld [wBattleAnimParam], a
-	ld de, ANIM_SEND_OUT_MON
-	call Call_PlayBattleAnim
-
-.not_shiny
-	farcall CheckSleepingTreeMon
-	jr c, .skip_cry
-
-	farcall CheckBattleScene
-	jr c, .cry_no_anim
-
-	hlcoord 12, 0
-	ld d, $0
-	ld e, ANIM_MON_NORMAL
-	predef AnimateFrontpic
-	jr .skip_cry ; cry is played during the animation
-
-.cry_no_anim
-	ld a, $0f
-	ld [CryTracks], a
-	ld a, [TempEnemyMonSpecies]
-	call PlayStereoCry
-
-.skip_cry
-	ld a, [BattleType]
-	cp BATTLETYPE_FISH
-	jr nz, .NotFishing
-
-	farcall TrainerRankings_HookedEncounters
-
-	ld hl, HookedPokemonAttackedText
-	jr .PlaceBattleStartText
-
-.NotFishing:
-	ld hl, PokemonFellFromTreeText
-	cp BATTLETYPE_TREE
-	jr z, .PlaceBattleStartText
-	ld hl, WildCelebiAppearedText
-	cp BATTLETYPE_CELEBI
-	jr z, .PlaceBattleStartText
-	ld hl, WildPokemonAppearedText
-
-.PlaceBattleStartText:
-	push hl
-	farcall BattleStart_TrainerHuds
-	pop hl
-	call StdBattleTextBox
-
-	call IsMobileBattle2
-	ret nz
-
-	ld c, $2 ; start
-	farcall Mobile_PrintOpponentBattleMessage
-
-	ret
-; 3fd26
--- a/battle/effect_command_pointers.asm
+++ /dev/null
@@ -1,180 +1,0 @@
-	dw 0 ; padding
-
-BattleCommandPointers: ; 3fd28
-; entries correspond to macros/scripts/effect_commands.asm
-	dw BattleCommand_CheckTurn ; 34084
-	dw BattleCommand_CheckObedience ; 343db
-	dw BattleCommand_UsedMoveText ; 34541
-	dw BattleCommand_DoTurn ; 34555
-	dw BattleCommand_Critical ; 34631
-	dw BattleCommand_DamageStats ; 352dc
-	dw BattleCommand_Stab ; 346d2 - 07
-	dw BattleCommand_DamageVariation ; 34cfd
-	dw BattleCommand_CheckHit ; 34d32
-	dw BattleCommand_LowerSub ; 34eee
-	dw BattleCommand_HitTargetNoSub ; 34f60
-	dw BattleCommand_RaiseSub ; 35004
-	dw BattleCommand_FailureText ; 35023
-	dw BattleCommand_CheckFaint ; 3505e
-	dw BattleCommand_CriticalText ; 35175
-	dw BattleCommand_SuperEffectiveText ; 351ad
-	dw BattleCommand_CheckDestinyBond ; 351c0
-	dw BattleCommand_BuildOpponentRage ; 35250
-	dw BattleCommand_PoisonTarget ; 35eee
-	dw BattleCommand_SleepTarget ; 35e5c
-	dw BattleCommand_DrainTarget ; 35fff
-	dw BattleCommand_EatDream ; 36008
-	dw BattleCommand_BurnTarget ; 3608c
-	dw BattleCommand_FreezeTarget ; 36102
-	dw BattleCommand_ParalyzeTarget ; 36165
-	dw BattleCommand_Selfdestruct ; 37380
-	dw BattleCommand_MirrorMove ; 373c9
-	dw BattleCommand_StatUp ; 361e4
-	dw BattleCommand_StatDown ; 362e3
-	dw BattleCommand_PayDay ; 3705c
-	dw BattleCommand_Conversion ; 3707f
-	dw BattleCommand_ResetStats ; 3710e
-	dw BattleCommand_StoreEnergy ; 36671
-	dw BattleCommand_UnleashEnergy ; 366e5
-	dw BattleCommand_ForceSwitch ; 3680f
-	dw BattleCommand_EndLoop ; 369b6
-	dw BattleCommand_FlinchTarget ; 36aa0
-	dw BattleCommand_OHKO ; 36af3
-	dw BattleCommand_Recoil ; 36cb2
-	dw BattleCommand_Mist ; 36c7e
-	dw BattleCommand_FocusEnergy ; 36c98
-	dw BattleCommand_Confuse ; 36d3b
-	dw BattleCommand_ConfuseTarget ; 36d1d
-	dw BattleCommand_Heal ; 3713e
-	dw BattleCommand_Transform ; 371cd
-	dw BattleCommand_Screen ; 372fc
-	dw BattleCommand_Poison ; 35f2c
-	dw BattleCommand_Paralyze ; 36dc7
-	dw BattleCommand_Substitute ; 36e7c
-	dw BattleCommand_RechargeNextTurn ; 36f0b
-	dw BattleCommand_Mimic ; 36f46
-	dw BattleCommand_Metronome ; 37418
-	dw BattleCommand_LeechSeed ; 36f9d
-	dw BattleCommand_Splash ; 36fe1
-	dw BattleCommand_Disable ; 36fed
-	dw BattleCommand_ClearText ; 37e85
-	dw BattleCommand_Charge ; 36b4d
-	dw BattleCommand_CheckCharge ; 36b3a
-	dw BattleCommand_TrapTarget ; 36c2d
-	dw BattleCommand3c ; 36c2c
-	dw BattleCommand_Rampage ; 36751
-	dw BattleCommand_CheckRampage ; 3671a
-	dw BattleCommand_ConstantDamage ; 35726
-	dw BattleCommand_Counter ; 35813
-	dw BattleCommand_Encore ; 35864
-	dw BattleCommand_PainSplit ; 35926
-	dw BattleCommand_Snore ; 359d0
-	dw BattleCommand_Conversion2 ; 359e6
-	dw BattleCommand_LockOn ; 35a53
-	dw BattleCommand_Sketch ; 35a74
-	dw BattleCommand_DefrostOpponent ; 35b16
-	dw BattleCommand_SleepTalk ; 35b33
-	dw BattleCommand_DestinyBond ; 35bff
-	dw BattleCommand_Spite ; 35c0f
-	dw BattleCommand_FalseSwipe ; 35c94
-	dw BattleCommand_HealBell ; 35cc9
-	dw BattleCommand_HeldFlinch ; 36ac9
-	dw BattleCommand_TripleKick ; 346b2
-	dw BattleCommand_KickCounter ; 346cd
-	dw BattleCommand_Thief ; 37492
-	dw BattleCommand_ArenaTrap ; 37517
-	dw BattleCommand_Nightmare ; 37536
-	dw BattleCommand_Defrost ; 37563
-	dw BattleCommand_Curse ; 37588
-	dw BattleCommand_Protect ; 37618
-	dw BattleCommand_Spikes ; 37683
-	dw BattleCommand_Foresight ; 376a0
-	dw BattleCommand_PerishSong ; 376c2
-	dw BattleCommand_StartSandstorm ; 376f8
-	dw BattleCommand_Endure ; 3766f
-	dw BattleCommand_CheckCurl ; 37718
-	dw BattleCommand_RolloutPower ; 37734
-	dw BattleCommand5d ; 37791
-	dw BattleCommand_FuryCutter ; 37792
-	dw BattleCommand_Attract ; 377ce
-	dw BattleCommand_HappinessPower ; 3784b
-	dw BattleCommand_Present ; 37874
-	dw BattleCommand_DamageCalc ; 35612 - 62
-	dw BattleCommand_FrustrationPower ; 3790e
-	dw BattleCommand_Safeguard ; 37939
-	dw BattleCommand_CheckSafeguard ; 37972
-	dw BattleCommand_GetMagnitude ; 37991
-	dw BattleCommand_BatonPass ; 379c9
-	dw BattleCommand_Pursuit ; 37b1d
-	dw BattleCommand_ClearHazards ; 37b39
-	dw BattleCommand_HealMorn ; 37b74
-	dw BattleCommand_HealDay ; 37b78
-	dw BattleCommand_HealNite ; 37b7c
-	dw BattleCommand_HiddenPower ; 37be8
-	dw BattleCommand_StartRain ; 37bf4
-	dw BattleCommand_StartSun ; 37c07
-	dw BattleCommand_AttackUp ; 361ac
-	dw BattleCommand_DefenseUp ; 361b0
-	dw BattleCommand_SpeedUp ; 361b4
-	dw BattleCommand_SpecialAttackUp ; 361b8
-	dw BattleCommand_SpecialDefenseUp ; 361bc
-	dw BattleCommand_AccuracyUp ; 361c0
-	dw BattleCommand_EvasionUp ; 361c4
-	dw BattleCommand_AttackUp2 ; 361c8
-	dw BattleCommand_DefenseUp2 ; 361cc
-	dw BattleCommand_SpeedUp2 ; 361d0
-	dw BattleCommand_SpecialAttackUp2 ; 361d4
-	dw BattleCommand_SpecialDefenseUp2 ; 361d8
-	dw BattleCommand_AccuracyUp2 ; 361dc
-	dw BattleCommand_EvasionUp2 ; 361e0
-	dw BattleCommand_AttackDown ; 362ad
-	dw BattleCommand_DefenseDown ; 362b1
-	dw BattleCommand_SpeedDown ; 362b5
-	dw BattleCommand_SpecialAttackDown ; 362b9
-	dw BattleCommand_SpecialDefenseDown ; 362bd
-	dw BattleCommand_AccuracyDown ; 362c1
-	dw BattleCommand_EvasionDown ; 362c5
-	dw BattleCommand_AttackDown2 ; 362c9
-	dw BattleCommand_DefenseDown2 ; 362cd
-	dw BattleCommand_SpeedDown2 ; 362d1
-	dw BattleCommand_SpecialAttackDown2 ; 362d5
-	dw BattleCommand_SpecialDefenseDown2 ; 362d9
-	dw BattleCommand_AccuracyDown2 ; 362dd
-	dw BattleCommand_EvasionDown2 ; 362e1
-	dw BattleCommand_StatUpMessage ; 363b8
-	dw BattleCommand_StatDownMessage ; 363e9
-	dw BattleCommand_StatUpFailText ; 3644c
-	dw BattleCommand_StatDownFailText ; 3646a
-	dw BattleCommand_EffectChance ; 34ecc
-	dw BattleCommand_StatDownAnim ; 34fdb
-	dw BattleCommand_StatUpAnim ; 34fd1
-	dw BattleCommand_SwitchTurn ; 34ffd - 93
-	dw BattleCommand_FakeOut ; 36a82
-	dw BattleCommand_BellyDrum ; 37c1a
-	dw BattleCommand_PsychUp ; 37c55
-	dw BattleCommand_Rage ; 36f1d
-	dw BattleCommand_DoubleFlyingDamage ; 36f25
-	dw BattleCommand_DoubleUndergroundDamage ; 36f2f
-	dw BattleCommand_MirrorCoat ; 37c95
-	dw BattleCommand_CheckFutureSight ; 37d0d
-	dw BattleCommand_FutureSight ; 37d34
-	dw BattleCommand_DoubleMinimizeDamage ; 37ce6
-	dw BattleCommand_SkipSunCharge ; 37d02
-	dw BattleCommand_ThunderAccuracy ; 37d94
-	dw BattleCommand_Teleport ; 36778
-	dw BattleCommand_BeatUp ; 35461
-	dw BattleCommand_RageDamage ; 3527b
-	dw BattleCommand_ResetTypeMatchup ; 34833
-	dw BattleCommand_AllStatsUp ; 36500
-	dw BattleCommanda5 ; 35165
-	dw BattleCommand_RaiseSubNoAnim ; 365af
-	dw BattleCommand_LowerSubNoAnim ; 365c3
-	dw BattleCommanda8 ; 355b5
-	dw BattleCommand_ClearMissDamage ; 355d5 - a9
-	dw BattleCommand_MoveDelay ; 37e80
-	dw BattleCommand_HitTarget ; 34f57
-	dw BattleCommand_TriStatusChance ; 3658f
-	dw BattleCommand_SuperEffectiveLoopText ; 351a5
-	dw BattleCommand_StartLoop ; 35197
-	dw BattleCommand_Curl ; 365a7
-; 3fe86
--- a/battle/effect_commands.asm
+++ /dev/null
@@ -1,10069 +1,0 @@
-DoPlayerTurn: ; 34000
-	call SetPlayerTurn
-
-	ld a, [wPlayerAction]
-	and a
-	ret nz
-
-	jr DoTurn
-
-; 3400a
-
-
-DoEnemyTurn: ; 3400a
-	call SetEnemyTurn
-
-	ld a, [wLinkMode]
-	and a
-	jr z, DoTurn
-
-	ld a, [wBattleAction]
-	cp BATTLEACTION_E
-	jr z, DoTurn
-	cp BATTLEACTION_SWITCH1
-	ret nc
-
-	; fallthrough
-; 3401d
-
-
-DoTurn: ; 3401d
-; Read in and execute the user's move effects for this turn.
-
-	xor a
-	ld [wTurnEnded], a
-
-	; Effect command checkturn is called for every move.
-	call CheckTurn
-
-	ld a, [wTurnEnded]
-	and a
-	ret nz
-
-	call UpdateMoveData
-; 3402c
-
-
-DoMove: ; 3402c
-; Get the user's move effect.
-	ld a, BATTLE_VARS_MOVE_EFFECT
-	call GetBattleVar
-	ld c, a
-	ld b, 0
-	ld hl, MoveEffectsPointers
-	add hl, bc
-	add hl, bc
-	ld a, BANK(MoveEffectsPointers)
-	call GetFarHalfword
-
-	ld de, BattleScriptBuffer
-
-.GetMoveEffect:
-	ld a, BANK(MoveEffects)
-	call GetFarByte
-	inc hl
-	ld [de], a
-	inc de
-	cp $ff
-	jr nz, .GetMoveEffect
-
-; Start at the first command.
-	ld hl, BattleScriptBuffer
-	ld a, l
-	ld [BattleScriptBufferAddress], a
-	ld a, h
-	ld [BattleScriptBufferAddress + 1], a
-
-.ReadMoveEffectCommand:
-
-; ld a, [BattleScriptBufferAddress++]
-	ld a, [BattleScriptBufferAddress]
-	ld l, a
-	ld a, [BattleScriptBufferAddress + 1]
-	ld h, a
-
-	ld a, [hli]
-
-	push af
-	ld a, l
-	ld [BattleScriptBufferAddress], a
-	ld a, h
-	ld [BattleScriptBufferAddress + 1], a
-	pop af
-
-; endturn_command (-2) is used to terminate branches without ending the read cycle.
-	cp endturn_command
-	ret nc
-
-; The rest of the commands (01-af) are read from BattleCommandPointers.
-	push bc
-	dec a
-	ld c, a
-	ld b, 0
-	ld hl, BattleCommandPointers
-	add hl, bc
-	add hl, bc
-	pop bc
-
-	ld a, BANK(BattleCommandPointers)
-	call GetFarHalfword
-
-	call .DoMoveEffectCommand
-
-	jr .ReadMoveEffectCommand
-
-.DoMoveEffectCommand:
-	jp hl
-
-; 34084
-
-
-CheckTurn:
-BattleCommand_CheckTurn: ; 34084
-; checkturn
-
-; Repurposed as hardcoded turn handling. Useless as a command.
-
-; Move $ff immediately ends the turn.
-	ld a, BATTLE_VARS_MOVE
-	call GetBattleVar
-	inc a
-	jp z, EndTurn
-
-	xor a
-	ld [AttackMissed], a
-	ld [EffectFailed], a
-	ld [wKickCounter], a
-	ld [AlreadyDisobeyed], a
-	ld [AlreadyFailed], a
-	ld [wSomeoneIsRampaging], a
-
-	ld a, 10 ; 1.0
-	ld [TypeModifier], a
-
-	ld a, [hBattleTurn]
-	and a
-	jp nz, CheckEnemyTurn
-
-
-CheckPlayerTurn:
-
-	ld hl, PlayerSubStatus4
-	bit SUBSTATUS_RECHARGE, [hl]
-	jr z, .no_recharge
-
-	res SUBSTATUS_RECHARGE, [hl]
-	ld hl, MustRechargeText
-	call StdBattleTextBox
-	call CantMove
-	jp EndTurn
-
-.no_recharge
-
-
-	ld hl, BattleMonStatus
-	ld a, [hl]
-	and SLP
-	jr z, .not_asleep
-
-	dec a
-	ld [BattleMonStatus], a
-	and SLP
-	jr z, .woke_up
-
-	xor a
-	ld [wNumHits], a
-	ld de, ANIM_SLP
-	call FarPlayBattleAnimation
-	jr .fast_asleep
-
-.woke_up
-	ld hl, WokeUpText
-	call StdBattleTextBox
-	call CantMove
-	call UpdateBattleMonInParty
-	ld hl, UpdatePlayerHUD
-	call CallBattleCore
-	ld a, $1
-	ld [hBGMapMode], a
-	ld hl, PlayerSubStatus1
-	res SUBSTATUS_NIGHTMARE, [hl]
-	jr .not_asleep
-
-.fast_asleep
-	ld hl, FastAsleepText
-	call StdBattleTextBox
-
-	; Snore and Sleep Talk bypass sleep.
-	ld a, [CurPlayerMove]
-	cp SNORE
-	jr z, .not_asleep
-	cp SLEEP_TALK
-	jr z, .not_asleep
-
-	call CantMove
-	jp EndTurn
-
-.not_asleep
-
-
-	ld hl, BattleMonStatus
-	bit FRZ, [hl]
-	jr z, .not_frozen
-
-	; Flame Wheel and Sacred Fire thaw the user.
-	ld a, [CurPlayerMove]
-	cp FLAME_WHEEL
-	jr z, .not_frozen
-	cp SACRED_FIRE
-	jr z, .not_frozen
-
-	ld hl, FrozenSolidText
-	call StdBattleTextBox
-
-	call CantMove
-	jp EndTurn
-
-.not_frozen
-
-
-	ld hl, PlayerSubStatus3
-	bit SUBSTATUS_FLINCHED, [hl]
-	jr z, .not_flinched
-
-	res SUBSTATUS_FLINCHED, [hl]
-	ld hl, FlinchedText
-	call StdBattleTextBox
-
-	call CantMove
-	jp EndTurn
-
-.not_flinched
-
-
-	ld hl, PlayerDisableCount
-	ld a, [hl]
-	and a
-	jr z, .not_disabled
-
-	dec a
-	ld [hl], a
-	and $f
-	jr nz, .not_disabled
-
-	ld [hl], a
-	ld [DisabledMove], a
-	ld hl, DisabledNoMoreText
-	call StdBattleTextBox
-
-.not_disabled
-
-
-	ld a, [PlayerSubStatus3]
-	add a
-	jr nc, .not_confused
-	ld hl, PlayerConfuseCount
-	dec [hl]
-	jr nz, .confused
-
-	ld hl, PlayerSubStatus3
-	res SUBSTATUS_CONFUSED, [hl]
-	ld hl, ConfusedNoMoreText
-	call StdBattleTextBox
-	jr .not_confused
-
-.confused
-	ld hl, IsConfusedText
-	call StdBattleTextBox
-	xor a
-	ld [wNumHits], a
-	ld de, ANIM_CONFUSED
-	call FarPlayBattleAnimation
-
-	; 50% chance of hitting itself
-	call BattleRandom
-	cp $80
-	jr nc, .not_confused
-
-	; clear confusion-dependent substatus
-	ld hl, PlayerSubStatus3
-	ld a, [hl]
-	and 1 << SUBSTATUS_CONFUSED
-	ld [hl], a
-
-	call HitConfusion
-	call CantMove
-	jp EndTurn
-
-.not_confused
-
-
-	ld a, [PlayerSubStatus1]
-	add a ; bit SUBSTATUS_ATTRACT
-	jr nc, .not_infatuated
-
-	ld hl, InLoveWithText
-	call StdBattleTextBox
-	xor a
-	ld [wNumHits], a
-	ld de, ANIM_IN_LOVE
-	call FarPlayBattleAnimation
-
-	; 50% chance of infatuation
-	call BattleRandom
-	cp $80
-	jr c, .not_infatuated
-
-	ld hl, InfatuationText
-	call StdBattleTextBox
-	call CantMove
-	jp EndTurn
-
-.not_infatuated
-
-
-	; We can't disable a move that doesn't exist.
-	ld a, [DisabledMove]
-	and a
-	jr z, .no_disabled_move
-
-	; Are we using the disabled move?
-	ld hl, CurPlayerMove
-	cp [hl]
-	jr nz, .no_disabled_move
-
-	call MoveDisabled
-	call CantMove
-	jp EndTurn
-
-.no_disabled_move
-
-
-	ld hl, BattleMonStatus
-	bit PAR, [hl]
-	ret z
-
-	; 25% chance to be fully paralyzed
-	call BattleRandom
-	cp $3f
-	ret nc
-
-	ld hl, FullyParalyzedText
-	call StdBattleTextBox
-	call CantMove
-	jp EndTurn
-
-; 341f0
-
-
-CantMove: ; 341f0
-	ld a, BATTLE_VARS_SUBSTATUS1
-	call GetBattleVarAddr
-	res SUBSTATUS_ROLLOUT, [hl]
-
-	ld a, BATTLE_VARS_SUBSTATUS3
-	call GetBattleVarAddr
-	ld a, [hl]
-	and $ff ^ (1<<SUBSTATUS_BIDE + 1<<SUBSTATUS_RAMPAGE + 1<<SUBSTATUS_CHARGED)
-	ld [hl], a
-
-	call ResetFuryCutterCount
-
-	ld a, BATTLE_VARS_MOVE_ANIM
-	call GetBattleVar
-	cp FLY
-	jr z, .fly_dig
-
-	cp DIG
-	ret nz
-
-.fly_dig
-	res SUBSTATUS_UNDERGROUND, [hl]
-	res SUBSTATUS_FLYING, [hl]
-	jp AppearUserRaiseSub
-
-; 34216
-
-
-
-OpponentCantMove: ; 34216
-	call BattleCommand_SwitchTurn
-	call CantMove
-	jp BattleCommand_SwitchTurn
-
-; 3421f
-
-
-
-CheckEnemyTurn: ; 3421f
-
-	ld hl, EnemySubStatus4
-	bit SUBSTATUS_RECHARGE, [hl]
-	jr z, .no_recharge
-
-	res SUBSTATUS_RECHARGE, [hl]
-	ld hl, MustRechargeText
-	call StdBattleTextBox
-	call CantMove
-	jp EndTurn
-
-.no_recharge
-
-
-	ld hl, EnemyMonStatus
-	ld a, [hl]
-	and SLP
-	jr z, .not_asleep
-
-	dec a
-	ld [EnemyMonStatus], a
-	and a
-	jr z, .woke_up
-
-	ld hl, FastAsleepText
-	call StdBattleTextBox
-	xor a
-	ld [wNumHits], a
-	ld de, ANIM_SLP
-	call FarPlayBattleAnimation
-	jr .fast_asleep
-
-.woke_up
-	ld hl, WokeUpText
-	call StdBattleTextBox
-	call CantMove
-	call UpdateEnemyMonInParty
-	ld hl, UpdateEnemyHUD
-	call CallBattleCore
-	ld a, $1
-	ld [hBGMapMode], a
-	ld hl, EnemySubStatus1
-	res SUBSTATUS_NIGHTMARE, [hl]
-	jr .not_asleep
-
-.fast_asleep
-	; Snore and Sleep Talk bypass sleep.
-	ld a, [CurEnemyMove]
-	cp SNORE
-	jr z, .not_asleep
-	cp SLEEP_TALK
-	jr z, .not_asleep
-	call CantMove
-	jp EndTurn
-
-.not_asleep
-
-
-	ld hl, EnemyMonStatus
-	bit FRZ, [hl]
-	jr z, .not_frozen
-	ld a, [CurEnemyMove]
-	cp FLAME_WHEEL
-	jr z, .not_frozen
-	cp SACRED_FIRE
-	jr z, .not_frozen
-
-	ld hl, FrozenSolidText
-	call StdBattleTextBox
-	call CantMove
-	jp EndTurn
-
-.not_frozen
-
-
-	ld hl, EnemySubStatus3
-	bit SUBSTATUS_FLINCHED, [hl]
-	jr z, .not_flinched
-
-	res SUBSTATUS_FLINCHED, [hl]
-	ld hl, FlinchedText
-	call StdBattleTextBox
-
-	call CantMove
-	jp EndTurn
-
-.not_flinched
-
-
-	ld hl, EnemyDisableCount
-	ld a, [hl]
-	and a
-	jr z, .not_disabled
-
-	dec a
-	ld [hl], a
-	and $f
-	jr nz, .not_disabled
-
-	ld [hl], a
-	ld [EnemyDisabledMove], a
-
-	ld hl, DisabledNoMoreText
-	call StdBattleTextBox
-
-.not_disabled
-
-
-	ld a, [EnemySubStatus3]
-	add a ; bit SUBSTATUS_CONFUSED
-	jr nc, .not_confused
-
-	ld hl, EnemyConfuseCount
-	dec [hl]
-	jr nz, .confused
-
-	ld hl, EnemySubStatus3
-	res SUBSTATUS_CONFUSED, [hl]
-	ld hl, ConfusedNoMoreText
-	call StdBattleTextBox
-	jr .not_confused
-
-
-.confused
-	ld hl, IsConfusedText
-	call StdBattleTextBox
-
-	xor a
-	ld [wNumHits], a
-	ld de, ANIM_CONFUSED
-	call FarPlayBattleAnimation
-
-	; 50% chance of hitting itself
-	call BattleRandom
-	cp 1 + 50 percent
-	jr nc, .not_confused
-
-	; clear confusion-dependent substatus
-	ld hl, EnemySubStatus3
-	ld a, [hl]
-	and 1 << SUBSTATUS_CONFUSED
-	ld [hl], a
-
-	ld hl, HurtItselfText
-	call StdBattleTextBox
-	call HitSelfInConfusion
-	call BattleCommand_DamageCalc
-	call BattleCommand_LowerSub
-	xor a
-	ld [wNumHits], a
-
-	; Flicker the monster pic unless flying or underground.
-	ld de, ANIM_HIT_CONFUSION
-	ld a, BATTLE_VARS_SUBSTATUS3_OPP
-	call GetBattleVar
-	and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
-	call z, PlayFXAnimID
-
-	ld c, $1
-	call EnemyHurtItself
-	call BattleCommand_RaiseSub
-	call CantMove
-	jp EndTurn
-
-.not_confused
-
-
-	ld a, [EnemySubStatus1]
-	add a ; bit SUBSTATUS_ATTRACT
-	jr nc, .not_infatuated
-
-	ld hl, InLoveWithText
-	call StdBattleTextBox
-	xor a
-	ld [wNumHits], a
-	ld de, ANIM_IN_LOVE
-	call FarPlayBattleAnimation
-
-	; 50% chance of infatuation
-	call BattleRandom
-	cp 1 + 50 percent
-	jr c, .not_infatuated
-
-	ld hl, InfatuationText
-	call StdBattleTextBox
-	call CantMove
-	jp EndTurn
-
-.not_infatuated
-
-
-	; We can't disable a move that doesn't exist.
-	ld a, [EnemyDisabledMove]
-	and a
-	jr z, .no_disabled_move
-
-	; Are we using the disabled move?
-	ld hl, CurEnemyMove
-	cp [hl]
-	jr nz, .no_disabled_move
-
-	call MoveDisabled
-
-	call CantMove
-	jp EndTurn
-
-.no_disabled_move
-
-
-	ld hl, EnemyMonStatus
-	bit PAR, [hl]
-	ret z
-
-	; 25% chance to be fully paralyzed
-	call BattleRandom
-	cp $3f
-	ret nc
-
-	ld hl, FullyParalyzedText
-	call StdBattleTextBox
-	call CantMove
-
-	; fallthrough
-; 34385
-
-
-EndTurn: ; 34385
-	ld a, $1
-	ld [wTurnEnded], a
-	jp ResetDamage
-
-; 3438d
-
-
-MoveDisabled: ; 3438d
-
-	; Make sure any charged moves fail
-	ld a, BATTLE_VARS_SUBSTATUS3
-	call GetBattleVarAddr
-	res SUBSTATUS_CHARGED, [hl]
-
-	ld a, BATTLE_VARS_MOVE
-	call GetBattleVar
-	ld [wNamedObjectIndexBuffer], a
-	call GetMoveName
-
-	ld hl, DisabledMoveText
-	jp StdBattleTextBox
-
-; 343a5
-
-
-HitConfusion: ; 343a5
-
-	ld hl, HurtItselfText
-	call StdBattleTextBox
-
-	xor a
-	ld [CriticalHit], a
-
-	call HitSelfInConfusion
-	call BattleCommand_DamageCalc
-	call BattleCommand_LowerSub
-
-	xor a
-	ld [wNumHits], a
-
-	; Flicker the monster pic unless flying or underground.
-	ld de, ANIM_HIT_CONFUSION
-	ld a, BATTLE_VARS_SUBSTATUS3_OPP
-	call GetBattleVar
-	and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
-	call z, PlayFXAnimID
-
-	ld hl, UpdatePlayerHUD
-	call CallBattleCore
-	ld a, $1
-	ld [hBGMapMode], a
-	ld c, $1
-	call PlayerHurtItself
-	jp BattleCommand_RaiseSub
-
-; 343db
-
-
-BattleCommand_CheckObedience: ; 343db
-; checkobedience
-
-	; Enemy can't disobey
-	ld a, [hBattleTurn]
-	and a
-	ret nz
-
-	call CheckUserIsCharging
-	ret nz
-
-	; If we've already checked this turn
-	ld a, [AlreadyDisobeyed]
-	and a
-	ret nz
-
-	xor a
-	ld [AlreadyDisobeyed], a
-
-	; No obedience in link battles
-	; (since no handling exists for enemy)
-	ld a, [wLinkMode]
-	and a
-	ret nz
-
-	ld a, [InBattleTowerBattle]
-	and a
-	ret nz
-
-	; If the monster's id doesn't match the player's,
-	; some conditions need to be met.
-	ld a, MON_ID
-	call BattlePartyAttr
-
-	ld a, [PlayerID]
-	cp [hl]
-	jr nz, .obeylevel
-	inc hl
-	ld a, [PlayerID + 1]
-	cp [hl]
-	ret z
-
-
-.obeylevel
-	; The maximum obedience level is constrained by owned badges:
-	ld hl, JohtoBadges
-
-	; risingbadge
-	bit RISINGBADGE, [hl]
-	ld a, MAX_LEVEL + 1
-	jr nz, .getlevel
-
-	; stormbadge
-	bit STORMBADGE, [hl]
-	ld a, 70
-	jr nz, .getlevel
-
-	; fogbadge
-	bit FOGBADGE, [hl]
-	ld a, 50
-	jr nz, .getlevel
-
-	; hivebadge
-	bit HIVEBADGE, [hl]
-	ld a, 30
-	jr nz, .getlevel
-
-	; no badges
-	ld a, 10
-
-
-.getlevel
-; c = obedience level
-; d = monster level
-; b = c + d
-
-	ld b, a
-	ld c, a
-
-	ld a, [BattleMonLevel]
-	ld d, a
-
-	add b
-	ld b, a
-
-; No overflow (this should never happen)
-	jr nc, .checklevel
-	ld b, $ff
-
-
-.checklevel
-; If the monster's level is lower than the obedience level, it will obey.
-	ld a, c
-	cp d
-	ret nc
-
-
-; Random number from 0 to obedience level + monster level
-.rand1
-	call BattleRandom
-	swap a
-	cp b
-	jr nc, .rand1
-
-; The higher above the obedience level the monster is,
-; the more likely it is to disobey.
-	cp c
-	ret c
-
-; Sleep-only moves have separate handling, and a higher chance of
-; being ignored. Lazy monsters like their sleep.
-	call IgnoreSleepOnly
-	ret c
-
-
-; Another random number from 0 to obedience level + monster level
-.rand2
-	call BattleRandom
-	cp b
-	jr nc, .rand2
-
-; A second chance.
-	cp c
-	jr c, .UseInstead
-
-
-; No hope of using a move now.
-
-; b = number of levels the monster is above the obedience level
-	ld a, d
-	sub c
-	ld b, a
-
-; The chance of napping is the difference out of 256.
-	call BattleRandom
-	swap a
-	sub b
-	jr c, .Nap
-
-; The chance of not hitting itself is the same.
-	cp b
-	jr nc, .DoNothing
-
-	ld hl, WontObeyText
-	call StdBattleTextBox
-	call HitConfusion
-	jp .EndDisobedience
-
-
-.Nap:
-	call BattleRandom
-	add a
-	swap a
-	and SLP
-	jr z, .Nap
-
-	ld [BattleMonStatus], a
-
-	ld hl, BeganToNapText
-	jr .Print
-
-
-.DoNothing:
-	call BattleRandom
-	and 3
-
-	ld hl, LoafingAroundText
-	and a
-	jr z, .Print
-
-	ld hl, WontObeyText
-	dec a
-	jr z, .Print
-
-	ld hl, TurnedAwayText
-	dec a
-	jr z, .Print
-
-	ld hl, IgnoredOrdersText
-
-.Print:
-	call StdBattleTextBox
-	jp .EndDisobedience
-
-
-.UseInstead:
-
-; Can't use another move if the monster only has one!
-	ld a, [BattleMonMoves + 1]
-	and a
-	jr z, .DoNothing
-
-; Don't bother trying to handle Disable.
-	ld a, [DisabledMove]
-	and a
-	jr nz, .DoNothing
-
-
-	ld hl, BattleMonPP
-	ld de, BattleMonMoves
-	ld b, 0
-	ld c, NUM_MOVES
-
-.GetTotalPP:
-	ld a, [hli]
-	and $3f ; exclude pp up
-	add b
-	ld b, a
-
-	dec c
-	jr z, .CheckMovePP
-
-; Stop at undefined moves.
-	inc de
-	ld a, [de]
-	and a
-	jr nz, .GetTotalPP
-
-
-.CheckMovePP:
-	ld hl, BattleMonPP
-	ld a, [CurMoveNum]
-	ld e, a
-	ld d, 0
-	add hl, de
-
-; Can't use another move if only one move has PP.
-	ld a, [hl]
-	and $3f
-	cp b
-	jr z, .DoNothing
-
-
-; Make sure we can actually use the move once we get there.
-	ld a, 1
-	ld [AlreadyDisobeyed], a
-
-	ld a, [w2DMenuNumRows]
-	ld b, a
-
-; Save the move we originally picked for afterward.
-	ld a, [CurMoveNum]
-	ld c, a
-	push af
-
-
-.RandomMove:
-	call BattleRandom
-	and 3 ; TODO NUM_MOVES
-
-	cp b
-	jr nc, .RandomMove
-
-; Not the move we were trying to use.
-	cp c
-	jr z, .RandomMove
-
-; Make sure it has PP.
-	ld [CurMoveNum], a
-	ld hl, BattleMonPP
-	ld e, a
-	ld d, 0
-	add hl, de
-	ld a, [hl]
-	and $3f
-	jr z, .RandomMove
-
-
-; Use it.
-	ld a, [CurMoveNum]
-	ld c, a
-	ld b, 0
-	ld hl, BattleMonMoves
-	add hl, bc
-	ld a, [hl]
-	ld [CurPlayerMove], a
-
-	call SetPlayerTurn
-	call UpdateMoveData
-	call DoMove
-
-
-; Restore original move choice.
-	pop af
-	ld [CurMoveNum], a
-
-
-.EndDisobedience:
-	xor a
-	ld [LastPlayerMove], a
-	ld [LastPlayerCounterMove], a
-
-	; Break Encore too.
-	ld hl, PlayerSubStatus5
-	res SUBSTATUS_ENCORED, [hl]
-	xor a
-	ld [PlayerEncoreCount], a
-
-	jp EndMoveEffect
-
-; 3451f
-
-
-IgnoreSleepOnly: ; 3451f
-
-	ld a, BATTLE_VARS_MOVE_ANIM
-	call GetBattleVar
-
-	cp SNORE
-	jr z, .CheckSleep
-	cp SLEEP_TALK
-	jr z, .CheckSleep
-	and a
-	ret
-
-.CheckSleep:
-	ld a, BATTLE_VARS_STATUS
-	call GetBattleVar
-	and SLP
-	ret z
-
-; 'ignored orders…sleeping!'
-	ld hl, IgnoredSleepingText
-	call StdBattleTextBox
-
-	call EndMoveEffect
-
-	scf
-	ret
-
-; 34541
-
-
-BattleCommand_UsedMoveText: ; 34541
-; usedmovetext
-	farcall DisplayUsedMoveText
-	ret
-
-; 34548
-
-
-CheckUserIsCharging: ; 34548
-
-	ld a, [hBattleTurn]
-	and a
-	ld a, [wPlayerCharging] ; player
-	jr z, .end
-	ld a, [wEnemyCharging] ; enemy
-.end
-	and a
-	ret
-
-; 34555
-
-
-BattleCommand_DoTurn: ; 34555
-	call CheckUserIsCharging
-	ret nz
-
-	ld hl, BattleMonPP
-	ld de, PlayerSubStatus3
-	ld bc, PlayerTurnsTaken
-
-	ld a, [hBattleTurn]
-	and a
-	jr z, .proceed
-
-	ld hl, EnemyMonPP
-	ld de, EnemySubStatus3
-	ld bc, EnemyTurnsTaken
-
-.proceed
-
-; If we've gotten this far, this counts as a turn.
-	ld a, [bc]
-	inc a
-	ld [bc], a
-
-	ld a, BATTLE_VARS_MOVE
-	call GetBattleVar
-	cp STRUGGLE
-	ret z
-
-	ld a, [de]
-	and 1 << SUBSTATUS_IN_LOOP | 1 << SUBSTATUS_RAMPAGE | 1 << SUBSTATUS_BIDE
-	ret nz
-
-	call .consume_pp
-	ld a, b
-	and a
-	jp nz, EndMoveEffect
-
-	; SubStatus5
-	inc de
-	inc de
-
-	ld a, [de]
-	bit SUBSTATUS_TRANSFORMED, a
-	ret nz
-
-	ld a, [hBattleTurn]
-	and a
-
-	ld hl, PartyMon1PP
-	ld a, [CurBattleMon]
-	jr z, .player
-
-; mimic this part entirely if wildbattle
-	ld a, [wBattleMode]
-	dec a
-	jr z, .wild
-
-	ld hl, OTPartyMon1PP
-	ld a, [CurOTMon]
-
-.player
-	call GetPartyLocation
-	push hl
-	call CheckMimicUsed
-	pop hl
-	ret c
-
-.consume_pp
-	ld a, [hBattleTurn]
-	and a
-	ld a, [CurMoveNum]
-	jr z, .okay
-	ld a, [CurEnemyMoveNum]
-
-.okay
-	ld c, a
-	ld b, 0
-	add hl, bc
-	ld a, [hl]
-	and $3f
-	jr z, .out_of_pp
-	dec [hl]
-	ld b, 0
-	ret
-
-.wild
-	ld hl, EnemyMonMoves
-	ld a, [CurEnemyMoveNum]
-	ld c, a
-	ld b, 0
-	add hl, bc
-	ld a, [hl]
-	cp MIMIC
-	jr z, .mimic
-	ld hl, wWildMonMoves
-	add hl, bc
-	ld a, [hl]
-	cp MIMIC
-	ret z
-
-.mimic
-	ld hl, wWildMonPP
-	call .consume_pp
-	ret
-
-.out_of_pp
-	call BattleCommand_MoveDelay
-; get move effect
-	ld a, BATTLE_VARS_MOVE_EFFECT
-	call GetBattleVar
-; continuous?
-	ld hl, .continuousmoves
-	ld de, 1
-	call IsInArray
-
-; 'has no pp left for [move]'
-	ld hl, HasNoPPLeftText
-	jr c, .print
-; 'but no pp is left for the move'
-	ld hl, NoPPLeftText
-.print
-	call StdBattleTextBox
-	ld b, 1
-	ret
-
-; 34602
-
-.continuousmoves ; 34602
-	db EFFECT_RAZOR_WIND
-	db EFFECT_SKY_ATTACK
-	db EFFECT_SKULL_BASH
-	db EFFECT_SOLARBEAM
-	db EFFECT_FLY
-	db EFFECT_ROLLOUT
-	db EFFECT_BIDE
-	db EFFECT_RAMPAGE
-	db $ff
-; 3460b
-
-CheckMimicUsed: ; 3460b
-	ld a, [hBattleTurn]
-	and a
-	ld a, [CurMoveNum]
-	jr z, .player
-	ld a, [CurEnemyMoveNum]
-
-.player
-	ld c, a
-	ld a, MON_MOVES
-	call UserPartyAttr
-
-	ld a, BATTLE_VARS_MOVE
-	call GetBattleVar
-	cp MIMIC
-	jr z, .mimic
-;
-	ld b, 0
-	add hl, bc
-	ld a, [hl]
-	cp MIMIC
-	jr nz, .mimic
-
-	scf
-	ret
-
-.mimic
-	and a
-	ret
-
-; 34631
-
-
-BattleCommand_Critical: ; 34631
-; critical
-
-; Determine whether this attack's hit will be critical.
-
-	xor a
-	ld [CriticalHit], a
-
-	ld a, BATTLE_VARS_MOVE_POWER
-	call GetBattleVar
-	and a
-	ret z
-
-	ld a, [hBattleTurn]
-	and a
-	ld hl, EnemyMonItem
-	ld a, [EnemyMonSpecies]
-	jr nz, .Item
-	ld hl, BattleMonItem
-	ld a, [BattleMonSpecies]
-
-.Item:
-	ld c, 0
-
-	cp CHANSEY
-	jr nz, .Farfetchd
-	ld a, [hl]
-	cp LUCKY_PUNCH
-	jr nz, .FocusEnergy
-
-; +2 critical level
-	ld c, 2
-	jr .Tally
-
-.Farfetchd:
-	cp FARFETCH_D
-	jr nz, .FocusEnergy
-	ld a, [hl]
-	cp STICK
-	jr nz, .FocusEnergy
-
-; +2 critical level
-	ld c, 2
-	jr .Tally
-
-.FocusEnergy:
-	ld a, BATTLE_VARS_SUBSTATUS4
-	call GetBattleVar
-	bit SUBSTATUS_FOCUS_ENERGY, a
-	jr z, .CheckCritical
-
-; +1 critical level
-	inc c
-
-.CheckCritical:
-	ld a, BATTLE_VARS_MOVE_ANIM
-	call GetBattleVar
-	ld de, 1
-	ld hl, .Criticals
-	push bc
-	call IsInArray
-	pop bc
-	jr nc, .ScopeLens
-
-; +2 critical level
-	inc c
-	inc c
-
-.ScopeLens:
-	push bc
-	call GetUserItem
-	ld a, b
-	cp HELD_CRITICAL_UP ; Increased critical chance. Only Scope Lens has this.
-	pop bc
-	jr nz, .Tally
-
-; +1 critical level
-	inc c
-
-.Tally:
-	ld hl, .Chances
-	ld b, 0
-	add hl, bc
-	call BattleRandom
-	cp [hl]
-	ret nc
-	ld a, 1
-	ld [CriticalHit], a
-	ret
-
-.Criticals:
-	db KARATE_CHOP, RAZOR_WIND, RAZOR_LEAF, CRABHAMMER, SLASH, AEROBLAST, CROSS_CHOP, $ff
-.Chances:
-	; 6.25% 12.1% 24.6% 33.2% 49.6% 49.6% 49.6%
-	db $11,  $20,  $40,  $55,  $80,  $80,  $80
-	;   0     1     2     3     4     5     6
-; 346b2
-
-
-BattleCommand_TripleKick: ; 346b2
-; triplekick
-
-	ld a, [wKickCounter]
-	ld b, a
-	inc b
-	ld hl, CurDamage + 1
-	ld a, [hld]
-	ld e, a
-	ld a, [hli]
-	ld d, a
-.next_kick
-	dec b
-	ret z
-	ld a, [hl]
-	add e
-	ld [hld], a
-	ld a, [hl]
-	adc d
-	ld [hli], a
-
-; No overflow.
-	jr nc, .next_kick
-	ld a, $ff
-	ld [hld], a
-	ld [hl], a
-	ret
-
-; 346cd
-
-
-BattleCommand_KickCounter: ; 346cd
-; kickcounter
-
-	ld hl, wKickCounter
-	inc [hl]
-	ret
-
-; 346d2
-
-
-BattleCommand_Stab: ; 346d2
-; STAB = Same Type Attack Bonus
-	ld a, BATTLE_VARS_MOVE_ANIM
-	call GetBattleVar
-	cp STRUGGLE
-	ret z
-
-	ld hl, BattleMonType1
-	ld a, [hli]
-	ld b, a
-	ld c, [hl]
-	ld hl, EnemyMonType1
-	ld a, [hli]
-	ld d, a
-	ld e, [hl]
-
-	ld a, [hBattleTurn]
-	and a
-	jr z, .go ; Who Attacks and who Defends
-
-	ld hl, EnemyMonType1
-	ld a, [hli]
-	ld b, a
-	ld c, [hl]
-	ld hl, BattleMonType1
-	ld a, [hli]
-	ld d, a
-	ld e, [hl]
-
-.go
-	ld a, BATTLE_VARS_MOVE_TYPE
-	call GetBattleVarAddr
-	ld [wTypeMatchup], a
-
-	push hl
-	push de
-	push bc
-	farcall DoWeatherModifiers
-	pop bc
-	pop de
-	pop hl
-
-	push de
-	push bc
-	farcall DoBadgeTypeBoosts
-	pop bc
-	pop de
-
-	ld a, [wTypeMatchup]
-	cp b
-	jr z, .stab
-	cp c
-	jr z, .stab
-
-	jr .SkipStab
-
-.stab
-	ld hl, CurDamage + 1
-	ld a, [hld]
-	ld h, [hl]
-	ld l, a
-
-	ld b, h
-	ld c, l
-	srl b
-	rr c
-	add hl, bc
-
-	ld a, h
-	ld [CurDamage], a
-	ld a, l
-	ld [CurDamage + 1], a
-
-	ld hl, TypeModifier
-	set 7, [hl]
-
-.SkipStab:
-	ld a, BATTLE_VARS_MOVE_TYPE
-	call GetBattleVar
-	ld b, a
-	ld hl, TypeMatchup
-
-.TypesLoop:
-	ld a, [hli]
-
-	cp $ff
-	jr z, .end
-
-	; foresight
-	cp $fe
-	jr nz, .SkipForesightCheck
-	ld a, BATTLE_VARS_SUBSTATUS1_OPP
-	call GetBattleVar
-	bit SUBSTATUS_IDENTIFIED, a
-	jr nz, .end
-
-	jr .TypesLoop
-
-.SkipForesightCheck:
-	cp b
-	jr nz, .SkipType
-	ld a, [hl]
-	cp d
-	jr z, .GotMatchup
-	cp e
-	jr z, .GotMatchup
-	jr .SkipType
-
-.GotMatchup:
-	push hl
-	push bc
-	inc hl
-	ld a, [TypeModifier]
-	and %10000000
-	ld b, a
-; If the target is immune to the move, treat it as a miss and calculate the damage as 0
-	ld a, [hl]
-	and a
-	jr nz, .NotImmune
-	inc a
-	ld [AttackMissed], a
-	xor a
-.NotImmune:
-	ld [hMultiplier], a
-	add b
-	ld [TypeModifier], a
-
-	xor a
-	ld [hMultiplicand + 0], a
-
-	ld hl, CurDamage
-	ld a, [hli]
-	ld [hMultiplicand + 1], a
-	ld a, [hld]
-	ld [hMultiplicand + 2], a
-
-	call Multiply
-
-	ld a, [hProduct + 1]
-	ld b, a
-	ld a, [hProduct + 2]
-	or b
-	ld b, a
-	ld a, [hProduct + 3]
-	or b
-	jr z, .ok ; This is a very convoluted way to get back that we've essentially dealt no damage.
-
-; Take the product and divide it by 10.
-	ld a, 10
-	ld [hDivisor], a
-	ld b, 4
-	call Divide
-	ld a, [hQuotient + 1]
-	ld b, a
-	ld a, [hQuotient + 2]
-	or b
-	jr nz, .ok
-
-	ld a, 1
-	ld [hMultiplicand + 2], a
-
-.ok
-	ld a, [hMultiplicand + 1]
-	ld [hli], a
-	ld a, [hMultiplicand + 2]
-	ld [hl], a
-	pop bc
-	pop hl
-
-.SkipType:
-	inc hl
-	inc hl
-	jr .TypesLoop
-
-.end
-	call BattleCheckTypeMatchup
-	ld a, [wTypeMatchup]
-	ld b, a
-	ld a, [TypeModifier]
-	and %10000000
-	or b
-	ld [TypeModifier], a
-	ret
-
-; 347c8
-
-
-BattleCheckTypeMatchup: ; 347c8
-	ld hl, EnemyMonType1
-	ld a, [hBattleTurn]
-	and a
-	jr z, CheckTypeMatchup
-	ld hl, BattleMonType1
-CheckTypeMatchup: ; 347d3
-; There is an incorrect assumption about this function made in the AI related code: when
-; the AI calls CheckTypeMatchup (not BattleCheckTypeMatchup), it assumes that placing the
-; offensive type in a will make this function do the right thing. Since a is overwritten,
-; this assumption is incorrect. A simple fix would be to load the move type for the
-; current move into a in BattleCheckTypeMatchup, before falling through, which is
-; consistent with how the rest of the code assumes this code works like.
-	push hl
-	push de
-	push bc
-	ld a, BATTLE_VARS_MOVE_TYPE
-	call GetBattleVar
-	ld d, a
-	ld b, [hl]
-	inc hl
-	ld c, [hl]
-	ld a, 10 ; 1.0
-	ld [wTypeMatchup], a
-	ld hl, TypeMatchup
-.TypesLoop:
-	ld a, [hli]
-	cp $ff
-	jr z, .End
-	cp $fe
-	jr nz, .Next
-	ld a, BATTLE_VARS_SUBSTATUS1_OPP
-	call GetBattleVar
-	bit SUBSTATUS_IDENTIFIED, a
-	jr nz, .End
-	jr .TypesLoop
-
-.Next:
-	cp d
-	jr nz, .Nope
-	ld a, [hli]
-	cp b
-	jr z, .Yup
-	cp c
-	jr z, .Yup
-	jr .Nope2
-
-.Nope:
-	inc hl
-.Nope2:
-	inc hl
-	jr .TypesLoop
-
-.Yup:
-	xor a
-	ld [hDividend + 0], a
-	ld [hMultiplicand + 0], a
-	ld [hMultiplicand + 1], a
-	ld a, [hli]
-	ld [hMultiplicand + 2], a
-	ld a, [wTypeMatchup]
-	ld [hMultiplier], a
-	call Multiply
-	ld a, 10
-	ld [hDivisor], a
-	push bc
-	ld b, 4
-	call Divide
-	pop bc
-	ld a, [hQuotient + 2]
-	ld [wTypeMatchup], a
-	jr .TypesLoop
-
-.End:
-	pop bc
-	pop de
-	pop hl
-	ret
-
-; 34833
-
-
-BattleCommand_ResetTypeMatchup: ; 34833
-; Reset the type matchup multiplier to 1.0, if the type matchup is not 0.
-; If there is immunity in play, the move automatically misses.
-	call BattleCheckTypeMatchup
-	ld a, [wTypeMatchup]
-	and a
-	ld a, 10 ; 1.0
-	jr nz, .reset
-	call ResetDamage
-	xor a
-	ld [TypeModifier], a
-	inc a
-	ld [AttackMissed], a
-	ret
-
-.reset
-	ld [wTypeMatchup], a
-	ret
-
-; 3484e
-
-INCLUDE "battle/ai/switch.asm"
-
-TypeMatchup: ; 34bb1
-INCLUDE "battle/type_matchup.asm"
-; 34cfd
-
-
-BattleCommand_DamageVariation: ; 34cfd
-; damagevariation
-
-; Modify the damage spread between 85% and 100%.
-
-; Because of the method of division the probability distribution
-; is not consistent. This makes the highest damage multipliers
-; rarer than normal.
-
-
-; No point in reducing 1 or 0 damage.
-	ld hl, CurDamage
-	ld a, [hli]
-	and a
-	jr nz, .go
-	ld a, [hl]
-	cp 2
-	ret c
-
-.go
-; Start with the maximum damage.
-	xor a
-	ld [hMultiplicand + 0], a
-	dec hl
-	ld a, [hli]
-	ld [hMultiplicand + 1], a
-	ld a, [hl]
-	ld [hMultiplicand + 2], a
-
-; Multiply by 85-100%...
-.loop
-	call BattleRandom
-	rrca
-	cp $d9 ; 85%
-	jr c, .loop
-
-	ld [hMultiplier], a
-	call Multiply
-
-; ...divide by 100%...
-	ld a, $ff ; 100%
-	ld [hDivisor], a
-	ld b, $4
-	call Divide
-
-; ...to get .85-1.00x damage.
-	ld a, [hQuotient + 1]
-	ld hl, CurDamage
-	ld [hli], a
-	ld a, [hQuotient + 2]
-	ld [hl], a
-	ret
-
-; 34d32
-
-
-BattleCommand_CheckHit: ; 34d32
-; checkhit
-
-	call .DreamEater
-	jp z, .Miss
-
-	call .Protect
-	jp nz, .Miss
-
-	call .DrainSub
-	jp z, .Miss
-
-	call .LockOn
-	ret nz
-
-	call .FlyDigMoves
-	jp nz, .Miss
-
-	call .ThunderRain
-	ret z
-
-	call .XAccuracy
-	ret nz
-
-	; Perfect-accuracy moves
-	ld a, BATTLE_VARS_MOVE_EFFECT
-	call GetBattleVar
-	cp EFFECT_ALWAYS_HIT
-	ret z
-
-	call .StatModifiers
-
-	ld a, [wPlayerMoveStruct + MOVE_ACC]
-	ld b, a
-	ld a, [hBattleTurn]
-	and a
-	jr z, .BrightPowder
-	ld a, [wEnemyMoveStruct + MOVE_ACC]
-	ld b, a
-
-.BrightPowder:
-	push bc
-	call GetOpponentItem
-	ld a, b
-	cp HELD_BRIGHTPOWDER
-	ld a, c ; % miss
-	pop bc
-	jr nz, .skip_brightpowder
-
-	ld c, a
-	ld a, b
-	sub c
-	ld b, a
-	jr nc, .skip_brightpowder
-	ld b, 0
-
-.skip_brightpowder
-	ld a, b
-	cp $ff
-	jr z, .Hit
-
-	call BattleRandom
-	cp b
-	jr nc, .Miss
-
-.Hit:
-	ret
-
-
-.Miss:
-; Keep the damage value intact if we're using (Hi) Jump Kick.
-	ld a, BATTLE_VARS_MOVE_EFFECT
-	call GetBattleVar
-	cp EFFECT_JUMP_KICK
-	jr z, .Missed
-	call ResetDamage
-
-.Missed:
-	ld a, 1
-	ld [AttackMissed], a
-	ret
-
-
-.DreamEater:
-; Return z if we're trying to eat the dream of
-; a monster that isn't sleeping.
-	ld a, BATTLE_VARS_MOVE_EFFECT
-	call GetBattleVar
-	cp EFFECT_DREAM_EATER
-	ret nz
-
-	ld a, BATTLE_VARS_STATUS_OPP
-	call GetBattleVar
-	and SLP
-	ret
-
-
-.Protect:
-; Return nz if the opponent is protected.
-	ld a, BATTLE_VARS_SUBSTATUS1_OPP
-	call GetBattleVar
-	bit SUBSTATUS_PROTECT, a
-	ret z
-
-	ld c, 40
-	call DelayFrames
-
-; 'protecting itself!'
-	ld hl, ProtectingItselfText
-	call StdBattleTextBox
-
-	ld c, 40
-	call DelayFrames
-
-	ld a, 1
-	and a
-	ret
-
-
-.LockOn:
-; Return nz if we are locked-on and aren't trying to use Earthquake,
-; Fissure or Magnitude on a monster that is flying.
-	ld a, BATTLE_VARS_SUBSTATUS5_OPP
-	call GetBattleVarAddr
-	bit SUBSTATUS_LOCK_ON, [hl]
-	res SUBSTATUS_LOCK_ON, [hl]
-	ret z
-
-	ld a, BATTLE_VARS_SUBSTATUS3_OPP
-	call GetBattleVar
-	bit SUBSTATUS_FLYING, a
-	jr z, .LockedOn
-
-	ld a, BATTLE_VARS_MOVE_ANIM
-	call GetBattleVar
-
-	cp EARTHQUAKE
-	ret z
-	cp FISSURE
-	ret z
-	cp MAGNITUDE
-	ret z
-
-.LockedOn:
-	ld a, 1
-	and a
-	ret
-
-
-.DrainSub:
-; Return z if using an HP drain move on a substitute.
-	call CheckSubstituteOpp
-	jr z, .not_draining_sub
-
-	ld a, BATTLE_VARS_MOVE_EFFECT
-	call GetBattleVar
-
-	cp EFFECT_LEECH_HIT
-	ret z
-	cp EFFECT_DREAM_EATER
-	ret z
-
-.not_draining_sub
-	ld a, 1
-	and a
-	ret
-
-
-.FlyDigMoves:
-; Check for moves that can hit underground/flying opponents.
-; Return z if the current move can hit the opponent.
-
-	ld a, BATTLE_VARS_SUBSTATUS3_OPP
-	call GetBattleVar
-	and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
-	ret z
-
-	bit SUBSTATUS_FLYING, a
-	jr z, .DigMoves
-
-	ld a, BATTLE_VARS_MOVE_ANIM
-	call GetBattleVar
-
-	cp GUST
-	ret z
-	cp WHIRLWIND
-	ret z
-	cp THUNDER
-	ret z
-	cp TWISTER
-	ret
-
-.DigMoves:
-	ld a, BATTLE_VARS_MOVE_ANIM
-	call GetBattleVar
-
-	cp EARTHQUAKE
-	ret z
-	cp FISSURE
-	ret z
-	cp MAGNITUDE
-	ret
-
-
-.ThunderRain:
-; Return z if the current move always hits in rain, and it is raining.
-	ld a, BATTLE_VARS_MOVE_EFFECT
-	call GetBattleVar
-	cp EFFECT_THUNDER
-	ret nz
-
-	ld a, [Weather]
-	cp WEATHER_RAIN
-	ret
-
-
-.XAccuracy:
-	ld a, BATTLE_VARS_SUBSTATUS4
-	call GetBattleVar
-	bit SUBSTATUS_X_ACCURACY, a
-	ret
-
-
-.StatModifiers:
-
-	ld a, [hBattleTurn]
-	and a
-
-	; load the user's accuracy into b and the opponent's evasion into c.
-	ld hl, wPlayerMoveStruct + MOVE_ACC
-	ld a, [PlayerAccLevel]
-	ld b, a
-	ld a, [EnemyEvaLevel]
-	ld c, a
-
-	jr z, .got_acc_eva
-
-	ld hl, wEnemyMoveStruct + MOVE_ACC
-	ld a, [EnemyAccLevel]
-	ld b, a
-	ld a, [PlayerEvaLevel]
-	ld c, a
-
-.got_acc_eva
-	cp b
-	jr c, .skip_foresight_check
-
-	; if the target's evasion is greater than the user's accuracy,
-	; check the target's foresight status
-	ld a, BATTLE_VARS_SUBSTATUS1_OPP
-	call GetBattleVar
-	bit SUBSTATUS_IDENTIFIED, a
-	ret nz
-
-.skip_foresight_check
-	; subtract evasion from 14
-	ld a, 14
-	sub c
-	ld c, a
-	; store the base move accuracy for math ops
-	xor a
-	ld [hMultiplicand + 0], a
-	ld [hMultiplicand + 1], a
-	ld a, [hl]
-	ld [hMultiplicand + 2], a
-	push hl
-	ld d, 2 ; do this twice, once for the user's accuracy and once for the target's evasion
-
-.accuracy_loop
-	; look up the multiplier from the table
-	push bc
-	ld hl, .AccProb
-	dec b
-	sla b
-	ld c, b
-	ld b, 0
-	add hl, bc
-	pop bc
-	; multiply by the first byte in that row...
-	ld a, [hli]
-	ld [hMultiplier], a
-	call Multiply
-	; ... and divide by the second byte
-	ld a, [hl]
-	ld [hDivisor], a
-	ld b, 4
-	call Divide
-	; minimum accuracy is $0001
-	ld a, [hQuotient + 2]
-	ld b, a
-	ld a, [hQuotient + 1]
-	or b
-	jr nz, .min_accuracy
-	ld [hQuotient + 1], a
-	ld a, 1
-	ld [hQuotient + 2], a
-
-.min_accuracy
-	; do the same thing to the target's evasion
-	ld b, c
-	dec d
-	jr nz, .accuracy_loop
-
-	; if the result is more than 2 bytes, max out at 100%
-	ld a, [hQuotient + 1]
-	and a
-	ld a, [hQuotient + 2]
-	jr z, .finish_accuracy
-	ld a, $ff
-
-.finish_accuracy
-	pop hl
-	ld [hl], a
-	ret
-
-.AccProb:
-	db  33, 100 ;  33% -6
-	db  36, 100 ;  36% -5
-	db  43, 100 ;  43% -4
-	db  50, 100 ;  50% -3
-	db  60, 100 ;  60% -2
-	db  75, 100 ;  75% -1
-	db   1,   1 ; 100%  0
-	db 133, 100 ; 133% +1
-	db 166, 100 ; 166% +2
-	db   2,   1 ; 200% +3
-	db 233, 100 ; 233% +4
-	db 133,  50 ; 266% +5
-	db   3,   1 ; 300% +6
-
-; 34ecc
-
-
-BattleCommand_EffectChance: ; 34ecc
-; effectchance
-
-	xor a
-	ld [EffectFailed], a
-	call CheckSubstituteOpp
-	jr nz, .failed
-
-	push hl
-	ld hl, wPlayerMoveStruct + MOVE_CHANCE
-	ld a, [hBattleTurn]
-	and a
-	jr z, .got_move_chance
-	ld hl, wEnemyMoveStruct + MOVE_CHANCE
-.got_move_chance
-
-	call BattleRandom
-	cp [hl]
-	pop hl
-	ret c
-
-.failed
-	ld a, 1
-	ld [EffectFailed], a
-	and a
-	ret
-
-; 34eee
-
-
-BattleCommand_LowerSub: ; 34eee
-; lowersub
-
-	ld a, BATTLE_VARS_SUBSTATUS4
-	call GetBattleVar
-	bit SUBSTATUS_SUBSTITUTE, a
-	ret z
-
-	ld a, BATTLE_VARS_SUBSTATUS3
-	call GetBattleVar
-	bit SUBSTATUS_CHARGED, a
-	jr nz, .already_charged
-
-	ld a, BATTLE_VARS_MOVE_EFFECT
-	call GetBattleVar
-	cp EFFECT_RAZOR_WIND
-	jr z, .charge_turn
-	cp EFFECT_SKY_ATTACK
-	jr z, .charge_turn
-	cp EFFECT_SKULL_BASH
-	jr z, .charge_turn
-	cp EFFECT_SOLARBEAM
-	jr z, .charge_turn
-	cp EFFECT_FLY
-	jr z, .charge_turn
-
-.already_charged
-	call .Rampage
-	jr z, .charge_turn
-
-	call CheckUserIsCharging
-	ret nz
-
-.charge_turn
-	call _CheckBattleScene
-	jr c, .mimic_anims
-
-	xor a
-	ld [wNumHits], a
-	ld [FXAnimID + 1], a
-	inc a
-	ld [wKickCounter], a
-	ld a, SUBSTITUTE
-	jp LoadAnim
-
-.mimic_anims
-	call BattleCommand_LowerSubNoAnim
-	jp BattleCommand_MoveDelay
-
-.Rampage:
-	ld a, BATTLE_VARS_MOVE_EFFECT
-	call GetBattleVar
-	cp EFFECT_ROLLOUT
-	jr z, .rollout_rampage
-	cp EFFECT_RAMPAGE
-	jr z, .rollout_rampage
-
-	ld a, 1
-	and a
-	ret
-
-.rollout_rampage
-	ld a, [wSomeoneIsRampaging]
-	and a
-	ld a, 0
-	ld [wSomeoneIsRampaging], a
-	ret
-
-; 34f57
-
-
-BattleCommand_HitTarget: ; 34f57
-; hittarget
-	call BattleCommand_LowerSub
-	call BattleCommand_HitTargetNoSub
-	jp BattleCommand_RaiseSub
-
-; 34f60
-
-
-BattleCommand_HitTargetNoSub: ; 34f60
-	ld a, [AttackMissed]
-	and a
-	jp nz, BattleCommand_MoveDelay
-
-	ld a, [hBattleTurn]
-	and a
-	ld de, PlayerRolloutCount
-	ld a, BATTLEANIM_ENEMY_DAMAGE
-	jr z, .got_rollout_count
-	ld de, EnemyRolloutCount
-	ld a, BATTLEANIM_PLAYER_DAMAGE
-
-.got_rollout_count
-	ld [wNumHits], a
-	ld a, BATTLE_VARS_MOVE_EFFECT
-	call GetBattleVar
-	cp EFFECT_MULTI_HIT
-	jr z, .multihit
-	cp EFFECT_CONVERSION
-	jr z, .conversion
-	cp EFFECT_DOUBLE_HIT
-	jr z, .doublehit
-	cp EFFECT_POISON_MULTI_HIT
-	jr z, .twineedle
-	cp EFFECT_TRIPLE_KICK
-	jr z, .triplekick
-	xor a
-	ld [wKickCounter], a
-
-.triplekick
-
-	ld a, BATTLE_VARS_MOVE_ANIM
-	call GetBattleVar
-	ld e, a
-	ld d, 0
-	call PlayFXAnimID
-
-	ld a, BATTLE_VARS_MOVE_ANIM
-	call GetBattleVar
-	cp FLY
-	jr z, .fly_dig
-	cp DIG
-	ret nz
-
-.fly_dig
-; clear sprite
-	jp AppearUserLowerSub
-
-.multihit
-.conversion
-.doublehit
-.twineedle
-	ld a, [wKickCounter]
-	and 1
-	xor 1
-	ld [wKickCounter], a
-	ld a, [de]
-	cp $1
-	push af
-	ld a, BATTLE_VARS_MOVE_ANIM
-	call GetBattleVar
-	ld e, a
-	ld d, 0
-	pop af
-	jp z, PlayFXAnimID
-	xor a
-	ld [wNumHits], a
-	jp PlayFXAnimID
-
-; 34fd1
-
-
-BattleCommand_StatUpAnim: ; 34fd1
-	ld a, [AttackMissed]
-	and a
-	jp nz, BattleCommand_MoveDelay
-
-	xor a
-	jr BattleCommand_StatUpDownAnim
-
-; 34fdb
-
-
-BattleCommand_StatDownAnim: ; 34fdb
-	ld a, [AttackMissed]
-	and a
-	jp nz, BattleCommand_MoveDelay
-
-	ld a, [hBattleTurn]
-	and a
-	ld a, BATTLEANIM_ENEMY_STAT_DOWN
-	jr z, BattleCommand_StatUpDownAnim
-	ld a, BATTLEANIM_WOBBLE
-
-	; fallthrough
-; 34feb
-
-
-BattleCommand_StatUpDownAnim: ; 34feb
-	ld [wNumHits], a
-	xor a
-	ld [wKickCounter], a
-	ld a, BATTLE_VARS_MOVE_ANIM
-	call GetBattleVar
-	ld e, a
-	ld d, 0
-	jp PlayFXAnimID
-
-; 34ffd
-
-
-BattleCommand_SwitchTurn: ; 34ffd
-; switchturn
-
-	ld a, [hBattleTurn]
-	xor 1
-	ld [hBattleTurn], a
-	ret
-
-; 35004
-
-
-BattleCommand_RaiseSub: ; 35004
-; raisesub
-
-	ld a, BATTLE_VARS_SUBSTATUS4
-	call GetBattleVar
-	bit SUBSTATUS_SUBSTITUTE, a
-	ret z
-
-	call _CheckBattleScene
-	jp c, BattleCommand_RaiseSubNoAnim
-
-	xor a
-	ld [wNumHits], a
-	ld [FXAnimID + 1], a
-	ld a, $2
-	ld [wKickCounter], a
-	ld a, SUBSTITUTE
-	jp LoadAnim
-
-; 35023
-
-
-BattleCommand_FailureText: ; 35023
-; failuretext
-; If the move missed or failed, load the appropriate
-; text, and end the effects of multi-turn or multi-
-; hit moves.
-	ld a, [AttackMissed]
-	and a
-	ret z
-
-	call GetFailureResultText
-	ld a, BATTLE_VARS_MOVE_ANIM
-	call GetBattleVarAddr
-
-	cp FLY
-	jr z, .fly_dig
-	cp DIG
-	jr z, .fly_dig
-
-; Move effect:
-	inc hl
-	ld a, [hl]
-
-	cp EFFECT_MULTI_HIT
-	jr z, .multihit
-	cp EFFECT_DOUBLE_HIT
-	jr z, .multihit
-	cp EFFECT_POISON_MULTI_HIT
-	jr z, .multihit
-	jp EndMoveEffect
-
-.multihit
-	call BattleCommand_RaiseSub
-	jp EndMoveEffect
-
-.fly_dig
-	ld a, BATTLE_VARS_SUBSTATUS3
-	call GetBattleVarAddr
-	res SUBSTATUS_UNDERGROUND, [hl]
-	res SUBSTATUS_FLYING, [hl]
-	call AppearUserRaiseSub
-	jp EndMoveEffect
-
-; 3505e
-
-
-BattleCommand_CheckFaint: ; 3505e
-; checkfaint
-
-	ld a, BATTLE_VARS_SUBSTATUS1_OPP
-	call GetBattleVar
-	bit SUBSTATUS_ENDURE, a
-	jr z, .not_enduring
-	call BattleCommand_FalseSwipe
-	ld b, $0
-	jr nc, .okay
-	ld b, $1
-	jr .okay
-
-.not_enduring
-	call GetOpponentItem
-	ld a, b
-	cp HELD_FOCUS_BAND
-	ld b, $0
-	jr nz, .okay
-	call BattleRandom
-	cp c
-	jr nc, .okay
-	call BattleCommand_FalseSwipe
-	ld b, $0
-	jr nc, .okay
-	ld b, $2
-.okay
-	push bc
-	call .check_sub
-	ld c, $0
-	ld a, [hBattleTurn]
-	and a
-	jr nz, .damage_player
-	call EnemyHurtItself
-	jr .done_damage
-
-.damage_player
-	call PlayerHurtItself
-
-.done_damage
-	pop bc
-	ld a, b
-	and a
-	ret z
-	dec a
-	jr nz, .not_enduring2
-	ld hl, EnduredText
-	jp StdBattleTextBox
-
-.not_enduring2
-	call GetOpponentItem
-	ld a, [hl]
-	ld [wNamedObjectIndexBuffer], a
-	call GetItemName
-
-	ld hl, HungOnText
-	jp StdBattleTextBox
-
-.check_sub
-	ld a, BATTLE_VARS_SUBSTATUS4_OPP
-	call GetBattleVar
-	bit SUBSTATUS_SUBSTITUTE, a
-	ret nz
-
-	ld de, PlayerDamageTaken + 1
-	ld a, [hBattleTurn]
-	and a
-	jr nz, .damage_taken
-	ld de, EnemyDamageTaken + 1
-
-.damage_taken
-	ld a, [CurDamage + 1]
-	ld b, a
-	ld a, [de]
-	add b
-	ld [de], a
-	dec de
-	ld a, [CurDamage]
-	ld b, a
-	ld a, [de]
-	adc b
-	ld [de], a
-	ret nc
-	ld a, $ff
-	ld [de], a
-	inc de
-	ld [de], a
-	ret
-
-; 350e4
-
-
-GetFailureResultText: ; 350e4
-	ld hl, DoesntAffectText
-	ld de, DoesntAffectText
-	ld a, [TypeModifier]
-	and $7f
-	jr z, .got_text
-	ld a, BATTLE_VARS_MOVE_EFFECT
-	call GetBattleVar
-	cp EFFECT_FUTURE_SIGHT
-	ld hl, ButItFailedText
-	ld de, ItFailedText
-	jr z, .got_text
-	ld hl, AttackMissedText
-	ld de, AttackMissed2Text
-	ld a, [CriticalHit]
-	cp $ff
-	jr nz, .got_text
-	ld hl, UnaffectedText
-.got_text
-	call FailText_CheckOpponentProtect
-	xor a
-	ld [CriticalHit], a
-
-	ld a, BATTLE_VARS_MOVE_EFFECT
-	call GetBattleVar
-	cp EFFECT_JUMP_KICK
-	ret nz
-
-	ld a, [TypeModifier]
-	and $7f
-	ret z
-
-	ld hl, CurDamage
-	ld a, [hli]
-	ld b, [hl]
-	rept 3
-	srl a
-	rr b
-	endr
-	ld [hl], b
-	dec hl
-	ld [hli], a
-	or b
-	jr nz, .do_at_least_1_damage
-	inc a
-	ld [hl], a
-.do_at_least_1_damage
-	ld hl, CrashedText
-	call StdBattleTextBox
-	ld a, $1
-	ld [wKickCounter], a
-	call LoadMoveAnim
-	ld c, $1
-	ld a, [hBattleTurn]
-	and a
-	jp nz, EnemyHurtItself
-	jp PlayerHurtItself
-
-FailText_CheckOpponentProtect: ; 35157
-	ld a, BATTLE_VARS_SUBSTATUS1_OPP
-	call GetBattleVar
-	bit SUBSTATUS_PROTECT, a
-	jr z, .not_protected
-	ld h, d
-	ld l, e
-.not_protected
-	jp StdBattleTextBox
-
-; 35165
-
-
-BattleCommanda5: ; 35165
-	ld a, [AttackMissed]
-	and a
-	ret z
-
-	ld a, [TypeModifier]
-	and $7f
-	jp z, PrintDoesntAffect
-	jp PrintButItFailed
-
-; 35175
-
-
-BattleCommand_CriticalText: ; 35175
-; criticaltext
-; Prints the message for critical hits or one-hit KOs.
-
-; If there is no message to be printed, wait 20 frames.
-	ld a, [CriticalHit]
-	and a
-	jr z, .wait
-
-	dec a
-	add a
-	ld hl, .texts
-	ld b, 0
-	ld c, a
-	add hl, bc
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	call StdBattleTextBox
-
-	xor a
-	ld [CriticalHit], a
-
-.wait
-	ld c, 20
-	jp DelayFrames
-
-.texts
-	dw CriticalHitText
-	dw OneHitKOText
-; 35197
-
-
-BattleCommand_StartLoop: ; 35197
-; startloop
-
-	ld hl, PlayerRolloutCount
-	ld a, [hBattleTurn]
-	and a
-	jr z, .ok
-	ld hl, EnemyRolloutCount
-.ok
-	xor a
-	ld [hl], a
-	ret
-
-; 351a5
-
-
-BattleCommand_SuperEffectiveLoopText: ; 351a5
-; supereffectivelooptext
-
-	ld a, BATTLE_VARS_SUBSTATUS3
-	call GetBattleVarAddr
-	bit SUBSTATUS_IN_LOOP, a
-	ret nz
-
-	; fallthrough
-; 351ad
-
-
-BattleCommand_SuperEffectiveText: ; 351ad
-; supereffectivetext
-
-	ld a, [TypeModifier]
-	and $7f
-	cp 10 ; 1.0
-	ret z
-	ld hl, SuperEffectiveText
-	jr nc, .print
-	ld hl, NotVeryEffectiveText
-.print
-	jp StdBattleTextBox
-
-; 351c0
-
-
-BattleCommand_CheckDestinyBond: ; 351c0
-; checkdestinybond
-
-; Faint the user if it fainted an opponent using Destiny Bond.
-
-	ld hl, EnemyMonHP
-	ld a, [hBattleTurn]
-	and a
-	jr z, .got_hp
-	ld hl, BattleMonHP
-
-.got_hp
-	ld a, [hli]
-	or [hl]
-	ret nz
-
-	ld a, BATTLE_VARS_SUBSTATUS5_OPP
-	call GetBattleVar
-	bit SUBSTATUS_DESTINY_BOND, a
-	jr z, .no_dbond
-
-	ld hl, TookDownWithItText
-	call StdBattleTextBox
-
-	ld a, [hBattleTurn]
-	and a
-	ld hl, EnemyMonMaxHP + 1
-	bccoord 2, 2 ; hp bar
-	ld a, 0
-	jr nz, .got_max_hp
-	ld hl, BattleMonMaxHP + 1
-	bccoord 10, 9 ; hp bar
-	ld a, 1
-
-.got_max_hp
-	ld [wWhichHPBar], a
-	ld a, [hld]
-	ld [Buffer1], a
-	ld a, [hld]
-	ld [Buffer2], a
-	ld a, [hl]
-	ld [Buffer3], a
-	xor a
-	ld [hld], a
-	ld a, [hl]
-	ld [Buffer4], a
-	xor a
-	ld [hl], a
-	ld [Buffer5], a
-	ld [Buffer6], a
-	ld h, b
-	ld l, c
-	predef AnimateHPBar
-	call RefreshBattleHuds
-
-	call BattleCommand_SwitchTurn
-	xor a
-	ld [wNumHits], a
-	ld [FXAnimID + 1], a
-	inc a
-	ld [wKickCounter], a
-	ld a, DESTINY_BOND
-	call LoadAnim
-	call BattleCommand_SwitchTurn
-
-	jr .finish
-
-.no_dbond
-	ld a, BATTLE_VARS_MOVE_EFFECT
-	call GetBattleVar
-	cp EFFECT_MULTI_HIT
-	jr z, .multiple_hit_raise_sub
-	cp EFFECT_DOUBLE_HIT
-	jr z, .multiple_hit_raise_sub
-	cp EFFECT_POISON_MULTI_HIT
-	jr z, .multiple_hit_raise_sub
-	cp EFFECT_TRIPLE_KICK
-	jr z, .multiple_hit_raise_sub
-	cp EFFECT_BEAT_UP
-	jr nz, .finish
-
-.multiple_hit_raise_sub
-	call BattleCommand_RaiseSub
-
-.finish
-	jp EndMoveEffect
-
-; 35250
-
-
-BattleCommand_BuildOpponentRage: ; 35250
-; buildopponentrage
-
-	jp .start
-
-.start
-	ld a, [AttackMissed]
-	and a
-	ret nz
-
-	ld a, BATTLE_VARS_SUBSTATUS4_OPP
-	call GetBattleVar
-	bit SUBSTATUS_RAGE, a
-	ret z
-
-	ld de, wEnemyRageCounter
-	ld a, [hBattleTurn]
-	and a
-	jr z, .player
-	ld de, wPlayerRageCounter
-.player
-	ld a, [de]
-	inc a
-	ret z
-	ld [de], a
-
-	call BattleCommand_SwitchTurn
-	ld hl, RageBuildingText
-	call StdBattleTextBox
-	jp BattleCommand_SwitchTurn
-
-; 3527b
-
-
-BattleCommand_RageDamage: ; 3527b
-; ragedamage
-
-	ld a, [CurDamage]
-	ld h, a
-	ld b, a
-	ld a, [CurDamage + 1]
-	ld l, a
-	ld c, a
-	ld a, [hBattleTurn]
-	and a
-	ld a, [wPlayerRageCounter]
-	jr z, .rage_loop
-	ld a, [wEnemyRageCounter]
-.rage_loop
-	and a
-	jr z, .done
-	dec a
-	add hl, bc
-	jr nc, .rage_loop
-	ld hl, -1
-.done
-	ld a, h
-	ld [CurDamage], a
-	ld a, l
-	ld [CurDamage + 1], a
-	ret
-
-; 352a3
-
-
-EndMoveEffect: ; 352a3
-	ld a, [BattleScriptBufferAddress]
-	ld l, a
-	ld a, [BattleScriptBufferAddress + 1]
-	ld h, a
-	ld a, $ff
-	ld [hli], a
-	ld [hli], a
-	ld [hl], a
-	ret
-
-; 352b1
-
-
-DittoMetalPowder: ; 352b1
-	ld a, MON_SPECIES
-	call BattlePartyAttr
-	ld a, [hBattleTurn]
-	and a
-	ld a, [hl]
-	jr nz, .Ditto
-	ld a, [TempEnemyMonSpecies]
-
-.Ditto:
-	cp DITTO
-	ret nz
-
-	push bc
-	call GetOpponentItem
-	ld a, [hl]
-	cp METAL_POWDER
-	pop bc
-	ret nz
-
-	ld a, c
-	srl a
-	add c
-	ld c, a
-	ret nc
-
-	srl b
-	ld a, b
-	and a
-	jr nz, .done
-	inc b
-.done
-	scf
-	rr c
-	ret
-
-; 352dc
-
-
-BattleCommand_DamageStats: ; 352dc
-; damagestats
-
-	ld a, [hBattleTurn]
-	and a
-	jp nz, EnemyAttackDamage
-
-	; fallthrough
-; 352e2
-
-
-PlayerAttackDamage: ; 352e2
-; Return move power d, player level e, enemy defense c and player attack b.
-
-	call ResetDamage
-
-	ld hl, wPlayerMoveStructPower
-	ld a, [hli]
-	and a
-	ld d, a
-	ret z
-
-	ld a, [hl]
-	cp SPECIAL
-	jr nc, .special
-
-.physical
-	ld hl, EnemyMonDefense
-	ld a, [hli]
-	ld b, a
-	ld c, [hl]
-
-	ld a, [EnemyScreens]
-	bit SCREENS_REFLECT, a
-	jr z, .physicalcrit
-	sla c
-	rl b
-
-.physicalcrit
-	ld hl, BattleMonAttack
-	call GetDamageStatsCritical
-	jr c, .thickclub
-
-	ld hl, EnemyDefense
-	ld a, [hli]
-	ld b, a
-	ld c, [hl]
-	ld hl, PlayerAttack
-	jr .thickclub
-
-.special
-	ld hl, EnemyMonSpclDef
-	ld a, [hli]
-	ld b, a
-	ld c, [hl]
-
-	ld a, [EnemyScreens]
-	bit SCREENS_LIGHT_SCREEN, a
-	jr z, .specialcrit
-	sla c
-	rl b
-
-.specialcrit
-	ld hl, BattleMonSpclAtk
-	call GetDamageStatsCritical
-	jr c, .lightball
-
-	ld hl, EnemySpDef
-	ld a, [hli]
-	ld b, a
-	ld c, [hl]
-	ld hl, PlayerSpAtk
-
-.lightball
-; Note: Returns player special attack at hl in hl.
-	call LightBallBoost
-	jr .done
-
-.thickclub
-; Note: Returns player attack at hl in hl.
-	call ThickClubBoost
-
-.done
-	call TruncateHL_BC
-
-	ld a, [BattleMonLevel]
-	ld e, a
-	call DittoMetalPowder
-
-	ld a, 1
-	and a
-	ret
-
-; 3534d
-
-
-TruncateHL_BC: ; 3534d
-.loop
-; Truncate 16-bit values hl and bc to 8-bit values b and c respectively.
-; b = hl, c = bc
-
-	ld a, h
-	or b
-	jr z, .finish
-
-	srl b
-	rr c
-	srl b
-	rr c
-
-	ld a, c
-	or b
-	jr nz, .done_bc
-	inc c
-
-.done_bc
-	srl h
-	rr l
-	srl h
-	rr l
-
-	ld a, l
-	or h
-	jr nz, .finish
-	inc l
-
-.finish
-	ld a, [wLinkMode]
-	cp 3
-	jr z, .done
-; If we go back to the loop point,
-; it's the same as doing this exact
-; same check twice.
-	ld a, h
-	or b
-	jr nz, .loop
-
-.done
-	ld b, l
-	ret
-
-; 35378
-
-
-GetDamageStatsCritical: ; 35378
-; Return carry if non-critical.
-
-	ld a, [CriticalHit]
-	and a
-	scf
-	ret z
-
-	; fallthrough
-; 3537e
-
-
-GetDamageStats: ; 3537e
-; Return the attacker's offensive stat and the defender's defensive
-; stat based on whether the attacking type is physical or special.
-
-	push hl
-	push bc
-	ld a, [hBattleTurn]
-	and a
-	jr nz, .enemy
-	ld a, [wPlayerMoveStructType]
-	cp SPECIAL
-; special
-	ld a, [PlayerSAtkLevel]
-	ld b, a
-	ld a, [EnemySDefLevel]
-	jr nc, .end
-; physical
-	ld a, [PlayerAtkLevel]
-	ld b, a
-	ld a, [EnemyDefLevel]
-	jr .end
-
-.enemy
-	ld a, [wEnemyMoveStructType]
-	cp SPECIAL
-; special
-	ld a, [EnemySAtkLevel]
-	ld b, a
-	ld a, [PlayerSDefLevel]
-	jr nc, .end
-; physical
-	ld a, [EnemyAtkLevel]
-	ld b, a
-	ld a, [PlayerDefLevel]
-.end
-	cp b
-	pop bc
-	pop hl
-	ret
-
-; 353b5
-
-
-ThickClubBoost: ; 353b5
-; Return in hl the stat value at hl.
-
-; If the attacking monster is Cubone or Marowak and
-; it's holding a Thick Club, double it.
-	push bc
-	push de
-	ld b, CUBONE
-	ld c, MAROWAK
-	ld d, THICK_CLUB
-	call SpeciesItemBoost
-	pop de
-	pop bc
-	ret
-
-; 353c3
-
-
-LightBallBoost: ; 353c3
-; Return in hl the stat value at hl.
-
-; If the attacking monster is Pikachu and it's
-; holding a Light Ball, double it.
-	push bc
-	push de
-	ld b, PIKACHU
-	ld c, PIKACHU
-	ld d, LIGHT_BALL
-	call SpeciesItemBoost
-	pop de
-	pop bc
-	ret
-
-; 353d1
-
-
-SpeciesItemBoost: ; 353d1
-; Return in hl the stat value at hl.
-
-; If the attacking monster is species b or c and
-; it's holding item d, double it.
-
-	ld a, [hli]
-	ld l, [hl]
-	ld h, a
-
-	push hl
-	ld a, MON_SPECIES
-	call BattlePartyAttr
-
-	ld a, [hBattleTurn]
-	and a
-	ld a, [hl]
-	jr z, .CompareSpecies
-	ld a, [TempEnemyMonSpecies]
-.CompareSpecies:
-	pop hl
-
-	cp b
-	jr z, .GetItemHeldEffect
-	cp c
-	ret nz
-
-.GetItemHeldEffect:
-	push hl
-	call GetUserItem
-	ld a, [hl]
-	pop hl
-	cp d
-	ret nz
-
-; Double the stat
-	sla l
-	rl h
-	ret
-
-; 353f6
-
-
-EnemyAttackDamage: ; 353f6
-	call ResetDamage
-
-; No damage dealt with 0 power.
-	ld hl, wEnemyMoveStructPower
-	ld a, [hli] ; hl = wEnemyMoveStructType
-	ld d, a
-	and a
-	ret z
-
-	ld a, [hl]
-	cp SPECIAL
-	jr nc, .Special
-
-.physical
-	ld hl, BattleMonDefense
-	ld a, [hli]
-	ld b, a
-	ld c, [hl]
-
-	ld a, [PlayerScreens]
-	bit SCREENS_REFLECT, a
-	jr z, .physicalcrit
-	sla c
-	rl b
-
-.physicalcrit
-	ld hl, EnemyMonAttack
-	call GetDamageStatsCritical
-	jr c, .thickclub
-
-	ld hl, PlayerDefense
-	ld a, [hli]
-	ld b, a
-	ld c, [hl]
-	ld hl, EnemyAttack
-	jr .thickclub
-
-.Special:
-	ld hl, BattleMonSpclDef
-	ld a, [hli]
-	ld b, a
-	ld c, [hl]
-
-	ld a, [PlayerScreens]
-	bit SCREENS_LIGHT_SCREEN, a
-	jr z, .specialcrit
-	sla c
-	rl b
-
-.specialcrit
-	ld hl, EnemyMonSpclAtk
-	call GetDamageStatsCritical
-	jr c, .lightball
-	ld hl, PlayerSpDef
-	ld a, [hli]
-	ld b, a
-	ld c, [hl]
-	ld hl, EnemySpAtk
-
-.lightball
-	call LightBallBoost
-	jr .done
-
-.thickclub
-	call ThickClubBoost
-
-.done
-	call TruncateHL_BC
-
-	ld a, [EnemyMonLevel]
-	ld e, a
-	call DittoMetalPowder
-
-	ld a, 1
-	and a
-	ret
-
-; 35461
-
-
-BattleCommand_BeatUp: ; 35461
-; beatup
-
-	call ResetDamage
-	ld a, [hBattleTurn]
-	and a
-	jp nz, .enemy_beats_up
-	ld a, [PlayerSubStatus3]
-	bit SUBSTATUS_IN_LOOP, a
-	jr nz, .next_mon
-	ld c, 20
-	call DelayFrames
-	xor a
-	ld [PlayerRolloutCount], a
-	ld [wd002], a
-	ld [wBeatUpHitAtLeastOnce], a
-	jr .got_mon
-
-.next_mon
-	ld a, [PlayerRolloutCount]
-	ld b, a
-	ld a, [PartyCount]
-	sub b
-	ld [wd002], a
-
-.got_mon
-	ld a, [wd002]
-	ld hl, PartyMonNicknames
-	call GetNick
-	ld a, MON_HP
-	call GetBeatupMonLocation
-	ld a, [hli]
-	or [hl]
-	jp z, .beatup_fail ; fainted
-	ld a, [wd002]
-	ld c, a
-	ld a, [CurBattleMon]
-	; BUG: this can desynchronize link battles
-	; Change "cp [hl]" to "cp c" to fix
-	cp [hl]
-	ld hl, BattleMonStatus
-	jr z, .active_mon
-	ld a, MON_STATUS
-	call GetBeatupMonLocation
-.active_mon
-	ld a, [hl]
-	and a
-	jp nz, .beatup_fail
-
-	ld a, $1
-	ld [wBeatUpHitAtLeastOnce], a
-	ld hl, BeatUpAttackText
-	call StdBattleTextBox
-	ld a, [EnemyMonSpecies]
-	ld [CurSpecies], a
-	call GetBaseData
-	ld a, [BaseDefense]
-	ld c, a
-	push bc
-	ld a, MON_SPECIES
-	call GetBeatupMonLocation
-	ld a, [hl]
-	ld [CurSpecies], a
-	call GetBaseData
-	ld a, [BaseAttack]
-	pop bc
-	ld b, a
-	push bc
-	ld a, MON_LEVEL
-	call GetBeatupMonLocation
-	ld a, [hl]
-	ld e, a
-	pop bc
-	ld a, [wPlayerMoveStructPower]
-	ld d, a
-	ret
-
-.enemy_beats_up
-	ld a, [EnemySubStatus3]
-	bit SUBSTATUS_IN_LOOP, a
-	jr nz, .not_first_enemy_beatup
-
-	xor a
-	ld [EnemyRolloutCount], a
-	ld [wd002], a
-	ld [wBeatUpHitAtLeastOnce], a
-	jr .enemy_continue
-
-.not_first_enemy_beatup
-	ld a, [EnemyRolloutCount]
-	ld b, a
-	ld a, [OTPartyCount]
-	sub b
-	ld [wd002], a
-.enemy_continue
-	ld a, [wBattleMode]
-	dec a
-	jr z, .wild
-
-	ld a, [wLinkMode]
-	and a
-	jr nz, .link_or_tower
-
-	ld a, [InBattleTowerBattle]
-	and a
-	jr nz, .link_or_tower
-
-	ld a, [wd002]
-	ld c, a
-	ld b, 0
-	ld hl, OTPartySpecies
-	add hl, bc
-	ld a, [hl]
-	ld [wNamedObjectIndexBuffer], a
-	call GetPokemonName
-	jr .got_enemy_nick
-
-.link_or_tower
-	ld a, [wd002]
-	ld hl, OTPartyMonNicknames
-	ld bc, NAME_LENGTH
-	call AddNTimes
-	ld de, StringBuffer1
-	call CopyBytes
-.got_enemy_nick
-	ld a, MON_HP
-	call GetBeatupMonLocation
-	ld a, [hli]
-	or [hl]
-	jp z, .beatup_fail
-	ld a, [wd002]
-	ld b, a
-	ld a, [CurOTMon]
-	cp b
-	ld hl, EnemyMonStatus
-	jr z, .active_enemy
-
-	ld a, MON_STATUS
-	call GetBeatupMonLocation
-.active_enemy
-	ld a, [hl]
-	and a
-	jr nz, .beatup_fail
-
-	ld a, $1
-	ld [wBeatUpHitAtLeastOnce], a
-	jr .finish_beatup
-
-.wild
-	ld a, [EnemyMonSpecies]
-	ld [wNamedObjectIndexBuffer], a
-	call GetPokemonName
-	ld hl, BeatUpAttackText
-	call StdBattleTextBox
-	jp EnemyAttackDamage
-
-.finish_beatup
-	ld hl, BeatUpAttackText
-	call StdBattleTextBox
-	ld a, [BattleMonSpecies]
-	ld [CurSpecies], a
-	call GetBaseData
-	ld a, [BaseDefense]
-	ld c, a
-	push bc
-	ld a, MON_SPECIES
-	call GetBeatupMonLocation
-	ld a, [hl]
-	ld [CurSpecies], a
-	call GetBaseData
-	ld a, [BaseAttack]
-	pop bc
-	ld b, a
-	push bc
-	ld a, MON_LEVEL
-	call GetBeatupMonLocation
-	ld a, [hl]
-	ld e, a
-	pop bc
-	ld a, [wEnemyMoveStructPower]
-	ld d, a
-	ret
-
-; 355b0
-
-
-.beatup_fail ; 355b0
-	ld b, buildopponentrage_command
-	jp SkipToBattleCommand
-
-; 355b5
-
-
-BattleCommanda8: ; 355b5
-	ld a, [wBeatUpHitAtLeastOnce]
-	and a
-	ret nz
-
-	jp PrintButItFailed
-
-; 355bd
-
-
-GetBeatupMonLocation: ; 355bd
-	push bc
-	ld c, a
-	ld b, 0
-	ld a, [hBattleTurn]
-	and a
-	ld hl, PartyMon1Species
-	jr z, .got_species
-	ld hl, OTPartyMon1Species
-
-.got_species
-	ld a, [wd002]
-	add hl, bc
-	call GetPartyLocation
-	pop bc
-	ret
-
-
-BattleCommand_ClearMissDamage: ; 355d5
-; clearmissdamage
-	ld a, [AttackMissed]
-	and a
-	ret z
-
-	jp ResetDamage
-
-; 355dd
-
-
-HitSelfInConfusion: ; 355dd
-	call ResetDamage
-	ld a, [hBattleTurn]
-	and a
-	ld hl, BattleMonDefense
-	ld de, PlayerScreens
-	ld a, [BattleMonLevel]
-	jr z, .got_it
-
-	ld hl, EnemyMonDefense
-	ld de, EnemyScreens
-	ld a, [EnemyMonLevel]
-.got_it
-	push af
-	ld a, [hli]
-	ld b, a
-	ld c, [hl]
-	ld a, [de]
-	bit SCREENS_REFLECT, a
-	jr z, .mimic_screen
-
-	sla c
-	rl b
-.mimic_screen
-	dec hl
-	dec hl
-	dec hl
-	ld a, [hli]
-	ld l, [hl]
-	ld h, a
-	call TruncateHL_BC
-	ld d, 40
-	pop af
-	ld e, a
-	ret
-
-; 35612
-
-
-BattleCommand_DamageCalc: ; 35612
-; damagecalc
-
-; Return a damage value for move power d, player level e, enemy defense c and player attack b.
-
-; Return 1 if successful, else 0.
-
-	ld a, BATTLE_VARS_MOVE_EFFECT
-	call GetBattleVar
-
-; Selfdestruct and Explosion halve defense.
-	cp EFFECT_SELFDESTRUCT
-	jr nz, .dont_selfdestruct
-
-	srl c
-	jr nz, .dont_selfdestruct
-	inc c
-
-.dont_selfdestruct
-
-; Variable-hit moves and Conversion can have a power of 0.
-	cp EFFECT_MULTI_HIT
-	jr z, .skip_zero_damage_check
-
-	cp EFFECT_CONVERSION
-	jr z, .skip_zero_damage_check
-
-; No damage if move power is 0.
-	ld a, d
-	and a
-	ret z
-
-.skip_zero_damage_check
-; Minimum defense value is 1.
-	ld a, c
-	and a
-	jr nz, .not_dividing_by_zero
-	ld c, 1
-.not_dividing_by_zero
-
-	xor a
-	ld hl, hDividend
-	ld [hli], a
-	ld [hli], a
-	ld [hl], a
-
-; Level * 2
-	ld a, e
-	add a
-	jr nc, .level_not_overflowing
-	ld [hl], $1
-.level_not_overflowing
-	inc hl
-	ld [hli], a
-
-; / 5
-	ld a, 5
-	ld [hld], a
-	push bc
-	ld b, $4
-	call Divide
-	pop bc
-
-; + 2
-	inc [hl]
-	inc [hl]
-
-; * bp
-	inc hl
-	ld [hl], d
-	call Multiply
-
-; * Attack
-	ld [hl], b
-	call Multiply
-
-; / Defense
-	ld [hl], c
-	ld b, $4
-	call Divide
-
-; / 50
-	ld [hl], 50
-	ld b, $4
-	call Divide
-
-; Item boosts
-	call GetUserItem
-
-	ld a, b
-	and a
-	jr z, .DoneItem
-
-	ld hl, TypeBoostItems
-
-.NextItem:
-	ld a, [hli]
-	cp $ff
-	jr z, .DoneItem
-
-; Item effect
-	cp b
-	ld a, [hli]
-	jr nz, .NextItem
-
-; Type
-	ld b, a
-	ld a, BATTLE_VARS_MOVE_TYPE
-	call GetBattleVar
-	cp b
-	jr nz, .DoneItem
-
-; * 100 + item effect amount
-	ld a, c
-	add 100
-	ld [hMultiplier], a
-	call Multiply
-
-; / 100
-	ld a, 100
-	ld [hDivisor], a
-	ld b, 4
-	call Divide
-.DoneItem:
-
-; Critical hits
-	call .CriticalMultiplier
-
-
-; Update CurDamage (capped at 997).
-	ld hl, CurDamage
-	ld b, [hl]
-	ld a, [hProduct + 3]
-	add b
-	ld [hProduct + 3], a
-	jr nc, .dont_cap_1
-
-	ld a, [hProduct + 2]
-	inc a
-	ld [hProduct + 2], a
-	and a
-	jr z, .Cap
-
-.dont_cap_1
-	ld a, [hProduct]
-	ld b, a
-	ld a, [hProduct + 1]
-	or a
-	jr nz, .Cap
-
-	ld a, [hProduct + 2]
-	cp HIGH(MAX_STAT_VALUE - MIN_NEUTRAL_DAMAGE + 1)
-	jr c, .dont_cap_2
-
-	cp HIGH(MAX_STAT_VALUE - MIN_NEUTRAL_DAMAGE + 1) + 1
-	jr nc, .Cap
-
-	ld a, [hProduct + 3]
-	cp LOW(MAX_STAT_VALUE - MIN_NEUTRAL_DAMAGE + 1)
-	jr nc, .Cap
-
-.dont_cap_2
-	inc hl
-
-	ld a, [hProduct + 3]
-	ld b, [hl]
-	add b
-	ld [hld], a
-
-	ld a, [hProduct + 2]
-	ld b, [hl]
-	adc b
-	ld [hl], a
-	jr c, .Cap
-
-	ld a, [hl]
-	cp HIGH(MAX_STAT_VALUE - MIN_NEUTRAL_DAMAGE + 1)
-	jr c, .dont_cap_3
-
-	cp HIGH(MAX_STAT_VALUE - MIN_NEUTRAL_DAMAGE + 1) + 1
-	jr nc, .Cap
-
-	inc hl
-	ld a, [hld]
-	cp LOW(MAX_STAT_VALUE - MIN_NEUTRAL_DAMAGE + 1)
-	jr c, .dont_cap_3
-
-.Cap:
-	ld a, HIGH(MAX_STAT_VALUE - MIN_NEUTRAL_DAMAGE)
-	ld [hli], a
-	ld a, LOW(MAX_STAT_VALUE - MIN_NEUTRAL_DAMAGE)
-	ld [hld], a
-
-
-.dont_cap_3
-; Minimum neutral damage is 2 (bringing the cap to 999).
-	inc hl
-	ld a, [hl]
-	add MIN_NEUTRAL_DAMAGE
-	ld [hld], a
-	jr nc, .dont_floor
-	inc [hl]
-.dont_floor
-
-	ld a, 1
-	and a
-	ret
-
-
-.CriticalMultiplier:
-	ld a, [CriticalHit]
-	and a
-	ret z
-
-; x2
-	ld a, [hQuotient + 2]
-	add a
-	ld [hProduct + 3], a
-
-	ld a, [hQuotient + 1]
-	rl a
-	ld [hProduct + 2], a
-
-; Cap at $ffff.
-	ret nc
-
-	ld a, $ff
-	ld [hProduct + 2], a
-	ld [hProduct + 3], a
-
-	ret
-
-; 35703
-
-
-TypeBoostItems: ; 35703
-	db HELD_NORMAL_BOOST,   NORMAL   ; Pink/Polkadot Bow
-	db HELD_FIGHTING_BOOST, FIGHTING ; Blackbelt
-	db HELD_FLYING_BOOST,   FLYING   ; Sharp Beak
-	db HELD_POISON_BOOST,   POISON   ; Poison Barb
-	db HELD_GROUND_BOOST,   GROUND   ; Soft Sand
-	db HELD_ROCK_BOOST,     ROCK     ; Hard Stone
-	db HELD_BUG_BOOST,      BUG      ; Silverpowder
-	db HELD_GHOST_BOOST,    GHOST    ; Spell Tag
-	db HELD_FIRE_BOOST,     FIRE     ; Charcoal
-	db HELD_WATER_BOOST,    WATER    ; Mystic Water
-	db HELD_GRASS_BOOST,    GRASS    ; Miracle Seed
-	db HELD_ELECTRIC_BOOST, ELECTRIC ; Magnet
-	db HELD_PSYCHIC_BOOST,  PSYCHIC  ; Twistedspoon
-	db HELD_ICE_BOOST,      ICE      ; Nevermeltice
-	db HELD_DRAGON_BOOST,   DRAGON   ; Dragon Scale
-	db HELD_DARK_BOOST,     DARK     ; Blackglasses
-	db HELD_STEEL_BOOST,    STEEL    ; Metal Coat
-	db $ff
-; 35726
-
-
-BattleCommand_ConstantDamage: ; 35726
-; constantdamage
-
-	ld hl, BattleMonLevel
-	ld a, [hBattleTurn]
-	and a
-	jr z, .got_turn
-	ld hl, EnemyMonLevel
-
-.got_turn
-	ld a, BATTLE_VARS_MOVE_EFFECT
-	call GetBattleVar
-	cp EFFECT_LEVEL_DAMAGE
-	ld b, [hl]
-	ld a, 0
-	jr z, .got_power
-
-	ld a, BATTLE_VARS_MOVE_EFFECT
-	call GetBattleVar
-	cp EFFECT_PSYWAVE
-	jr z, .psywave
-
-	cp EFFECT_SUPER_FANG
-	jr z, .super_fang
-
-	cp EFFECT_REVERSAL
-	jr z, .reversal
-
-	ld a, BATTLE_VARS_MOVE_POWER
-	call GetBattleVar
-	ld b, a
-	ld a, $0
-	jr .got_power
-
-.psywave
-	ld a, b
-	srl a
-	add b
-	ld b, a
-.psywave_loop
-	call BattleRandom
-	and a
-	jr z, .psywave_loop
-	cp b
-	jr nc, .psywave_loop
-	ld b, a
-	ld a, $0
-	jr .got_power
-
-.super_fang
-	ld hl, EnemyMonHP
-	ld a, [hBattleTurn]
-	and a
-	jr z, .got_hp
-	ld hl, BattleMonHP
-.got_hp
-	ld a, [hli]
-	srl a
-	ld b, a
-	ld a, [hl]
-	rr a
-	push af
-	ld a, b
-	pop bc
-	and a
-	jr nz, .got_power
-	or b
-	ld a, $0
-	jr nz, .got_power
-	ld b, $1
-	jr .got_power
-
-.got_power
-	ld hl, CurDamage
-	ld [hli], a
-	ld [hl], b
-	ret
-
-.reversal
-	ld hl, BattleMonHP
-	ld a, [hBattleTurn]
-	and a
-	jr z, .reversal_got_hp
-	ld hl, EnemyMonHP
-.reversal_got_hp
-	xor a
-	ld [hDividend], a
-	ld [hMultiplicand + 0], a
-	ld a, [hli]
-	ld [hMultiplicand + 1], a
-	ld a, [hli]
-	ld [hMultiplicand + 2], a
-	ld a, $30
-	ld [hMultiplier], a
-	call Multiply
-	ld a, [hli]
-	ld b, a
-	ld a, [hl]
-	ld [hDivisor], a
-	ld a, b
-	and a
-	jr z, .skip_to_divide
-
-	ld a, [hProduct + 4]
-	srl b
-	rr a
-	srl b
-	rr a
-	ld [hDivisor], a
-	ld a, [hProduct + 2]
-	ld b, a
-	srl b
-	ld a, [hProduct + 3]
-	rr a
-	srl b
-	rr a
-	ld [hDividend + 3], a
-	ld a, b
-	ld [hDividend + 2], a
-
-.skip_to_divide
-	ld b, $4
-	call Divide
-	ld a, [hQuotient + 2]
-	ld b, a
-	ld hl, .FlailPower
-
-.reversal_loop
-	ld a, [hli]
-	cp b
-	jr nc, .break_loop
-	inc hl
-	jr .reversal_loop
-
-.break_loop
-	ld a, [hBattleTurn]
-	and a
-	ld a, [hl]
-	jr nz, .notPlayersTurn
-
-	ld hl, wPlayerMoveStructPower
-	ld [hl], a
-	push hl
-	call PlayerAttackDamage
-	jr .notEnemysTurn
-
-.notPlayersTurn
-	ld hl, wEnemyMoveStructPower
-	ld [hl], a
-	push hl
-	call EnemyAttackDamage
-
-.notEnemysTurn
-	call BattleCommand_DamageCalc
-	pop hl
-	ld [hl], 1
-	ret
-
-.FlailPower:
-	;  px,  bp
-	db  1, 200
-	db  4, 150
-	db  9, 100
-	db 16,  80
-	db 32,  40
-	db 48,  20
-; 35813
-
-
-BattleCommand_Counter: ; 35813
-; counter
-
-	ld a, 1
-	ld [AttackMissed], a
-	ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
-	call GetBattleVar
-	and a
-	ret z
-
-	ld b, a
-	callfar GetMoveEffect
-	ld a, b
-	cp EFFECT_COUNTER
-	ret z
-
-	call BattleCommand_ResetTypeMatchup
-	ld a, [wTypeMatchup]
-	and a
-	ret z
-
-	call CheckOpponentWentFirst
-	ret z
-
-	ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
-	call GetBattleVar
-	dec a
-	ld de, StringBuffer1
-	call GetMoveData
-
-	ld a, [StringBuffer1 + MOVE_POWER]
-	and a
-	ret z
-
-	ld a, [StringBuffer1 + MOVE_TYPE]
-	cp SPECIAL
-	ret nc
-
-	ld hl, CurDamage
-	ld a, [hli]
-	or [hl]
-	ret z
-
-	ld a, [hl]
-	add a
-	ld [hld], a
-	ld a, [hl]
-	adc a
-	ld [hl], a
-	jr nc, .capped
-	ld a, $ff
-	ld [hli], a
-	ld [hl], a
-.capped
-
-	xor a
-	ld [AttackMissed], a
-	ret
-
-; 35864
-
-
-BattleCommand_Encore: ; 35864
-; encore
-
-	ld hl, EnemyMonMoves
-	ld de, EnemyEncoreCount
-	ld a, [hBattleTurn]
-	and a
-	jr z, .ok
-	ld hl, BattleMonMoves
-	ld de, PlayerEncoreCount
-.ok
-	ld a, BATTLE_VARS_LAST_MOVE_OPP
-	call GetBattleVar
-	and a
-	jp z, .failed
-	cp STRUGGLE
-	jp z, .failed
-	cp ENCORE
-	jp z, .failed
-	cp MIRROR_MOVE
-	jp z, .failed
-	ld b, a
-
-.got_move
-	ld a, [hli]
-	cp b
-	jr nz, .got_move
-
-	ld bc, BattleMonPP - BattleMonMoves - 1
-	add hl, bc
-	ld a, [hl]
-	and $3f
-	jp z, .failed
-	ld a, [AttackMissed]
-	and a
-	jp nz, .failed
-	ld a, BATTLE_VARS_SUBSTATUS5_OPP
-	call GetBattleVarAddr
-	bit SUBSTATUS_ENCORED, [hl]
-	jp nz, .failed
-	set SUBSTATUS_ENCORED, [hl]
-	call BattleRandom
-	and $3
-	inc a
-	inc a
-	inc a
-	ld [de], a
-	call CheckOpponentWentFirst
-	jr nz, .finish_move
-	ld a, [hBattleTurn]
-	and a
-	jr z, .force_last_enemy_move
-
-	push hl
-	ld a, [LastPlayerMove]
-	ld b, a
-	ld c, 0
-	ld hl, BattleMonMoves
-.find_player_move
-	ld a, [hli]
-	cp b
-	jr z, .got_player_move
-	inc c
-	ld a, c
-	cp NUM_MOVES
-	jr c, .find_player_move
-	pop hl
-	res SUBSTATUS_ENCORED, [hl]
-	xor a
-	ld [de], a
-	jr .failed
-
-.got_player_move
-	pop hl
-	ld a, c
-	ld [CurMoveNum], a
-	ld a, b
-	ld [CurPlayerMove], a
-	dec a
-	ld de, wPlayerMoveStruct
-	call GetMoveData
-	jr .finish_move
-
-.force_last_enemy_move
-	push hl
-	ld a, [LastEnemyMove]
-	ld b, a
-	ld c, 0
-	ld hl, EnemyMonMoves
-.find_enemy_move
-	ld a, [hli]
-	cp b
-	jr z, .got_enemy_move
-	inc c
-	ld a, c
-	cp NUM_MOVES
-	jr c, .find_enemy_move
-	pop hl
-	res SUBSTATUS_ENCORED, [hl]
-	xor a
-	ld [de], a
-	jr .failed
-
-.got_enemy_move
-	pop hl
-	ld a, c
-	ld [CurEnemyMoveNum], a
-	ld a, b
-	ld [CurEnemyMove], a
-	dec a
-	ld de, wEnemyMoveStruct
-	call GetMoveData
-
-.finish_move
-	call AnimateCurrentMove
-	ld hl, GotAnEncoreText
-	jp StdBattleTextBox
-
-.failed
-	jp PrintDidntAffect2
-
-; 35926
-
-
-BattleCommand_PainSplit: ; 35926
-; painsplit
-
-	ld a, [AttackMissed]
-	and a
-	jp nz, .ButItFailed
-	call CheckSubstituteOpp
-	jp nz, .ButItFailed
-	call AnimateCurrentMove
-	ld hl, BattleMonMaxHP + 1
-	ld de, EnemyMonMaxHP + 1
-	call .PlayerShareHP
-	ld a, $1
-	ld [wWhichHPBar], a
-	hlcoord 10, 9
-	predef AnimateHPBar
-	ld hl, EnemyMonHP
-	ld a, [hli]
-	ld [Buffer4], a
-	ld a, [hli]
-	ld [Buffer3], a
-	ld a, [hli]
-	ld [Buffer2], a
-	ld a, [hl]
-	ld [Buffer1], a
-	call .EnemyShareHP
-	xor a
-	ld [wWhichHPBar], a
-	call ResetDamage
-	hlcoord 2, 2
-	predef AnimateHPBar
-	farcall _UpdateBattleHUDs
-
-	ld hl, SharedPainText
-	jp StdBattleTextBox
-
-.PlayerShareHP:
-	ld a, [hld]
-	ld [Buffer1], a
-	ld a, [hld]
-	ld [Buffer2], a
-	ld a, [hld]
-	ld b, a
-	ld [Buffer3], a
-	ld a, [hl]
-	ld [Buffer4], a
-	dec de
-	dec de
-	ld a, [de]
-	dec de
-	add b
-	ld [CurDamage + 1], a
-	ld b, [hl]
-	ld a, [de]
-	adc b
-	srl a
-	ld [CurDamage], a
-	ld a, [CurDamage + 1]
-	rr a
-	ld [CurDamage + 1], a
-	inc hl
-	inc hl
-	inc hl
-	inc de
-	inc de
-	inc de
-
-.EnemyShareHP: ; 359ac
-	ld c, [hl]
-	dec hl
-	ld a, [CurDamage + 1]
-	sub c
-	ld b, [hl]
-	dec hl
-	ld a, [CurDamage]
-	sbc b
-	jr nc, .skip
-
-	ld a, [CurDamage]
-	ld b, a
-	ld a, [CurDamage + 1]
-	ld c, a
-.skip
-	ld a, c
-	ld [hld], a
-	ld [Buffer5], a
-	ld a, b
-	ld [hli], a
-	ld [Buffer6], a
-	ret
-
-; 359cd
-
-.ButItFailed:
-	jp PrintDidntAffect2
-
-; 359d0
-
-
-BattleCommand_Snore: ; 359d0
-; snore
-	ld a, BATTLE_VARS_STATUS
-	call GetBattleVar
-	and SLP
-	ret nz
-	call ResetDamage
-	ld a, $1
-	ld [AttackMissed], a
-	call FailSnore
-	jp EndMoveEffect
-
-; 359e6
-
-
-BattleCommand_Conversion2: ; 359e6
-; conversion2
-
-	ld a, [AttackMissed]
-	and a
-	jr nz, .failed
-	ld hl, BattleMonType1
-	ld a, [hBattleTurn]
-	and a
-	jr z, .got_type
-	ld hl, EnemyMonType1
-.got_type
-	ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
-	call GetBattleVar
-	and a
-	jr z, .failed
-	push hl
-	dec a
-	ld hl, Moves + MOVE_TYPE
-	call GetMoveAttr
-	ld d, a
-	pop hl
-	cp CURSE_T
-	jr z, .failed
-	call AnimateCurrentMove
-	call BattleCommand_SwitchTurn
-
-.loop
-	call BattleRandom
-	and $1f
-	cp UNUSED_TYPES
-	jr c, .okay
-	cp UNUSED_TYPES_END
-	jr c, .loop
-	cp TYPES_END
-	jr nc, .loop
-.okay
-	ld [hli], a
-	ld [hld], a
-	push hl
-	ld a, BATTLE_VARS_MOVE_TYPE
-	call GetBattleVarAddr
-	push af
-	push hl
-	ld a, d
-	ld [hl], a
-	call BattleCheckTypeMatchup
-	pop hl
-	pop af
-	ld [hl], a
-	pop hl
-	ld a, [wTypeMatchup]
-	cp 10
-	jr nc, .loop
-	call BattleCommand_SwitchTurn
-
-	ld a, [hl]
-	ld [wNamedObjectIndexBuffer], a
-	predef GetTypeName
-	ld hl, TransformedTypeText
-	jp StdBattleTextBox
-
-.failed
-	jp FailConversion2
-
-; 35a53
-
-
-BattleCommand_LockOn: ; 35a53
-; lockon
-
-	call CheckSubstituteOpp
-	jr nz, .fail
-
-	ld a, [AttackMissed]
-	and a
-	jr nz, .fail
-
-	ld a, BATTLE_VARS_SUBSTATUS5_OPP
-	call GetBattleVarAddr
-	set SUBSTATUS_LOCK_ON, [hl]
-	call AnimateCurrentMove
-
-	ld hl, TookAimText
-	jp StdBattleTextBox
-
-.fail
-	call AnimateFailedMove
-	jp PrintDidntAffect
-
-; 35a74
-
-
-BattleCommand_Sketch: ; 35a74
-; sketch
-
-	call ClearLastMove
-; Don't sketch during a link battle
-	ld a, [wLinkMode]
-	and a
-	jr z, .not_linked
-	call AnimateFailedMove
-	jp PrintNothingHappened
-
-.not_linked
-; If the opponent has a substitute up, fail.
-	call CheckSubstituteOpp
-	jp nz, .fail
-; If the opponent is transformed, fail.
-	ld a, BATTLE_VARS_SUBSTATUS5_OPP
-	call GetBattleVarAddr
-	bit SUBSTATUS_TRANSFORMED, [hl]
-	jp nz, .fail
-; Get the user's moveset in its party struct.
-; This move replacement shall be permanent.
-; Pointer will be in de.
-	ld a, MON_MOVES
-	call UserPartyAttr
-	ld d, h
-	ld e, l
-; Get the battle move structs.
-	ld hl, BattleMonMoves
-	ld a, [hBattleTurn]
-	and a
-	jr z, .get_last_move
-	ld hl, EnemyMonMoves
-.get_last_move
-	ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
-	call GetBattleVar
-	ld [wTypeMatchup], a
-	ld b, a
-; Fail if move is invalid or is Struggle.
-	and a
-	jr z, .fail
-	cp STRUGGLE
-	jr z, .fail
-; Fail if user already knows that move
-	ld c, NUM_MOVES
-.does_user_already_know_move
-	ld a, [hli]
-	cp b
-	jr z, .fail
-	dec c
-	jr nz, .does_user_already_know_move
-; Find Sketch in the user's moveset.
-; Pointer in hl, and index in c.
-	dec hl
-	ld c, NUM_MOVES
-.find_sketch
-	dec c
-	ld a, [hld]
-	cp SKETCH
-	jr nz, .find_sketch
-	inc hl
-; The Sketched move is loaded to that slot.
-	ld a, b
-	ld [hl], a
-; Copy the base PP from that move.
-	push bc
-	push hl
-	dec a
-	ld hl, Moves + MOVE_PP
-	call GetMoveAttr
-	pop hl
-	ld bc, BattleMonPP - BattleMonMoves
-	add hl, bc
-	ld [hl], a
-	pop bc
-
-	ld a, [hBattleTurn]
-	and a
-	jr z, .user_trainer
-	ld a, [wBattleMode]
-	dec a
-	jr nz, .user_trainer
-; wildmon
-	ld a, [hl]
-	push bc
-	ld hl, wWildMonPP
-	ld b, 0
-	add hl, bc
-	ld [hl], a
-	ld hl, wWildMonMoves
-	add hl, bc
-	pop bc
-	ld [hl], b
-	jr .done_copy
-
-.user_trainer
-	ld a, [hl]
-	push af
-	ld l, c
-	ld h, 0
-	add hl, de
-	ld a, b
-	ld [hl], a
-	pop af
-	ld de, MON_PP - MON_MOVES
-	add hl, de
-	ld [hl], a
-.done_copy
-	call GetMoveName
-	call AnimateCurrentMove
-
-	ld hl, SketchedText
-	jp StdBattleTextBox
-
-.fail
-	call AnimateFailedMove
-	jp PrintDidntAffect
-
-; 35b16
-
-
-BattleCommand_DefrostOpponent: ; 35b16
-; defrostopponent
-; Thaw the opponent if frozen, and
-; raise the user's Attack one stage.
-
-	call AnimateCurrentMove
-
-	ld a, BATTLE_VARS_STATUS_OPP
-	call GetBattleVarAddr
-	call Defrost
-
-	ld a, BATTLE_VARS_MOVE_EFFECT
-	call GetBattleVarAddr
-	ld a, [hl]
-	push hl
-	push af
-
-	ld a, EFFECT_ATTACK_UP
-	ld [hl], a
-	call BattleCommand_StatUp
-
-	pop af
-	pop hl
-	ld [hl], a
-	ret
-
-; 35b33
-
-
-BattleCommand_SleepTalk: ; 35b33
-; sleeptalk
-
-	call ClearLastMove
-	ld a, [AttackMissed]
-	and a
-	jr nz, .fail
-	ld a, [hBattleTurn]
-	and a
-	ld hl, BattleMonMoves + 1
-	ld a, [DisabledMove]
-	ld d, a
-	jr z, .got_moves
-	ld hl, EnemyMonMoves + 1
-	ld a, [EnemyDisabledMove]
-	ld d, a
-.got_moves
-	ld a, BATTLE_VARS_STATUS
-	call GetBattleVar
-	and SLP
-	jr z, .fail
-	ld a, [hl]
-	and a
-	jr z, .fail
-	call .safely_check_has_usable_move
-	jr c, .fail
-	dec hl
-.sample_move
-	push hl
-	call BattleRandom
-	and 3 ; TODO factor in NUM_MOVES
-	ld c, a
-	ld b, 0
-	add hl, bc
-	ld a, [hl]
-	pop hl
-	and a
-	jr z, .sample_move
-	ld e, a
-	ld a, BATTLE_VARS_MOVE_ANIM
-	call GetBattleVar
-	cp e
-	jr z, .sample_move
-	ld a, e
-	cp d
-	jr z, .sample_move
-	call .check_two_turn_move
-	jr z, .sample_move
-	ld a, BATTLE_VARS_MOVE
-	call GetBattleVarAddr
-	ld a, e
-	ld [hl], a
-	call CheckUserIsCharging
-	jr nz, .charging
-	ld a, [wKickCounter]
-	push af
-	call BattleCommand_LowerSub
-	pop af
-	ld [wKickCounter], a
-.charging
-	call LoadMoveAnim
-	call UpdateMoveData
-	jp ResetTurn
-
-.fail
-	call AnimateFailedMove
-	jp TryPrintButItFailed
-
-.safely_check_has_usable_move
-	push hl
-	push de
-	push bc
-	call .check_has_usable_move
-	pop bc
-	pop de
-	pop hl
-	ret
-
-.check_has_usable_move
-	ld a, [hBattleTurn]
-	and a
-	ld a, [DisabledMove]
-	jr z, .got_move_2
-
-	ld a, [EnemyDisabledMove]
-.got_move_2
-	ld b, a
-	ld a, BATTLE_VARS_MOVE
-	call GetBattleVar
-	ld c, a
-	dec hl
-	ld d, NUM_MOVES
-.loop2
-	ld a, [hl]
-	and a
-	jr z, .carry
-
-	cp c
-	jr z, .nope
-	cp b
-	jr z, .nope
-
-	call .check_two_turn_move
-	jr nz, .no_carry
-
-.nope
-	inc hl
-	dec d
-	jr nz, .loop2
-
-.carry
-	scf
-	ret
-
-.no_carry
-	and a
-	ret
-
-.check_two_turn_move
-	push hl
-	push de
-	push bc
-
-	ld b, a
-	callfar GetMoveEffect
-	ld a, b
-
-	pop bc
-	pop de
-	pop hl
-
-	cp EFFECT_SKULL_BASH
-	ret z
-	cp EFFECT_RAZOR_WIND
-	ret z
-	cp EFFECT_SKY_ATTACK
-	ret z
-	cp EFFECT_SOLARBEAM
-	ret z
-	cp EFFECT_FLY
-	ret z
-	cp EFFECT_BIDE
-	ret
-
-; 35bff
-
-
-BattleCommand_DestinyBond: ; 35bff
-; destinybond
-
-	ld a, BATTLE_VARS_SUBSTATUS5
-	call GetBattleVarAddr
-	set SUBSTATUS_DESTINY_BOND, [hl]
-	call AnimateCurrentMove
-	ld hl, DestinyBondEffectText
-	jp StdBattleTextBox
-
-; 35c0f
-
-
-BattleCommand_Spite: ; 35c0f
-; spite
-
-	ld a, [AttackMissed]
-	and a
-	jp nz, .failed
-	ld bc, PARTYMON_STRUCT_LENGTH ; ????
-	ld hl, EnemyMonMoves
-	ld a, [hBattleTurn]
-	and a
-	jr z, .got_moves
-	ld hl, BattleMonMoves
-.got_moves
-	ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
-	call GetBattleVar
-	and a
-	jr z, .failed
-	cp STRUGGLE
-	jr z, .failed
-	ld b, a
-	ld c, -1
-.loop
-	inc c
-	ld a, [hli]
-	cp b
-	jr nz, .loop
-	ld [wTypeMatchup], a
-	dec hl
-	ld b, 0
-	push bc
-	ld c, BattleMonPP - BattleMonMoves
-	add hl, bc
-	pop bc
-	ld a, [hl]
-	and $3f
-	jr z, .failed
-	push bc
-	call GetMoveName
-	call BattleRandom
-	and 3
-	inc a
-	inc a
-	ld b, a
-	ld a, [hl]
-	and $3f
-	cp b
-	jr nc, .deplete_pp
-	ld b, a
-.deplete_pp
-	ld a, [hl]
-	sub b
-	ld [hl], a
-	push af
-	ld a, MON_PP
-	call OpponentPartyAttr
-	ld d, b
-	pop af
-	pop bc
-	add hl, bc
-	ld e, a
-	ld a, BATTLE_VARS_SUBSTATUS5_OPP
-	call GetBattleVar
-	bit SUBSTATUS_TRANSFORMED, a
-	jr nz, .transformed
-	ld a, [hBattleTurn]
-	and a
-	jr nz, .not_wildmon
-	ld a, [wBattleMode]
-	dec a
-	jr nz, .not_wildmon
-	ld hl, wWildMonPP
-	add hl, bc
-.not_wildmon
-	ld [hl], e
-.transformed
-	push de
-	call AnimateCurrentMove
-	pop de
-	ld a, d
-	ld [wTypeMatchup], a
-	ld hl, SpiteEffectText
-	jp StdBattleTextBox
-
-.failed
-	jp PrintDidntAffect2
-
-; 35c94
-
-
-BattleCommand_FalseSwipe: ; 35c94
-; falseswipe
-
-	ld hl, EnemyMonHP
-	ld a, [hBattleTurn]
-	and a
-	jr z, .got_hp
-	ld hl, BattleMonHP
-.got_hp
-	ld de, CurDamage
-	ld c, 2
-	push hl
-	push de
-	call StringCmp
-	pop de
-	pop hl
-	jr c, .done
-	ld a, [hli]
-	ld [de], a
-	inc de
-	ld a, [hl]
-	dec a
-	ld [de], a
-	inc a
-	jr nz, .okay
-	dec de
-	ld a, [de]
-	dec a
-	ld [de], a
-.okay
-	ld a, [CriticalHit]
-	cp $2
-	jr nz, .carry
-	xor a
-	ld [CriticalHit], a
-.carry
-	scf
-	ret
-
-.done
-	and a
-	ret
-
-; 35cc9
-
-
-BattleCommand_HealBell: ; 35cc9
-; healbell
-
-	ld a, BATTLE_VARS_SUBSTATUS1
-	call GetBattleVarAddr
-	res SUBSTATUS_NIGHTMARE, [hl]
-	ld de, PartyMon1Status
-	ld a, [hBattleTurn]
-	and a
-	jr z, .got_status
-	ld de, OTPartyMon1Status
-.got_status
-	ld a, BATTLE_VARS_STATUS
-	call GetBattleVarAddr
-	xor a
-	ld [hl], a
-	ld h, d
-	ld l, e
-	ld bc, PARTYMON_STRUCT_LENGTH
-	ld d, PARTY_LENGTH
-.loop
-	ld [hl], a
-	add hl, bc
-	dec d
-	jr nz, .loop
-	call AnimateCurrentMove
-
-	ld hl, BellChimedText
-	call StdBattleTextBox
-
-	ld a, [hBattleTurn]
-	and a
-	jp z, CalcPlayerStats
-	jp CalcEnemyStats
-
-; 35d00
-
-
-FarPlayBattleAnimation: ; 35d00
-; play animation de
-
-	ld a, BATTLE_VARS_SUBSTATUS3
-	call GetBattleVar
-	and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
-	ret nz
-
-	; fallthrough
-; 35d08
-
-PlayFXAnimID: ; 35d08
-	ld a, e
-	ld [FXAnimID], a
-	ld a, d
-	ld [FXAnimID + 1], a
-
-	ld c, 3
-	call DelayFrames
-
-	callfar PlayBattleAnim
-
-	ret
-
-; 35d1c
-
-
-EnemyHurtItself: ; 35d1c
-	ld hl, CurDamage
-	ld a, [hli]
-	ld b, a
-	ld a, [hl]
-	or b
-	jr z, .did_no_damage
-
-	ld a, c
-	and a
-	jr nz, .mimic_sub_check
-
-	ld a, [EnemySubStatus4]
-	bit SUBSTATUS_SUBSTITUTE, a
-	jp nz, SelfInflictDamageToSubstitute
-
-.mimic_sub_check
-	ld a, [hld]
-	ld b, a
-	ld a, [EnemyMonHP + 1]
-	ld [Buffer3], a
-	sub b
-	ld [EnemyMonHP + 1], a
-	ld a, [hl]
-	ld b, a
-	ld a, [EnemyMonHP]
-	ld [Buffer4], a
-	sbc b
-	ld [EnemyMonHP], a
-	jr nc, .mimic_faint
-
-	ld a, [Buffer4]
-	ld [hli], a
-	ld a, [Buffer3]
-	ld [hl], a
-
-	xor a
-	ld hl, EnemyMonHP
-	ld [hli], a
-	ld [hl], a
-
-.mimic_faint
-	ld hl, EnemyMonMaxHP
-	ld a, [hli]
-	ld [Buffer2], a
-	ld a, [hl]
-	ld [Buffer1], a
-	ld hl, EnemyMonHP
-	ld a, [hli]
-	ld [Buffer6], a
-	ld a, [hl]
-	ld [Buffer5], a
-	hlcoord 2, 2
-	xor a
-	ld [wWhichHPBar], a
-	predef AnimateHPBar
-.did_no_damage
-	jp RefreshBattleHuds
-
-; 35d7e
-
-
-PlayerHurtItself: ; 35d7e
-	ld hl, CurDamage
-	ld a, [hli]
-	ld b, a
-	ld a, [hl]
-	or b
-	jr z, .did_no_damage
-
-	ld a, c
-	and a
-	jr nz, .mimic_sub_check
-
-	ld a, [PlayerSubStatus4]
-	bit SUBSTATUS_SUBSTITUTE, a
-	jp nz, SelfInflictDamageToSubstitute
-.mimic_sub_check
-	ld a, [hld]
-	ld b, a
-	ld a, [BattleMonHP + 1]
-	ld [Buffer3], a
-	sub b
-	ld [BattleMonHP + 1], a
-	ld [Buffer5], a
-	ld b, [hl]
-	ld a, [BattleMonHP]
-	ld [Buffer4], a
-	sbc b
-	ld [BattleMonHP], a
-	ld [Buffer6], a
-	jr nc, .mimic_faint
-
-	ld a, [Buffer4]
-	ld [hli], a
-	ld a, [Buffer3]
-	ld [hl], a
-	xor a
-
-	ld hl, BattleMonHP
-	ld [hli], a
-	ld [hl], a
-	ld hl, Buffer5
-	ld [hli], a
-	ld [hl], a
-
-.mimic_faint
-	ld hl, BattleMonMaxHP
-	ld a, [hli]
-	ld [Buffer2], a
-	ld a, [hl]
-	ld [Buffer1], a
-	hlcoord 10, 9
-	ld a, $1
-	ld [wWhichHPBar], a
-	predef AnimateHPBar
-.did_no_damage
-	jp RefreshBattleHuds
-
-; 35de0
-
-
-SelfInflictDamageToSubstitute: ; 35de0
-
-	ld hl, SubTookDamageText
-	call StdBattleTextBox
-
-	ld de, EnemySubstituteHP
-	ld a, [hBattleTurn]
-	and a
-	jr z, .got_hp
-	ld de, PlayerSubstituteHP
-.got_hp
-
-	ld hl, CurDamage
-	ld a, [hli]
-	and a
-	jr nz, .broke
-
-	ld a, [de]
-	sub [hl]
-	ld [de], a
-	jr z, .broke
-	jr nc, .done
-
-.broke
-	ld a, BATTLE_VARS_SUBSTATUS4_OPP
-	call GetBattleVarAddr
-	res SUBSTATUS_SUBSTITUTE, [hl]
-
-	ld hl, SubFadedText
-	call StdBattleTextBox
-
-	call BattleCommand_SwitchTurn
-	call BattleCommand_LowerSubNoAnim
-	ld a, BATTLE_VARS_SUBSTATUS3
-	call GetBattleVar
-	and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
-	call z, AppearUserLowerSub
-	call BattleCommand_SwitchTurn
-
-	ld a, BATTLE_VARS_MOVE_EFFECT
-	call GetBattleVarAddr
-	cp EFFECT_MULTI_HIT
-	jr z, .ok
-	cp EFFECT_DOUBLE_HIT
-	jr z, .ok
-	cp EFFECT_POISON_MULTI_HIT
-	jr z, .ok
-	cp EFFECT_TRIPLE_KICK
-	jr z, .ok
-	cp EFFECT_BEAT_UP
-	jr z, .ok
-	xor a
-	ld [hl], a
-.ok
-	call RefreshBattleHuds
-.done
-	jp ResetDamage
-
-; 35e40
-
-
-UpdateMoveData: ; 35e40
-
-	ld a, BATTLE_VARS_MOVE_ANIM
-	call GetBattleVarAddr
-	ld d, h
-	ld e, l
-
-	ld a, BATTLE_VARS_MOVE
-	call GetBattleVar
-	ld [CurMove], a
-	ld [wNamedObjectIndexBuffer], a
-
-	dec a
-	call GetMoveData
-	call GetMoveName
-	jp CopyName1
-
-; 35e5c
-
-
-BattleCommand_SleepTarget: ; 35e5c
-; sleeptarget
-
-	call GetOpponentItem
-	ld a, b
-	cp HELD_PREVENT_SLEEP
-	jr nz, .not_protected_by_item
-
-	ld a, [hl]
-	ld [wNamedObjectIndexBuffer], a
-	call GetItemName
-	ld hl, ProtectedByText
-	jr .fail
-
-.not_protected_by_item
-	ld a, BATTLE_VARS_STATUS_OPP
-	call GetBattleVarAddr
-	ld d, h
-	ld e, l
-	ld a, [de]
-	and SLP
-	ld hl, AlreadyAsleepText
-	jr nz, .fail
-
-	ld a, [AttackMissed]
-	and a
-	jp nz, PrintDidntAffect2
-
-	ld hl, DidntAffect1Text
-	call .CheckAIRandomFail
-	jr c, .fail
-
-	ld a, [de]
-	and a
-	jr nz, .fail
-
-	call CheckSubstituteOpp
-	jr nz, .fail
-
-	call AnimateCurrentMove
-	ld b, $7
-	ld a, [InBattleTowerBattle]
-	and a
-	jr z, .random_loop
-	ld b, $3
-
-.random_loop
-	call BattleRandom
-	and b
-	jr z, .random_loop
-	cp 7
-	jr z, .random_loop
-	inc a
-	ld [de], a
-	call UpdateOpponentInParty
-	call RefreshBattleHuds
-
-	ld hl, FellAsleepText
-	call StdBattleTextBox
-
-	farcall UseHeldStatusHealingItem
-
-	jp z, OpponentCantMove
-	ret
-
-.fail
-	push hl
-	call AnimateFailedMove
-	pop hl
-	jp StdBattleTextBox
-
-; 35ece
-
-
-.CheckAIRandomFail: ; 35ece
-	; Enemy turn
-	ld a, [hBattleTurn]
-	and a
-	jr z, .dont_fail
-
-	; Not in link battle
-	ld a, [wLinkMode]
-	and a
-	jr nz, .dont_fail
-
-	ld a, [InBattleTowerBattle]
-	and a
-	jr nz, .dont_fail
-
-	; Not locked-on by the enemy
-	ld a, [PlayerSubStatus5]
-	bit SUBSTATUS_LOCK_ON, a
-	jr nz, .dont_fail
-
-	call BattleRandom
-	cp $40 ; 25%
-	ret c
-
-.dont_fail
-	xor a
-	ret
-
-; 35eee
-
-
-BattleCommand_PoisonTarget: ; 35eee
-; poisontarget
-
-	call CheckSubstituteOpp
-	ret nz
-	ld a, BATTLE_VARS_STATUS_OPP
-	call GetBattleVarAddr
-	and a
-	ret nz
-	ld a, [TypeModifier]
-	and $7f
-	ret z
-	call CheckIfTargetIsPoisonType
-	ret z
-	call GetOpponentItem
-	ld a, b
-	cp HELD_PREVENT_POISON
-	ret z
-	ld a, [EffectFailed]
-	and a
-	ret nz
-	call SafeCheckSafeguard
-	ret nz
-
-	call PoisonOpponent
-	ld de, ANIM_PSN
-	call PlayOpponentBattleAnim
-	call RefreshBattleHuds
-
-	ld hl, WasPoisonedText
-	call StdBattleTextBox
-
-	farcall UseHeldStatusHealingItem
-	ret
-
-; 35f2c
-
-
-BattleCommand_Poison: ; 35f2c
-; poison
-
-	ld hl, DoesntAffectText
-	ld a, [TypeModifier]
-	and $7f
-	jp z, .failed
-
-	call CheckIfTargetIsPoisonType
-	jp z, .failed
-
-	ld a, BATTLE_VARS_STATUS_OPP
-	call GetBattleVar
-	ld b, a
-	ld hl, AlreadyPoisonedText
-	and 1 << PSN
-	jp nz, .failed
-
-	call GetOpponentItem
-	ld a, b
-	cp HELD_PREVENT_POISON
-	jr nz, .do_poison
-	ld a, [hl]
-	ld [wNamedObjectIndexBuffer], a
-	call GetItemName
-	ld hl, ProtectedByText
-	jr .failed
-
-.do_poison
-	ld hl, DidntAffect1Text
-	ld a, BATTLE_VARS_STATUS_OPP
-	call GetBattleVar
-	and a
-	jr nz, .failed
-
-	ld a, [hBattleTurn]
-	and a
-	jr z, .mimic_random
-
-	ld a, [wLinkMode]
-	and a
-	jr nz, .mimic_random
-
-	ld a, [InBattleTowerBattle]
-	and a
-	jr nz, .mimic_random
-
-	ld a, [PlayerSubStatus5]
-	bit SUBSTATUS_LOCK_ON, a
-	jr nz, .mimic_random
-
-	call BattleRandom
-	cp $40 ; 25% chance AI fails
-	jr c, .failed
-
-.mimic_random
-	call CheckSubstituteOpp
-	jr nz, .failed
-	ld a, [AttackMissed]
-	and a
-	jr nz, .failed
-	call .check_toxic
-	jr z, .toxic
-
-	call .apply_poison
-	ld hl, WasPoisonedText
-	call StdBattleTextBox
-	jr .finished
-
-.toxic
-	set SUBSTATUS_TOXIC, [hl]
-	xor a
-	ld [de], a
-	call .apply_poison
-
-	ld hl, BadlyPoisonedText
-	call StdBattleTextBox
-
-.finished
-	farcall UseHeldStatusHealingItem
-	ret
-
-.failed
-	push hl
-	call AnimateFailedMove
-	pop hl
-	jp StdBattleTextBox
-
-; 35fc0
-
-
-.apply_poison ; 35fc0
-	call AnimateCurrentMove
-	call PoisonOpponent
-	jp RefreshBattleHuds
-
-; 35fc9
-
-
-.check_toxic ; 35fc9
-	ld a, BATTLE_VARS_SUBSTATUS5_OPP
-	call GetBattleVarAddr
-	ld a, [hBattleTurn]
-	and a
-	ld de, EnemyToxicCount
-	jr z, .ok
-	ld de, PlayerToxicCount
-.ok
-	ld a, BATTLE_VARS_MOVE_EFFECT
-	call GetBattleVar
-	cp EFFECT_TOXIC
-	ret
-
-; 35fe1
-
-
-CheckIfTargetIsPoisonType: ; 35fe1
-	ld de, EnemyMonType1
-	ld a, [hBattleTurn]
-	and a
-	jr z, .ok
-	ld de, BattleMonType1
-.ok
-	ld a, [de]
-	inc de
-	cp POISON
-	ret z
-	ld a, [de]
-	cp POISON
-	ret
-
-; 35ff5
-
-
-PoisonOpponent: ; 35ff5
-	ld a, BATTLE_VARS_STATUS_OPP
-	call GetBattleVarAddr
-	set PSN, [hl]
-	jp UpdateOpponentInParty
-
-; 35fff
-
-
-BattleCommand_DrainTarget: ; 35fff
-; draintarget
-	call SapHealth
-	ld hl, SuckedHealthText
-	jp StdBattleTextBox
-
-; 36008
-
-
-BattleCommand_EatDream: ; 36008
-; eatdream
-	call SapHealth
-	ld hl, DreamEatenText
-	jp StdBattleTextBox
-
-; 36011
-
-
-SapHealth: ; 36011
-	ld hl, CurDamage
-	ld a, [hli]
-	srl a
-	ld [hDividend], a
-	ld b, a
-	ld a, [hl]
-	rr a
-	ld [hDividend + 1], a
-	or b
-	jr nz, .ok1
-	ld a, $1
-	ld [hDividend + 1], a
-.ok1
-	ld hl, BattleMonHP
-	ld de, BattleMonMaxHP
-	ld a, [hBattleTurn]
-	and a
-	jr z, .battlemonhp
-	ld hl, EnemyMonHP
-	ld de, EnemyMonMaxHP
-.battlemonhp
-	ld bc, Buffer4
-	ld a, [hli]
-	ld [bc], a
-	ld a, [hl]
-	dec bc
-	ld [bc], a
-	ld a, [de]
-	dec bc
-	ld [bc], a
-	inc de
-	ld a, [de]
-	dec bc
-	ld [bc], a
-	ld a, [hDividend + 1]
-	ld b, [hl]
-	add b
-	ld [hld], a
-	ld [Buffer5], a
-	ld a, [hDividend]
-	ld b, [hl]
-	adc b
-	ld [hli], a
-	ld [Buffer6], a
-	jr c, .okay2
-	ld a, [hld]
-	ld b, a
-	ld a, [de]
-	dec de
-	sub b
-	ld a, [hli]
-	ld b, a
-	ld a, [de]
-	inc de
-	sbc b
-	jr nc, .okay3
-.okay2
-	ld a, [de]
-	ld [hld], a
-	ld [Buffer5], a
-	dec de
-	ld a, [de]
-	ld [hli], a
-	ld [Buffer6], a
-	inc de
-.okay3
-	ld a, [hBattleTurn]
-	and a
-	hlcoord 10, 9
-	ld a, $1
-	jr z, .hp_bar
-	hlcoord 2, 2
-	xor a
-.hp_bar
-	ld [wWhichHPBar], a
-	predef AnimateHPBar
-	call RefreshBattleHuds
-	jp UpdateBattleMonInParty
-
-; 3608c
-
-
-BattleCommand_BurnTarget: ; 3608c
-; burntarget
-
-	xor a
-	ld [wNumHits], a
-	call CheckSubstituteOpp
-	ret nz
-	ld a, BATTLE_VARS_STATUS_OPP
-	call GetBattleVarAddr
-	and a
-	jp nz, Defrost
-	ld a, [TypeModifier]
-	and $7f
-	ret z
-	call CheckMoveTypeMatchesTarget ; Don't burn a Fire-type
-	ret z
-	call GetOpponentItem
-	ld a, b
-	cp HELD_PREVENT_BURN
-	ret z
-	ld a, [EffectFailed]
-	and a
-	ret nz
-	call SafeCheckSafeguard
-	ret nz
-	ld a, BATTLE_VARS_STATUS_OPP
-	call GetBattleVarAddr
-	set BRN, [hl]
-	call UpdateOpponentInParty
-	ld hl, ApplyBrnEffectOnAttack
-	call CallBattleCore
-	ld de, ANIM_BRN
-	call PlayOpponentBattleAnim
-	call RefreshBattleHuds
-
-	ld hl, WasBurnedText
-	call StdBattleTextBox
-
-	farcall UseHeldStatusHealingItem
-	ret
-
-; 360dd
-
-
-Defrost: ; 360dd
-	ld a, [hl]
-	and 1 << FRZ
-	ret z
-
-	xor a
-	ld [hl], a
-
-	ld a, [hBattleTurn]
-	and a
-	ld a, [CurOTMon]
-	ld hl, OTPartyMon1Status
-	jr z, .ok
-	ld hl, PartyMon1Status
-	ld a, [CurBattleMon]
-.ok
-
-	call GetPartyLocation
-	xor a
-	ld [hl], a
-	call UpdateOpponentInParty
-
-	ld hl, DefrostedOpponentText
-	jp StdBattleTextBox
-
-; 36102
-
-
-BattleCommand_FreezeTarget: ; 36102
-; freezetarget
-
-	xor a
-	ld [wNumHits], a
-	call CheckSubstituteOpp
-	ret nz
-	ld a, BATTLE_VARS_STATUS_OPP
-	call GetBattleVarAddr
-	and a
-	ret nz
-	ld a, [TypeModifier]
-	and $7f
-	ret z
-	ld a, [Weather]
-	cp WEATHER_SUN
-	ret z
-	call CheckMoveTypeMatchesTarget ; Don't freeze an Ice-type
-	ret z
-	call GetOpponentItem
-	ld a, b
-	cp HELD_PREVENT_FREEZE
-	ret z
-	ld a, [EffectFailed]
-	and a
-	ret nz
-	call SafeCheckSafeguard
-	ret nz
-	ld a, BATTLE_VARS_STATUS_OPP
-	call GetBattleVarAddr
-	set FRZ, [hl]
-	call UpdateOpponentInParty
-	ld de, ANIM_FRZ
-	call PlayOpponentBattleAnim
-	call RefreshBattleHuds
-
-	ld hl, WasFrozenText
-	call StdBattleTextBox
-
-	farcall UseHeldStatusHealingItem
-	ret nz
-
-	call OpponentCantMove
-	call EndRechargeOpp
-	ld hl, wEnemyJustGotFrozen
-	ld a, [hBattleTurn]
-	and a
-	jr z, .finish
-	ld hl, wPlayerJustGotFrozen
-.finish
-	ld [hl], $1
-	ret
-
-; 36165
-
-
-BattleCommand_ParalyzeTarget: ; 36165
-; paralyzetarget
-
-	xor a
-	ld [wNumHits], a
-	call CheckSubstituteOpp
-	ret nz
-	ld a, BATTLE_VARS_STATUS_OPP
-	call GetBattleVarAddr
-	and a
-	ret nz
-	ld a, [TypeModifier]
-	and $7f
-	ret z
-	call GetOpponentItem
-	ld a, b
-	cp HELD_PREVENT_PARALYZE
-	ret z
-	ld a, [EffectFailed]
-	and a
-	ret nz
-	call SafeCheckSafeguard
-	ret nz
-	ld a, BATTLE_VARS_STATUS_OPP
-	call GetBattleVarAddr
-	set PAR, [hl]
-	call UpdateOpponentInParty
-	ld hl, ApplyPrzEffectOnSpeed
-	call CallBattleCore
-	ld de, ANIM_PAR
-	call PlayOpponentBattleAnim
-	call RefreshBattleHuds
-	call PrintParalyze
-	ld hl, UseHeldStatusHealingItem
-	jp CallBattleCore
-
-; 361ac
-
-
-BattleCommand_AttackUp: ; 361ac
-; attackup
-	ld b, ATTACK
-	jr BattleCommand_StatUp
-
-BattleCommand_DefenseUp: ; 361b0
-; defenseup
-	ld b, DEFENSE
-	jr BattleCommand_StatUp
-
-BattleCommand_SpeedUp: ; 361b4
-; speedup
-	ld b, SPEED
-	jr BattleCommand_StatUp
-
-BattleCommand_SpecialAttackUp: ; 361b8
-; specialattackup
-	ld b, SP_ATTACK
-	jr BattleCommand_StatUp
-
-BattleCommand_SpecialDefenseUp: ; 361bc
-; specialdefenseup
-	ld b, SP_DEFENSE
-	jr BattleCommand_StatUp
-
-BattleCommand_AccuracyUp: ; 361c0
-; accuracyup
-	ld b, ACCURACY
-	jr BattleCommand_StatUp
-
-BattleCommand_EvasionUp: ; 361c4
-; evasionup
-	ld b, EVASION
-	jr BattleCommand_StatUp
-
-BattleCommand_AttackUp2: ; 361c8
-; attackup2
-	ld b, $10 | ATTACK
-	jr BattleCommand_StatUp
-
-BattleCommand_DefenseUp2: ; 361cc
-; defenseup2
-	ld b, $10 | DEFENSE
-	jr BattleCommand_StatUp
-
-BattleCommand_SpeedUp2: ; 361d0
-; speedup2
-	ld b, $10 | SPEED
-	jr BattleCommand_StatUp
-
-BattleCommand_SpecialAttackUp2: ; 361d4
-; specialattackup2
-	ld b, $10 | SP_ATTACK
-	jr BattleCommand_StatUp
-
-BattleCommand_SpecialDefenseUp2: ; 361d8
-; specialdefenseup2
-	ld b, $10 | SP_DEFENSE
-	jr BattleCommand_StatUp
-
-BattleCommand_AccuracyUp2: ; 361dc
-; accuracyup2
-	ld b, $10 | ACCURACY
-	jr BattleCommand_StatUp
-
-BattleCommand_EvasionUp2: ; 361e0
-; evasionup2
-	ld b, $10 | EVASION
-	jr BattleCommand_StatUp
-
-BattleCommand_StatUp: ; 361e4
-; statup
-	call CheckIfStatCanBeRaised
-	ld a, [FailedMessage]
-	and a
-	ret nz
-	jp StatUpAnimation
-
-; 361ef
-
-
-CheckIfStatCanBeRaised: ; 361ef
-	ld a, b
-	ld [LoweredStat], a
-	ld hl, PlayerStatLevels
-	ld a, [hBattleTurn]
-	and a
-	jr z, .got_stat_levels
-	ld hl, EnemyStatLevels
-.got_stat_levels
-	ld a, [AttackMissed]
-	and a
-	jp nz, .stat_raise_failed
-	ld a, [EffectFailed]
-	and a
-	jp nz, .stat_raise_failed
-	ld a, [LoweredStat]
-	and $f
-	ld c, a
-	ld b, 0
-	add hl, bc
-	ld b, [hl]
-	inc b
-	ld a, $d
-	cp b
-	jp c, .cant_raise_stat
-	ld a, [LoweredStat]
-	and $f0
-	jr z, .got_num_stages
-	inc b
-	ld a, $d
-	cp b
-	jr nc, .got_num_stages
-	ld b, a
-.got_num_stages
-	ld [hl], b
-	push hl
-	ld a, c
-	cp $5
-	jr nc, .done_calcing_stats
-	ld hl, BattleMonStats + 1
-	ld de, PlayerStats
-	ld a, [hBattleTurn]
-	and a
-	jr z, .got_stats_pointer
-	ld hl, EnemyMonStats + 1
-	ld de, EnemyStats
-.got_stats_pointer
-	push bc
-	sla c
-	ld b, 0
-	add hl, bc
-	ld a, c
-	add e
-	ld e, a
-	jr nc, .no_carry
-	inc d
-.no_carry
-	pop bc
-	ld a, [hld]
-	sub LOW(MAX_STAT_VALUE)
-	jr nz, .not_already_max
-	ld a, [hl]
-	sbc HIGH(MAX_STAT_VALUE)
-	jp z, .stats_already_max
-.not_already_max
-	ld a, [hBattleTurn]
-	and a
-	jr z, .calc_player_stats
-	call CalcEnemyStats
-	jr .done_calcing_stats
-
-.calc_player_stats
-	call CalcPlayerStats
-.done_calcing_stats
-	pop hl
-	xor a
-	ld [FailedMessage], a
-	ret
-
-; 3626e
-
-
-.stats_already_max ; 3626e
-	pop hl
-	dec [hl]
-	; fallthrough
-; 36270
-
-
-.cant_raise_stat ; 36270
-	ld a, $2
-	ld [FailedMessage], a
-	ld a, $1
-	ld [AttackMissed], a
-	ret
-
-; 3627b
-
-
-.stat_raise_failed ; 3627b
-	ld a, $1
-	ld [FailedMessage], a
-	ret
-
-; 36281
-
-
-StatUpAnimation: ; 36281
-	ld bc, wPlayerMinimized
-	ld hl, DropPlayerSub
-	ld a, [hBattleTurn]
-	and a
-	jr z, .do_player
-	ld bc, wEnemyMinimized
-	ld hl, DropEnemySub
-.do_player
-	ld a, BATTLE_VARS_MOVE_ANIM
-	call GetBattleVar
-	cp MINIMIZE
-	ret nz
-
-	ld a, $1
-	ld [bc], a
-	call _CheckBattleScene
-	ret nc
-
-	xor a
-	ld [hBGMapMode], a
-	call CallBattleCore
-	call WaitBGMap
-	jp BattleCommand_MoveDelay
-
-; 362ad
-
-
-BattleCommand_AttackDown: ; 362ad
-; attackdown
-	ld a, ATTACK
-	jr BattleCommand_StatDown
-
-BattleCommand_DefenseDown: ; 362b1
-; defensedown
-	ld a, DEFENSE
-	jr BattleCommand_StatDown
-
-BattleCommand_SpeedDown: ; 362b5
-; speeddown
-	ld a, SPEED
-	jr BattleCommand_StatDown
-
-BattleCommand_SpecialAttackDown: ; 362b9
-; specialattackdown
-	ld a, SP_ATTACK
-	jr BattleCommand_StatDown
-
-BattleCommand_SpecialDefenseDown: ; 362bd
-; specialdefensedown
-	ld a, SP_DEFENSE
-	jr BattleCommand_StatDown
-
-BattleCommand_AccuracyDown: ; 362c1
-; accuracydown
-	ld a, ACCURACY
-	jr BattleCommand_StatDown
-
-BattleCommand_EvasionDown: ; 362c5
-; evasiondown
-	ld a, EVASION
-	jr BattleCommand_StatDown
-
-BattleCommand_AttackDown2: ; 362c9
-; attackdown2
-	ld a, $10 | ATTACK
-	jr BattleCommand_StatDown
-
-BattleCommand_DefenseDown2: ; 362cd
-; defensedown2
-	ld a, $10 | DEFENSE
-	jr BattleCommand_StatDown
-
-BattleCommand_SpeedDown2: ; 362d1
-; speeddown2
-	ld a, $10 | SPEED
-	jr BattleCommand_StatDown
-
-BattleCommand_SpecialAttackDown2: ; 362d5
-; specialattackdown2
-	ld a, $10 | SP_ATTACK
-	jr BattleCommand_StatDown
-
-BattleCommand_SpecialDefenseDown2: ; 362d9
-; specialdefensedown2
-	ld a, $10 | SP_DEFENSE
-	jr BattleCommand_StatDown
-
-BattleCommand_AccuracyDown2: ; 362dd
-; accuracydown2
-	ld a, $10 | ACCURACY
-	jr BattleCommand_StatDown
-
-BattleCommand_EvasionDown2: ; 362e1
-; evasiondown2
-	ld a, $10 | EVASION
-
-BattleCommand_StatDown: ; 362e3
-; statdown
-
-	ld [LoweredStat], a
-
-	call CheckMist
-	jp nz, .Mist
-
-	ld hl, EnemyStatLevels
-	ld a, [hBattleTurn]
-	and a
-	jr z, .GetStatLevel
-	ld hl, PlayerStatLevels
-
-.GetStatLevel:
-; Attempt to lower the stat.
-	ld a, [LoweredStat]
-	and $f
-	ld c, a
-	ld b, 0
-	add hl, bc
-	ld b, [hl]
-	dec b
-	jp z, .CantLower
-
-; Sharply lower the stat if applicable.
-	ld a, [LoweredStat]
-	and $f0
-	jr z, .ComputerMiss
-	dec b
-	jr nz, .ComputerMiss
-	inc b
-
-.ComputerMiss:
-; Computer opponents have a 1/4 chance of failing.
-	ld a, [hBattleTurn]
-	and a
-	jr z, .DidntMiss
-
-	ld a, [wLinkMode]
-	and a
-	jr nz, .DidntMiss
-
-	ld a, [InBattleTowerBattle]
-	and a
-	jr nz, .DidntMiss
-
-; Lock-On still always works.
-	ld a, [PlayerSubStatus5]
-	bit SUBSTATUS_LOCK_ON, a
-	jr nz, .DidntMiss
-
-; Attacking moves that also lower accuracy are unaffected.
-	ld a, BATTLE_VARS_MOVE_EFFECT
-	call GetBattleVar
-	cp EFFECT_ACCURACY_DOWN_HIT
-	jr z, .DidntMiss
-
-	call BattleRandom
-	cp $40
-	jr c, .Failed
-
-.DidntMiss:
-	call CheckSubstituteOpp
-	jr nz, .Failed
-
-	ld a, [AttackMissed]
-	and a
-	jr nz, .Failed
-
-	ld a, [EffectFailed]
-	and a
-	jr nz, .Failed
-
-	call CheckHiddenOpponent
-	jr nz, .Failed
-
-; Accuracy/Evasion reduction don't involve stats.
-	ld [hl], b
-	ld a, c
-	cp ACCURACY
-	jr nc, .Hit
-
-	push hl
-	ld hl, EnemyMonAttack + 1
-	ld de, EnemyStats
-	ld a, [hBattleTurn]
-	and a
-	jr z, .do_enemy
-	ld hl, BattleMonAttack + 1
-	ld de, PlayerStats
-.do_enemy
-	call TryLowerStat
-	pop hl
-	jr z, .CouldntLower
-
-.Hit:
-	xor a
-	ld [FailedMessage], a
-	ret
-
-.CouldntLower:
-	inc [hl]
-.CantLower:
-	ld a, 3
-	ld [FailedMessage], a
-	ld a, 1
-	ld [AttackMissed], a
-	ret
-
-.Failed:
-	ld a, 1
-	ld [FailedMessage], a
-	ld [AttackMissed], a
-	ret
-
-.Mist:
-	ld a, 2
-	ld [FailedMessage], a
-	ld a, 1
-	ld [AttackMissed], a
-	ret
-
-; 36391
-
-
-CheckMist: ; 36391
-	ld a, BATTLE_VARS_MOVE_EFFECT
-	call GetBattleVar
-	cp EFFECT_ATTACK_DOWN
-	jr c, .dont_check_mist
-	cp EFFECT_EVASION_DOWN + 1
-	jr c, .check_mist
-	cp EFFECT_ATTACK_DOWN_2
-	jr c, .dont_check_mist
-	cp EFFECT_EVASION_DOWN_2 + 1
-	jr c, .check_mist
-	cp EFFECT_ATTACK_DOWN_HIT
-	jr c, .dont_check_mist
-	cp EFFECT_EVASION_DOWN_HIT + 1
-	jr c, .check_mist
-.dont_check_mist
-	xor a
-	ret
-
-.check_mist
-	ld a, BATTLE_VARS_SUBSTATUS4_OPP
-	call GetBattleVar
-	bit SUBSTATUS_MIST, a
-	ret
-
-; 363b8
-
-
-BattleCommand_StatUpMessage: ; 363b8
-	ld a, [FailedMessage]
-	and a
-	ret nz
-	ld a, [LoweredStat]
-	and $f
-	ld b, a
-	inc b
-	call GetStatName
-	ld hl, .stat
-	jp BattleTextBox
-
-.stat
-	text_jump UnknownText_0x1c0cc6
-	start_asm
-	ld hl, .up
-	ld a, [LoweredStat]
-	and $f0
-	ret z
-	ld hl, .wayup
-	ret
-
-.wayup
-	text_jump UnknownText_0x1c0cd0
-	db "@"
-
-.up
-	text_jump UnknownText_0x1c0ce0
-	db "@"
-
-; 363e9
-
-
-BattleCommand_StatDownMessage: ; 363e9
-	ld a, [FailedMessage]
-	and a
-	ret nz
-	ld a, [LoweredStat]
-	and $f
-	ld b, a
-	inc b
-	call GetStatName
-	ld hl, .stat
-	jp BattleTextBox
-
-.stat
-	text_jump UnknownText_0x1c0ceb
-	start_asm
-	ld hl, .fell
-	ld a, [LoweredStat]
-	and $f0
-	ret z
-	ld hl, .sharplyfell
-	ret
-
-.sharplyfell
-	text_jump UnknownText_0x1c0cf5
-	db "@"
-.fell
-	text_jump UnknownText_0x1c0d06
-	db "@"
-
-; 3641a
-
-
-TryLowerStat: ; 3641a
-; Lower stat c from stat struct hl (buffer de).
-
-	push bc
-	sla c
-	ld b, 0
-	add hl, bc
-	; add de, c
-	ld a, c
-	add e
-	ld e, a
-	jr nc, .no_carry
-	inc d
-.no_carry
-	pop bc
-
-; The lowest possible stat is 1.
-	ld a, [hld]
-	sub 1
-	jr nz, .not_min
-	ld a, [hl]
-	and a
-	ret z
-
-.not_min
-	ld a, [hBattleTurn]
-	and a
-	jr z, .Player
-
-	call BattleCommand_SwitchTurn
-	call CalcPlayerStats
-	call BattleCommand_SwitchTurn
-	jr .end
-
-.Player:
-	call BattleCommand_SwitchTurn
-	call CalcEnemyStats
-	call BattleCommand_SwitchTurn
-.end
-	ld a, 1
-	and a
-	ret
-
-; 3644c
-
-
-BattleCommand_StatUpFailText: ; 3644c
-; statupfailtext
-	ld a, [FailedMessage]
-	and a
-	ret z
-	push af
-	call BattleCommand_MoveDelay
-	pop af
-	dec a
-	jp z, TryPrintButItFailed
-	ld a, [LoweredStat]
-	and $f
-	ld b, a
-	inc b
-	call GetStatName
-	ld hl, WontRiseAnymoreText
-	jp StdBattleTextBox
-
-; 3646a
-
-
-BattleCommand_StatDownFailText: ; 3646a
-; statdownfailtext
-	ld a, [FailedMessage]
-	and a
-	ret z
-	push af
-	call BattleCommand_MoveDelay
-	pop af
-	dec a
-	jp z, TryPrintButItFailed
-	dec a
-	ld hl, ProtectedByMistText
-	jp z, StdBattleTextBox
-	ld a, [LoweredStat]
-	and $f
-	ld b, a
-	inc b
-	call GetStatName
-	ld hl, WontDropAnymoreText
-	jp StdBattleTextBox
-
-; 3648f
-
-
-GetStatName: ; 3648f
-	ld hl, .names
-	ld c, "@"
-.CheckName:
-	dec b
-	jr z, .Copy
-.GetName:
-	ld a, [hli]
-	cp c
-	jr z, .CheckName
-	jr .GetName
-
-.Copy:
-	ld de, StringBuffer2
-	ld bc, StringBuffer3 - StringBuffer2
-	jp CopyBytes
-
-.names
-	db "ATTACK@"
-	db "DEFENSE@"
-	db "SPEED@"
-	db "SPCL.ATK@"
-	db "SPCL.DEF@"
-	db "ACCURACY@"
-	db "EVASION@"
-	db "ABILITY@"
-; 364e6
-
-
-StatLevelMultipliers: ; 364e6
-	db 25, 100 ; 0.25x
-	db 28, 100 ; 0.28x
-	db 33, 100 ; 0.33x
-	db 40, 100 ; 0.40x
-	db 50, 100 ; 0.50x
-	db 66, 100 ; 0.66x
-	db  1,   1 ; 1.00x
-	db 15,  10 ; 1.50x
-	db  2,   1 ; 2.00x
-	db 25,  10 ; 2.50x
-	db  3,   1 ; 3.00x
-	db 35,  10 ; 3.50x
-	db  4,   1 ; 4.00x
-; 36500
-
-
-BattleCommand_AllStatsUp: ; 36500
-; allstatsup
-
-; Attack
-	call ResetMiss
-	call BattleCommand_AttackUp
-	call BattleCommand_StatUpMessage
-
-; Defense
-	call ResetMiss
-	call BattleCommand_DefenseUp
-	call BattleCommand_StatUpMessage
-
-; Speed
-	call ResetMiss
-	call BattleCommand_SpeedUp
-	call BattleCommand_StatUpMessage
-
-; Special Attack
-	call ResetMiss
-	call BattleCommand_SpecialAttackUp
-	call BattleCommand_StatUpMessage
-
-; Special Defense
-	call ResetMiss
-	call BattleCommand_SpecialDefenseUp
-	jp   BattleCommand_StatUpMessage
-; 3652d
-
-
-ResetMiss: ; 3652d
-	xor a
-	ld [AttackMissed], a
-	ret
-
-; 36532
-
-
-LowerStat: ; 36532
-	ld [LoweredStat], a
-
-	ld hl, PlayerStatLevels
-	ld a, [hBattleTurn]
-	and a
-	jr z, .got_target
-	ld hl, EnemyStatLevels
-
-.got_target
-	ld a, [LoweredStat]
-	and $f
-	ld c, a
-	ld b, 0
-	add hl, bc
-	ld b, [hl]
-	dec b
-	jr z, .cant_lower_anymore
-
-	ld a, [LoweredStat]
-	and $f0
-	jr z, .got_num_stages
-	dec b
-	jr nz, .got_num_stages
-	inc b
-
-.got_num_stages
-	ld [hl], b
-	ld a, c
-	cp 5
-	jr nc, .accuracy_evasion
-
-	push hl
-	ld hl, BattleMonStats + 1
-	ld de, PlayerStats
-	ld a, [hBattleTurn]
-	and a
-	jr z, .got_target_2
-	ld hl, EnemyMonStats + 1
-	ld de, EnemyStats
-
-.got_target_2
-	call TryLowerStat
-	pop hl
-	jr z, .failed
-
-.accuracy_evasion
-	ld a, [hBattleTurn]
-	and a
-	jr z, .player
-
-	call CalcEnemyStats
-
-	jr .finish
-
-.player
-	call CalcPlayerStats
-
-.finish
-	xor a
-	ld [FailedMessage], a
-	ret
-
-.failed
-	inc [hl]
-
-.cant_lower_anymore
-	ld a, 2
-	ld [FailedMessage], a
-	ret
-
-; 3658f
-
-
-BattleCommand_TriStatusChance: ; 3658f
-; tristatuschance
-
-	call BattleCommand_EffectChance
-
-; 1/3 chance of each status
-.loop
-	call BattleRandom
-	swap a
-	and 3
-	jr z, .loop
-; jump
-	dec a
-	ld hl, .ptrs
-	rst JumpTable
-	ret
-
-.ptrs
-	dw BattleCommand_ParalyzeTarget ; paralyze
-	dw BattleCommand_FreezeTarget ; freeze
-	dw BattleCommand_BurnTarget ; burn
-; 365a7
-
-
-BattleCommand_Curl: ; 365a7
-; curl
-	ld a, BATTLE_VARS_SUBSTATUS2
-	call GetBattleVarAddr
-	set SUBSTATUS_CURLED, [hl]
-	ret
-
-; 365af
-
-
-BattleCommand_RaiseSubNoAnim: ; 365af
-	ld hl, GetBattleMonBackpic
-	ld a, [hBattleTurn]
-	and a
-	jr z, .PlayerTurn
-	ld hl, GetEnemyMonFrontpic
-.PlayerTurn:
-	xor a
-	ld [hBGMapMode], a
-	call CallBattleCore
-	jp WaitBGMap
-
-; 365c3
-
-
-BattleCommand_LowerSubNoAnim: ; 365c3
-	ld hl, DropPlayerSub
-	ld a, [hBattleTurn]
-	and a
-	jr z, .PlayerTurn
-	ld hl, DropEnemySub
-.PlayerTurn:
-	xor a
-	ld [hBGMapMode], a
-	call CallBattleCore
-	jp WaitBGMap
-
-; 365d7
-
-
-CalcPlayerStats: ; 365d7
-	ld hl, PlayerAtkLevel
-	ld de, PlayerStats
-	ld bc, BattleMonAttack
-
-	ld a, 5
-	call CalcStats
-
-	ld hl, BadgeStatBoosts
-	call CallBattleCore
-
-	call BattleCommand_SwitchTurn
-
-	ld hl, ApplyPrzEffectOnSpeed
-	call CallBattleCore
-
-	ld hl, ApplyBrnEffectOnAttack
-	call CallBattleCore
-
-	jp BattleCommand_SwitchTurn
-
-; 365fd
-
-
-CalcEnemyStats: ; 365fd
-	ld hl, EnemyAtkLevel
-	ld de, EnemyStats
-	ld bc, EnemyMonAttack
-
-	ld a, 5
-	call CalcStats
-
-	call BattleCommand_SwitchTurn
-
-	ld hl, ApplyPrzEffectOnSpeed
-	call CallBattleCore
-
-	ld hl, ApplyBrnEffectOnAttack
-	call CallBattleCore
-
-	jp BattleCommand_SwitchTurn
-
-; 3661d
-
-
-CalcStats: ; 3661d
-.loop
-	push af
-	ld a, [hli]
-	push hl
-	push bc
-
-	ld c, a
-	dec c
-	ld b, 0
-	ld hl, StatLevelMultipliers
-	add hl, bc
-	add hl, bc
-
-	xor a
-	ld [hMultiplicand + 0], a
-	ld a, [de]
-	ld [hMultiplicand + 1], a
-	inc de
-	ld a, [de]
-	ld [hMultiplicand + 2], a
-	inc de
-
-	ld a, [hli]
-	ld [hMultiplier], a
-	call Multiply
-
-	ld a, [hl]
-	ld [hDivisor], a
-	ld b, 4
-	call Divide
-
-	ld a, [hQuotient + 1]
-	ld b, a
-	ld a, [hQuotient + 2]
-	or b
-	jr nz, .check_maxed_out
-
-	ld a, 1
-	ld [hQuotient + 2], a
-	jr .not_maxed_out
-
-.check_maxed_out
-	ld a, [hQuotient + 2]
-	cp LOW(MAX_STAT_VALUE)
-	ld a, b
-	sbc HIGH(MAX_STAT_VALUE)
-	jr c, .not_maxed_out
-
-	ld a, LOW(MAX_STAT_VALUE)
-	ld [hQuotient + 2], a
-	ld a, HIGH(MAX_STAT_VALUE)
-	ld [hQuotient + 1], a
-
-.not_maxed_out
-	pop bc
-	ld a, [hQuotient + 1]
-	ld [bc], a
-	inc bc
-	ld a, [hQuotient + 2]
-	ld [bc], a
-	inc bc
-	pop hl
-	pop af
-	dec a
-	jr nz, .loop
-
-	ret
-
-; 36671
-
-
-BattleCommand_StoreEnergy: ; 36671
-; storeenergy
-
-	ld a, BATTLE_VARS_SUBSTATUS3
-	call GetBattleVar
-	bit SUBSTATUS_BIDE, a
-	ret z
-
-	ld hl, PlayerRolloutCount
-	ld a, [hBattleTurn]
-	and a
-	jr z, .check_still_storing_energy
-	ld hl, EnemyRolloutCount
-.check_still_storing_energy
-	dec [hl]
-	jr nz, .still_storing
-
-	ld a, BATTLE_VARS_SUBSTATUS3
-	call GetBattleVarAddr
-	res SUBSTATUS_BIDE, [hl]
-
-	ld hl, UnleashedEnergyText
-	call StdBattleTextBox
-
-	ld a, BATTLE_VARS_MOVE_POWER
-	call GetBattleVarAddr
-	ld a, 1
-	ld [hl], a
-	ld hl, PlayerDamageTaken + 1
-	ld de, wPlayerCharging ; player
-	ld a, [hBattleTurn]
-	and a
-	jr z, .player
-	ld hl, EnemyDamageTaken + 1
-	ld de, wEnemyCharging ; enemy
-.player
-	ld a, [hld]
-	add a
-	ld b, a
-	ld [CurDamage + 1], a
-	ld a, [hl]
-	rl a
-	ld [CurDamage], a
-	jr nc, .not_maxed
-	ld a, $ff
-	ld [CurDamage], a
-	ld [CurDamage + 1], a
-.not_maxed
-	or b
-	jr nz, .built_up_something
-	ld a, 1
-	ld [AttackMissed], a
-.built_up_something
-	xor a
-	ld [hli], a
-	ld [hl], a
-	ld [de], a
-
-	ld a, BATTLE_VARS_MOVE_ANIM
-	call GetBattleVarAddr
-	ld a, BIDE
-	ld [hl], a
-
-	ld b, unleashenergy_command
-	jp SkipToBattleCommand
-
-.still_storing
-	ld hl, StoringEnergyText
-	call StdBattleTextBox
-	jp EndMoveEffect
-
-; 366e5
-
-
-BattleCommand_UnleashEnergy: ; 366e5
-; unleashenergy
-
-	ld de, PlayerDamageTaken
-	ld bc, PlayerRolloutCount
-	ld a, [hBattleTurn]
-	and a
-	jr z, .got_damage
-	ld de, EnemyDamageTaken
-	ld bc, EnemyRolloutCount
-.got_damage
-	ld a, BATTLE_VARS_SUBSTATUS3
-	call GetBattleVarAddr
-	set SUBSTATUS_BIDE, [hl]
-	xor a
-	ld [de], a
-	inc de
-	ld [de], a
-	ld [wPlayerMoveStructEffect], a
-	ld [wEnemyMoveStructEffect], a
-	call BattleRandom
-	and 1
-	inc a
-	inc a
-	ld [bc], a
-	ld a, 1
-	ld [wKickCounter], a
-	call AnimateCurrentMove
-	jp EndMoveEffect
-
-; 3671a
-
-
-BattleCommand_CheckRampage: ; 3671a
-; checkrampage
-
-	ld de, PlayerRolloutCount
-	ld a, [hBattleTurn]
-	and a
-	jr z, .player
-	ld de, EnemyRolloutCount
-.player
-	ld a, BATTLE_VARS_SUBSTATUS3
-	call GetBattleVarAddr
-	bit SUBSTATUS_RAMPAGE, [hl]
-	ret z
-	ld a, [de]
-	dec a
-	ld [de], a
-	jr nz, .continue_rampage
-
-	res SUBSTATUS_RAMPAGE, [hl]
-	call BattleCommand_SwitchTurn
-	call SafeCheckSafeguard
-	push af
-	call BattleCommand_SwitchTurn
-	pop af
-	jr nz, .continue_rampage
-
-	set SUBSTATUS_CONFUSED, [hl]
-	call BattleRandom
-	and %00000001
-	inc a
-	inc a
-	inc de ; ConfuseCount
-	ld [de], a
-.continue_rampage
-	ld b, rampage_command
-	jp SkipToBattleCommand
-
-; 36751
-
-
-BattleCommand_Rampage: ; 36751
-; rampage
-
-; No rampage during Sleep Talk.
-	ld a, BATTLE_VARS_STATUS
-	call GetBattleVar
-	and SLP
-	ret nz
-
-	ld de, PlayerRolloutCount
-	ld a, [hBattleTurn]
-	and a
-	jr z, .ok
-	ld de, EnemyRolloutCount
-.ok
-	ld a, BATTLE_VARS_SUBSTATUS3
-	call GetBattleVarAddr
-	set SUBSTATUS_RAMPAGE, [hl]
-; Rampage for 1 or 2 more turns
-	call BattleRandom
-	and %00000001
-	inc a
-	ld [de], a
-	ld a, 1
-	ld [wSomeoneIsRampaging], a
-	ret
-
-; 36778
-
-
-BattleCommand_Teleport: ; 36778
-; teleport
-
-	ld a, [BattleType]
-	cp BATTLETYPE_SHINY
-	jr z, .failed
-	cp BATTLETYPE_TRAP
-	jr z, .failed
-	cp BATTLETYPE_CELEBI
-	jr z, .failed
-	cp BATTLETYPE_SUICUNE
-	jr z, .failed
-
-	ld a, BATTLE_VARS_SUBSTATUS5_OPP
-	call GetBattleVar
-	bit SUBSTATUS_CANT_RUN, a
-	jr nz, .failed
-; Only need to check these next things if it's your turn
-	ld a, [hBattleTurn]
-	and a
-	jr nz, .enemy_turn
-; Can't teleport from a trainer battle
-	ld a, [wBattleMode]
-	dec a
-	jr nz, .failed
-; If your level is greater than the opponent's, you run without fail.
-	ld a, [CurPartyLevel]
-	ld b, a
-	ld a, [BattleMonLevel]
-	cp b
-	jr nc, .run_away
-; Generate a number between 0 and (YourLevel + TheirLevel).
-	add b
-	ld c, a
-	inc c
-.loop_player
-	call BattleRandom
-	cp c
-	jr nc, .loop_player
-; If that number is greater than 4 times your level, run away.
-	srl b
-	srl b
-	cp b
-	jr nc, .run_away
-
-.failed
-	call AnimateFailedMove
-	jp PrintButItFailed
-
-.enemy_turn
-	ld a, [wBattleMode]
-	dec a
-	jr nz, .failed
-	ld a, [BattleMonLevel]
-	ld b, a
-	ld a, [CurPartyLevel]
-	cp b
-	jr nc, .run_away
-	add b
-	ld c, a
-	inc c
-.loop_enemy
-	call BattleRandom
-	cp c
-	jr nc, .loop_enemy
-	srl b
-	srl b
-	cp b
-	; This does the wrong thing. What was
-	; probably intended was jr c, .failed
-	; The way this is made makes enemy use
-	; of Teleport always succeed if able
-	jr nc, .run_away
-.run_away
-	call UpdateBattleMonInParty
-	xor a
-	ld [wNumHits], a
-	inc a
-	ld [wForcedSwitch], a
-	ld [wKickCounter], a
-	call SetBattleDraw
-	call BattleCommand_LowerSub
-	call LoadMoveAnim
-	ld c, 20
-	call DelayFrames
-	call SetBattleDraw
-
-	ld hl, FledFromBattleText
-	jp StdBattleTextBox
-
-; 36804
-
-
-SetBattleDraw: ; 36804
-	ld a, [wBattleResult]
-	and $c0
-	or $2
-	ld [wBattleResult], a
-	ret
-
-; 3680f
-
-
-BattleCommand_ForceSwitch: ; 3680f
-; forceswitch
-
-	ld a, [BattleType]
-	cp BATTLETYPE_SHINY
-	jp z, .fail
-	cp BATTLETYPE_TRAP
-	jp z, .fail
-	cp BATTLETYPE_CELEBI
-	jp z, .fail
-	cp BATTLETYPE_SUICUNE
-	jp z, .fail
-	ld a, [hBattleTurn]
-	and a
-	jp nz, .force_player_switch
-	ld a, [AttackMissed]
-	and a
-	jr nz, .missed
-	ld a, [wBattleMode]
-	dec a
-	jr nz, .trainer
-	ld a, [CurPartyLevel]
-	ld b, a
-	ld a, [BattleMonLevel]
-	cp b
-	jr nc, .wild_force_flee
-	add b
-	ld c, a
-	inc c
-.random_loop_wild
-	call BattleRandom
-	cp c
-	jr nc, .random_loop_wild
-	srl b
-	srl b
-	cp b
-	jr nc, .wild_force_flee
-.missed
-	jp .fail
-
-.wild_force_flee
-	call UpdateBattleMonInParty
-	xor a
-	ld [wNumHits], a
-	inc a
-	ld [wForcedSwitch], a
-	call SetBattleDraw
-	ld a, [wPlayerMoveStructAnimation]
-	jp .succeed
-
-.trainer
-	call FindAliveEnemyMons
-	jr c, .switch_fail
-	ld a, [wEnemyGoesFirst]
-	and a
-	jr z, .switch_fail
-	call UpdateEnemyMonInParty
-	ld a, $1
-	ld [wKickCounter], a
-	call AnimateCurrentMove
-	ld c, $14
-	call DelayFrames
-	hlcoord 1, 0
-	lb bc, 4, 10
-	call ClearBox
-	ld c, 20
-	call DelayFrames
-	ld a, [OTPartyCount]
-	ld b, a
-	ld a, [CurOTMon]
-	ld c, a
-; select a random enemy mon to switch to
-.random_loop_trainer
-	call BattleRandom
-	and $7
-	cp b
-	jr nc, .random_loop_trainer
-	cp c
-	jr z, .random_loop_trainer
-	push af
-	push bc
-	ld hl, OTPartyMon1HP
-	call GetPartyLocation
-	ld a, [hli]
-	or [hl]
-	pop bc
-	pop de
-	jr z, .random_loop_trainer
-	ld a, d
-	inc a
-	ld [wEnemySwitchMonIndex], a
-	callfar ForceEnemySwitch
-
-	ld hl, DraggedOutText
-	call StdBattleTextBox
-
-	ld hl, SpikesDamage
-	jp CallBattleCore
-
-.switch_fail
-	jp .fail
-
-.force_player_switch
-	ld a, [AttackMissed]
-	and a
-	jr nz, .player_miss
-
-	ld a, [wBattleMode]
-	dec a
-	jr nz, .vs_trainer
-
-	ld a, [BattleMonLevel]
-	ld b, a
-	ld a, [CurPartyLevel]
-	cp b
-	jr nc, .wild_succeed_playeristarget
-
-	add b
-	ld c, a
-	inc c
-.wild_random_loop_playeristarget
-	call BattleRandom
-	cp c
-	jr nc, .wild_random_loop_playeristarget
-
-	srl b
-	srl b
-	cp b
-	jr nc, .wild_succeed_playeristarget
-
-.player_miss
-	jr .fail
-
-.wild_succeed_playeristarget
-	call UpdateBattleMonInParty
-	xor a
-	ld [wNumHits], a
-	inc a
-	ld [wForcedSwitch], a
-	call SetBattleDraw
-	ld a, [wEnemyMoveStructAnimation]
-	jr .succeed
-
-.vs_trainer
-	call CheckPlayerHasMonToSwitchTo
-	jr c, .fail
-
-	ld a, [wEnemyGoesFirst]
-	cp $1
-	jr z, .switch_fail
-
-	call UpdateBattleMonInParty
-	ld a, $1
-	ld [wKickCounter], a
-	call AnimateCurrentMove
-	ld c, 20
-	call DelayFrames
-	hlcoord 9, 7
-	lb bc, 5, 11
-	call ClearBox
-	ld c, 20
-	call DelayFrames
-	ld a, [PartyCount]
-	ld b, a
-	ld a, [CurBattleMon]
-	ld c, a
-.random_loop_trainer_playeristarget
-	call BattleRandom
-	and $7
-	cp b
-	jr nc, .random_loop_trainer_playeristarget
-
-	cp c
-	jr z, .random_loop_trainer_playeristarget
-
-	push af
-	push bc
-	ld hl, PartyMon1HP
-	call GetPartyLocation
-	ld a, [hli]
-	or [hl]
-	pop bc
-	pop de
-	jr z, .random_loop_trainer_playeristarget
-
-	ld a, d
-	ld [CurPartyMon], a
-	ld hl, SwitchPlayerMon
-	call CallBattleCore
-
-	ld hl, DraggedOutText
-	call StdBattleTextBox
-
-	ld hl, SpikesDamage
-	jp CallBattleCore
-
-.fail
-	call BattleCommand_LowerSub
-	call BattleCommand_MoveDelay
-	call BattleCommand_RaiseSub
-	jp PrintButItFailed
-
-.succeed
-	push af
-	call SetBattleDraw
-	ld a, $1
-	ld [wKickCounter], a
-	call AnimateCurrentMove
-	ld c, 20
-	call DelayFrames
-	pop af
-
-	ld hl, FledInFearText
-	cp ROAR
-	jr z, .do_text
-	ld hl, BlownAwayText
-.do_text
-	jp StdBattleTextBox
-
-; 36994
-
-
-CheckPlayerHasMonToSwitchTo: ; 36994
-	ld a, [PartyCount]
-	ld d, a
-	ld e, 0
-	ld bc, PARTYMON_STRUCT_LENGTH
-.loop
-	ld a, [CurBattleMon]
-	cp e
-	jr z, .next
-
-	ld a, e
-	ld hl, PartyMon1HP
-	call AddNTimes
-	ld a, [hli]
-	or [hl]
-	jr nz, .not_fainted
-
-.next
-	inc e
-	dec d
-	jr nz, .loop
-
-	scf
-	ret
-
-.not_fainted
-	and a
-	ret
-
-; 369b6
-
-
-BattleCommand_EndLoop: ; 369b6
-; endloop
-
-; Loop back to the command before 'critical'.
-
-	ld de, PlayerRolloutCount
-	ld bc, PlayerDamageTaken
-	ld a, [hBattleTurn]
-	and a
-	jr z, .got_addrs
-	ld de, EnemyRolloutCount
-	ld bc, EnemyDamageTaken
-.got_addrs
-
-	ld a, BATTLE_VARS_SUBSTATUS3
-	call GetBattleVarAddr
-	bit SUBSTATUS_IN_LOOP, [hl]
-	jp nz, .in_loop
-	set SUBSTATUS_IN_LOOP, [hl]
-	ld a, BATTLE_VARS_MOVE_EFFECT
-	call GetBattleVarAddr
-	ld a, [hl]
-	cp EFFECT_POISON_MULTI_HIT
-	jr z, .twineedle
-	cp EFFECT_DOUBLE_HIT
-	ld a, 1
-	jr z, .double_hit
-	ld a, [hl]
-	cp EFFECT_BEAT_UP
-	jr z, .beat_up
-	cp EFFECT_TRIPLE_KICK
-	jr nz, .not_triple_kick
-.reject_triple_kick_sample
-	call BattleRandom
-	and $3
-	jr z, .reject_triple_kick_sample
-	dec a
-	jr nz, .double_hit
-	ld a, 1
-	ld [bc], a
-	jr .done_loop
-
-.beat_up
-	ld a, [hBattleTurn]
-	and a
-	jr nz, .check_ot_beat_up
-	ld a, [PartyCount]
-	cp 1
-	jp z, .only_one_beatup
-	dec a
-	jr .double_hit
-
-.check_ot_beat_up
-	ld a, [wBattleMode]
-	cp WILD_BATTLE
-	jp z, .only_one_beatup
-	ld a, [OTPartyCount]
-	cp 1
-	jp z, .only_one_beatup
-	dec a
-	jr .double_hit
-
-.only_one_beatup
-	ld a, BATTLE_VARS_SUBSTATUS3
-	call GetBattleVarAddr
-	res SUBSTATUS_IN_LOOP, [hl]
-	call BattleCommanda8
-	jp EndMoveEffect
-
-.not_triple_kick
-	call BattleRandom
-	and $3
-	cp 2
-	jr c, .got_number_hits
-	call BattleRandom
-	and $3
-.got_number_hits
-	inc a
-.double_hit
-	ld [de], a
-	inc a
-	ld [bc], a
-	jr .loop_back_to_critical
-
-.twineedle
-	ld a, 1
-	jr .double_hit
-
-.in_loop
-	ld a, [de]
-	dec a
-	ld [de], a
-	jr nz, .loop_back_to_critical
-.done_loop
-	ld a, BATTLE_VARS_SUBSTATUS3
-	call GetBattleVarAddr
-	res SUBSTATUS_IN_LOOP, [hl]
-
-	ld hl, PlayerHitTimesText
-	ld a, [hBattleTurn]
-	and a
-	jr z, .got_hit_n_times_text
-	ld hl, EnemyHitTimesText
-.got_hit_n_times_text
-
-	push bc
-	ld a, BATTLE_VARS_MOVE_EFFECT
-	call GetBattleVar
-	cp EFFECT_BEAT_UP
-	jr z, .beat_up_2
-	call StdBattleTextBox
-.beat_up_2
-
-	pop bc
-	xor a
-	ld [bc], a
-	ret
-
-; Loop back to the command before 'critical'.
-.loop_back_to_critical
-	ld a, [BattleScriptBufferAddress + 1]
-	ld h, a
-	ld a, [BattleScriptBufferAddress]
-	ld l, a
-.not_critical
-	ld a, [hld]
-	cp critical_command
-	jr nz, .not_critical
-	inc hl
-	ld a, h
-	ld [BattleScriptBufferAddress + 1], a
-	ld a, l
-	ld [BattleScriptBufferAddress], a
-	ret
-
-; 36a82
-
-
-BattleCommand_FakeOut: ; 36a82
-	ld a, [AttackMissed]
-	and a
-	ret nz
-
-	call CheckSubstituteOpp
-	jr nz, .fail
-
-	ld a, BATTLE_VARS_STATUS_OPP
-	call GetBattleVar
-	and 1 << FRZ | SLP
-	jr nz, .fail
-
-	call CheckOpponentWentFirst
-	jr z, FlinchTarget
-
-.fail
-	ld a, 1
-	ld [AttackMissed], a
-	ret
-
-; 36aa0
-
-
-BattleCommand_FlinchTarget: ; 36aa0
-	call CheckSubstituteOpp
-	ret nz
-
-	ld a, BATTLE_VARS_STATUS_OPP
-	call GetBattleVar
-	and 1 << FRZ | SLP
-	ret nz
-
-	call CheckOpponentWentFirst
-	ret nz
-
-	ld a, [EffectFailed]
-	and a
-	ret nz
-
-	; fallthrough
-; 36ab5
-
-
-FlinchTarget: ; 36ab5
-	ld a, BATTLE_VARS_SUBSTATUS3_OPP
-	call GetBattleVarAddr
-	set SUBSTATUS_FLINCHED, [hl]
-	jp EndRechargeOpp
-
-; 36abf
-
-
-CheckOpponentWentFirst: ; 36abf
-; Returns a=0, z if user went first
-; Returns a=1, nz if opponent went first
-	push bc
-	ld a, [wEnemyGoesFirst] ; 0 if player went first
-	ld b, a
-	ld a, [hBattleTurn] ; 0 if it's the player's turn
-	xor b ; 1 if opponent went first
-	pop bc
-	ret
-
-; 36ac9
-
-
-BattleCommand_HeldFlinch: ; 36ac9
-; kingsrock
-
-	ld a, [AttackMissed]
-	and a
-	ret nz
-
-	call GetUserItem
-	ld a, b
-	cp HELD_FLINCH
-	ret nz
-
-	call CheckSubstituteOpp
-	ret nz
-	ld a, BATTLE_VARS_MOVE_EFFECT
-	call GetBattleVarAddr
-	ld d, h
-	ld e, l
-	call GetUserItem
-	call BattleRandom
-	cp c
-	ret nc
-	call EndRechargeOpp
-	ld a, BATTLE_VARS_SUBSTATUS3_OPP
-	call GetBattleVarAddr
-	set SUBSTATUS_FLINCHED, [hl]
-	ret
-
-; 36af3
-
-
-BattleCommand_OHKO: ; 36af3
-; ohko
-
-	call ResetDamage
-	ld a, [TypeModifier]
-	and $7f
-	jr z, .no_effect
-	ld hl, EnemyMonLevel
-	ld de, BattleMonLevel
-	ld bc, wPlayerMoveStruct + MOVE_ACC
-	ld a, [hBattleTurn]
-	and a
-	jr z, .got_move_accuracy
-	push hl
-	ld h, d
-	ld l, e
-	pop de
-	ld bc, wEnemyMoveStruct + MOVE_ACC
-.got_move_accuracy
-	ld a, [de]
-	sub [hl]
-	jr c, .no_effect
-	add a
-	ld e, a
-	ld a, [bc]
-	add e
-	jr nc, .finish_ohko
-	ld a, $ff
-.finish_ohko
-	ld [bc], a
-	call BattleCommand_CheckHit
-	ld hl, CurDamage
-	ld a, $ff
-	ld [hli], a
-	ld [hl], a
-	ld a, $2
-	ld [CriticalHit], a
-	ret
-
-.no_effect
-	ld a, $ff
-	ld [CriticalHit], a
-	ld a, $1
-	ld [AttackMissed], a
-	ret
-
-; 36b3a
-
-
-BattleCommand_CheckCharge: ; 36b3a
-; checkcharge
-
-	ld a, BATTLE_VARS_SUBSTATUS3
-	call GetBattleVarAddr
-	bit SUBSTATUS_CHARGED, [hl]
-	ret z
-	res SUBSTATUS_CHARGED, [hl]
-	res SUBSTATUS_UNDERGROUND, [hl]
-	res SUBSTATUS_FLYING, [hl]
-	ld b, charge_command
-	jp SkipToBattleCommand
-
-; 36b4d
-
-
-BattleCommand_Charge: ; 36b4d
-; charge
-
-	call BattleCommand_ClearText
-	ld a, BATTLE_VARS_STATUS
-	call GetBattleVar
-	and SLP
-	jr z, .awake
-
-	call BattleCommand_MoveDelay
-	call BattleCommand_RaiseSub
-	call PrintButItFailed
-	jp EndMoveEffect
-
-.awake
-	ld a, BATTLE_VARS_SUBSTATUS3
-	call GetBattleVarAddr
-	set SUBSTATUS_CHARGED, [hl]
-
-	ld hl, IgnoredOrders2Text
-	ld a, [AlreadyDisobeyed]
-	and a
-	call nz, StdBattleTextBox
-
-	call BattleCommand_LowerSub
-	xor a
-	ld [wNumHits], a
-	inc a
-	ld [wKickCounter], a
-	call LoadMoveAnim
-	ld a, BATTLE_VARS_MOVE_ANIM
-	call GetBattleVar
-	cp FLY
-	jr z, .flying
-	cp DIG
-	jr z, .flying
-	call BattleCommand_RaiseSub
-	jr .not_flying
-
-.flying
-	call DisappearUser
-.not_flying
-	ld a, BATTLE_VARS_SUBSTATUS3
-	call GetBattleVarAddr
-	ld a, BATTLE_VARS_MOVE_ANIM
-	call GetBattleVar
-	ld b, a
-	cp FLY
-	jr z, .set_flying
-	cp DIG
-	jr nz, .dont_set_digging
-	set SUBSTATUS_UNDERGROUND, [hl]
-	jr .dont_set_digging
-
-.set_flying
-	set SUBSTATUS_FLYING, [hl]
-
-.dont_set_digging
-	call CheckUserIsCharging
-	jr nz, .mimic
-	ld a, BATTLE_VARS_LAST_COUNTER_MOVE
-	call GetBattleVarAddr
-	ld [hl], b
-	ld a, BATTLE_VARS_LAST_MOVE
-	call GetBattleVarAddr
-	ld [hl], b
-
-.mimic
-	call ResetDamage
-
-	ld hl, .UsedText
-	call BattleTextBox
-
-	ld a, BATTLE_VARS_MOVE_EFFECT
-	call GetBattleVar
-	cp EFFECT_SKULL_BASH
-	ld b, endturn_command
-	jp z, SkipToBattleCommand
-	jp EndMoveEffect
-
-.UsedText:
-	text_jump UnknownText_0x1c0d0e ; "[USER]"
-	start_asm
-	ld a, BATTLE_VARS_MOVE_ANIM
-	call GetBattleVar
-	cp RAZOR_WIND
-	ld hl, .RazorWind
-	jr z, .done
-
-	cp SOLARBEAM
-	ld hl, .Solarbeam
-	jr z, .done
-
-	cp SKULL_BASH
-	ld hl, .SkullBash
-	jr z, .done
-
-	cp SKY_ATTACK
-	ld hl, .SkyAttack
-	jr z, .done
-
-	cp FLY
-	ld hl, .Fly
-	jr z, .done
-
-	cp DIG
-	ld hl, .Dig
-
-.done
-	ret
-
-.RazorWind:
-; 'made a whirlwind!'
-	text_jump UnknownText_0x1c0d12
-	db "@"
-
-.Solarbeam:
-; 'took in sunlight!'
-	text_jump UnknownText_0x1c0d26
-	db "@"
-
-.SkullBash:
-; 'lowered its head!'
-	text_jump UnknownText_0x1c0d3a
-	db "@"
-
-.SkyAttack:
-; 'is glowing!'
-	text_jump UnknownText_0x1c0d4e
-	db "@"
-
-.Fly:
-; 'flew up high!'
-	text_jump UnknownText_0x1c0d5c
-	db "@"
-
-.Dig:
-; 'dug a hole!'
-	text_jump UnknownText_0x1c0d6c
-	db "@"
-; 36c2c
-
-
-BattleCommand3c: ; 36c2c
-; unused
-	ret
-
-; 36c2d
-
-
-BattleCommand_TrapTarget: ; 36c2d
-; traptarget
-
-	ld a, [AttackMissed]
-	and a
-	ret nz
-	ld hl, wEnemyWrapCount
-	ld de, wEnemyTrappingMove
-	ld a, [hBattleTurn]
-	and a
-	jr z, .got_trap
-	ld hl, wPlayerWrapCount
-	ld de, wPlayerTrappingMove
-
-.got_trap
-	ld a, [hl]
-	and a
-	ret nz
-	ld a, BATTLE_VARS_SUBSTATUS4_OPP
-	call GetBattleVar
-	bit SUBSTATUS_SUBSTITUTE, a
-	ret nz
-	call BattleRandom
-	and 3
-	inc a
-	inc a
-	inc a
-	ld [hl], a
-	ld a, BATTLE_VARS_MOVE_ANIM
-	call GetBattleVar
-	ld [de], a
-	ld b, a
-	ld hl, .Traps
-
-.find_trap_text
-	ld a, [hli]
-	cp b
-	jr z, .found_trap_text
-	inc hl
-	inc hl
-	jr .find_trap_text
-
-.found_trap_text
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	jp StdBattleTextBox
-
-.Traps:
-	dbw BIND,      UsedBindText      ; 'used BIND on'
-	dbw WRAP,      WrappedByText     ; 'was WRAPPED by'
-	dbw FIRE_SPIN, FireSpinTrapText  ; 'was trapped!'
-	dbw CLAMP,     ClampedByText     ; 'was CLAMPED by'
-	dbw WHIRLPOOL, WhirlpoolTrapText ; 'was trapped!'
-; 36c7e
-
-
-BattleCommand_Mist: ; 36c7e
-; mist
-
-	ld a, BATTLE_VARS_SUBSTATUS4
-	call GetBattleVarAddr
-	bit SUBSTATUS_MIST, [hl]
-	jr nz, .already_mist
-	set SUBSTATUS_MIST, [hl]
-	call AnimateCurrentMove
-	ld hl, MistText
-	jp StdBattleTextBox
-
-.already_mist
-	call AnimateFailedMove
-	jp PrintButItFailed
-
-; 36c98
-
-
-BattleCommand_FocusEnergy: ; 36c98
-; focusenergy
-
-	ld a, BATTLE_VARS_SUBSTATUS4
-	call GetBattleVarAddr
-	bit SUBSTATUS_FOCUS_ENERGY, [hl]
-	jr nz, .already_pumped
-	set SUBSTATUS_FOCUS_ENERGY, [hl]
-	call AnimateCurrentMove
-	ld hl, GettingPumpedText
-	jp StdBattleTextBox
-
-.already_pumped
-	call AnimateFailedMove
-	jp PrintButItFailed
-
-; 36cb2
-
-
-BattleCommand_Recoil: ; 36cb2
-; recoil
-
-	ld hl, BattleMonMaxHP
-	ld a, [hBattleTurn]
-	and a
-	jr z, .got_hp
-	ld hl, EnemyMonMaxHP
-.got_hp
-	ld a, BATTLE_VARS_MOVE_ANIM
-	call GetBattleVar
-	ld d, a
-; get 1/4 damage or 1 HP, whichever is higher
-	ld a, [CurDamage]
-	ld b, a
-	ld a, [CurDamage + 1]
-	ld c, a
-	srl b
-	rr c
-	srl b
-	rr c
-	ld a, b
-	or c
-	jr nz, .min_damage
-	inc c
-.min_damage
-	ld a, [hli]
-	ld [Buffer2], a
-	ld a, [hl]
-	ld [Buffer1], a
-	dec hl
-	dec hl
-	ld a, [hl]
-	ld [Buffer3], a
-	sub c
-	ld [hld], a
-	ld [Buffer5], a
-	ld a, [hl]
-	ld [Buffer4], a
-	sbc b
-	ld [hl], a
-	ld [Buffer6], a
-	jr nc, .dont_ko
-	xor a
-	ld [hli], a
-	ld [hl], a
-	ld hl, Buffer5
-	ld [hli], a
-	ld [hl], a
-.dont_ko
-	hlcoord 10, 9
-	ld a, [hBattleTurn]
-	and a
-	ld a, 1
-	jr z, .animate_hp_bar
-	hlcoord 2, 2
-	xor a
-.animate_hp_bar
-	ld [wWhichHPBar], a
-	predef AnimateHPBar
-	call RefreshBattleHuds
-	ld hl, RecoilText
-	jp StdBattleTextBox
-
-; 36d1d
-
-
-BattleCommand_ConfuseTarget: ; 36d1d
-; confusetarget
-
-	call GetOpponentItem
-	ld a, b
-	cp HELD_PREVENT_CONFUSE
-	ret z
-	ld a, [EffectFailed]
-	and a
-	ret nz
-	call SafeCheckSafeguard
-	ret nz
-	call CheckSubstituteOpp
-	ret nz
-	ld a, BATTLE_VARS_SUBSTATUS3_OPP
-	call GetBattleVarAddr
-	bit SUBSTATUS_CONFUSED, [hl]
-	ret nz
-	jr BattleCommand_FinishConfusingTarget
-
-
-BattleCommand_Confuse: ; 36d3b
-; confuse
-
-	call GetOpponentItem
-	ld a, b
-	cp HELD_PREVENT_CONFUSE
-	jr nz, .no_item_protection
-	ld a, [hl]
-	ld [wNamedObjectIndexBuffer], a
-	call GetItemName
-	call AnimateFailedMove
-	ld hl, ProtectedByText
-	jp StdBattleTextBox
-
-.no_item_protection
-	ld a, BATTLE_VARS_SUBSTATUS3_OPP
-	call GetBattleVarAddr
-	bit SUBSTATUS_CONFUSED, [hl]
-	jr z, .not_already_confused
-	call AnimateFailedMove
-	ld hl, AlreadyConfusedText
-	jp StdBattleTextBox
-
-.not_already_confused
-	call CheckSubstituteOpp
-	jr nz, BattleCommand_Confuse_CheckSnore_Swagger_ConfuseHit
-	ld a, [AttackMissed]
-	and a
-	jr nz, BattleCommand_Confuse_CheckSnore_Swagger_ConfuseHit
-BattleCommand_FinishConfusingTarget: ; 36d70
-	ld bc, EnemyConfuseCount
-	ld a, [hBattleTurn]
-	and a
-	jr z, .got_confuse_count
-	ld bc, PlayerConfuseCount
-
-.got_confuse_count
-	set SUBSTATUS_CONFUSED, [hl]
-	call BattleRandom
-	and 3
-	inc a
-	inc a
-	ld [bc], a
-
-	ld a, BATTLE_VARS_MOVE_EFFECT
-	call GetBattleVar
-	cp EFFECT_CONFUSE_HIT
-	jr z, .got_effect
-	cp EFFECT_SNORE
-	jr z, .got_effect
-	cp EFFECT_SWAGGER
-	jr z, .got_effect
-	call AnimateCurrentMove
-
-.got_effect
-	ld de, ANIM_CONFUSED
-	call PlayOpponentBattleAnim
-
-	ld hl, BecameConfusedText
-	call StdBattleTextBox
-
-	call GetOpponentItem
-	ld a, b
-	cp HELD_HEAL_STATUS
-	jr z, .heal_confusion
-	cp HELD_HEAL_CONFUSION
-	ret nz
-.heal_confusion
-	ld hl, UseConfusionHealingItem
-	jp CallBattleCore
-
-; 36db6
-
-BattleCommand_Confuse_CheckSnore_Swagger_ConfuseHit: ; 36db6
-	ld a, BATTLE_VARS_MOVE_EFFECT
-	call GetBattleVar
-	cp EFFECT_CONFUSE_HIT
-	ret z
-	cp EFFECT_SNORE
-	ret z
-	cp EFFECT_SWAGGER
-	ret z
-	jp PrintDidntAffect2
-
-; 36dc7
-
-
-BattleCommand_Paralyze: ; 36dc7
-; paralyze
-
-	ld a, BATTLE_VARS_STATUS_OPP
-	call GetBattleVar
-	bit PAR, a
-	jr nz, .paralyzed
-	ld a, [TypeModifier]
-	and $7f
-	jr z, .didnt_affect
-	call GetOpponentItem
-	ld a, b
-	cp HELD_PREVENT_PARALYZE
-	jr nz, .no_item_protection
-	ld a, [hl]
-	ld [wNamedObjectIndexBuffer], a
-	call GetItemName
-	call AnimateFailedMove
-	ld hl, ProtectedByText
-	jp StdBattleTextBox
-
-.no_item_protection
-	ld a, [hBattleTurn]
-	and a
-	jr z, .dont_sample_failure
-
-	ld a, [wLinkMode]
-	and a
-	jr nz, .dont_sample_failure
-
-	ld a, [InBattleTowerBattle]
-	and a
-	jr nz, .dont_sample_failure
-
-	ld a, [PlayerSubStatus5]
-	bit SUBSTATUS_LOCK_ON, a
-	jr nz, .dont_sample_failure
-
-	call BattleRandom
-	cp 1 + 25 percent
-	jr c, .failed
-
-.dont_sample_failure
-	ld a, BATTLE_VARS_STATUS_OPP
-	call GetBattleVarAddr
-	and a
-	jr nz, .failed
-	ld a, [AttackMissed]
-	and a
-	jr nz, .failed
-	call CheckSubstituteOpp
-	jr nz, .failed
-	ld c, 30
-	call DelayFrames
-	call AnimateCurrentMove
-	ld a, $1
-	ld [hBGMapMode], a
-	ld a, BATTLE_VARS_STATUS_OPP
-	call GetBattleVarAddr
-	set PAR, [hl]
-	call UpdateOpponentInParty
-	ld hl, ApplyPrzEffectOnSpeed
-	call CallBattleCore
-	call UpdateBattleHuds
-	call PrintParalyze
-	ld hl, UseHeldStatusHealingItem
-	jp CallBattleCore
-
-.paralyzed
-	call AnimateFailedMove
-	ld hl, AlreadyParalyzedText
-	jp StdBattleTextBox
-
-.failed
-	jp PrintDidntAffect2
-
-.didnt_affect
-	call AnimateFailedMove
-	jp PrintDoesntAffect
-
-; 36e5b
-
-
-CheckMoveTypeMatchesTarget: ; 36e5b
-; Compare move type to opponent type.
-; Return z if matching the opponent type,
-; unless the move is Normal (Tri Attack).
-
-	push hl
-
-	ld hl, EnemyMonType1
-	ld a, [hBattleTurn]
-	and a
-	jr z, .ok
-	ld hl, BattleMonType1
-.ok
-
-	ld a, BATTLE_VARS_MOVE_TYPE
-	call GetBattleVar
-	cp NORMAL
-	jr z, .normal
-
-	cp [hl]
-	jr z, .return
-
-	inc hl
-	cp [hl]
-
-.return
-	pop hl
-	ret
-
-.normal
-	ld a, 1
-	and a
-	pop hl
-	ret
-
-; 36e7c
-
-
-BattleCommand_Substitute: ; 36e7c
-; substitute
-
-	call BattleCommand_MoveDelay
-	ld hl, BattleMonMaxHP
-	ld de, PlayerSubstituteHP
-	ld a, [hBattleTurn]
-	and a
-	jr z, .got_hp
-	ld hl, EnemyMonMaxHP
-	ld de, EnemySubstituteHP
-.got_hp
-
-	ld a, BATTLE_VARS_SUBSTATUS4
-	call GetBattleVar
-	bit SUBSTATUS_SUBSTITUTE, a
-	jr nz, .already_has_sub
-
-	ld a, [hli]
-	ld b, [hl]
-	srl a
-	rr b
-	srl a
-	rr b
-	dec hl
-	dec hl
-	ld a, b
-	ld [de], a
-	ld a, [hld]
-	sub b
-	ld e, a
-	ld a, [hl]
-	sbc 0
-	ld d, a
-	jr c, .too_weak_to_sub
-	ld a, d
-	or e
-	jr z, .too_weak_to_sub
-	ld [hl], d
-	inc hl
-	ld [hl], e
-
-	ld a, BATTLE_VARS_SUBSTATUS4
-	call GetBattleVarAddr
-	set SUBSTATUS_SUBSTITUTE, [hl]
-
-	ld hl, wPlayerWrapCount
-	ld de, wPlayerTrappingMove
-	ld a, [hBattleTurn]
-	and a
-	jr z, .player
-	ld hl, wEnemyWrapCount
-	ld de, wEnemyTrappingMove
-.player
-
-	xor a
-	ld [hl], a
-	ld [de], a
-	call _CheckBattleScene
-	jr c, .no_anim
-
-	xor a
-	ld [wNumHits], a
-	ld [FXAnimID + 1], a
-	ld [wKickCounter], a
-	ld a, SUBSTITUTE
-	call LoadAnim
-	jr .finish
-
-.no_anim
-	call BattleCommand_RaiseSubNoAnim
-.finish
-	ld hl, MadeSubstituteText
-	call StdBattleTextBox
-	jp RefreshBattleHuds
-
-.already_has_sub
-	call CheckUserIsCharging
-	call nz, BattleCommand_RaiseSub
-	ld hl, HasSubstituteText
-	jr .jp_stdbattletextbox
-
-.too_weak_to_sub
-	call CheckUserIsCharging
-	call nz, BattleCommand_RaiseSub
-	ld hl, TooWeakSubText
-.jp_stdbattletextbox
-	jp StdBattleTextBox
-
-; 36f0b
-
-BattleCommand_RechargeNextTurn: ; 36f0b
-; rechargenextturn
-	ld a, BATTLE_VARS_SUBSTATUS4
-	call GetBattleVarAddr
-	set SUBSTATUS_RECHARGE, [hl]
-	ret
-
-; 36f13
-
-
-EndRechargeOpp: ; 36f13
-	push hl
-	ld a, BATTLE_VARS_SUBSTATUS4_OPP
-	call GetBattleVarAddr
-	res SUBSTATUS_RECHARGE, [hl]
-	pop hl
-	ret
-
-; 36f1d
-
-
-BattleCommand_Rage: ; 36f1d
-; rage
-	ld a, BATTLE_VARS_SUBSTATUS4
-	call GetBattleVarAddr
-	set SUBSTATUS_RAGE, [hl]
-	ret
-
-; 36f25
-
-
-BattleCommand_DoubleFlyingDamage: ; 36f25
-; doubleflyingdamage
-	ld a, BATTLE_VARS_SUBSTATUS3_OPP
-	call GetBattleVar
-	bit SUBSTATUS_FLYING, a
-	ret z
-	jr DoubleDamage
-
-; 36f2f
-
-
-BattleCommand_DoubleUndergroundDamage: ; 36f2f
-; doubleundergrounddamage
-	ld a, BATTLE_VARS_SUBSTATUS3_OPP
-	call GetBattleVar
-	bit SUBSTATUS_UNDERGROUND, a
-	ret z
-
-	; fallthrough
-; 36f37
-
-
-DoubleDamage: ; 36f37
-	ld hl, CurDamage + 1
-	sla [hl]
-	dec hl
-	rl [hl]
-	jr nc, .quit
-
-	ld a, $ff
-	ld [hli], a
-	ld [hl], a
-.quit
-	ret
-
-; 36f46
-
-
-BattleCommand_Mimic: ; 36f46
-; mimic
-
-	call ClearLastMove
-	call BattleCommand_MoveDelay
-	ld a, [AttackMissed]
-	and a
-	jr nz, .fail
-	ld hl, BattleMonMoves
-	ld a, [hBattleTurn]
-	and a
-	jr z, .player_turn
-	ld hl, EnemyMonMoves
-.player_turn
-	call CheckHiddenOpponent
-	jr nz, .fail
-	ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
-	call GetBattleVar
-	and a
-	jr z, .fail
-	cp STRUGGLE
-	jr z, .fail
-	ld b, a
-	ld c, NUM_MOVES
-.check_already_knows_move
-	ld a, [hli]
-	cp b
-	jr z, .fail
-	dec c
-	jr nz, .check_already_knows_move
-	dec hl
-.find_mimic
-	ld a, [hld]
-	cp MIMIC
-	jr nz, .find_mimic
-	inc hl
-	ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
-	call GetBattleVar
-	ld [hl], a
-	ld [wNamedObjectIndexBuffer], a
-	ld bc, BattleMonPP - BattleMonMoves
-	add hl, bc
-	ld [hl], 5
-	call GetMoveName
-	call AnimateCurrentMove
-	ld hl, LearnedMoveText
-	jp StdBattleTextBox
-
-.fail
-	jp FailMimic
-
-; 36f9d
-
-
-BattleCommand_LeechSeed: ; 36f9d
-; leechseed
-	ld a, [AttackMissed]
-	and a
-	jr nz, .evaded
-	call CheckSubstituteOpp
-	jr nz, .evaded
-
-	ld de, EnemyMonType1
-	ld a, [hBattleTurn]
-	and a
-	jr z, .ok
-	ld de, BattleMonType1
-.ok
-
-	ld a, [de]
-	cp GRASS
-	jr z, .grass
-	inc de
-	ld a, [de]
-	cp GRASS
-	jr z, .grass
-
-	ld a, BATTLE_VARS_SUBSTATUS4_OPP
-	call GetBattleVarAddr
-	bit SUBSTATUS_LEECH_SEED, [hl]
-	jr nz, .evaded
-	set SUBSTATUS_LEECH_SEED, [hl]
-	call AnimateCurrentMove
-	ld hl, WasSeededText
-	jp StdBattleTextBox
-
-.grass
-	call AnimateFailedMove
-	jp PrintDoesntAffect
-
-.evaded
-	call AnimateFailedMove
-	ld hl, EvadedText
-	jp StdBattleTextBox
-
-; 36fe1
-
-
-BattleCommand_Splash: ; 36fe1
-	call AnimateCurrentMove
-	farcall TrainerRankings_Splash
-	jp PrintNothingHappened
-
-; 36fed
-
-
-BattleCommand_Disable: ; 36fed
-; disable
-
-	ld a, [AttackMissed]
-	and a
-	jr nz, .failed
-
-	ld de, EnemyDisableCount
-	ld hl, EnemyMonMoves
-	ld a, [hBattleTurn]
-	and a
-	jr z, .got_moves
-	ld de, PlayerDisableCount
-	ld hl, BattleMonMoves
-.got_moves
-
-	ld a, [de]
-	and a
-	jr nz, .failed
-
-	ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
-	call GetBattleVar
-	and a
-	jr z, .failed
-	cp STRUGGLE
-	jr z, .failed
-
-	ld b, a
-	ld c, $ff
-.loop
-	inc c
-	ld a, [hli]
-	cp b
-	jr nz, .loop
-
-	ld a, [hBattleTurn]
-	and a
-	ld hl, EnemyMonPP
-	jr z, .got_pp
-	ld hl, BattleMonPP
-.got_pp
-	ld b, 0
-	add hl, bc
-	ld a, [hl]
-	and a
-	jr z, .failed
-.loop2
-	call BattleRandom
-	and 7
-	jr z, .loop2
-	inc a
-	inc c
-	swap c
-	add c
-	ld [de], a
-	call AnimateCurrentMove
-	ld hl, DisabledMove
-	ld a, [hBattleTurn]
-	and a
-	jr nz, .got_disabled_move_pointer
-	inc hl
-.got_disabled_move_pointer
-	ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
-	call GetBattleVar
-	ld [hl], a
-	ld [wNamedObjectIndexBuffer], a
-	call GetMoveName
-	ld hl, WasDisabledText
-	jp StdBattleTextBox
-
-.failed
-	jp FailDisable
-
-; 3705c
-
-
-BattleCommand_PayDay: ; 3705c
-; payday
-
-	xor a
-	ld hl, StringBuffer1
-	ld [hli], a
-
-	ld a, [hBattleTurn]
-	and a
-	ld a, [BattleMonLevel]
-	jr z, .ok
-	ld a, [EnemyMonLevel]
-.ok
-
-	add a
-	ld hl, wPayDayMoney + 2
-	add [hl]
-	ld [hld], a
-	jr nc, .done
-	inc [hl]
-	dec hl
-	jr nz, .done
-	inc [hl]
-.done
-	ld hl, CoinsScatteredText
-	jp StdBattleTextBox
-
-; 3707f
-
-
-BattleCommand_Conversion: ; 3707f
-; conversion
-
-	ld hl, BattleMonMoves
-	ld de, BattleMonType1
-	ld a, [hBattleTurn]
-	and a
-	jr z, .got_moves
-	ld hl, EnemyMonMoves
-	ld de, EnemyMonType1
-.got_moves
-	push de
-	ld c, 0
-	ld de, StringBuffer1
-.loop
-	push hl
-	ld b, 0
-	add hl, bc
-	ld a, [hl]
-	pop hl
-	and a
-	jr z, .okay
-	push hl
-	push bc
-	dec a
-	ld hl, Moves + MOVE_TYPE
-	call GetMoveAttr
-	ld [de], a
-	inc de
-	pop bc
-	pop hl
-	inc c
-	ld a, c
-	cp NUM_MOVES
-	jr c, .loop
-.okay
-	ld a, $ff
-	ld [de], a
-	inc de
-	ld [de], a
-	inc de
-	ld [de], a
-	pop de
-	ld hl, StringBuffer1
-.loop2
-	ld a, [hl]
-	cp -1
-	jr z, .fail
-	cp CURSE_T
-	jr z, .next
-	ld a, [de]
-	cp [hl]
-	jr z, .next
-	inc de
-	ld a, [de]
-	dec de
-	cp [hl]
-	jr nz, .done
-.next
-	inc hl
-	jr .loop2
-
-.fail
-	call AnimateFailedMove
-	jp PrintButItFailed
-
-.done
-.loop3
-	call BattleRandom
-	and 3 ; TODO factor in NUM_MOVES
-	ld c, a
-	ld b, 0
-	ld hl, StringBuffer1
-	add hl, bc
-	ld a, [hl]
-	cp -1
-	jr z, .loop3
-	cp CURSE_T
-	jr z, .loop3
-	ld a, [de]
-	cp [hl]
-	jr z, .loop3
-	inc de
-	ld a, [de]
-	dec de
-	cp [hl]
-	jr z, .loop3
-	ld a, [hl]
-	ld [de], a
-	inc de
-	ld [de], a
-	ld [wNamedObjectIndexBuffer], a
-	farcall GetTypeName
-	call AnimateCurrentMove
-	ld hl, TransformedTypeText
-	jp StdBattleTextBox
-
-; 3710e
-
-
-BattleCommand_ResetStats: ; 3710e
-; resetstats
-
-	ld a, 7 ; neutral
-	ld hl, PlayerStatLevels
-	call .Fill
-	ld hl, EnemyStatLevels
-	call .Fill
-
-	ld a, [hBattleTurn]
-	push af
-
-	call SetPlayerTurn
-	call CalcPlayerStats
-	call SetEnemyTurn
-	call CalcEnemyStats
-
-	pop af
-	ld [hBattleTurn], a
-
-	call AnimateCurrentMove
-
-	ld hl, EliminatedStatsText
-	jp StdBattleTextBox
-
-.Fill:
-	ld b, PlayerStatLevelsEnd - PlayerStatLevels
-.next
-	ld [hli], a
-	dec b
-	jr nz, .next
-	ret
-
-; 3713e
-
-
-BattleCommand_Heal: ; 3713e
-; heal
-
-	ld de, BattleMonHP
-	ld hl, BattleMonMaxHP
-	ld a, [hBattleTurn]
-	and a
-	jr z, .got_hp
-	ld de, EnemyMonHP
-	ld hl, EnemyMonMaxHP
-.got_hp
-	ld a, BATTLE_VARS_MOVE_ANIM
-	call GetBattleVar
-	ld b, a
-	push hl
-	push de
-	push bc
-	ld c, 2
-	call StringCmp
-	pop bc
-	pop de
-	pop hl
-	jp z, .hp_full
-	ld a, b
-	cp REST
-	jr nz, .not_rest
-
-	push hl
-	push de
-	push af
-	call BattleCommand_MoveDelay
-	ld a, BATTLE_VARS_SUBSTATUS5
-	call GetBattleVarAddr
-	res SUBSTATUS_TOXIC, [hl]
-	ld a, BATTLE_VARS_STATUS
-	call GetBattleVarAddr
-	ld a, [hl]
-	and a
-	ld [hl], REST_SLEEP_TURNS + 1
-	ld hl, WentToSleepText
-	jr z, .no_status_to_heal
-	ld hl, RestedText
-.no_status_to_heal
-	call StdBattleTextBox
-	ld a, [hBattleTurn]
-	and a
-	jr nz, .calc_enemy_stats
-	call CalcPlayerStats
-	jr .got_stats
-
-.calc_enemy_stats
-	call CalcEnemyStats
-.got_stats
-	pop af
-	pop de
-	pop hl
-
-.not_rest
-	jr z, .restore_full_hp
-	ld hl, GetHalfMaxHP
-	call CallBattleCore
-	jr .finish
-
-.restore_full_hp
-	ld hl, GetMaxHP
-	call CallBattleCore
-.finish
-	call AnimateCurrentMove
-	call BattleCommand_SwitchTurn
-	ld hl, RestoreHP
-	call CallBattleCore
-	call BattleCommand_SwitchTurn
-	call UpdateUserInParty
-	call RefreshBattleHuds
-	ld hl, RegainedHealthText
-	jp StdBattleTextBox
-
-.hp_full
-	call AnimateFailedMove
-	ld hl, HPIsFullText
-	jp StdBattleTextBox
-
-; 371cd
-
-INCLUDE "battle/effects/transform.asm"
-
-BattleSideCopy: ; 372c6
-; Copy bc bytes from hl to de if it's the player's turn.
-; Copy bc bytes from de to hl if it's the enemy's turn.
-	ld a, [hBattleTurn]
-	and a
-	jr z, .copy
-
-; Swap hl and de
-	push hl
-	ld h, d
-	ld l, e
-	pop de
-.copy
-	jp CopyBytes
-
-; 372d2
-
-
-BattleEffect_ButItFailed: ; 372d2
-	call AnimateFailedMove
-	jp PrintButItFailed
-
-; 372d8
-
-
-ClearLastMove: ; 372d8
-	ld a, BATTLE_VARS_LAST_COUNTER_MOVE
-	call GetBattleVarAddr
-	xor a
-	ld [hl], a
-
-	ld a, BATTLE_VARS_LAST_MOVE
-	call GetBattleVarAddr
-	xor a
-	ld [hl], a
-	ret
-
-; 372e7
-
-
-ResetActorDisable: ; 372e7
-	ld a, [hBattleTurn]
-	and a
-	jr z, .player
-
-	xor a
-	ld [EnemyDisableCount], a
-	ld [EnemyDisabledMove], a
-	ret
-
-.player
-	xor a
-	ld [PlayerDisableCount], a
-	ld [DisabledMove], a
-	ret
-
-; 372fc
-
-
-BattleCommand_Screen: ; 372fc
-; screen
-
-	ld hl, PlayerScreens
-	ld bc, PlayerLightScreenCount
-	ld a, [hBattleTurn]
-	and a
-	jr z, .got_screens_pointer
-	ld hl, EnemyScreens
-	ld bc, EnemyLightScreenCount
-
-.got_screens_pointer
-	ld a, BATTLE_VARS_MOVE_EFFECT
-	call GetBattleVar
-	cp EFFECT_LIGHT_SCREEN
-	jr nz, .Reflect
-
-	bit SCREENS_LIGHT_SCREEN, [hl]
-	jr nz, .failed
-	set SCREENS_LIGHT_SCREEN, [hl]
-	ld a, 5
-	ld [bc], a
-	ld hl, LightScreenEffectText
-	jr .good
-
-.Reflect:
-	bit SCREENS_REFLECT, [hl]
-	jr nz, .failed
-	set SCREENS_REFLECT, [hl]
-
-	; LightScreenCount -> ReflectCount
-	inc bc
-
-	ld a, 5
-	ld [bc], a
-	ld hl, ReflectEffectText
-
-.good
-	call AnimateCurrentMove
-	jp StdBattleTextBox
-
-.failed
-	call AnimateFailedMove
-	jp PrintButItFailed
-
-; 3733d
-
-
-PrintDoesntAffect: ; 3733d
-; 'it doesn't affect'
-	ld hl, DoesntAffectText
-	jp StdBattleTextBox
-
-; 37343
-
-
-PrintNothingHappened: ; 37343
-; 'but nothing happened!'
-	ld hl, NothingHappenedText
-	jp StdBattleTextBox
-
-; 37349
-
-
-TryPrintButItFailed: ; 37349
-	ld a, [AlreadyFailed]
-	and a
-	ret nz
-
-	; fallthrough
-; 3734e
-
-
-PrintButItFailed: ; 3734e
-; 'but it failed!'
-	ld hl, ButItFailedText
-	jp StdBattleTextBox
-
-; 37354
-
-
-FailSnore:
-FailDisable:
-FailConversion2:
-FailAttract:
-FailForesight:
-FailSpikes:
-	call AnimateFailedMove
-	; fallthrough
-; 37357
-
-FailMimic: ; 37357
-	ld hl, ButItFailedText ; 'but it failed!'
-	ld de, ItFailedText    ; 'it failed!'
-	jp FailText_CheckOpponentProtect
-
-; 37360
-
-
-PrintDidntAffect: ; 37360
-; 'it didn't affect'
-	ld hl, DidntAffect1Text
-	jp StdBattleTextBox
-
-; 37366
-
-
-PrintDidntAffect2: ; 37366
-	call AnimateFailedMove
-	ld hl, DidntAffect1Text ; 'it didn't affect'
-	ld de, DidntAffect2Text ; 'it didn't affect'
-	jp FailText_CheckOpponentProtect
-
-; 37372
-
-
-PrintParalyze: ; 37372
-; 'paralyzed! maybe it can't attack!'
-	ld hl, ParalyzedText
-	jp StdBattleTextBox
-
-; 37378
-
-
-CheckSubstituteOpp: ; 37378
-	ld a, BATTLE_VARS_SUBSTATUS4_OPP
-	call GetBattleVar
-	bit SUBSTATUS_SUBSTITUTE, a
-	ret
-
-; 37380
-
-
-BattleCommand_Selfdestruct: ; 37380
-	farcall TrainerRankings_Selfdestruct
-	ld a, BATTLEANIM_PLAYER_DAMAGE
-	ld [wNumHits], a
-	ld c, 3
-	call DelayFrames
-	ld a, BATTLE_VARS_STATUS
-	call GetBattleVarAddr
-	xor a
-	ld [hli], a
-	inc hl
-	ld [hli], a
-	ld [hl], a
-	ld a, $1
-	ld [wKickCounter], a
-	call BattleCommand_LowerSub
-	call LoadMoveAnim
-	ld a, BATTLE_VARS_SUBSTATUS4
-	call GetBattleVarAddr
-	res SUBSTATUS_LEECH_SEED, [hl]
-	ld a, BATTLE_VARS_SUBSTATUS5_OPP
-	call GetBattleVarAddr
-	res SUBSTATUS_DESTINY_BOND, [hl]
-	call _CheckBattleScene
-	ret nc
-	farcall DrawPlayerHUD
-	farcall DrawEnemyHUD
-	call WaitBGMap
-	jp RefreshBattleHuds
-
-; 373c9
-
-
-INCLUDE "battle/effects/mirror_move.asm"
-
-INCLUDE "battle/effects/metronome.asm"
-
-
-CheckUserMove: ; 37462
-; Return z if the user has move a.
-	ld b, a
-	ld de, BattleMonMoves
-	ld a, [hBattleTurn]
-	and a
-	jr z, .ok
-	ld de, EnemyMonMoves
-.ok
-
-	ld c, NUM_MOVES
-.loop
-	ld a, [de]
-	inc de
-	cp b
-	ret z
-
-	dec c
-	jr nz, .loop
-
-	ld a, 1
-	and a
-	ret
-
-; 3747b
-
-
-ResetTurn: ; 3747b
-	ld hl, wPlayerCharging
-	ld a, [hBattleTurn]
-	and a
-	jr z, .player
-	ld hl, wEnemyCharging
-
-.player
-	ld [hl], 1
-	xor a
-	ld [AlreadyDisobeyed], a
-	call DoMove
-	jp EndMoveEffect
-
-; 37492
-
-
-INCLUDE "battle/effects/thief.asm"
-
-
-BattleCommand_ArenaTrap: ; 37517
-; arenatrap
-
-; Doesn't work on an absent opponent.
-
-	call CheckHiddenOpponent
-	jr nz, .failed
-
-; Don't trap if the opponent is already trapped.
-
-	ld a, BATTLE_VARS_SUBSTATUS5
-	call GetBattleVarAddr
-	bit SUBSTATUS_CANT_RUN, [hl]
-	jr nz, .failed
-
-; Otherwise trap the opponent.
-
-	set SUBSTATUS_CANT_RUN, [hl]
-	call AnimateCurrentMove
-	ld hl, CantEscapeNowText
-	jp StdBattleTextBox
-
-.failed
-	call AnimateFailedMove
-	jp PrintButItFailed
-
-; 37536
-
-
-INCLUDE "battle/effects/nightmare.asm"
-
-
-BattleCommand_Defrost: ; 37563
-; defrost
-
-; Thaw the user.
-
-	ld a, BATTLE_VARS_STATUS
-	call GetBattleVarAddr
-	bit FRZ, [hl]
-	ret z
-	res FRZ, [hl]
-
-; Don't update the enemy's party struct in a wild battle.
-
-	ld a, [hBattleTurn]
-	and a
-	jr z, .party
-
-	ld a, [wBattleMode]
-	dec a
-	jr z, .done
-
-.party
-	ld a, MON_STATUS
-	call UserPartyAttr
-	res FRZ, [hl]
-
-.done
-	call RefreshBattleHuds
-	ld hl, WasDefrostedText
-	jp StdBattleTextBox
-
-; 37588
-
-
-INCLUDE "battle/effects/curse.asm"
-
-INCLUDE "battle/effects/protect.asm"
-
-INCLUDE "battle/effects/endure.asm"
-
-INCLUDE "battle/effects/spikes.asm"
-
-INCLUDE "battle/effects/foresight.asm"
-
-INCLUDE "battle/effects/perish_song.asm"
-
-INCLUDE "battle/effects/sandstorm.asm"
-
-INCLUDE "battle/effects/rollout.asm"
-
-
-BattleCommand5d: ; 37791
-; unused
-	ret
-
-; 37792
-
-
-BattleCommand_FuryCutter: ; 37792
-; furycutter
-
-	ld hl, PlayerFuryCutterCount
-	ld a, [hBattleTurn]
-	and a
-	jr z, .go
-	ld hl, EnemyFuryCutterCount
-
-.go
-	ld a, [AttackMissed]
-	and a
-	jp nz, ResetFuryCutterCount
-
-	inc [hl]
-
-; Damage capped at 5 turns' worth (16x).
-	ld a, [hl]
-	ld b, a
-	cp 6
-	jr c, .checkdouble
-	ld b, 5
-
-.checkdouble
-	dec b
-	ret z
-
-; Double the damage
-	ld hl, CurDamage + 1
-	sla [hl]
-	dec hl
-	rl [hl]
-	jr nc, .checkdouble
-
-; No overflow
-	ld a, $ff
-	ld [hli], a
-	ld [hl], a
-	ret
-
-; 377be
-
-
-ResetFuryCutterCount: ; 377be
-
-	push hl
-
-	ld hl, PlayerFuryCutterCount
-	ld a, [hBattleTurn]
-	and a
-	jr z, .reset
-	ld hl, EnemyFuryCutterCount
-
-.reset
-	xor a
-	ld [hl], a
-
-	pop hl
-	ret
-
-; 377ce
-
-
-INCLUDE "battle/effects/attract.asm"
-
-BattleCommand_HappinessPower: ; 3784b
-; happinesspower
-	push bc
-	ld hl, BattleMonHappiness
-	ld a, [hBattleTurn]
-	and a
-	jr z, .ok
-	ld hl, EnemyMonHappiness
-.ok
-	xor a
-	ld [hMultiplicand + 0], a
-	ld [hMultiplicand + 1], a
-	ld a, [hl]
-	ld [hMultiplicand + 2], a
-	ld a, 10
-	ld [hMultiplier], a
-	call Multiply
-	ld a, 25
-	ld [hDivisor], a
-	ld b, 4
-	call Divide
-	ld a, [hQuotient + 2]
-	ld d, a
-	pop bc
-	ret
-
-; 37874
-
-
-INCLUDE "battle/effects/present.asm"
-
-BattleCommand_FrustrationPower: ; 3790e
-; frustrationpower
-
-	push bc
-	ld hl, BattleMonHappiness
-	ld a, [hBattleTurn]
-	and a
-	jr z, .got_happiness
-	ld hl, EnemyMonHappiness
-.got_happiness
-	ld a, $ff
-	sub [hl]
-	ld [hMultiplicand + 2], a
-	xor a
-	ld [hMultiplicand + 0], a
-	ld [hMultiplicand + 1], a
-	ld a, 10
-	ld [hMultiplier], a
-	call Multiply
-	ld a, 25
-	ld [hDivisor], a
-	ld b, 4
-	call Divide
-	ld a, [hQuotient + 2]
-	ld d, a
-	pop bc
-	ret
-
-; 37939
-
-
-BattleCommand_Safeguard: ; 37939
-; safeguard
-
-	ld hl, PlayerScreens
-	ld de, PlayerSafeguardCount
-	ld a, [hBattleTurn]
-	and a
-	jr z, .ok
-	ld hl, EnemyScreens
-	ld de, EnemySafeguardCount
-.ok
-	bit SCREENS_SAFEGUARD, [hl]
-	jr nz, .failed
-	set SCREENS_SAFEGUARD, [hl]
-	ld a, 5
-	ld [de], a
-	call AnimateCurrentMove
-	ld hl, CoveredByVeilText
-	jp StdBattleTextBox
-
-.failed
-	call AnimateFailedMove
-	jp PrintButItFailed
-
-; 37962
-
-
-SafeCheckSafeguard: ; 37962
-	push hl
-	ld hl, EnemyScreens
-	ld a, [hBattleTurn]
-	and a
-	jr z, .got_turn
-	ld hl, PlayerScreens
-
-.got_turn
-	bit SCREENS_SAFEGUARD, [hl]
-	pop hl
-	ret
-
-; 37972
-
-
-BattleCommand_CheckSafeguard: ; 37972
-; checksafeguard
-	ld hl, EnemyScreens
-	ld a, [hBattleTurn]
-	and a
-	jr z, .got_turn
-	ld hl, PlayerScreens
-.got_turn
-	bit SCREENS_SAFEGUARD, [hl]
-	ret z
-	ld a, 1
-	ld [AttackMissed], a
-	call BattleCommand_MoveDelay
-	ld hl, SafeguardProtectText
-	call StdBattleTextBox
-	jp EndMoveEffect
-
-; 37991
-
-
-BattleCommand_GetMagnitude: ; 37991
-; getmagnitude
-
-	push bc
-	call BattleRandom
-	ld b, a
-	ld hl, .Magnitudes
-.loop
-	ld a, [hli]
-	cp b
-	jr nc, .ok
-	inc hl
-	inc hl
-	jr .loop
-
-.ok
-	ld d, [hl]
-	push de
-	inc hl
-	ld a, [hl]
-	ld [wTypeMatchup], a
-	call BattleCommand_MoveDelay
-	ld hl, MagnitudeText
-	call StdBattleTextBox
-	pop de
-	pop bc
-	ret
-
-.Magnitudes:
-	;  /255, BP, magnitude
-	db  13,  10,  4
-	db  38,  30,  5
-	db  89,  50,  6
-	db 166,  70,  7
-	db 217,  90,  8
-	db 242, 110,  9
-	db 255, 150, 10
-; 379c9
-
-
-BattleCommand_BatonPass: ; 379c9
-; batonpass
-
-	ld a, [hBattleTurn]
-	and a
-	jp nz, .Enemy
-
-
-; Need something to switch to
-	call CheckAnyOtherAlivePartyMons
-	jp z, FailedBatonPass
-
-	call UpdateBattleMonInParty
-	call AnimateCurrentMove
-
-	ld c, 50
-	call DelayFrames
-
-; Transition into switchmon menu
-	call LoadStandardMenuDataHeader
-	farcall SetUpBattlePartyMenu_NoLoop
-
-	farcall ForcePickSwitchMonInBattle
-
-; Return to battle scene
-	call ClearPalettes
-	farcall _LoadBattleFontsHPBar
-	call CloseWindow
-	call ClearSprites
-	hlcoord 1, 0
-	lb bc, 4, 10
-	call ClearBox
-	ld b, SCGB_BATTLE_COLORS
-	call GetSGBLayout
-	call SetPalettes
-	call BatonPass_LinkPlayerSwitch
-
-; Mobile link battles handle entrances differently
-	farcall CheckMobileBattleError
-	jp c, EndMoveEffect
-
-	ld hl, PassedBattleMonEntrance
-	call CallBattleCore
-
-	call ResetBatonPassStatus
-	ret
-
-
-.Enemy:
-
-; Wildmons don't have anything to switch to
-	ld a, [wBattleMode]
-	dec a ; WILDMON
-	jp z, FailedBatonPass
-
-	call CheckAnyOtherAliveEnemyMons
-	jp z, FailedBatonPass
-
-	call UpdateEnemyMonInParty
-	call AnimateCurrentMove
-	call BatonPass_LinkEnemySwitch
-
-; Mobile link battles handle entrances differently
-	farcall CheckMobileBattleError
-	jp c, EndMoveEffect
-
-; Passed enemy PartyMon entrance
-	xor a
-	ld [wEnemySwitchMonIndex], a
-	ld hl, EnemySwitch_SetMode
-	call CallBattleCore
-	ld hl, ResetBattleParticipants
-	call CallBattleCore
-	ld a, 1
-	ld [wTypeMatchup], a
-	ld hl, ApplyStatLevelMultiplierOnAllStats
-	call CallBattleCore
-
-	ld hl, SpikesDamage
-	call CallBattleCore
-
-	jr ResetBatonPassStatus
-
-; 37a67
-
-
-BatonPass_LinkPlayerSwitch: ; 37a67
-	ld a, [wLinkMode]
-	and a
-	ret z
-
-	ld a, 1
-	ld [wPlayerAction], a
-
-	call LoadStandardMenuDataHeader
-	ld hl, LinkBattleSendReceiveAction
-	call CallBattleCore
-	call CloseWindow
-
-	xor a
-	ld [wPlayerAction], a
-	ret
-
-; 37a82
-
-
-BatonPass_LinkEnemySwitch: ; 37a82
-	ld a, [wLinkMode]
-	and a
-	ret z
-
-	call LoadStandardMenuDataHeader
-	ld hl, LinkBattleSendReceiveAction
-	call CallBattleCore
-
-	ld a, [OTPartyCount]
-	add BATTLEACTION_SWITCH1
-	ld b, a
-	ld a, [wBattleAction]
-	cp BATTLEACTION_SWITCH1
-	jr c, .baton_pass
-	cp b
-	jr c, .switch
-
-.baton_pass
-	ld a, [CurOTMon]
-	add BATTLEACTION_SWITCH1
-	ld [wBattleAction], a
-.switch
-	jp CloseWindow
-
-; 37aab
-
-
-FailedBatonPass: ; 37aab
-	call AnimateFailedMove
-	jp PrintButItFailed
-
-; 37ab1
-
-
-ResetBatonPassStatus: ; 37ab1
-; Reset status changes that aren't passed by Baton Pass.
-
-	; Nightmare isn't passed.
-	ld a, BATTLE_VARS_STATUS
-	call GetBattleVar
-	and SLP
-	jr nz, .ok
-
-	ld a, BATTLE_VARS_SUBSTATUS1
-	call GetBattleVarAddr
-	res SUBSTATUS_NIGHTMARE, [hl]
-.ok
-
-	; Disable isn't passed.
-	call ResetActorDisable
-
-	; Attraction isn't passed.
-	ld hl, PlayerSubStatus1
-	res SUBSTATUS_IN_LOVE, [hl]
-	ld hl, EnemySubStatus1
-	res SUBSTATUS_IN_LOVE, [hl]
-	ld hl, PlayerSubStatus5
-
-	ld a, BATTLE_VARS_SUBSTATUS5
-	call GetBattleVarAddr
-	res SUBSTATUS_TRANSFORMED, [hl]
-	res SUBSTATUS_ENCORED, [hl]
-
-	; New mon hasn't used a move yet.
-	ld a, BATTLE_VARS_LAST_MOVE
-	call GetBattleVarAddr
-	ld [hl], 0
-
-	xor a
-	ld [wPlayerWrapCount], a
-	ld [wEnemyWrapCount], a
-	ret
-
-; 37ae9
-
-
-CheckAnyOtherAlivePartyMons: ; 37ae9
-	ld hl, PartyMon1HP
-	ld a, [PartyCount]
-	ld d, a
-	ld a, [CurBattleMon]
-	ld e, a
-	jr CheckAnyOtherAliveMons
-
-; 37af6
-
-
-CheckAnyOtherAliveEnemyMons: ; 37af6
-	ld hl, OTPartyMon1HP
-	ld a, [OTPartyCount]
-	ld d, a
-	ld a, [CurOTMon]
-	ld e, a
-
-	; fallthrough
-; 37b01
-
-CheckAnyOtherAliveMons: ; 37b01
-; Check for nonzero HP starting from partymon
-; HP at hl for d partymons, besides current mon e.
-
-; Return nz if any are alive.
-
-	xor a
-	ld b, a
-	ld c, a
-.loop
-	ld a, c
-	cp d
-	jr z, .done
-	cp e
-	jr z, .next
-
-	ld a, [hli]
-	or b
-	ld b, a
-	ld a, [hld]
-	or b
-	ld b, a
-
-.next
-	push bc
-	ld bc, PARTYMON_STRUCT_LENGTH
-	add hl, bc
-	pop bc
-	inc c
-	jr .loop
-
-.done
-	ld a, b
-	and a
-	ret
-
-; 37b1d
-
-
-BattleCommand_Pursuit: ; 37b1d
-; pursuit
-; Double damage if the opponent is switching.
-
-	ld hl, wEnemyIsSwitching
-	ld a, [hBattleTurn]
-	and a
-	jr z, .ok
-	ld hl, wPlayerIsSwitching
-.ok
-	ld a, [hl]
-	and a
-	ret z
-
-	ld hl, CurDamage + 1
-	sla [hl]
-	dec hl
-	rl [hl]
-	ret nc
-
-	ld a, $ff
-	ld [hli], a
-	ld [hl], a
-	ret
-
-; 37b39
-
-
-BattleCommand_ClearHazards: ; 37b39
-; clearhazards
-
-	ld a, BATTLE_VARS_SUBSTATUS4
-	call GetBattleVarAddr
-	bit SUBSTATUS_LEECH_SEED, [hl]
-	jr z, .not_leeched
-	res SUBSTATUS_LEECH_SEED, [hl]
-	ld hl, ShedLeechSeedText
-	call StdBattleTextBox
-.not_leeched
-
-	ld hl, PlayerScreens
-	ld de, wPlayerWrapCount
-	ld a, [hBattleTurn]
-	and a
-	jr z, .got_screens_wrap
-	ld hl, EnemyScreens
-	ld de, wEnemyWrapCount
-.got_screens_wrap
-	bit SCREENS_SPIKES, [hl]
-	jr z, .no_spikes
-	res SCREENS_SPIKES, [hl]
-	ld hl, BlewSpikesText
-	push de
-	call StdBattleTextBox
-	pop de
-.no_spikes
-
-	ld a, [de]
-	and a
-	ret z
-	xor a
-	ld [de], a
-	ld hl, ReleasedByText
-	jp StdBattleTextBox
-
-; 37b74
-
-
-BattleCommand_HealMorn: ; 37b74
-; healmorn
-	ld b, MORN_F
-	jr BattleCommand_TimeBasedHealContinue
-
-; 37b78
-
-BattleCommand_HealDay: ; 37b78
-; healday
-	ld b, DAY_F
-	jr BattleCommand_TimeBasedHealContinue
-
-; 37b7c
-
-BattleCommand_HealNite: ; 37b7c
-; healnite
-	ld b, NITE_F
-	; fallthrough
-; 37b7e
-
-BattleCommand_TimeBasedHealContinue: ; 37b7e
-; Time- and weather-sensitive heal.
-
-	ld hl, BattleMonMaxHP
-	ld de, BattleMonHP
-	ld a, [hBattleTurn]
-	and a
-	jr z, .start
-	ld hl, EnemyMonMaxHP
-	ld de, EnemyMonHP
-
-.start
-; Index for .Multipliers
-; Default restores half max HP.
-	ld c, 2
-
-; Don't bother healing if HP is already full.
-	push bc
-	call StringCmp
-	pop bc
-	jr z, .Full
-
-; Don't factor in time of day in link battles.
-	ld a, [wLinkMode]
-	and a
-	jr nz, .Weather
-
-	ld a, [TimeOfDay]
-	cp b
-	jr z, .Weather
-	dec c ; double
-
-.Weather:
-	ld a, [Weather]
-	and a
-	jr z, .Heal
-
-; x2 in sun
-; /2 in rain/sandstorm
-	inc c
-	cp WEATHER_SUN
-	jr z, .Heal
-	dec c
-	dec c
-
-.Heal:
-	ld b, 0
-	ld hl, .Multipliers
-	add hl, bc
-	add hl, bc
-
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	ld a, BANK(GetMaxHP)
-	rst FarCall
-
-	call AnimateCurrentMove
-	call BattleCommand_SwitchTurn
-
-	callfar RestoreHP
-
-	call BattleCommand_SwitchTurn
-	call UpdateUserInParty
-
-; 'regained health!'
-	ld hl, RegainedHealthText
-	jp StdBattleTextBox
-
-.Full:
-	call AnimateFailedMove
-
-; 'hp is full!'
-	ld hl, HPIsFullText
-	jp StdBattleTextBox
-
-.Multipliers:
-	dw GetEighthMaxHP
-	dw GetQuarterMaxHP
-	dw GetHalfMaxHP
-	dw GetMaxHP
-; 37be8
-
-
-BattleCommand_HiddenPower: ; 37be8
-; hiddenpower
-
-	ld a, [AttackMissed]
-	and a
-	ret nz
-	farcall HiddenPowerDamage
-	ret
-
-; 37bf4
-
-
-BattleCommand_StartRain: ; 37bf4
-; startrain
-	ld a, WEATHER_RAIN
-	ld [Weather], a
-	ld a, 5
-	ld [WeatherCount], a
-	call AnimateCurrentMove
-	ld hl, DownpourText
-	jp StdBattleTextBox
-
-; 37c07
-
-
-BattleCommand_StartSun: ; 37c07
-; startsun
-	ld a, WEATHER_SUN
-	ld [Weather], a
-	ld a, 5
-	ld [WeatherCount], a
-	call AnimateCurrentMove
-	ld hl, SunGotBrightText
-	jp StdBattleTextBox
-
-; 37c1a
-
-
-BattleCommand_BellyDrum: ; 37c1a
-; bellydrum
-; This command is buggy because it raises the user's attack
-; before checking that it has enough HP to use the move.
-; Swap the order of these two blocks to fix.
-	call BattleCommand_AttackUp2
-	ld a, [AttackMissed]
-	and a
-	jr nz, .failed
-
-	callfar GetHalfMaxHP
-	callfar CheckUserHasEnoughHP
-	jr nc, .failed
-
-	push bc
-	call AnimateCurrentMove
-	pop bc
-	callfar SubtractHPFromUser
-	call UpdateUserInParty
-	ld a, 5
-
-.max_attack_loop
-	push af
-	call BattleCommand_AttackUp2
-	pop af
-	dec a
-	jr nz, .max_attack_loop
-
-	ld hl, BellyDrumText
-	jp StdBattleTextBox
-
-.failed
-	call AnimateFailedMove
-	jp PrintButItFailed
-
-; 37c55
-
-
-BattleCommand_PsychUp: ; 37c55
-; psychup
-
-	ld hl, EnemyStatLevels
-	ld de, PlayerStatLevels
-	ld a, [hBattleTurn]
-	and a
-	jr z, .pointers_correct
-; It's the enemy's turn, so swap the pointers.
-	push hl
-	ld h, d
-	ld l, e
-	pop de
-.pointers_correct
-	push hl
-	ld b, NUM_LEVEL_STATS
-; If any of the enemy's stats is modified from its base level,
-; the move succeeds.  Otherwise, it fails.
-.loop
-	ld a, [hli]
-	cp BASE_STAT_LEVEL
-	jr nz, .break
-	dec b
-	jr nz, .loop
-	pop hl
-	call AnimateFailedMove
-	jp PrintButItFailed
-
-.break
-	pop hl
-	ld b, NUM_LEVEL_STATS
-.loop2
-	ld a, [hli]
-	ld [de], a
-	inc de
-	dec b
-	jr nz, .loop2
-	ld a, [hBattleTurn]
-	and a
-	jr nz, .calc_enemy_stats
-	call CalcPlayerStats
-	jr .merge
-
-.calc_enemy_stats
-	call CalcEnemyStats
-.merge
-	call AnimateCurrentMove
-	ld hl, CopiedStatsText
-	jp StdBattleTextBox
-
-; 37c95
-
-
-BattleCommand_MirrorCoat: ; 37c95
-; mirrorcoat
-
-	ld a, 1
-	ld [AttackMissed], a
-
-	ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
-	call GetBattleVar
-	and a
-	ret z
-
-	ld b, a
-	callfar GetMoveEffect
-	ld a, b
-	cp EFFECT_MIRROR_COAT
-	ret z
-
-	call BattleCommand_ResetTypeMatchup
-	ld a, [wTypeMatchup]
-	and a
-	ret z
-
-	call CheckOpponentWentFirst
-	ret z
-
-	ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
-	call GetBattleVar
-	dec a
-	ld de, StringBuffer1
-	call GetMoveData
-
-	ld a, [StringBuffer1 + 2]
-	and a
-	ret z
-
-	ld a, [StringBuffer1 + 3]
-	cp SPECIAL
-	ret c
-
-	ld hl, CurDamage
-	ld a, [hli]
-	or [hl]
-	ret z
-
-	ld a, [hl]
-	add a
-	ld [hld], a
-	ld a, [hl]
-	adc a
-	ld [hl], a
-	jr nc, .capped
-	ld a, $ff
-	ld [hli], a
-	ld [hl], a
-.capped
-
-	xor a
-	ld [AttackMissed], a
-	ret
-
-; 37ce6
-
-
-BattleCommand_DoubleMinimizeDamage: ; 37ce6
-; doubleminimizedamage
-
-	ld hl, wEnemyMinimized
-	ld a, [hBattleTurn]
-	and a
-	jr z, .ok
-	ld hl, wPlayerMinimized
-.ok
-	ld a, [hl]
-	and a
-	ret z
-	ld hl, CurDamage + 1
-	sla [hl]
-	dec hl
-	rl [hl]
-	ret nc
-	ld a, $ff
-	ld [hli], a
-	ld [hl], a
-	ret
-
-; 37d02
-
-
-BattleCommand_SkipSunCharge: ; 37d02
-; mimicsuncharge
-	ld a, [Weather]
-	cp WEATHER_SUN
-	ret nz
-	ld b, charge_command
-	jp SkipToBattleCommand
-
-; 37d0d
-
-
-BattleCommand_CheckFutureSight: ; 37d0d
-; checkfuturesight
-
-	ld hl, wPlayerFutureSightCount
-	ld de, wPlayerFutureSightDamage
-	ld a, [hBattleTurn]
-	and a
-	jr z, .ok
-	ld hl, wEnemyFutureSightCount
-	ld de, wEnemyFutureSightDamage
-.ok
-
-	ld a, [hl]
-	and a
-	ret z
-	cp 1
-	ret nz
-
-	ld [hl], 0
-	ld a, [de]
-	inc de
-	ld [CurDamage], a
-	ld a, [de]
-	ld [CurDamage + 1], a
-	ld b, futuresight_command
-	jp SkipToBattleCommand
-
-; 37d34
-
-BattleCommand_FutureSight: ; 37d34
-; futuresight
-
-	call CheckUserIsCharging
-	jr nz, .AlreadyChargingFutureSight
-	ld a, BATTLE_VARS_MOVE_ANIM
-	call GetBattleVar
-	ld b, a
-	ld a, BATTLE_VARS_LAST_COUNTER_MOVE
-	call GetBattleVarAddr
-	ld [hl], b
-	ld a, BATTLE_VARS_LAST_MOVE
-	call GetBattleVarAddr
-	ld [hl], b
-.AlreadyChargingFutureSight:
-	ld hl, wPlayerFutureSightCount
-	ld a, [hBattleTurn]
-	and a
-	jr z, .GotFutureSightCount
-	ld hl, wEnemyFutureSightCount
-.GotFutureSightCount:
-	ld a, [hl]
-	and a
-	jr nz, .failed
-	ld a, 4
-	ld [hl], a
-	call BattleCommand_LowerSub
-	call BattleCommand_MoveDelay
-	ld hl, ForesawAttackText
-	call StdBattleTextBox
-	call BattleCommand_RaiseSub
-	ld de, wPlayerFutureSightDamage
-	ld a, [hBattleTurn]
-	and a
-	jr z, .StoreDamage
-	ld de, wEnemyFutureSightDamage
-.StoreDamage:
-	ld hl, CurDamage
-	ld a, [hl]
-	ld [de], a
-	ld [hl], 0
-	inc hl
-	inc de
-	ld a, [hl]
-	ld [de], a
-	ld [hl], 0
-	jp EndMoveEffect
-
-.failed
-	pop bc
-	call ResetDamage
-	call AnimateFailedMove
-	call PrintButItFailed
-	jp EndMoveEffect
-
-; 37d94
-
-
-BattleCommand_ThunderAccuracy: ; 37d94
-; thunderaccuracy
-
-	ld a, BATTLE_VARS_MOVE_TYPE
-	call GetBattleVarAddr
-	inc hl
-	ld a, [Weather]
-	cp WEATHER_RAIN
-	jr z, .rain
-	cp WEATHER_SUN
-	ret nz
-	ld [hl], 50 percent + 1
-	ret
-
-.rain
-	; Redundant with CheckHit guranteeing hit
-	ld [hl], 100 percent
-	ret
-
-; 37daa
-
-
-CheckHiddenOpponent: ; 37daa
-; BUG: This routine should account for Lock-On and Mind Reader.
-	ld a, BATTLE_VARS_SUBSTATUS3_OPP
-	call GetBattleVar
-	and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
-	ret
-
-; 37db2
-
-
-GetUserItem: ; 37db2
-; Return the effect of the user's item in bc, and its id at hl.
-	ld hl, BattleMonItem
-	ld a, [hBattleTurn]
-	and a
-	jr z, .go
-	ld hl, EnemyMonItem
-.go
-	ld b, [hl]
-	jp GetItemHeldEffect
-
-; 37dc1
-
-
-GetOpponentItem: ; 37dc1
-; Return the effect of the opponent's item in bc, and its id at hl.
-	ld hl, EnemyMonItem
-	ld a, [hBattleTurn]
-	and a
-	jr z, .go
-	ld hl, BattleMonItem
-.go
-	ld b, [hl]
-	jp GetItemHeldEffect
-
-; 37dd0
-
-
-GetItemHeldEffect: ; 37dd0
-; Return the effect of item b in bc.
-	ld a, b
-	and a
-	ret z
-
-	push hl
-	ld hl, ItemAttributes + ITEMATTR_EFFECT
-	dec a
-	ld c, a
-	ld b, 0
-	ld a, ITEMATTR_STRUCT_LENGTH
-	call AddNTimes
-	ld a, BANK(ItemAttributes)
-	call GetFarHalfword
-	ld b, l
-	ld c, h
-	pop hl
-	ret
-
-; 37de9
-
-
-AnimateCurrentMoveEitherSide: ; 37de9
-	push hl
-	push de
-	push bc
-	ld a, [wKickCounter]
-	push af
-	call BattleCommand_LowerSub
-	pop af
-	ld [wKickCounter], a
-	call PlayDamageAnim
-	call BattleCommand_RaiseSub
-	pop bc
-	pop de
-	pop hl
-	ret
-
-; 37e01
-
-
-AnimateCurrentMove: ; 37e01
-	push hl
-	push de
-	push bc
-	ld a, [wKickCounter]
-	push af
-	call BattleCommand_LowerSub
-	pop af
-	ld [wKickCounter], a
-	call LoadMoveAnim
-	call BattleCommand_RaiseSub
-	pop bc
-	pop de
-	pop hl
-	ret
-
-; 37e19
-
-
-PlayDamageAnim: ; 37e19
-	xor a
-	ld [FXAnimID + 1], a
-
-	ld a, BATTLE_VARS_MOVE_ANIM
-	call GetBattleVar
-	and a
-	ret z
-
-	ld [FXAnimID], a
-
-	ld a, [hBattleTurn]
-	and a
-	ld a, BATTLEANIM_ENEMY_DAMAGE
-	jr z, .player
-	ld a, BATTLEANIM_PLAYER_DAMAGE
-
-.player
-	ld [wNumHits], a
-
-	jp PlayUserBattleAnim
-
-; 37e36
-
-
-LoadMoveAnim: ; 37e36
-	xor a
-	ld [wNumHits], a
-	ld [FXAnimID + 1], a
-
-	ld a, BATTLE_VARS_MOVE_ANIM
-	call GetBattleVar
-	and a
-	ret z
-
-	; fallthrough
-; 37e44
-
-
-LoadAnim: ; 37e44
-
-	ld [FXAnimID], a
-
-	; fallthrough
-; 37e47
-
-
-PlayUserBattleAnim: ; 37e47
-	push hl
-	push de
-	push bc
-	callfar PlayBattleAnim
-	pop bc
-	pop de
-	pop hl
-	ret
-
-; 37e54
-
-
-PlayOpponentBattleAnim: ; 37e54
-	ld a, e
-	ld [FXAnimID], a
-	ld a, d
-	ld [FXAnimID + 1], a
-	xor a
-	ld [wNumHits], a
-
-	push hl
-	push de
-	push bc
-	call BattleCommand_SwitchTurn
-
-	callfar PlayBattleAnim
-
-	call BattleCommand_SwitchTurn
-	pop bc
-	pop de
-	pop hl
-	ret
-
-; 37e73
-
-
-CallBattleCore: ; 37e73
-	ld a, BANK(BattleCore)
-	rst FarCall
-	ret
-
-; 37e77
-
-
-AnimateFailedMove: ; 37e77
-	call BattleCommand_LowerSub
-	call BattleCommand_MoveDelay
-	jp BattleCommand_RaiseSub
-
-; 37e80
-
-
-BattleCommand_MoveDelay: ; 37e80
-; movedelay
-; Wait 40 frames.
-	ld c, 40
-	jp DelayFrames
-
-; 37e85
-
-
-BattleCommand_ClearText: ; 37e85
-; cleartext
-
-; Used in multi-hit moves.
-	ld hl, .text
-	jp BattleTextBox
-
-.text
-	db "@"
-; 37e8c
-
-
-SkipToBattleCommand: ; 37e8c
-; Skip over commands until reaching command b.
-	ld a, [BattleScriptBufferAddress + 1]
-	ld h, a
-	ld a, [BattleScriptBufferAddress]
-	ld l, a
-.loop
-	ld a, [hli]
-	cp b
-	jr nz, .loop
-
-	ld a, h
-	ld [BattleScriptBufferAddress + 1], a
-	ld a, l
-	ld [BattleScriptBufferAddress], a
-	ret
-
-; 37ea1
-
-
-GetMoveAttr: ; 37ea1
-; Assuming hl = Moves + x, return attribute x of move a.
-	push bc
-	ld bc, MOVE_LENGTH
-	call AddNTimes
-	call GetMoveByte
-	pop bc
-	ret
-
-; 37ead
-
-
-GetMoveData: ; 37ead
-; Copy move struct a to de.
-	ld hl, Moves
-	ld bc, MOVE_LENGTH
-	call AddNTimes
-	ld a, Bank(Moves)
-	jp FarCopyBytes
-
-; 37ebb
-
-
-GetMoveByte: ; 37ebb
-	ld a, BANK(Moves)
-	jp GetFarByte
-
-; 37ec0
-
-
-DisappearUser: ; 37ec0
-	farcall _DisappearUser
-	ret
-
-; 37ec7
-
-
-AppearUserLowerSub: ; 37ec7
-	farcall _AppearUserLowerSub
-	ret
-
-; 37ece
-
-
-AppearUserRaiseSub: ; 37ece
-	farcall _AppearUserRaiseSub
-	ret
-
-; 37ed5
-
-
-_CheckBattleScene: ; 37ed5
-; Checks the options.  Returns carry if battle animations are disabled.
-	push hl
-	push de
-	push bc
-	farcall CheckBattleScene
-	pop bc
-	pop de
-	pop hl
-	ret
-
-; 37ee2
--- a/battle/effects/attract.asm
+++ /dev/null
@@ -1,79 +1,0 @@
-BattleCommand_Attract: ; 377ce
-; attract
-	ld a, [AttackMissed]
-	and a
-	jr nz, .failed
-	call CheckOppositeGender
-	jr c, .failed
-	call CheckHiddenOpponent
-	jr nz, .failed
-	ld a, BATTLE_VARS_SUBSTATUS1_OPP
-	call GetBattleVarAddr
-	bit SUBSTATUS_IN_LOVE, [hl]
-	jr nz, .failed
-
-	set SUBSTATUS_IN_LOVE, [hl]
-	call AnimateCurrentMove
-
-; 'fell in love!'
-	ld hl, FellInLoveText
-	jp StdBattleTextBox
-
-.failed
-	jp FailAttract
-; 377f5
-
-
-CheckOppositeGender: ; 377f5
-	ld a, MON_SPECIES
-	call BattlePartyAttr
-	ld a, [hl]
-	ld [CurPartySpecies], a
-
-	ld a, [CurBattleMon]
-	ld [CurPartyMon], a
-	xor a
-	ld [MonType], a
-
-	farcall GetGender
-	jr c, .genderless_samegender
-
-	ld b, 1
-	jr nz, .got_gender
-	dec b
-
-.got_gender
-	push bc
-	ld a, [TempEnemyMonSpecies]
-	ld [CurPartySpecies], a
-	ld hl, EnemyMonDVs
-	ld a, [EnemySubStatus5]
-	bit SUBSTATUS_TRANSFORMED, a
-	jr z, .not_transformed
-	ld hl, wEnemyBackupDVs
-.not_transformed
-	ld a, [hli]
-	ld [TempMonDVs], a
-	ld a, [hl]
-	ld [TempMonDVs + 1], a
-	ld a, 3
-	ld [MonType], a
-	farcall GetGender
-	pop bc
-	jr c, .genderless_samegender
-
-	ld a, 1
-	jr nz, .got_enemy_gender
-	dec a
-
-.got_enemy_gender
-	xor b
-	jr z, .genderless_samegender
-
-	and a
-	ret
-
-.genderless_samegender
-	scf
-	ret
-; 3784b
--- a/battle/effects/curse.asm
+++ /dev/null
@@ -1,97 +1,0 @@
-BattleCommand_Curse: ; 37588
-; curse
-
-	ld de, BattleMonType1
-	ld bc, PlayerStatLevels
-	ld a, [hBattleTurn]
-	and a
-	jr z, .go
-	ld de, EnemyMonType1
-	ld bc, EnemyStatLevels
-
-.go
-
-; Curse is different for Ghost-types.
-
-	ld a, [de]
-	cp GHOST
-	jr z, .ghost
-	inc de
-	ld a, [de]
-	cp GHOST
-	jr z, .ghost
-
-
-; If no stats can be increased, don't.
-
-; Attack
-	ld a, [bc]
-	cp MAX_STAT_LEVEL
-	jr c, .raise
-
-; Defense
-	inc bc
-	ld a, [bc]
-	cp MAX_STAT_LEVEL
-	jr nc, .cantraise
-
-.raise
-
-; Raise Attack and Defense, and lower Speed.
-
-	ld a, $1
-	ld [wKickCounter], a
-	call AnimateCurrentMove
-	ld a, SPEED
-	call LowerStat
-	call BattleCommand_SwitchTurn
-	call BattleCommand_StatDownMessage
-	call ResetMiss
-	call BattleCommand_SwitchTurn
-	call BattleCommand_AttackUp
-	call BattleCommand_StatUpMessage
-	call ResetMiss
-	call BattleCommand_DefenseUp
-	jp BattleCommand_StatUpMessage
-
-
-.ghost
-
-; Cut HP in half and put a curse on the opponent.
-
-	call CheckHiddenOpponent
-	jr nz, .failed
-
-	call CheckSubstituteOpp
-	jr nz, .failed
-
-	ld a, BATTLE_VARS_SUBSTATUS1_OPP
-	call GetBattleVarAddr
-	bit SUBSTATUS_CURSE, [hl]
-	jr nz, .failed
-
-	set SUBSTATUS_CURSE, [hl]
-	call AnimateCurrentMove
-	ld hl, GetHalfMaxHP
-	call CallBattleCore
-	ld hl, SubtractHPFromUser
-	call CallBattleCore
-	call UpdateUserInParty
-	ld hl, PutACurseText
-	jp StdBattleTextBox
-
-.failed
-	call AnimateFailedMove
-	jp PrintButItFailed
-
-
-.cantraise
-
-; Can't raise either stat.
-
-	ld b, ABILITY + 1
-	call GetStatName
-	call AnimateFailedMove
-	ld hl, WontRiseAnymoreText
-	jp StdBattleTextBox
-; 37618
--- a/battle/effects/endure.asm
+++ /dev/null
@@ -1,17 +1,0 @@
-BattleCommand_Endure: ; 3766f
-; endure
-
-; Endure shares code with Protect. See protect.asm.
-
-	call ProtectChance
-	ret c
-
-	ld a, BATTLE_VARS_SUBSTATUS1
-	call GetBattleVarAddr
-	set SUBSTATUS_ENDURE, [hl]
-
-	call AnimateCurrentMove
-
-	ld hl, BracedItselfText
-	jp StdBattleTextBox
-; 37683
--- a/battle/effects/foresight.asm
+++ /dev/null
@@ -1,23 +1,0 @@
-BattleCommand_Foresight: ; 376a0
-; foresight
-
-	ld a, [AttackMissed]
-	and a
-	jr nz, .failed
-
-	call CheckHiddenOpponent
-	jr nz, .failed
-
-	ld a, BATTLE_VARS_SUBSTATUS1_OPP
-	call GetBattleVarAddr
-	bit SUBSTATUS_IDENTIFIED, [hl]
-	jr nz, .failed
-
-	set SUBSTATUS_IDENTIFIED, [hl]
-	call AnimateCurrentMove
-	ld hl, IdentifiedText
-	jp StdBattleTextBox
-
-.failed
-	jp FailForesight
-; 376c2
--- a/battle/effects/metronome.asm
+++ /dev/null
@@ -1,61 +1,0 @@
-BattleCommand_Metronome: ; 37418
-; metronome
-
-	call ClearLastMove
-	call CheckUserIsCharging
-	jr nz, .asm_3742b
-
-	ld a, [wKickCounter]
-	push af
-	call BattleCommand_LowerSub
-	pop af
-	ld [wKickCounter], a
-
-.asm_3742b
-	call LoadMoveAnim
-
-.GetMove:
-	call BattleRandom
-
-; No invalid moves.
-	cp NUM_ATTACKS + 1
-	jr nc, .GetMove
-
-; None of the moves in MetronomeExcepts.
-	push af
-	ld de, 1
-	ld hl, MetronomeExcepts
-	call IsInArray
-	pop bc
-	jr c, .GetMove
-
-; No moves the user already has.
-	ld a, b
-	call CheckUserMove
-	jr z, .GetMove
-
-
-	ld a, BATTLE_VARS_MOVE
-	call GetBattleVarAddr
-	ld [hl], b
-	call UpdateMoveData
-	jp ResetTurn
-; 37454
-
-
-MetronomeExcepts: ; 37454
-	db NO_MOVE
-	db METRONOME
-	db STRUGGLE
-	db SKETCH
-	db MIMIC
-	db COUNTER
-	db MIRROR_COAT
-	db PROTECT
-	db DETECT
-	db ENDURE
-	db DESTINY_BOND
-	db SLEEP_TALK
-	db THIEF
-	db -1
-; 37462
--- a/battle/effects/mirror_move.asm
+++ /dev/null
@@ -1,52 +1,0 @@
-BattleCommand_MirrorMove: ; 373c9
-; mirrormove
-
-	call ClearLastMove
-
-	ld a, BATTLE_VARS_MOVE
-	call GetBattleVarAddr
-
-	ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
-	call GetBattleVar
-	and a
-	jr z, .failed
-
-	call CheckUserMove
-	jr nz, .use
-
-.failed
-	call AnimateFailedMove
-
-	ld hl, MirrorMoveFailedText
-	call StdBattleTextBox
-	jp EndMoveEffect
-
-.use
-	ld a, b
-	ld [hl], a
-	ld [wd265], a
-
-	push af
-	ld a, BATTLE_VARS_MOVE_ANIM
-	call GetBattleVarAddr
-	ld d, h
-	ld e, l
-	pop af
-
-	dec a
-	call GetMoveData
-	call GetMoveName
-	call CopyName1
-	call CheckUserIsCharging
-	jr nz, .done
-
-	ld a, [wKickCounter]
-	push af
-	call BattleCommand_LowerSub
-	pop af
-	ld [wKickCounter], a
-
-.done
-	call BattleCommand_MoveDelay
-	jp ResetTurn
-; 37418
--- a/battle/effects/nightmare.asm
+++ /dev/null
@@ -1,38 +1,0 @@
-BattleCommand_Nightmare: ; 37536
-; nightmare
-
-; Can't hit an absent opponent.
-
-	call CheckHiddenOpponent
-	jr nz, .failed
-
-; Can't hit a substitute.
-
-	call CheckSubstituteOpp
-	jr nz, .failed
-
-; Only works on a sleeping opponent.
-
-	ld a, BATTLE_VARS_STATUS_OPP
-	call GetBattleVarAddr
-	and SLP
-	jr z, .failed
-
-; Bail if the opponent is already having a nightmare.
-
-	ld a, BATTLE_VARS_SUBSTATUS1_OPP
-	call GetBattleVarAddr
-	bit SUBSTATUS_NIGHTMARE, [hl]
-	jr nz, .failed
-
-; Otherwise give the opponent a nightmare.
-
-	set SUBSTATUS_NIGHTMARE, [hl]
-	call AnimateCurrentMove
-	ld hl, StartedNightmareText
-	jp StdBattleTextBox
-
-.failed
-	call AnimateFailedMove
-	jp PrintButItFailed
-; 37563
--- a/battle/effects/perish_song.asm
+++ /dev/null
@@ -1,40 +1,0 @@
-BattleCommand_PerishSong: ; 376c2
-; perishsong
-
-
-	ld hl, PlayerSubStatus1
-	ld de, EnemySubStatus1
-	bit SUBSTATUS_PERISH, [hl]
-	jr z, .ok
-
-	ld a, [de]
-	bit SUBSTATUS_PERISH, a
-	jr nz, .failed
-
-.ok
-	bit SUBSTATUS_PERISH, [hl]
-	jr nz, .enemy
-
-	set SUBSTATUS_PERISH, [hl]
-	ld a, 4
-	ld [PlayerPerishCount], a
-
-.enemy
-	ld a, [de]
-	bit SUBSTATUS_PERISH, a
-	jr nz, .done
-
-	set SUBSTATUS_PERISH, a
-	ld [de], a
-	ld a, 4
-	ld [EnemyPerishCount], a
-
-.done
-	call AnimateCurrentMove
-	ld hl, StartPerishText
-	jp StdBattleTextBox
-
-.failed
-	call AnimateFailedMove
-	jp PrintButItFailed
-; 376f8
--- a/battle/effects/present.asm
+++ /dev/null
@@ -1,93 +1,0 @@
-BattleCommand_Present: ; 37874
-; present
-
-	ld a, [wLinkMode]
-	cp LINK_COLOSSEUM
-	jr z, .colosseum_skippush
-	push bc
-	push de
-.colosseum_skippush
-
-	call BattleCommand_Stab
-
-	ld a, [wLinkMode]
-	cp LINK_COLOSSEUM
-	jr z, .colosseum_skippop
-	pop de
-	pop bc
-.colosseum_skippop
-
-	ld a, [wTypeMatchup]
-	and a
-	jp z, AnimateFailedMove
-	ld a, [AttackMissed]
-	and a
-	jp nz, AnimateFailedMove
-
-	push bc
-	call BattleRandom
-	ld b, a
-	ld hl, .PresentPower
-	ld c, 0
-.next
-	ld a, [hli]
-	cp $ff
-	jr z, .heal_effect ; 378a4 $11
-	cp b
-	jr nc, .got_power ; 378a7 $4
-	inc c
-	inc hl
-	jr .next ; 378ab $f4
-
-.got_power
-	ld a, c
-	ld [wPresentPower], a
-	call AnimateCurrentMoveEitherSide
-	ld d, [hl]
-	pop bc
-	ret
-
-.heal_effect
-	pop bc
-	ld a, $3
-	ld [wPresentPower], a
-	call AnimateCurrentMove
-	call BattleCommand_SwitchTurn
-	ld hl, AICheckPlayerMaxHP
-	ld a, [hBattleTurn]
-	and a
-	jr z, .got_hp_fn_pointer ; 378c9 $3
-	ld hl, AICheckEnemyMaxHP
-.got_hp_fn_pointer
-	ld a, BANK(AICheckPlayerMaxHP)
-	rst FarCall
-	jr c, .already_fully_healed ; 378d1 $20
-
-	ld hl, GetQuarterMaxHP
-	call CallBattleCore
-	call BattleCommand_SwitchTurn
-	ld hl, RestoreHP
-	call CallBattleCore
-	call BattleCommand_SwitchTurn
-	ld hl, RegainedHealthText
-	call StdBattleTextBox
-	call BattleCommand_SwitchTurn
-	call UpdateOpponentInParty
-	jr .do_animation ; 378f1 $11
-
-.already_fully_healed
-	call BattleCommand_SwitchTurn
-	call _CheckBattleScene
-	jr nc, .do_animation ; 378f9 $9
-	call AnimateFailedMove
-	ld hl, RefusedGiftText
-	call StdBattleTextBox
-.do_animation
-	jp EndMoveEffect
-
-.PresentPower:
-	db 40 percent,     40
-	db 70 percent + 1, 80
-	db 80 percent,    120
-	db $ff
-; 3790e
--- a/battle/effects/protect.asm
+++ /dev/null
@@ -1,80 +1,0 @@
-BattleCommand_Protect: ; 37618
-; protect
-	call ProtectChance
-	ret c
-
-	ld a, BATTLE_VARS_SUBSTATUS1
-	call GetBattleVarAddr
-	set SUBSTATUS_PROTECT, [hl]
-
-	call AnimateCurrentMove
-
-	ld hl, ProtectedItselfText
-	jp StdBattleTextBox
-; 3762c
-
-
-ProtectChance: ; 3762c
-
-	ld de, PlayerProtectCount
-	ld a, [hBattleTurn]
-	and a
-	jr z, .asm_37637
-	ld de, EnemyProtectCount
-.asm_37637
-
-	call CheckOpponentWentFirst
-	jr nz, .failed
-
-; Can't have a substitute.
-
-	ld a, BATTLE_VARS_SUBSTATUS4
-	call GetBattleVar
-	bit SUBSTATUS_SUBSTITUTE, a
-	jr nz, .failed
-
-; Halve the chance of a successful Protect for each consecutive use.
-
-	ld b, $ff
-	ld a, [de]
-	ld c, a
-.loop
-	ld a, c
-	and a
-	jr z, .done
-	dec c
-
-	srl b
-	ld a, b
-	and a
-	jr nz, .loop
-	jr .failed
-.done
-
-.rand
-	call BattleRandom
-	and a
-	jr z, .rand
-
-	dec a
-	cp b
-	jr nc, .failed
-
-; Another consecutive Protect use.
-
-	ld a, [de]
-	inc a
-	ld [de], a
-
-	and a
-	ret
-
-
-.failed
-	xor a
-	ld [de], a
-	call AnimateFailedMove
-	call PrintButItFailed
-	scf
-	ret
-; 3766f
--- a/battle/effects/rollout.asm
+++ /dev/null
@@ -1,99 +1,0 @@
-MAX_ROLLOUT_COUNT EQU 5
-
-
-BattleCommand_CheckCurl: ; 37718
-; checkcurl
-
-	ld de, PlayerRolloutCount
-	ld a, [hBattleTurn]
-	and a
-	jr z, .ok
-	ld de, EnemyRolloutCount
-.ok
-	ld a, BATTLE_VARS_SUBSTATUS1
-	call GetBattleVar
-	bit SUBSTATUS_ROLLOUT, a
-	jr z, .reset
-
-	ld b, $4 ; doturn
-	jp SkipToBattleCommand
-
-.reset
-	xor a
-	ld [de], a
-	ret
-; 37734
-
-
-BattleCommand_RolloutPower: ; 37734
-; rolloutpower
-
-	ld a, BATTLE_VARS_STATUS
-	call GetBattleVar
-	and SLP
-	ret nz
-
-	ld hl, PlayerRolloutCount
-	ld a, [hBattleTurn]
-	and a
-	jr z, .got_rollout_count
-	ld hl, EnemyRolloutCount
-
-.got_rollout_count
-	ld a, [hl]
-	and a
-	jr nz, .skip_set_rampage
-	ld a, 1
-	ld [wSomeoneIsRampaging], a
-
-.skip_set_rampage
-	ld a, [AttackMissed]
-	and a
-	jr z, .hit
-
-	ld a, BATTLE_VARS_SUBSTATUS1
-	call GetBattleVarAddr
-	res 6, [hl]
-	ret
-
-.hit
-	inc [hl]
-	ld a, [hl]
-	ld b, a
-	cp MAX_ROLLOUT_COUNT
-	jr c, .not_done_with_rollout
-
-	ld a, BATTLE_VARS_SUBSTATUS1
-	call GetBattleVarAddr
-	res SUBSTATUS_ROLLOUT, [hl]
-	jr .done_with_substatus_flag
-
-.not_done_with_rollout
-	ld a, BATTLE_VARS_SUBSTATUS1
-	call GetBattleVarAddr
-	set SUBSTATUS_ROLLOUT, [hl]
-
-.done_with_substatus_flag
-	ld a, BATTLE_VARS_SUBSTATUS2
-	call GetBattleVar
-	bit SUBSTATUS_CURLED, a
-	jr z, .not_curled
-	inc b
-.not_curled
-.loop
-	dec b
-	jr z, .done_damage
-
-	ld hl, CurDamage + 1
-	sla [hl]
-	dec hl
-	rl [hl]
-	jr nc, .loop
-
-	ld a, $ff
-	ld [hli], a
-	ld [hl], a
-
-.done_damage
-	ret
-; 37791
--- a/battle/effects/sandstorm.asm
+++ /dev/null
@@ -1,19 +1,0 @@
-BattleCommand_StartSandstorm: ; 376f8
-; startsandstorm
-
-	ld a, [Weather]
-	cp WEATHER_SANDSTORM
-	jr z, .failed
-
-	ld a, WEATHER_SANDSTORM
-	ld [Weather], a
-	ld a, 5
-	ld [WeatherCount], a
-	call AnimateCurrentMove
-	ld hl, SandstormBrewedText
-	jp StdBattleTextBox
-
-.failed
-	call AnimateFailedMove
-	jp PrintButItFailed
-; 37718
--- a/battle/effects/spikes.asm
+++ /dev/null
@@ -1,27 +1,0 @@
-BattleCommand_Spikes: ; 37683
-; spikes
-
-	ld hl, EnemyScreens
-	ld a, [hBattleTurn]
-	and a
-	jr z, .asm_3768e
-	ld hl, PlayerScreens
-.asm_3768e
-
-; Fails if spikes are already down!
-
-	bit SCREENS_SPIKES, [hl]
-	jr nz, .failed
-
-; Nothing else stops it from working.
-
-	set SCREENS_SPIKES, [hl]
-
-	call AnimateCurrentMove
-
-	ld hl, SpikesText
-	jp StdBattleTextBox
-
-.failed
-	jp FailSpikes
-; 376a0
--- a/battle/effects/thief.asm
+++ /dev/null
@@ -1,116 +1,0 @@
-BattleCommand_Thief: ; 37492
-; thief
-
-	ld a, [hBattleTurn]
-	and a
-	jr nz, .enemy
-
-; The player needs to be able to steal an item.
-
-	call .playeritem
-	ld a, [hl]
-	and a
-	ret nz
-
-; The enemy needs to have an item to steal.
-
-	call .enemyitem
-	ld a, [hl]
-	and a
-	ret z
-
-; Can't steal mail.
-
-	ld [wd265], a
-	ld d, a
-	farcall ItemIsMail
-	ret c
-
-	ld a, [EffectFailed]
-	and a
-	ret nz
-
-	ld a, [wLinkMode]
-	and a
-	jr z, .stealenemyitem
-
-	ld a, [wBattleMode]
-	dec a
-	ret z
-
-.stealenemyitem
-	call .enemyitem
-	xor a
-	ld [hl], a
-	ld [de], a
-
-	call .playeritem
-	ld a, [wd265]
-	ld [hl], a
-	ld [de], a
-	jr .stole
-
-
-.enemy
-
-; The enemy can't already have an item.
-
-	call .enemyitem
-	ld a, [hl]
-	and a
-	ret nz
-
-; The player must have an item to steal.
-
-	call .playeritem
-	ld a, [hl]
-	and a
-	ret z
-
-; Can't steal mail!
-
-	ld [wd265], a
-	ld d, a
-	farcall ItemIsMail
-	ret c
-
-	ld a, [EffectFailed]
-	and a
-	ret nz
-
-; If the enemy steals your item,
-; it's gone for good if you don't get it back.
-
-	call .playeritem
-	xor a
-	ld [hl], a
-	ld [de], a
-
-	call .enemyitem
-	ld a, [wd265]
-	ld [hl], a
-	ld [de], a
-
-
-.stole
-	call GetItemName
-	ld hl, StoleText
-	jp StdBattleTextBox
-
-
-.playeritem
-	ld a, 1
-	call BattlePartyAttr
-	ld d, h
-	ld e, l
-	ld hl, BattleMonItem
-	ret
-
-.enemyitem
-	ld a, 1
-	call OTPartyAttr
-	ld d, h
-	ld e, l
-	ld hl, EnemyMonItem
-	ret
-; 37517
--- a/battle/effects/transform.asm
+++ /dev/null
@@ -1,141 +1,0 @@
-
-BattleCommand_Transform: ; 371cd
-; transform
-
-	call ClearLastMove
-	ld a, BATTLE_VARS_SUBSTATUS5_OPP
-	call GetBattleVarAddr
-	bit SUBSTATUS_TRANSFORMED, [hl]
-	jp nz, BattleEffect_ButItFailed
-	call CheckHiddenOpponent
-	jp nz, BattleEffect_ButItFailed
-	xor a
-	ld [wNumHits], a
-	ld [FXAnimID + 1], a
-	ld a, $1
-	ld [wKickCounter], a
-	ld a, BATTLE_VARS_SUBSTATUS4
-	call GetBattleVarAddr
-	bit SUBSTATUS_SUBSTITUTE, [hl]
-	push af
-	jr z, .mimic_substitute
-	call CheckUserIsCharging
-	jr nz, .mimic_substitute
-	ld a, SUBSTITUTE
-	call LoadAnim
-.mimic_substitute
-	ld a, BATTLE_VARS_SUBSTATUS5
-	call GetBattleVarAddr
-	set SUBSTATUS_TRANSFORMED, [hl]
-	call ResetActorDisable
-	ld hl, BattleMonSpecies
-	ld de, EnemyMonSpecies
-	ld a, [hBattleTurn]
-	and a
-	jr nz, .got_mon_species
-	ld hl, EnemyMonSpecies
-	ld de, BattleMonSpecies
-	xor a
-	ld [CurMoveNum], a
-.got_mon_species
-	push hl
-	ld a, [hli]
-	ld [de], a
-	inc hl
-	inc de
-	inc de
-	ld bc, NUM_MOVES
-	call CopyBytes
-	ld a, [hBattleTurn]
-	and a
-	jr z, .mimic_enemy_backup
-	ld a, [de]
-	ld [wEnemyBackupDVs], a
-	inc de
-	ld a, [de]
-	ld [wEnemyBackupDVs + 1], a
-	dec de
-.mimic_enemy_backup
-; copy DVs
-	ld a, [hli]
-	ld [de], a
-	inc de
-	ld a, [hli]
-	ld [de], a
-	inc de
-; move pointer to stats
-	ld bc, BattleMonStats - BattleMonPP
-	add hl, bc
-	push hl
-	ld h, d
-	ld l, e
-	add hl, bc
-	ld d, h
-	ld e, l
-	pop hl
-	ld bc, BattleMonStructEnd - BattleMonStats
-	call CopyBytes
-; init the power points
-	ld bc, BattleMonMoves - BattleMonStructEnd
-	add hl, bc
-	push de
-	ld d, h
-	ld e, l
-	pop hl
-	ld bc, BattleMonPP - BattleMonStructEnd
-	add hl, bc
-	ld b, NUM_MOVES
-.pp_loop
-	ld a, [de]
-	inc de
-	and a
-	jr z, .done_move
-	cp SKETCH
-	ld a, 1
-	jr z, .done_move
-	ld a, 5
-.done_move
-	ld [hli], a
-	dec b
-	jr nz, .pp_loop
-	pop hl
-	ld a, [hl]
-	ld [wNamedObjectIndexBuffer], a
-	call GetPokemonName
-	ld hl, EnemyStats
-	ld de, PlayerStats
-	ld bc, 2 * 5
-	call BattleSideCopy
-	ld hl, EnemyStatLevels
-	ld de, PlayerStatLevels
-	ld bc, 8
-	call BattleSideCopy
-	call _CheckBattleScene
-	jr c, .mimic_anims
-	ld a, [hBattleTurn]
-	and a
-	ld a, [wPlayerMinimized]
-	jr z, .got_byte
-	ld a, [wEnemyMinimized]
-.got_byte
-	and a
-	jr nz, .mimic_anims
-	call LoadMoveAnim
-	jr .after_anim
-
-.mimic_anims
-	call BattleCommand_MoveDelay
-	call BattleCommand_RaiseSubNoAnim
-.after_anim
-	xor a
-	ld [wNumHits], a
-	ld [FXAnimID + 1], a
-	ld a, $2
-	ld [wKickCounter], a
-	pop af
-	ld a, SUBSTITUTE
-	call nz, LoadAnim
-	ld hl, TransformedText
-	jp StdBattleTextBox
-
-; 372c6
--- a/battle/hidden_power.asm
+++ /dev/null
@@ -1,111 +1,0 @@
-HiddenPowerDamage: ; fbced
-; Override Hidden Power's type and power based on the user's DVs.
-
-	ld hl, BattleMonDVs
-	ld a, [hBattleTurn]
-	and a
-	jr z, .got_dvs
-	ld hl, EnemyMonDVs
-.got_dvs
-
-
-; Power:
-
-; Take the top bit from each stat
-
-	; Attack
-	ld a, [hl]
-	swap a
-	and 8
-
-	; Defense
-	ld b, a
-	ld a, [hli]
-	and 8
-	srl a
-	or b
-
-	; Speed
-	ld b, a
-	ld a, [hl]
-	swap a
-	and 8
-	srl a
-	srl a
-	or b
-
-	; Special
-	ld b, a
-	ld a, [hl]
-	and 8
-	srl a
-	srl a
-	srl a
-	or b
-
-; Multiply by 5
-	ld b, a
-	add a
-	add a
-	add b
-
-; Add Special & 3
-	ld b, a
-	ld a, [hld]
-	and 3
-	add b
-
-; Divide by 2 and add 30 + 1
-	srl a
-	add 30
-	inc a
-
-	ld d, a
-
-
-; Type:
-
-	; Def & 3
-	ld a, [hl]
-	and 3
-	ld b, a
-
-	; + (Atk & 3) << 2
-	ld a, [hl]
-	and 3 << 4
-	swap a
-	add a
-	add a
-	or b
-
-; Skip Normal
-	inc a
-
-; Skip Bird
-	cp BIRD
-	jr c, .done
-	inc a
-
-; Skip unused types
-	cp UNUSED_TYPES
-	jr c, .done
-	add SPECIAL - UNUSED_TYPES
-
-.done
-
-; Overwrite the current move type.
-	push af
-	ld a, BATTLE_VARS_MOVE_TYPE
-	call GetBattleVarAddr
-	pop af
-	ld [hl], a
-
-; Get the rest of the damage formula variables
-; based on the new type, but keep base power.
-	ld a, d
-	push af
-	farcall BattleCommand_DamageStats ; damagestats
-	pop af
-	ld d, a
-	ret
-; fbd54
--- a/battle/link_result.asm
+++ /dev/null
@@ -1,162 +1,0 @@
-DetermineLinkBattleResult: ; 2b930
-	farcall UpdateEnemyMonInParty
-	ld hl, PartyMon1HP
-	call .CountMonsRemaining
-	push bc
-	ld hl, OTPartyMon1HP
-	call .CountMonsRemaining
-	ld a, c
-	pop bc
-	cp c
-	jr z, .even_number_of_mons_remaining
-	jr c, .defeat
-	jr .victory
-
-.even_number_of_mons_remaining
-	call .BothSides_CheckNumberMonsAtFullHealth
-	jr z, .drawn
-	ld a, e
-	cp $1
-	jr z, .victory
-	cp $2
-	jr z, .defeat
-	ld hl, PartyMon1HP
-	call .CalcPercentHPRemaining
-	push de
-	ld hl, OTPartyMon1HP
-	call .CalcPercentHPRemaining
-	pop hl
-	ld a, d
-	cp h
-	jr c, .victory
-	jr z, .compare_lo
-	jr .defeat
-
-.compare_lo
-	ld a, e
-	cp l
-	jr z, .drawn
-	jr nc, .defeat
-
-.victory
-	ld a, [wBattleResult]
-	and $f0
-	ld [wBattleResult], a
-	ret
-
-.defeat
-	ld a, [wBattleResult]
-	and $f0
-	add $1
-	ld [wBattleResult], a
-	ret
-
-.drawn
-	ld a, [wBattleResult]
-	and $f0
-	add $2
-	ld [wBattleResult], a
-	ret
-
-.CountMonsRemaining: ; 2b995
-	ld c, 0
-	ld b, 3
-	ld de, PARTYMON_STRUCT_LENGTH - 1
-.loop
-	ld a, [hli]
-	or [hl]
-	jr nz, .not_fainted
-	inc c
-
-.not_fainted
-	add hl, de
-	dec b
-	jr nz, .loop
-	ret
-
-.CalcPercentHPRemaining: ; 2b9a6
-	ld de, 0
-	ld c, $3
-.loop2
-	ld a, [hli]
-	or [hl]
-	jr z, .next
-	dec hl
-	xor a
-	ld [hDividend + 0], a
-	ld a, [hli]
-	ld [hDividend + 1], a
-	ld a, [hli]
-	ld [hDividend + 2], a
-	xor a
-	ld [hDividend + 3], a
-	ld a, [hli]
-	ld b, a
-	ld a, [hld]
-	srl b
-	rr a
-	srl b
-	rr a
-	ld [hDivisor], a
-	ld b, $4
-	call Divide
-	ld a, [hQuotient + 2]
-	add e
-	ld e, a
-	ld a, [hQuotient + 1]
-	adc d
-	ld d, a
-	dec hl
-
-.next
-	push de
-	ld de, $2f
-	add hl, de
-	pop de
-	dec c
-	jr nz, .loop2
-	ret
-
-.BothSides_CheckNumberMonsAtFullHealth: ; 2b9e1
-	ld hl, PartyMon1HP
-	call .CheckFaintedOrFullHealth
-	jr nz, .finish ; we have a pokemon that's neither fainted nor at full health
-	ld hl, OTPartyMon1HP
-	call .CheckFaintedOrFullHealth
-	ld e, $1
-	ret
-
-.finish
-	ld hl, OTPartyMon1HP
-	call .CheckFaintedOrFullHealth
-	ld e, $0
-	ret nz ; we both have pokemon that are neither fainted nor at full health
-	ld e, $2
-	ld a, $1
-	and a
-	ret
-
-.CheckFaintedOrFullHealth: ; 2ba01
-	ld d, 3
-.loop3
-	ld a, [hli]
-	ld b, a
-	ld a, [hli]
-	ld c, a
-	or b
-	jr z, .fainted_or_full_health
-	ld a, [hli]
-	cp b
-	ret nz
-	ld a, [hld]
-	cp c
-	ret nz
-
-.fainted_or_full_health
-	push de
-	ld de, PARTYMON_STRUCT_LENGTH - 2
-	add hl, de
-	pop de
-	dec d
-	jr nz, .loop3
-	ret
--- a/battle/menu.asm
+++ /dev/null
@@ -1,118 +1,0 @@
-LoadBattleMenu: ; 24ef2
-	ld hl, BattleMenuDataHeader
-	call LoadMenuDataHeader
-	ld a, [wBattleMenuCursorBuffer]
-	ld [wMenuCursorBuffer], a
-	call InterpretBattleMenu
-	ld a, [wMenuCursorBuffer]
-	ld [wBattleMenuCursorBuffer], a
-	call ExitMenu
-	ret
-; 24f0b
-
-SafariBattleMenu: ; 24f0b
-; untranslated
-	ld hl, MenuDataHeader_0x24f4e
-	call LoadMenuDataHeader
-	jr Function24f19
-; 24f13
-
-ContestBattleMenu: ; 24f13
-	ld hl, MenuDataHeader_0x24f89
-	call LoadMenuDataHeader
-; 24f19
-
-Function24f19: ; 24f19
-	ld a, [wBattleMenuCursorBuffer]
-	ld [wMenuCursorBuffer], a
-	call _2DMenu
-	ld a, [wMenuCursorBuffer]
-	ld [wBattleMenuCursorBuffer], a
-	call ExitMenu
-	ret
-; 24f2c
-
-BattleMenuDataHeader: ; 24f2c
-	db $40 ; flags
-	db 12, 08 ; start coords
-	db 17, 19 ; end coords
-	dw MenuData_0x24f34
-	db 1 ; default option
-; 24f34
-
-MenuData_0x24f34: ; 0x24f34
-	db $81 ; flags
-	dn 2, 2 ; rows, columns
-	db 6 ; spacing
-	dba Strings24f3d
-	dbw BANK(MenuData_0x24f34), 0
-; 0x24f3d
-
-Strings24f3d: ; 0x24f3d
-	db "FIGHT@"
-	db "<PKMN>@"
-	db "PACK@"
-	db "RUN@"
-; 24f4e
-
-MenuDataHeader_0x24f4e: ; 24f4e
-	db $40 ; flags
-	db 12, 00 ; start coords
-	db 17, 19 ; end coords
-	dw MenuData_0x24f56
-	db 1 ; default option
-; 24f56
-
-MenuData_0x24f56: ; 24f56
-	db $81 ; flags
-	dn 2, 2 ; rows, columns
-	db 11 ; spacing
-	dba Strings24f5f
-	dba Function24f7c
-; 24f5f
-
-Strings24f5f: ; 24f5f
-	db "サファりボール×  @" ; "SAFARI BALL×  @"
-	db "エサをなげる@" ; "THROW BAIT"
-	db "いしをなげる@" ; "THROW ROCK"
-	db "にげる@" ; "RUN"
-; 24f7c
-
-Function24f7c: ; 24f7c
-	hlcoord 17, 13
-	ld de, wSafariBallsRemaining
-	lb bc, PRINTNUM_LEADINGZEROS | 1, 2
-	call PrintNum
-	ret
-; 24f89
-
-MenuDataHeader_0x24f89: ; 24f89
-	db $40 ; flags
-	db 12, 02 ; start coords
-	db 17, 19 ; end coords
-	dw MenuData_0x24f91
-	db 1 ; default option
-; 24f91
-
-MenuData_0x24f91: ; 24f91
-	db $81 ; flags
-	dn 2, 2 ; rows, columns
-	db 12 ; spacing
-	dba Strings24f9a
-	dba Function24fb2
-; 24f9a
-
-Strings24f9a: ; 24f9a
-	db "FIGHT@"
-	db "<PKMN>", "@"
-	db "PARKBALL×  @"
-	db "RUN@"
-; 24fb2
-
-Function24fb2: ; 24fb2
-	hlcoord 13, 16
-	ld de, wParkBallsRemaining
-	lb bc, PRINTNUM_LEADINGZEROS | 1, 2
-	call PrintNum
-	ret
-; 24fbf
--- a/battle/misc.asm
+++ /dev/null
@@ -1,257 +1,0 @@
-_DisappearUser: ; fbd54
-	xor a
-	ld [hBGMapMode], a
-	ld a, [hBattleTurn]
-	and a
-	jr z, .player
-	call GetEnemyFrontpicCoords
-	jr .okay
-.player
-	call GetPlayerBackpicCoords
-.okay
-	call ClearBox
-	jr FinishAppearDisappearUser
-
-_AppearUserRaiseSub: ; fbd69 (3e:7d69)
-	farcall BattleCommand_RaiseSubNoAnim
-	jr AppearUser
-
-_AppearUserLowerSub: ; fbd71 (3e:7d71)
-	farcall BattleCommand_LowerSubNoAnim
-
-AppearUser: ; fbd77 (3e:7d77)
-	xor a
-	ld [hBGMapMode], a
-	ld a, [hBattleTurn]
-	and a
-	jr z, .player
-	call GetEnemyFrontpicCoords
-	xor a
-	jr .okay
-.player
-	call GetPlayerBackpicCoords
-	ld a, $31
-.okay
-	ld [hGraphicStartTile], a
-	predef PlaceGraphic
-FinishAppearDisappearUser: ; fbd91 (3e:7d91)
-	ld a, $1
-	ld [hBGMapMode], a
-	ret
-
-GetEnemyFrontpicCoords: ; fbd96 (3e:7d96)
-	hlcoord 12, 0
-	lb bc, 7, 7
-	ret
-
-GetPlayerBackpicCoords: ; fbd9d (3e:7d9d)
-	hlcoord 2, 6
-	lb bc, 6, 6
-	ret
-
-
-DoWeatherModifiers: ; fbda4
-
-	ld de, .WeatherTypeModifiers
-	ld a, [Weather]
-	ld b, a
-	ld a, [wd265] ; move type
-	ld c, a
-
-.CheckWeatherType:
-	ld a, [de]
-	inc de
-	cp $ff
-	jr z, .done_weather_types
-
-	cp b
-	jr nz, .NextWeatherType
-
-	ld a, [de]
-	cp c
-	jr z, .ApplyModifier
-
-.NextWeatherType:
-	inc de
-	inc de
-	jr .CheckWeatherType
-
-
-.done_weather_types
-	ld de, .WeatherMoveModifiers
-
-	ld a, BATTLE_VARS_MOVE_EFFECT
-	call GetBattleVar
-	ld c, a
-
-.CheckWeatherMove:
-	ld a, [de]
-	inc de
-	cp $ff
-	jr z, .done
-
-	cp b
-	jr nz, .NextWeatherMove
-
-	ld a, [de]
-	cp c
-	jr z, .ApplyModifier
-
-.NextWeatherMove:
-	inc de
-	inc de
-	jr .CheckWeatherMove
-
-.ApplyModifier:
-	xor a
-	ld [hMultiplicand + 0], a
-	ld hl, CurDamage
-	ld a, [hli]
-	ld [hMultiplicand + 1], a
-	ld a, [hl]
-	ld [hMultiplicand + 2], a
-
-	inc de
-	ld a, [de]
-	ld [hMultiplier], a
-
-	call Multiply
-
-	ld a, 10
-	ld [hDivisor], a
-	ld b, $4
-	call Divide
-
-	ld a, [hQuotient + 0]
-	and a
-	ld bc, -1
-	jr nz, .Update
-
-	ld a, [hQuotient + 1]
-	ld b, a
-	ld a, [hQuotient + 2]
-	ld c, a
-	or b
-	jr nz, .Update
-
-	ld bc, 1
-
-.Update:
-	ld a, b
-	ld [CurDamage], a
-	ld a, c
-	ld [CurDamage + 1], a
-
-.done
-	ret
-
-.WeatherTypeModifiers:
-	db WEATHER_RAIN, WATER, 15
-	db WEATHER_RAIN, FIRE,  05
-	db WEATHER_SUN,  FIRE,  15
-	db WEATHER_SUN,  WATER, 05
-	db $ff
-
-.WeatherMoveModifiers:
-	db WEATHER_RAIN, EFFECT_SOLARBEAM, 05
-	db $ff
-; fbe24
-
-
-DoBadgeTypeBoosts: ; fbe24
-	ld a, [wLinkMode]
-	and a
-	ret nz
-
-	ld a, [InBattleTowerBattle]
-	and a
-	ret nz
-
-	ld a, [hBattleTurn]
-	and a
-	ret nz
-
-	push de
-	push bc
-
-	ld hl, .BadgeTypes
-
-	ld a, [KantoBadges]
-	ld b, a
-	ld a, [JohtoBadges]
-	ld c, a
-
-.CheckBadge:
-	ld a, [hl]
-	cp $ff
-	jr z, .done
-
-	srl b
-	rr c
-	jr nc, .NextBadge
-
-	ld a, [wd265] ; move type
-	cp [hl]
-	jr z, .ApplyBoost
-
-.NextBadge:
-	inc hl
-	jr .CheckBadge
-
-.ApplyBoost:
-	ld a, [CurDamage]
-	ld h, a
-	ld d, a
-	ld a, [CurDamage + 1]
-	ld l, a
-	ld e, a
-
-	srl d
-	rr e
-	srl d
-	rr e
-	srl d
-	rr e
-
-	ld a, e
-	or d
-	jr nz, .done_min
-	ld e, 1
-
-.done_min
-	add hl, de
-	jr nc, .Update
-
-	ld hl, $ffff
-
-.Update:
-	ld a, h
-	ld [CurDamage], a
-	ld a, l
-	ld [CurDamage + 1], a
-
-.done
-	pop bc
-	pop de
-	ret
-
-.BadgeTypes:
-	db FLYING   ; zephyrbadge
-	db BUG      ; hivebadge
-	db NORMAL   ; plainbadge
-	db GHOST    ; fogbadge
-	db STEEL    ; mineralbadge
-	db FIGHTING ; stormbadge
-	db ICE      ; glacierbadge
-	db DRAGON   ; risingbadge
-
-	db ROCK     ; boulderbadge
-	db WATER    ; cascadebadge
-	db ELECTRIC ; thunderbadge
-	db GRASS    ; rainbowbadge
-	db POISON   ; soulbadge
-	db PSYCHIC  ; marshbadge
-	db FIRE     ; volcanobadge
-	db GROUND   ; earthbadge
-	db $ff
-; fbe91
--- a/battle/move_names.asm
+++ /dev/null
@@ -1,252 +1,0 @@
-MoveNames::
-	db "POUND@"
-	db "KARATE CHOP@"
-	db "DOUBLESLAP@"
-	db "COMET PUNCH@"
-	db "MEGA PUNCH@"
-	db "PAY DAY@"
-	db "FIRE PUNCH@"
-	db "ICE PUNCH@"
-	db "THUNDERPUNCH@"
-	db "SCRATCH@"
-	db "VICEGRIP@"
-	db "GUILLOTINE@"
-	db "RAZOR WIND@"
-	db "SWORDS DANCE@"
-	db "CUT@"
-	db "GUST@"
-	db "WING ATTACK@"
-	db "WHIRLWIND@"
-	db "FLY@"
-	db "BIND@"
-	db "SLAM@"
-	db "VINE WHIP@"
-	db "STOMP@"
-	db "DOUBLE KICK@"
-	db "MEGA KICK@"
-	db "JUMP KICK@"
-	db "ROLLING KICK@"
-	db "SAND-ATTACK@"
-	db "HEADBUTT@"
-	db "HORN ATTACK@"
-	db "FURY ATTACK@"
-	db "HORN DRILL@"
-	db "TACKLE@"
-	db "BODY SLAM@"
-	db "WRAP@"
-	db "TAKE DOWN@"
-	db "THRASH@"
-	db "DOUBLE-EDGE@"
-	db "TAIL WHIP@"
-	db "POISON STING@"
-	db "TWINEEDLE@"
-	db "PIN MISSILE@"
-	db "LEER@"
-	db "BITE@"
-	db "GROWL@"
-	db "ROAR@"
-	db "SING@"
-	db "SUPERSONIC@"
-	db "SONICBOOM@"
-	db "DISABLE@"
-	db "ACID@"
-	db "EMBER@"
-	db "FLAMETHROWER@"
-	db "MIST@"
-	db "WATER GUN@"
-	db "HYDRO PUMP@"
-	db "SURF@"
-	db "ICE BEAM@"
-	db "BLIZZARD@"
-	db "PSYBEAM@"
-	db "BUBBLEBEAM@"
-	db "AURORA BEAM@"
-	db "HYPER BEAM@"
-	db "PECK@"
-	db "DRILL PECK@"
-	db "SUBMISSION@"
-	db "LOW KICK@"
-	db "COUNTER@"
-	db "SEISMIC TOSS@"
-	db "STRENGTH@"
-	db "ABSORB@"
-	db "MEGA DRAIN@"
-	db "LEECH SEED@"
-	db "GROWTH@"
-	db "RAZOR LEAF@"
-	db "SOLARBEAM@"
-	db "POISONPOWDER@"
-	db "STUN SPORE@"
-	db "SLEEP POWDER@"
-	db "PETAL DANCE@"
-	db "STRING SHOT@"
-	db "DRAGON RAGE@"
-	db "FIRE SPIN@"
-	db "THUNDERSHOCK@"
-	db "THUNDERBOLT@"
-	db "THUNDER WAVE@"
-	db "THUNDER@"
-	db "ROCK THROW@"
-	db "EARTHQUAKE@"
-	db "FISSURE@"
-	db "DIG@"
-	db "TOXIC@"
-	db "CONFUSION@"
-	db "PSYCHIC@"
-	db "HYPNOSIS@"
-	db "MEDITATE@"
-	db "AGILITY@"
-	db "QUICK ATTACK@"
-	db "RAGE@"
-	db "TELEPORT@"
-	db "NIGHT SHADE@"
-	db "MIMIC@"
-	db "SCREECH@"
-	db "DOUBLE TEAM@"
-	db "RECOVER@"
-	db "HARDEN@"
-	db "MINIMIZE@"
-	db "SMOKESCREEN@"
-	db "CONFUSE RAY@"
-	db "WITHDRAW@"
-	db "DEFENSE CURL@"
-	db "BARRIER@"
-	db "LIGHT SCREEN@"
-	db "HAZE@"
-	db "REFLECT@"
-	db "FOCUS ENERGY@"
-	db "BIDE@"
-	db "METRONOME@"
-	db "MIRROR MOVE@"
-	db "SELFDESTRUCT@"
-	db "EGG BOMB@"
-	db "LICK@"
-	db "SMOG@"
-	db "SLUDGE@"
-	db "BONE CLUB@"
-	db "FIRE BLAST@"
-	db "WATERFALL@"
-	db "CLAMP@"
-	db "SWIFT@"
-	db "SKULL BASH@"
-	db "SPIKE CANNON@"
-	db "CONSTRICT@"
-	db "AMNESIA@"
-	db "KINESIS@"
-	db "SOFTBOILED@"
-	db "HI JUMP KICK@"
-	db "GLARE@"
-	db "DREAM EATER@"
-	db "POISON GAS@"
-	db "BARRAGE@"
-	db "LEECH LIFE@"
-	db "LOVELY KISS@"
-	db "SKY ATTACK@"
-	db "TRANSFORM@"
-	db "BUBBLE@"
-	db "DIZZY PUNCH@"
-	db "SPORE@"
-	db "FLASH@"
-	db "PSYWAVE@"
-	db "SPLASH@"
-	db "ACID ARMOR@"
-	db "CRABHAMMER@"
-	db "EXPLOSION@"
-	db "FURY SWIPES@"
-	db "BONEMERANG@"
-	db "REST@"
-	db "ROCK SLIDE@"
-	db "HYPER FANG@"
-	db "SHARPEN@"
-	db "CONVERSION@"
-	db "TRI ATTACK@"
-	db "SUPER FANG@"
-	db "SLASH@"
-	db "SUBSTITUTE@"
-	db "STRUGGLE@"
-	db "SKETCH@"
-	db "TRIPLE KICK@"
-	db "THIEF@"
-	db "SPIDER WEB@"
-	db "MIND READER@"
-	db "NIGHTMARE@"
-	db "FLAME WHEEL@"
-	db "SNORE@"
-	db "CURSE@"
-	db "FLAIL@"
-	db "CONVERSION2@"
-	db "AEROBLAST@"
-	db "COTTON SPORE@"
-	db "REVERSAL@"
-	db "SPITE@"
-	db "POWDER SNOW@"
-	db "PROTECT@"
-	db "MACH PUNCH@"
-	db "SCARY FACE@"
-	db "FAINT ATTACK@"
-	db "SWEET KISS@"
-	db "BELLY DRUM@"
-	db "SLUDGE BOMB@"
-	db "MUD-SLAP@"
-	db "OCTAZOOKA@"
-	db "SPIKES@"
-	db "ZAP CANNON@"
-	db "FORESIGHT@"
-	db "DESTINY BOND@"
-	db "PERISH SONG@"
-	db "ICY WIND@"
-	db "DETECT@"
-	db "BONE RUSH@"
-	db "LOCK-ON@"
-	db "OUTRAGE@"
-	db "SANDSTORM@"
-	db "GIGA DRAIN@"
-	db "ENDURE@"
-	db "CHARM@"
-	db "ROLLOUT@"
-	db "FALSE SWIPE@"
-	db "SWAGGER@"
-	db "MILK DRINK@"
-	db "SPARK@"
-	db "FURY CUTTER@"
-	db "STEEL WING@"
-	db "MEAN LOOK@"
-	db "ATTRACT@"
-	db "SLEEP TALK@"
-	db "HEAL BELL@"
-	db "RETURN@"
-	db "PRESENT@"
-	db "FRUSTRATION@"
-	db "SAFEGUARD@"
-	db "PAIN SPLIT@"
-	db "SACRED FIRE@"
-	db "MAGNITUDE@"
-	db "DYNAMICPUNCH@"
-	db "MEGAHORN@"
-	db "DRAGONBREATH@"
-	db "BATON PASS@"
-	db "ENCORE@"
-	db "PURSUIT@"
-	db "RAPID SPIN@"
-	db "SWEET SCENT@"
-	db "IRON TAIL@"
-	db "METAL CLAW@"
-	db "VITAL THROW@"
-	db "MORNING SUN@"
-	db "SYNTHESIS@"
-	db "MOONLIGHT@"
-	db "HIDDEN POWER@"
-	db "CROSS CHOP@"
-	db "TWISTER@"
-	db "RAIN DANCE@"
-	db "SUNNY DAY@"
-	db "CRUNCH@"
-	db "MIRROR COAT@"
-	db "PSYCH UP@"
-	db "EXTREMESPEED@"
-	db "ANCIENTPOWER@"
-	db "SHADOW BALL@"
-	db "FUTURE SIGHT@"
-	db "ROCK SMASH@"
-	db "WHIRLPOOL@"
-	db "BEAT UP@"
--- a/battle/moves/move_descriptions.asm
+++ /dev/null
@@ -1,1270 +1,0 @@
-MoveDescriptions:: ; 2cb52
-; entries correspond to move ids (see constants/move_constants.asm)
-	dw PoundDescription
-	dw KarateChopDescription
-	dw DoubleslapDescription
-	dw CometPunchDescription
-	dw MegaPunchDescription
-	dw PayDayDescription
-	dw FirePunchDescription
-	dw IcePunchDescription
-	dw ThunderpunchDescription
-	dw ScratchDescription
-	dw VicegripDescription
-	dw GuillotineDescription
-	dw RazorWindDescription
-	dw SwordsDanceDescription
-	dw CutDescription
-	dw GustDescription
-	dw WingAttackDescription
-	dw WhirlwindDescription
-	dw FlyDescription
-	dw BindDescription
-	dw SlamDescription
-	dw VineWhipDescription
-	dw StompDescription
-	dw DoubleKickDescription
-	dw MegaKickDescription
-	dw JumpKickDescription
-	dw RollingKickDescription
-	dw SandAttackDescription
-	dw HeadbuttDescription
-	dw HornAttackDescription
-	dw FuryAttackDescription
-	dw HornDrillDescription
-	dw TackleDescription
-	dw BodySlamDescription
-	dw WrapDescription
-	dw TakeDownDescription
-	dw ThrashDescription
-	dw DoubleEdgeDescription
-	dw TailWhipDescription
-	dw PoisonStingDescription
-	dw TwineedleDescription
-	dw PinMissileDescription
-	dw LeerDescription
-	dw BiteDescription
-	dw GrowlDescription
-	dw RoarDescription
-	dw SingDescription
-	dw SupersonicDescription
-	dw SonicboomDescription
-	dw DisableDescription
-	dw AcidDescription
-	dw EmberDescription
-	dw FlamethrowerDescription
-	dw MistDescription
-	dw WaterGunDescription
-	dw HydroPumpDescription
-	dw SurfDescription
-	dw IceBeamDescription
-	dw BlizzardDescription
-	dw PsybeamDescription
-	dw BubblebeamDescription
-	dw AuroraBeamDescription
-	dw HyperBeamDescription
-	dw PeckDescription
-	dw DrillPeckDescription
-	dw SubmissionDescription
-	dw LowKickDescription
-	dw CounterDescription
-	dw SeismicTossDescription
-	dw StrengthDescription
-	dw AbsorbDescription
-	dw MegaDrainDescription
-	dw LeechSeedDescription
-	dw GrowthDescription
-	dw RazorLeafDescription
-	dw SolarbeamDescription
-	dw PoisonpowderDescription
-	dw StunSporeDescription
-	dw SleepPowderDescription
-	dw PetalDanceDescription
-	dw StringShotDescription
-	dw DragonRageDescription
-	dw FireSpinDescription
-	dw ThundershockDescription
-	dw ThunderboltDescription
-	dw ThunderWaveDescription
-	dw ThunderDescription
-	dw RockThrowDescription
-	dw EarthquakeDescription
-	dw FissureDescription
-	dw DigDescription
-	dw ToxicDescription
-	dw ConfusionDescription
-	dw PsychicMDescription
-	dw HypnosisDescription
-	dw MeditateDescription
-	dw AgilityDescription
-	dw QuickAttackDescription
-	dw RageDescription
-	dw TeleportDescription
-	dw NightShadeDescription
-	dw MimicDescription
-	dw ScreechDescription
-	dw DoubleTeamDescription
-	dw RecoverDescription
-	dw HardenDescription
-	dw MinimizeDescription
-	dw SmokescreenDescription
-	dw ConfuseRayDescription
-	dw WithdrawDescription
-	dw DefenseCurlDescription
-	dw BarrierDescription
-	dw LightScreenDescription
-	dw HazeDescription
-	dw ReflectDescription
-	dw FocusEnergyDescription
-	dw BideDescription
-	dw MetronomeDescription
-	dw MirrorMoveDescription
-	dw SelfdestructDescription
-	dw EggBombDescription
-	dw LickDescription
-	dw SmogDescription
-	dw SludgeDescription
-	dw BoneClubDescription
-	dw FireBlastDescription
-	dw WaterfallDescription
-	dw ClampDescription
-	dw SwiftDescription
-	dw SkullBashDescription
-	dw SpikeCannonDescription
-	dw ConstrictDescription
-	dw AmnesiaDescription
-	dw KinesisDescription
-	dw SoftboiledDescription
-	dw HiJumpKickDescription
-	dw GlareDescription
-	dw DreamEaterDescription
-	dw PoisonGasDescription
-	dw BarrageDescription
-	dw LeechLifeDescription
-	dw LovelyKissDescription
-	dw SkyAttackDescription
-	dw TransformDescription
-	dw BubbleDescription
-	dw DizzyPunchDescription
-	dw SporeDescription
-	dw FlashDescription
-	dw PsywaveDescription
-	dw SplashDescription
-	dw AcidArmorDescription
-	dw CrabhammerDescription
-	dw ExplosionDescription
-	dw FurySwipesDescription
-	dw BonemerangDescription
-	dw RestDescription
-	dw RockSlideDescription
-	dw HyperFangDescription
-	dw SharpenDescription
-	dw ConversionDescription
-	dw TriAttackDescription
-	dw SuperFangDescription
-	dw SlashDescription
-	dw SubstituteDescription
-	dw StruggleDescription
-	dw SketchDescription
-	dw TripleKickDescription
-	dw ThiefDescription
-	dw SpiderWebDescription
-	dw MindReaderDescription
-	dw NightmareDescription
-	dw FlameWheelDescription
-	dw SnoreDescription
-	dw CurseDescription
-	dw FlailDescription
-	dw Conversion2Description
-	dw AeroblastDescription
-	dw CottonSporeDescription
-	dw ReversalDescription
-	dw SpiteDescription
-	dw PowderSnowDescription
-	dw ProtectDescription
-	dw MachPunchDescription
-	dw ScaryFaceDescription
-	dw FaintAttackDescription
-	dw SweetKissDescription
-	dw BellyDrumDescription
-	dw SludgeBombDescription
-	dw MudSlapDescription
-	dw OctazookaDescription
-	dw SpikesDescription
-	dw ZapCannonDescription
-	dw ForesightDescription
-	dw DestinyBondDescription
-	dw PerishSongDescription
-	dw IcyWindDescription
-	dw DetectDescription
-	dw BoneRushDescription
-	dw LockOnDescription
-	dw OutrageDescription
-	dw SandstormDescription
-	dw GigaDrainDescription
-	dw EndureDescription
-	dw CharmDescription
-	dw RolloutDescription
-	dw FalseSwipeDescription
-	dw SwaggerDescription
-	dw MilkDrinkDescription
-	dw SparkDescription
-	dw FuryCutterDescription
-	dw SteelWingDescription
-	dw MeanLookDescription
-	dw AttractDescription
-	dw SleepTalkDescription
-	dw HealBellDescription
-	dw ReturnDescription
-	dw PresentDescription
-	dw FrustrationDescription
-	dw SafeguardDescription
-	dw PainSplitDescription
-	dw SacredFireDescription
-	dw MagnitudeDescription
-	dw DynamicpunchDescription
-	dw MegahornDescription
-	dw DragonbreathDescription
-	dw BatonPassDescription
-	dw EncoreDescription
-	dw PursuitDescription
-	dw RapidSpinDescription
-	dw SweetScentDescription
-	dw IronTailDescription
-	dw MetalClawDescription
-	dw VitalThrowDescription
-	dw MorningSunDescription
-	dw SynthesisDescription
-	dw MoonlightDescription
-	dw HiddenPowerDescription
-	dw CrossChopDescription
-	dw TwisterDescription
-	dw RainDanceDescription
-	dw SunnyDayDescription
-	dw CrunchDescription
-	dw MirrorCoatDescription
-	dw PsychUpDescription
-	dw ExtremespeedDescription
-	dw AncientpowerDescription
-	dw ShadowBallDescription
-	dw FutureSightDescription
-	dw RockSmashDescription
-	dw WhirlpoolDescription
-	dw BeatUpDescription
-	dw MoveFCDescription
-	dw MoveFDDescription
-	dw MoveFEDescription
-	dw MoveFFDescription
-	dw Move00Description
-; 2cd52
-
-MoveFCDescription:
-MoveFDDescription:
-MoveFEDescription:
-MoveFFDescription:
-Move00Description:
-	db "?@"
-
-PoundDescription:
-	db   "Pounds with fore-"
-	next "legs or tail.@"
-
-KarateChopDescription:
-	db   "Has a high criti-"
-	next "cal hit ratio.@"
-
-DoubleslapDescription:
-	db   "Repeatedly slaps"
-	next "2-5 times.@"
-
-CometPunchDescription:
-	db   "Repeatedly punches"
-	next "2-5 times.@"
-
-MegaPunchDescription:
-	db   "A powerful punch"
-	next "thrown very hard.@"
-
-PayDayDescription:
-	db   "Throws coins. Gets"
-	next "them back later.@"
-
-FirePunchDescription:
-	db   "A fiery punch. May"
-	next "cause a burn.@"
-
-IcePunchDescription:
-	db   "An icy punch. May"
-	next "cause freezing.@"
-
-ThunderpunchDescription:
-	db   "An electric punch."
-	next "It may paralyze.@"
-
-ScratchDescription:
-	db   "Scratches with"
-	next "sharp claws.@"
-
-VicegripDescription:
-	db   "Grips with power-"
-	next "ful pincers.@"
-
-GuillotineDescription:
-	db   "A one-hit KO,"
-	next "pincer attack.@"
-
-RazorWindDescription:
-	db   "1st turn: Prepare"
-	next "2nd turn: Attack@"
-
-SwordsDanceDescription:
-	db   "A dance that in-"
-	next "creases ATTACK.@"
-
-CutDescription:
-	db   "Cuts using claws,"
-	next "scythes, etc.@"
-
-GustDescription:
-	db   "Whips up a strong"
-	next "gust of wind.@"
-
-WingAttackDescription:
-	db   "Strikes the target"
-	next "with wings.@"
-
-WhirlwindDescription:
-	db   "Blows away the foe"
-	next "& ends battle.@"
-
-FlyDescription:
-	db   "1st turn: Fly"
-	next "2nd turn: Attack@"
-
-BindDescription:
-	db   "Binds the target"
-	next "for 2-5 turns.@"
-
-SlamDescription:
-	db   "Slams the foe with"
-	next "a tail, vine, etc.@"
-
-VineWhipDescription:
-	db   "Whips the foe with"
-	next "slender vines.@"
-
-StompDescription:
-	db   "An attack that may"
-	next "cause flinching.@"
-
-DoubleKickDescription:
-	db   "A double kicking"
-	next "attack.@"
-
-MegaKickDescription:
-	db   "A powerful kicking"
-	next "attack.@"
-
-JumpKickDescription:
-	db   "May miss, damaging"
-	next "the user.@"
-
-RollingKickDescription:
-	db   "A fast, spinning"
-	next "kick.@"
-
-SandAttackDescription:
-	db   "Reduces accuracy"
-	next "by throwing sand.@"
-
-HeadbuttDescription:
-	db   "An attack that may"
-	next "make foe flinch.@"
-
-HornAttackDescription:
-	db   "An attack using a"
-	next "horn to jab.@"
-
-FuryAttackDescription:
-	db   "Jabs the target"
-	next "2-5 times.@"
-
-HornDrillDescription:
-	db   "A one-hit KO,"
-	next "drill attack.@"
-
-TackleDescription:
-	db   "A full-body charge"
-	next "attack.@"
-
-BodySlamDescription:
-	db   "An attack that may"
-	next "cause paralysis.@"
-
-WrapDescription:
-	db   "Squeezes the foe"
-	next "for 2-5 turns.@"
-
-TakeDownDescription:
-	db   "A tackle that also"
-	next "hurts the user.@"
-
-ThrashDescription:
-	db   "Works 2-3 turns"
-	next "and confuses user.@"
-
-DoubleEdgeDescription:
-	db   "A tackle that also"
-	next "hurts the user.@"
-
-TailWhipDescription:
-	db   "Lowers the foe's"
-	next "DEFENSE.@"
-
-PoisonStingDescription:
-	db   "An attack that may"
-	next "poison the target.@"
-
-TwineedleDescription:
-	db   "Jabs the foe twice"
-	next "using stingers.@"
-
-PinMissileDescription:
-	db   "Fires pins that"
-	next "strike 2-5 times.@"
-
-LeerDescription:
-	db   "Reduces the foe's"
-	next "DEFENSE.@"
-
-BiteDescription:
-	db   "An attack that may"
-	next "cause flinching.@"
-
-GrowlDescription:
-	db   "Reduces the foe's"
-	next "ATTACK.@"
-
-RoarDescription:
-	db   "Scares wild foes"
-	next "to end battle.@"
-
-SingDescription:
-	db   "May cause the foe"
-	next "to fall asleep.@"
-
-SupersonicDescription:
-	db   "Sound waves that"
-	next "cause confusion.@"
-
-SonicboomDescription:
-	db   "Always inflicts"
-	next "20HP damage.@"
-
-DisableDescription:
-	db   "Disables the foe's"
-	next "most recent move.@"
-
-AcidDescription:
-	db   "An attack that may"
-	next "lower DEFENSE.@"
-
-EmberDescription:
-	db   "An attack that may"
-	next "inflict a burn.@"
-
-FlamethrowerDescription:
-	db   "An attack that may"
-	next "inflict a burn.@"
-
-MistDescription:
-	db   "Prevents stat"
-	next "reduction.@"
-
-WaterGunDescription:
-	db   "Squirts water to"
-	next "attack.@"
-
-HydroPumpDescription:
-	db   "A powerful water-"
-	next "type attack.@"
-
-SurfDescription:
-	db   "A strong water-"
-	next "type attack.@"
-
-IceBeamDescription:
-	db   "An attack that may"
-	next "freeze the foe.@"
-
-BlizzardDescription:
-	db   "An attack that may"
-	next "freeze the foe.@"
-
-PsybeamDescription:
-	db   "An attack that may"
-	next "confuse the foe.@"
-
-BubblebeamDescription:
-	db   "An attack that may"
-	next "lower SPEED.@"
-
-AuroraBeamDescription:
-	db   "An attack that may"
-	next "lower ATTACK.@"
-
-HyperBeamDescription:
-	db   "1st turn: Attack"
-	next "2nd turn: Rest@"
-
-PeckDescription:
-	db   "Jabs the foe with"
-	next "a beak, etc.@"
-
-DrillPeckDescription:
-	db   "A strong, spin-"
-	next "ning-peck attack.@"
-
-SubmissionDescription:
-	db   "An attack that al-"
-	next "so hurts the user.@"
-
-LowKickDescription:
-	db   "An attack that may"
-	next "cause flinching.@"
-
-CounterDescription:
-	db   "Returns a physical"
-	next "blow double.@"
-
-SeismicTossDescription:
-	db   "The user's level"
-	next "equals damage HP.@"
-
-StrengthDescription:
-	db   "A powerful physi-"
-	next "cal attack.@"
-
-AbsorbDescription:
-	db   "Steals 1/2 of the"
-	next "damage inflicted.@"
-
-MegaDrainDescription:
-	db   "Steals 1/2 of the"
-	next "damage inflicted.@"
-
-LeechSeedDescription:
-	db   "Steals HP from the"
-	next "foe on every turn.@"
-
-GrowthDescription:
-	db   "Raises the SPCL."
-	next "ATK rating.@"
-
-RazorLeafDescription:
-	db   "Has a high criti-"
-	next "cal hit ratio.@"
-
-SolarbeamDescription:
-	db   "1st turn: Prepare"
-	next "2nd turn: Attack@"
-
-PoisonpowderDescription:
-	db   "A move that may"
-	next "poison the foe.@"
-
-StunSporeDescription:
-	db   "A move that may"
-	next "paralyze the foe.@"
-
-SleepPowderDescription:
-	db   "May cause the foe"
-	next "to fall asleep.@"
-
-PetalDanceDescription:
-	db   "Works 2-3 turns"
-	next "and confuses user.@"
-
-StringShotDescription:
-	db   "A move that lowers"
-	next "the foe's SPEED.@"
-
-DragonRageDescription:
-	db   "Always inflicts"
-	next "40HP damage.@"
-
-FireSpinDescription:
-	db   "Traps foe in fire"
-	next "for 2-5 turns.@"
-
-ThundershockDescription:
-	db   "An attack that may"
-	next "cause paralysis.@"
-
-ThunderboltDescription:
-	db   "An attack that may"
-	next "cause paralysis.@"
-
-ThunderWaveDescription:
-	db   "A move that may"
-	next "cause paralysis.@"
-
-ThunderDescription:
-	db   "An attack that may"
-	next "cause paralysis.@"
-
-RockThrowDescription:
-	db   "Drops rocks on the"
-	next "enemy.@"
-
-EarthquakeDescription:
-	db   "Tough but useless"
-	next "vs. flying foes.@"
-
-FissureDescription:
-	db   "A ground-type,"
-	next "one-hit KO attack.@"
-
-DigDescription:
-	db   "1st turn: Burrow"
-	next "2nd turn: Attack@"
-
-ToxicDescription:
-	db   "A poison move with"
-	next "increasing damage.@"
-
-ConfusionDescription:
-	db   "An attack that may"
-	next "cause confusion.@"
-
-PsychicMDescription:
-	db   "An attack that may"
-	next "lower SPCL.DEF.@"
-
-HypnosisDescription:
-	db   "May put the foe to"
-	next "sleep.@"
-
-MeditateDescription:
-	db   "Raises the user's"
-	next "ATTACK.@"
-
-AgilityDescription:
-	db   "Sharply increases"
-	next "the user's SPEED.@"
-
-QuickAttackDescription:
-	db   "Lets the user get"
-	next "in the first hit.@"
-
-RageDescription:
-	db   "Raises ATTACK if"
-	next "the user is hit.@"
-
-TeleportDescription:
-	db   "A move for fleeing"
-	next "from battle.@"
-
-NightShadeDescription:
-	db   "The user's level"
-	next "equals damage HP.@"
-
-MimicDescription:
-	db   "Copies a move used"
-	next "by the foe.@"
-
-ScreechDescription:
-	db   "Sharply reduces"
-	next "the foe's DEFENSE.@"
-
-DoubleTeamDescription:
-	db   "Heightens evasive-"
-	next "ness.@"
-
-RecoverDescription:
-	db   "Restores HP by 1/2"
-	next "the max HP.@"
-
-HardenDescription:
-	db   "Raises the user's"
-	next "DEFENSE.@"
-
-MinimizeDescription:
-	db   "Heightens evasive-"
-	next "ness.@"
-
-SmokescreenDescription:
-	db   "Lowers the foe's"
-	next "accuracy.@"
-
-ConfuseRayDescription:
-	db   "A move that causes"
-	next "confusion.@"
-
-WithdrawDescription:
-	db   "Heightens the"
-	next "user's DEFENSE.@"
-
-DefenseCurlDescription:
-	db   "Heightens the"
-	next "user's DEFENSE.@"
-
-BarrierDescription:
-	db   "Sharply increases"
-	next "user's DEFENSE.@"
-
-LightScreenDescription:
-	db   "Ups SPCL.DEF with"
-	next "a wall of light.@"
-
-HazeDescription:
-	db   "Eliminates all"
-	next "stat changes.@"
-
-ReflectDescription:
-	db   "Raises DEFENSE"
-	next "with a barrier.@"
-
-FocusEnergyDescription:
-	db   "Raises the criti-"
-	next "cal hit ratio.@"
-
-BideDescription:
-	db   "Waits 2-3 turns &"
-	next "hits back double.@"
-
-MetronomeDescription:
-	db   "Randomly uses any"
-	next "#MON move.@"
-
-MirrorMoveDescription:
-	db   "Counters with the"
-	next "same move.@"
-
-SelfdestructDescription:
-	db   "Powerful but makes"
-	next "the user faint.@"
-
-EggBombDescription:
-	db   "Eggs are hurled at"
-	next "the foe.@"
-
-LickDescription:
-	db   "An attack that may"
-	next "cause paralysis.@"
-
-SmogDescription:
-	db   "An attack that may"
-	next "poison the foe.@"
-
-SludgeDescription:
-	db   "An attack that may"
-	next "poison the foe.@"
-
-BoneClubDescription:
-	db   "An attack that may"
-	next "cause flinching.@"
-
-FireBlastDescription:
-	db   "An attack that"
-	next "may cause a burn.@"
-
-WaterfallDescription:
-	db   "An aquatic charge"
-	next "attack.@"
-
-ClampDescription:
-	db   "Traps the foe for"
-	next "2-5 turns.@"
-
-SwiftDescription:
-	db   "An attack that"
-	next "never misses.@"
-
-SkullBashDescription:
-	db   "1st turn: Prepare"
-	next "2nd turn: Attack@"
-
-SpikeCannonDescription:
-	db   "Fires spikes to"
-	next "hit 2-5 times.@"
-
-ConstrictDescription:
-	db   "An attack that may"
-	next "lower SPEED.@"
-
-AmnesiaDescription:
-	db   "Sharply raises the"
-	next "user's SPCL.DEF.@"
-
-KinesisDescription:
-	db   "Reduces the foe's"
-	next "accuracy.@"
-
-SoftboiledDescription:
-	db   "Restores HP by 1/2"
-	next "the user's max HP.@"
-
-HiJumpKickDescription:
-	db   "May miss and hurt"
-	next "the user.@"
-
-GlareDescription:
-	db   "A move that may"
-	next "cause paralysis.@"
-
-DreamEaterDescription:
-	db   "Steals HP from a"
-	next "sleeping victim.@"
-
-PoisonGasDescription:
-	db   "A move that may"
-	next "poison the foe.@"
-
-BarrageDescription:
-	db   "Throws orbs to hit"
-	next "2-5 times.@"
-
-LeechLifeDescription:
-	db   "Steals 1/2 of the"
-	next "damage inflicted.@"
-
-LovelyKissDescription:
-	db   "May cause the foe"
-	next "to fall asleep.@"
-
-SkyAttackDescription:
-	db   "1st turn: Prepare"
-	next "2nd turn: Attack@"
-TransformDescription:
-	db   "The user assumes"
-	next "the foe's guise.@"
-
-BubbleDescription:
-	db   "An attack that may"
-	next "reduce SPEED.@"
-
-DizzyPunchDescription:
-	db   "An attack that may"
-	next "cause confusion.@"
-
-SporeDescription:
-	db   "A move that"
-	next "induces sleep.@"
-
-FlashDescription:
-	db   "Blinds the foe to"
-	next "reduce accuracy.@"
-
-PsywaveDescription:
-	db   "An attack with"
-	next "variable power.@"
-
-SplashDescription:
-	db   "Has no effect"
-	next "whatsoever.@"
-
-AcidArmorDescription:
-	db   "Sharply raises the"
-	next "user's DEFENSE.@"
-
-CrabhammerDescription:
-	db   "Has a high criti-"
-	next "cal hit ratio.@"
-
-ExplosionDescription:
-	db   "Very powerful but"
-	next "makes user faint.@"
-
-FurySwipesDescription:
-	db   "Quickly scratches"
-	next "2-5 times.@"
-
-BonemerangDescription:
-	db   "An attack that"
-	next "strikes twice.@"
-
-RestDescription:
-	db   "Sleep for 2 turns"
-	next "to fully recover.@"
-
-RockSlideDescription:
-	db   "An attack that may"
-	next "cause flinching.@"
-
-HyperFangDescription:
-	db   "An attack that may"
-	next "cause flinching.@"
-
-SharpenDescription:
-	db   "A move that raises"
-	next "the user's ATTACK.@"
-
-ConversionDescription:
-	db   "Change user's type"
-	next "to a move's type.@"
-
-TriAttackDescription:
-	db   "Fires three kinds"
-	next "of beams at once.@"
-
-SuperFangDescription:
-	db   "Cuts the foe's HP"
-	next "by 1/2.@"
-
-SlashDescription:
-	db   "Has a high criti-"
-	next "cal hit ratio.@"
-
-SubstituteDescription:
-	db   "Makes a decoy with"
-	next "1/4 user's max HP.@"
-
-StruggleDescription:
-	db   "Used only if all"
-	next "PP are exhausted.@"
-
-SketchDescription:
-	db   "Copies the foe's"
-	next "move permanently.@"
-
-TripleKickDescription:
-	db   "Hits three times"
-	next "with rising power.@"
-
-ThiefDescription:
-	db   "An attack that may"
-	next "steal a held item.@"
-
-SpiderWebDescription:
-	db   "Prevents fleeing"
-	next "or switching.@"
-
-MindReaderDescription:
-	db   "Ensures the next"
-	next "attack will hit.@"
-
-NightmareDescription:
-	db   "A sleeper loses"
-	next "1/4 HP every turn.@"
-
-FlameWheelDescription:
-	db   "An attack that may"
-	next "cause a burn.@"
-
-SnoreDescription:
-	db   "An attack useable"
-	next "only while asleep.@"
-
-CurseDescription:
-	db   "Works differently"
-	next "for ghost-types.@"
-
-FlailDescription:
-	db   "Stronger if the"
-	next "user's HP is low.@"
-
-Conversion2Description:
-	db   "The user's type is"
-	next "made resistant.@"
-
-AeroblastDescription:
-	db   "Has a high criti-"
-	next "cal hit ratio.@"
-
-CottonSporeDescription:
-	db   "Sharply reduces"
-	next "the foe's SPEED.@"
-
-ReversalDescription:
-	db   "Stronger if the"
-	next "user's HP is low.@"
-
-SpiteDescription:
-	db   "Cuts the PP of the"
-	next "foe's last move.@"
-
-PowderSnowDescription:
-	db   "An attack that may"
-	next "cause freezing.@"
-
-ProtectDescription:
-	db   "Foils attack that"
-	next "turn. It may fail.@"
-
-MachPunchDescription:
-	db   "A fast punch that"
-	next "lands first.@"
-
-ScaryFaceDescription:
-	db   "Sharply reduces"
-	next "the foe's SPEED.@"
-
-FaintAttackDescription:
-	db   "An attack that"
-	next "never misses.@"
-
-SweetKissDescription:
-	db   "A move that causes"
-	next "confusion.@"
-
-BellyDrumDescription:
-	db   "Reduces own HP to"
-	next "maximize ATTACK.@"
-
-SludgeBombDescription:
-	db   "An attack that may"
-	next "poison the foe.@"
-
-MudSlapDescription:
-	db   "Reduces the foe's"
-	next "accuracy.@"
-
-OctazookaDescription:
-	db   "An attack that may"
-	next "reduce accuracy.@"
-
-SpikesDescription:
-	db   "Hurts foes when"
-	next "they switch out.@"
-
-ZapCannonDescription:
-	db   "An attack that"
-	next "always paralyzes.@"
-
-ForesightDescription:
-	db   "Negates accuracy"
-	next "reduction moves.@"
-
-DestinyBondDescription:
-	db   "The foe faints if"
-	next "the user does.@"
-
-PerishSongDescription:
-	db   "Both user and foe"
-	next "faint in 3 turns.@"
-
-IcyWindDescription:
-	db   "An icy attack that"
-	next "lowers SPEED.@"
-
-DetectDescription:
-	db   "Evades attack that"
-	next "turn. It may fail.@"
-
-BoneRushDescription:
-	db   "An attack that"
-	next "hits 2-5 times.@"
-
-LockOnDescription:
-	db   "Ensures the next"
-	next "attack will hit.@"
-
-OutrageDescription:
-	db   "Works 2-3 turns"
-	next "and confuses user.@"
-
-SandstormDescription:
-	db   "Inflicts damage"
-	next "every turn.@"
-
-GigaDrainDescription:
-	db   "Steals 1/2 of the"
-	next "damage inflicted.@"
-
-EndureDescription:
-	db   "Always leaves at"
-	next "least 1HP.@"
-
-CharmDescription:
-	db   "Sharply lowers the"
-	next "foe's ATTACK.@"
-
-RolloutDescription:
-	db   "Attacks 5 turns"
-	next "with rising power.@"
-
-FalseSwipeDescription:
-	db   "Leaves the foe"
-	next "with at least 1HP.@"
-
-SwaggerDescription:
-	db   "Causes confusion"
-	next "and raises ATTACK.@"
-
-MilkDrinkDescription:
-	db   "Restores HP by 1/2"
-	next "the max HP.@"
-
-SparkDescription:
-	db   "An attack that may"
-	next "cause paralysis.@"
-
-FuryCutterDescription:
-	db   "Successive hits"
-	next "raise power.@"
-
-SteelWingDescription:
-	db   "Stiff wings strike"
-	next "the foe.@"
-
-MeanLookDescription:
-	db   "Prevents fleeing"
-	next "or switching.@"
-
-AttractDescription:
-	db   "Makes the opposite"
-	next "gender infatuated.@"
-
-SleepTalkDescription:
-	db   "Randomly attacks"
-	next "while asleep.@"
-
-HealBellDescription:
-	db   "Eliminates all"
-	next "status problems.@"
-
-ReturnDescription:
-	db   "An attack that is"
-	next "based on loyalty.@"
-
-PresentDescription:
-	db   "A bomb that may"
-	next "restore HP.@"
-
-FrustrationDescription:
-	db   "An attack based on"
-	next "lack of loyalty.@"
-
-SafeguardDescription:
-	db   "Prevents all"
-	next "status problems.@"
-
-PainSplitDescription:
-	db   "Adds user & foe's"
-	next "HPs. Shares total.@"
-
-SacredFireDescription:
-	db   "An attack that may"
-	next "inflict a burn.@"
-
-MagnitudeDescription:
-	db   "A ground attack"
-	next "with random power.@"
-
-DynamicpunchDescription:
-	db   "An attack that"
-	next "always confuses.@"
-
-MegahornDescription:
-	db   "A powerful charge"
-	next "attack.@"
-
-DragonbreathDescription:
-	db   "A strong breath"
-	next "attack.@"
-
-BatonPassDescription:
-	db   "Switches while"
-	next "keeping effects.@"
-
-EncoreDescription:
-	db   "Makes the foe re-"
-	next "peat 2-6 times.@"
-
-PursuitDescription:
-	db   "Heavily strikes"
-	next "switching #MON.@"
-
-RapidSpinDescription:
-	db   "A high-speed"
-	next "spinning attack.@"
-
-SweetScentDescription:
-	db   "Reduces the foe's"
-	next "evasiveness.@"
-
-IronTailDescription:
-	db   "An attack that may"
-	next "reduce DEFENSE.@"
-
-MetalClawDescription:
-	db   "An attack that may"
-	next "up user's ATTACK.@"
-
-VitalThrowDescription:
-	db   "A 2nd-strike move"
-	next "that never misses.@"
-
-MorningSunDescription:
-	db   "Restores HP"
-	next "(varies by time).@"
-
-SynthesisDescription:
-	db   "Restores HP"
-	next "(varies by time).@"
-
-MoonlightDescription:
-	db   "Restores HP"
-	next "(varies by time).@"
-
-HiddenPowerDescription:
-	db   "The power varies"
-	next "with the #MON.@"
-
-CrossChopDescription:
-	db   "Has a high criti-"
-	next "cal hit ratio.@"
-
-TwisterDescription:
-	db   "Whips up a tornado"
-	next "to attack.@"
-
-RainDanceDescription:
-	db   "Boosts water-type"
-	next "moves for 5 turns.@"
-
-SunnyDayDescription:
-	db   "Boosts fire-type"
-	next "moves for 5 turns.@"
-
-CrunchDescription:
-	db   "An attack that may"
-	next "lower SPCL.DEF.@"
-
-MirrorCoatDescription:
-	db   "Counters a SPCL."
-	next "ATK move double.@"
-
-PsychUpDescription:
-	db   "Copies the foe's"
-	next "stat changes.@"
-
-ExtremespeedDescription:
-	db   "A powerful first-"
-	next "strike move.@"
-
-AncientpowerDescription:
-	db   "An attack that may"
-	next "raise all stats.@"
-
-ShadowBallDescription:
-	db   "An attack that may"
-	next "lower SPCL.DEF.@"
-
-FutureSightDescription:
-	db   "An attack that"
-	next "hits on 3rd turn.@"
-
-RockSmashDescription:
-	db   "An attack that may"
-	next "lower DEFENSE.@"
-
-WhirlpoolDescription:
-	db   "Traps the foe for"
-	next "2-5 turns.@"
-
-BeatUpDescription:
-	db   "Party #MON join"
-	next "in the attack.@"
-; 2ed44
--- a/battle/moves/move_effects.asm
+++ /dev/null
@@ -1,2075 +1,0 @@
-MoveEffects: ; 2732e
-
-NormalHit:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	checkhit
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	kingsrock
-	endmove
-
-DoSleep:
-	checkobedience
-	usedmovetext
-	doturn
-	checkhit
-	checksafeguard
-	sleeptarget
-	endmove
-
-PoisonHit:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	checkhit
-	effectchance
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	poisontarget
-	endmove
-
-LeechHit:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	checkhit
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	draintarget
-	checkdestinybond
-	buildopponentrage
-	kingsrock
-	endmove
-
-BurnHit:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	checkhit
-	effectchance
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	burntarget
-	endmove
-
-FreezeHit:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	checkhit
-	effectchance
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	freezetarget
-	endmove
-
-ParalyzeHit:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	checkhit
-	effectchance
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	paralyzetarget
-	endmove
-
-Selfdestruct:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	checkhit
-	selfdestruct
-	hittargetnosub
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	kingsrock
-	endmove
-
-DreamEater:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	checkhit
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	eatdream
-	checkdestinybond
-	buildopponentrage
-	endmove
-
-MirrorMove:
-	checkobedience
-	usedmovetext
-	doturn
-	mirrormove
-	endmove
-
-AttackUp:
-	checkobedience
-	usedmovetext
-	doturn
-	attackup
-	lowersub
-	statupanim
-	raisesub
-	statupmessage
-	statupfailtext
-	endmove
-
-DefenseUp:
-	checkobedience
-	usedmovetext
-	doturn
-	defenseup
-	lowersub
-	statupanim
-	raisesub
-	statupmessage
-	statupfailtext
-	endmove
-
-SpeedUp:
-	checkobedience
-	usedmovetext
-	doturn
-	speedup
-	lowersub
-	statupanim
-	raisesub
-	statupmessage
-	statupfailtext
-	endmove
-
-SpecialAttackUp:
-	checkobedience
-	usedmovetext
-	doturn
-	specialattackup
-	lowersub
-	statupanim
-	raisesub
-	statupmessage
-	statupfailtext
-	endmove
-
-SpecialDefenseUp:
-	checkobedience
-	usedmovetext
-	doturn
-	specialdefenseup
-	lowersub
-	statupanim
-	raisesub
-	statupmessage
-	statupfailtext
-	endmove
-
-AccuracyUp:
-	checkobedience
-	usedmovetext
-	doturn
-	accuracyup
-	lowersub
-	statupanim
-	raisesub
-	statupmessage
-	statupfailtext
-	endmove
-
-EvasionUp:
-	checkobedience
-	usedmovetext
-	doturn
-	lowersub
-	evasionup
-	statupanim
-	lowersubnoanim
-	raisesub
-	statupmessage
-	statupfailtext
-	endmove
-
-AttackUp2:
-	checkobedience
-	usedmovetext
-	doturn
-	attackup2
-	lowersub
-	statupanim
-	raisesub
-	statupmessage
-	statupfailtext
-	endmove
-
-DefenseUp2:
-	checkobedience
-	usedmovetext
-	doturn
-	defenseup2
-	lowersub
-	statupanim
-	raisesub
-	statupmessage
-	statupfailtext
-	endmove
-
-SpeedUp2:
-	checkobedience
-	usedmovetext
-	doturn
-	speedup2
-	lowersub
-	statupanim
-	raisesub
-	statupmessage
-	statupfailtext
-	endmove
-
-SpecialAttackUp2:
-	checkobedience
-	usedmovetext
-	doturn
-	specialattackup2
-	lowersub
-	statupanim
-	raisesub
-	statupmessage
-	statupfailtext
-	endmove
-
-SpecialDefenseUp2:
-	checkobedience
-	usedmovetext
-	doturn
-	specialdefenseup2
-	lowersub
-	statupanim
-	raisesub
-	statupmessage
-	statupfailtext
-	endmove
-
-AccuracyUp2:
-	checkobedience
-	usedmovetext
-	doturn
-	accuracyup2
-	lowersub
-	statupanim
-	raisesub
-	statupmessage
-	statupfailtext
-	endmove
-
-EvasionUp2:
-	checkobedience
-	usedmovetext
-	doturn
-	evasionup2
-	lowersub
-	statupanim
-	raisesub
-	statupmessage
-	statupfailtext
-	endmove
-
-AttackDown:
-	checkobedience
-	usedmovetext
-	doturn
-	checkhit
-	attackdown
-	lowersub
-	statdownanim
-	raisesub
-	statdownmessage
-	statdownfailtext
-	endmove
-
-DefenseDown:
-	checkobedience
-	usedmovetext
-	doturn
-	checkhit
-	defensedown
-	lowersub
-	statdownanim
-	raisesub
-	statdownmessage
-	statdownfailtext
-	endmove
-
-SpeedDown:
-	checkobedience
-	usedmovetext
-	doturn
-	checkhit
-	speeddown
-	lowersub
-	statdownanim
-	raisesub
-	statdownmessage
-	statdownfailtext
-	endmove
-
-SpecialAttackDown:
-	checkobedience
-	usedmovetext
-	doturn
-	checkhit
-	specialattackdown
-	lowersub
-	statdownanim
-	raisesub
-	statdownmessage
-	statdownfailtext
-	endmove
-
-SpecialDefenseDown:
-	checkobedience
-	usedmovetext
-	doturn
-	checkhit
-	specialdefensedown
-	lowersub
-	statdownanim
-	raisesub
-	statdownmessage
-	statdownfailtext
-	endmove
-
-AccuracyDown:
-	checkobedience
-	usedmovetext
-	doturn
-	checkhit
-	accuracydown
-	lowersub
-	statdownanim
-	raisesub
-	statdownmessage
-	statdownfailtext
-	endmove
-
-EvasionDown:
-	checkobedience
-	usedmovetext
-	doturn
-	checkhit
-	evasiondown
-	lowersub
-	statdownanim
-	raisesub
-	statdownmessage
-	statdownfailtext
-	endmove
-
-AttackDown2:
-	checkobedience
-	usedmovetext
-	doturn
-	checkhit
-	attackdown2
-	lowersub
-	statdownanim
-	raisesub
-	statdownmessage
-	statdownfailtext
-	endmove
-
-DefenseDown2:
-	checkobedience
-	usedmovetext
-	doturn
-	checkhit
-	defensedown2
-	lowersub
-	statdownanim
-	raisesub
-	statdownmessage
-	statdownfailtext
-	endmove
-
-SpeedDown2:
-	checkobedience
-	usedmovetext
-	doturn
-	checkhit
-	speeddown2
-	lowersub
-	statdownanim
-	raisesub
-	statdownmessage
-	statdownfailtext
-	endmove
-
-SpecialAttackDown2:
-	checkobedience
-	usedmovetext
-	doturn
-	checkhit
-	specialattackdown2
-	lowersub
-	statdownanim
-	raisesub
-	statdownmessage
-	statdownfailtext
-	endmove
-
-SpecialDefenseDown2:
-	checkobedience
-	usedmovetext
-	doturn
-	checkhit
-	specialdefensedown2
-	lowersub
-	statdownanim
-	raisesub
-	statdownmessage
-	statdownfailtext
-	endmove
-
-AccuracyDown2:
-	checkobedience
-	usedmovetext
-	doturn
-	checkhit
-	accuracydown2
-	lowersub
-	statdownanim
-	raisesub
-	statdownmessage
-	statdownfailtext
-	endmove
-
-EvasionDown2:
-	checkobedience
-	usedmovetext
-	doturn
-	checkhit
-	evasiondown2
-	lowersub
-	statdownanim
-	raisesub
-	statdownmessage
-	statdownfailtext
-	endmove
-
-AttackDownHit:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	checkhit
-	effectchance
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	attackdown
-	statdownmessage
-	endmove
-
-DefenseDownHit:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	checkhit
-	effectchance
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	effectchance ; bug: duplicate effectchance shouldn't be here
-	defensedown
-	statdownmessage
-	endmove
-
-SpeedDownHit:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	checkhit
-	effectchance
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	speeddown
-	statdownmessage
-	endmove
-
-SpecialAttackDownHit:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	checkhit
-	effectchance
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	specialattackdown
-	statdownmessage
-	endmove
-
-SpecialDefenseDownHit:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	checkhit
-	effectchance
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	specialdefensedown
-	statdownmessage
-	endmove
-
-AccuracyDownHit:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	checkhit
-	effectchance
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	accuracydown
-	statdownmessage
-	endmove
-
-EvasionDownHit:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	checkhit
-	effectchance
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	evasiondown
-	statdownmessage
-	endmove
-
-DefenseUpHit:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	checkhit
-	effectchance
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	defenseup
-	statupmessage
-	endmove
-
-AttackUpHit:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	checkhit
-	effectchance
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	attackup
-	statupmessage
-	endmove
-
-AllUpHit:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	checkhit
-	effectchance
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	allstatsup
-	endmove
-
-PayDay:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	checkhit
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	payday
-	checkdestinybond
-	buildopponentrage
-	kingsrock
-	endmove
-
-Conversion:
-	checkobedience
-	usedmovetext
-	doturn
-	conversion
-	endmove
-
-ResetStats:
-	checkobedience
-	usedmovetext
-	doturn
-	resetstats
-	endmove
-
-Bide:
-	storeenergy
-	checkobedience
-	doturn
-	usedmovetext
-	unleashenergy
-	resettypematchup
-	checkhit
-	hittarget
-	effect0xa5
-	checkfaint
-	checkdestinybond
-	buildopponentrage
-	kingsrock
-	endmove
-
-Rampage:
-	checkrampage
-	checkobedience
-	doturn
-	rampage
-	usedmovetext
-	checkhit
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	clearmissdamage
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	kingsrock
-	endmove
-
-ForceSwitch:
-	checkobedience
-	usedmovetext
-	doturn
-	checkhit
-	forceswitch
-	endmove
-
-MultiHit:
-	checkobedience
-	usedmovetext
-	doturn
-	startloop
-	lowersub
-	checkhit
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	clearmissdamage
-	hittargetnosub
-	failuretext
-	checkfaint
-	criticaltext
-	cleartext
-	supereffectivelooptext
-	checkdestinybond
-	buildopponentrage
-	endloop
-	raisesub
-	kingsrock
-	endmove
-
-PoisonMultiHit:
-	checkobedience
-	usedmovetext
-	doturn
-	startloop
-	lowersub
-	checkhit
-	effectchance
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	clearmissdamage
-	hittargetnosub
-	failuretext
-	checkfaint
-	criticaltext
-	cleartext
-	supereffectivelooptext
-	checkdestinybond
-	buildopponentrage
-	endloop
-	raisesub
-	kingsrock
-	poisontarget
-	endmove
-
-FlinchHit:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	checkhit
-	effectchance
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	flinchtarget
-	endmove
-
-OHKOHit:
-	checkobedience
-	usedmovetext
-	doturn
-	stab
-	ohko
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	endmove
-
-RecoilHit:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	checkhit
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	recoil
-	checkdestinybond
-	buildopponentrage
-	kingsrock
-	endmove
-
-Mist:
-	checkobedience
-	usedmovetext
-	doturn
-	mist
-	endmove
-
-FocusEnergy:
-	checkobedience
-	usedmovetext
-	doturn
-	focusenergy
-	endmove
-
-DoConfuse:
-	checkobedience
-	usedmovetext
-	doturn
-	checkhit
-	checksafeguard
-	confuse
-	endmove
-
-ConfuseHit:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	checkhit
-	effectchance
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	confusetarget
-	endmove
-
-Heal:
-	checkobedience
-	usedmovetext
-	doturn
-	heal
-	endmove
-
-Transform:
-	checkobedience
-	usedmovetext
-	doturn
-	transform
-	endmove
-
-LightScreen:
-Reflect:
-	checkobedience
-	usedmovetext
-	doturn
-	screen
-	endmove
-
-TriAttack:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	checkhit
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	tristatuschance
-	endmove
-
-Toxic:
-DoPoison:
-	checkobedience
-	usedmovetext
-	doturn
-	checkhit
-	stab
-	checksafeguard
-	poison
-	endmove
-
-DoParalyze:
-	checkobedience
-	usedmovetext
-	doturn
-	stab
-	checkhit
-	checksafeguard
-	paralyze
-	endmove
-
-SkyAttack:
-	checkcharge
-	checkobedience
-	doturn
-	charge
-	usedmovetext
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	checkhit
-	effectchance
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	flinchtarget
-	kingsrock
-	endmove
-
-Substitute:
-	checkobedience
-	usedmovetext
-	doturn
-	substitute
-	endmove
-
-HyperBeam:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	checkhit
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	rechargenextturn
-	checkdestinybond
-	buildopponentrage
-	endmove
-
-Rage:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	damagecalc
-	stab
-	checkhit
-	ragedamage
-	damagevariation
-	hittarget
-	failuretext
-	rage
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	kingsrock
-	endmove
-
-Mimic:
-	checkobedience
-	usedmovetext
-	doturn
-	checkhit
-	mimic
-	endmove
-
-Metronome:
-	checkobedience
-	usedmovetext
-	doturn
-	metronome
-	endmove
-
-LeechSeed:
-	checkobedience
-	usedmovetext
-	doturn
-	checkhit
-	leechseed
-	endmove
-
-Splash:
-	checkobedience
-	usedmovetext
-	doturn
-	splash
-	endmove
-
-Disable:
-	checkobedience
-	usedmovetext
-	doturn
-	checkhit
-	disable
-	endmove
-
-RazorWind:
-	checkcharge
-	checkobedience
-	doturn
-	charge
-	usedmovetext
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	checkhit
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	kingsrock
-	endmove
-
-Fly:
-	checkcharge
-	checkobedience
-	doturn
-	charge
-	usedmovetext
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	checkhit
-	hittargetnosub
-	raisesub
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	kingsrock
-	endmove
-
-TrapTarget:
-	checkobedience
-	usedmovetext
-	doturn
-	checkhit
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	clearmissdamage
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	traptarget
-	endmove
-
-SuperFang:
-Psywave:
-StaticDamage:
-	checkobedience
-	usedmovetext
-	doturn
-	constantdamage
-	checkhit
-	resettypematchup
-	hittarget
-	failuretext
-	checkfaint
-	checkdestinybond
-	buildopponentrage
-	kingsrock
-	endmove
-
-Reversal:
-	checkobedience
-	usedmovetext
-	doturn
-	constantdamage
-	stab
-	checkhit
-	hittarget
-	failuretext
-	checkfaint
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	kingsrock
-	endmove
-
-Counter:
-	checkobedience
-	usedmovetext
-	doturn
-	counter
-	hittarget
-	failuretext
-	checkfaint
-	checkdestinybond
-	buildopponentrage
-	kingsrock
-	endmove
-
-Encore:
-	checkobedience
-	usedmovetext
-	doturn
-	checkhit
-	encore
-	endmove
-
-PainSplit:
-	checkobedience
-	usedmovetext
-	doturn
-	checkhit
-	painsplit
-	endmove
-
-Snore:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	checkhit
-	effectchance
-	snore
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	flinchtarget
-	kingsrock
-	endmove
-
-Conversion2:
-	checkobedience
-	usedmovetext
-	doturn
-	checkhit
-	conversion2
-	endmove
-
-LockOn:
-	checkobedience
-	usedmovetext
-	doturn
-	checkhit
-	lockon
-	endmove
-
-Sketch:
-	checkobedience
-	usedmovetext
-	doturn
-	sketch
-	endmove
-
-DefrostOpponent:
-	checkobedience
-	usedmovetext
-	doturn
-	defrostopponent
-	endmove
-
-SleepTalk:
-	checkobedience
-	usedmovetext
-	doturn
-	sleeptalk
-	endmove
-
-DestinyBond:
-	checkobedience
-	usedmovetext
-	doturn
-	destinybond
-	endmove
-
-Spite:
-	checkobedience
-	usedmovetext
-	doturn
-	checkhit
-	spite
-	endmove
-
-FalseSwipe:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	falseswipe
-	checkhit
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	kingsrock
-	endmove
-
-HealBell:
-	checkobedience
-	usedmovetext
-	doturn
-	healbell
-	endmove
-
-TripleKick:
-	checkobedience
-	usedmovetext
-	doturn
-	startloop
-	lowersub
-	checkhit
-	critical
-	damagestats
-	damagecalc
-	triplekick
-	stab
-	damagevariation
-	clearmissdamage
-	hittargetnosub
-	failuretext
-	checkfaint
-	criticaltext
-	cleartext
-	supereffectivelooptext
-	checkdestinybond
-	buildopponentrage
-	kickcounter
-	endloop
-	raisesub
-	kingsrock
-	endmove
-
-Thief:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	checkhit
-	effectchance
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	thief
-	checkdestinybond
-	buildopponentrage
-	kingsrock
-	endmove
-
-MeanLook:
-	checkobedience
-	usedmovetext
-	doturn
-	arenatrap
-	endmove
-
-Nightmare:
-	checkobedience
-	usedmovetext
-	doturn
-	nightmare
-	endmove
-
-FlameWheel:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	checkhit
-	effectchance
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	defrost
-	checkdestinybond
-	buildopponentrage
-	burntarget
-	endmove
-
-Curse:
-	checkobedience
-	usedmovetext
-	doturn
-	curse
-	endmove
-
-Protect:
-	checkobedience
-	usedmovetext
-	doturn
-	protect
-	endmove
-
-Spikes:
-	checkobedience
-	usedmovetext
-	doturn
-	spikes
-	endmove
-
-Foresight:
-	checkobedience
-	usedmovetext
-	doturn
-	checkhit
-	foresight
-	endmove
-
-PerishSong:
-	checkobedience
-	usedmovetext
-	doturn
-	perishsong
-	endmove
-
-Sandstorm:
-	checkobedience
-	usedmovetext
-	doturn
-	startsandstorm
-	endmove
-
-Endure:
-	checkobedience
-	usedmovetext
-	doturn
-	endure
-	endmove
-
-Rollout:
-	checkcurl
-	checkobedience
-	doturn
-	usedmovetext
-	critical
-	damagestats
-	damagecalc
-	stab
-	checkhit
-	rolloutpower
-	damagevariation
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	kingsrock
-	endmove
-
-Swagger:
-	checkobedience
-	usedmovetext
-	doturn
-	checkhit
-	switchturn
-	attackup2
-	switchturn
-	lowersub
-	statupanim
-	raisesub
-	failuretext
-	switchturn
-	statupmessage
-	switchturn
-	confusetarget
-	endmove
-
-FuryCutter:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	damagecalc
-	stab
-	checkhit
-	furycutter
-	damagevariation
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	kingsrock
-	endmove
-
-Attract:
-	checkobedience
-	usedmovetext
-	doturn
-	checkhit
-	attract
-	endmove
-
-Return:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	happinesspower
-	damagecalc
-	stab
-	damagevariation
-	checkhit
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	kingsrock
-	endmove
-
-Present:
-	checkobedience
-	usedmovetext
-	doturn
-	checkhit
-	critical
-	damagestats
-	present
-	damagecalc
-	stab
-	damagevariation
-	clearmissdamage
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	kingsrock
-	endmove
-
-Frustration:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	frustrationpower
-	damagecalc
-	stab
-	damagevariation
-	checkhit
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	kingsrock
-	endmove
-
-Safeguard:
-	checkobedience
-	usedmovetext
-	doturn
-	safeguard
-	endmove
-
-SacredFire:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	checkhit
-	effectchance
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	defrost
-	checkdestinybond
-	buildopponentrage
-	burntarget
-	endmove
-
-Magnitude:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	getmagnitude
-	damagecalc
-	stab
-	damagevariation
-	checkhit
-	doubleundergrounddamage
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	kingsrock
-	endmove
-
-BatonPass:
-	checkobedience
-	usedmovetext
-	doturn
-	batonpass
-	endmove
-
-Pursuit:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	pursuit
-	checkhit
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	kingsrock
-	endmove
-
-RapidSpin:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	checkhit
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	clearhazards
-	checkdestinybond
-	buildopponentrage
-	kingsrock
-	endmove
-
-MorningSun:
-	checkobedience
-	usedmovetext
-	doturn
-	healmorn
-	endmove
-
-Synthesis:
-	checkobedience
-	usedmovetext
-	doturn
-	healday
-	endmove
-
-Moonlight:
-	checkobedience
-	usedmovetext
-	doturn
-	healnite
-	endmove
-
-HiddenPower:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	hiddenpower
-	damagecalc
-	stab
-	damagevariation
-	checkhit
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	kingsrock
-	endmove
-
-RainDance:
-	checkobedience
-	usedmovetext
-	doturn
-	startrain
-	endmove
-
-SunnyDay:
-	checkobedience
-	usedmovetext
-	doturn
-	startsun
-	endmove
-
-FakeOut:
-	checkobedience
-	usedmovetext
-	doturn
-	checkhit
-	fakeout
-	hittarget
-	failuretext
-	endmove
-
-BellyDrum:
-	checkobedience
-	usedmovetext
-	doturn
-	bellydrum
-	endmove
-
-PsychUp:
-	checkobedience
-	usedmovetext
-	doturn
-	psychup
-	endmove
-
-MirrorCoat:
-	checkobedience
-	usedmovetext
-	doturn
-	mirrorcoat
-	hittarget
-	failuretext
-	checkfaint
-	checkdestinybond
-	buildopponentrage
-	kingsrock
-	endmove
-
-SkullBash:
-	checkcharge
-	checkobedience
-	doturn
-	charge
-	usedmovetext
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	checkhit
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	kingsrock
-	endturn
-	defenseup
-	statupmessage
-	endmove
-
-Twister:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	doubleflyingdamage
-	checkhit
-	effectchance
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	flinchtarget
-	endmove
-
-Earthquake:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	doubleundergrounddamage
-	checkhit
-	effectchance
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	endmove
-
-FutureSight:
-	checkfuturesight
-	checkobedience
-	usedmovetext
-	doturn
-	damagestats
-	damagecalc
-	futuresight
-	damagevariation ; skip here if last turn
-	checkhit
-	hittargetnosub
-	failuretext
-	checkfaint
-	checkdestinybond
-	buildopponentrage
-	endmove
-
-Gust:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	doubleflyingdamage
-	checkhit
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	endmove
-
-Stomp:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	doubleminimizedamage
-	checkhit
-	effectchance
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	flinchtarget
-	endmove
-
-Solarbeam:
-	checkcharge
-	checkobedience
-	doturn
-	skipsuncharge
-	charge
-	usedmovetext
-	critical
-	damagestats
-	damagecalc
-	stab
-	damagevariation
-	checkhit
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	kingsrock
-	endmove
-
-Thunder:
-	checkobedience
-	usedmovetext
-	doturn
-	critical
-	damagestats
-	damagecalc
-	thunderaccuracy
-	checkhit
-	effectchance
-	stab
-	damagevariation
-	hittarget
-	failuretext
-	checkfaint
-	criticaltext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	paralyzetarget
-	endmove
-
-Teleport:
-	checkobedience
-	usedmovetext
-	doturn
-	teleport
-	endmove
-
-BeatUp:
-	checkobedience
-	usedmovetext
-	movedelay
-	doturn
-	startloop
-	lowersub
-	checkhit
-	critical
-	beatup
-	damagecalc
-	damagevariation
-	clearmissdamage
-	hittargetnosub
-	failuretext
-	checkfaint
-	criticaltext
-	cleartext
-	supereffectivetext
-	checkdestinybond
-	buildopponentrage
-	endloop
-	effect0xa8
-	raisesub
-	kingsrock
-	endmove
-
-DefenseCurl:
-	checkobedience
-	usedmovetext
-	doturn
-	defenseup
-	curl
-	lowersub
-	statupanim
-	raisesub
-	statupmessage
-	statupfailtext
-	endmove
--- a/battle/moves/move_effects_pointers.asm
+++ /dev/null
@@ -1,159 +1,0 @@
-MoveEffectsPointers: ; 271f4
-; entries correspond to EFFECT_* constants
-	dw NormalHit
-	dw DoSleep
-	dw PoisonHit
-	dw LeechHit
-	dw BurnHit
-	dw FreezeHit
-	dw ParalyzeHit
-	dw Selfdestruct
-	dw DreamEater
-	dw MirrorMove
-	dw AttackUp
-	dw DefenseUp
-	dw SpeedUp
-	dw SpecialAttackUp
-	dw SpecialDefenseUp
-	dw AccuracyUp
-	dw EvasionUp
-	dw NormalHit
-	dw AttackDown
-	dw DefenseDown
-	dw SpeedDown
-	dw SpecialAttackDown
-	dw SpecialDefenseDown
-	dw AccuracyDown
-	dw EvasionDown
-	dw ResetStats
-	dw Bide
-	dw Rampage
-	dw ForceSwitch
-	dw MultiHit
-	dw Conversion
-	dw FlinchHit
-	dw Heal
-	dw Toxic
-	dw PayDay
-	dw LightScreen
-	dw TriAttack
-	dw NormalHit
-	dw OHKOHit
-	dw RazorWind
-	dw SuperFang
-	dw StaticDamage
-	dw TrapTarget
-	dw NormalHit
-	dw MultiHit
-	dw NormalHit
-	dw Mist
-	dw FocusEnergy
-	dw RecoilHit
-	dw DoConfuse
-	dw AttackUp2
-	dw DefenseUp2
-	dw SpeedUp2
-	dw SpecialAttackUp2
-	dw SpecialDefenseUp2
-	dw AccuracyUp2
-	dw EvasionUp2
-	dw Transform
-	dw AttackDown2
-	dw DefenseDown2
-	dw SpeedDown2
-	dw SpecialAttackDown2
-	dw SpecialDefenseDown2
-	dw AccuracyDown2
-	dw EvasionDown2
-	dw Reflect
-	dw DoPoison
-	dw DoParalyze
-	dw AttackDownHit
-	dw DefenseDownHit
-	dw SpeedDownHit
-	dw SpecialAttackDownHit
-	dw SpecialDefenseDownHit
-	dw AccuracyDownHit
-	dw EvasionDownHit
-	dw SkyAttack
-	dw ConfuseHit
-	dw PoisonMultiHit
-	dw NormalHit
-	dw Substitute
-	dw HyperBeam
-	dw Rage
-	dw Mimic
-	dw Metronome
-	dw LeechSeed
-	dw Splash
-	dw Disable
-	dw StaticDamage
-	dw Psywave
-	dw Counter
-	dw Encore
-	dw PainSplit
-	dw Snore
-	dw Conversion2
-	dw LockOn
-	dw Sketch
-	dw DefrostOpponent
-	dw SleepTalk
-	dw DestinyBond
-	dw Reversal
-	dw Spite
-	dw FalseSwipe
-	dw HealBell
-	dw NormalHit
-	dw TripleKick
-	dw Thief
-	dw MeanLook
-	dw Nightmare
-	dw FlameWheel
-	dw Curse
-	dw NormalHit
-	dw Protect
-	dw Spikes
-	dw Foresight
-	dw PerishSong
-	dw Sandstorm
-	dw Endure
-	dw Rollout
-	dw Swagger
-	dw FuryCutter
-	dw Attract
-	dw Return
-	dw Present
-	dw Frustration
-	dw Safeguard
-	dw SacredFire
-	dw Magnitude
-	dw BatonPass
-	dw Pursuit
-	dw RapidSpin
-	dw NormalHit
-	dw NormalHit
-	dw MorningSun
-	dw Synthesis
-	dw Moonlight
-	dw HiddenPower
-	dw RainDance
-	dw SunnyDay
-	dw DefenseUpHit
-	dw AttackUpHit
-	dw AllUpHit
-	dw FakeOut
-	dw BellyDrum
-	dw PsychUp
-	dw MirrorCoat
-	dw SkullBash
-	dw Twister
-	dw Earthquake
-	dw FutureSight
-	dw Gust
-	dw Stomp
-	dw Solarbeam
-	dw Thunder
-	dw Teleport
-	dw BeatUp
-	dw Fly
-	dw DefenseCurl
--- a/battle/moves/moves.asm
+++ /dev/null
@@ -1,265 +1,0 @@
-; Characteristics of each move.
-
-move: MACRO
-	db \1 ; animation
-	db \2 ; effect
-	db \3 ; power
-	db \4 ; type
-	db \5 percent ; accuracy
-	db \6 ; pp
-	db \7 percent ; effect chance
-ENDM
-
-Moves: ; 41afb
-; entries correspond to constants/move_constants.asm
-	move POUND,        EFFECT_NORMAL_HIT,         40, NORMAL,   100, 35,   0
-	move KARATE_CHOP,  EFFECT_NORMAL_HIT,         50, FIGHTING, 100, 25,   0
-	move DOUBLESLAP,   EFFECT_MULTI_HIT,          15, NORMAL,    85, 10,   0
-	move COMET_PUNCH,  EFFECT_MULTI_HIT,          18, NORMAL,    85, 15,   0
-	move MEGA_PUNCH,   EFFECT_NORMAL_HIT,         80, NORMAL,    85, 20,   0
-	move PAY_DAY,      EFFECT_PAY_DAY,            40, NORMAL,   100, 20,   0
-	move FIRE_PUNCH,   EFFECT_BURN_HIT,           75, FIRE,     100, 15,  10
-	move ICE_PUNCH,    EFFECT_FREEZE_HIT,         75, ICE,      100, 15,  10
-	move THUNDERPUNCH, EFFECT_PARALYZE_HIT,       75, ELECTRIC, 100, 15,  10
-	move SCRATCH,      EFFECT_NORMAL_HIT,         40, NORMAL,   100, 35,   0
-	move VICEGRIP,     EFFECT_NORMAL_HIT,         55, NORMAL,   100, 30,   0
-	move GUILLOTINE,   EFFECT_OHKO,                0, NORMAL,    30,  5,   0
-	move RAZOR_WIND,   EFFECT_RAZOR_WIND,         80, NORMAL,    75, 10,   0
-	move SWORDS_DANCE, EFFECT_ATTACK_UP_2,         0, NORMAL,   100, 30,   0
-	move CUT,          EFFECT_NORMAL_HIT,         50, NORMAL,    95, 30,   0
-	move GUST,         EFFECT_GUST,               40, FLYING,   100, 35,   0
-	move WING_ATTACK,  EFFECT_NORMAL_HIT,         60, FLYING,   100, 35,   0
-	move WHIRLWIND,    EFFECT_FORCE_SWITCH,        0, NORMAL,   100, 20,   0
-	move FLY,          EFFECT_FLY,                70, FLYING,    95, 15,   0
-	move BIND,         EFFECT_TRAP_TARGET,        15, NORMAL,    75, 20,   0
-	move SLAM,         EFFECT_NORMAL_HIT,         80, NORMAL,    75, 20,   0
-	move VINE_WHIP,    EFFECT_NORMAL_HIT,         35, GRASS,    100, 10,   0
-	move STOMP,        EFFECT_STOMP,              65, NORMAL,   100, 20,  30
-	move DOUBLE_KICK,  EFFECT_DOUBLE_HIT,         30, FIGHTING, 100, 30,   0
-	move MEGA_KICK,    EFFECT_NORMAL_HIT,        120, NORMAL,    75,  5,   0
-	move JUMP_KICK,    EFFECT_JUMP_KICK,          70, FIGHTING,  95, 25,   0
-	move ROLLING_KICK, EFFECT_FLINCH_HIT,         60, FIGHTING,  85, 15,  30
-	move SAND_ATTACK,  EFFECT_ACCURACY_DOWN,       0, GROUND,   100, 15,   0
-	move HEADBUTT,     EFFECT_FLINCH_HIT,         70, NORMAL,   100, 15,  30
-	move HORN_ATTACK,  EFFECT_NORMAL_HIT,         65, NORMAL,   100, 25,   0
-	move FURY_ATTACK,  EFFECT_MULTI_HIT,          15, NORMAL,    85, 20,   0
-	move HORN_DRILL,   EFFECT_OHKO,                1, NORMAL,    30,  5,   0
-	move TACKLE,       EFFECT_NORMAL_HIT,         35, NORMAL,    95, 35,   0
-	move BODY_SLAM,    EFFECT_PARALYZE_HIT,       85, NORMAL,   100, 15,  30
-	move WRAP,         EFFECT_TRAP_TARGET,        15, NORMAL,    85, 20,   0
-	move TAKE_DOWN,    EFFECT_RECOIL_HIT,         90, NORMAL,    85, 20,   0
-	move THRASH,       EFFECT_RAMPAGE,            90, NORMAL,   100, 20,   0
-	move DOUBLE_EDGE,  EFFECT_RECOIL_HIT,        120, NORMAL,   100, 15,   0
-	move TAIL_WHIP,    EFFECT_DEFENSE_DOWN,        0, NORMAL,   100, 30,   0
-	move POISON_STING, EFFECT_POISON_HIT,         15, POISON,   100, 35,  30
-	move TWINEEDLE,    EFFECT_POISON_MULTI_HIT,   25, BUG,      100, 20,  20
-	move PIN_MISSILE,  EFFECT_MULTI_HIT,          14, BUG,       85, 20,   0
-	move LEER,         EFFECT_DEFENSE_DOWN,        0, NORMAL,   100, 30,   0
-	move BITE,         EFFECT_FLINCH_HIT,         60, DARK,     100, 25,  30
-	move GROWL,        EFFECT_ATTACK_DOWN,         0, NORMAL,   100, 40,   0
-	move ROAR,         EFFECT_FORCE_SWITCH,        0, NORMAL,   100, 20,   0
-	move SING,         EFFECT_SLEEP,               0, NORMAL,    55, 15,   0
-	move SUPERSONIC,   EFFECT_CONFUSE,             0, NORMAL,    55, 20,   0
-	move SONICBOOM,    EFFECT_STATIC_DAMAGE,      20, NORMAL,    90, 20,   0
-	move DISABLE,      EFFECT_DISABLE,             0, NORMAL,    55, 20,   0
-	move ACID,         EFFECT_DEFENSE_DOWN_HIT,   40, POISON,   100, 30,  10
-	move EMBER,        EFFECT_BURN_HIT,           40, FIRE,     100, 25,  10
-	move FLAMETHROWER, EFFECT_BURN_HIT,           95, FIRE,     100, 15,  10
-	move MIST,         EFFECT_MIST,                0, ICE,      100, 30,   0
-	move WATER_GUN,    EFFECT_NORMAL_HIT,         40, WATER,    100, 25,   0
-	move HYDRO_PUMP,   EFFECT_NORMAL_HIT,        120, WATER,     80,  5,   0
-	move SURF,         EFFECT_NORMAL_HIT,         95, WATER,    100, 15,   0
-	move ICE_BEAM,     EFFECT_FREEZE_HIT,         95, ICE,      100, 10,  10
-	move BLIZZARD,     EFFECT_FREEZE_HIT,        120, ICE,       70,  5,  10
-	move PSYBEAM,      EFFECT_CONFUSE_HIT,        65, PSYCHIC,  100, 20,  10
-	move BUBBLEBEAM,   EFFECT_SPEED_DOWN_HIT,     65, WATER,    100, 20,  10
-	move AURORA_BEAM,  EFFECT_ATTACK_DOWN_HIT,    65, ICE,      100, 20,  10
-	move HYPER_BEAM,   EFFECT_HYPER_BEAM,        150, NORMAL,    90,  5,   0
-	move PECK,         EFFECT_NORMAL_HIT,         35, FLYING,   100, 35,   0
-	move DRILL_PECK,   EFFECT_NORMAL_HIT,         80, FLYING,   100, 20,   0
-	move SUBMISSION,   EFFECT_RECOIL_HIT,         80, FIGHTING,  80, 25,   0
-	move LOW_KICK,     EFFECT_FLINCH_HIT,         50, FIGHTING,  90, 20,  30
-	move COUNTER,      EFFECT_COUNTER,             1, FIGHTING, 100, 20,   0
-	move SEISMIC_TOSS, EFFECT_LEVEL_DAMAGE,        1, FIGHTING, 100, 20,   0
-	move STRENGTH,     EFFECT_NORMAL_HIT,         80, NORMAL,   100, 15,   0
-	move ABSORB,       EFFECT_LEECH_HIT,          20, GRASS,    100, 20,   0
-	move MEGA_DRAIN,   EFFECT_LEECH_HIT,          40, GRASS,    100, 10,   0
-	move LEECH_SEED,   EFFECT_LEECH_SEED,          0, GRASS,     90, 10,   0
-	move GROWTH,       EFFECT_SP_ATK_UP,           0, NORMAL,   100, 40,   0
-	move RAZOR_LEAF,   EFFECT_NORMAL_HIT,         55, GRASS,     95, 25,   0
-	move SOLARBEAM,    EFFECT_SOLARBEAM,         120, GRASS,    100, 10,   0
-	move POISONPOWDER, EFFECT_POISON,              0, POISON,    75, 35,   0
-	move STUN_SPORE,   EFFECT_PARALYZE,            0, GRASS,     75, 30,   0
-	move SLEEP_POWDER, EFFECT_SLEEP,               0, GRASS,     75, 15,   0
-	move PETAL_DANCE,  EFFECT_RAMPAGE,            70, GRASS,    100, 20,   0
-	move STRING_SHOT,  EFFECT_SPEED_DOWN,          0, BUG,       95, 40,   0
-	move DRAGON_RAGE,  EFFECT_STATIC_DAMAGE,      40, DRAGON,   100, 10,   0
-	move FIRE_SPIN,    EFFECT_TRAP_TARGET,        15, FIRE,      70, 15,   0
-	move THUNDERSHOCK, EFFECT_PARALYZE_HIT,       40, ELECTRIC, 100, 30,  10
-	move THUNDERBOLT,  EFFECT_PARALYZE_HIT,       95, ELECTRIC, 100, 15,  10
-	move THUNDER_WAVE, EFFECT_PARALYZE,            0, ELECTRIC, 100, 20,   0
-	move THUNDER,      EFFECT_THUNDER,           120, ELECTRIC,  70, 10,  30
-	move ROCK_THROW,   EFFECT_NORMAL_HIT,         50, ROCK,      90, 15,   0
-	move EARTHQUAKE,   EFFECT_EARTHQUAKE,        100, GROUND,   100, 10,   0
-	move FISSURE,      EFFECT_OHKO,                1, GROUND,    30,  5,   0
-	move DIG,          EFFECT_FLY,                60, GROUND,   100, 10,   0
-	move TOXIC,        EFFECT_TOXIC,               0, POISON,    85, 10,   0
-	move CONFUSION,    EFFECT_CONFUSE_HIT,        50, PSYCHIC,  100, 25,  10
-	move PSYCHIC_M,    EFFECT_SP_DEF_DOWN_HIT,    90, PSYCHIC,  100, 10,  10
-	move HYPNOSIS,     EFFECT_SLEEP,               0, PSYCHIC,   60, 20,   0
-	move MEDITATE,     EFFECT_ATTACK_UP,           0, PSYCHIC,  100, 40,   0
-	move AGILITY,      EFFECT_SPEED_UP_2,          0, PSYCHIC,  100, 30,   0
-	move QUICK_ATTACK, EFFECT_PRIORITY_HIT,       40, NORMAL,   100, 30,   0
-	move RAGE,         EFFECT_RAGE,               20, NORMAL,   100, 20,   0
-	move TELEPORT,     EFFECT_TELEPORT,            0, PSYCHIC,  100, 20,   0
-	move NIGHT_SHADE,  EFFECT_LEVEL_DAMAGE,        1, GHOST,    100, 15,   0
-	move MIMIC,        EFFECT_MIMIC,               0, NORMAL,   100, 10,   0
-	move SCREECH,      EFFECT_DEFENSE_DOWN_2,      0, NORMAL,    85, 40,   0
-	move DOUBLE_TEAM,  EFFECT_EVASION_UP,          0, NORMAL,   100, 15,   0
-	move RECOVER,      EFFECT_HEAL,                0, NORMAL,   100, 20,   0
-	move HARDEN,       EFFECT_DEFENSE_UP,          0, NORMAL,   100, 30,   0
-	move MINIMIZE,     EFFECT_EVASION_UP,          0, NORMAL,   100, 20,   0
-	move SMOKESCREEN,  EFFECT_ACCURACY_DOWN,       0, NORMAL,   100, 20,   0
-	move CONFUSE_RAY,  EFFECT_CONFUSE,             0, GHOST,    100, 10,   0
-	move WITHDRAW,     EFFECT_DEFENSE_UP,          0, WATER,    100, 40,   0
-	move DEFENSE_CURL, EFFECT_DEFENSE_CURL,        0, NORMAL,   100, 40,   0
-	move BARRIER,      EFFECT_DEFENSE_UP_2,        0, PSYCHIC,  100, 30,   0
-	move LIGHT_SCREEN, EFFECT_LIGHT_SCREEN,        0, PSYCHIC,  100, 30,   0
-	move HAZE,         EFFECT_RESET_STATS,         0, ICE,      100, 30,   0
-	move REFLECT,      EFFECT_REFLECT,             0, PSYCHIC,  100, 20,   0
-	move FOCUS_ENERGY, EFFECT_FOCUS_ENERGY,        0, NORMAL,   100, 30,   0
-	move BIDE,         EFFECT_BIDE,                0, NORMAL,   100, 10,   0
-	move METRONOME,    EFFECT_METRONOME,           0, NORMAL,   100, 10,   0
-	move MIRROR_MOVE,  EFFECT_MIRROR_MOVE,         0, FLYING,   100, 20,   0
-	move SELFDESTRUCT, EFFECT_SELFDESTRUCT,      200, NORMAL,   100,  5,   0
-	move EGG_BOMB,     EFFECT_NORMAL_HIT,        100, NORMAL,    75, 10,   0
-	move LICK,         EFFECT_PARALYZE_HIT,       20, GHOST,    100, 30,  30
-	move SMOG,         EFFECT_POISON_HIT,         20, POISON,    70, 20,  40
-	move SLUDGE,       EFFECT_POISON_HIT,         65, POISON,   100, 20,  30
-	move BONE_CLUB,    EFFECT_FLINCH_HIT,         65, GROUND,    85, 20,  10
-	move FIRE_BLAST,   EFFECT_BURN_HIT,          120, FIRE,      85,  5,  10
-	move WATERFALL,    EFFECT_NORMAL_HIT,         80, WATER,    100, 15,   0
-	move CLAMP,        EFFECT_TRAP_TARGET,        35, WATER,     75, 10,   0
-	move SWIFT,        EFFECT_ALWAYS_HIT,         60, NORMAL,   100, 20,   0
-	move SKULL_BASH,   EFFECT_SKULL_BASH,        100, NORMAL,   100, 15,   0
-	move SPIKE_CANNON, EFFECT_MULTI_HIT,          20, NORMAL,   100, 15,   0
-	move CONSTRICT,    EFFECT_SPEED_DOWN_HIT,     10, NORMAL,   100, 35,  10
-	move AMNESIA,      EFFECT_SP_DEF_UP_2,         0, PSYCHIC,  100, 20,   0
-	move KINESIS,      EFFECT_ACCURACY_DOWN,       0, PSYCHIC,   80, 15,   0
-	move SOFTBOILED,   EFFECT_HEAL,                0, NORMAL,   100, 10,   0
-	move HI_JUMP_KICK, EFFECT_JUMP_KICK,          85, FIGHTING,  90, 20,   0
-	move GLARE,        EFFECT_PARALYZE,            0, NORMAL,    75, 30,   0
-	move DREAM_EATER,  EFFECT_DREAM_EATER,       100, PSYCHIC,  100, 15,   0
-	move POISON_GAS,   EFFECT_POISON,              0, POISON,    55, 40,   0
-	move BARRAGE,      EFFECT_MULTI_HIT,          15, NORMAL,    85, 20,   0
-	move LEECH_LIFE,   EFFECT_LEECH_HIT,          20, BUG,      100, 15,   0
-	move LOVELY_KISS,  EFFECT_SLEEP,               0, NORMAL,    75, 10,   0
-	move SKY_ATTACK,   EFFECT_SKY_ATTACK,        140, FLYING,    90,  5,   0
-	move TRANSFORM,    EFFECT_TRANSFORM,           0, NORMAL,   100, 10,   0
-	move BUBBLE,       EFFECT_SPEED_DOWN_HIT,     20, WATER,    100, 30,  10
-	move DIZZY_PUNCH,  EFFECT_CONFUSE_HIT,        70, NORMAL,   100, 10,  20
-	move SPORE,        EFFECT_SLEEP,               0, GRASS,    100, 15,   0
-	move FLASH,        EFFECT_ACCURACY_DOWN,       0, NORMAL,    70, 20,   0
-	move PSYWAVE,      EFFECT_PSYWAVE,             1, PSYCHIC,   80, 15,   0
-	move SPLASH,       EFFECT_SPLASH,              0, NORMAL,   100, 40,   0
-	move ACID_ARMOR,   EFFECT_DEFENSE_UP_2,        0, POISON,   100, 40,   0
-	move CRABHAMMER,   EFFECT_NORMAL_HIT,         90, WATER,     85, 10,   0
-	move EXPLOSION,    EFFECT_SELFDESTRUCT,      250, NORMAL,   100,  5,   0
-	move FURY_SWIPES,  EFFECT_MULTI_HIT,          18, NORMAL,    80, 15,   0
-	move BONEMERANG,   EFFECT_DOUBLE_HIT,         50, GROUND,    90, 10,   0
-	move REST,         EFFECT_HEAL,                0, PSYCHIC,  100, 10,   0
-	move ROCK_SLIDE,   EFFECT_FLINCH_HIT,         75, ROCK,      90, 10,  30
-	move HYPER_FANG,   EFFECT_FLINCH_HIT,         80, NORMAL,    90, 15,  10
-	move SHARPEN,      EFFECT_ATTACK_UP,           0, NORMAL,   100, 30,   0
-	move CONVERSION,   EFFECT_CONVERSION,          0, NORMAL,   100, 30,   0
-	move TRI_ATTACK,   EFFECT_TRI_ATTACK,         80, NORMAL,   100, 10,  20
-	move SUPER_FANG,   EFFECT_SUPER_FANG,          1, NORMAL,    90, 10,   0
-	move SLASH,        EFFECT_NORMAL_HIT,         70, NORMAL,   100, 20,   0
-	move SUBSTITUTE,   EFFECT_SUBSTITUTE,          0, NORMAL,   100, 10,   0
-	move STRUGGLE,     EFFECT_RECOIL_HIT,         50, NORMAL,   100,  1,   0
-	move SKETCH,       EFFECT_SKETCH,              0, NORMAL,   100,  1,   0
-	move TRIPLE_KICK,  EFFECT_TRIPLE_KICK,        10, FIGHTING,  90, 10,   0
-	move THIEF,        EFFECT_THIEF,              40, DARK,     100, 10, 100
-	move SPIDER_WEB,   EFFECT_MEAN_LOOK,           0, BUG,      100, 10,   0
-	move MIND_READER,  EFFECT_LOCK_ON,             0, NORMAL,   100,  5,   0
-	move NIGHTMARE,    EFFECT_NIGHTMARE,           0, GHOST,    100, 15,   0
-	move FLAME_WHEEL,  EFFECT_FLAME_WHEEL,        60, FIRE,     100, 25,  10
-	move SNORE,        EFFECT_SNORE,              40, NORMAL,   100, 15,  30
-	move CURSE,        EFFECT_CURSE,               0, CURSE_T,  100, 10,   0
-	move FLAIL,        EFFECT_REVERSAL,            1, NORMAL,   100, 15,   0
-	move CONVERSION2,  EFFECT_CONVERSION2,         0, NORMAL,   100, 30,   0
-	move AEROBLAST,    EFFECT_NORMAL_HIT,        100, FLYING,    95,  5,   0
-	move COTTON_SPORE, EFFECT_SPEED_DOWN_2,        0, GRASS,     85, 40,   0
-	move REVERSAL,     EFFECT_REVERSAL,            1, FIGHTING, 100, 15,   0
-	move SPITE,        EFFECT_SPITE,               0, GHOST,    100, 10,   0
-	move POWDER_SNOW,  EFFECT_FREEZE_HIT,         40, ICE,      100, 25,  10
-	move PROTECT,      EFFECT_PROTECT,             0, NORMAL,   100, 10,   0
-	move MACH_PUNCH,   EFFECT_PRIORITY_HIT,       40, FIGHTING, 100, 30,   0
-	move SCARY_FACE,   EFFECT_SPEED_DOWN_2,        0, NORMAL,    90, 10,   0
-	move FAINT_ATTACK, EFFECT_ALWAYS_HIT,         60, DARK,     100, 20,   0
-	move SWEET_KISS,   EFFECT_CONFUSE,             0, NORMAL,    75, 10,   0
-	move BELLY_DRUM,   EFFECT_BELLY_DRUM,          0, NORMAL,   100, 10,   0
-	move SLUDGE_BOMB,  EFFECT_POISON_HIT,         90, POISON,   100, 10,  30
-	move MUD_SLAP,     EFFECT_ACCURACY_DOWN_HIT,  20, GROUND,   100, 10, 100
-	move OCTAZOOKA,    EFFECT_ACCURACY_DOWN_HIT,  65, WATER,     85, 10,  50
-	move SPIKES,       EFFECT_SPIKES,              0, GROUND,   100, 20,   0
-	move ZAP_CANNON,   EFFECT_PARALYZE_HIT,      100, ELECTRIC,  50,  5, 100
-	move FORESIGHT,    EFFECT_FORESIGHT,           0, NORMAL,   100, 40,   0
-	move DESTINY_BOND, EFFECT_DESTINY_BOND,        0, GHOST,    100,  5,   0
-	move PERISH_SONG,  EFFECT_PERISH_SONG,         0, NORMAL,   100,  5,   0
-	move ICY_WIND,     EFFECT_SPEED_DOWN_HIT,     55, ICE,       95, 15, 100
-	move DETECT,       EFFECT_PROTECT,             0, FIGHTING, 100,  5,   0
-	move BONE_RUSH,    EFFECT_MULTI_HIT,          25, GROUND,    80, 10,   0
-	move LOCK_ON,      EFFECT_LOCK_ON,             0, NORMAL,   100,  5,   0
-	move OUTRAGE,      EFFECT_RAMPAGE,            90, DRAGON,   100, 15,   0
-	move SANDSTORM,    EFFECT_SANDSTORM,           0, ROCK,     100, 10,   0
-	move GIGA_DRAIN,   EFFECT_LEECH_HIT,          60, GRASS,    100,  5,   0
-	move ENDURE,       EFFECT_ENDURE,              0, NORMAL,   100, 10,   0
-	move CHARM,        EFFECT_ATTACK_DOWN_2,       0, NORMAL,   100, 20,   0
-	move ROLLOUT,      EFFECT_ROLLOUT,            30, ROCK,      90, 20,   0
-	move FALSE_SWIPE,  EFFECT_FALSE_SWIPE,        40, NORMAL,   100, 40,   0
-	move SWAGGER,      EFFECT_SWAGGER,             0, NORMAL,    90, 15, 100
-	move MILK_DRINK,   EFFECT_HEAL,                0, NORMAL,   100, 10,   0
-	move SPARK,        EFFECT_PARALYZE_HIT,       65, ELECTRIC, 100, 20,  30
-	move FURY_CUTTER,  EFFECT_FURY_CUTTER,        10, BUG,       95, 20,   0
-	move STEEL_WING,   EFFECT_DEFENSE_UP_HIT,     70, STEEL,     90, 25,  10
-	move MEAN_LOOK,    EFFECT_MEAN_LOOK,           0, NORMAL,   100,  5,   0
-	move ATTRACT,      EFFECT_ATTRACT,             0, NORMAL,   100, 15,   0
-	move SLEEP_TALK,   EFFECT_SLEEP_TALK,          0, NORMAL,   100, 10,   0
-	move HEAL_BELL,    EFFECT_HEAL_BELL,           0, NORMAL,   100,  5,   0
-	move RETURN,       EFFECT_RETURN,              1, NORMAL,   100, 20,   0
-	move PRESENT,      EFFECT_PRESENT,             1, NORMAL,    90, 15,   0
-	move FRUSTRATION,  EFFECT_FRUSTRATION,         1, NORMAL,   100, 20,   0
-	move SAFEGUARD,    EFFECT_SAFEGUARD,           0, NORMAL,   100, 25,   0
-	move PAIN_SPLIT,   EFFECT_PAIN_SPLIT,          0, NORMAL,   100, 20,   0
-	move SACRED_FIRE,  EFFECT_SACRED_FIRE,       100, FIRE,      95,  5,  50
-	move MAGNITUDE,    EFFECT_MAGNITUDE,           1, GROUND,   100, 30,   0
-	move DYNAMICPUNCH, EFFECT_CONFUSE_HIT,       100, FIGHTING,  50,  5, 100
-	move MEGAHORN,     EFFECT_NORMAL_HIT,        120, BUG,       85, 10,   0
-	move DRAGONBREATH, EFFECT_PARALYZE_HIT,       60, DRAGON,   100, 20,  30
-	move BATON_PASS,   EFFECT_BATON_PASS,          0, NORMAL,   100, 40,   0
-	move ENCORE,       EFFECT_ENCORE,              0, NORMAL,   100,  5,   0
-	move PURSUIT,      EFFECT_PURSUIT,            40, DARK,     100, 20,   0
-	move RAPID_SPIN,   EFFECT_RAPID_SPIN,         20, NORMAL,   100, 40,   0
-	move SWEET_SCENT,  EFFECT_EVASION_DOWN,        0, NORMAL,   100, 20,   0
-	move IRON_TAIL,    EFFECT_DEFENSE_DOWN_HIT,  100, STEEL,     75, 15,  30
-	move METAL_CLAW,   EFFECT_ATTACK_UP_HIT,      50, STEEL,     95, 35,  10
-	move VITAL_THROW,  EFFECT_ALWAYS_HIT,         70, FIGHTING, 100, 10,   0
-	move MORNING_SUN,  EFFECT_MORNING_SUN,         0, NORMAL,   100,  5,   0
-	move SYNTHESIS,    EFFECT_SYNTHESIS,           0, GRASS,    100,  5,   0
-	move MOONLIGHT,    EFFECT_MOONLIGHT,           0, NORMAL,   100,  5,   0
-	move HIDDEN_POWER, EFFECT_HIDDEN_POWER,        1, NORMAL,   100, 15,   0
-	move CROSS_CHOP,   EFFECT_NORMAL_HIT,        100, FIGHTING,  80,  5,   0
-	move TWISTER,      EFFECT_TWISTER,            40, DRAGON,   100, 20,  20
-	move RAIN_DANCE,   EFFECT_RAIN_DANCE,          0, WATER,     90,  5,   0
-	move SUNNY_DAY,    EFFECT_SUNNY_DAY,           0, FIRE,      90,  5,   0
-	move CRUNCH,       EFFECT_SP_DEF_DOWN_HIT,    80, DARK,     100, 15,  20
-	move MIRROR_COAT,  EFFECT_MIRROR_COAT,         1, PSYCHIC,  100, 20,   0
-	move PSYCH_UP,     EFFECT_PSYCH_UP,            0, NORMAL,   100, 10,   0
-	move EXTREMESPEED, EFFECT_PRIORITY_HIT,       80, NORMAL,   100,  5,   0
-	move ANCIENTPOWER, EFFECT_ALL_UP_HIT,         60, ROCK,     100,  5,  10
-	move SHADOW_BALL,  EFFECT_SP_DEF_DOWN_HIT,    80, GHOST,    100, 15,  20
-	move FUTURE_SIGHT, EFFECT_FUTURE_SIGHT,       80, PSYCHIC,   90, 15,   0
-	move ROCK_SMASH,   EFFECT_DEFENSE_DOWN_HIT,   20, FIGHTING, 100, 15,  50
-	move WHIRLPOOL,    EFFECT_TRAP_TARGET,        15, WATER,     70, 15,   0
-	move BEAT_UP,      EFFECT_BEAT_UP,            10, DARK,     100, 10,   0
--- a/battle/objects/data.asm
+++ /dev/null
@@ -1,209 +1,0 @@
-ABSOLUTE_X EQU $00
-RELATIVE_X EQU $01
-
-battleanimobj: MACRO
-	db \1 ; flags
-	; bit 7: priority
-	; bit 6: y flip (for enemy)
-	; bit 5: x flip (for enemy)
-	; bit 0: enable enemy animation coord fixing (x = $b4 - x; see below for y)
-	db \2 ; enemy animation y fix param
-	; if $FF: y = y + 5 tiles
-	; else:   y = -y - (1 tile) * (is_softboiled_animation)
-	db \3 ; video sequence
-	db \4 ; callback
-	db \5 ; palette
-	db \6 ; tile offset
-endm
-
-BattleAnimObjects: ; ccb56
-; entries correspond to ANIM_OBJ_* constants
-	battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_00, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $01 ; ANIM_OBJ_00
-	battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_01, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $01 ; ANIM_OBJ_01
-	battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_02, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $01 ; ANIM_OBJ_02
-	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_00, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $01 ; ANIM_OBJ_03
-	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_01, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $01 ; ANIM_OBJ_04
-	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_02, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $01 ; ANIM_OBJ_05
-	battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_03, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $01 ; ANIM_OBJ_06
-	battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_04, BATTLEANIMFUNC_1B, PAL_BATTLE_OB_GRAY, $01 ; ANIM_OBJ_07
-	battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_05, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $01 ; ANIM_OBJ_08
-	battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_06, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $01 ; ANIM_OBJ_09
-	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_07, BATTLEANIMFUNC_09, PAL_BATTLE_OB_GRAY, $01 ; ANIM_OBJ_0A
-	battleanimobj RELATIVE_X, $aa, BATTLEANIMFRAMESET_10, BATTLEANIMFUNC_10, PAL_BATTLE_OB_RED, $03 ; ANIM_OBJ_0B
-	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_0E, BATTLEANIMFUNC_04, PAL_BATTLE_OB_RED, $03 ; ANIM_OBJ_0C
-	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_0F, BATTLEANIMFUNC_03, PAL_BATTLE_OB_RED, $03 ; ANIM_OBJ_0D
-	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_10, BATTLEANIMFUNC_08, PAL_BATTLE_OB_RED, $03 ; ANIM_OBJ_0E
-	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_0F, BATTLEANIMFUNC_0A, PAL_BATTLE_OB_RED, $03 ; ANIM_OBJ_0F
-	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_11, BATTLEANIMFUNC_03, PAL_BATTLE_OB_RED, $03 ; ANIM_OBJ_BURNED
-	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_12, BATTLEANIMFUNC_08, PAL_BATTLE_OB_BLUE, $0a ; ANIM_OBJ_BLIZZARD
-	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_13, BATTLEANIMFUNC_00, PAL_BATTLE_OB_BLUE, $0a ; ANIM_OBJ_12
-	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_14, BATTLEANIMFUNC_01, PAL_BATTLE_OB_BLUE, $0a ; ANIM_OBJ_ICE_BEAM
-	battleanimobj RELATIVE_X | X_FLIP, $78, BATTLEANIMFRAMESET_16, BATTLEANIMFUNC_RAZOR_LEAF, PAL_BATTLE_OB_GREEN, $06 ; ANIM_OBJ_RAZOR_LEAF
-	battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_09, BATTLEANIMFUNC_12, PAL_BATTLE_OB_RED, $0b ; ANIM_OBJ_POKE_BALL
-	battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_09, BATTLEANIMFUNC_13, PAL_BATTLE_OB_RED, $0b ; ANIM_OBJ_POKE_BALL_BLOCKED
-	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_18, BATTLEANIMFUNC_00, PAL_BATTLE_OB_RED, $08 ; ANIM_OBJ_17
-	battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_18, BATTLEANIMFUNC_00, PAL_BATTLE_OB_RED, $08 ; ANIM_OBJ_18
-	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_1D, BATTLEANIMFUNC_06, PAL_BATTLE_OB_GRAY, $0c ; ANIM_OBJ_19
-	battleanimobj RELATIVE_X, $b4, BATTLEANIMFRAMESET_1F, BATTLEANIMFUNC_38, PAL_BATTLE_OB_GRAY, $0c ; ANIM_OBJ_1A
-	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_08, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $07 ; ANIM_OBJ_1B
-	battleanimobj RELATIVE_X, $a0, BATTLEANIMFRAMESET_08, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $07 ; ANIM_OBJ_BALL_POOF
-	battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_19, BATTLEANIMFUNC_07, PAL_BATTLE_OB_BROWN, $09 ; ANIM_OBJ_1D
-	battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_1A, BATTLEANIMFUNC_07, PAL_BATTLE_OB_BROWN, $09 ; ANIM_OBJ_1E
-	battleanimobj RELATIVE_X, $b0, BATTLEANIMFRAMESET_1B, BATTLEANIMFUNC_36, PAL_BATTLE_OB_BROWN, $09 ; ANIM_OBJ_1F
-	battleanimobj RELATIVE_X, $b0, BATTLEANIMFRAMESET_84, BATTLEANIMFUNC_36, PAL_BATTLE_OB_BLUE, $21 ; ANIM_OBJ_20
-	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_21, BATTLEANIMFUNC_0C, PAL_BATTLE_OB_BLUE, $0d ; ANIM_OBJ_BUBBLE
-	battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_23, BATTLEANIMFUNC_0D, PAL_BATTLE_OB_BLUE, $0d ; ANIM_OBJ_22
-	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_24, BATTLEANIMFUNC_0E, PAL_BATTLE_OB_GRAY, $0e ; ANIM_OBJ_23
-	battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $80, BATTLEANIMFRAMESET_27, BATTLEANIMFUNC_0F, PAL_BATTLE_OB_BLUE, $04 ; ANIM_OBJ_24
-	battleanimobj RELATIVE_X, $b4, BATTLEANIMFRAMESET_2A, BATTLEANIMFUNC_00, PAL_BATTLE_OB_BLUE, $04 ; ANIM_OBJ_25
-	battleanimobj RELATIVE_X, $40, BATTLEANIMFRAMESET_2B, BATTLEANIMFUNC_11, PAL_BATTLE_OB_GREEN, $0f ; ANIM_OBJ_26
-	battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $98, BATTLEANIMFRAMESET_2C, BATTLEANIMFUNC_00, PAL_BATTLE_OB_YELLOW, $10 ; ANIM_OBJ_27
-	battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $98, BATTLEANIMFRAMESET_2D, BATTLEANIMFUNC_09, PAL_BATTLE_OB_YELLOW, $10 ; ANIM_OBJ_28
-	battleanimobj RELATIVE_X, $b8, BATTLEANIMFRAMESET_2E, BATTLEANIMFUNC_00, PAL_BATTLE_OB_BLUE, $0a ; ANIM_OBJ_ICE_BUILDUP
-	battleanimobj RELATIVE_X, $b8, BATTLEANIMFRAMESET_2F, BATTLEANIMFUNC_00, PAL_BATTLE_OB_BLUE, $0a ; ANIM_OBJ_FROZEN
-	battleanimobj RELATIVE_X, $b8, BATTLEANIMFRAMESET_30, BATTLEANIMFUNC_14, PAL_BATTLE_OB_BROWN, $11 ; ANIM_OBJ_MASTER_BALL_SPARKLE
-	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_21, BATTLEANIMFUNC_14, PAL_BATTLE_OB_YELLOW, $0d ; ANIM_OBJ_2C
-	battleanimobj RELATIVE_X | X_FLIP, $b0, BATTLEANIMFRAMESET_31, BATTLEANIMFUNC_00, PAL_BATTLE_OB_YELLOW, $05 ; ANIM_OBJ_2D
-	battleanimobj RELATIVE_X | X_FLIP, $b0, BATTLEANIMFRAMESET_32, BATTLEANIMFUNC_00, PAL_BATTLE_OB_YELLOW, $05 ; ANIM_OBJ_2E
-	battleanimobj RELATIVE_X | X_FLIP, $b0, BATTLEANIMFRAMESET_33, BATTLEANIMFUNC_00, PAL_BATTLE_OB_YELLOW, $05 ; ANIM_OBJ_2F
-	battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_34, BATTLEANIMFUNC_15, PAL_BATTLE_OB_YELLOW, $05 ; ANIM_OBJ_30
-	battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_36, BATTLEANIMFUNC_00, PAL_BATTLE_OB_YELLOW, $05 ; ANIM_OBJ_31
-	battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_37, BATTLEANIMFUNC_03, PAL_BATTLE_OB_GRAY, $08 ; ANIM_OBJ_LIGHTNING_BOLT
-	battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_38, BATTLEANIMFUNC_00, PAL_BATTLE_OB_YELLOW, $05 ; ANIM_OBJ_33
-	battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_39, BATTLEANIMFUNC_03, PAL_BATTLE_OB_GRAY, $08 ; ANIM_OBJ_34
-	battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_3A, BATTLEANIMFUNC_16, PAL_BATTLE_OB_GRAY, $02 ; ANIM_OBJ_35
-	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_3C, BATTLEANIMFUNC_17, PAL_BATTLE_OB_GRAY, $02 ; ANIM_OBJ_36
-	battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_3E, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $02 ; ANIM_OBJ_37
-	battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_3F, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $02 ; ANIM_OBJ_38
-	battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_40, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $02 ; ANIM_OBJ_39
-	battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_41, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $02 ; ANIM_OBJ_3A
-	battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_42, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $02 ; ANIM_OBJ_3B
-	battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_43, BATTLEANIMFUNC_18, PAL_BATTLE_OB_GREEN, $12 ; ANIM_OBJ_3C
-	battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_44, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GREEN, $12 ; ANIM_OBJ_3D
-	battleanimobj RELATIVE_X | X_FLIP, $b8, BATTLEANIMFRAMESET_45, BATTLEANIMFUNC_19, PAL_BATTLE_OB_GRAY, $13 ; ANIM_OBJ_GUST
-	battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_46, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $14 ; ANIM_OBJ_3F
-	battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_47, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $14 ; ANIM_OBJ_40
-	battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_48, BATTLEANIMFUNC_1A, PAL_BATTLE_OB_GRAY, $14 ; ANIM_OBJ_41
-	battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_49, BATTLEANIMFUNC_1A, PAL_BATTLE_OB_GRAY, $14 ; ANIM_OBJ_42
-	battleanimobj RELATIVE_X | X_FLIP, $98, BATTLEANIMFRAMESET_4A, BATTLEANIMFUNC_01, PAL_BATTLE_OB_GRAY, $14 ; ANIM_OBJ_43
-	battleanimobj RELATIVE_X | X_FLIP, $80, BATTLEANIMFRAMESET_4B, BATTLEANIMFUNC_00, PAL_BATTLE_OB_YELLOW, $11 ; ANIM_OBJ_44
-	battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_4C, BATTLEANIMFUNC_1C, PAL_BATTLE_OB_GREEN, $12 ; ANIM_OBJ_ABSORB
-	battleanimobj RELATIVE_X | X_FLIP, $b0, BATTLEANIMFRAMESET_4D, BATTLEANIMFUNC_1D, PAL_BATTLE_OB_GRAY, $15 ; ANIM_OBJ_46
-	battleanimobj RELATIVE_X, $b0, BATTLEANIMFRAMESET_51, BATTLEANIMFUNC_1E, PAL_BATTLE_OB_YELLOW, $11 ; ANIM_OBJ_47
-	battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_52, BATTLEANIMFUNC_1F, PAL_BATTLE_OB_GREEN, $16 ; ANIM_OBJ_48
-	battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_54, BATTLEANIMFUNC_1F, PAL_BATTLE_OB_GREEN, $16 ; ANIM_OBJ_49
-	battleanimobj RELATIVE_X | X_FLIP, $68, BATTLEANIMFRAMESET_56, BATTLEANIMFUNC_LEECH_SEED, PAL_BATTLE_OB_GREEN, $06 ; ANIM_OBJ_LEECH_SEED
-	battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_59, BATTLEANIMFUNC_21, PAL_BATTLE_OB_GRAY, $0e ; ANIM_OBJ_4B
-	battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_5C, BATTLEANIMFUNC_02, PAL_BATTLE_OB_GRAY, $17 ; ANIM_OBJ_4C
-	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_5D, BATTLEANIMFUNC_22, PAL_BATTLE_OB_YELLOW, $11 ; ANIM_OBJ_4D
-	battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $88, BATTLEANIMFRAMESET_5F, BATTLEANIMFUNC_00, PAL_BATTLE_OB_YELLOW, $10 ; ANIM_OBJ_4E
-	battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $88, BATTLEANIMFRAMESET_2D, BATTLEANIMFUNC_09, PAL_BATTLE_OB_YELLOW, $10 ; ANIM_OBJ_4F
-	battleanimobj RELATIVE_X | X_FLIP, $88, BATTLEANIMFRAMESET_60, BATTLEANIMFUNC_00, PAL_BATTLE_OB_YELLOW, $18 ; ANIM_OBJ_50
-	battleanimobj RELATIVE_X | X_FLIP, $80, BATTLEANIMFRAMESET_60, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $18 ; ANIM_OBJ_51
-	battleanimobj RELATIVE_X | X_FLIP, $50, BATTLEANIMFRAMESET_61, BATTLEANIMFUNC_23, PAL_BATTLE_OB_YELLOW, $19 ; ANIM_OBJ_CHICK
-	battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_63, BATTLEANIMFUNC_24, PAL_BATTLE_OB_GRAY, $19 ; ANIM_OBJ_53
-	battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_66, BATTLEANIMFUNC_25, PAL_BATTLE_OB_GRAY, $19 ; ANIM_OBJ_54
-	battleanimobj RELATIVE_X, $50, BATTLEANIMFRAMESET_1C, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $0c ; ANIM_OBJ_SKULL
-	battleanimobj RELATIVE_X | X_FLIP, $a8, BATTLEANIMFRAMESET_67, BATTLEANIMFUNC_26, PAL_BATTLE_OB_BROWN, $1a ; ANIM_OBJ_56
-	battleanimobj RELATIVE_X | X_FLIP, $a8, BATTLEANIMFRAMESET_68, BATTLEANIMFUNC_00, PAL_BATTLE_OB_BROWN, $1a ; ANIM_OBJ_57
-	battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_69, BATTLEANIMFUNC_01, PAL_BATTLE_OB_GRAY, $1a ; ANIM_OBJ_58
-	battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_6D, BATTLEANIMFUNC_28, PAL_BATTLE_OB_YELLOW, $19 ; ANIM_OBJ_PARALYZED
-	battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_6A, BATTLEANIMFUNC_27, PAL_BATTLE_OB_GRAY, $1b ; ANIM_OBJ_5A
-	battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_6F, BATTLEANIMFUNC_SPRIAL_DESCENT, PAL_BATTLE_OB_GRAY, $1c ; ANIM_OBJ_HAZE
-	battleanimobj RELATIVE_X | X_FLIP, $48, BATTLEANIMFRAMESET_70, BATTLEANIMFUNC_SPRIAL_DESCENT, PAL_BATTLE_OB_GRAY, $1c ; ANIM_OBJ_MIST
-	battleanimobj RELATIVE_X | X_FLIP, $48, BATTLEANIMFRAMESET_6F, BATTLEANIMFUNC_SPRIAL_DESCENT, PAL_BATTLE_OB_GRAY, $1c ; ANIM_OBJ_SMOG
-	battleanimobj RELATIVE_X | X_FLIP, $78, BATTLEANIMFRAMESET_6F, BATTLEANIMFUNC_POISON_GAS, PAL_BATTLE_OB_GRAY, $1c ; ANIM_OBJ_POISON_GAS
-	battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $90, BATTLEANIMFRAMESET_71, BATTLEANIMFUNC_HORN, PAL_BATTLE_OB_GRAY, $1d ; ANIM_OBJ_HORN
-	battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $90, BATTLEANIMFRAMESET_72, BATTLEANIMFUNC_2C, PAL_BATTLE_OB_GRAY, $1d ; ANIM_OBJ_60
-	battleanimobj RELATIVE_X, $48, BATTLEANIMFRAMESET_73, BATTLEANIMFUNC_2D, PAL_BATTLE_OB_RED, $1e ; ANIM_OBJ_61
-	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_74, BATTLEANIMFUNC_06, PAL_BATTLE_OB_GRAY, $15 ; ANIM_OBJ_62
-	battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_75, BATTLEANIMFUNC_2E, PAL_BATTLE_OB_BROWN, $19 ; ANIM_OBJ_63
-	battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_4A, BATTLEANIMFUNC_02, PAL_BATTLE_OB_GRAY, $14 ; ANIM_OBJ_64
-	battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_30, BATTLEANIMFUNC_2F, PAL_BATTLE_OB_GRAY, $11 ; ANIM_OBJ_65
-	battleanimobj RELATIVE_X, $78, BATTLEANIMFRAMESET_76, BATTLEANIMFUNC_POISON_GAS, PAL_BATTLE_OB_RED, $23 ; ANIM_OBJ_66
-	battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_77, BATTLEANIMFUNC_30, PAL_BATTLE_OB_GRAY, $1f ; ANIM_OBJ_67
-	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_77, BATTLEANIMFUNC_02, PAL_BATTLE_OB_GRAY, $1f ; ANIM_OBJ_68
-	battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_77, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $1f ; ANIM_OBJ_69
-	battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_78, BATTLEANIMFUNC_08, PAL_BATTLE_OB_YELLOW, $23 ; ANIM_OBJ_6A
-	battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_79, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $1f ; ANIM_OBJ_6B
-	battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_7A, BATTLEANIMFUNC_31, PAL_BATTLE_OB_YELLOW, $11 ; ANIM_OBJ_6C
-	battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_7A, BATTLEANIMFUNC_31, PAL_BATTLE_OB_YELLOW, $11 ; ANIM_OBJ_6D
-	battleanimobj RELATIVE_X | X_FLIP, $88, BATTLEANIMFRAMESET_7B, BATTLEANIMFUNC_32, PAL_BATTLE_OB_GRAY, $20 ; ANIM_OBJ_SKY_ATTACK_FEAROW
-	battleanimobj RELATIVE_X | X_FLIP, $98, BATTLEANIMFRAMESET_7C, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $04 ; ANIM_OBJ_LICK
-	battleanimobj RELATIVE_X | X_FLIP, $80, BATTLEANIMFRAMESET_7D, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $18 ; ANIM_OBJ_WITHDRAW
-	battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_21, BATTLEANIMFUNC_2F, PAL_BATTLE_OB_BLUE, $0d ; ANIM_OBJ_71
-	battleanimobj RELATIVE_X, $b0, BATTLEANIMFRAMESET_7E, BATTLEANIMFUNC_33, PAL_BATTLE_OB_YELLOW, $12 ; ANIM_OBJ_72
-	battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_7F, BATTLEANIMFUNC_2F, PAL_BATTLE_OB_GRAY, $08 ; ANIM_OBJ_73
-	battleanimobj RELATIVE_X | X_FLIP, $a0, BATTLEANIMFRAMESET_6F, BATTLEANIMFUNC_34, PAL_BATTLE_OB_GRAY, $1c ; ANIM_OBJ_74
-	battleanimobj RELATIVE_X | X_FLIP, $a0, BATTLEANIMFRAMESET_74, BATTLEANIMFUNC_35, PAL_BATTLE_OB_GRAY, $15 ; ANIM_OBJ_75
-	battleanimobj RELATIVE_X | X_FLIP, $b0, BATTLEANIMFRAMESET_80, BATTLEANIMFUNC_33, PAL_BATTLE_OB_GRAY, $14 ; ANIM_OBJ_76
-	battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_81, BATTLEANIMFUNC_37, PAL_BATTLE_OB_GRAY, $11 ; ANIM_OBJ_77
-	battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_85, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $22 ; ANIM_OBJ_78
-	battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_86, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $22 ; ANIM_OBJ_79
-	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_87, BATTLEANIMFUNC_39, PAL_BATTLE_OB_GRAY, $1f ; ANIM_OBJ_7A
-	battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_30, BATTLEANIMFUNC_3A, PAL_BATTLE_OB_YELLOW, $11 ; ANIM_OBJ_7B
-	battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_34, BATTLEANIMFUNC_00, PAL_BATTLE_OB_YELLOW, $05 ; ANIM_OBJ_7C
-	battleanimobj RELATIVE_X | X_FLIP | BEHIND_BG, $88, BATTLEANIMFRAMESET_88, BATTLEANIMFUNC_3B, PAL_BATTLE_OB_BLUE, $13 ; ANIM_OBJ_7D
-	battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_76, BATTLEANIMFUNC_25, PAL_BATTLE_OB_RED, $23 ; ANIM_OBJ_HEART
-	battleanimobj RELATIVE_X, $98, BATTLEANIMFRAMESET_10, BATTLEANIMFUNC_34, PAL_BATTLE_OB_RED, $03 ; ANIM_OBJ_7F
-	battleanimobj RELATIVE_X, $a8, BATTLEANIMFRAMESET_0F, BATTLEANIMFUNC_3C, PAL_BATTLE_OB_RED, $03 ; ANIM_OBJ_80
-	battleanimobj RELATIVE_X | X_FLIP, $68, BATTLEANIMFRAMESET_89, BATTLEANIMFUNC_SPRIAL_DESCENT, PAL_BATTLE_OB_GRAY, $1f ; ANIM_OBJ_COTTON_SPORE
-	battleanimobj RELATIVE_X | X_FLIP, $b0, BATTLEANIMFRAMESET_8A, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $1f ; ANIM_OBJ_82
-	battleanimobj RELATIVE_X | X_FLIP, $80, BATTLEANIMFRAMESET_8C, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $1f ; ANIM_OBJ_83
-	battleanimobj RELATIVE_X | X_FLIP, $50, BATTLEANIMFRAMESET_8D, BATTLEANIMFUNC_00, PAL_BATTLE_OB_YELLOW, $1f ; ANIM_OBJ_84
-	battleanimobj RELATIVE_X, $40, BATTLEANIMFRAMESET_24, BATTLEANIMFUNC_40, PAL_BATTLE_OB_GRAY, $0e ; ANIM_OBJ_85
-	battleanimobj RELATIVE_X | X_FLIP, $a8, BATTLEANIMFRAMESET_8E, BATTLEANIMFUNC_41, PAL_BATTLE_OB_RED, $1f ; ANIM_OBJ_86
-	battleanimobj RELATIVE_X | X_FLIP, $88, BATTLEANIMFRAMESET_8F, BATTLEANIMFUNC_3E, PAL_BATTLE_OB_GRAY, $1f ; ANIM_OBJ_87
-	battleanimobj RELATIVE_X | X_FLIP, $88, BATTLEANIMFRAMESET_93, BATTLEANIMFUNC_3E, PAL_BATTLE_OB_GRAY, $1f ; ANIM_OBJ_88
-	battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_97, BATTLEANIMFUNC_3D, PAL_BATTLE_OB_GRAY, $1f ; ANIM_OBJ_89
-	battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_78, BATTLEANIMFUNC_3D, PAL_BATTLE_OB_YELLOW, $23 ; ANIM_OBJ_8A
-	battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_99, BATTLEANIMFUNC_2E, PAL_BATTLE_OB_GRAY, $19 ; ANIM_OBJ_8B
-	battleanimobj RELATIVE_X | X_FLIP, $a0, BATTLEANIMFRAMESET_74, BATTLEANIMFUNC_02, PAL_BATTLE_OB_GRAY, $15 ; ANIM_OBJ_8C
-	battleanimobj RELATIVE_X | X_FLIP, $a0, BATTLEANIMFRAMESET_99, BATTLEANIMFUNC_35, PAL_BATTLE_OB_RED, $19 ; ANIM_OBJ_8D
-	battleanimobj RELATIVE_X | X_FLIP, $70, BATTLEANIMFRAMESET_8B, BATTLEANIMFUNC_3F, PAL_BATTLE_OB_GRAY, $1f ; ANIM_OBJ_SPIKES
-	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_15, BATTLEANIMFUNC_08, PAL_BATTLE_OB_GRAY, $0a ; ANIM_OBJ_8F
-	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_11, BATTLEANIMFUNC_02, PAL_BATTLE_OB_RED, $03 ; ANIM_OBJ_90
-	battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_7F, BATTLEANIMFUNC_42, PAL_BATTLE_OB_GRAY, $08 ; ANIM_OBJ_91
-	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_9A, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $1b ; ANIM_OBJ_92
-	battleanimobj RELATIVE_X | X_FLIP, $a0, BATTLEANIMFRAMESET_9B, BATTLEANIMFUNC_35, PAL_BATTLE_OB_RED, $23 ; ANIM_OBJ_93
-	battleanimobj RELATIVE_X | X_FLIP, $80, BATTLEANIMFRAMESET_9C, BATTLEANIMFUNC_23, PAL_BATTLE_OB_GRAY, $25 ; ANIM_OBJ_94
-	battleanimobj RELATIVE_X | X_FLIP, $80, BATTLEANIMFRAMESET_9D, BATTLEANIMFUNC_25, PAL_BATTLE_OB_GRAY, $25 ; ANIM_OBJ_95
-	battleanimobj RELATIVE_X | X_FLIP, $80, BATTLEANIMFRAMESET_9C, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $25 ; ANIM_OBJ_96
-	battleanimobj RELATIVE_X | X_FLIP, $80, BATTLEANIMFRAMESET_9E, BATTLEANIMFUNC_00, PAL_BATTLE_OB_BLUE, $25 ; ANIM_OBJ_97
-	battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $80, BATTLEANIMFRAMESET_9F, BATTLEANIMFUNC_3A, PAL_BATTLE_OB_GREEN, $23 ; ANIM_OBJ_98
-	battleanimobj RELATIVE_X | X_FLIP, $80, BATTLEANIMFRAMESET_A0, BATTLEANIMFUNC_16, PAL_BATTLE_OB_GRAY, $23 ; ANIM_OBJ_99
-	battleanimobj RELATIVE_X | X_FLIP, $70, BATTLEANIMFRAMESET_78, BATTLEANIMFUNC_43, PAL_BATTLE_OB_YELLOW, $23 ; ANIM_OBJ_9A
-	battleanimobj RELATIVE_X | X_FLIP, $c0, BATTLEANIMFRAMESET_A2, BATTLEANIMFUNC_01, PAL_BATTLE_OB_GRAY, $25 ; ANIM_OBJ_9B
-	battleanimobj RELATIVE_X | X_FLIP, $40, BATTLEANIMFRAMESET_A3, BATTLEANIMFUNC_44, PAL_BATTLE_OB_YELLOW, $24 ; ANIM_OBJ_9C
-	battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_A4, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $24 ; ANIM_OBJ_9D
-	battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_A5, BATTLEANIMFUNC_00, PAL_BATTLE_OB_YELLOW, $24 ; ANIM_OBJ_9E
-	battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_43, BATTLEANIMFUNC_45, PAL_BATTLE_OB_RED, $12 ; ANIM_OBJ_9F
-	battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_A6, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $02 ; ANIM_OBJ_A0
-	battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_A7, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $02 ; ANIM_OBJ_A1
-	battleanimobj RELATIVE_X | X_FLIP, $00, BATTLEANIMFRAMESET_B4, BATTLEANIMFUNC_4A, PAL_BATTLE_OB_BROWN, $0f ; ANIM_OBJ_A2
-	battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_A8, BATTLEANIMFUNC_02, PAL_BATTLE_OB_YELLOW, $05 ; ANIM_OBJ_A3
-	battleanimobj RELATIVE_X | X_FLIP, $40, BATTLEANIMFRAMESET_9C, BATTLEANIMFUNC_11, PAL_BATTLE_OB_GRAY, $25 ; ANIM_OBJ_A4
-	battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $90, BATTLEANIMFRAMESET_A9, BATTLEANIMFUNC_46, PAL_BATTLE_OB_GRAY, $23 ; ANIM_OBJ_A5
-	battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_24, BATTLEANIMFUNC_47, PAL_BATTLE_OB_GRAY, $0e ; ANIM_OBJ_PERISH_SONG
-	battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_AA, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $24 ; ANIM_OBJ_A7
-	battleanimobj RELATIVE_X | X_FLIP, $b8, BATTLEANIMFRAMESET_AB, BATTLEANIMFUNC_48, PAL_BATTLE_OB_GRAY, $13 ; ANIM_OBJ_A8
-	battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_AC, BATTLEANIMFUNC_44, PAL_BATTLE_OB_GRAY, $13 ; ANIM_OBJ_A9
-	battleanimobj RELATIVE_X, $a8, BATTLEANIMFRAMESET_05, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $01 ; ANIM_OBJ_AA
-	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_24, BATTLEANIMFUNC_43, PAL_BATTLE_OB_GRAY, $0e ; ANIM_OBJ_AB
-	battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_AD, BATTLEANIMFUNC_00, PAL_BATTLE_OB_BLUE, $17 ; ANIM_OBJ_AC
-	battleanimobj RELATIVE_X, $a8, BATTLEANIMFRAMESET_AE, BATTLEANIMFUNC_49, PAL_BATTLE_OB_GRAY, $01 ; ANIM_OBJ_AD
-	battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_AF, BATTLEANIMFUNC_01, PAL_BATTLE_OB_YELLOW, $11 ; ANIM_OBJ_AE
-	battleanimobj RELATIVE_X | X_FLIP, $00, BATTLEANIMFRAMESET_B0, BATTLEANIMFUNC_4A, PAL_BATTLE_OB_GRAY, $04 ; ANIM_OBJ_AF
-	battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_70, BATTLEANIMFUNC_4B, PAL_BATTLE_OB_RED, $1c ; ANIM_OBJ_B0
-	battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_B1, BATTLEANIMFUNC_4C, PAL_BATTLE_OB_GRAY, $19 ; ANIM_OBJ_B1
-	battleanimobj RELATIVE_X, $b8, BATTLEANIMFRAMESET_19, BATTLEANIMFUNC_4D, PAL_BATTLE_OB_BROWN, $09 ; ANIM_OBJ_B2
-	battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $98, BATTLEANIMFRAMESET_B3, BATTLEANIMFUNC_00, PAL_BATTLE_OB_YELLOW, $27 ; ANIM_OBJ_B3
-	battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $98, BATTLEANIMFRAMESET_74, BATTLEANIMFUNC_04, PAL_BATTLE_OB_BLUE, $15 ; ANIM_OBJ_B4
-	battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_19, BATTLEANIMFUNC_4E, PAL_BATTLE_OB_BROWN, $09 ; ANIM_OBJ_B5
-	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_73, BATTLEANIMFUNC_08, PAL_BATTLE_OB_RED, $1e ; ANIM_OBJ_FLOWER
-	battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_89, BATTLEANIMFUNC_4F, PAL_BATTLE_OB_RED, $1f ; ANIM_OBJ_COTTON
-	battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_B5, BATTLEANIMFUNC_00, PAL_BATTLE_OB_ENEMY, $28 ; ANIM_OBJ_PLAYERFEETFOLLOW
-	battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_B6, BATTLEANIMFUNC_00, PAL_BATTLE_OB_PLAYER, $29 ; ANIM_OBJ_ENEMYFEETFOLLOW
-	battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_B7, BATTLEANIMFUNC_00, PAL_BATTLE_OB_ENEMY, $28 ; ANIM_OBJ_BA
-	battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_B8, BATTLEANIMFUNC_00, PAL_BATTLE_OB_PLAYER, $29 ; ANIM_OBJ_BB
-; ccfbe
--- a/battle/objects/engine.asm
+++ /dev/null
@@ -1,314 +1,0 @@
-QueueBattleAnimation: ; cc9a1 (33:49a1)
-	ld hl, ActiveAnimObjects
-	ld e, 10
-.loop
-	ld a, [hl]
-	and a
-	jr z, .done
-	ld bc, BATTLEANIMSTRUCT_LENGTH
-	add hl, bc
-	dec e
-	jr nz, .loop
-	scf
-	ret
-
-.done
-	ld c, l
-	ld b, h
-	ld hl, wNumActiveBattleAnims
-	inc [hl]
-	call InitBattleAnimation
-	ret
-
-DeinitBattleAnimation: ; cc9bd
-	ld hl, BATTLEANIMSTRUCT_INDEX
-	add hl, bc
-	ld [hl], $0
-	ret
-
-; cc9c4
-
-InitBattleAnimation: ; cc9c4 (33:49c4)
-	ld a, [wBattleAnimTemp0]
-	ld e, a
-	ld d, 0
-	ld hl, BattleAnimObjects
-rept 6
-	add hl, de
-endr
-	ld e, l
-	ld d, h
-	ld hl, BATTLEANIMSTRUCT_INDEX
-	add hl, bc
-	ld a, [wNumActiveBattleAnims]
-	ld [hli], a ; Index
-	ld a, [de]
-	inc de
-	ld [hli], a ; 01
-	ld a, [de]
-	inc de
-	ld [hli], a ; 02
-	ld a, [de]
-	inc de
-	ld [hli], a ; Frameset ID
-	ld a, [de]
-	inc de
-	ld [hli], a ; Function
-	ld a, [de]
-	inc de
-	ld [hli], a ; 05
-	ld a, [de]
-	call GetBattleAnimTileOffset
-	ld [hli], a ; Tile ID
-	ld a, [wBattleAnimTemp1]
-	ld [hli], a ; X Coord
-	ld a, [wBattleAnimTemp2]
-	ld [hli], a ; Y Coord
-	xor a
-	ld [hli], a ; X Offset
-	ld [hli], a ; Y Offset
-	ld a, [wBattleAnimTemp3]
-	ld [hli], a ; 0b
-	xor a
-	ld [hli], a ; 0c
-	dec a
-	ld [hli], a ; 0d
-	xor a
-	ld [hli], a ; 0e
-	ld [hli], a ; 0f
-	ld [hl], a  ; 10
-	ret
-
-BattleAnimOAMUpdate: ; cca09
-	call InitBattleAnimBuffer
-	call GetBattleAnimFrame
-	cp -3
-	jp z, .done
-	cp -4
-	jp z, .delete
-	push af
-	ld hl, wBattleAnimTempOAMFlags
-	ld a, [wBattleAnimTemp7]
-	xor [hl]
-	and $e0
-	ld [hl], a
-	pop af
-	push bc
-	call GetBattleAnimOAMPointer
-	ld a, [wBattleAnimTempTileID]
-	add [hl]
-	ld [wBattleAnimTempTileID], a
-	inc hl
-	ld a, [hli]
-	ld c, a
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	ld a, [wBattleAnimOAMPointerLo]
-	ld e, a
-	ld d, HIGH(Sprites)
-.loop
-	ld a, [wBattleAnimTempYCoord]
-	ld b, a
-	ld a, [wBattleAnimTempYOffset]
-	add b
-	ld b, a
-	push hl
-	ld a, [hl]
-	ld hl, wBattleAnimTempOAMFlags
-	bit 6, [hl]
-	jr z, .no_yflip
-	add $8
-	xor $ff
-	inc a
-
-.no_yflip
-	pop hl
-	add b
-	ld [de], a
-	inc hl
-	inc de
-	ld a, [wBattleAnimTempXCoord]
-	ld b, a
-	ld a, [wBattleAnimTempXOffset]
-	add b
-	ld b, a
-	push hl
-	ld a, [hl]
-	ld hl, wBattleAnimTempOAMFlags
-	bit 5, [hl]
-	jr z, .no_xflip
-	add $8
-	xor $ff
-	inc a
-
-.no_xflip
-	pop hl
-	add b
-	ld [de], a
-	inc hl
-	inc de
-	ld a, [wBattleAnimTempTileID]
-	add $31
-	add [hl]
-	ld [de], a
-	inc hl
-	inc de
-	ld a, [wBattleAnimTempOAMFlags]
-	ld b, a
-	ld a, [hl]
-	xor b
-	and $e0
-	ld b, a
-	ld a, [hl]
-	and $10
-	or b
-	ld b, a
-	ld a, [wBattleAnimTempPalette]
-	and $f
-	or b
-	ld [de], a
-	inc hl
-	inc de
-	ld a, e
-	ld [wBattleAnimOAMPointerLo], a
-	cp $a0
-	jr nc, .exit_set_carry
-	dec c
-	jr nz, .loop
-	pop bc
-	jr .done
-
-.delete
-	call DeinitBattleAnimation
-
-.done
-	and a
-	ret
-
-.exit_set_carry
-	pop bc
-	scf
-	ret
-
-; ccaaa
-
-InitBattleAnimBuffer: ; ccaaa
-	ld hl, BATTLEANIMSTRUCT_01
-	add hl, bc
-	ld a, [hl]
-	and %10000000
-	ld [wBattleAnimTempOAMFlags], a
-	xor a
-	ld [wBattleAnimTemp7], a
-	ld hl, BATTLEANIMSTRUCT_PALETTE
-	add hl, bc
-	ld a, [hl]
-	ld [wBattleAnimTempPalette], a
-	ld hl, BATTLEANIMSTRUCT_02
-	add hl, bc
-	ld a, [hl]
-	ld [wBattleAnimTemp1], a
-	ld hl, BATTLEANIMSTRUCT_TILEID
-	add hl, bc
-	ld a, [hli]
-	ld [wBattleAnimTempTileID], a
-	ld a, [hli]
-	ld [wBattleAnimTempXCoord], a
-	ld a, [hli]
-	ld [wBattleAnimTempYCoord], a
-	ld a, [hli]
-	ld [wBattleAnimTempXOffset], a
-	ld a, [hli]
-	ld [wBattleAnimTempYOffset], a
-	ld a, [hBattleTurn]
-	and a
-	ret z
-	ld hl, BATTLEANIMSTRUCT_01
-	add hl, bc
-	ld a, [hl]
-	ld [wBattleAnimTempOAMFlags], a
-	bit 0, [hl]
-	ret z
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld a, [hli]
-	ld d, a
-	ld a, (-10 * 8) + 4
-	sub d
-	ld [wBattleAnimTempXCoord], a
-	ld a, [hli]
-	ld d, a
-	ld a, [wBattleAnimTemp1]
-	cp $ff
-	jr nz, .check_kinesis_softboiled_milkdrink
-	ld a, 5 * 8
-	add d
-	jr .done
-
-.check_kinesis_softboiled_milkdrink
-	sub d
-	push af
-	ld a, [FXAnimID + 1]
-	or a
-	jr nz, .no_sub
-	ld a, [FXAnimID]
-	cp KINESIS
-	jr z, .kinesis
-	cp SOFTBOILED
-	jr z, .softboiled
-	cp MILK_DRINK
-	jr nz, .no_sub
-.kinesis
-.softboiled
-.milk_drink
-	pop af
-	sub 1 * 8
-	jr .done
-
-.no_sub
-	pop af
-.done
-	ld [wBattleAnimTempYCoord], a
-	ld a, [hli]
-	xor $ff
-	inc a
-	ld [wBattleAnimTempXOffset], a
-	ret
-
-; ccb31
-
-GetBattleAnimTileOffset: ; ccb31 (33:4b31)
-	push hl
-	push bc
-	ld hl, wBattleAnimTileDict
-	ld b, a
-	ld c, 10 / 2
-.loop
-	ld a, [hli]
-	cp b
-	jr z, .load
-	inc hl
-	dec c
-	jr nz, .loop
-	xor a
-	jr .done
-
-.load
-	ld a, [hl]
-.done
-	pop bc
-	pop hl
-	ret
-
-_ExecuteBGEffects: ; ccb48
-	callfar ExecuteBGEffects
-	ret
-
-; ccb4f
-
-_QueueBGEffect: ; ccb4f (33:4b4f)
-	callfar QueueBGEffect
-	ret
-
-; ccb56 (33:4b56)
--- a/battle/objects/framesets.asm
+++ /dev/null
@@ -1,1270 +1,0 @@
-BattleAnimFrameData: ; ce85e
-	dw .Frameset_00 ; 00
-	dw .Frameset_01 ; 01
-	dw .Frameset_02 ; 02
-	dw .Frameset_03 ; 03
-	dw .Frameset_04 ; 04
-	dw .Frameset_05 ; 05
-	dw .Frameset_06 ; 06
-	dw .Frameset_07 ; 07
-	dw .Frameset_08 ; 08
-	dw .Frameset_09 ; 09
-	dw .Frameset_0a ; 0a
-	dw .Frameset_0b ; 0b
-	dw .Frameset_0c ; 0c
-	dw .Frameset_0d ; 0d
-	dw .Frameset_0e ; 0e
-	dw .Frameset_0f ; 0f
-	dw .Frameset_10 ; 10
-	dw .Frameset_11 ; 11
-	dw .Frameset_12 ; 12
-	dw .Frameset_13 ; 13
-	dw .Frameset_14 ; 14
-	dw .Frameset_15 ; 15
-	dw .Frameset_16 ; 16
-	dw .Frameset_17 ; 17
-	dw .Frameset_18 ; 18
-	dw .Frameset_19 ; 19
-	dw .Frameset_1a ; 1a
-	dw .Frameset_1b ; 1b
-	dw .Frameset_1c ; 1c
-	dw .Frameset_1d ; 1d
-	dw .Frameset_1e ; 1e
-	dw .Frameset_1f ; 1f
-	dw .Frameset_20 ; 20
-	dw .Frameset_21 ; 21
-	dw .Frameset_22 ; 22
-	dw .Frameset_23 ; 23
-	dw .Frameset_24 ; 24
-	dw .Frameset_25 ; 25
-	dw .Frameset_26 ; 26
-	dw .Frameset_27 ; 27
-	dw .Frameset_28 ; 28
-	dw .Frameset_29 ; 29
-	dw .Frameset_2a ; 2a
-	dw .Frameset_2b ; 2b
-	dw .Frameset_2c ; 2c
-	dw .Frameset_2d ; 2d
-	dw .Frameset_2e ; 2e
-	dw .Frameset_2f ; 2f
-	dw .Frameset_30 ; 30
-	dw .Frameset_31 ; 31
-	dw .Frameset_32 ; 32
-	dw .Frameset_33 ; 33
-	dw .Frameset_34 ; 34
-	dw .Frameset_35 ; 35
-	dw .Frameset_36 ; 36
-	dw .Frameset_37 ; 37
-	dw .Frameset_38 ; 38
-	dw .Frameset_39 ; 39
-	dw .Frameset_3a ; 3a
-	dw .Frameset_3b ; 3b
-	dw .Frameset_3c ; 3c
-	dw .Frameset_3d ; 3d
-	dw .Frameset_3e ; 3e
-	dw .Frameset_3f ; 3f
-	dw .Frameset_40 ; 40
-	dw .Frameset_41 ; 41
-	dw .Frameset_42 ; 42
-	dw .Frameset_43 ; 43
-	dw .Frameset_44 ; 44
-	dw .Frameset_45 ; 45
-	dw .Frameset_46 ; 46
-	dw .Frameset_47 ; 47
-	dw .Frameset_48 ; 48
-	dw .Frameset_49 ; 49
-	dw .Frameset_4a ; 4a
-	dw .Frameset_4b ; 4b
-	dw .Frameset_4c ; 4c
-	dw .Frameset_4d ; 4d
-	dw .Frameset_4e ; 4e
-	dw .Frameset_4f ; 4f
-	dw .Frameset_50 ; 50
-	dw .Frameset_51 ; 51
-	dw .Frameset_52 ; 52
-	dw .Frameset_53 ; 53
-	dw .Frameset_54 ; 54
-	dw .Frameset_55 ; 55
-	dw .Frameset_56 ; 56
-	dw .Frameset_57 ; 57
-	dw .Frameset_58 ; 58
-	dw .Frameset_59 ; 59
-	dw .Frameset_5a ; 5a
-	dw .Frameset_5b ; 5b
-	dw .Frameset_5c ; 5c
-	dw .Frameset_5d ; 5d
-	dw .Frameset_5e ; 5e
-	dw .Frameset_5f ; 5f
-	dw .Frameset_60 ; 60
-	dw .Frameset_61 ; 61
-	dw .Frameset_62 ; 62
-	dw .Frameset_63 ; 63
-	dw .Frameset_64 ; 64
-	dw .Frameset_65 ; 65
-	dw .Frameset_66 ; 66
-	dw .Frameset_67 ; 67
-	dw .Frameset_68 ; 68
-	dw .Frameset_69 ; 69
-	dw .Frameset_6a ; 6a
-	dw .Frameset_6b ; 6b
-	dw .Frameset_6c ; 6c
-	dw .Frameset_6d ; 6d
-	dw .Frameset_6e ; 6e
-	dw .Frameset_6f ; 6f
-	dw .Frameset_70 ; 70
-	dw .Frameset_71 ; 71
-	dw .Frameset_72 ; 72
-	dw .Frameset_73 ; 73
-	dw .Frameset_74 ; 74
-	dw .Frameset_75 ; 75
-	dw .Frameset_76 ; 76
-	dw .Frameset_77 ; 77
-	dw .Frameset_78 ; 78
-	dw .Frameset_79 ; 79
-	dw .Frameset_7a ; 7a
-	dw .Frameset_7b ; 7b
-	dw .Frameset_7c ; 7c
-	dw .Frameset_7d ; 7d
-	dw .Frameset_7e ; 7e
-	dw .Frameset_7f ; 7f
-	dw .Frameset_80 ; 80
-	dw .Frameset_81 ; 81
-	dw .Frameset_82 ; 82
-	dw .Frameset_83 ; 83
-	dw .Frameset_84 ; 84
-	dw .Frameset_85 ; 85
-	dw .Frameset_86 ; 86
-	dw .Frameset_87 ; 87
-	dw .Frameset_88 ; 88
-	dw .Frameset_89 ; 89
-	dw .Frameset_8a ; 8a
-	dw .Frameset_8b ; 8b
-	dw .Frameset_8c ; 8c
-	dw .Frameset_8d ; 8d
-	dw .Frameset_8e ; 8e
-	dw .Frameset_8f ; 8f
-	dw .Frameset_90 ; 90
-	dw .Frameset_91 ; 91
-	dw .Frameset_92 ; 92
-	dw .Frameset_93 ; 93
-	dw .Frameset_94 ; 94
-	dw .Frameset_95 ; 95
-	dw .Frameset_96 ; 96
-	dw .Frameset_97 ; 97
-	dw .Frameset_98 ; 98
-	dw .Frameset_99 ; 99
-	dw .Frameset_9a ; 9a
-	dw .Frameset_9b ; 9b
-	dw .Frameset_9c ; 9c
-	dw .Frameset_9d ; 9d
-	dw .Frameset_9e ; 9e
-	dw .Frameset_9f ; 9f
-	dw .Frameset_a0 ; a0
-	dw .Frameset_a1 ; a1
-	dw .Frameset_a2 ; a2
-	dw .Frameset_a3 ; a3
-	dw .Frameset_a4 ; a4
-	dw .Frameset_a5 ; a5
-	dw .Frameset_a6 ; a6
-	dw .Frameset_a7 ; a7
-	dw .Frameset_a8 ; a8
-	dw .Frameset_a9 ; a9
-	dw .Frameset_aa ; aa
-	dw .Frameset_ab ; ab
-	dw .Frameset_ac ; ac
-	dw .Frameset_ad ; ad
-	dw .Frameset_ae ; ae
-	dw .Frameset_af ; af
-	dw .Frameset_b0 ; b0
-	dw .Frameset_b1 ; b1
-	dw .Frameset_b2 ; b2
-	dw .Frameset_b3 ; b3
-	dw .Frameset_b4 ; b4
-	dw .Frameset_b5 ; b5
-	dw .Frameset_b6 ; b6
-	dw .Frameset_b7 ; b7
-	dw .Frameset_b8 ; b8
-
-     ; OAM index (see battle/objects/oam.asm), flip flags / duration
-.Frameset_00:
-	db BATTLEANIMOAMSET_00, $06
-	db -4
-
-.Frameset_01:
-	db BATTLEANIMOAMSET_01, $06
-	db -4
-
-.Frameset_02:
-	db BATTLEANIMOAMSET_02, $06
-	db -4
-
-.Frameset_03:
-	db BATTLEANIMOAMSET_03, $06
-	db -4
-
-.Frameset_04:
-	db BATTLEANIMOAMSET_04, $06
-	db -4
-
-.Frameset_05:
-	db BATTLEANIMOAMSET_05, $06
-	db -4
-
-.Frameset_06:
-	db BATTLEANIMOAMSET_06, $06
-	db -4
-
-.Frameset_07:
-	db BATTLEANIMOAMSET_03, $04
-	db BATTLEANIMOAMSET_01, $01
-	db BATTLEANIMOAMSET_03, $04
-	db BATTLEANIMOAMSET_01, $01
-	db BATTLEANIMOAMSET_03, $04
-	db BATTLEANIMOAMSET_01, $01
-	db BATTLEANIMOAMSET_03, $04
-	db BATTLEANIMOAMSET_01, $01
-	db -4
-
-.Frameset_3e:
-	db BATTLEANIMOAMSET_4B, $02
-	db BATTLEANIMOAMSET_4C, $02
-	db BATTLEANIMOAMSET_4D, $04
-	db BATTLEANIMOAMSET_4E, $02
-	db -3, $02
-	db BATTLEANIMOAMSET_4E, $02
-	db -3, $02
-	db BATTLEANIMOAMSET_4E, $02
-	db -3, $02
-	db BATTLEANIMOAMSET_4E, $02
-	db -4
-
-.Frameset_3f:
-	db BATTLEANIMOAMSET_4B, $42
-	db BATTLEANIMOAMSET_4C, $42
-	db BATTLEANIMOAMSET_4D, $44
-	db BATTLEANIMOAMSET_4E, $42
-	db -3, $02
-	db BATTLEANIMOAMSET_4E, $42
-	db -3, $02
-	db BATTLEANIMOAMSET_4E, $42
-	db -3, $02
-	db BATTLEANIMOAMSET_4E, $42
-	db -4
-
-.Frameset_40:
-	db BATTLEANIMOAMSET_4B, $c2
-	db BATTLEANIMOAMSET_4C, $c2
-	db BATTLEANIMOAMSET_4D, $c4
-	db BATTLEANIMOAMSET_4E, $c2
-	db -3, $02
-	db BATTLEANIMOAMSET_4E, $c2
-	db -3, $02
-	db BATTLEANIMOAMSET_4E, $c2
-	db -3, $02
-	db BATTLEANIMOAMSET_4E, $c2
-	db -4
-
-.Frameset_41:
-	db BATTLEANIMOAMSET_4B, $01
-	db BATTLEANIMOAMSET_4C, $01
-	db BATTLEANIMOAMSET_4D, $01
-	db BATTLEANIMOAMSET_4F, $01
-	db BATTLEANIMOAMSET_50, $01
-	db BATTLEANIMOAMSET_51, $01
-	db BATTLEANIMOAMSET_52, $02
-	db -3, $02
-	db BATTLEANIMOAMSET_52, $02
-	db -3, $02
-	db BATTLEANIMOAMSET_52, $02
-	db -3, $02
-	db BATTLEANIMOAMSET_52, $02
-	db -4
-
-.Frameset_42:
-	db BATTLEANIMOAMSET_4B, $41
-	db BATTLEANIMOAMSET_4C, $41
-	db BATTLEANIMOAMSET_4D, $41
-	db BATTLEANIMOAMSET_4F, $41
-	db BATTLEANIMOAMSET_50, $41
-	db BATTLEANIMOAMSET_51, $41
-	db BATTLEANIMOAMSET_52, $42
-	db -3, $02
-	db BATTLEANIMOAMSET_52, $42
-	db -3, $02
-	db BATTLEANIMOAMSET_52, $42
-	db -3, $02
-	db BATTLEANIMOAMSET_52, $42
-	db -4
-
-.Frameset_08:
-	db BATTLEANIMOAMSET_00, $03
-	db BATTLEANIMOAMSET_07, $03
-	db BATTLEANIMOAMSET_08, $03
-	db BATTLEANIMOAMSET_09, $03
-	db -4
-
-.Frameset_09:
-	db BATTLEANIMOAMSET_0A, $07
-	db BATTLEANIMOAMSET_0B, $07
-	db BATTLEANIMOAMSET_0A, $07
-	db BATTLEANIMOAMSET_0B, $47
-	db -2
-
-.Frameset_0a:
-	db BATTLEANIMOAMSET_0C, $08
-	db -1
-
-.Frameset_0b:
-	db BATTLEANIMOAMSET_0D, $08
-	db -1
-
-.Frameset_0c:
-	db BATTLEANIMOAMSET_0A, $08
-	db -1
-
-.Frameset_0d:
-	db BATTLEANIMOAMSET_0A, $07
-	db BATTLEANIMOAMSET_0B, $07
-	db BATTLEANIMOAMSET_0A, $07
-	db BATTLEANIMOAMSET_0B, $47
-	db BATTLEANIMOAMSET_0A, $07
-	db -1
-
-.Frameset_0e:
-	db BATTLEANIMOAMSET_0A, $08
-	db -1
-
-.Frameset_0f:
-	db BATTLEANIMOAMSET_0A, $04
-	db BATTLEANIMOAMSET_0E, $04
-	db -2
-
-.Frameset_10:
-	db BATTLEANIMOAMSET_0F, $04
-	db BATTLEANIMOAMSET_10, $04
-	db -2
-
-.Frameset_11:
-	db BATTLEANIMOAMSET_10, $04
-	db BATTLEANIMOAMSET_0F, $04
-	db BATTLEANIMOAMSET_0E, $04
-	db BATTLEANIMOAMSET_0A, $04
-	db BATTLEANIMOAMSET_0E, $04
-	db BATTLEANIMOAMSET_0A, $04
-	db BATTLEANIMOAMSET_0E, $04
-	db BATTLEANIMOAMSET_0A, $04
-	db -4
-
-.Frameset_12:
-	db BATTLEANIMOAMSET_10, $01
-	db BATTLEANIMOAMSET_0F, $01
-	db BATTLEANIMOAMSET_12, $01
-	db BATTLEANIMOAMSET_11, $01
-	db BATTLEANIMOAMSET_12, $01
-	db BATTLEANIMOAMSET_0F, $01
-	db -2
-
-.Frameset_13:
-	db BATTLEANIMOAMSET_10, $03
-	db BATTLEANIMOAMSET_0F, $03
-	db BATTLEANIMOAMSET_12, $01
-	db -3, $01
-	db BATTLEANIMOAMSET_12, $01
-	db -3, $01
-	db BATTLEANIMOAMSET_12, $01
-	db -3, $01
-	db BATTLEANIMOAMSET_12, $01
-	db -3, $01
-	db BATTLEANIMOAMSET_12, $03
-	db -4
-
-.Frameset_14:
-	db BATTLEANIMOAMSET_13, $14
-	db -4
-
-.Frameset_15:
-	db BATTLEANIMOAMSET_10, $01
-	db BATTLEANIMOAMSET_0F, $01
-	db -2
-
-.Frameset_16:
-	db BATTLEANIMOAMSET_14, $08
-	db -1
-
-.Frameset_17:
-	db BATTLEANIMOAMSET_17, $04
-	db BATTLEANIMOAMSET_16, $08
-	db BATTLEANIMOAMSET_15, $08
-	db BATTLEANIMOAMSET_16, $08
-	db BATTLEANIMOAMSET_17, $04
-	db BATTLEANIMOAMSET_17, $04
-	db BATTLEANIMOAMSET_16, $48
-	db BATTLEANIMOAMSET_15, $48
-	db BATTLEANIMOAMSET_16, $48
-	db BATTLEANIMOAMSET_17, $04
-	db -2
-
-.Frameset_56:
-	db BATTLEANIMOAMSET_69, $08
-	db -1
-
-.Frameset_57:
-	db BATTLEANIMOAMSET_69, $20
-	db BATTLEANIMOAMSET_6A, $04
-	db BATTLEANIMOAMSET_6B, $04
-	db BATTLEANIMOAMSET_6D, $04
-	db BATTLEANIMOAMSET_6C, $04
-	db -1
-
-.Frameset_58:
-	db BATTLEANIMOAMSET_6C, $08
-	db BATTLEANIMOAMSET_6D, $08
-	db -2
-
-.Frameset_18:
-	db BATTLEANIMOAMSET_18, $04
-	db BATTLEANIMOAMSET_19, $04
-	db BATTLEANIMOAMSET_1A, $04
-	db -4
-
-.Frameset_19:
-	db BATTLEANIMOAMSET_1B, $08
-	db -1
-
-.Frameset_1a:
-	db BATTLEANIMOAMSET_0F, $08
-	db -1
-
-.Frameset_1b:
-	db BATTLEANIMOAMSET_1C, $08
-	db -1
-
-.Frameset_1c:
-	db BATTLEANIMOAMSET_0A, $08
-	db -4
-
-.Frameset_1d:
-	db BATTLEANIMOAMSET_1D, $08
-	db -1
-
-.Frameset_1e:
-	db BATTLEANIMOAMSET_17, $08
-	db -1
-
-.Frameset_1f:
-	db BATTLEANIMOAMSET_0F, $03
-	db BATTLEANIMOAMSET_10, $03
-	db BATTLEANIMOAMSET_1E, $03
-	db -1
-
-.Frameset_20:
-	db BATTLEANIMOAMSET_1F, $10
-	db BATTLEANIMOAMSET_20, $03
-	db -4
-
-.Frameset_21:
-	db BATTLEANIMOAMSET_20, $08
-	db -1
-
-.Frameset_22:
-	db BATTLEANIMOAMSET_20, $08
-	db BATTLEANIMOAMSET_21, $08
-	db BATTLEANIMOAMSET_1B, $08
-	db BATTLEANIMOAMSET_21, $08
-	db -2
-
-.Frameset_23:
-	db BATTLEANIMOAMSET_22, $08
-	db -1
-
-.Frameset_24:
-	db BATTLEANIMOAMSET_1B, $08
-	db -1
-
-.Frameset_25:
-	db BATTLEANIMOAMSET_23, $08
-	db -1
-
-.Frameset_26:
-	db BATTLEANIMOAMSET_24, $08
-	db -1
-
-.Frameset_27:
-	db BATTLEANIMOAMSET_25, $08
-	db -1
-
-.Frameset_28:
-	db BATTLEANIMOAMSET_26, $08
-	db BATTLEANIMOAMSET_27, $08
-	db -1
-
-.Frameset_29:
-	db BATTLEANIMOAMSET_28, $08
-	db BATTLEANIMOAMSET_29, $08
-	db -4
-
-.Frameset_2a:
-	db BATTLEANIMOAMSET_2A, $01
-	db BATTLEANIMOAMSET_2B, $01
-	db BATTLEANIMOAMSET_2C, $01
-	db BATTLEANIMOAMSET_2D, $01
-	db BATTLEANIMOAMSET_2E, $01
-	db BATTLEANIMOAMSET_2D, $01
-	db BATTLEANIMOAMSET_2C, $01
-	db BATTLEANIMOAMSET_2B, $01
-	db BATTLEANIMOAMSET_2A, $01
-	db -4
-
-.Frameset_2b:
-	db BATTLEANIMOAMSET_14, $01
-	db BATTLEANIMOAMSET_15, $01
-	db -2
-
-.Frameset_2c:
-	db BATTLEANIMOAMSET_2F, $04
-	db BATTLEANIMOAMSET_30, $28
-	db -4
-
-.Frameset_2d:
-	db BATTLEANIMOAMSET_31, $08
-	db -1
-
-.Frameset_2e:
-	db BATTLEANIMOAMSET_32, $20
-	db BATTLEANIMOAMSET_33, $20
-	db BATTLEANIMOAMSET_34, $20
-	db BATTLEANIMOAMSET_35, $20 ; fallthrough
-.Frameset_2f:
-	db -3, $02
-	db BATTLEANIMOAMSET_35, $04
-	db -3, $02
-	db BATTLEANIMOAMSET_35, $04
-	db -3, $02
-	db BATTLEANIMOAMSET_35, $04
-	db -3, $02
-	db BATTLEANIMOAMSET_35, $04
-	db -4
-
-.Frameset_30:
-	db BATTLEANIMOAMSET_14, $04
-	db BATTLEANIMOAMSET_15, $04
-	db -2
-
-.Frameset_31:
-	db BATTLEANIMOAMSET_36, $02
-	db BATTLEANIMOAMSET_37, $02
-	db BATTLEANIMOAMSET_38, $02
-	db BATTLEANIMOAMSET_39, $20
-	db -4
-
-.Frameset_32:
-	db BATTLEANIMOAMSET_3A, $02
-	db BATTLEANIMOAMSET_3B, $02
-	db BATTLEANIMOAMSET_3C, $02
-	db BATTLEANIMOAMSET_3D, $20
-	db -4
-
-.Frameset_33:
-	db BATTLEANIMOAMSET_3A, $42
-	db BATTLEANIMOAMSET_3B, $42
-	db BATTLEANIMOAMSET_3C, $42
-	db BATTLEANIMOAMSET_3D, $60
-	db -4
-
-.Frameset_34:
-	db BATTLEANIMOAMSET_3E, $08
-	db BATTLEANIMOAMSET_3F, $08
-	db BATTLEANIMOAMSET_40, $08
-	db -1
-
-.Frameset_35:
-	db BATTLEANIMOAMSET_40, $02
-	db -3, $02
-	db BATTLEANIMOAMSET_40, $02
-	db -3, $02
-	db BATTLEANIMOAMSET_41, $02
-	db -3, $02
-	db BATTLEANIMOAMSET_41, $02
-	db -3, $02
-	db -2
-
-.Frameset_36:
-	db BATTLEANIMOAMSET_42, $02
-	db BATTLEANIMOAMSET_43, $02
-	db BATTLEANIMOAMSET_44, $02
-	db BATTLEANIMOAMSET_45, $02
-	db -2
-
-.Frameset_37:
-	db BATTLEANIMOAMSET_19, $02
-	db -3, $02
-	db -2
-
-.Frameset_38:
-	db BATTLEANIMOAMSET_46, $04
-	db BATTLEANIMOAMSET_47, $04
-	db -2
-
-.Frameset_39:
-	db BATTLEANIMOAMSET_18, $02
-	db -3, $02
-	db -2
-
-.Frameset_3a:
-	db BATTLEANIMOAMSET_48, $08
-	db -1
-
-.Frameset_3b:
-	db BATTLEANIMOAMSET_48, $48
-	db -1
-
-.Frameset_3c:
-	db BATTLEANIMOAMSET_49, $08
-	db -1
-
-.Frameset_3d:
-	db BATTLEANIMOAMSET_4A, $08
-	db -1
-
-.Frameset_43:
-	db BATTLEANIMOAMSET_20, $10
-	db BATTLEANIMOAMSET_1F, $10
-	db BATTLEANIMOAMSET_1E, $10
-	db -1
-
-.Frameset_4c:
-	db BATTLEANIMOAMSET_20, $08
-	db BATTLEANIMOAMSET_1F, $08
-	db BATTLEANIMOAMSET_1E, $08
-	db -1
-
-.Frameset_44:
-	db -3, $14
-	db BATTLEANIMOAMSET_55, $28
-	db BATTLEANIMOAMSET_54, $28
-	db BATTLEANIMOAMSET_53, $14
-	db -3, $04
-	db BATTLEANIMOAMSET_53, $04
-	db -3, $04
-	db BATTLEANIMOAMSET_53, $04
-	db -3, $04
-	db BATTLEANIMOAMSET_53, $04
-	db -4
-
-.Frameset_7e:
-	db BATTLEANIMOAMSET_1E, $08
-	db BATTLEANIMOAMSET_1F, $08
-	db BATTLEANIMOAMSET_20, $08
-	db -4
-
-.Frameset_45:
-	db -3, $00
-	db BATTLEANIMOAMSET_14, $00
-	db BATTLEANIMOAMSET_15, $00
-	db BATTLEANIMOAMSET_14, $40
-	db -3, $00
-	db BATTLEANIMOAMSET_16, $40
-	db BATTLEANIMOAMSET_15, $00
-	db BATTLEANIMOAMSET_16, $00
-	db -2
-
-.Frameset_46:
-	db BATTLEANIMOAMSET_56, $02
-	db BATTLEANIMOAMSET_57, $04
-	db -4
-
-.Frameset_47:
-	db BATTLEANIMOAMSET_56, $c2
-	db BATTLEANIMOAMSET_57, $c4
-	db -4
-
-.Frameset_48:
-	db BATTLEANIMOAMSET_56, $01
-	db BATTLEANIMOAMSET_57, $01
-	db BATTLEANIMOAMSET_58, $01
-	db BATTLEANIMOAMSET_57, $c1
-	db BATTLEANIMOAMSET_58, $c1
-	db BATTLEANIMOAMSET_57, $02
-	db -4
-
-.Frameset_49:
-	db BATTLEANIMOAMSET_56, $c1
-	db BATTLEANIMOAMSET_57, $c1
-	db BATTLEANIMOAMSET_58, $c1
-	db BATTLEANIMOAMSET_57, $01
-	db BATTLEANIMOAMSET_58, $01
-	db BATTLEANIMOAMSET_57, $c2
-	db -4
-
-.Frameset_4a:
-	db BATTLEANIMOAMSET_57, $c1
-	db BATTLEANIMOAMSET_58, $c1
-	db BATTLEANIMOAMSET_57, $01
-	db BATTLEANIMOAMSET_58, $01
-	db -2
-
-.Frameset_4b:
-	db BATTLEANIMOAMSET_59, $01
-	db BATTLEANIMOAMSET_5A, $01
-	db BATTLEANIMOAMSET_5B, $01
-	db BATTLEANIMOAMSET_5C, $02
-	db -4
-
-.Frameset_4d:
-	db BATTLEANIMOAMSET_0A, $0a
-	db BATTLEANIMOAMSET_0B, $43
-	db BATTLEANIMOAMSET_5D, $43
-	db BATTLEANIMOAMSET_0B, $c3
-	db BATTLEANIMOAMSET_0A, $82
-	db BATTLEANIMOAMSET_0B, $81
-	db BATTLEANIMOAMSET_5D, $01
-	db BATTLEANIMOAMSET_0B, $01
-	db -2
-
-.Frameset_4e:
-	db BATTLEANIMOAMSET_0A, $03
-	db BATTLEANIMOAMSET_0B, $47
-	db BATTLEANIMOAMSET_0A, $07
-	db BATTLEANIMOAMSET_0B, $07
-	db BATTLEANIMOAMSET_0A, $03
-	db -2
-
-.Frameset_4f:
-	db BATTLEANIMOAMSET_5E, $20
-	db BATTLEANIMOAMSET_5E, $20
-	db -4
-
-.Frameset_50:
-	db BATTLEANIMOAMSET_5F, $20
-	db BATTLEANIMOAMSET_5F, $20
-	db -4
-
-.Frameset_51:
-	db BATTLEANIMOAMSET_60, $08
-	db -1
-
-.Frameset_52:
-	db BATTLEANIMOAMSET_61, $01
-	db BATTLEANIMOAMSET_62, $01
-	db BATTLEANIMOAMSET_63, $01
-	db -1
-
-.Frameset_53:
-	db BATTLEANIMOAMSET_63, $07
-	db BATTLEANIMOAMSET_64, $07
-	db -2
-
-.Frameset_54:
-	db BATTLEANIMOAMSET_65, $01
-	db BATTLEANIMOAMSET_66, $01
-	db BATTLEANIMOAMSET_67, $01
-	db -1
-
-.Frameset_55:
-	db BATTLEANIMOAMSET_67, $07
-	db BATTLEANIMOAMSET_68, $07
-	db -2
-
-.Frameset_59:
-	db BATTLEANIMOAMSET_6E, $08
-	db -1
-
-.Frameset_5a:
-	db BATTLEANIMOAMSET_6F, $08
-	db -1
-
-.Frameset_5b:
-	db BATTLEANIMOAMSET_6E, $88
-	db -1
-
-.Frameset_5c:
-	db BATTLEANIMOAMSET_18, $04
-	db BATTLEANIMOAMSET_70, $04
-	db BATTLEANIMOAMSET_71, $04
-	db BATTLEANIMOAMSET_72, $04
-	db BATTLEANIMOAMSET_73, $04
-	db -4
-
-.Frameset_5d:
-	db BATTLEANIMOAMSET_74, $04
-	db BATTLEANIMOAMSET_75, $04
-	db -2
-
-.Frameset_5e:
-	db BATTLEANIMOAMSET_14, $08
-	db -1
-
-.Frameset_7a:
-	db BATTLEANIMOAMSET_74, $03
-	db BATTLEANIMOAMSET_14, $03
-	db BATTLEANIMOAMSET_15, $03
-	db BATTLEANIMOAMSET_14, $03
-	db BATTLEANIMOAMSET_15, $03
-	db -4
-
-.Frameset_af:
-	db BATTLEANIMOAMSET_14, $00
-	db BATTLEANIMOAMSET_15, $00
-	db BATTLEANIMOAMSET_14, $00
-	db BATTLEANIMOAMSET_15, $00
-	db BATTLEANIMOAMSET_74, $0c
-	db -4
-
-.Frameset_5f:
-	db BATTLEANIMOAMSET_76, $08
-	db -1
-
-.Frameset_60:
-	db BATTLEANIMOAMSET_77, $01
-	db BATTLEANIMOAMSET_78, $01
-	db BATTLEANIMOAMSET_79, $01
-	db BATTLEANIMOAMSET_7A, $01
-	db BATTLEANIMOAMSET_7B, $01
-	db BATTLEANIMOAMSET_7C, $01
-	db BATTLEANIMOAMSET_7D, $01
-	db BATTLEANIMOAMSET_7C, $c1
-	db BATTLEANIMOAMSET_7B, $c1
-	db BATTLEANIMOAMSET_7A, $c1
-	db BATTLEANIMOAMSET_79, $c1
-	db BATTLEANIMOAMSET_78, $c1
-	db BATTLEANIMOAMSET_77, $c1
-	db -4
-
-.Frameset_61:
-	db BATTLEANIMOAMSET_1B, $04
-	db BATTLEANIMOAMSET_7E, $04
-	db -2
-
-.Frameset_62:
-	db BATTLEANIMOAMSET_1B, $44
-	db BATTLEANIMOAMSET_7E, $44
-	db -2
-
-.Frameset_63:
-	db BATTLEANIMOAMSET_7F, $08
-	db -1
-
-.Frameset_64:
-	db BATTLEANIMOAMSET_25, $08
-	db -1
-
-.Frameset_65:
-	db BATTLEANIMOAMSET_80, $08
-	db -1
-
-.Frameset_66:
-	db BATTLEANIMOAMSET_83, $07
-	db BATTLEANIMOAMSET_82, $07
-	db BATTLEANIMOAMSET_81, $07
-	db BATTLEANIMOAMSET_82, $07
-	db BATTLEANIMOAMSET_83, $07
-	db BATTLEANIMOAMSET_82, $07
-	db BATTLEANIMOAMSET_81, $07
-	db -4
-
-.Frameset_67:
-	db BATTLEANIMOAMSET_1B, $10
-	db -4
-
-.Frameset_68:
-	db -3, $0f
-	db BATTLEANIMOAMSET_84, $0f
-	db BATTLEANIMOAMSET_85, $0f
-	db BATTLEANIMOAMSET_29, $0f
-	db BATTLEANIMOAMSET_28, $0f
-	db BATTLEANIMOAMSET_86, $20
-	db -4
-
-.Frameset_69:
-	db BATTLEANIMOAMSET_1B, $03
-	db BATTLEANIMOAMSET_87, $03
-	db BATTLEANIMOAMSET_88, $03
-	db BATTLEANIMOAMSET_89, $03
-	db -4
-
-.Frameset_6a:
-	db BATTLEANIMOAMSET_8A, $02
-	db BATTLEANIMOAMSET_8B, $02
-	db BATTLEANIMOAMSET_8C, $02
-	db BATTLEANIMOAMSET_8D, $02
-	db -4
-
-.Frameset_6b:
-	db BATTLEANIMOAMSET_61, $02
-	db BATTLEANIMOAMSET_62, $02
-	db BATTLEANIMOAMSET_63, $02
-	db -1
-
-.Frameset_6c:
-	db BATTLEANIMOAMSET_65, $02
-	db BATTLEANIMOAMSET_66, $02
-	db BATTLEANIMOAMSET_67, $02
-	db -1
-
-.Frameset_6d:
-	db BATTLEANIMOAMSET_8E, $08
-	db -1
-
-.Frameset_6e:
-	db BATTLEANIMOAMSET_8E, $48
-	db -1
-
-.Frameset_6f:
-	db BATTLEANIMOAMSET_8F, $10
-	db BATTLEANIMOAMSET_90, $10
-	db -2
-
-.Frameset_70:
-	db BATTLEANIMOAMSET_91, $10
-	db BATTLEANIMOAMSET_92, $10
-	db -2
-
-.Frameset_71:
-	db BATTLEANIMOAMSET_93, $08
-	db -1
-
-.Frameset_72:
-	db BATTLEANIMOAMSET_1E, $08
-	db -1
-
-.Frameset_73:
-	db BATTLEANIMOAMSET_1B, $07
-	db BATTLEANIMOAMSET_94, $07
-	db -2
-
-.Frameset_74:
-	db BATTLEANIMOAMSET_95, $08
-	db -1
-
-.Frameset_75:
-	db BATTLEANIMOAMSET_96, $08
-	db -1
-
-.Frameset_76:
-	db BATTLEANIMOAMSET_95, $08
-	db -1
-
-.Frameset_77:
-	db BATTLEANIMOAMSET_97, $01
-	db BATTLEANIMOAMSET_97, $41
-	db -2
-
-.Frameset_78:
-	db BATTLEANIMOAMSET_98, $08
-	db -1
-
-.Frameset_79:
-	db BATTLEANIMOAMSET_99, $20
-	db BATTLEANIMOAMSET_99, $20
-	db BATTLEANIMOAMSET_99, $20
-	db BATTLEANIMOAMSET_99, $20
-	db BATTLEANIMOAMSET_99, $20
-	db BATTLEANIMOAMSET_9A, $08
-	db -1
-
-.Frameset_7b:
-	db BATTLEANIMOAMSET_9B, $08
-	db -1
-
-.Frameset_7c:
-	db BATTLEANIMOAMSET_9C, $02
-	db BATTLEANIMOAMSET_9D, $02
-	db BATTLEANIMOAMSET_9E, $08
-	db -3, $02
-	db BATTLEANIMOAMSET_9E, $02
-	db -3, $02
-	db BATTLEANIMOAMSET_9E, $02
-	db -3, $02
-	db BATTLEANIMOAMSET_9E, $02
-	db -4
-
-.Frameset_7d:
-	db BATTLEANIMOAMSET_9F, $08
-	db -1
-
-.Frameset_7f:
-	db BATTLEANIMOAMSET_0F, $08
-	db -1
-
-.Frameset_80:
-	db BATTLEANIMOAMSET_6B, $18
-	db -4
-
-.Frameset_81:
-	db BATTLEANIMOAMSET_A0, $01 ; fallthrough
-.Frameset_82:
-	db BATTLEANIMOAMSET_A1, $01 ; fallthrough
-.Frameset_83:
-	db BATTLEANIMOAMSET_A2, $01
-	db -4
-
-.Frameset_84:
-	db BATTLEANIMOAMSET_A3, $08
-	db -1
-
-.Frameset_85:
-	db BATTLEANIMOAMSET_A4, $04
-	db BATTLEANIMOAMSET_A5, $04
-	db BATTLEANIMOAMSET_A6, $04
-	db BATTLEANIMOAMSET_A7, $04
-	db BATTLEANIMOAMSET_A6, $44
-	db BATTLEANIMOAMSET_A5, $44
-	db -2
-
-.Frameset_86:
-	db BATTLEANIMOAMSET_A8, $04
-	db BATTLEANIMOAMSET_A9, $04
-	db BATTLEANIMOAMSET_AA, $04
-	db BATTLEANIMOAMSET_AB, $04
-	db BATTLEANIMOAMSET_AA, $44
-	db BATTLEANIMOAMSET_A9, $44
-	db -2
-
-.Frameset_87:
-	db BATTLEANIMOAMSET_1B, $08
-	db -1
-
-.Frameset_88:
-	db BATTLEANIMOAMSET_AC, $08
-	db -1
-
-.Frameset_89:
-	db BATTLEANIMOAMSET_AD, $08
-	db -1
-
-.Frameset_8a:
-	db BATTLEANIMOAMSET_AE, $08
-	db -1
-
-.Frameset_8b:
-	db BATTLEANIMOAMSET_AF, $08
-	db -1
-
-.Frameset_8c:
-	db BATTLEANIMOAMSET_B0, $20
-	db -4
-
-.Frameset_8d:
-	db BATTLEANIMOAMSET_B1, $07
-	db BATTLEANIMOAMSET_B1, $47
-	db -2
-
-.Frameset_8e:
-	db BATTLEANIMOAMSET_B2, $08
-	db -1
-
-.Frameset_8f:
-	db BATTLEANIMOAMSET_B3, $08
-	db -1
-
-.Frameset_90:
-	db BATTLEANIMOAMSET_B3, $48
-	db -1
-
-.Frameset_91:
-	db BATTLEANIMOAMSET_B3, $88
-	db -1
-
-.Frameset_92:
-	db BATTLEANIMOAMSET_B3, $c8
-	db -1
-
-.Frameset_93:
-	db BATTLEANIMOAMSET_B5, $08
-	db -1
-
-.Frameset_94:
-	db BATTLEANIMOAMSET_B5, $48
-	db -1
-
-.Frameset_95:
-	db BATTLEANIMOAMSET_B5, $88
-	db -1
-
-.Frameset_96:
-	db BATTLEANIMOAMSET_B5, $c8
-	db -1
-
-.Frameset_97:
-	db BATTLEANIMOAMSET_B4, $08
-	db -1
-
-.Frameset_98:
-	db BATTLEANIMOAMSET_6B, $08
-	db -1
-
-.Frameset_99:
-	db BATTLEANIMOAMSET_B6, $08
-	db -1
-
-.Frameset_9a:
-	db BATTLEANIMOAMSET_B7, $20
-	db -1
-
-.Frameset_9b:
-	db BATTLEANIMOAMSET_1B, $20
-	db -1
-
-.Frameset_9c:
-	db BATTLEANIMOAMSET_B8, $20
-	db -1
-
-.Frameset_9d:
-	db BATTLEANIMOAMSET_B8, $60
-	db -1
-
-.Frameset_9e:
-	db BATTLEANIMOAMSET_B9, $20
-	db -1
-
-.Frameset_9f:
-	db BATTLEANIMOAMSET_BA, $20
-	db -1
-
-.Frameset_a0:
-	db BATTLEANIMOAMSET_BB, $60
-	db -1
-
-.Frameset_a1:
-	db BATTLEANIMOAMSET_BB, $20
-	db -1
-
-.Frameset_a2:
-	db BATTLEANIMOAMSET_BC, $20
-	db -1
-
-.Frameset_a3:
-	db BATTLEANIMOAMSET_BD, $0b
-	db BATTLEANIMOAMSET_BE, $0b
-	db BATTLEANIMOAMSET_1B, $0b
-	db -4
-
-.Frameset_a4:
-	db BATTLEANIMOAMSET_BF, $04
-	db BATTLEANIMOAMSET_C0, $04
-	db BATTLEANIMOAMSET_C1, $04
-	db -4
-
-.Frameset_a5:
-	db BATTLEANIMOAMSET_C2, $20
-	db BATTLEANIMOAMSET_C2, $20
-	db -4
-
-.Frameset_a6:
-	db BATTLEANIMOAMSET_4B, $02
-	db BATTLEANIMOAMSET_4C, $02
-	db BATTLEANIMOAMSET_4D, $20
-	db BATTLEANIMOAMSET_4D, $20
-	db BATTLEANIMOAMSET_4D, $20
-	db BATTLEANIMOAMSET_4F, $01
-	db BATTLEANIMOAMSET_50, $01
-	db BATTLEANIMOAMSET_51, $01
-	db BATTLEANIMOAMSET_52, $02
-	db -3, $02
-	db BATTLEANIMOAMSET_52, $02
-	db -3, $02
-	db BATTLEANIMOAMSET_52, $02
-	db -3, $02
-	db BATTLEANIMOAMSET_52, $02
-	db -4
-
-.Frameset_a7:
-	db BATTLEANIMOAMSET_4B, $c2
-	db BATTLEANIMOAMSET_4C, $c2
-	db BATTLEANIMOAMSET_4D, $e0
-	db BATTLEANIMOAMSET_4D, $e0
-	db BATTLEANIMOAMSET_4D, $e0
-	db BATTLEANIMOAMSET_4F, $c1
-	db BATTLEANIMOAMSET_50, $c1
-	db BATTLEANIMOAMSET_51, $c1
-	db BATTLEANIMOAMSET_52, $c2
-	db -3, $02
-	db BATTLEANIMOAMSET_52, $c2
-	db -3, $02
-	db BATTLEANIMOAMSET_52, $c2
-	db -3, $02
-	db BATTLEANIMOAMSET_52, $c2
-	db -4
-
-.Frameset_a8:
-	db BATTLEANIMOAMSET_C3, $01
-	db BATTLEANIMOAMSET_C3, $c1
-	db -2
-
-.Frameset_a9:
-	db BATTLEANIMOAMSET_C4, $20
-	db -1
-
-.Frameset_aa:
-	db BATTLEANIMOAMSET_C5, $04
-	db BATTLEANIMOAMSET_C6, $04
-	db BATTLEANIMOAMSET_C7, $04
-	db -4
-
-.Frameset_ab:
-	db BATTLEANIMOAMSET_C8, $01
-	db BATTLEANIMOAMSET_C8, $41
-	db -2
-
-.Frameset_ac:
-	db BATTLEANIMOAMSET_C9, $03
-	db BATTLEANIMOAMSET_05, $03
-	db -4
-
-.Frameset_ad:
-	db BATTLEANIMOAMSET_CA, $20
-	db BATTLEANIMOAMSET_CB, $03
-	db BATTLEANIMOAMSET_CA, $03
-	db BATTLEANIMOAMSET_CB, $03
-	db -2
-
-.Frameset_ae:
-	db BATTLEANIMOAMSET_03, $a0
-	db -1
-
-.Frameset_b0:
-	db BATTLEANIMOAMSET_CC, $20
-	db -1
-
-.Frameset_b1:
-	db BATTLEANIMOAMSET_7F, $02
-	db BATTLEANIMOAMSET_25, $02
-	db BATTLEANIMOAMSET_80, $02
-	db BATTLEANIMOAMSET_25, $02
-	db -2
-
-.Frameset_b2:
-	db BATTLEANIMOAMSET_CD, $04
-	db BATTLEANIMOAMSET_CE, $04
-	db BATTLEANIMOAMSET_CD, $c4
-	db BATTLEANIMOAMSET_CE, $c4
-	db -2
-
-.Frameset_b3:
-	db BATTLEANIMOAMSET_CF, $04
-	db BATTLEANIMOAMSET_D0, $04
-	db BATTLEANIMOAMSET_D1, $04
-	db BATTLEANIMOAMSET_D2, $04
-	db -4
-
-.Frameset_b4:
-	db BATTLEANIMOAMSET_D3, $20
-	db -1
-
-.Frameset_b5:
-	db BATTLEANIMOAMSET_D4, $08
-	db -1
-
-.Frameset_b6:
-	db BATTLEANIMOAMSET_D5, $08
-	db -1
-
-.Frameset_b7:
-	db BATTLEANIMOAMSET_D6, $08
-	db -1
-
-.Frameset_b8:
-	db BATTLEANIMOAMSET_D7, $08
-	db -1
-
-; ceeae
--- a/battle/objects/functions.asm
+++ /dev/null
@@ -1,4156 +1,0 @@
-DoBattleAnimFrame: ; ccfbe
-	ld hl, BATTLEANIMSTRUCT_FUNCTION
-	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
-; ccfce
-
-.Jumptable:
-	dw BattleAnimFunction_Null ; 00
-	dw BattleAnimFunction_01 ; 01
-	dw BattleAnimFunction_02 ; 02
-	dw BattleAnimFunction_03 ; 03
-	dw BattleAnimFunction_04 ; 04
-	dw BattleAnimFunction_ThrowFromPlayerToEnemy ; 05
-	dw BattleAnimFunction_ThrowFromPlayerToEnemyAndDisappear ; 06
-	dw BattleAnimFunction_07 ; 07
-	dw BattleAnimFunction_08 ; 08
-	dw BattleAnimFunction_09 ; 09
-	dw BattleAnimFunction_0A ; 0a
-	dw BattleAnimFunction_RazorLeaf ; 0b
-	dw BattleAnimFunction_0C ; 0c
-	dw BattleAnimFunction_0D ; 0d
-	dw BattleAnimFunction_0E ; 0e
-	dw BattleAnimFunction_0F ; 0f
-	dw BattleAnimFunction_10 ; 10
-	dw BattleAnimFunction_11 ; 11
-	dw BattleAnimFunction_PokeBall ; 12
-	dw BattleAnimFunction_PokeBallBlocked ; 13
-	dw BattleAnimFunction_14 ; 14
-	dw BattleAnimFunction_15 ; 15
-	dw BattleAnimFunction_16 ; 16
-	dw BattleAnimFunction_17 ; 17
-	dw BattleAnimFunction_18 ; 18
-	dw BattleAnimFunction_19 ; 19
-	dw BattleAnimFunction_1A ; 1a
-	dw BattleAnimFunction_1B ; 1b
-	dw BattleAnimFunction_1C ; 1c
-	dw BattleAnimFunction_1D ; 1d
-	dw BattleAnimFunction_1E ; 1e
-	dw BattleAnimFunction_1F ; 1f
-	dw BattleAnimFunction_LeechSeed ; 20
-	dw BattleAnimFunction_21 ; 21
-	dw BattleAnimFunction_22 ; 22
-	dw BattleAnimFunction_23 ; 23
-	dw BattleAnimFunction_24 ; 24
-	dw BattleAnimFunction_25 ; 25
-	dw BattleAnimFunction_26 ; 26
-	dw BattleAnimFunction_27 ; 27
-	dw BattleAnimFunction_28 ; 28
-	dw BattleAnimFunction_SpiralDescent ; 29
-	dw BattleAnimFunction_PoisonGas ; 2a
-	dw BattleAnimFunction_Horn ; 2b
-	dw BattleAnimFunction_2C ; 2c
-	dw BattleAnimFunction_2D ; 2d
-	dw BattleAnimFunction_2E ; 2e
-	dw BattleAnimFunction_2F ; 2f
-	dw BattleAnimFunction_30 ; 30
-	dw BattleAnimFunction_31 ; 31
-	dw BattleAnimFunction_32 ; 32
-	dw BattleAnimFunction_33 ; 33
-	dw BattleAnimFunction_34 ; 34
-	dw BattleAnimFunction_35 ; 35
-	dw BattleAnimFunction_36 ; 36
-	dw BattleAnimFunction_37 ; 37
-	dw BattleAnimFunction_38 ; 38
-	dw BattleAnimFunction_39 ; 39
-	dw BattleAnimFunction_3A ; 3a
-	dw BattleAnimFunction_3B ; 3b
-	dw BattleAnimFunction_3C ; 3c
-	dw BattleAnimFunction_3D ; 3d
-	dw BattleAnimFunction_3E ; 3e
-	dw BattleAnimFunction_3F ; 3f
-	dw BattleAnimFunction_40 ; 40
-	dw BattleAnimFunction_41 ; 41
-	dw BattleAnimFunction_42 ; 42
-	dw BattleAnimFunction_43 ; 43
-	dw BattleAnimFunction_44 ; 44
-	dw BattleAnimFunction_45 ; 45
-	dw BattleAnimFunction_46 ; 46
-	dw BattleAnimFunction_47 ; 47
-	dw BattleAnimFunction_48 ; 48
-	dw BattleAnimFunction_49 ; 49
-	dw BattleAnimFunction_4A ; 4a
-	dw BattleAnimFunction_4B ; 4b
-	dw BattleAnimFunction_4C ; 4c
-	dw BattleAnimFunction_4D ; 4d
-	dw BattleAnimFunction_4E ; 4e
-	dw BattleAnimFunction_4F ; 4f
-
-BattleAnimFunction_Null: ; cd06e (33:506e)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw .zero
-	dw .one
-.one
-	call DeinitBattleAnimation
-.zero
-	ret
-
-BattleAnimFunction_ThrowFromPlayerToEnemyAndDisappear: ; cd079 (33:5079)
-	call BattleAnimFunction_ThrowFromPlayerToEnemy
-	ret c
-	call DeinitBattleAnimation
-	ret
-
-BattleAnimFunction_ThrowFromPlayerToEnemy: ; cd081 (33:5081)
-	; If x coord at $88 or beyond, abort.
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld a, [hl]
-	cp $88
-	ret nc
-	; Move right 2 pixels
-	add $2
-	ld [hl], a
-	; Move down 1 pixel
-	ld hl, BATTLEANIMSTRUCT_YCOORD
-	add hl, bc
-	dec [hl]
-	; Decrease ??? and hold onto its previous value (argument of the sine function)
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	dec [hl]
-	; Get ???, which is the amplitude of the sine function
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld d, [hl]
-	call BattleAnim_Sine
-	; Store the result in the Y offset
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	; Carry flag denotes success
-	scf
-	ret
-
-BattleAnimFunction_04: ; cd0a6 (33:50a6)
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld a, [hl]
-	cp $88
-	jr c, .asm_cd0b3
-	call DeinitBattleAnimation
-	ret
-
-.asm_cd0b3
-	add $2
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_YCOORD
-	add hl, bc
-	dec [hl]
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	inc [hl]
-	inc [hl]
-	inc [hl]
-	inc [hl]
-	ld d, $10
-	push af
-	push de
-	call BattleAnim_Sine
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	pop de
-	pop af
-	call BattleAnim_Cosine
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	sra a
-	sra a
-	sra a
-	sra a
-	ld [hl], a
-	ret
-
-BattleAnimFunction_03: ; cd0e3 (33:50e3)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw .zero
-	dw .one
-.zero
-	call BattleAnim_IncAnonJumptableIndex
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	bit 7, [hl]
-	ld a, $0
-	jr z, .asm_cd0f9
-	ld a, $20
-.asm_cd0f9
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	and $7f
-	ld [hl], a
-.one
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld d, [hl]
-	push af
-	push de
-	call BattleAnim_Sine
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	pop de
-	pop af
-	call BattleAnim_Cosine
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	inc [hl]
-	ret
-
-BattleAnimFunction_01: ; cd12a (33:512a)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw .zero
-	dw .one
-.one
-	call DeinitBattleAnimation
-	ret
-
-.zero
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld a, [hl]
-	cp $84
-	ret nc
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	call Functionce70a
-	ret
-
-BattleAnimFunction_02: ; cd146 (33:5146)
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld a, [hl]
-	cp $84
-	jr nc, .asm_cd158
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	call Functionce70a
-	ret
-
-.asm_cd158
-	call DeinitBattleAnimation
-	ret
-
-BattleAnimFunction_PokeBall: ; cd15c (33:515c)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw .zero
-	dw .one
-	dw .two
-	dw .three
-	dw .four
-	dw .five
-	dw .six
-	dw .seven
-	dw .eight
-	dw .nine
-	dw .ten
-	dw .eleven
-.zero ; init
-	call GetBallAnimPal
-	call BattleAnim_IncAnonJumptableIndex
-	ret
-
-.one
-	call BattleAnimFunction_ThrowFromPlayerToEnemy
-	ret c
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld a, [hl]
-	ld hl, BATTLEANIMSTRUCT_YCOORD
-	add hl, bc
-	add [hl]
-	ld [hl], a
-	ld a, BATTLEANIMFRAMESET_0B
-	call ReinitBattleAnimFrameset
-	call BattleAnim_IncAnonJumptableIndex
-	ret
-
-.three
-	call BattleAnim_IncAnonJumptableIndex
-	ld a, BATTLEANIMFRAMESET_09
-	call ReinitBattleAnimFrameset
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], $0
-	inc hl
-	ld [hl], $10
-.four
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hli]
-	ld d, [hl]
-	call BattleAnim_Sine
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	dec a
-	ld [hl], a
-	and $1f
-	ret nz
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld a, [hl]
-	sub $4
-	ld [hl], a
-	ret nz
-	ld a, BATTLEANIMFRAMESET_0C
-	call ReinitBattleAnimFrameset
-	call BattleAnim_IncAnonJumptableIndex
-	ret
-
-.six
-	ld a, BATTLEANIMFRAMESET_0D
-	call ReinitBattleAnimFrameset
-	ld hl, BATTLEANIMSTRUCT_ANON_JT_INDEX
-	add hl, bc
-	dec [hl]
-.two
-.five
-.nine
-	ret
-
-.seven
-	call GetBallAnimPal
-	ld a, BATTLEANIMFRAMESET_0A
-	call ReinitBattleAnimFrameset
-	call BattleAnim_IncAnonJumptableIndex
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld [hl], $20
-.eight
-.ten
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hli]
-	ld d, [hl]
-	call BattleAnim_Sine
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	dec a
-	ld [hl], a
-	and $1f
-	jr z, .eleven
-	and $f
-	ret nz
-	call BattleAnim_IncAnonJumptableIndex
-	ret
-
-.eleven
-	call DeinitBattleAnimation
-	ret
-
-BattleAnimFunction_PokeBallBlocked: ; cd212 (33:5212)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw .zero
-	dw .one
-	dw .two
-.zero
-	call GetBallAnimPal
-	call BattleAnim_IncAnonJumptableIndex
-	ret
-
-.one
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld a, [hl]
-	cp $70
-	jr nc, .next
-	call BattleAnimFunction_ThrowFromPlayerToEnemy
-	ret
-
-.next
-	call BattleAnim_IncAnonJumptableIndex
-.two
-	ld hl, BATTLEANIMSTRUCT_YCOORD
-	add hl, bc
-	ld a, [hl]
-	cp $80
-	jr nc, .done
-	add $4
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	dec [hl]
-	dec [hl]
-	ret
-
-.done
-	call DeinitBattleAnimation
-	ret
-
-GetBallAnimPal: ; cd249 (33:5249)
-	ld hl, BallColors
-	ld a, [rSVBK]
-	push af
-	ld a, $1
-	ld [rSVBK], a
-	ld a, [CurItem] ; CurItem
-	ld e, a
-	pop af
-	ld [rSVBK], a
-.IsInArray:
-	ld a, [hli]
-	cp -1
-	jr z, .load
-	cp e
-	jr z, .load
-	inc hl
-	jr .IsInArray
-
-.load
-	ld a, [hl]
-	ld hl, BATTLEANIMSTRUCT_PALETTE
-	add hl, bc
-	ld [hl], a
-	ret
-; cd26c (33:526c)
-
-INCLUDE "data/battle/ball_colors.asm"
-
-BattleAnimFunction_10: ; cd284 (33:5284)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw .zero
-	dw .one
-	dw .two
-	dw .three
-	dw .four
-.zero
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	swap a
-	and $f
-	ld hl, BATTLEANIMSTRUCT_ANON_JT_INDEX
-	add hl, bc
-	ld [hl], a
-	ret
-
-.one
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld a, [hl]
-	cp $88
-	ret nc
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	call Functionce70a
-	ret
-
-.two
-	call DeinitBattleAnimation
-	ret
-
-.three
-	call BattleAnim_IncAnonJumptableIndex
-	ld a, BATTLEANIMFRAMESET_0F
-	call ReinitBattleAnimFrameset
-.four
-	ret
-
-BattleAnimFunction_07: ; cd2be (33:52be)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw .zero
-	dw .one
-.zero
-	call BattleAnim_IncAnonJumptableIndex
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], $30
-	inc hl
-	ld [hl], $48
-.one
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hli]
-	ld d, [hl]
-	call BattleAnim_Sine
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	inc [hl]
-	ld a, [hl]
-	and $3f
-	ret nz
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], $20
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld a, [hl]
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	sub [hl]
-	jr z, .done
-	jr c, .done
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld [hl], a
-	ret
-
-.done
-	call DeinitBattleAnimation
-	ret
-
-BattleAnimFunction_08: ; cd306 (33:5306)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw .zero
-	dw .one
-	dw .two
-	dw .three
-.zero
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld a, [hl]
-	cp $80
-	jr nc, .next
-	call .SetCoords
-	ret
-
-.next
-	call BattleAnim_IncAnonJumptableIndex
-.one
-	call BattleAnim_IncAnonJumptableIndex
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], $0
-.two
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	cp $40
-	jr nc, .loop_back
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	ld d, $18
-	call BattleAnim_Cosine
-	sub $18
-	sra a
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	ld d, $18
-	call BattleAnim_Sine
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	and $f
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	add [hl]
-	ld [hl], a
-	ret
-
-.loop_back
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	and $f0
-	jr z, .finish
-	sub $10
-	ld d, a
-	ld a, [hl]
-	and $f
-	or d
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_ANON_JT_INDEX
-	add hl, bc
-	dec [hl]
-	ret
-
-.finish
-	call BattleAnim_IncAnonJumptableIndex
-.three
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld a, [hl]
-	cp $b0
-	jr c, .retain
-	call DeinitBattleAnimation
-	ret
-
-.retain
-	call .SetCoords
-	ret
-
-.SetCoords:
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	and $f
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	add [hl]
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	and $f
-	ld e, a
-	srl e
-	ld hl, BATTLEANIMSTRUCT_YCOORD
-	add hl, bc
-.loop
-	dec [hl]
-	dec e
-	jr nz, .loop
-	ret
-
-BattleAnimFunction_09: ; cd3ae (33:53ae)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw .zero
-	dw .one
-	dw .two
-.zero
-	call BattleAnim_IncAnonJumptableIndex
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], $0
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	and $f
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld [hl], a
-.one
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	and a
-	jr z, .done_one
-	dec [hl]
-	ret
-
-.done_one
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	swap a
-	and $f
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld a, [hl]
-	xor $ff
-	inc a
-	ld [hl], a
-	ret
-
-.two
-	call DeinitBattleAnimation
-	ret
-
-BattleAnimFunction_0A: ; cd3f2 (33:53f2)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw .zero
-	dw .one
-	dw .two
-	dw .three
-	dw .four
-	dw .five
-	dw .six
-	dw .seven
-	dw .eight
-	dw .nine
-.zero
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	ld hl, BATTLEANIMSTRUCT_ANON_JT_INDEX
-	add hl, bc
-	ld [hl], a
-	cp $7
-	jr z, .seven
-	ld a, BATTLEANIMFRAMESET_11
-	call ReinitBattleAnimFrameset
-	ret
-
-.seven
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld a, [hl]
-	cp $88
-	jr nc, .set_up_eight
-	add $2
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_YCOORD
-	add hl, bc
-	dec [hl]
-	ret
-
-.set_up_eight
-	call BattleAnim_IncAnonJumptableIndex
-	ld a, BATTLEANIMFRAMESET_10
-	call ReinitBattleAnimFrameset
-.eight
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	ld d, $10
-	push af
-	push de
-	call BattleAnim_Sine
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	pop de
-	pop af
-	call BattleAnim_Cosine
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	inc [hl]
-	ret
-
-.nine
-	call DeinitBattleAnimation
-	ret
-
-.one
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	dec [hl]
-	ret
-
-.four
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	inc [hl]
-.two
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	dec [hl]
-	ret
-
-.five
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	inc [hl]
-.three
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	inc [hl]
-.six
-	ret
-
-BattleAnimFunction_RazorLeaf: ; cd478 (33:5478)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw .zero
-	dw .one
-	dw .two
-	dw .three
-	dw .four
-	dw .five
-	dw .six
-	dw .seven
-	dw .eight
-.zero
-	call BattleAnim_IncAnonJumptableIndex
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], $40
-.one
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	cp $30
-	jr nc, .sine_cosine
-	call BattleAnim_IncAnonJumptableIndex
-	xor a
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hli], a
-	ld [hl], a
-	ld a, BATTLEANIMFRAMESET_17
-	call ReinitBattleAnimFrameset
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	bit 6, [hl]
-	ret z
-	ld hl, BATTLEANIMSTRUCT_FRAME
-	add hl, bc
-	ld [hl], $5
-	ret
-
-.sine_cosine
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	and $3f
-	ld d, a
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	dec [hl]
-	call BattleAnim_Sine
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	call Functioncd557
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld a, [hl]
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld h, [hl]
-	ld l, a
-	add hl, de
-	ld e, l
-	ld d, h
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld [hl], d
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld [hl], e
-	ret
-
-.two
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld a, [hl]
-	cp $20
-	jr nz, .sine_cosine_2
-	call DeinitBattleAnimation
-	ret
-
-.sine_cosine_2
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	ld d, $10
-	call BattleAnim_Sine
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	bit 6, [hl]
-	jr nz, .decrease
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	inc [hl]
-	jr .finish
-
-.decrease
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	dec [hl]
-.finish
-	ld de, $80
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld a, [hl]
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld h, [hl]
-	ld l, a
-	add hl, de
-	ld e, l
-	ld d, h
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], d
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld [hl], e
-	ret
-
-.three
-	ld a, BATTLEANIMFRAMESET_16
-	call ReinitBattleAnimFrameset
-	ld hl, BATTLEANIMSTRUCT_01
-	add hl, bc
-	res 5, [hl]
-.four
-.five
-.six
-.seven
-	call BattleAnim_IncAnonJumptableIndex
-	ret
-
-.eight
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld a, [hl]
-	cp $c0
-	ret nc
-	ld a, $8
-	call Functionce70a
-	ret
-
-Functioncd557: ; cd557 (33:5557)
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	bit 7, a
-	jr nz, .negative
-	cp $20
-	jr nc, .plus_256
-	cp $18
-	jr nc, .plus_384
-	ld de, $200
-	ret
-
-.plus_384
-	ld de, $180
-	ret
-
-.plus_256
-	ld de, $100
-	ret
-
-.negative
-	and $3f
-	cp $20
-	jr nc, .minus_256
-	cp $18
-	jr nc, .minus_384
-	ld de, -$200
-	ret
-
-.minus_384
-	ld de, -$180
-	ret
-
-.minus_256
-	ld de, -$100
-	ret
-
-BattleAnimFunction_4E: ; cd58a (33:558a)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw .zero
-	dw .one
-.zero
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	and $40
-	rlca
-	rlca
-	add $19
-	ld hl, BATTLEANIMSTRUCT_FRAMESET_ID
-	add hl, bc
-	ld [hl], a
-	call BattleAnim_IncAnonJumptableIndex
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], $40
-.one
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	cp $30
-	jr nc, .sine_cosine
-	call DeinitBattleAnimation
-	ret
-
-.sine_cosine
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	and $3f
-	ld d, a
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	dec [hl]
-	call BattleAnim_Sine
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	call Functioncd557
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld a, [hl]
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld h, [hl]
-	ld l, a
-	add hl, de
-	ld e, l
-	ld d, h
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld [hl], d
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld [hl], e
-	ret
-
-BattleAnimFunction_0C: ; cd5e9 (33:55e9)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw .zero
-	dw .one
-	dw .two
-.zero
-	call BattleAnim_IncAnonJumptableIndex
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], $c
-.one
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	and a
-	jr z, .next
-	dec [hl]
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	call Functionce70a
-	ret
-
-.next
-	call BattleAnim_IncAnonJumptableIndex
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], $0
-	ld a, BATTLEANIMFRAMESET_22
-	call ReinitBattleAnimFrameset
-.two
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld a, [hl]
-	cp $98
-	jr nc, .okay
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld h, [hl]
-	ld l, a
-	ld de, $60
-	add hl, de
-	ld e, l
-	ld d, h
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], e
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld [hl], d
-.okay
-	ld hl, BATTLEANIMSTRUCT_YCOORD
-	add hl, bc
-	ld a, [hl]
-	cp $20
-	ret c
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	and $f0
-	ld e, a
-	ld d, $ff
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld a, [hl]
-	ld hl, BATTLEANIMSTRUCT_YCOORD
-	add hl, bc
-	ld h, [hl]
-	ld l, a
-	add hl, de
-	ld e, l
-	ld d, h
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld [hl], e
-	ld hl, BATTLEANIMSTRUCT_YCOORD
-	add hl, bc
-	ld [hl], d
-	ret
-
-BattleAnimFunction_0D: ; cd66a (33:566a)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw .zero
-	dw .one
-	dw .two
-	dw .three
-	dw .four
-.zero
-	call BattleAnim_IncAnonJumptableIndex
-	ld a, rSCY - $ff00
-	ld [hLCDCPointer], a
-	ld a, $58
-	ld [hLYOverrideStart], a
-	ld a, $5e
-	ld [hLYOverrideEnd], a
-	ret
-
-.one
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld e, [hl]
-	ld hl, BATTLEANIMSTRUCT_YCOORD
-	add hl, bc
-	ld a, [hl]
-	cp e
-	jr nc, .asm_cd69b
-	call BattleAnim_IncAnonJumptableIndex
-	xor a
-	ld [hLYOverrideStart], a
-	ret
-
-.asm_cd69b
-	dec a
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	ld d, $10
-	call BattleAnim_Sine
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_YCOORD
-	add hl, bc
-	add [hl]
-	sub $10
-	ret c
-	ld [hLYOverrideStart], a
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld a, [hl]
-	inc a
-	and $7
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	inc [hl]
-	inc [hl]
-.two
-	ret
-
-.three
-	ld hl, BATTLEANIMSTRUCT_YCOORD
-	add hl, bc
-	ld a, [hl]
-	cp $70
-	jr c, asm_cd6da
-	xor a
-	ld [hLCDCPointer], a
-	ld [hLYOverrideStart], a
-	ld [hLYOverrideEnd], a
-.four
-	call DeinitBattleAnimation
-	ret
-
-asm_cd6da: ; cd6da (33:56da)
-	inc a
-	inc a
-	ld [hl], a
-	sub $10
-	ret c
-	ld [hLYOverrideStart], a
-	ret
-
-BattleAnimFunction_0E: ; cd6e3 (33:56e3)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw Functioncd6ea
-	dw Functioncd6f7
-Functioncd6ea: ; cd6ea (33:56ea)
-	call BattleAnim_IncAnonJumptableIndex
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, BATTLEANIMFRAMESET_24
-	add [hl] ; offset
-	call ReinitBattleAnimFrameset
-Functioncd6f7: ; cd6f7 (33:56f7)
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld a, [hl]
-	cp $b8
-	jr c, .asm_cd704
-	call DeinitBattleAnimation
-	ret
-
-.asm_cd704
-	ld a, $2
-	call Functionce70a
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	dec [hl]
-	ld d, $8
-	call BattleAnim_Sine
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	ret
-
-BattleAnimFunction_0F: ; cd71a (33:571a)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw Functioncd725
-	dw Functioncd728
-	dw Functioncd763
-	dw Functioncd776
-Functioncd725: ; cd725 (33:5725)
-	call BattleAnim_IncAnonJumptableIndex
-Functioncd728: ; cd728 (33:5728)
-	ld hl, BATTLEANIMSTRUCT_YCOORD
-	add hl, bc
-	ld a, [hl]
-	cp $30
-	jr c, .asm_cd747
-	ld a, $2
-	call Functionce70a
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	dec [hl]
-	ld d, $8
-	call BattleAnim_Sine
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	ret
-
-.asm_cd747
-	call BattleAnim_IncAnonJumptableIndex
-	ld a, BATTLEANIMFRAMESET_28
-	call ReinitBattleAnimFrameset
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], $0
-	ld hl, BATTLEANIMSTRUCT_YCOORD
-	add hl, bc
-	ld [hl], $30
-	ld hl, BATTLEANIMSTRUCT_01
-	add hl, bc
-	ld a, [hl]
-	and $1
-	ld [hl], a
-Functioncd763: ; cd763 (33:5763)
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld a, [hl]
-	cp $18
-	jr nc, .asm_cd76e
-	inc [hl]
-	ret
-
-.asm_cd76e
-	call BattleAnim_IncAnonJumptableIndex
-	ld a, BATTLEANIMFRAMESET_29
-	call ReinitBattleAnimFrameset
-Functioncd776: ; cd776 (33:5776)
-	ret
-
-BattleAnimFunction_11: ; cd777 (33:5777)
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld a, [hl]
-	cp $38
-	jr c, .asm_cd784
-	call DeinitBattleAnimation
-	ret
-
-.asm_cd784
-	ld a, [hl]
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld l, [hl]
-	ld h, a
-	ld de, $80
-	add hl, de
-	ld e, l
-	ld d, h
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], e
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], d
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld a, [hl]
-	xor $10
-	ld [hl], a
-	ret
-
-BattleAnimFunction_14: ; cd7a4 (33:57a4)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw Functioncd7ab
-	dw Functioncd7d2
-Functioncd7ab: ; cd7ab (33:57ab)
-	call BattleAnim_IncAnonJumptableIndex
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	and $f0
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	and $f
-	sla a
-	sla a
-	sla a
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld [hl], $1
-Functioncd7d2: ; cd7d2 (33:57d2)
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld a, [hl]
-	and a
-	jr nz, .asm_cd7de
-	call DeinitBattleAnimation
-	ret
-
-.asm_cd7de
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	inc [hl]
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld d, [hl]
-	push af
-	push de
-	call BattleAnim_Sine
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	pop de
-	pop af
-	call BattleAnim_Cosine
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	xor $1
-	ld [hl], a
-	ret z
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	dec [hl]
-	ret
-
-BattleAnimFunction_15: ; cd80c (33:580c)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw Functioncd81f
-	dw Functioncd817
-	dw Functioncd81f
-	dw Functioncd820
-Functioncd817: ; cd817 (33:5817)
-	call BattleAnim_IncAnonJumptableIndex
-	ld a, BATTLEANIMFRAMESET_35
-	call ReinitBattleAnimFrameset
-Functioncd81f: ; cd81f (33:581f)
-	ret
-
-Functioncd820: ; cd820 (33:5820)
-	call DeinitBattleAnimation
-	ret
-
-BattleAnimFunction_16: ; cd824 (33:5824)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw Functioncd835
-	dw Functioncd860
-	dw Functioncd88f
-	dw Functioncd88f
-	dw Functioncd88f
-	dw Functioncd88f
-	dw Functioncd893
-Functioncd835: ; cd835 (33:5835)
-	call BattleAnim_IncAnonJumptableIndex
-	ld hl, BATTLEANIMSTRUCT_FRAMESET_ID
-	add hl, bc
-	ld a, [hl]
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	bit 7, [hl]
-	jr nz, .asm_cd852
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], $10
-	jr .asm_cd858
-
-.asm_cd852
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], $30
-.asm_cd858
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	and $7f
-	ld [hl], a
-Functioncd860: ; cd860 (33:5860)
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld d, [hl]
-	call BattleAnim_Sine
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld [hl], a
-	bit 7, a
-	jr nz, .load_no_inc
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld a, [hl]
-	inc a
-	jr .reinit
-
-.load_no_inc
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld a, [hl]
-.reinit
-	call ReinitBattleAnimFrameset
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	inc [hl]
-	ld a, [hl]
-	and $1f
-	ret nz
-Functioncd88f: ; cd88f (33:588f)
-	call BattleAnim_IncAnonJumptableIndex
-	ret
-
-Functioncd893: ; cd893 (33:5893)
-	ld hl, BATTLEANIMSTRUCT_ANON_JT_INDEX
-	add hl, bc
-	ld [hl], $1
-	ret
-
-BattleAnimFunction_17: ; cd89a (33:589a)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw Functioncd8ab
-	dw Functioncd8cc
-	dw Functioncd8f5
-	dw Functioncd8f5
-	dw Functioncd8f5
-	dw Functioncd8f5
-	dw Functioncd8f9
-Functioncd8ab: ; cd8ab (33:58ab)
-	call BattleAnim_IncAnonJumptableIndex
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	bit 7, [hl]
-	jr nz, .asm_cd8be
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], $10
-	jr .asm_cd8c4
-
-.asm_cd8be
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], $30
-.asm_cd8c4
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	and $7f
-	ld [hl], a
-Functioncd8cc: ; cd8cc (33:58cc)
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld d, [hl]
-	call BattleAnim_Sine
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	bit 7, a
-	jr nz, .asm_cd8e6
-	ld a, $3d
-	jr .asm_cd8e8
-
-.asm_cd8e6
-	ld a, $3c
-.asm_cd8e8
-	call ReinitBattleAnimFrameset
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	inc [hl]
-	inc [hl]
-	ld a, [hl]
-	and $1f
-	ret nz
-Functioncd8f5: ; cd8f5 (33:58f5)
-	call BattleAnim_IncAnonJumptableIndex
-	ret
-
-Functioncd8f9: ; cd8f9 (33:58f9)
-	ld hl, BATTLEANIMSTRUCT_ANON_JT_INDEX
-	add hl, bc
-	ld [hl], $1
-	ret
-
-BattleAnimFunction_18: ; cd900 (33:5900)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw Functioncd907
-	dw Functioncd913
-Functioncd907: ; cd907 (33:5907)
-	call BattleAnim_IncAnonJumptableIndex
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], $28
-	inc hl
-	ld [hl], $0
-Functioncd913: ; cd913 (33:5913)
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld d, [hl]
-	push af
-	push de
-	call BattleAnim_Sine
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	pop de
-	pop af
-	call BattleAnim_Cosine
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	and a
-	jr z, .asm_cd950
-	ld d, a
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld e, [hl]
-	ld hl, hPushOAM ; $ff80
-	add hl, de
-	ld e, l
-	ld d, h
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld [hl], e
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], d
-	ret
-
-.asm_cd950
-	call DeinitBattleAnimation
-	ret
-
-BattleAnimFunction_19: ; cd954 (33:5954)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw Functioncd961
-	dw Functioncd96a
-	dw Functioncd96e
-	dw Functioncd96a
-	dw Functioncd97b
-Functioncd961: ; cd961 (33:5961)
-	call BattleAnim_IncAnonJumptableIndex
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld [hl], $0
-Functioncd96a: ; cd96a (33:596a)
-	call Functioncd99a
-	ret
-
-Functioncd96e: ; cd96e (33:596e)
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld a, [hl]
-	cp $88
-	jr c, asm_cd988
-	call BattleAnim_IncAnonJumptableIndex
-	ret
-
-Functioncd97b: ; cd97b (33:597b)
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld a, [hl]
-	cp $b8
-	jr c, asm_cd988
-	call DeinitBattleAnimation
-	ret
-
-asm_cd988: ; cd988 (33:5988)
-	call Functioncd99a
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	inc [hl]
-	ld a, [hl]
-	and $1
-	ret nz
-	ld hl, BATTLEANIMSTRUCT_YCOORD
-	add hl, bc
-	dec [hl]
-	ret
-
-Functioncd99a: ; cd99a (33:599a)
-	call Functioncd9f4
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	push af
-	push de
-	call BattleAnim_Sine
-	sra a
-	sra a
-	sra a
-	sra a
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	add [hl]
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	pop de
-	pop af
-	call BattleAnim_Cosine
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	sub $8
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	and a
-	jr z, .asm_cd9d7
-	cp $c2
-	jr c, .asm_cd9e2
-.asm_cd9d7
-	dec a
-	ld [hl], a
-	and $7
-	ret nz
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	inc [hl]
-	ret
-
-.asm_cd9e2
-	xor a
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld [hli], a
-	ld [hl], a
-	ret
-
-Functioncd9f4: ; cd9f4 (33:59f4)
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld e, [hl]
-	ld d, 0
-	ld hl, Unknown_cda01
-	add hl, de
-	ld d, [hl]
-	ret
-
-; cda01 (33:5a01)
-Unknown_cda01: ; cda01
-	db 8, 6, 5, 4, 5, 6, 8, 12, 16
-; cda0a
-BattleAnimFunction_1C: ; cda0a (33:5a0a)
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld a, [hl]
-	cp $30
-	jr nc, .asm_cda17
-	call DeinitBattleAnimation
-	ret
-
-.asm_cda17
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	and $f
-	ld e, a
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld a, [hl]
-	sub e
-	ld [hl], a
-	srl e
-	ld hl, BATTLEANIMSTRUCT_YCOORD
-	add hl, bc
-.asm_cda2c
-	inc [hl]
-	dec e
-	jr nz, .asm_cda2c
-	ret
-
-BattleAnimFunction_1F: ; cda31 (33:5a31)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw Functioncda4c
-	dw Functioncda3a
-	dw Functioncda4c
-Functioncda3a: ; cda3a (33:5a3a)
-	ld hl, BATTLEANIMSTRUCT_FRAMESET_ID
-	add hl, bc
-	ld a, [hl]
-	inc a
-	call ReinitBattleAnimFrameset
-	call BattleAnim_IncAnonJumptableIndex
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], $8
-Functioncda4c: ; cda4c (33:5a4c)
-	ret
-
-BattleAnimFunction_LeechSeed: ; cda4d (33:5a4d)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw .zero
-	dw .one
-	dw .two
-	dw .three
-.zero: ; cda58 (33:5a58)
-	call BattleAnim_IncAnonJumptableIndex
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld [hl], $40
-	ret
-
-.one: ; cda62 (33:5a62)
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld a, [hl]
-	cp $20
-	jr c, .sprout
-	call Functioncda8d
-	ret
-
-.sprout
-	ld [hl], $40
-	ld a, BATTLEANIMFRAMESET_57
-	call ReinitBattleAnimFrameset
-	call BattleAnim_IncAnonJumptableIndex
-	ret
-
-.two: ; cda7a (33:5a7a)
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld a, [hl]
-	and a
-	jr z, .flutter
-	dec [hl]
-	ret
-
-.flutter
-	call BattleAnim_IncAnonJumptableIndex
-	ld a, BATTLEANIMFRAMESET_58
-	call ReinitBattleAnimFrameset
-.three: ; cda8c (33:5a8c)
-	ret
-
-Functioncda8d: ; cda8d (33:5a8d)
-	dec [hl]
-	ld d, $20
-	call BattleAnim_Sine
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_02
-	add hl, bc
-	ld a, [hl]
-	add $2
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld e, [hl]
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld d, [hl]
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld h, [hl]
-	ld a, h
-	and $f
-	swap a
-	ld l, a
-	ld a, h
-	and $f0
-	swap a
-	ld h, a
-	add hl, de
-	ld e, l
-	ld d, h
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], e
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld [hl], d
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld a, [hl]
-	and $1
-	ret nz
-	ld hl, BATTLEANIMSTRUCT_YCOORD
-	add hl, bc
-	dec [hl]
-	ret
-
-BattleAnimFunction_3F: ; cdad6 (33:5ad6)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw Functioncdadf
-	dw Functioncdae9
-	dw Functioncdaf9
-Functioncdadf: ; cdadf (33:5adf)
-	call BattleAnim_IncAnonJumptableIndex
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld [hl], $40
-	ret
-
-Functioncdae9: ; cdae9 (33:5ae9)
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld a, [hl]
-	cp $20
-	jr c, .asm_cdaf6
-	call Functioncda8d
-	ret
-
-.asm_cdaf6
-	call BattleAnim_IncAnonJumptableIndex
-Functioncdaf9: ; cdaf9 (33:5af9)
-	ret
-
-BattleAnimFunction_1A: ; cdafa (33:5afa)
-	call BattleAnimFunction_03
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	add $f
-	ld [hl], a
-	ret
-
-BattleAnimFunction_1B: ; cdb06 (33:5b06)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw Functioncdb13
-	dw Functioncdb14
-	dw Functioncdb28
-	dw Functioncdb50
-	dw Functioncdb65
-Functioncdb13: ; cdb13 (33:5b13)
-	ret
-
-Functioncdb14: ; cdb14 (33:5b14)
-	ld hl, BATTLEANIMSTRUCT_YCOORD
-	add hl, bc
-	ld a, [hl]
-	cp $30
-	jr c, .asm_cdb24
-	ld hl, BATTLEANIMSTRUCT_ANON_JT_INDEX
-	add hl, bc
-	ld [hl], $0
-	ret
-
-.asm_cdb24
-	add $4
-	ld [hl], a
-	ret
-
-Functioncdb28: ; cdb28 (33:5b28)
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld a, [hl]
-	cp $98
-	ret nc
-	inc [hl]
-	inc [hl]
-	ld hl, BATTLEANIMSTRUCT_01
-	add hl, bc
-	set 0, [hl]
-	ld hl, BATTLEANIMSTRUCT_02
-	add hl, bc
-	ld [hl], $90
-	ld hl, BATTLEANIMSTRUCT_FRAME
-	add hl, bc
-	ld [hl], $0
-	ld hl, BATTLEANIMSTRUCT_DURATION
-	add hl, bc
-	ld [hl], $2
-	ld hl, BATTLEANIMSTRUCT_YCOORD
-	add hl, bc
-	dec [hl]
-	ret
-
-Functioncdb50: ; cdb50 (33:5b50)
-	call BattleAnim_IncAnonJumptableIndex
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], $2c
-	ld hl, BATTLEANIMSTRUCT_FRAME
-	add hl, bc
-	ld [hl], $0
-	ld hl, BATTLEANIMSTRUCT_DURATION
-	add hl, bc
-	ld [hl], $80
-Functioncdb65: ; cdb65 (33:5b65)
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld a, [hl]
-	cp $98
-	ret nc
-	inc [hl]
-	inc [hl]
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	inc [hl]
-	ld d, $8
-	call BattleAnim_Sine
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	ret
-
-BattleAnimFunction_1D: ; cdb80 (33:5b80)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw Functioncdb9f
-	dw Functioncdbb3
-	dw Functioncdbcf
-	dw Functioncdbeb
-	dw Functioncdc74
-	dw Functioncdc1a
-	dw Functioncdbc1
-	dw Functioncdc1e
-	dw Functioncdc27
-	dw Functioncdc39
-	dw Functioncdc74
-	dw Functioncdc48
-	dw Functioncdc57
-	dw Functioncdc74
-Functioncdb9f: ; cdb9f (33:5b9f)
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], $28
-	inc hl
-	ld [hl], $10
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	ld hl, BATTLEANIMSTRUCT_ANON_JT_INDEX
-	add hl, bc
-	ld [hl], a
-	ret
-
-Functioncdbb3: ; cdbb3 (33:5bb3)
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld a, [hl]
-	cp $40
-	jr nc, .asm_cdbbd
-	inc [hl]
-.asm_cdbbd
-	call Functioncdc75
-	ret
-
-Functioncdbc1: ; cdbc1 (33:5bc1)
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld a, [hl]
-	cp $4b
-	jr nc, .asm_cdbcb
-	inc [hl]
-.asm_cdbcb
-	call Functioncdc75
-	ret
-
-Functioncdbcf: ; cdbcf (33:5bcf)
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld a, [hl]
-	cp $88
-	jr nc, .asm_cdbe6
-	and $f
-	jr nz, asm_cdbfa
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld [hl], $10
-	call BattleAnim_IncAnonJumptableIndex
-	ret
-
-.asm_cdbe6
-	call BattleAnim_IncAnonJumptableIndex
-	inc [hl]
-	ret
-
-Functioncdbeb: ; cdbeb (33:5beb)
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld a, [hl]
-	and a
-	jr z, .asm_cdbf5
-	dec [hl]
-	ret
-
-.asm_cdbf5
-	ld hl, BATTLEANIMSTRUCT_ANON_JT_INDEX
-	add hl, bc
-	dec [hl]
-asm_cdbfa: ; cdbfa (33:5bfa)
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	inc [hl]
-	ld hl, BATTLEANIMSTRUCT_YCOORD
-	add hl, bc
-	ld d, [hl]
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld e, [hl]
-	ld hl, hPushOAM ; $ff80
-	add hl, de
-	ld e, l
-	ld d, h
-	ld hl, BATTLEANIMSTRUCT_YCOORD
-	add hl, bc
-	ld [hl], d
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], e
-	ret
-
-Functioncdc1a: ; cdc1a (33:5c1a)
-	call DeinitBattleAnimation
-	ret
-
-Functioncdc1e: ; cdc1e (33:5c1e)
-	ld a, BATTLEANIMFRAMESET_4E
-	call ReinitBattleAnimFrameset
-	call BattleAnim_IncAnonJumptableIndex
-	ret
-
-Functioncdc27: ; cdc27 (33:5c27)
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	inc [hl]
-	inc [hl]
-	ld d, $2
-	call BattleAnim_Sine
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld [hl], a
-	ret
-
-Functioncdc39: ; cdc39 (33:5c39)
-	ld a, BATTLEANIMFRAMESET_50
-	call ReinitBattleAnimFrameset
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], $4
-	call BattleAnim_IncAnonJumptableIndex
-	ret
-
-Functioncdc48: ; cdc48 (33:5c48)
-	ld a, BATTLEANIMFRAMESET_4F
-	call ReinitBattleAnimFrameset
-	call BattleAnim_IncAnonJumptableIndex
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], $40
-	ret
-
-Functioncdc57: ; cdc57 (33:5c57)
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	ld d, $20
-	call BattleAnim_Sine
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	cp $30
-	jr c, .asm_cdc71
-	dec [hl]
-	ret
-
-.asm_cdc71
-	call BattleAnim_IncAnonJumptableIndex
-Functioncdc74: ; cdc74 (33:5c74)
-	ret
-
-Functioncdc75: ; cdc75 (33:5c75)
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hli]
-	ld d, [hl]
-	call BattleAnim_Sine
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	inc [hl]
-	ld a, [hl]
-	and $3f
-	ret nz
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], $20
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld a, [hl]
-	sub $8
-	ld [hl], a
-	ret nz
-	xor a
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hli], a
-	ld [hl], a
-	call BattleAnim_IncAnonJumptableIndex
-	ret
-
-BattleAnimFunction_1E: ; cdca6 (33:5ca6)
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld a, [hl]
-	and a
-	jr z, .asm_cdcb6
-	cp $d8
-	jr nc, .asm_cdcb6
-	call DeinitBattleAnimation
-	ret
-
-.asm_cdcb6
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld d, [hl]
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld a, [hl]
-	sub d
-	ld [hl], a
-	ret
-
-BattleAnimFunction_21: ; cdcc3 (33:5cc3)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw Functioncdcca
-	dw Functioncdced
-Functioncdcca: ; cdcca (33:5cca)
-	ld a, [hBattleTurn]
-	and a
-	jr z, .asm_cdcd9
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	xor $ff
-	add $3
-	ld [hl], a
-.asm_cdcd9
-	call BattleAnim_IncAnonJumptableIndex
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], $8
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, BATTLEANIMFRAMESET_59
-	add [hl]
-	call ReinitBattleAnimFrameset
-	ret
-
-Functioncdced: ; cdced (33:5ced)
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	and a
-	jr z, .asm_cdcfa
-	dec [hl]
-	call Functioncdcfe
-	ret
-
-.asm_cdcfa
-	call DeinitBattleAnimation
-	ret
-
-Functioncdcfe: ; cdcfe (33:5cfe)
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld a, [hl]
-	inc [hl]
-	inc [hl]
-	ld d, $10
-	call BattleAnim_Sine
-	ld d, a
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	and a
-	jr z, .asm_cdd20
-	dec a
-	ret z
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], d
-	ret
-
-.asm_cdd20
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld a, d
-	xor $ff
-	inc a
-	ld [hl], a
-	ret
-
-BattleAnimFunction_22: ; cdd2a (33:5d2a)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw Functioncdd31
-	dw Functioncdd4f
-Functioncdd31: ; cdd31 (33:5d31)
-	call BattleAnim_IncAnonJumptableIndex
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	and $3f
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	and $80
-	rlca
-	ld [hl], a
-	add BATTLEANIMFRAMESET_5D
-	call ReinitBattleAnimFrameset
-	ret
-
-Functioncdd4f: ; cdd4f (33:5d4f)
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	swap a
-	ld d, a
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld a, [hl]
-	inc [hl]
-	push af
-	push de
-	call BattleAnim_Sine
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	pop de
-	pop af
-	call BattleAnim_Cosine
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld a, [hl]
-	cp $80
-	ret nc
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld a, [hl]
-	and $3
-	jr nz, .asm_cdd87
-	ld hl, BATTLEANIMSTRUCT_YCOORD
-	add hl, bc
-	dec [hl]
-.asm_cdd87
-	and $1
-	ret nz
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	inc [hl]
-	ret
-
-BattleAnimFunction_23: ; cdd90 (33:5d90)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw Functioncdd97
-	dw Functioncddbc
-Functioncdd97: ; cdd97 (33:5d97)
-	call BattleAnim_IncAnonJumptableIndex
-	ld hl, BATTLEANIMSTRUCT_FRAMESET_ID
-	add hl, bc
-	ld a, [hl]
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	and $80
-	rlca
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	add [hl]
-	call ReinitBattleAnimFrameset
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	and $7f
-	ld [hl], a
-Functioncddbc: ; cddbc (33:5dbc)
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	ld d, $10
-	push af
-	push de
-	call BattleAnim_Sine
-	sra a
-	sra a
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	pop de
-	pop af
-	call BattleAnim_Cosine
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	inc [hl]
-	and $3f
-	jr z, .asm_cddf0
-	and $1f
-	ret nz
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	inc a
-	jr .asm_cddf5
-
-.asm_cddf0
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-.asm_cddf5
-	call ReinitBattleAnimFrameset
-	ret
-
-BattleAnimFunction_24: ; cddf9 (33:5df9)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw Functioncde02
-	dw Functioncde20
-	dw Functioncde21
-Functioncde02: ; cde02 (33:5e02)
-	call BattleAnim_IncAnonJumptableIndex
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	add BATTLEANIMFRAMESET_63
-	call ReinitBattleAnimFrameset
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld e, [hl]
-	ld d, 0
-	ld hl, Unknown_cde25
-	add hl, de
-	ld a, [hl]
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-Functioncde20: ; cde20 (33:5e20)
-	ret
-
-Functioncde21: ; cde21 (33:5e21)
-	call DeinitBattleAnimation
-	ret
-
-; cde25 (33:5e25)
-Unknown_cde25: ; cde25
-	db $ec, $f8, $00
-; cde28
-BattleAnimFunction_25: ; cde28 (33:5e28)
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	inc [hl]
-	inc [hl]
-	ld d, $4
-	call BattleAnim_Sine
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld d, [hl]
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld e, [hl]
-	ld hl, $ffa0
-	add hl, de
-	ld e, l
-	ld d, h
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], d
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld [hl], e
-	ret
-
-BattleAnimFunction_26: ; cde54 (33:5e54)
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	dec [hl]
-	dec [hl]
-	ld d, $10
-	call BattleAnim_Sine
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	inc [hl]
-	ret
-
-BattleAnimFunction_27: ; cde6b (33:5e6b)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw Functioncde72
-	dw Functioncde88
-Functioncde72: ; cde72 (33:5e72)
-	call BattleAnim_IncAnonJumptableIndex
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	and a
-	jr nz, .asm_cde83
-	ld hl, BATTLEANIMSTRUCT_01
-	add hl, bc
-	set 6, [hl]
-.asm_cde83
-	add BATTLEANIMFRAMESET_6A
-	call ReinitBattleAnimFrameset
-Functioncde88: ; cde88 (33:5e88)
-	ret
-
-BattleAnimFunction_28: ; cde89 (33:5e89)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw Functioncde90
-	dw Functioncdebf
-Functioncde90: ; cde90 (33:5e90)
-	call BattleAnim_IncAnonJumptableIndex
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], $0
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld e, [hl]
-	ld a, e
-	and $70
-	swap a
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld a, e
-	and $80
-	jr nz, .asm_cdeb2
-	ld a, e
-	and $f
-	ld [hl], a
-	ret
-
-.asm_cdeb2
-	ld a, e
-	and $f
-	xor $ff
-	inc a
-	ld [hl], a
-	ld a, BATTLEANIMFRAMESET_6E
-	call ReinitBattleAnimFrameset
-	ret
-
-Functioncdebf: ; cdebf (33:5ebf)
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	and a
-	jr z, .asm_cdec9
-	dec [hl]
-	ret
-
-.asm_cdec9
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld a, [hl]
-	xor $ff
-	inc a
-	ld [hl], a
-	ret
-
-BattleAnimFunction_SpiralDescent: ; cdedd (33:5edd)
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	ld d, $18
-	push af
-	push de
-	call BattleAnim_Sine
-	sra a
-	sra a
-	sra a
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	add [hl]
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	pop de
-	pop af
-	call BattleAnim_Cosine
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	inc [hl]
-	ld a, [hl]
-	and $7
-	ret nz
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld a, [hl]
-	cp $28
-	jr nc, .delete
-	inc [hl]
-	ret
-
-.delete
-	call DeinitBattleAnimation
-	ret
-
-BattleAnimFunction_2D: ; cdf1b (33:5f1b)
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	ld d, $18
-	push af
-	push de
-	call BattleAnim_Sine
-	sra a
-	sra a
-	sra a
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	add [hl]
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	pop de
-	pop af
-	call BattleAnim_Cosine
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	inc [hl]
-	ld a, [hl]
-	and $3
-	ret nz
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld a, [hl]
-	cp $28
-	jr nc, .asm_cdf55
-	inc [hl]
-	ret
-
-.asm_cdf55
-	call DeinitBattleAnimation
-	ret
-
-BattleAnimFunction_PoisonGas: ; cdf59 (33:5f59)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw Functioncdf60
-	dw BattleAnimFunction_SpiralDescent
-Functioncdf60: ; cdf60 (33:5f60)
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld a, [hl]
-	cp $84
-	jr nc, .next
-	inc [hl]
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	inc [hl]
-	ld d, $18
-	call BattleAnim_Cosine
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld a, [hl]
-	and $1
-	ret nz
-	ld hl, BATTLEANIMSTRUCT_YCOORD
-	add hl, bc
-	dec [hl]
-	ret
-
-.next
-	call BattleAnim_IncAnonJumptableIndex
-	ret
-
-BattleAnimFunction_34: ; cdf8c (33:5f8c)
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	ld d, $18
-	push af
-	push de
-	call BattleAnim_Sine
-	sra a
-	sra a
-	sra a
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	add [hl]
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	pop de
-	pop af
-	call BattleAnim_Cosine
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	inc [hl]
-	inc [hl]
-	ld a, [hl]
-	and $7
-	ret nz
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld a, [hl]
-	cp $e8
-	jr z, .asm_cdfc7
-	dec [hl]
-	ret
-
-.asm_cdfc7
-	call DeinitBattleAnimation
-	ret
-
-BattleAnimFunction_3C: ; cdfcb (33:5fcb)
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	ld d, $18
-	push af
-	push de
-	call BattleAnim_Sine
-	sra a
-	sra a
-	sra a
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	add [hl]
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	pop de
-	pop af
-	call BattleAnim_Cosine
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	inc [hl]
-	inc [hl]
-	ld a, [hl]
-	and $3
-	ret nz
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld a, [hl]
-	cp $d0
-	jr z, .asm_ce007
-	dec [hl]
-	dec [hl]
-	ret
-
-.asm_ce007
-	call DeinitBattleAnimation
-	ret
-
-BattleAnimFunction_35: ; ce00b (33:600b)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw Functionce014
-	dw Functionce023
-	dw Functionce05f
-Functionce014: ; ce014 (33:6014)
-	call BattleAnim_IncAnonJumptableIndex
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], $34
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld [hl], $10
-Functionce023: ; ce023 (33:6023)
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld a, [hl]
-	cp $6c
-	jr c, .asm_ce02d
-	ret
-
-.asm_ce02d
-	ld a, $2
-	call Functionce70a
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld d, [hl]
-	call BattleAnim_Sine
-	bit 7, a
-	jr nz, .asm_ce046
-	xor $ff
-	inc a
-.asm_ce046
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	sub $4
-	ld [hl], a
-	and $1f
-	cp $20
-	ret nz
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	srl [hl]
-	ret
-
-Functionce05f: ; ce05f (33:605f)
-	call DeinitBattleAnimation
-	ret
-
-BattleAnimFunction_Horn: ; ce063 (33:6063)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw .zero
-	dw .one
-	dw .two
-	dw Functionce09e
-.zero: ; ce06e (33:606e)
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	ld hl, BATTLEANIMSTRUCT_ANON_JT_INDEX
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_YCOORD
-	add hl, bc
-	ld a, [hl]
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], a
-	ret
-
-.one: ; ce083 (33:6083)
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld a, [hl]
-	cp $58
-	ret nc
-	ld a, $2
-	call Functionce70a
-	ret
-
-.two: ; ce091 (33:6091)
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld a, [hl]
-	cp $20
-	jr c, Functionce09e
-	call DeinitBattleAnimation
-	ret
-
-Functionce09e: ; ce09e (33:609e)
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld a, [hl]
-	ld d, $8
-	call BattleAnim_Sine
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld [hl], a
-	sra a
-	xor $ff
-	inc a
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	add [hl]
-	ld hl, BATTLEANIMSTRUCT_YCOORD
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld a, [hl]
-	add $8
-	ld [hl], a
-	ret
-
-BattleAnimFunction_2C: ; ce0c5 (33:60c5)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw Functionce0ce
-	dw Functionce0f8
-	dw Functionce0dd
-Functionce0ce: ; ce0ce (33:60ce)
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	and $f0
-	swap a
-	ld hl, BATTLEANIMSTRUCT_ANON_JT_INDEX
-	add hl, bc
-	ld [hl], a
-	ret
-
-Functionce0dd: ; ce0dd (33:60dd)
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	ld d, $10
-	call BattleAnim_Sine
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	bit 7, a
-	jr z, .asm_ce0f0
-	ld [hl], a
-.asm_ce0f0
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	sub $4
-	ld [hl], a
-Functionce0f8: ; ce0f8 (33:60f8)
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld a, [hl]
-	cp $84
-	jr c, .asm_ce105
-	call DeinitBattleAnimation
-	ret
-
-.asm_ce105
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	call Functionce70a
-	ret
-
-BattleAnimFunction_2E: ; ce10e (33:610e)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw Functionce115
-	dw Functionce12a
-Functionce115: ; ce115 (33:6115)
-	call BattleAnim_IncAnonJumptableIndex
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], $28
-	ld hl, BATTLEANIMSTRUCT_YCOORD
-	add hl, bc
-	ld a, [hl]
-	sub $28
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld [hl], a
-Functionce12a: ; ce12a (33:612a)
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hli]
-	ld d, [hl]
-	call BattleAnim_Sine
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	and [hl]
-	jr nz, .asm_ce149
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	dec [hl]
-.asm_ce149
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	inc [hl]
-	ld a, [hl]
-	and $3f
-	ret nz
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], $20
-	inc hl
-	srl [hl]
-	ret
-
-BattleAnimFunction_2F: ; ce15c (33:615c)
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld d, [hl]
-	push af
-	push de
-	call BattleAnim_Sine
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	pop de
-	pop af
-	call BattleAnim_Cosine
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	inc [hl]
-	ld a, [hl]
-	and $1
-	jr nz, .asm_ce189
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	dec [hl]
-.asm_ce189
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	and $3
-	jr nz, .asm_ce197
-	ld hl, BATTLEANIMSTRUCT_YCOORD
-	add hl, bc
-	inc [hl]
-.asm_ce197
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld a, [hl]
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	cp $5a
-	jr nc, .asm_ce1aa
-	ld a, [hl]
-	and a
-	jr z, .asm_ce1ac
-	dec [hl]
-	ret
-
-.asm_ce1aa
-	inc [hl]
-	ret
-
-.asm_ce1ac
-	call DeinitBattleAnimation
-	ret
-
-BattleAnimFunction_42: ; ce1b0 (33:61b0)
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	inc [hl]
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld d, [hl]
-	push af
-	push de
-	call BattleAnim_Sine
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	pop de
-	pop af
-	call BattleAnim_Cosine
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld a, [hl]
-	inc [hl]
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	cp $40
-	jr nc, .asm_ce1df
-	inc [hl]
-	ret
-
-.asm_ce1df
-	ld a, [hl]
-	dec [hl]
-	and a
-	ret nz
-	call DeinitBattleAnimation
-	ret
-
-BattleAnimFunction_30: ; ce1e7 (33:61e7)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw Functionce1ee
-	dw Functionce1fb
-Functionce1ee: ; ce1ee (33:61ee)
-	call BattleAnim_IncAnonJumptableIndex
-	ld hl, BATTLEANIMSTRUCT_YCOORD
-	add hl, bc
-	ld a, [hl]
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld [hl], a
-Functionce1fb: ; ce1fb (33:61fb)
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	ld d, $30
-	call BattleAnim_Sine
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	add [hl]
-	ld hl, BATTLEANIMSTRUCT_YCOORD
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	add $8
-	ld d, $30
-	call BattleAnim_Cosine
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	inc [hl]
-	ret
-
-BattleAnimFunction_31: ; ce226 (33:6226)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw Functionce22d
-	dw Functionce254
-Functionce22d: ; ce22d (33:622d)
-	call BattleAnim_IncAnonJumptableIndex
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	ld d, $10
-	call BattleAnim_Sine
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	ld d, $10
-	call BattleAnim_Cosine
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld [hl], $f
-Functionce254: ; ce254 (33:6254)
-	ret
-
-BattleAnimFunction_32: ; ce255 (33:6255)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw Functionce260
-	dw Functionce274
-	dw Functionce278
-	dw Functionce289
-Functionce260: ; ce260 (33:6260)
-	call BattleAnim_IncAnonJumptableIndex
-	ld a, [hBattleTurn]
-	and a
-	jr nz, .asm_ce26c
-	ld a, $f0
-	jr .asm_ce26e
-
-.asm_ce26c
-	ld a, $cc
-.asm_ce26e
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], a
-	ret
-
-Functionce274: ; ce274 (33:6274)
-	call Functionce29f
-	ret
-
-Functionce278: ; ce278 (33:6278)
-	call Functionce29f
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld a, [hl]
-	cp $84
-	ret nc
-	ld a, $4
-	call Functionce70a
-	ret
-
-Functionce289: ; ce289 (33:6289)
-	call Functionce29f
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld a, [hl]
-	cp $d0
-	jr nc, .asm_ce29b
-	ld a, $4
-	call Functionce70a
-	ret
-
-.asm_ce29b
-	call DeinitBattleAnimation
-	ret
-
-Functionce29f: ; ce29f (33:629f)
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld a, [hl]
-	and $7
-	inc [hl]
-	srl a
-	ld e, a
-	ld d, $0
-	ld a, [hSGB]
-	and a
-	jr nz, .asm_ce2b6
-	ld hl, Unknown_ce2c4
-	jr .asm_ce2b9
-
-.asm_ce2b6
-	ld hl, Unknown_ce2c8
-.asm_ce2b9
-	add hl, de
-	ld a, [hl]
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	and [hl]
-	ld [wOBP0], a
-	ret
-
-; ce2c4 (33:62c4)
-Unknown_ce2c4: ; ce2c4
-	db $ff, $aa, $55, $aa
-Unknown_ce2c8: ; ce2c8
-	db $ff, $ff, $00, $00
-; ce2cc
-BattleAnimFunction_33: ; ce2cc (33:62cc)
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	ld d, $18
-	call BattleAnim_Sine
-	sra a
-	sra a
-	sra a
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	add [hl]
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	inc [hl]
-	ld d, $18
-	call BattleAnim_Cosine
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	dec [hl]
-	dec [hl]
-	ret
-
-BattleAnimFunction_36: ; ce2fd (33:62fd)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw Functionce306
-	dw Functionce330
-	dw Functionce34c
-Functionce306: ; ce306 (33:6306)
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld a, [hl]
-	cp $e0
-	jr nz, .asm_ce319
-	call BattleAnim_IncAnonJumptableIndex
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], $2
-	ret
-
-.asm_ce319
-	ld d, a
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld e, [hl]
-	ld hl, hPushOAM ; $ff80
-	add hl, de
-	ld e, l
-	ld d, h
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], d
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], e
-	ret
-
-Functionce330: ; ce330 (33:6330)
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld a, [hl]
-	and a
-	jr z, .asm_ce33a
-	dec [hl]
-	ret
-
-.asm_ce33a
-	ld [hl], $4
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	xor $ff
-	inc a
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	add [hl]
-	ld [hl], a
-	ret
-
-Functionce34c: ; ce34c (33:634c)
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld a, [hl]
-	cp $84
-	jr nc, .asm_ce35b
-	ld a, $4
-	call Functionce70a
-	ret
-
-.asm_ce35b
-	call DeinitBattleAnimation
-	ret
-
-BattleAnimFunction_37: ; ce35f (33:635f)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw Functionce366
-	dw Functionce375
-Functionce366: ; ce366 (33:6366)
-	call BattleAnim_IncAnonJumptableIndex
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	and $7f
-	add BATTLEANIMFRAMESET_81
-	call ReinitBattleAnimFrameset
-Functionce375: ; ce375 (33:6375)
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	bit 7, [hl]
-	jr nz, .asm_ce383
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	inc [hl]
-	ret
-
-.asm_ce383
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	dec [hl]
-	ret
-
-BattleAnimFunction_38: ; ce389 (33:6389)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw Functionce392
-	dw Functionce39c
-	dw Functionce3ae
-Functionce392: ; ce392 (33:6392)
-	call BattleAnim_IncAnonJumptableIndex
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], $c
-	ret
-
-Functionce39c: ; ce39c (33:639c)
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	and a
-	jr z, .asm_ce3a6
-	dec [hl]
-	ret
-
-.asm_ce3a6
-	call BattleAnim_IncAnonJumptableIndex
-	ld a, BATTLEANIMFRAMESET_20
-	call ReinitBattleAnimFrameset
-Functionce3ae: ; ce3ae (33:63ae)
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	dec [hl]
-	ret
-
-BattleAnimFunction_39: ; ce3b4 (33:63b4)
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	inc [hl]
-	inc [hl]
-	push af
-	ld d, $2
-	call BattleAnim_Sine
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	pop af
-	ld d, $8
-	call BattleAnim_Cosine
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld [hl], a
-	ret
-
-BattleAnimFunction_3A: ; ce3d2 (33:63d2)
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld a, [hl]
-	cp $20
-	jr c, .asm_ce3df
-	call DeinitBattleAnimation
-	ret
-
-.asm_ce3df
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	ld d, $8
-	call BattleAnim_Cosine
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	add $2
-	ld [hl], a
-	and $7
-	ret nz
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	inc [hl]
-	ret
-
-BattleAnimFunction_3B: ; ce3ff (33:63ff)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw Functionce406
-	dw Functionce412
-Functionce406: ; ce406 (33:6406)
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	add [hl]
-	ld [hl], a
-	ret
-
-Functionce412: ; ce412 (33:6412)
-	call DeinitBattleAnimation
-	ret
-
-BattleAnimFunction_3D: ; ce416 (33:6416)
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	ld d, $18
-	push af
-	push de
-	call BattleAnim_Sine
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	pop de
-	pop af
-	call BattleAnim_Cosine
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	sra a
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	inc [hl]
-	ret
-
-BattleAnimFunction_3E: ; ce43a (33:643a)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw Functionce443
-	dw Functionce465
-	dw Functionce490
-Functionce443: ; ce443 (33:6443)
-	call BattleAnim_IncAnonJumptableIndex
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], $28
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	and $f
-	ld hl, BATTLEANIMSTRUCT_FRAMESET_ID
-	add hl, bc
-	add [hl]
-	call ReinitBattleAnimFrameset
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	and $f0
-	or $8
-	ld [hl], a
-Functionce465: ; ce465 (33:6465)
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	and a
-	jr z, .asm_ce48b
-	dec [hl]
-	add $8
-	ld d, a
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	push af
-	push de
-	call BattleAnim_Sine
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	pop de
-	pop af
-	call BattleAnim_Cosine
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld [hl], a
-	ret
-
-.asm_ce48b
-	ld [hl], $10
-	call BattleAnim_IncAnonJumptableIndex
-Functionce490: ; ce490 (33:6490)
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	dec [hl]
-	and a
-	ret nz
-	call DeinitBattleAnimation
-	ret
-
-BattleAnimFunction_40: ; ce49c (33:649c)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw Functionce4a3
-	dw Functionce4b0
-Functionce4a3: ; ce4a3 (33:64a3)
-	call BattleAnim_IncAnonJumptableIndex
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, BATTLEANIMFRAMESET_24
-	add [hl]
-	call ReinitBattleAnimFrameset
-Functionce4b0: ; ce4b0 (33:64b0)
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld a, [hl]
-	cp $38
-	jr nc, .asm_ce4d8
-	inc [hl]
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	inc [hl]
-	ld d, $18
-	call BattleAnim_Cosine
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_YCOORD
-	add hl, bc
-	ld a, [hl]
-	and $1
-	ret nz
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	dec [hl]
-	ret
-
-.asm_ce4d8
-	call DeinitBattleAnimation
-	ret
-
-BattleAnimFunction_41: ; ce4dc (33:64dc)
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	and a
-	ret z
-	ld d, a
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	inc [hl]
-	call BattleAnim_Sine
-	bit 7, a
-	jr nz, .asm_ce4f4
-	xor $ff
-	inc a
-.asm_ce4f4
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	and $1f
-	ret nz
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	srl [hl]
-	ret
-
-BattleAnimFunction_43: ; ce508 (33:6508)
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	cp $10
-	jr nc, .asm_ce52e
-	inc [hl]
-	inc [hl]
-	ld d, a
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	push af
-	push de
-	call BattleAnim_Sine
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	pop de
-	pop af
-	call BattleAnim_Cosine
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld [hl], a
-	ret
-
-.asm_ce52e
-	call DeinitBattleAnimation
-	ret
-
-BattleAnimFunction_44: ; ce532 (33:6532)
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld e, [hl]
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld d, [hl]
-	ld a, e
-	and $c0
-	rlca
-	rlca
-	add [hl]
-	ld [hl], a
-	ld a, e
-	and $3f
-	push af
-	push de
-	call BattleAnim_Sine
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	pop de
-	pop af
-	call BattleAnim_Cosine
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld [hl], a
-	ret
-
-BattleAnimFunction_45: ; ce55b (33:655b)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw Functionce564
-	dw Functionce56e
-	dw Functionce577
-Functionce564: ; ce564 (33:6564)
-	ld d, $18
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	inc [hl]
-	jr asm_ce58f
-
-Functionce56e: ; ce56e (33:656e)
-	call BattleAnim_IncAnonJumptableIndex
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], $18
-Functionce577: ; ce577 (33:6577)
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	cp $80
-	jr nc, .asm_ce58b
-	ld d, a
-	add $8
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	jr asm_ce58f
-
-.asm_ce58b
-	call DeinitBattleAnimation
-	ret
-
-asm_ce58f: ; ce58f (33:658f)
-	call Functionce6f1
-	ret
-
-BattleAnimFunction_46: ; ce593 (33:6593)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw Functionce5b3
-	dw Functionce59a
-Functionce59a: ; ce59a (33:659a)
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld a, [hl]
-	cp $30
-	jr c, .asm_ce5b0
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	dec [hl]
-	dec [hl]
-	ld hl, BATTLEANIMSTRUCT_YCOORD
-	add hl, bc
-	inc [hl]
-	inc [hl]
-	ret
-
-.asm_ce5b0
-	call DeinitBattleAnimation
-Functionce5b3: ; ce5b3 (33:65b3)
-	ret
-
-BattleAnimFunction_47: ; ce5b4 (33:65b4)
-	ld d, $50
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	inc [hl]
-	inc [hl]
-	push af
-	push de
-	call BattleAnim_Sine
-	sra a
-	sra a
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	add [hl]
-	inc [hl]
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	pop de
-	pop af
-	call BattleAnim_Cosine
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld [hl], a
-	ret
-
-BattleAnimFunction_48: ; ce5dc (33:65dc)
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld a, [hl]
-	cp $d0
-	jr z, .disappear
-	dec [hl]
-	dec [hl]
-	dec [hl]
-	dec [hl]
-	ret
-
-.disappear
-	call DeinitBattleAnimation
-	ret
-
-BattleAnimFunction_49: ; ce5ee (33:65ee)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw Functionce5f9
-	dw Functionce60a
-	dw Functionce622
-	dw Functionce618
-Functionce5f9: ; ce5f9 (33:65f9)
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	and a
-	jr nz, asm_ce61c
-	call BattleAnim_IncAnonJumptableIndex
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], $ec
-Functionce60a: ; ce60a (33:660a)
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld a, [hl]
-	cp $4
-	jr z, Functionce618
-	inc [hl]
-	inc [hl]
-	inc [hl]
-	inc [hl]
-	ret
-
-Functionce618: ; ce618 (33:6618)
-	call DeinitBattleAnimation
-	ret
-
-asm_ce61c: ; ce61c (33:661c)
-	call BattleAnim_IncAnonJumptableIndex
-	call BattleAnim_IncAnonJumptableIndex
-Functionce622: ; ce622 (33:6622)
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld a, [hl]
-	cp $d8
-	ret z
-	dec [hl]
-	dec [hl]
-	dec [hl]
-	dec [hl]
-	ret
-
-BattleAnimFunction_4A: ; ce62f (33:662f)
-	call BattleAnim_AnonJumptable
-.anon_dw
-	dw Functionce63a
-	dw Functionce648
-	dw Functionce65c
-	dw Functionce672
-Functionce63a: ; ce63a (33:663a)
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	ld hl, BATTLEANIMSTRUCT_ANON_JT_INDEX
-	add hl, bc
-	ld [hl], a
-	call BattleAnim_IncAnonJumptableIndex
-	ret
-
-Functionce648: ; ce648 (33:6648)
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld a, [hl]
-	add $4
-	cp $70
-	jr c, .asm_ce654
-	xor a
-.asm_ce654
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	inc [hl]
-	inc [hl]
-	ret
-
-Functionce65c: ; ce65c (33:665c)
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld a, [hl]
-	add $4
-	cp $70
-	jr c, .asm_ce668
-	xor a
-.asm_ce668
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld a, [hl]
-	add $8
-	ld [hl], a
-	ret
-
-Functionce672: ; ce672 (33:6672)
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld a, [hl]
-	add $4
-	cp $70
-	jr c, .asm_ce67e
-	xor a
-.asm_ce67e
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld a, [hl]
-	add $4
-	ld [hl], a
-	ret
-
-BattleAnimFunction_4B: ; ce688 (33:6688)
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld d, [hl]
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld e, [hl]
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	ld l, a
-	and $f0
-	ld h, a
-	swap a
-	or h
-	ld h, a
-	ld a, l
-	and $f
-	swap a
-	ld l, a
-	add hl, de
-	ld e, l
-	ld d, h
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	ld [hl], d
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld [hl], e
-	ret
-
-BattleAnimFunction_4C: ; ce6b3 (33:66b3)
-	ld d, $18
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld a, [hl]
-	inc [hl]
-	call Functionce6f1
-	ret
-
-BattleAnimFunction_4F: ; ce6bf (33:66bf)
-	ld d, $18
-	ld hl, BATTLEANIMSTRUCT_10
-	add hl, bc
-	ld a, [hl]
-	inc [hl]
-	srl a
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	add [hl]
-	call Functionce6f1
-	ret
-
-BattleAnimFunction_4D: ; ce6d2 (33:66d2)
-	ld hl, BATTLEANIMSTRUCT_0F
-	add hl, bc
-	ld a, [hl]
-	cp $20
-	jr nc, .asm_ce6ed
-	inc [hl]
-	ld hl, BATTLEANIMSTRUCT_0B
-	add hl, bc
-	ld d, [hl]
-	call BattleAnim_Sine
-	xor $ff
-	inc a
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	ret
-
-.asm_ce6ed
-	call DeinitBattleAnimation
-	ret
-
-Functionce6f1: ; ce6f1 (33:66f1)
-	push af
-	push de
-	call BattleAnim_Sine
-	sra a
-	sra a
-	ld hl, BATTLEANIMSTRUCT_YOFFSET
-	add hl, bc
-	ld [hl], a
-	pop de
-	pop af
-	call BattleAnim_Cosine
-	ld hl, BATTLEANIMSTRUCT_XOFFSET
-	add hl, bc
-	ld [hl], a
-	ret
-
-Functionce70a: ; ce70a (33:670a)
-	and $f
-	ld e, a
-	ld hl, BATTLEANIMSTRUCT_XCOORD
-	add hl, bc
-	add [hl]
-	ld [hl], a
-	srl e
-	ld hl, BATTLEANIMSTRUCT_YCOORD
-	add hl, bc
-.asm_ce719
-	dec [hl]
-	dec e
-	jr nz, .asm_ce719
-	ret
-
-BattleAnim_AnonJumptable: ; ce71e (33:671e)
-	pop de
-	ld hl, BATTLEANIMSTRUCT_ANON_JT_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
-	jp hl
-
-BattleAnim_IncAnonJumptableIndex: ; ce72c (33:672c)
-	ld hl, BATTLEANIMSTRUCT_ANON_JT_INDEX
-	add hl, bc
-	inc [hl]
-	ret
-
-BattleAnim_Cosine: ; ce732 (33:6732)
-	add $10
-BattleAnim_Sine: ; ce734 (33:6734)
-; a = d sin a
-	and $3f
-	cp $20
-	jr nc, .negative
-	call .ApplySineWave
-	ld a, h
-	ret
-
-.negative
-	and $1f
-	call .ApplySineWave
-	ld a, h
-	xor $ff
-	inc a
-	ret
-
-.ApplySineWave:
-	ld e, a
-	ld a, d
-	ld d, 0
-	ld hl, BattleAnimSineWave
-	add hl, de
-	add hl, de
-	ld e, [hl]
-	inc hl
-	ld d, [hl]
-	ld hl, $0
-.multiply
-	srl a
-	jr nc, .even
-	add hl, de
-.even
-	sla e
-	rl d
-	and a
-	jr nz, .multiply
-	ret
-
-BattleAnim_Sine_e: ; ce765 (33:6765)
-	ld a, e
-	call BattleAnim_Sine
-	ld e, a
-	ret
-
-BattleAnim_Cosine_e: ; ce76b (33:676b)
-	ld a, e
-	call BattleAnim_Cosine
-	ld e, a
-	ret
-
-; ce771 (33:6771)
-BattleAnim_AbsSinePrecise: ; ce771
-	ld a, e
-	call BattleAnim_Sine
-	ld e, l
-	ld d, h
-	ret
-
-; ce778
-BattleAnim_AbsCosinePrecise: ; ce778
-	ld a, e
-	call BattleAnim_Cosine
-	ld e, l
-	ld d, h
-	ret
-
-; ce77f
-BattleAnimSineWave: ; ce77f
-	sine_wave $100
-; ce7bf
--- a/battle/objects/helpers.asm
+++ /dev/null
@@ -1,130 +1,0 @@
-ReinitBattleAnimFrameset: ; ce7bf (33:67bf)
-	ld hl, BATTLEANIMSTRUCT_FRAMESET_ID
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_DURATION
-	add hl, bc
-	ld [hl], 0
-	ld hl, BATTLEANIMSTRUCT_FRAME
-	add hl, bc
-	ld [hl], -1
-	ret
-
-GetBattleAnimFrame: ; ce7d1
-.loop
-	ld hl, BATTLEANIMSTRUCT_DURATION
-	add hl, bc
-	ld a, [hl]
-	and a
-	jr z, .next_frame
-	dec [hl]
-	call .GetPointer
-	ld a, [hli]
-	push af
-	jr .okay
-
-.next_frame
-	ld hl, BATTLEANIMSTRUCT_FRAME
-	add hl, bc
-	inc [hl]
-	call .GetPointer
-	ld a, [hli]
-	cp -2
-	jr z, .restart
-	cp -1
-	jr z, .repeat_last
-	push af
-	ld a, [hl]
-	push hl
-	and $3f
-	ld hl, BATTLEANIMSTRUCT_DURATION
-	add hl, bc
-	ld [hl], a
-	pop hl
-
-.okay
-	ld a, [hl]
-	and $c0
-	srl a
-	ld [wBattleAnimTemp7], a
-	pop af
-	ret
-
-.repeat_last
-	xor a
-	ld hl, BATTLEANIMSTRUCT_DURATION
-	add hl, bc
-	ld [hl], a
-	ld hl, BATTLEANIMSTRUCT_FRAME
-	add hl, bc
-	dec [hl]
-	dec [hl]
-	jr .loop
-
-.restart
-	xor a
-	ld hl, BATTLEANIMSTRUCT_DURATION
-	add hl, bc
-	ld [hl], a
-	dec a
-	ld hl, BATTLEANIMSTRUCT_FRAME
-	add hl, bc
-	ld [hl], a
-	jr .loop
-
-; ce823
-
-.GetPointer: ; ce823
-	ld hl, BATTLEANIMSTRUCT_FRAMESET_ID
-	add hl, bc
-	ld e, [hl]
-	ld d, 0
-	ld hl, BattleAnimFrameData
-	add hl, de
-	add hl, de
-	ld e, [hl]
-	inc hl
-	ld d, [hl]
-	ld hl, BATTLEANIMSTRUCT_FRAME
-	add hl, bc
-	ld l, [hl]
-	ld h, $0
-	add hl, hl
-	add hl, de
-	ret
-
-; ce83c
-
-GetBattleAnimOAMPointer: ; ce83c
-	ld l, a
-	ld h, 0
-	ld de, BattleAnimOAMData
-	add hl, hl
-	add hl, hl
-	add hl, de
-	ret
-
-; ce846
-
-LoadBattleAnimObj: ; ce846 (33:6846)
-	push hl
-	ld l, a
-	ld h, 0
-	add hl, hl
-	add hl, hl
-	ld de, AnimObjGFX
-	add hl, de
-	ld c, [hl]
-	inc hl
-	ld b, [hl]
-	inc hl
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	pop de
-	push bc
-	call DecompressRequest2bpp
-	pop bc
-	ret
-
-; ce85e (33:685e)
--- a/battle/objects/oam.asm
+++ /dev/null
@@ -1,1085 +1,0 @@
-BattleAnimOAMData: ; ceeae
-; vtile offset (?), length, address
-	dbbw $00, 16, .OAMData_00 ; 00
-	dbbw $04,  9, .OAMData_01 ; 01
-	dbbw $08,  4, .OAMData_02 ; 02
-	dbbw $09,  4, .OAMData_03 ; 03
-	dbbw $0d,  4, .OAMData_04 ; 04
-	dbbw $0f,  4, .OAMData_03 ; 05
-	dbbw $13,  4, .OAMData_04 ; 06
-	dbbw $04, 16, .OAMData_00 ; 07
-	dbbw $08, 16, .OAMData_00 ; 08
-	dbbw $08, 16, .OAMData_09 ; 09
-	dbbw $00,  4, .OAMData_04 ; 0a
-	dbbw $02,  4, .OAMData_03 ; 0b
-	dbbw $06,  2, .OAMData_0c ; 0c
-	dbbw $07,  2, .OAMData_0c ; 0d
-	dbbw $02,  4, .OAMData_04 ; 0e
-	dbbw $04,  1, .OAMData_0f ; 0f
-	dbbw $05,  1, .OAMData_0f ; 10
-	dbbw $00,  2, .OAMData_11 ; 11
-	dbbw $02,  2, .OAMData_11 ; 12
-	dbbw $00,  4, .OAMData_13 ; 13
-	dbbw $00,  1, .OAMData_0f ; 14
-	dbbw $01,  1, .OAMData_0f ; 15
-	dbbw $02,  1, .OAMData_0f ; 16
-	dbbw $03,  1, .OAMData_0f ; 17
-	dbbw $00,  4, .OAMData_02 ; 18
-	dbbw $01, 16, .OAMData_00 ; 19
-	dbbw $05, 16, .OAMData_00 ; 1a
-	dbbw $00,  4, .OAMData_03 ; 1b
-	dbbw $05, 12, .OAMData_1c ; 1c
-	dbbw $02,  4, .OAMData_02 ; 1d
-	dbbw $06,  1, .OAMData_0f ; 1e
-	dbbw $07,  1, .OAMData_0f ; 1f
-	dbbw $08,  1, .OAMData_0f ; 20
-	dbbw $04,  4, .OAMData_03 ; 21
-	dbbw $09, 22, .OAMData_22 ; 22
-	dbbw $04,  2, .OAMData_11 ; 23
-	dbbw $06,  2, .OAMData_11 ; 24
-	dbbw $0c,  1, .OAMData_0f ; 25
-	dbbw $0a,  1, .OAMData_0f ; 26
-	dbbw $0b,  4, .OAMData_02 ; 27
-	dbbw $08,  4, .OAMData_04 ; 28
-	dbbw $06,  4, .OAMData_04 ; 29
-	dbbw $00,  5, .OAMData_2a ; 2a
-	dbbw $03,  6, .OAMData_2b ; 2b
-	dbbw $00,  7, .OAMData_2c ; 2c
-	dbbw $03,  8, .OAMData_2d ; 2d
-	dbbw $00,  9, .OAMData_2e ; 2e
-	dbbw $00,  4, .OAMData_2f ; 2f
-	dbbw $02,  4, .OAMData_30 ; 30
-	dbbw $04,  6, .OAMData_31 ; 31
-	dbbw $00,  2, .OAMData_32 ; 32
-	dbbw $00,  7, .OAMData_33 ; 33
-	dbbw $00, 14, .OAMData_32 ; 34
-	dbbw $00, 21, .OAMData_33 ; 35
-	dbbw $00,  2, .OAMData_36 ; 36
-	dbbw $00,  6, .OAMData_36 ; 37
-	dbbw $00, 10, .OAMData_36 ; 38
-	dbbw $00, 14, .OAMData_36 ; 39
-	dbbw $00,  2, .OAMData_3a ; 3a
-	dbbw $00,  6, .OAMData_3a ; 3b
-	dbbw $00, 10, .OAMData_3a ; 3c
-	dbbw $00, 14, .OAMData_3a ; 3d
-	dbbw $00,  4, .OAMData_3e ; 3e
-	dbbw $00, 16, .OAMData_3e ; 3f
-	dbbw $00, 26, .OAMData_3e ; 40
-	dbbw $00, 26, .OAMData_41 ; 41
-	dbbw $0e,  4, .OAMData_42 ; 42
-	dbbw $0e,  8, .OAMData_42 ; 43
-	dbbw $0e,  4, .OAMData_44 ; 44
-	dbbw $0e,  8, .OAMData_44 ; 45
-	dbbw $0e,  4, .OAMData_46 ; 46
-	dbbw $0e,  4, .OAMData_47 ; 47
-	dbbw $00,  6, .OAMData_48 ; 48
-	dbbw $03,  4, .OAMData_49 ; 49
-	dbbw $03,  2, .OAMData_4a ; 4a
-	dbbw $01,  5, .OAMData_0f ; 4b
-	dbbw $01,  6, .OAMData_4c ; 4c
-	dbbw $01,  7, .OAMData_4d ; 4d
-	dbbw $01,  3, .OAMData_4d ; 4e
-	dbbw $01,  8, .OAMData_4f ; 4f
-	dbbw $01,  9, .OAMData_50 ; 50
-	dbbw $01, 10, .OAMData_51 ; 51
-	dbbw $01,  6, .OAMData_51 ; 52
-	dbbw $00,  9, .OAMData_01 ; 53
-	dbbw $04,  4, .OAMData_02 ; 54
-	dbbw $05,  4, .OAMData_02 ; 55
-	dbbw $00,  2, .OAMData_56 ; 56
-	dbbw $02,  2, .OAMData_56 ; 57
-	dbbw $04,  2, .OAMData_56 ; 58
-	dbbw $02,  4, .OAMData_59 ; 59
-	dbbw $02,  4, .OAMData_5a ; 5a
-	dbbw $02,  2, .OAMData_0c ; 5b
-	dbbw $04,  2, .OAMData_0c ; 5c
-	dbbw $06,  4, .OAMData_5d ; 5d
-	dbbw $08,  2, .OAMData_0c ; 5e
-	dbbw $09,  2, .OAMData_0c ; 5f
-	dbbw $05,  2, .OAMData_60 ; 60
-	dbbw $00,  2, .OAMData_61 ; 61
-	dbbw $00,  5, .OAMData_61 ; 62
-	dbbw $00,  9, .OAMData_61 ; 63
-	dbbw $09,  9, .OAMData_61 ; 64
-	dbbw $00,  4, .OAMData_65 ; 65
-	dbbw $00,  7, .OAMData_65 ; 66
-	dbbw $00,  9, .OAMData_65 ; 67
-	dbbw $09,  9, .OAMData_65 ; 68
-	dbbw $04,  1, .OAMData_69 ; 69
-	dbbw $05,  2, .OAMData_6a ; 6a
-	dbbw $06,  4, .OAMData_03 ; 6b
-	dbbw $0a,  4, .OAMData_03 ; 6c
-	dbbw $0e,  4, .OAMData_03 ; 6d
-	dbbw $08,  5, .OAMData_6e ; 6e
-	dbbw $0d,  3, .OAMData_6f ; 6f
-	dbbw $01,  8, .OAMData_70 ; 70
-	dbbw $03,  8, .OAMData_70 ; 71
-	dbbw $05,  8, .OAMData_70 ; 72
-	dbbw $07,  8, .OAMData_70 ; 73
-	dbbw $06,  4, .OAMData_02 ; 74
-	dbbw $07,  4, .OAMData_02 ; 75
-	dbbw $0a,  2, .OAMData_76 ; 76
-	dbbw $00,  1, .OAMData_77 ; 77
-	dbbw $00,  3, .OAMData_78 ; 78
-	dbbw $00,  6, .OAMData_79 ; 79
-	dbbw $00,  9, .OAMData_7a ; 7a
-	dbbw $00, 12, .OAMData_7b ; 7b
-	dbbw $00, 14, .OAMData_7c ; 7c
-	dbbw $00, 15, .OAMData_7d ; 7d
-	dbbw $04,  4, .OAMData_03 ; 7e
-	dbbw $08,  4, .OAMData_03 ; 7f
-	dbbw $0d,  1, .OAMData_0f ; 80
-	dbbw $0e,  4, .OAMData_81 ; 81
-	dbbw $10,  1, .OAMData_0f ; 82
-	dbbw $11,  1, .OAMData_0f ; 83
-	dbbw $04,  2, .OAMData_6a ; 84
-	dbbw $05,  2, .OAMData_6a ; 85
-	dbbw $0a,  4, .OAMData_04 ; 86
-	dbbw $00,  8, .OAMData_87 ; 87
-	dbbw $00, 12, .OAMData_88 ; 88
-	dbbw $00, 16, .OAMData_87 ; 89
-	dbbw $09,  2, .OAMData_8a ; 8a
-	dbbw $09,  4, .OAMData_8a ; 8b
-	dbbw $09,  6, .OAMData_8a ; 8c
-	dbbw $09,  8, .OAMData_8a ; 8d
-	dbbw $12,  5, .OAMData_8e ; 8e
-	dbbw $00,  4, .OAMData_8f ; 8f
-	dbbw $04,  4, .OAMData_8f ; 90
-	dbbw $08,  4, .OAMData_8f ; 91
-	dbbw $0c,  4, .OAMData_8f ; 92
-	dbbw $00,  6, .OAMData_93 ; 93
-	dbbw $04,  4, .OAMData_03 ; 94
-	dbbw $0a,  4, .OAMData_04 ; 95
-	dbbw $15,  4, .OAMData_30 ; 96
-	dbbw $04,  4, .OAMData_30 ; 97
-	dbbw $0c,  4, .OAMData_04 ; 98
-	dbbw $0a,  4, .OAMData_99 ; 99
-	dbbw $0c,  4, .OAMData_03 ; 9a
-	dbbw $00, 36, .OAMData_9b ; 9b
-	dbbw $0d,  2, .OAMData_9c ; 9c
-	dbbw $0d,  4, .OAMData_9c ; 9d
-	dbbw $0d,  6, .OAMData_9c ; 9e
-	dbbw $02,  8, .OAMData_9f ; 9f
-	dbbw $08,  7, .OAMData_a0 ; a0
-	dbbw $08,  5, .OAMData_a0 ; a1
-	dbbw $08,  3, .OAMData_a0 ; a2
-	dbbw $00, 16, .OAMData_1c ; a3
-	dbbw $00,  9, .OAMData_a4 ; a4
-	dbbw $06,  9, .OAMData_a4 ; a5
-	dbbw $0c,  9, .OAMData_a4 ; a6
-	dbbw $12,  9, .OAMData_a4 ; a7
-	dbbw $18,  9, .OAMData_a4 ; a8
-	dbbw $1e,  9, .OAMData_a4 ; a9
-	dbbw $24,  9, .OAMData_a4 ; aa
-	dbbw $2a,  9, .OAMData_a4 ; ab
-	dbbw $03,  4, .OAMData_ac ; ac
-	dbbw $12,  4, .OAMData_03 ; ad
-	dbbw $10,  4, .OAMData_04 ; ae
-	dbbw $16,  1, .OAMData_0f ; af
-	dbbw $17,  4, .OAMData_02 ; b0
-	dbbw $18,  4, .OAMData_03 ; b1
-	dbbw $1c,  4, .OAMData_03 ; b2
-	dbbw $20,  3, .OAMData_03 ; b3
-	dbbw $23,  4, .OAMData_04 ; b4
-	dbbw $25,  3, .OAMData_03 ; b5
-	dbbw $17,  4, .OAMData_03 ; b6
-	dbbw $0a, 16, .OAMData_00 ; b7
-	dbbw $10, 16, .OAMData_1c ; b8
-	dbbw $00, 16, .OAMData_1c ; b9
-	dbbw $04,  4, .OAMData_03 ; ba
-	dbbw $08,  2, .OAMData_11 ; bb
-	dbbw $20,  6, .OAMData_bc ; bc
-	dbbw $08,  1, .OAMData_0f ; bd
-	dbbw $04,  4, .OAMData_03 ; be
-	dbbw $1a,  4, .OAMData_30 ; bf
-	dbbw $16,  9, .OAMData_01 ; c0
-	dbbw $10, 16, .OAMData_c1 ; c1
-	dbbw $09,  6, .OAMData_c2 ; c2
-	dbbw $11,  9, .OAMData_c3 ; c3
-	dbbw $0e,  4, .OAMData_03 ; c4
-	dbbw $0b,  4, .OAMData_30 ; c5
-	dbbw $1c,  6, .OAMData_02 ; c6
-	dbbw $20, 16, .OAMData_c1 ; c7
-	dbbw $05,  6, .OAMData_c8 ; c8
-	dbbw $0b,  4, .OAMData_03 ; c9
-	dbbw $09,  4, .OAMData_ca ; ca
-	dbbw $0b,  4, .OAMData_04 ; cb
-	dbbw $11, 13, .OAMData_cc ; cc
-	dbbw $00,  9, .OAMData_c3 ; cd
-	dbbw $09,  9, .OAMData_c3 ; ce
-	dbbw $00, 12, .OAMData_cf ; cf
-	dbbw $06, 12, .OAMData_cf ; d0
-	dbbw $0c, 12, .OAMData_cf ; d1
-	dbbw $12, 12, .OAMData_cf ; d2
-	dbbw $00, 13, .OAMData_cc ; d3
-	dbbw $00,  7, .OAMData_d4 ; d4
-	dbbw $00,  6, .OAMData_d5 ; d5
-	dbbw $00, 14, .OAMData_d6 ; d6
-	dbbw $00, 12, .OAMData_d7 ; d7
-
-.OAMData_11:
-	dsprite  -1, 0,  -1, 4, $00, $00
-	dsprite   0, 0,  -1, 4, $01, $00
-
-.OAMData_56:
-	dsprite  -1, 4,  -1, 0, $00, $00
-	dsprite  -1, 4,   0, 0, $01, $00
-
-.OAMData_03:
-	dsprite  -1, 0,  -1, 0, $00, $00
-	dsprite  -1, 0,   0, 0, $01, $00
-	dsprite   0, 0,  -1, 0, $02, $00
-	dsprite   0, 0,   0, 0, $03, $00
-
-.OAMData_02:
-	dsprite  -1, 0,  -1, 0, $00, $00
-	dsprite  -1, 0,   0, 0, $00, $20
-	dsprite   0, 0,  -1, 0, $00, $40
-	dsprite   0, 0,   0, 0, $00, $60
-
-.OAMData_c3:
-	dsprite  -2, 4,  -2, 4, $00, $00
-	dsprite  -2, 4,  -1, 4, $01, $00
-	dsprite  -2, 4,   0, 4, $02, $00
-	dsprite  -1, 4,  -2, 4, $03, $00
-	dsprite  -1, 4,  -1, 4, $04, $00
-	dsprite  -1, 4,   0, 4, $05, $00
-	dsprite   0, 4,  -2, 4, $06, $00
-	dsprite   0, 4,  -1, 4, $07, $00
-	dsprite   0, 4,   0, 4, $08, $00
-
-.OAMData_01:
-	dsprite  -2, 4,  -2, 4, $00, $00
-	dsprite  -2, 4,  -1, 4, $01, $00
-	dsprite  -2, 4,   0, 4, $00, $20
-	dsprite  -1, 4,  -2, 4, $02, $00
-	dsprite  -1, 4,  -1, 4, $03, $00
-	dsprite  -1, 4,   0, 4, $02, $60
-	dsprite   0, 4,  -2, 4, $00, $40
-	dsprite   0, 4,  -1, 4, $01, $60
-	dsprite   0, 4,   0, 4, $00, $60
-
-.OAMData_cf:
-	dsprite  -2, 0,  -2, 4, $00, $00
-	dsprite  -2, 0,  -1, 4, $01, $00
-	dsprite  -2, 0,   0, 4, $02, $00
-	dsprite  -1, 0,  -2, 4, $03, $00
-	dsprite  -1, 0,  -1, 4, $04, $00
-	dsprite  -1, 0,   0, 4, $05, $00
-	dsprite   0, 0,  -2, 4, $05, $60
-	dsprite   0, 0,  -1, 4, $04, $60
-	dsprite   0, 0,   0, 4, $03, $60
-	dsprite   1, 0,  -2, 4, $02, $60
-	dsprite   1, 0,  -1, 4, $01, $60
-	dsprite   1, 0,   0, 4, $00, $60
-
-.OAMData_1c:
-	dsprite  -2, 0,  -2, 0, $00, $00
-	dsprite  -2, 0,  -1, 0, $01, $00
-	dsprite  -2, 0,   0, 0, $02, $00
-	dsprite  -2, 0,   1, 0, $03, $00
-	dsprite  -1, 0,  -2, 0, $04, $00
-	dsprite  -1, 0,  -1, 0, $05, $00
-	dsprite  -1, 0,   0, 0, $06, $00
-	dsprite  -1, 0,   1, 0, $07, $00
-	dsprite   0, 0,  -2, 0, $08, $00
-	dsprite   0, 0,  -1, 0, $09, $00
-	dsprite   0, 0,   0, 0, $0a, $00
-	dsprite   0, 0,   1, 0, $0b, $00
-	dsprite   1, 0,  -2, 0, $0c, $00
-	dsprite   1, 0,  -1, 0, $0d, $00
-	dsprite   1, 0,   0, 0, $0e, $00
-	dsprite   1, 0,   1, 0, $0f, $00
-
-.OAMData_00:
-	dsprite  -2, 0,  -2, 0, $00, $00
-	dsprite  -2, 0,  -1, 0, $01, $00
-	dsprite  -1, 0,  -2, 0, $02, $00
-	dsprite  -1, 0,  -1, 0, $03, $00
-	dsprite  -2, 0,   0, 0, $01, $20
-	dsprite  -2, 0,   1, 0, $00, $20
-	dsprite  -1, 0,   0, 0, $03, $20
-	dsprite  -1, 0,   1, 0, $02, $20
-	dsprite   0, 0,  -2, 0, $02, $40
-	dsprite   0, 0,  -1, 0, $03, $40
-	dsprite   1, 0,  -2, 0, $00, $40
-	dsprite   1, 0,  -1, 0, $01, $40
-	dsprite   0, 0,   0, 0, $03, $60
-	dsprite   0, 0,   1, 0, $02, $60
-	dsprite   1, 0,   0, 0, $01, $60
-	dsprite   1, 0,   1, 0, $00, $60
-
-.OAMData_09:
-	dsprite  -3, 4,  -3, 4, $00, $00
-	dsprite  -3, 4,  -2, 4, $01, $00
-	dsprite  -2, 4,  -3, 4, $02, $00
-	dsprite  -2, 4,  -2, 4, $03, $00
-	dsprite  -3, 4,   0, 4, $01, $20
-	dsprite  -3, 4,   1, 4, $00, $20
-	dsprite  -2, 4,   0, 4, $03, $20
-	dsprite  -2, 4,   1, 4, $02, $20
-	dsprite   0, 4,  -3, 4, $02, $40
-	dsprite   0, 4,  -2, 4, $03, $40
-	dsprite   1, 4,  -3, 4, $00, $40
-	dsprite   1, 4,  -2, 4, $01, $40
-	dsprite   0, 4,   0, 4, $03, $60
-	dsprite   0, 4,   1, 4, $02, $60
-	dsprite   1, 4,   0, 4, $01, $60
-	dsprite   1, 4,   1, 4, $00, $60
-
-.OAMData_0c:
-	dsprite  -1, 4,  -1, 0, $00, $00
-	dsprite  -1, 4,   0, 0, $00, $20
-
-.OAMData_6a:
-	dsprite   0, 0,  -1, 0, $00, $00
-	dsprite   0, 0,   0, 0, $00, $20
-
-.OAMData_04:
-	dsprite  -1, 0,  -1, 0, $00, $00
-	dsprite  -1, 0,   0, 0, $00, $20
-	dsprite   0, 0,  -1, 0, $01, $00
-	dsprite   0, 0,   0, 0, $01, $20
-
-.OAMData_5d:
-	dsprite  -1, 0,  -1, 0, $00, $00
-	dsprite  -1, 0,   0, 0, $01, $00
-	dsprite   0, 0,  -1, 0, $00, $40
-	dsprite   0, 0,   0, 0, $01, $40
-
-.OAMData_13:
-	dsprite  -1, 2,  -1, 0, $02, $00
-	dsprite   0, 2,  -1, 0, $03, $00
-	dsprite  -2, 6,   0, 0, $02, $00
-	dsprite  -1, 6,   0, 0, $03, $00
-
-.OAMData_22:
-	dsprite   1, 0, -11, 0, $01, $00
-	dsprite   0, 0, -10, 0, $02, $00
-	dsprite   0, 0,  -9, 0, $03, $00
-	dsprite   0, 0,  -8, 0, $00, $00
-	dsprite   0, 0,  -7, 0, $03, $00
-	dsprite   0, 0,  -6, 0, $00, $00
-	dsprite   0, 0,  -5, 0, $03, $00
-	dsprite   0, 0,  -4, 0, $00, $00
-	dsprite   0, 0,  -3, 0, $03, $00
-	dsprite   0, 0,  -2, 0, $00, $00
-	dsprite   0, 0,  -1, 0, $01, $00
-	dsprite  -1, 0,   0, 0, $02, $00
-	dsprite  -1, 0,   1, 0, $03, $00
-	dsprite  -1, 0,   2, 0, $00, $00
-	dsprite  -1, 0,   3, 0, $03, $00
-	dsprite  -1, 0,   4, 0, $00, $00
-	dsprite  -1, 0,   5, 0, $03, $00
-	dsprite  -1, 0,   6, 0, $00, $00
-	dsprite  -1, 0,   7, 0, $03, $00
-	dsprite  -1, 0,   8, 0, $00, $00
-	dsprite  -1, 0,   9, 0, $01, $00
-	dsprite  -2, 0,  10, 0, $02, $00
-
-.OAMData_2a:
-	dsprite  -3, 4,  -1, 0, $00, $00
-	dsprite  -3, 4,   0, 0, $00, $20
-	dsprite  -2, 4,  -1, 0, $01, $00
-	dsprite  -2, 4,   0, 0, $01, $20
-	dsprite  -1, 4,  -1, 4, $02, $00
-
-.OAMData_2b:
-	dsprite  -4, 4,  -1, 0, $00, $00
-	dsprite  -4, 4,   0, 0, $00, $20
-	dsprite  -3, 4,  -1, 0, $01, $00
-	dsprite  -3, 4,   0, 0, $01, $20
-	dsprite  -2, 4,  -1, 4, $02, $00
-	dsprite  -1, 4,  -1, 4, $02, $00
-
-.OAMData_2c:
-	dsprite  -5, 4,  -1, 0, $00, $00
-	dsprite  -5, 4,   0, 0, $00, $20
-	dsprite  -4, 4,  -1, 0, $01, $00
-	dsprite  -4, 4,   0, 0, $01, $20
-	dsprite  -3, 4,  -1, 4, $02, $00
-	dsprite  -2, 4,  -1, 4, $02, $00
-	dsprite  -1, 4,  -1, 4, $02, $00
-
-.OAMData_2d:
-	dsprite  -6, 4,  -1, 0, $00, $00
-	dsprite  -6, 4,   0, 0, $00, $20
-	dsprite  -5, 4,  -1, 0, $01, $00
-	dsprite  -5, 4,   0, 0, $01, $20
-	dsprite  -4, 4,  -1, 4, $02, $00
-	dsprite  -3, 4,  -1, 4, $02, $00
-	dsprite  -2, 4,  -1, 4, $02, $00
-	dsprite  -1, 4,  -1, 4, $02, $00
-
-.OAMData_2e:
-	dsprite  -7, 4,  -1, 0, $00, $00
-	dsprite  -7, 4,   0, 0, $00, $20
-	dsprite  -6, 4,  -1, 0, $01, $00
-	dsprite  -6, 4,   0, 0, $01, $20
-	dsprite  -5, 4,  -1, 4, $02, $00
-	dsprite  -4, 4,  -1, 4, $02, $00
-	dsprite  -3, 4,  -1, 4, $02, $00
-	dsprite  -2, 4,  -1, 4, $02, $00
-	dsprite  -1, 4,  -1, 4, $02, $00
-
-.OAMData_2f:
-	dsprite  -1, 0,  -1, 0, $00, $00
-	dsprite  -1, 0,   0, 0, $00, $20
-	dsprite   0, 0,  -1, 0, $01, $00
-	dsprite   0, 0,   0, 0, $00, $60
-
-.OAMData_30:
-	dsprite  -1, 0,  -1, 0, $00, $00
-	dsprite  -1, 0,   0, 0, $01, $00
-	dsprite   0, 0,  -1, 0, $01, $60
-	dsprite   0, 0,   0, 0, $00, $60
-
-.OAMData_31:
-	dsprite  -2, 4,  -1, 0, $00, $00
-	dsprite  -2, 4,   0, 0, $01, $00
-	dsprite  -1, 4,  -1, 0, $02, $00
-	dsprite  -1, 4,   0, 0, $03, $00
-	dsprite   0, 4,  -1, 0, $04, $00
-	dsprite   0, 4,   0, 0, $05, $00
-
-.OAMData_76:
-	dsprite  -1, 5,  -1, 0, $00, $00
-	dsprite  -1, 1,   0, 0, $00, $00
-
-.OAMData_32:
-	dsprite  -1, 0,  -2, 4, $00, $00
-	dsprite  -1, 0,   0, 4, $00, $00
-	dsprite  -3, 0,  -2, 4, $00, $00
-	dsprite  -3, 0,   0, 4, $00, $00
-	dsprite  -2, 0,  -3, 4, $00, $00
-	dsprite  -2, 0,  -2, 4, $01, $00
-	dsprite  -2, 0,  -1, 4, $00, $00
-	dsprite  -2, 0,   0, 4, $01, $00
-	dsprite  -2, 0,   1, 4, $00, $00
-	dsprite  -1, 0,  -4, 4, $00, $00
-	dsprite  -1, 0,  -3, 4, $01, $00
-	dsprite  -1, 0,  -1, 4, $01, $00
-	dsprite  -1, 0,   1, 4, $01, $00
-	dsprite  -1, 0,   2, 4, $00, $00
-
-.OAMData_33:
-	dsprite  -2, 0,  -2, 4, $00, $00
-	dsprite  -2, 0,   0, 4, $00, $00
-	dsprite  -1, 0,  -3, 4, $00, $00
-	dsprite  -1, 0,  -2, 4, $01, $00
-	dsprite  -1, 0,  -1, 4, $00, $00
-	dsprite  -1, 0,   0, 4, $01, $00
-	dsprite  -1, 0,   1, 4, $00, $00
-	dsprite  -4, 0,  -2, 4, $00, $00
-	dsprite  -4, 0,   0, 4, $00, $00
-	dsprite  -3, 0,  -3, 4, $00, $00
-	dsprite  -3, 0,  -2, 4, $01, $00
-	dsprite  -3, 0,  -1, 4, $00, $00
-	dsprite  -3, 0,   0, 4, $01, $00
-	dsprite  -3, 0,   1, 4, $00, $00
-	dsprite  -2, 0,  -4, 4, $00, $00
-	dsprite  -2, 0,  -3, 4, $01, $00
-	dsprite  -2, 0,  -1, 4, $01, $00
-	dsprite  -2, 0,   1, 4, $01, $00
-	dsprite  -2, 0,   2, 4, $00, $00
-	dsprite  -1, 0,  -4, 4, $01, $00
-	dsprite  -1, 0,   2, 4, $01, $00
-
-.OAMData_36:
-	dsprite  -7, 4,  -1, 0, $00, $00
-	dsprite  -7, 4,   0, 0, $01, $00
-	dsprite  -6, 4,  -1, 0, $02, $00
-	dsprite  -6, 4,   0, 0, $03, $00
-	dsprite  -5, 4,  -1, 0, $04, $00
-	dsprite  -5, 4,   0, 0, $05, $00
-	dsprite  -4, 4,  -1, 0, $06, $00
-	dsprite  -4, 4,   0, 0, $07, $00
-	dsprite  -3, 4,  -1, 0, $08, $00
-	dsprite  -3, 4,   0, 0, $09, $00
-	dsprite  -2, 4,  -1, 0, $0a, $00
-	dsprite  -2, 4,   0, 0, $0b, $00
-	dsprite  -1, 4,  -1, 0, $0c, $00
-	dsprite  -1, 4,   0, 0, $0d, $00
-
-.OAMData_3a:
-	dsprite  -7, 4,  -1, 0, $0c, $00
-	dsprite  -7, 4,   0, 0, $0d, $00
-	dsprite  -6, 4,  -1, 0, $08, $00
-	dsprite  -6, 4,   0, 0, $09, $00
-	dsprite  -5, 4,  -1, 0, $04, $00
-	dsprite  -5, 4,   0, 0, $05, $00
-	dsprite  -4, 4,  -1, 0, $00, $00
-	dsprite  -4, 4,   0, 0, $01, $00
-	dsprite  -3, 4,  -1, 0, $02, $00
-	dsprite  -3, 4,   0, 0, $03, $00
-	dsprite  -2, 4,   0, 0, $02, $00
-	dsprite  -2, 4,   1, 0, $03, $00
-	dsprite  -1, 4,   0, 0, $0a, $00
-	dsprite  -1, 4,   1, 0, $0b, $00
-
-.OAMData_3e:
-	dsprite   1, 4,  -2, 0, $00, $40
-	dsprite   1, 4,  -1, 0, $02, $40
-	dsprite   1, 4,   0, 0, $02, $60
-	dsprite   1, 4,   1, 0, $00, $60
-	dsprite  -1, 4,  -3, 0, $09, $20
-	dsprite  -1, 4,  -2, 0, $08, $20
-	dsprite  -1, 4,  -1, 0, $06, $00
-	dsprite  -1, 4,   0, 0, $07, $00
-	dsprite  -1, 4,   1, 0, $08, $00
-	dsprite  -1, 4,   2, 0, $09, $00
-	dsprite   0, 4,  -3, 0, $01, $20
-	dsprite   0, 4,  -2, 0, $00, $20
-	dsprite   0, 4,  -1, 0, $0c, $00
-	dsprite   0, 4,   0, 0, $0d, $00
-	dsprite   0, 4,   1, 0, $00, $00
-	dsprite   0, 4,   2, 0, $01, $00
-	dsprite  -3, 4,  -2, 0, $00, $00
-	dsprite  -3, 4,  -1, 0, $02, $00
-	dsprite  -3, 4,   0, 0, $02, $20
-	dsprite  -3, 4,   1, 0, $00, $20
-	dsprite  -2, 4,  -3, 0, $03, $20
-	dsprite  -2, 4,  -2, 0, $02, $20
-	dsprite  -2, 4,  -1, 0, $04, $00
-	dsprite  -2, 4,   0, 0, $05, $00
-	dsprite  -2, 4,   1, 0, $02, $00
-	dsprite  -2, 4,   2, 0, $03, $00
-
-.OAMData_41:
-	dsprite  -3, 4,  -2, 0, $00, $00
-	dsprite  -3, 4,  -1, 0, $02, $00
-	dsprite  -3, 4,   0, 0, $02, $20
-	dsprite  -3, 4,   1, 0, $00, $20
-	dsprite  -2, 4,  -3, 4, $00, $00
-	dsprite  -2, 4,  -2, 4, $01, $00
-	dsprite  -2, 4,  -1, 0, $05, $20
-	dsprite  -2, 4,   0, 0, $04, $20
-	dsprite  -2, 4,   0, 4, $01, $20
-	dsprite  -2, 4,   1, 4, $00, $20
-	dsprite  -1, 4,  -3, 4, $02, $00
-	dsprite  -1, 4,  -2, 4, $03, $00
-	dsprite  -1, 4,  -1, 0, $07, $20
-	dsprite  -1, 4,   0, 0, $06, $20
-	dsprite  -1, 4,   0, 4, $03, $20
-	dsprite  -1, 4,   1, 4, $02, $20
-	dsprite   0, 4,  -3, 4, $04, $00
-	dsprite   0, 4,  -2, 4, $05, $00
-	dsprite   0, 4,  -1, 0, $0d, $20
-	dsprite   0, 4,   0, 0, $0c, $20
-	dsprite   0, 4,   0, 4, $05, $20
-	dsprite   0, 4,   1, 4, $04, $20
-	dsprite   1, 4,  -2, 0, $00, $40
-	dsprite   1, 4,  -1, 0, $02, $40
-	dsprite   1, 4,   0, 0, $02, $60
-	dsprite   1, 4,   1, 0, $00, $60
-
-.OAMData_42:
-	dsprite  -3, 0,  -1, 4, $02, $00
-	dsprite   2, 0,  -1, 4, $02, $60
-	dsprite  -1, 4,  -3, 0, $01, $00
-	dsprite  -1, 4,   2, 0, $01, $60
-	dsprite  -4, 0,  -1, 4, $02, $00
-	dsprite   3, 0,  -1, 4, $02, $60
-	dsprite  -1, 4,  -4, 0, $01, $00
-	dsprite  -1, 4,   3, 0, $01, $60
-
-.OAMData_44:
-	dsprite  -3, 5,  -3, 5, $00, $20
-	dsprite  -3, 5,   1, 3, $00, $00
-	dsprite   1, 3,  -3, 5, $00, $60
-	dsprite   1, 3,   1, 3, $00, $40
-	dsprite  -4, 5,  -4, 5, $00, $20
-	dsprite  -4, 5,   2, 3, $00, $00
-	dsprite   2, 3,  -4, 5, $00, $60
-	dsprite   2, 3,   2, 3, $00, $40
-
-.OAMData_46:
-	dsprite  -3, 4,  -1, 4, $02, $00
-	dsprite   1, 4,  -1, 4, $02, $60
-	dsprite  -1, 4,  -3, 4, $01, $00
-	dsprite  -1, 4,   1, 4, $01, $60
-
-.OAMData_47:
-	dsprite  -2, 0,  -2, 0, $00, $20
-	dsprite  -2, 0,   1, 0, $00, $00
-	dsprite   1, 0,  -2, 0, $00, $60
-	dsprite   1, 0,   1, 0, $00, $40
-
-.OAMData_48:
-	dsprite  -3, 0,  -1, 4, $00, $00
-	dsprite  -2, 0,  -1, 2, $00, $00
-	dsprite  -1, 0,  -1, 0, $00, $00
-	dsprite   0, 0,  -1, 0, $00, $00
-	dsprite   1, 0,  -1, 2, $00, $00
-	dsprite   2, 0,  -1, 4, $00, $00
-
-.OAMData_49:
-	dsprite  -1, 4,  -2, 0, $00, $20
-	dsprite  -1, 2,  -1, 0, $00, $20
-	dsprite  -1, 2,   0, 0, $00, $00
-	dsprite  -1, 4,   1, 0, $00, $00
-
-.OAMData_4a:
-	dsprite  -1, 4,  -1, 0, $00, $60
-	dsprite  -1, 4,   0, 0, $00, $40
-
-.OAMData_0f:
-	dsprite  -1, 4,  -1, 4, $00, $00
-	dsprite  -1, 4,  -2, 4, $01, $00
-	dsprite  -1, 4,  -1, 4, $01, $20
-	dsprite   0, 4,  -2, 4, $01, $40
-	dsprite   0, 4,  -1, 4, $01, $60
-
-.OAMData_4c:
-	dsprite  -1, 4,  -1, 4, $00, $00
-	dsprite   0, 2,  -2, 6, $00, $00
-	dsprite   0, 2,  -3, 6, $01, $00
-	dsprite   0, 2,  -2, 6, $01, $20
-	dsprite   1, 2,  -3, 6, $01, $40
-	dsprite   1, 2,  -2, 6, $01, $60
-
-.OAMData_4d:
-	dsprite  -1, 4,  -1, 4, $00, $00
-	dsprite   0, 2,  -2, 6, $00, $00
-	dsprite   1, 0,  -2, 0, $00, $00
-	dsprite   1, 0,  -3, 0, $01, $00
-	dsprite   1, 0,  -2, 0, $01, $20
-	dsprite   2, 0,  -3, 0, $01, $40
-	dsprite   2, 0,  -2, 0, $01, $60
-
-.OAMData_4f:
-	dsprite  -1, 4,  -1, 4, $00, $00
-	dsprite   0, 2,  -2, 6, $00, $00
-	dsprite   1, 0,  -2, 0, $00, $00
-	dsprite   1, 6,  -3, 2, $00, $00
-	dsprite   1, 6,  -4, 2, $01, $00
-	dsprite   1, 6,  -3, 2, $01, $20
-	dsprite   2, 6,  -4, 2, $01, $40
-	dsprite   2, 6,  -3, 2, $01, $60
-
-.OAMData_50:
-	dsprite  -1, 4,  -1, 4, $00, $00
-	dsprite   0, 2,  -2, 6, $00, $00
-	dsprite   1, 0,  -2, 0, $00, $00
-	dsprite   1, 6,  -3, 2, $00, $00
-	dsprite   2, 4,  -4, 4, $00, $00
-	dsprite   2, 4,  -5, 4, $01, $00
-	dsprite   2, 4,  -4, 4, $01, $20
-	dsprite   3, 4,  -5, 4, $01, $40
-	dsprite   3, 4,  -4, 4, $01, $60
-
-.OAMData_51:
-	dsprite  -1, 4,  -1, 4, $00, $00
-	dsprite   0, 2,  -2, 6, $00, $00
-	dsprite   1, 0,  -2, 0, $00, $00
-	dsprite   1, 6,  -3, 2, $00, $00
-	dsprite   2, 4,  -4, 4, $00, $00
-	dsprite   3, 2,  -5, 6, $00, $00
-	dsprite   3, 2,  -6, 6, $01, $00
-	dsprite   3, 2,  -5, 6, $01, $20
-	dsprite   4, 2,  -6, 6, $01, $40
-	dsprite   4, 2,  -5, 6, $01, $60
-
-.OAMData_59:
-	dsprite  -1, 4,  -2, 0, $00, $00
-	dsprite  -1, 4,  -1, 0, $01, $00
-	dsprite  -1, 4,   0, 0, $01, $20
-	dsprite  -1, 4,   1, 0, $00, $20
-
-.OAMData_5a:
-	dsprite  -1, 4,  -2, 0, $02, $00
-	dsprite  -1, 4,  -1, 0, $01, $00
-	dsprite  -1, 4,   0, 0, $01, $20
-	dsprite  -1, 4,   1, 0, $02, $20
-
-.OAMData_60:
-	dsprite  -1, 0,  -1, 4, $00, $00
-
-.OAMData_69:
-	dsprite   0, 0,  -1, 4, $00, $00
-
-.OAMData_61:
-	dsprite  -1, 4,  -4, 4, $00, $00
-	dsprite  -1, 4,  -3, 4, $01, $00
-	dsprite  -1, 4,  -2, 4, $02, $00
-	dsprite  -1, 4,  -1, 4, $03, $00
-	dsprite  -1, 4,   0, 4, $04, $00
-	dsprite  -1, 4,   1, 4, $05, $00
-	dsprite  -1, 4,   2, 4, $06, $00
-	dsprite  -2, 4,   1, 4, $07, $00
-	dsprite  -2, 4,   2, 4, $08, $00
-
-.OAMData_65:
-	dsprite  -2, 4,  -4, 4, $08, $20
-	dsprite  -2, 4,  -3, 4, $07, $20
-	dsprite  -1, 4,  -4, 4, $06, $20
-	dsprite  -1, 4,  -3, 4, $05, $20
-	dsprite  -1, 4,  -2, 4, $04, $20
-	dsprite  -1, 4,  -1, 4, $03, $20
-	dsprite  -1, 4,   0, 4, $02, $20
-	dsprite  -1, 4,   1, 4, $01, $20
-	dsprite  -1, 4,   2, 4, $00, $20
-
-.OAMData_d4:
-	dsprite   0, 0,  -4, 4, $00, $10
-	dsprite   0, 0,  -3, 4, $01, $10
-	dsprite   0, 0,  -2, 4, $02, $10
-	dsprite   0, 0,  -1, 4, $03, $10
-	dsprite   0, 0,   0, 4, $04, $10
-	dsprite   0, 0,   1, 4, $05, $10
-	dsprite   0, 0,   2, 4, $06, $10
-
-.OAMData_d6:
-	dsprite  -1, 0,  -4, 4, $00, $10
-	dsprite   0, 0,  -4, 4, $01, $10
-	dsprite  -1, 0,  -3, 4, $02, $10
-	dsprite   0, 0,  -3, 4, $03, $10
-	dsprite  -1, 0,  -2, 4, $04, $10
-	dsprite   0, 0,  -2, 4, $05, $10
-	dsprite  -1, 0,  -1, 4, $06, $10
-	dsprite   0, 0,  -1, 4, $07, $10
-	dsprite  -1, 0,   0, 4, $08, $10
-	dsprite   0, 0,   0, 4, $09, $10
-	dsprite  -1, 0,   1, 4, $0a, $10
-	dsprite   0, 0,   1, 4, $0b, $10
-	dsprite  -1, 0,   2, 4, $0c, $10
-	dsprite   0, 0,   2, 4, $0d, $10
-
-.OAMData_d5:
-	dsprite   0, 0,  -3, 0, $00, $11
-	dsprite   0, 0,  -2, 0, $01, $11
-	dsprite   0, 0,  -1, 0, $02, $11
-	dsprite   0, 0,   0, 0, $03, $11
-	dsprite   0, 0,   1, 0, $04, $11
-	dsprite   0, 0,   2, 0, $05, $11
-
-.OAMData_d7:
-	dsprite   0, 0,  -3, 0, $00, $11
-	dsprite   1, 0,  -3, 0, $01, $11
-	dsprite   0, 0,  -2, 0, $02, $11
-	dsprite   1, 0,  -2, 0, $03, $11
-	dsprite   0, 0,  -1, 0, $04, $11
-	dsprite   1, 0,  -1, 0, $05, $11
-	dsprite   0, 0,   0, 0, $06, $11
-	dsprite   1, 0,   0, 0, $07, $11
-	dsprite   0, 0,   1, 0, $08, $11
-	dsprite   1, 0,   1, 0, $09, $11
-	dsprite   0, 0,   2, 0, $0a, $11
-	dsprite   1, 0,   2, 0, $0b, $11
-
-.OAMData_6e:
-	dsprite  -2, 4,   0, 4, $00, $00
-	dsprite  -1, 4,  -2, 4, $01, $00
-	dsprite  -1, 4,  -1, 4, $02, $00
-	dsprite  -1, 4,   0, 4, $03, $00
-	dsprite   0, 4,  -2, 4, $04, $00
-
-.OAMData_6f:
-	dsprite  -1, 4,  -2, 4, $00, $00
-	dsprite  -1, 4,  -1, 4, $01, $00
-	dsprite  -1, 4,   0, 4, $02, $00
-
-.OAMData_77:
-	dsprite  -4, 4,   1, 4, $01, $60
-
-.OAMData_78:
-	dsprite  -4, 4,   1, 4, $00, $00
-	dsprite  -4, 4,   0, 4, $01, $60
-	dsprite  -3, 4,   1, 4, $01, $60
-
-.OAMData_79:
-	dsprite  -4, 4,   1, 4, $01, $00
-	dsprite  -4, 4,   0, 4, $00, $00
-	dsprite  -4, 4,  -1, 4, $01, $60
-	dsprite  -3, 4,   1, 4, $00, $00
-	dsprite  -3, 4,   0, 4, $01, $60
-	dsprite  -2, 4,   1, 4, $01, $60
-
-.OAMData_7a:
-	dsprite  -4, 4,  -2, 4, $01, $60
-	dsprite  -4, 4,  -1, 4, $00, $00
-	dsprite  -4, 4,   0, 4, $01, $00
-	dsprite  -3, 4,  -1, 4, $01, $60
-	dsprite  -3, 4,   0, 4, $00, $00
-	dsprite  -3, 4,   1, 4, $01, $00
-	dsprite  -2, 4,   0, 4, $01, $60
-	dsprite  -2, 4,   1, 4, $00, $00
-	dsprite  -1, 4,   1, 4, $01, $60
-
-.OAMData_7b:
-	dsprite  -4, 4,  -3, 4, $01, $60
-	dsprite  -4, 4,  -2, 4, $00, $00
-	dsprite  -4, 4,  -1, 4, $01, $00
-	dsprite  -3, 4,  -2, 4, $01, $60
-	dsprite  -3, 4,  -1, 4, $00, $00
-	dsprite  -3, 4,   0, 4, $01, $00
-	dsprite  -2, 4,  -1, 4, $01, $60
-	dsprite  -2, 4,   0, 4, $00, $00
-	dsprite  -2, 4,   1, 4, $01, $00
-	dsprite  -1, 4,   0, 4, $01, $60
-	dsprite  -1, 4,   1, 4, $00, $00
-	dsprite   0, 4,   1, 4, $01, $60
-
-.OAMData_7c:
-	dsprite  -4, 4,  -3, 4, $00, $00
-	dsprite  -4, 4,  -2, 4, $01, $00
-	dsprite  -3, 4,  -3, 4, $01, $60
-	dsprite  -3, 4,  -2, 4, $00, $00
-	dsprite  -3, 4,  -1, 4, $01, $00
-	dsprite  -2, 4,  -2, 4, $01, $60
-	dsprite  -2, 4,  -1, 4, $00, $00
-	dsprite  -2, 4,   0, 4, $01, $00
-	dsprite  -1, 4,  -1, 4, $01, $60
-	dsprite  -1, 4,   0, 4, $00, $00
-	dsprite  -1, 4,   1, 4, $01, $00
-	dsprite   0, 4,   0, 4, $01, $60
-	dsprite   0, 4,   1, 4, $00, $00
-	dsprite   1, 4,   1, 4, $01, $60
-
-.OAMData_7d:
-	dsprite  -4, 4,  -3, 4, $01, $00
-	dsprite  -3, 4,  -3, 4, $00, $00
-	dsprite  -3, 4,  -2, 4, $01, $00
-	dsprite  -2, 4,  -3, 4, $01, $60
-	dsprite  -2, 4,  -2, 4, $00, $00
-	dsprite  -2, 4,  -1, 4, $01, $00
-	dsprite  -1, 4,  -2, 4, $01, $60
-	dsprite  -1, 4,  -1, 4, $00, $00
-	dsprite  -1, 4,   0, 4, $01, $00
-	dsprite   0, 4,  -1, 4, $01, $60
-	dsprite   0, 4,   0, 4, $00, $00
-	dsprite   0, 4,   1, 4, $01, $00
-	dsprite   1, 4,   0, 4, $01, $60
-	dsprite   1, 4,   1, 4, $00, $00
-	dsprite   2, 4,   1, 4, $01, $60
-
-.OAMData_70:
-	dsprite  -2, 0,  -1, 0, $00, $00
-	dsprite  -1, 0,  -1, 0, $01, $00
-	dsprite  -2, 0,   0, 0, $00, $20
-	dsprite  -1, 0,   0, 0, $01, $20
-	dsprite   0, 0,  -1, 0, $01, $40
-	dsprite   1, 0,  -1, 0, $00, $40
-	dsprite   0, 0,   0, 0, $01, $60
-	dsprite   1, 0,   0, 0, $00, $60
-
-.OAMData_81:
-	dsprite  -1, 0,  -1, 0, $00, $00
-	dsprite  -1, 0,   0, 0, $01, $00
-	dsprite   0, 0,  -1, 0, $01, $60
-	dsprite   0, 0,   0, 0, $00, $60
-
-.OAMData_87:
-	dsprite  -2, 4,  -1, 0, $00, $00
-	dsprite  -2, 4,   0, 0, $01, $00
-	dsprite  -1, 4,  -1, 0, $02, $00
-	dsprite  -1, 4,   0, 0, $03, $00
-	dsprite  -1, 4,  -1, 0, $00, $00
-	dsprite  -1, 4,   0, 0, $01, $00
-	dsprite   0, 4,  -1, 0, $02, $00
-	dsprite   0, 4,   0, 0, $03, $00
-	dsprite  -3, 4,  -1, 0, $00, $00
-	dsprite  -3, 4,   0, 0, $01, $00
-	dsprite  -2, 4,  -1, 0, $02, $00
-	dsprite  -2, 4,   0, 0, $03, $00
-	dsprite   0, 4,  -1, 0, $00, $00
-	dsprite   0, 4,   0, 0, $01, $00
-	dsprite   1, 4,  -1, 0, $02, $00
-	dsprite   1, 4,   0, 0, $03, $00
-
-.OAMData_88:
-	dsprite  -2, 0,  -1, 0, $00, $00
-	dsprite  -2, 0,   0, 0, $01, $00
-	dsprite  -1, 0,  -1, 0, $02, $00
-	dsprite  -1, 0,   0, 0, $03, $00
-	dsprite  -1, 0,  -1, 0, $00, $00
-	dsprite  -1, 0,   0, 0, $01, $00
-	dsprite   0, 0,  -1, 0, $02, $00
-	dsprite   0, 0,   0, 0, $03, $00
-	dsprite   0, 0,  -1, 0, $00, $00
-	dsprite   0, 0,   0, 0, $01, $00
-	dsprite   1, 0,  -1, 0, $02, $00
-	dsprite   1, 0,   0, 0, $03, $00
-
-.OAMData_8a:
-	dsprite  -1, 4,  -1, 4, $00, $00
-	dsprite  -1, 0,   0, 4, $00, $00
-	dsprite  -2, 4,   1, 4, $00, $00
-	dsprite  -2, 0,   2, 4, $00, $00
-	dsprite  -3, 4,   3, 4, $00, $00
-	dsprite  -3, 0,   4, 4, $00, $00
-	dsprite  -4, 0,   5, 4, $00, $00
-	dsprite  -5, 4,   6, 4, $00, $00
-
-.OAMData_8e:
-	dsprite  -3, 4,  -1, 4, $00, $00
-	dsprite  -2, 4,  -1, 4, $01, $00
-	dsprite  -1, 4,  -1, 4, $02, $00
-	dsprite   0, 4,  -1, 4, $01, $40
-	dsprite   1, 4,  -1, 4, $00, $40
-
-.OAMData_8f:
-	dsprite  -1, 4,  -2, 0, $00, $00
-	dsprite  -1, 4,  -1, 0, $01, $00
-	dsprite  -1, 4,   0, 0, $02, $00
-	dsprite  -1, 4,   1, 0, $03, $00
-
-.OAMData_93:
-	dsprite  -1, 0,  -2, 4, $00, $00
-	dsprite  -1, 0,  -1, 4, $01, $00
-	dsprite  -1, 0,   0, 4, $02, $00
-	dsprite   0, 0,  -2, 4, $03, $00
-	dsprite   0, 0,  -1, 4, $04, $00
-	dsprite   0, 0,   0, 4, $05, $00
-
-.OAMData_99:
-	dsprite  -1, 0,  -1, 0, $00, $00
-	dsprite  -1, 0,   0, 0, $05, $00
-	dsprite   0, 0,  -1, 0, $01, $00
-	dsprite   0, 0,   0, 0, $05, $00
-
-.OAMData_9b:
-	dsprite  -4, 4,   1, 0, $00, $00
-	dsprite  -4, 4,   2, 0, $01, $00
-	dsprite  -3, 4,  -1, 0, $02, $00
-	dsprite  -3, 4,   0, 0, $03, $00
-	dsprite  -3, 4,   1, 0, $04, $00
-	dsprite  -3, 4,   2, 0, $05, $00
-	dsprite  -3, 4,   3, 0, $06, $00
-	dsprite  -2, 4,  -2, 0, $07, $00
-	dsprite  -2, 4,  -1, 0, $08, $00
-	dsprite  -2, 4,   0, 0, $09, $00
-	dsprite  -2, 4,   1, 0, $0a, $00
-	dsprite  -2, 4,   2, 0, $0b, $00
-	dsprite  -2, 4,   3, 0, $0c, $00
-	dsprite  -2, 4,   4, 0, $0d, $00
-	dsprite  -1, 4,  -3, 0, $0e, $00
-	dsprite  -1, 4,  -2, 0, $0f, $00
-	dsprite  -1, 4,  -1, 0, $10, $00
-	dsprite  -1, 4,   0, 0, $11, $00
-	dsprite  -1, 4,   1, 0, $12, $00
-	dsprite  -1, 4,   2, 0, $13, $00
-	dsprite   0, 4,  -5, 0, $14, $00
-	dsprite   0, 4,  -4, 0, $15, $00
-	dsprite   0, 4,  -3, 0, $16, $00
-	dsprite   0, 4,  -2, 0, $17, $00
-	dsprite   0, 4,  -1, 0, $18, $00
-	dsprite   0, 4,   0, 0, $19, $00
-	dsprite   0, 4,   1, 0, $1a, $00
-	dsprite   0, 4,   2, 0, $1b, $00
-	dsprite   0, 4,   3, 0, $1c, $00
-	dsprite   1, 4,  -5, 0, $1d, $00
-	dsprite   1, 4,  -4, 0, $1e, $00
-	dsprite   1, 4,  -2, 0, $1f, $00
-	dsprite   1, 4,  -1, 0, $20, $00
-	dsprite   1, 4,   0, 0, $21, $00
-	dsprite   1, 4,   1, 0, $22, $00
-	dsprite   2, 4,   0, 0, $23, $00
-
-.OAMData_9c:
-	dsprite   0, 4,  -1, 0, $02, $00
-	dsprite   0, 4,   0, 0, $03, $00
-	dsprite  -1, 4,  -1, 0, $01, $00
-	dsprite  -1, 4,   0, 0, $01, $20
-	dsprite  -2, 4,  -1, 0, $00, $00
-	dsprite  -2, 4,   0, 0, $00, $20
-
-.OAMData_9f:
-	dsprite  -1, 0,  -2, 0, $00, $00
-	dsprite  -1, 0,  -1, 0, $01, $00
-	dsprite  -1, 0,   0, 0, $02, $00
-	dsprite  -1, 0,   1, 0, $03, $00
-	dsprite   0, 0,  -2, 0, $04, $00
-	dsprite   0, 0,  -1, 0, $05, $00
-	dsprite   0, 0,   0, 0, $06, $00
-	dsprite   0, 0,   1, 0, $07, $00
-
-.OAMData_a0:
-	dsprite  -2, 4,  -1, 4, $00, $00
-	dsprite  -1, 4,  -1, 4, $00, $00
-	dsprite   0, 4,  -1, 4, $00, $00
-	dsprite  -3, 4,  -1, 4, $00, $00
-	dsprite   1, 4,  -1, 4, $00, $00
-	dsprite  -4, 4,  -1, 4, $00, $00
-	dsprite   2, 4,  -1, 4, $00, $00
-
-.OAMData_a4:
-	dsprite  -2, 4,  -2, 4, $00, $00
-	dsprite  -2, 4,  -1, 4, $01, $00
-	dsprite  -2, 4,   0, 4, $02, $00
-	dsprite  -1, 4,  -2, 4, $03, $00
-	dsprite  -1, 4,  -1, 4, $04, $00
-	dsprite  -1, 4,   0, 4, $05, $00
-	dsprite   0, 4,  -2, 4, $00, $40
-	dsprite   0, 4,  -1, 4, $01, $40
-	dsprite   0, 4,   0, 4, $02, $40
-
-.OAMData_ac:
-	dsprite  -1, 4,  -2, 0, $00, $00
-	dsprite  -1, 4,  -1, 0, $01, $00
-	dsprite  -1, 4,   0, 0, $01, $20
-	dsprite  -1, 4,   1, 0, $00, $20
-
-.OAMData_bc:
-	dsprite  -1, 4,  -3, 0, $00, $00
-	dsprite  -1, 4,  -2, 0, $01, $00
-	dsprite  -1, 4,  -1, 0, $02, $00
-	dsprite  -1, 4,   0, 0, $02, $20
-	dsprite  -1, 4,   1, 0, $01, $20
-	dsprite  -1, 4,   2, 0, $00, $20
-
-.OAMData_c1:
-	dsprite  -2, 0,  -2, 0, $00, $00
-	dsprite  -2, 0,  -1, 0, $01, $00
-	dsprite  -2, 0,   0, 0, $02, $00
-	dsprite  -2, 0,   1, 0, $00, $20
-	dsprite  -1, 0,  -2, 0, $03, $00
-	dsprite  -1, 0,  -1, 0, $04, $00
-	dsprite  -1, 0,   0, 0, $04, $20
-	dsprite  -1, 0,   1, 0, $05, $00
-	dsprite   0, 0,  -2, 0, $05, $60
-	dsprite   0, 0,  -1, 0, $04, $40
-	dsprite   0, 0,   0, 0, $04, $60
-	dsprite   0, 0,   1, 0, $03, $60
-	dsprite   1, 0,  -2, 0, $00, $40
-	dsprite   1, 0,  -1, 0, $02, $60
-	dsprite   1, 0,   0, 0, $01, $60
-	dsprite   1, 0,   1, 0, $00, $60
-
-.OAMData_c2:
-	dsprite  -1, 0,  -2, 0, $00, $00
-	dsprite  -1, 0,  -1, 0, $01, $00
-	dsprite  -1, 0,   0, 0, $00, $60
-	dsprite   0, 0,  -1, 0, $00, $00
-	dsprite   0, 0,   0, 0, $01, $00
-	dsprite   0, 0,   1, 0, $00, $60
-
-.OAMData_c8:
-	dsprite  -1, 0,   1, 4, $00, $00
-	dsprite  -1, 0,   2, 4, $01, $00
-	dsprite   0, 0,  -1, 4, $02, $00
-	dsprite   0, 0,   0, 4, $03, $00
-	dsprite   0, 0,   1, 4, $04, $00
-	dsprite   0, 0,   2, 4, $05, $00
-
-.OAMData_ca:
-	dsprite  -1, 0,  -1, 0, $00, $00
-	dsprite  -1, 0,   0, 0, $01, $60
-	dsprite   0, 0,  -1, 0, $01, $00
-	dsprite   0, 0,   0, 0, $01, $20
-
-.OAMData_cc:
-	dsprite  -2, 0, -13, 4, $00, $00
-	dsprite  -4, 0, -11, 4, $00, $00
-	dsprite  -1, 0,  -9, 4, $00, $00
-	dsprite  -5, 0,  -7, 4, $00, $00
-	dsprite  -3, 0,  -5, 4, $00, $00
-	dsprite  -5, 0,  -3, 4, $00, $00
-	dsprite  -3, 0,  -1, 4, $00, $00
-	dsprite  -3, 0,   0, 4, $00, $00
-	dsprite  -5, 0,   2, 4, $00, $00
-	dsprite   0, 0,   4, 4, $00, $00
-	dsprite  -2, 0,   6, 4, $00, $00
-	dsprite  -4, 0,   8, 4, $00, $00
-	dsprite  -2, 0,  10, 4, $00, $00
-; cfcf6
--- a/battle/objects/object_gfx.asm
+++ /dev/null
@@ -1,51 +1,0 @@
-anim_obj_gfx: MACRO
-; # tiles, label
-	db  \1
-	dba \2
-ENDM
-
-AnimObjGFX: ; cfcf6
-; entries correspond to ANIM_GFX_* constants
-	anim_obj_gfx  0, AnimObj00GFX
-	anim_obj_gfx 21, AnimObjHitGFX
-	anim_obj_gfx  6, AnimObjCutGFX
-	anim_obj_gfx  6, AnimObjFireGFX
-	anim_obj_gfx 20, AnimObjWaterGFX
-	anim_obj_gfx 26, AnimObjLightningGFX
-	anim_obj_gfx 18, AnimObjPlantGFX
-	anim_obj_gfx 12, AnimObjSmokeGFX
-	anim_obj_gfx  9, AnimObjExplosionGFX
-	anim_obj_gfx 17, AnimObjRocksGFX
-	anim_obj_gfx  6, AnimObjIceGFX
-	anim_obj_gfx 10, AnimObjPokeBallGFX
-	anim_obj_gfx  9, AnimObjPoisonGFX
-	anim_obj_gfx 13, AnimObjBubbleGFX
-	anim_obj_gfx 16, AnimObjNoiseGFX
-	anim_obj_gfx  2, AnimObjPowderGFX
-	anim_obj_gfx 11, AnimObjBeamGFX
-	anim_obj_gfx  9, AnimObjSpeedGFX
-	anim_obj_gfx  9, AnimObjChargeGFX
-	anim_obj_gfx 19, AnimObjWindGFX
-	anim_obj_gfx 10, AnimObjWhipGFX
-	anim_obj_gfx 12, AnimObjEggGFX
-	anim_obj_gfx 18, AnimObjRopeGFX
-	anim_obj_gfx 13, AnimObjPsychicGFX
-	anim_obj_gfx 10, AnimObjReflectGFX
-	anim_obj_gfx 27, AnimObjStatusGFX
-	anim_obj_gfx 12, AnimObjSandGFX
-	anim_obj_gfx 14, AnimObjWebGFX
-	anim_obj_gfx 16, AnimObjHazeGFX
-	anim_obj_gfx  7, AnimObjHornGFX
-	anim_obj_gfx  8, AnimObjFlowerGFX
-	anim_obj_gfx 40, AnimObjMiscGFX
-	anim_obj_gfx 36, AnimObjSkyAttackGFX
-	anim_obj_gfx 16, AnimObjGlobeGFX
-	anim_obj_gfx 48, AnimObjShapesGFX
-	anim_obj_gfx 18, AnimObjObjectsGFX
-	anim_obj_gfx 38, AnimObjShineGFX
-	anim_obj_gfx 35, AnimObjAngelsGFX
-	anim_obj_gfx 18, AnimObjWaveGFX
-	anim_obj_gfx 24, AnimObjAeroblastGFX
-	anim_obj_gfx  1, NULL
-	anim_obj_gfx  1, NULL
-; cfd9e
--- a/battle/sliding_intro.asm
+++ /dev/null
@@ -1,104 +1,0 @@
-BattleIntroSlidingPics: ; 4e980
-	ld a, [rSVBK]
-	push af
-	ld a, $5
-	ld [rSVBK], a
-	call .subfunction1
-	ld a, rSCX - $ff00
-	ld [hLCDCPointer], a
-	call .subfunction2
-	xor a
-	ld [hLCDCPointer], a
-	pop af
-	ld [rSVBK], a
-	ret
-; 4e998
-
-.subfunction1 ; 4e998
-	call .subfunction4
-	ld a, $90
-	ld [hSCX], a
-	ld a, %11100100
-	call DmgToCgbBGPals
-	lb de, %11100100, %11100100
-	call DmgToCgbObjPals
-	ret
-; 4e9ab
-
-.subfunction2 ; 4e9ab
-	ld d, $90
-	ld e, $72
-	ld a, $48
-	inc a
-.loop1
-	push af
-.loop2
-	ld a, [rLY]
-	cp $60
-	jr c, .loop2
-	ld a, d
-	ld [hSCX], a
-	call .subfunction5
-	inc e
-	inc e
-	dec d
-	dec d
-	pop af
-	push af
-	cp $1
-	jr z, .skip1
-	push de
-	call .subfunction3
-	pop de
-
-.skip1
-	call DelayFrame
-	pop af
-	dec a
-	jr nz, .loop1
-	ret
-; 4e9d6
-
-.subfunction3 ; 4e9d6
-	ld hl, Sprites + 1 ; x pixel
-	ld c, $12 ; 18
-	ld de, $4
-.loop3
-	dec [hl]
-	dec [hl]
-	add hl, de
-	dec c
-	jr nz, .loop3
-	ret
-; 4e9e5
-
-.subfunction4 ; 4e9e5
-	ld hl, LYOverrides
-	ld a, $90
-	ld bc, SCREEN_HEIGHT_PX
-	call ByteFill
-	ret
-; 4e9f1
-
-.subfunction5 ; 4e9f1
-	ld hl, LYOverrides
-	ld a, d
-	ld c, $3e ; 62
-.loop4
-	ld [hli], a
-	dec c
-	jr nz, .loop4
-	ld a, e
-	ld c, $22 ; 34
-.loop5
-	ld [hli], a
-	dec c
-	jr nz, .loop5
-	xor a
-	ld c, $30 ; 48
-.loop6
-	ld [hli], a
-	dec c
-	jr nz, .loop6
-	ret
-; 4ea0a
--- a/battle/trainer_huds.asm
+++ /dev/null
@@ -1,269 +1,0 @@
-BattleStart_TrainerHuds: ; 2c000
-	ld a, $e4
-	ld [rOBP0], a
-	call LoadBallIconGFX
-	call ShowPlayerMonsRemaining
-	ld a, [wBattleMode]
-	dec a
-	ret z
-	jp ShowOTTrainerMonsRemaining
-; 2c012
-
-EnemySwitch_TrainerHud: ; 2c012
-	ld a, $e4
-	ld [rOBP0], a
-	call LoadBallIconGFX
-	jp ShowOTTrainerMonsRemaining
-; 2c01c
-
-ShowPlayerMonsRemaining: ; 2c01c
-	call DrawPlayerPartyIconHUDBorder
-	ld hl, PartyMon1HP
-	ld de, PartyCount
-	call StageBallTilesData
-	; ldpixel wPlaceBallsX, 12, 12
-	ld a, 12 * 8
-	ld hl, wPlaceBallsX
-	ld [hli], a
-	ld [hl], a
-	ld a, 8
-	ld [wPlaceBallsDirection], a
-	ld hl, Sprites
-	jp LoadTrainerHudOAM
-; 2c03a
-
-ShowOTTrainerMonsRemaining: ; 2c03a
-	call DrawEnemyHUDBorder
-	ld hl, OTPartyMon1HP
-	ld de, OTPartyCount
-	call StageBallTilesData
-	; ldpixel wPlaceBallsX, 9, 4
-	ld hl, wPlaceBallsX
-	ld a, 9 * 8
-	ld [hli], a
-	ld [hl], 4 * 8
-	ld a, -8
-	ld [wPlaceBallsDirection], a
-	ld hl, Sprites + PARTY_LENGTH * 4
-	jp LoadTrainerHudOAM
-; 2c059
-
-StageBallTilesData: ; 2c059
-	ld a, [de]
-	push af
-	ld de, Buffer1
-	ld c, PARTY_LENGTH
-	ld a, $34 ; empty slot
-.loop1
-	ld [de], a
-	inc de
-	dec c
-	jr nz, .loop1
-	pop af
-	ld de, Buffer1
-.loop2
-	push af
-	call .GetHUDTile
-	inc de
-	pop af
-	dec a
-	jr nz, .loop2
-	ret
-; 2c075
-
-.GetHUDTile: ; 2c075
-	ld a, [hli]
-	and a
-	jr nz, .got_hp
-	ld a, [hl]
-	and a
-	ld b, $33 ; fainted
-	jr z, .fainted
-
-.got_hp
-	dec hl
-	dec hl
-	dec hl
-	ld a, [hl]
-	and a
-	ld b, $32 ; statused
-	jr nz, .load
-	dec b ; normal
-	jr .load
-
-.fainted
-	dec hl
-	dec hl
-	dec hl
-
-.load
-	ld a, b
-	ld [de], a
-	ld bc, PARTYMON_STRUCT_LENGTH + MON_HP - MON_STATUS
-	add hl, bc
-	ret
-; 2c095
-
-DrawPlayerHUDBorder: ; 2c095
-	ld hl, .tiles
-	ld de, wTrainerHUDTiles
-	ld bc, 4
-	call CopyBytes
-	hlcoord 18, 10
-	ld de, -1 ; start on right
-	jr PlaceHUDBorderTiles
-
-.tiles
-	db $73 ; right side
-	db $77 ; bottom right
-	db $6f ; bottom left
-	db $76 ; bottom side
-; 2c0ad
-
-DrawPlayerPartyIconHUDBorder: ; 2c0ad
-	ld hl, .tiles
-	ld de, wTrainerHUDTiles
-	ld bc, 4
-	call CopyBytes
-	hlcoord 18, 10
-	ld de, -1 ; start on right
-	jr PlaceHUDBorderTiles
-
-.tiles
-	db $73 ; right side
-	db $5c ; bottom right
-	db $6f ; bottom left
-	db $76 ; bottom side
-; 2c0c5
-
-DrawEnemyHUDBorder: ; 2c0c5
-	ld hl, .tiles
-	ld de, wTrainerHUDTiles
-	ld bc, 4
-	call CopyBytes
-	hlcoord 1, 2
-	ld de, 1 ; start on left
-	call PlaceHUDBorderTiles
-	ld a, [wBattleMode]
-	dec a
-	ret nz
-	ld a, [TempEnemyMonSpecies]
-	dec a
-	call CheckCaughtMon
-	ret z
-	hlcoord 1, 1
-	ld [hl], $5d
-	ret
-
-.tiles
-	db $6d ; left side
-	db $74 ; bottom left
-	db $78 ; bottom right
-	db $76 ; bottom side
-; 2c0f1
-
-PlaceHUDBorderTiles: ; 2c0f1
-	ld a, [wTrainerHUDTiles]
-	ld [hl], a
-	ld bc, SCREEN_WIDTH
-	add hl, bc
-	ld a, [StartFlypoint]
-	ld [hl], a
-	ld b, $8
-.loop
-	add hl, de
-	ld a, [MovementBuffer]
-	ld [hl], a
-	dec b
-	jr nz, .loop
-	add hl, de
-	ld a, [EndFlypoint]
-	ld [hl], a
-	ret
-; 2c10d
-
-LinkBattle_TrainerHuds: ; 2c10d
-	call LoadBallIconGFX
-	ld hl, PartyMon1HP
-	ld de, PartyCount
-	call StageBallTilesData
-	ld hl, wPlaceBallsX
-	ld a, 10 * 8
-	ld [hli], a
-	ld [hl], 8 * 8
-	ld a, $8
-	ld [wPlaceBallsDirection], a
-	ld hl, Sprites
-	call LoadTrainerHudOAM
-
-	ld hl, OTPartyMon1HP
-	ld de, OTPartyCount
-	call StageBallTilesData
-	ld hl, wPlaceBallsX
-	ld a, 10 * 8
-	ld [hli], a
-	ld [hl], 13 * 8
-	ld hl, Sprites + PARTY_LENGTH * 4
-	jp LoadTrainerHudOAM
-; 2c143
-
-LoadTrainerHudOAM: ; 2c143
-	ld de, Buffer1
-	ld c, PARTY_LENGTH
-.loop
-	ld a, [wPlaceBallsY]
-	ld [hli], a
-	ld a, [wPlaceBallsX]
-	ld [hli], a
-	ld a, [de]
-	ld [hli], a
-	ld a, $3
-	ld [hli], a
-	ld a, [wPlaceBallsX]
-	ld b, a
-	ld a, [wPlaceBallsDirection]
-	add b
-	ld [wPlaceBallsX], a
-	inc de
-	dec c
-	jr nz, .loop
-	ret
-; 2c165
-
-LoadBallIconGFX: ; 2c165
-	ld de, .gfx
-	ld hl, VTiles0 tile $31
-	lb bc, BANK(LoadBallIconGFX), 4
-	call Get2bpp_2
-	ret
-; 2c172
-
-.gfx ; 2c172
-INCBIN "gfx/battle/balls.2bpp"
-; 2c1b2
-
-_ShowLinkBattleParticipants: ; 2c1b2
-	call ClearBGPalettes
-	call LoadFontsExtra
-	hlcoord 2, 3
-	ld b, 9
-	ld c, 14
-	call TextBox
-	hlcoord 4, 5
-	ld de, PlayerName
-	call PlaceString
-	hlcoord 4, 10
-	ld de, OTPlayerName
-	call PlaceString
-	hlcoord 9, 8
-	ld a, "<BOLD_V>"
-	ld [hli], a
-	ld [hl], "<BOLD_S>"
-	farcall LinkBattle_TrainerHuds ; no need to farcall
-	ld b, SCGB_DIPLOMA
-	call GetSGBLayout
-	call SetPalettes
-	ld a, $e4
-	ld [rOBP0], a
-	ret
-; 2c1ef
--- a/battle/type_matchup.asm
+++ /dev/null
@@ -1,128 +1,0 @@
-; The multiplier is divided by 10, so we can use values like 0.5.
-
-SUPER_EFFECTIVE    EQU 20
-NOT_VERY_EFFECTIVE EQU 05
-NO_EFFECT          EQU 00
-
-; All other cases are neutral (1x).
-
-	;  attacker  defender*=
-
-	db NORMAL,    ROCK,      NOT_VERY_EFFECTIVE
-	db NORMAL,    STEEL,     NOT_VERY_EFFECTIVE
-	db FIRE,      FIRE,      NOT_VERY_EFFECTIVE
-	db FIRE,      WATER,     NOT_VERY_EFFECTIVE
-	db FIRE,      GRASS,     SUPER_EFFECTIVE
-	db FIRE,      ICE,       SUPER_EFFECTIVE
-	db FIRE,      BUG,       SUPER_EFFECTIVE
-	db FIRE,      ROCK,      NOT_VERY_EFFECTIVE
-	db FIRE,      DRAGON,    NOT_VERY_EFFECTIVE
-	db FIRE,      STEEL,     SUPER_EFFECTIVE
-	db WATER,     FIRE,      SUPER_EFFECTIVE
-	db WATER,     WATER,     NOT_VERY_EFFECTIVE
-	db WATER,     GRASS,     NOT_VERY_EFFECTIVE
-	db WATER,     GROUND,    SUPER_EFFECTIVE
-	db WATER,     ROCK,      SUPER_EFFECTIVE
-	db WATER,     DRAGON,    NOT_VERY_EFFECTIVE
-	db ELECTRIC,  WATER,     SUPER_EFFECTIVE
-	db ELECTRIC,  ELECTRIC,  NOT_VERY_EFFECTIVE
-	db ELECTRIC,  GRASS,     NOT_VERY_EFFECTIVE
-	db ELECTRIC,  GROUND,    NO_EFFECT
-	db ELECTRIC,  FLYING,    SUPER_EFFECTIVE
-	db ELECTRIC,  DRAGON,    NOT_VERY_EFFECTIVE
-	db GRASS,     FIRE,      NOT_VERY_EFFECTIVE
-	db GRASS,     WATER,     SUPER_EFFECTIVE
-	db GRASS,     GRASS,     NOT_VERY_EFFECTIVE
-	db GRASS,     POISON,    NOT_VERY_EFFECTIVE
-	db GRASS,     GROUND,    SUPER_EFFECTIVE
-	db GRASS,     FLYING,    NOT_VERY_EFFECTIVE
-	db GRASS,     BUG,       NOT_VERY_EFFECTIVE
-	db GRASS,     ROCK,      SUPER_EFFECTIVE
-	db GRASS,     DRAGON,    NOT_VERY_EFFECTIVE
-	db GRASS,     STEEL,     NOT_VERY_EFFECTIVE
-	db ICE,       WATER,     NOT_VERY_EFFECTIVE
-	db ICE,       GRASS,     SUPER_EFFECTIVE
-	db ICE,       ICE,       NOT_VERY_EFFECTIVE
-	db ICE,       GROUND,    SUPER_EFFECTIVE
-	db ICE,       FLYING,    SUPER_EFFECTIVE
-	db ICE,       DRAGON,    SUPER_EFFECTIVE
-	db ICE,       STEEL,     NOT_VERY_EFFECTIVE
-	db ICE,       FIRE,      NOT_VERY_EFFECTIVE
-	db FIGHTING,  NORMAL,    SUPER_EFFECTIVE
-	db FIGHTING,  ICE,       SUPER_EFFECTIVE
-	db FIGHTING,  POISON,    NOT_VERY_EFFECTIVE
-	db FIGHTING,  FLYING,    NOT_VERY_EFFECTIVE
-	db FIGHTING,  PSYCHIC,   NOT_VERY_EFFECTIVE
-	db FIGHTING,  BUG,       NOT_VERY_EFFECTIVE
-	db FIGHTING,  ROCK,      SUPER_EFFECTIVE
-	db FIGHTING,  DARK,      SUPER_EFFECTIVE
-	db FIGHTING,  STEEL,     SUPER_EFFECTIVE
-	db POISON,    GRASS,     SUPER_EFFECTIVE
-	db POISON,    POISON,    NOT_VERY_EFFECTIVE
-	db POISON,    GROUND,    NOT_VERY_EFFECTIVE
-	db POISON,    ROCK,      NOT_VERY_EFFECTIVE
-	db POISON,    GHOST,     NOT_VERY_EFFECTIVE
-	db POISON,    STEEL,     NO_EFFECT
-	db GROUND,    FIRE,      SUPER_EFFECTIVE
-	db GROUND,    ELECTRIC,  SUPER_EFFECTIVE
-	db GROUND,    GRASS,     NOT_VERY_EFFECTIVE
-	db GROUND,    POISON,    SUPER_EFFECTIVE
-	db GROUND,    FLYING,    NO_EFFECT
-	db GROUND,    BUG,       NOT_VERY_EFFECTIVE
-	db GROUND,    ROCK,      SUPER_EFFECTIVE
-	db GROUND,    STEEL,     SUPER_EFFECTIVE
-	db FLYING,    ELECTRIC,  NOT_VERY_EFFECTIVE
-	db FLYING,    GRASS,     SUPER_EFFECTIVE
-	db FLYING,    FIGHTING,  SUPER_EFFECTIVE
-	db FLYING,    BUG,       SUPER_EFFECTIVE
-	db FLYING,    ROCK,      NOT_VERY_EFFECTIVE
-	db FLYING,    STEEL,     NOT_VERY_EFFECTIVE
-	db PSYCHIC,   FIGHTING,  SUPER_EFFECTIVE
-	db PSYCHIC,   POISON,    SUPER_EFFECTIVE
-	db PSYCHIC,   PSYCHIC,   NOT_VERY_EFFECTIVE
-	db PSYCHIC,   DARK,      NO_EFFECT
-	db PSYCHIC,   STEEL,     NOT_VERY_EFFECTIVE
-	db BUG,       FIRE,      NOT_VERY_EFFECTIVE
-	db BUG,       GRASS,     SUPER_EFFECTIVE
-	db BUG,       FIGHTING,  NOT_VERY_EFFECTIVE
-	db BUG,       POISON,    NOT_VERY_EFFECTIVE
-	db BUG,       FLYING,    NOT_VERY_EFFECTIVE
-	db BUG,       PSYCHIC,   SUPER_EFFECTIVE
-	db BUG,       GHOST,     NOT_VERY_EFFECTIVE
-	db BUG,       DARK,      SUPER_EFFECTIVE
-	db BUG,       STEEL,     NOT_VERY_EFFECTIVE
-	db ROCK,      FIRE,      SUPER_EFFECTIVE
-	db ROCK,      ICE,       SUPER_EFFECTIVE
-	db ROCK,      FIGHTING,  NOT_VERY_EFFECTIVE
-	db ROCK,      GROUND,    NOT_VERY_EFFECTIVE
-	db ROCK,      FLYING,    SUPER_EFFECTIVE
-	db ROCK,      BUG,       SUPER_EFFECTIVE
-	db ROCK,      STEEL,     NOT_VERY_EFFECTIVE
-	db GHOST,     NORMAL,    NO_EFFECT
-	db GHOST,     PSYCHIC,   SUPER_EFFECTIVE
-	db GHOST,     DARK,      NOT_VERY_EFFECTIVE
-	db GHOST,     STEEL,     NOT_VERY_EFFECTIVE
-	db GHOST,     GHOST,     SUPER_EFFECTIVE
-	db DRAGON,    DRAGON,    SUPER_EFFECTIVE
-	db DRAGON,    STEEL,     NOT_VERY_EFFECTIVE
-	db DARK,      FIGHTING,  NOT_VERY_EFFECTIVE
-	db DARK,      PSYCHIC,   SUPER_EFFECTIVE
-	db DARK,      GHOST,     SUPER_EFFECTIVE
-	db DARK,      DARK,      NOT_VERY_EFFECTIVE
-	db DARK,      STEEL,     NOT_VERY_EFFECTIVE
-	db STEEL,     FIRE,      NOT_VERY_EFFECTIVE
-	db STEEL,     WATER,     NOT_VERY_EFFECTIVE
-	db STEEL,     ELECTRIC,  NOT_VERY_EFFECTIVE
-	db STEEL,     ICE,       SUPER_EFFECTIVE
-	db STEEL,     ROCK,      SUPER_EFFECTIVE
-	db STEEL,     STEEL,     NOT_VERY_EFFECTIVE
-
-
-; Foresight removes Ghost's immunities.
-
-	db $fe
-
-	db NORMAL,    GHOST,     NO_EFFECT
-	db FIGHTING,  GHOST,     NO_EFFECT
-
-	db $ff ; end
--- a/battle/used_move_text.asm
+++ /dev/null
@@ -1,341 +1,0 @@
-DisplayUsedMoveText: ; 105db0
-; battle command 03
-	ld hl, UsedMoveText
-	call BattleTextBox
-	jp WaitBGMap
-; 105db9
-
-
-UsedMoveText: ; 105db9
-; this is a stream of text and asm from 105db9 to 105ef6
-
-	text_jump _ActorNameText
-	start_asm
-	ld a, [hBattleTurn]
-	and a
-	jr nz, .start
-
-	ld a, [wPlayerMoveStruct + MOVE_ANIM]
-	call UpdateUsedMoves
-
-.start
-	ld a, BATTLE_VARS_LAST_MOVE
-	call GetBattleVarAddr
-	ld d, h
-	ld e, l
-
-	ld a, BATTLE_VARS_LAST_COUNTER_MOVE
-	call GetBattleVarAddr
-
-	ld a, BATTLE_VARS_MOVE_ANIM
-	call GetBattleVar
-	ld [wd265], a
-
-	push hl
-	farcall CheckUserIsCharging
-	pop hl
-	jr nz, .grammar
-
-	; update last move
-	ld a, [wd265]
-	ld [hl], a
-	ld [de], a
-
-.grammar
-	call GetMoveGrammar
-; wd265 now contains MoveGrammar
-
-
-; everything except 'instead' made redundant in localization
-
-	; check obedience
-	ld a, [AlreadyDisobeyed]
-	and a
-	ld hl, UsedMove2Text
-	ret nz
-
-	; check move grammar
-	ld a, [wd265]
-	cp $3
-	ld hl, UsedMove2Text
-	ret c
-	ld hl, UsedMove1Text
-	ret
-; 105e04
-
-UsedMove1Text: ; 105e04
-	text_jump _UsedMove1Text
-	start_asm
-	jr UsedMoveText_CheckObedience
-; 105e0b
-
-UsedMove2Text: ; 105e0b
-	text_jump _UsedMove2Text
-	start_asm
-UsedMoveText_CheckObedience: ; 105e10
-; check obedience
-	ld a, [AlreadyDisobeyed]
-	and a
-	jr z, .GetMoveNameText
-; print "instead,"
-	ld hl, .UsedInsteadText
-	ret
-; 105e1a
-
-.UsedInsteadText:
-	text_jump _UsedInsteadText
-	start_asm
-.GetMoveNameText:
-	ld hl, MoveNameText
-	ret
-; 105e23
-
-MoveNameText: ; 105e23
-	text_jump _MoveNameText
-	start_asm
-; get start address
-	ld hl, .endusedmovetexts
-
-; get move id
-	ld a, [wd265]
-
-; 2-byte pointer
-	add a
-
-; seek
-	push bc
-	ld b, $0
-	ld c, a
-	add hl, bc
-	pop bc
-
-; get pointer to usedmovetext ender
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	ret
-; 105e39
-
-.endusedmovetexts ; 105e39
-	dw EndUsedMove1Text
-	dw EndUsedMove2Text
-	dw EndUsedMove3Text
-	dw EndUsedMove4Text
-	dw EndUsedMove5Text
-; 105e43
-
-EndUsedMove1Text: ; 105e43
-	text_jump _EndUsedMove1Text
-	db "@"
-; 105e48
-EndUsedMove2Text: ; 105e48
-	text_jump _EndUsedMove2Text
-	db "@"
-; 105e4d
-EndUsedMove3Text: ; 105e4d
-	text_jump _EndUsedMove3Text
-	db "@"
-; 105e52
-EndUsedMove4Text: ; 105e52
-	text_jump _EndUsedMove4Text
-	db "@"
-; 105e57
-EndUsedMove5Text: ; 105e57
-	text_jump _EndUsedMove5Text
-	db "@"
-; 105e5c
-
-
-GetMoveGrammar: ; 105e5c
-; store move grammar type in wd265
-
-	push bc
-; c = move id
-	ld a, [wd265]
-	ld c, a
-	ld b, $0
-
-; read grammar table
-	ld hl, MoveGrammar
-.loop
-	ld a, [hli]
-; end of table?
-	cp $ff
-	jr z, .end
-; match?
-	cp c
-	jr z, .end
-; advance grammar type at $00
-	and a
-	jr nz, .loop
-; next grammar type
-	inc b
-	jr .loop
-
-.end
-; wd265 now contains move grammar
-	ld a, b
-	ld [wd265], a
-
-; we're done
-	pop bc
-	ret
-; 105e7a
-
-MoveGrammar: ; 105e7a
-; made redundant in localization
-; each move is given an identifier for what usedmovetext to use (0-4):
-
-; 0
-	db SWORDS_DANCE
-	db GROWTH
-	db STRENGTH
-	db HARDEN
-	db MINIMIZE
-	db SMOKESCREEN
-	db WITHDRAW
-	db DEFENSE_CURL
-	db EGG_BOMB
-	db SMOG
-	db BONE_CLUB
-	db FLASH
-	db SPLASH
-	db ACID_ARMOR
-	db BONEMERANG
-	db REST
-	db SHARPEN
-	db SUBSTITUTE
-	db MIND_READER
-	db SNORE
-	db PROTECT
-	db SPIKES
-	db ENDURE
-	db ROLLOUT
-	db SWAGGER
-	db SLEEP_TALK
-	db HIDDEN_POWER
-	db PSYCH_UP
-	db EXTREMESPEED
-	db 0 ; end set
-
-; 1
-	db RECOVER
-	db TELEPORT
-	db BIDE
-	db SELFDESTRUCT
-	db AMNESIA
-	db FLAIL
-	db 0 ; end set
-
-; 2
-	db MEDITATE
-	db AGILITY
-	db MIMIC
-	db DOUBLE_TEAM
-	db BARRAGE
-	db TRANSFORM
-	db STRUGGLE
-	db SCARY_FACE
-	db 0 ; end set
-
-; 3
-	db POUND
-	db SCRATCH
-	db VICEGRIP
-	db WING_ATTACK
-	db FLY
-	db BIND
-	db SLAM
-	db HORN_ATTACK
-	db WRAP
-	db THRASH
-	db TAIL_WHIP
-	db LEER
-	db BITE
-	db GROWL
-	db ROAR
-	db SING
-	db PECK
-	db ABSORB
-	db STRING_SHOT
-	db EARTHQUAKE
-	db FISSURE
-	db DIG
-	db TOXIC
-	db SCREECH
-	db METRONOME
-	db LICK
-	db CLAMP
-	db CONSTRICT
-	db POISON_GAS
-	db BUBBLE
-	db SLASH
-	db SPIDER_WEB
-	db NIGHTMARE
-	db CURSE
-	db FORESIGHT
-	db CHARM
-	db ATTRACT
-	db ROCK_SMASH
-	db 0 ; end set
-
-; all other moves = 4
-	db $ff ; end
-; 105ed0
-
-
-UpdateUsedMoves: ; 105ed0
-; append move a to PlayerUsedMoves unless it has already been used
-
-	push bc
-; start of list
-	ld hl, PlayerUsedMoves
-; get move id
-	ld b, a
-; next count
-	ld c, NUM_MOVES
-
-.loop
-; get move from the list
-	ld a, [hli]
-; not used yet?
-	and a
-	jr z, .add
-; already used?
-	cp b
-	jr z, .quit
-; next byte
-	dec c
-	jr nz, .loop
-
-; if the list is full and the move hasn't already been used
-; shift the list back one byte, deleting the first move used
-; this can occur with struggle or a new learned move
-	ld hl, PlayerUsedMoves + 1
-; 1 = 2
-	ld a, [hld]
-	ld [hli], a
-; 2 = 3
-	inc hl
-	ld a, [hld]
-	ld [hli], a
-; 3 = 4
-	inc hl
-	ld a, [hld]
-	ld [hl], a
-; 4 = new move
-	ld a, b
-	ld [PlayerUsedMoves + 3], a
-	jr .quit
-
-.add
-; go back to the byte we just inced from
-	dec hl
-; add the new move
-	ld [hl], b
-
-.quit
-; list updated
-	pop bc
-	ret
-; 105ef6
--- a/constants.asm
+++ b/constants.asm
@@ -35,6 +35,7 @@
 INCLUDE "constants/npctrade_constants.asm"
 INCLUDE "constants/sprite_constants.asm"
 INCLUDE "constants/sprite_data_constants.asm"
+INCLUDE "constants/sprite_anim_constants.asm"
 INCLUDE "constants/tileset_constants.asm"
 INCLUDE "constants/collision_constants.asm"
 INCLUDE "constants/cgb_constants.asm"
--- a/constants/animation_constants.asm
+++ b/constants/animation_constants.asm
@@ -26,7 +26,7 @@
 	const BATTLEANIMSTRUCT_17
 BATTLEANIMSTRUCT_LENGTH EQU const_value
 
-; BattleAnimObjects indexes (see battle/objects/data.asm)
+; BattleAnimObjects indexes (see data/anims/objects.asm)
 	const_def
 	const ANIM_OBJ_00
 	const ANIM_OBJ_01
@@ -217,7 +217,7 @@
 	const ANIM_OBJ_BA
 	const ANIM_OBJ_BB
 
-; DoBattleAnimFrame arguments (see battle/objects/functions.asm)
+; DoBattleAnimFrame arguments (see engine/anims/functions.asm)
 	const_def
 	const BATTLEANIMFUNC_00
 	const BATTLEANIMFUNC_01
@@ -300,7 +300,7 @@
 	const BATTLEANIMFUNC_4E
 	const BATTLEANIMFUNC_4F
 
-; BattleAnimFrameData indexes (see battle/objects/framesets.asm)
+; BattleAnimFrameData indexes (see data/anims/framesets.asm)
 	const_def
 	const BATTLEANIMFRAMESET_00
 	const BATTLEANIMFRAMESET_01
@@ -488,7 +488,7 @@
 	const BATTLEANIMFRAMESET_B7
 	const BATTLEANIMFRAMESET_B8
 
-; BattleAnimOAMData indexes (see battle/objects/oam.asm)
+; BattleAnimOAMData indexes (see data/anims/oam.asm)
 	const_def
 	const BATTLEANIMOAMSET_00
 	const BATTLEANIMOAMSET_01
@@ -707,7 +707,7 @@
 	const BATTLEANIMOAMSET_D6
 	const BATTLEANIMOAMSET_D7
 
-; BattleBGEffects indexes (see battle/bg_effects.asm)
+; BattleBGEffects indexes (see engine/anims/bg_effects.asm)
 const_value SET 1
 	const ANIM_BG_FLASH_INVERTED
 	const ANIM_BG_FLASH_WHITE
@@ -763,19 +763,7 @@
 	const ANIM_BG_WOBBLE_MON
 	const ANIM_BG_35
 
-; PokeAnims indexes (see gfx/pokemon/animation.asm)
-	const_def
-	const ANIM_MON_SLOW
-	const ANIM_MON_NORMAL
-	const ANIM_MON_MENU
-	const ANIM_MON_TRADE
-	const ANIM_MON_EVOLVE
-	const ANIM_MON_HATCH
-	const ANIM_MON_UNUSED
-	const ANIM_MON_EGG1
-	const ANIM_MON_EGG2
-
-; AnimObjGFX indexes (see battle/objects/object_gfx.asm)
+; AnimObjGFX indexes (see data/anims/object_gfx.asm)
 const_value SET 1
 	const ANIM_GFX_HIT
 	const ANIM_GFX_CUT
--- a/constants/battle_constants.asm
+++ b/constants/battle_constants.asm
@@ -30,7 +30,7 @@
 	const ABILITY ; used for BattleCommand_Curse
 NUM_LEVEL_STATS EQU const_value
 
-; move struct members (see battle/moves/moves.asm)
+; move struct members (see data/moves/moves.asm)
 	const_def
 	const MOVE_ANIM   ; 0
 	const MOVE_EFFECT ; 1
@@ -213,7 +213,7 @@
 	const WEATHER_SUN_END
 	const WEATHER_SANDSTORM_END
 
-; MoveEffectsPointers indexes (see battle/moves/move_effects_pointers.asm)
+; MoveEffectsPointers indexes (see data/moves/move_effects_pointers.asm)
 	const_def
 	const EFFECT_NORMAL_HIT
 	const EFFECT_SLEEP
--- a/constants/item_constants.asm
+++ b/constants/item_constants.asm
@@ -197,7 +197,7 @@
 	const MIRAGE_MAIL  ; $BD
 	const ITEM_BE      ; $BE
 
-; see data/tmhm_moves.asm for moves
+; see data/moves/tmhm_moves.asm for moves
 	add_tm DYNAMICPUNCH ; $BF
 	add_tm HEADBUTT     ; $C0
 	add_tm CURSE        ; $C1
--- a/constants/map_setup_constants.asm
+++ b/constants/map_setup_constants.asm
@@ -1,27 +1,19 @@
 ; hMapEntryMethod values
-; MapSetupScripts indexes (see engine/map_setup.asm)
+; MapSetupScripts indexes (see data/maps/map_setup_scripts.asm)
 const_value SET $f1
-	const MAPSETUP_WARP
-	const MAPSETUP_CONTINUE
-	const MAPSETUP_RELOADMAP
-	const MAPSETUP_TELEPORT
-	const MAPSETUP_DOOR
-	const MAPSETUP_FALL
-	const MAPSETUP_CONNECTION
-	const MAPSETUP_LINKRETURN
-	const MAPSETUP_TRAIN
-	const MAPSETUP_SUBMENU
-	const MAPSETUP_BADWARP
-	const MAPSETUP_FLY
+	const MAPSETUP_WARP       ; f1
+	const MAPSETUP_CONTINUE   ; f2
+	const MAPSETUP_RELOADMAP  ; f3
+	const MAPSETUP_TELEPORT   ; f4
+	const MAPSETUP_DOOR       ; f5
+	const MAPSETUP_FALL       ; f6
+	const MAPSETUP_CONNECTION ; f7
+	const MAPSETUP_LINKRETURN ; f8
+	const MAPSETUP_TRAIN      ; f9
+	const MAPSETUP_SUBMENU    ; fa
+	const MAPSETUP_BADWARP    ; fb
+	const MAPSETUP_FLY        ; fc
 
-; callback types
-const_value SET 1
-	const MAPCALLBACK_TILES
-	const MAPCALLBACK_OBJECTS
-	const MAPCALLBACK_CMDQUEUE
-	const MAPCALLBACK_SPRITES
-	const MAPCALLBACK_NEWMAP
-
 ; MapSetupCommands indexes (see engine/map_setup.asm)
 ; Names taken from Condensation water's scripting compendium
 ; https://hax.iimarck.us/files/scriptingcodes_eng.htm
@@ -73,3 +65,11 @@
 	const map_text_scroll_off     ; 2c
 	const map_stop_script         ; 2d
 map_end EQU -1
+
+; callback types
+const_value SET 1
+	const MAPCALLBACK_TILES
+	const MAPCALLBACK_OBJECTS
+	const MAPCALLBACK_CMDQUEUE
+	const MAPCALLBACK_SPRITES
+	const MAPCALLBACK_NEWMAP
--- a/constants/move_constants.asm
+++ b/constants/move_constants.asm
@@ -1,9 +1,9 @@
 ; move ids
 ; indexes for:
-; - MoveDescriptions (see battle/moves/move_descriptions.asm)
-; - Moves (see battle/moves/moves.asm)
-; - MoveNames (see battle/move_names.asm)
-; - BattleAnimations (see battle/anims.asm)
+; - Moves (see data/moves/moves.asm)
+; - MoveNames (see data/moves/move_names.asm)
+; - MoveDescriptions (see data/moves/move_descriptions.asm)
+; - BattleAnimations (see data/moves/move_anims.asm)
 	const_def
 	const NO_MOVE      ; 00
 	const POUND        ; 01
--- a/constants/pokemon_data_constants.asm
+++ b/constants/pokemon_data_constants.asm
@@ -192,6 +192,18 @@
 FISHSWARM_REMORAID EQU 2
 
 
+; PokeAnims indexes (see gfx/pokemon/animation.asm)
+	const_def
+	const ANIM_MON_SLOW
+	const ANIM_MON_NORMAL
+	const ANIM_MON_MENU
+	const ANIM_MON_TRADE
+	const ANIM_MON_EVOLVE
+	const ANIM_MON_HATCH
+	const ANIM_MON_UNUSED
+	const ANIM_MON_EGG1
+	const ANIM_MON_EGG2
+
 ; MonMenuOptions indexes (see engine/mon_menu.asm)
 const_value SET 1
 ; moves
--- /dev/null
+++ b/constants/sprite_anim_constants.asm
@@ -1,0 +1,316 @@
+; 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
+
+; SpriteAnimSeqData indexes (see data/sprites/sequences.asm)
+	const_def
+	const SPRITE_ANIM_INDEX_PARTY_MON               ; 00
+	const SPRITE_ANIM_INDEX_GS_TITLE_TRAIL          ; 01
+	const SPRITE_ANIM_INDEX_NAMING_SCREEN_CURSOR    ; 02
+	const SPRITE_ANIM_INDEX_GAMEFREAK_LOGO          ; 03
+	const SPRITE_ANIM_INDEX_GS_INTRO_STAR           ; 04
+	const SPRITE_ANIM_INDEX_GS_INTRO_SPARKLE        ; 05
+	const SPRITE_ANIM_INDEX_SLOTS_GOLEM             ; 06
+	const SPRITE_ANIM_INDEX_SLOTS_CHANSEY           ; 07
+	const SPRITE_ANIM_INDEX_SLOTS_EGG               ; 08
+	const SPRITE_ANIM_INDEX_COMPOSE_MAIL_CURSOR     ; 09
+	const SPRITE_ANIM_INDEX_RED_WALK                ; 0a
+	const SPRITE_ANIM_INDEX_UNUSED_CURSOR           ; 0b
+	const SPRITE_ANIM_INDEX_DUMMY_GAME              ; 0c
+	const SPRITE_ANIM_INDEX_POKEGEAR_ARROW          ; 0d
+	const SPRITE_ANIM_INDEX_TRADE_POKE_BALL         ; 0e
+	const SPRITE_ANIM_INDEX_TRADE_POOF              ; 0f
+	const SPRITE_ANIM_INDEX_TRADE_TUBE_BULGE        ; 10
+	const SPRITE_ANIM_INDEX_TRADEMON_ICON           ; 11
+	const SPRITE_ANIM_INDEX_TRADEMON_BUBBLE         ; 12
+	const SPRITE_ANIM_INDEX_EVOLUTION_BALL_OF_LIGHT ; 13
+	const SPRITE_ANIM_INDEX_RADIO_TUNING_KNOB       ; 14
+	const SPRITE_ANIM_INDEX_MAGNET_TRAIN_RED        ; 15
+	const SPRITE_ANIM_INDEX_LEAF                    ; 16
+	const SPRITE_ANIM_INDEX_CUT_TREE                ; 17
+	const SPRITE_ANIM_INDEX_FLY_LEAF                ; 18
+	const SPRITE_ANIM_INDEX_EGG_CRACK               ; 19
+	const SPRITE_ANIM_INDEX_1A                      ; 1a
+	const SPRITE_ANIM_INDEX_HEADBUTT                ; 1b
+	const SPRITE_ANIM_INDEX_EGG_HATCH               ; 1c
+	const SPRITE_ANIM_INDEX_1D                      ; 1d
+	const SPRITE_ANIM_INDEX_BLUE_WALK               ; 1e
+	const SPRITE_ANIM_INDEX_MAGNET_TRAIN_BLUE       ; 1f
+	const SPRITE_ANIM_INDEX_MOBILE_TRADE_SENT_BALL  ; 20
+	const SPRITE_ANIM_INDEX_MOBILE_TRADE_OT_BALL    ; 21
+	const SPRITE_ANIM_INDEX_MOBILE_22               ; 22
+	const SPRITE_ANIM_INDEX_MOBILE_23               ; 23
+	const SPRITE_ANIM_INDEX_MOBILE_24               ; 24
+	const SPRITE_ANIM_INDEX_MOBILE_25               ; 25
+	const SPRITE_ANIM_INDEX_INTRO_SUICUNE           ; 26
+	const SPRITE_ANIM_INDEX_INTRO_PICHU             ; 27
+	const SPRITE_ANIM_INDEX_INTRO_WOOPER            ; 28
+	const SPRITE_ANIM_INDEX_INTRO_UNOWN             ; 29
+	const SPRITE_ANIM_INDEX_INTRO_UNOWN_F           ; 2a
+	const SPRITE_ANIM_INDEX_INTRO_SUICUNE_AWAY      ; 2b
+	const SPRITE_ANIM_INDEX_CELEBI                  ; 2c
+
+; DoAnimFrame.Jumptable indexes (see engine/sprite_anims.asm)
+	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_TITLE_TRAIL       ; 04
+	const SPRITE_ANIM_SEQ_NAMING_SCREEN_CURSOR ; 05
+	const SPRITE_ANIM_SEQ_GAMEFREAK_LOGO       ; 06
+	const SPRITE_ANIM_SEQ_GS_INTRO_STAR        ; 07
+	const SPRITE_ANIM_SEQ_GS_INTRO_SPARKLE     ; 08
+	const SPRITE_ANIM_SEQ_SLOTS_GOLEM          ; 09
+	const SPRITE_ANIM_SEQ_SLOTS_CHANSEY        ; 0a
+	const SPRITE_ANIM_SEQ_SLOTS_EGG            ; 0b
+	const SPRITE_ANIM_SEQ_MAIL_CURSOR          ; 0c
+	const SPRITE_ANIM_SEQ_FOR_UNUSED_CURSOR    ; 0d
+	const SPRITE_ANIM_SEQ_DUMMY_GAME_CURSOR    ; 0e
+	const SPRITE_ANIM_SEQ_POKEGEAR_ARROW       ; 0f
+	const SPRITE_ANIM_SEQ_TRADE_POKE_BALL      ; 10
+	const SPRITE_ANIM_SEQ_TRADE_TUBE_BULGE     ; 11
+	const SPRITE_ANIM_SEQ_TRADEMON_IN_TUBE     ; 12
+	const SPRITE_ANIM_SEQ_REVEAL_NEW_MON       ; 13
+	const SPRITE_ANIM_SEQ_RADIO_TUNING_KNOB    ; 14
+	const SPRITE_ANIM_SEQ_CUT_LEAVES           ; 15
+	const SPRITE_ANIM_SEQ_FLY_FROM             ; 16
+	const SPRITE_ANIM_SEQ_FLY_LEAF             ; 17
+	const SPRITE_ANIM_SEQ_FLY_TO               ; 18
+	const SPRITE_ANIM_SEQ_19                   ; 19
+	const SPRITE_ANIM_SEQ_1A                   ; 1a
+	const SPRITE_ANIM_SEQ_FOR_MOBILE_23        ; 1b
+	const SPRITE_ANIM_SEQ_FOR_MOBILE_24        ; 1c
+	const SPRITE_ANIM_SEQ_INTRO_SUICUNE        ; 1d
+	const SPRITE_ANIM_SEQ_INTRO_PICHU_WOOPER   ; 1e
+	const SPRITE_ANIM_SEQ_CELEBI               ; 1f
+	const SPRITE_ANIM_SEQ_INTRO_UNOWN          ; 20
+	const SPRITE_ANIM_SEQ_INTRO_UNOWN_F        ; 21
+	const SPRITE_ANIM_SEQ_INTRO_SUICUNE_AWAY   ; 22
+
+; SpriteAnimFrameData indexes (see data/sprites/framesets.asm)
+	const_def
+	const SPRITE_ANIM_FRAMESET_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_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_0 ; 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_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 ; 20
+	const SPRITE_ANIM_FRAMESET_21
+	const SPRITE_ANIM_FRAMESET_22
+	const SPRITE_ANIM_FRAMESET_23
+	const SPRITE_ANIM_FRAMESET_24
+	const SPRITE_ANIM_FRAMESET_HEADBUTT ; 25
+	const SPRITE_ANIM_FRAMESET_26
+	const SPRITE_ANIM_FRAMESET_27
+	const SPRITE_ANIM_FRAMESET_28
+	const SPRITE_ANIM_FRAMESET_29
+	const SPRITE_ANIM_FRAMESET_2A
+	const SPRITE_ANIM_FRAMESET_2B
+	const SPRITE_ANIM_FRAMESET_2C
+	const SPRITE_ANIM_FRAMESET_BLUE_WALK ; 2d
+	const SPRITE_ANIM_FRAMESET_MAGNET_TRAIN_BLUE ; 2e
+	const SPRITE_ANIM_FRAMESET_MOBILE_TRADE_SENT_BALL ; 2f
+	const SPRITE_ANIM_FRAMESET_MOBILE_TRADE_OT_BALL ; 30
+	const SPRITE_ANIM_FRAMESET_FOR_MOBILE_22 ; 31
+	const SPRITE_ANIM_FRAMESET_FOR_MOBILE_23 ; 32
+	const SPRITE_ANIM_FRAMESET_FOR_MOBILE_24 ; 33
+	const SPRITE_ANIM_FRAMESET_FOR_MOBILE_25 ; 34
+	const SPRITE_ANIM_FRAMESET_INTRO_SUICUNE ; 35
+	const SPRITE_ANIM_FRAMESET_INTRO_SUICUNE_2 ; 36
+	const SPRITE_ANIM_FRAMESET_INTRO_PICHU ; 37
+	const SPRITE_ANIM_FRAMESET_INTRO_WOOPER ; 38
+	const SPRITE_ANIM_FRAMESET_INTRO_UNOWN_1 ; 39
+	const SPRITE_ANIM_FRAMESET_INTRO_UNOWN_2 ; 3a
+	const SPRITE_ANIM_FRAMESET_INTRO_UNOWN_3 ; 3b
+	const SPRITE_ANIM_FRAMESET_INTRO_UNOWN_4 ; 3c
+	const SPRITE_ANIM_FRAMESET_INTRO_UNOWN_F_2 ; 3d
+	const SPRITE_ANIM_FRAMESET_INTRO_SUICUNE_AWAY ; 3e
+	const SPRITE_ANIM_FRAMESET_INTRO_UNOWN_F ; 3f
+	const SPRITE_ANIM_FRAMESET_CELEBI_LEFT ; 40
+	const SPRITE_ANIM_FRAMESET_CELEBI_RIGHT ; 41
+
+; SpriteAnimOAMData indexes (see data/sprites/oam.asm)
+	const_def
+	const SPRITE_ANIM_OAMSET_RED_WALK_1 ; 00
+	const SPRITE_ANIM_OAMSET_RED_WALK_2 ; 01
+	const SPRITE_ANIM_OAMSET_02
+	const SPRITE_ANIM_OAMSET_03
+	const SPRITE_ANIM_OAMSET_04
+	const SPRITE_ANIM_OAMSET_05
+	const SPRITE_ANIM_OAMSET_06
+	const SPRITE_ANIM_OAMSET_07
+	const SPRITE_ANIM_OAMSET_08
+	const SPRITE_ANIM_OAMSET_09
+	const SPRITE_ANIM_OAMSET_0A
+	const SPRITE_ANIM_OAMSET_0B
+	const SPRITE_ANIM_OAMSET_0C
+	const SPRITE_ANIM_OAMSET_0D
+	const SPRITE_ANIM_OAMSET_0E
+	const SPRITE_ANIM_OAMSET_0F
+	const SPRITE_ANIM_OAMSET_10
+	const SPRITE_ANIM_OAMSET_11
+	const SPRITE_ANIM_OAMSET_12
+	const SPRITE_ANIM_OAMSET_13
+	const SPRITE_ANIM_OAMSET_14
+	const SPRITE_ANIM_OAMSET_15
+	const SPRITE_ANIM_OAMSET_16
+	const SPRITE_ANIM_OAMSET_17
+	const SPRITE_ANIM_OAMSET_18
+	const SPRITE_ANIM_OAMSET_19
+	const SPRITE_ANIM_OAMSET_1A
+	const SPRITE_ANIM_OAMSET_1B
+	const SPRITE_ANIM_OAMSET_1C
+	const SPRITE_ANIM_OAMSET_1D
+	const SPRITE_ANIM_OAMSET_GS_TITLE_TRAIL_1 ; 1e
+	const SPRITE_ANIM_OAMSET_GS_TITLE_TRAIL_2 ; 1f
+	const SPRITE_ANIM_OAMSET_TEXT_ENTRY_CURSOR ; 20
+	const SPRITE_ANIM_OAMSET_FOR_FRAMESET_09 ; 21
+	const SPRITE_ANIM_OAMSET_22
+	const SPRITE_ANIM_OAMSET_GS_INTRO_STAR ; 23
+	const SPRITE_ANIM_OAMSET_GS_INTRO_SPARKLE_1 ; 24
+	const SPRITE_ANIM_OAMSET_GS_INTRO_SPARKLE_2 ; 25
+	const SPRITE_ANIM_OAMSET_GS_INTRO_SPARKLE_3 ; 26
+	const SPRITE_ANIM_OAMSET_SLOTS_GOLEM_1 ; 27
+	const SPRITE_ANIM_OAMSET_SLOTS_GOLEM_2 ; 28
+	const SPRITE_ANIM_OAMSET_SLOTS_CHANSEY_1 ; 29
+	const SPRITE_ANIM_OAMSET_SLOTS_CHANSEY_2 ; 2a
+	const SPRITE_ANIM_OAMSET_SLOTS_CHANSEY_3 ; 2b
+	const SPRITE_ANIM_OAMSET_SLOTS_CHANSEY_4 ; 2c
+	const SPRITE_ANIM_OAMSET_SLOTS_CHANSEY_5 ; 2d
+	const SPRITE_ANIM_OAMSET_SLOTS_EGG ; 2e
+	const SPRITE_ANIM_OAMSET_STILL_CURSOR ; 2f
+	const SPRITE_ANIM_OAMSET_TRADE_POKE_BALL_1 ; 30
+	const SPRITE_ANIM_OAMSET_TRADE_POKE_BALL_2 ; 31
+	const SPRITE_ANIM_OAMSET_TRADE_POOF_1 ; 32
+	const SPRITE_ANIM_OAMSET_TRADE_POOF_2 ; 33
+	const SPRITE_ANIM_OAMSET_TRADE_POOF_3 ; 34
+	const SPRITE_ANIM_OAMSET_35
+	const SPRITE_ANIM_OAMSET_36
+	const SPRITE_ANIM_OAMSET_TRADEMON_ICON_1 ; 37
+	const SPRITE_ANIM_OAMSET_TRADEMON_ICON_2 ; 38
+	const SPRITE_ANIM_OAMSET_TRADEMON_BUBBLE ; 39
+	const SPRITE_ANIM_OAMSET_EVOLUTION_BALL_OF_LIGHT_1 ; 3a
+	const SPRITE_ANIM_OAMSET_EVOLUTION_BALL_OF_LIGHT_2 ; 3b
+	const SPRITE_ANIM_OAMSET_RADIO_TUNING_KNOB ; 3c
+	const SPRITE_ANIM_OAMSET_PARTY_MON_WITH_MAIL_1 ; 3d
+	const SPRITE_ANIM_OAMSET_PARTY_MON_WITH_MAIL_2 ; 3e
+	const SPRITE_ANIM_OAMSET_PARTY_MON_WITH_ITEM_1 ; 3f
+	const SPRITE_ANIM_OAMSET_PARTY_MON_WITH_ITEM_2 ; 40
+	const SPRITE_ANIM_OAMSET_MAGNET_TRAIN_RED_1 ; 41
+	const SPRITE_ANIM_OAMSET_MAGNET_TRAIN_RED_2 ; 42
+	const SPRITE_ANIM_OAMSET_43
+	const SPRITE_ANIM_OAMSET_44
+	const SPRITE_ANIM_OAMSET_45
+	const SPRITE_ANIM_OAMSET_46
+	const SPRITE_ANIM_OAMSET_47
+	const SPRITE_ANIM_OAMSET_48
+	const SPRITE_ANIM_OAMSET_49
+	const SPRITE_ANIM_OAMSET_4A
+	const SPRITE_ANIM_OAMSET_4B
+	const SPRITE_ANIM_OAMSET_4C
+	const SPRITE_ANIM_OAMSET_4D
+	const SPRITE_ANIM_OAMSET_4E
+	const SPRITE_ANIM_OAMSET_LEAF ; 4f
+	const SPRITE_ANIM_OAMSET_TREE_1 ; 50
+	const SPRITE_ANIM_OAMSET_CUT_TREE_2 ; 51
+	const SPRITE_ANIM_OAMSET_CUT_TREE_3 ; 52
+	const SPRITE_ANIM_OAMSET_CUT_TREE_4 ; 53
+	const SPRITE_ANIM_OAMSET_EGG_CRACK ; 54
+	const SPRITE_ANIM_OAMSET_55
+	const SPRITE_ANIM_OAMSET_56
+	const SPRITE_ANIM_OAMSET_57
+	const SPRITE_ANIM_OAMSET_58
+	const SPRITE_ANIM_OAMSET_59
+	const SPRITE_ANIM_OAMSET_5A
+	const SPRITE_ANIM_OAMSET_HEADBUTT_TREE_2 ; 5b
+	const SPRITE_ANIM_OAMSET_5C
+	const SPRITE_ANIM_OAMSET_5D
+	const SPRITE_ANIM_OAMSET_5E
+	const SPRITE_ANIM_OAMSET_5F
+	const SPRITE_ANIM_OAMSET_60
+	const SPRITE_ANIM_OAMSET_61
+	const SPRITE_ANIM_OAMSET_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
+	const SPRITE_ANIM_OAMSET_FOR_MOBILE_22_1 ; 67
+	const SPRITE_ANIM_OAMSET_FOR_MOBILE_22_2 ; 68
+	const SPRITE_ANIM_OAMSET_FOR_MOBILE_25_1 ; 69
+	const SPRITE_ANIM_OAMSET_FOR_MOBILE_25_2 ; 6a
+	const SPRITE_ANIM_OAMSET_FOR_MOBILE_25_3 ; 6b
+	const SPRITE_ANIM_OAMSET_FOR_MOBILE_23 ; 6c
+	const SPRITE_ANIM_OAMSET_FOR_MOBILE_24 ; 6d
+	const SPRITE_ANIM_OAMSET_INTRO_SUICUNE_1 ; 6e
+	const SPRITE_ANIM_OAMSET_INTRO_SUICUNE_2 ; 6f
+	const SPRITE_ANIM_OAMSET_INTRO_SUICUNE_3 ; 70
+	const SPRITE_ANIM_OAMSET_INTRO_SUICUNE_4 ; 71
+	const SPRITE_ANIM_OAMSET_INTRO_PICHU_1 ; 72
+	const SPRITE_ANIM_OAMSET_INTRO_PICHU_2 ; 73
+	const SPRITE_ANIM_OAMSET_INTRO_PICHU_3 ; 74
+	const SPRITE_ANIM_OAMSET_INTRO_WOOPER ; 75
+	const SPRITE_ANIM_OAMSET_INTRO_UNOWN_1 ; 76
+	const SPRITE_ANIM_OAMSET_INTRO_UNOWN_2 ; 77
+	const SPRITE_ANIM_OAMSET_INTRO_UNOWN_3 ; 78
+	const SPRITE_ANIM_OAMSET_INTRO_UNOWN_F_2_1 ; 79
+	const SPRITE_ANIM_OAMSET_INTRO_UNOWN_F_2_2 ; 7a
+	const SPRITE_ANIM_OAMSET_INTRO_UNOWN_F_2_3 ; 7b
+	const SPRITE_ANIM_OAMSET_INTRO_UNOWN_F_2_4 ; 7c
+	const SPRITE_ANIM_OAMSET_INTRO_UNOWN_F_2_5 ; 7d
+	const SPRITE_ANIM_OAMSET_INTRO_SUICUNE_AWAY ; 7e
+	const SPRITE_ANIM_OAMSET_CELEBI_1 ; 7f
+	const SPRITE_ANIM_OAMSET_CELEBI_2 ; 80
+	const SPRITE_ANIM_OAMSET_GAMEFREAK_LOGO_1 ; 81
+	const SPRITE_ANIM_OAMSET_GAMEFREAK_LOGO_2 ; 82
+	const SPRITE_ANIM_OAMSET_GAMEFREAK_LOGO_3 ; 83
+	const SPRITE_ANIM_OAMSET_GAMEFREAK_LOGO_4 ; 84
+	const SPRITE_ANIM_OAMSET_GAMEFREAK_LOGO_5 ; 85
+	const SPRITE_ANIM_OAMSET_GAMEFREAK_LOGO_6 ; 86
+	const SPRITE_ANIM_OAMSET_GAMEFREAK_LOGO_7 ; 87
+	const SPRITE_ANIM_OAMSET_GAMEFREAK_LOGO_8 ; 88
+	const SPRITE_ANIM_OAMSET_GAMEFREAK_LOGO_9 ; 89
+	const SPRITE_ANIM_OAMSET_GAMEFREAK_LOGO_10 ; 8A
+	const SPRITE_ANIM_OAMSET_GAMEFREAK_LOGO_11 ; 8B
--- a/constants/sprite_data_constants.asm
+++ b/constants/sprite_data_constants.asm
@@ -192,320 +192,3 @@
 	const FACING_BOULDER_DUST_2 ; 1d
 	const FACING_GRASS_1        ; 1e
 	const FACING_GRASS_2        ; 1f
-
-; 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
-
-; SpriteAnimSeqData indexes (see data/sprite_anim_seqs.asm)
-	const_def
-	const SPRITE_ANIM_INDEX_PARTY_MON               ; 00
-	const SPRITE_ANIM_INDEX_GS_TITLE_TRAIL          ; 01
-	const SPRITE_ANIM_INDEX_NAMING_SCREEN_CURSOR    ; 02
-	const SPRITE_ANIM_INDEX_GAMEFREAK_LOGO          ; 03
-	const SPRITE_ANIM_INDEX_GS_INTRO_STAR           ; 04
-	const SPRITE_ANIM_INDEX_GS_INTRO_SPARKLE        ; 05
-	const SPRITE_ANIM_INDEX_SLOTS_GOLEM             ; 06
-	const SPRITE_ANIM_INDEX_SLOTS_CHANSEY           ; 07
-	const SPRITE_ANIM_INDEX_SLOTS_EGG               ; 08
-	const SPRITE_ANIM_INDEX_COMPOSE_MAIL_CURSOR     ; 09
-	const SPRITE_ANIM_INDEX_RED_WALK                ; 0a
-	const SPRITE_ANIM_INDEX_UNUSED_CURSOR           ; 0b
-	const SPRITE_ANIM_INDEX_DUMMY_GAME              ; 0c
-	const SPRITE_ANIM_INDEX_POKEGEAR_ARROW          ; 0d
-	const SPRITE_ANIM_INDEX_TRADE_POKE_BALL         ; 0e
-	const SPRITE_ANIM_INDEX_TRADE_POOF              ; 0f
-	const SPRITE_ANIM_INDEX_TRADE_TUBE_BULGE        ; 10
-	const SPRITE_ANIM_INDEX_TRADEMON_ICON           ; 11
-	const SPRITE_ANIM_INDEX_TRADEMON_BUBBLE         ; 12
-	const SPRITE_ANIM_INDEX_EVOLUTION_BALL_OF_LIGHT ; 13
-	const SPRITE_ANIM_INDEX_RADIO_TUNING_KNOB       ; 14
-	const SPRITE_ANIM_INDEX_MAGNET_TRAIN_RED        ; 15
-	const SPRITE_ANIM_INDEX_LEAF                    ; 16
-	const SPRITE_ANIM_INDEX_CUT_TREE                ; 17
-	const SPRITE_ANIM_INDEX_FLY_LEAF                ; 18
-	const SPRITE_ANIM_INDEX_EGG_CRACK               ; 19
-	const SPRITE_ANIM_INDEX_1A                      ; 1a
-	const SPRITE_ANIM_INDEX_HEADBUTT                ; 1b
-	const SPRITE_ANIM_INDEX_EGG_HATCH               ; 1c
-	const SPRITE_ANIM_INDEX_1D                      ; 1d
-	const SPRITE_ANIM_INDEX_BLUE_WALK               ; 1e
-	const SPRITE_ANIM_INDEX_MAGNET_TRAIN_BLUE       ; 1f
-	const SPRITE_ANIM_INDEX_MOBILE_TRADE_SENT_BALL  ; 20
-	const SPRITE_ANIM_INDEX_MOBILE_TRADE_OT_BALL    ; 21
-	const SPRITE_ANIM_INDEX_MOBILE_22               ; 22
-	const SPRITE_ANIM_INDEX_MOBILE_23               ; 23
-	const SPRITE_ANIM_INDEX_MOBILE_24               ; 24
-	const SPRITE_ANIM_INDEX_MOBILE_25               ; 25
-	const SPRITE_ANIM_INDEX_INTRO_SUICUNE           ; 26
-	const SPRITE_ANIM_INDEX_INTRO_PICHU             ; 27
-	const SPRITE_ANIM_INDEX_INTRO_WOOPER            ; 28
-	const SPRITE_ANIM_INDEX_INTRO_UNOWN             ; 29
-	const SPRITE_ANIM_INDEX_INTRO_UNOWN_F           ; 2a
-	const SPRITE_ANIM_INDEX_INTRO_SUICUNE_AWAY      ; 2b
-	const SPRITE_ANIM_INDEX_CELEBI                  ; 2c
-
-; DoAnimFrame.Jumptable indexes (see engine/sprite_anims.asm)
-	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_TITLE_TRAIL       ; 04
-	const SPRITE_ANIM_SEQ_NAMING_SCREEN_CURSOR ; 05
-	const SPRITE_ANIM_SEQ_GAMEFREAK_LOGO       ; 06
-	const SPRITE_ANIM_SEQ_GS_INTRO_STAR        ; 07
-	const SPRITE_ANIM_SEQ_GS_INTRO_SPARKLE     ; 08
-	const SPRITE_ANIM_SEQ_SLOTS_GOLEM          ; 09
-	const SPRITE_ANIM_SEQ_SLOTS_CHANSEY        ; 0a
-	const SPRITE_ANIM_SEQ_SLOTS_EGG            ; 0b
-	const SPRITE_ANIM_SEQ_MAIL_CURSOR          ; 0c
-	const SPRITE_ANIM_SEQ_FOR_UNUSED_CURSOR    ; 0d
-	const SPRITE_ANIM_SEQ_DUMMY_GAME_CURSOR    ; 0e
-	const SPRITE_ANIM_SEQ_POKEGEAR_ARROW       ; 0f
-	const SPRITE_ANIM_SEQ_TRADE_POKE_BALL      ; 10
-	const SPRITE_ANIM_SEQ_TRADE_TUBE_BULGE     ; 11
-	const SPRITE_ANIM_SEQ_TRADEMON_IN_TUBE     ; 12
-	const SPRITE_ANIM_SEQ_REVEAL_NEW_MON       ; 13
-	const SPRITE_ANIM_SEQ_RADIO_TUNING_KNOB    ; 14
-	const SPRITE_ANIM_SEQ_CUT_LEAVES           ; 15
-	const SPRITE_ANIM_SEQ_FLY_FROM             ; 16
-	const SPRITE_ANIM_SEQ_FLY_LEAF             ; 17
-	const SPRITE_ANIM_SEQ_FLY_TO               ; 18
-	const SPRITE_ANIM_SEQ_19                   ; 19
-	const SPRITE_ANIM_SEQ_1A                   ; 1a
-	const SPRITE_ANIM_SEQ_FOR_MOBILE_23        ; 1b
-	const SPRITE_ANIM_SEQ_FOR_MOBILE_24        ; 1c
-	const SPRITE_ANIM_SEQ_INTRO_SUICUNE        ; 1d
-	const SPRITE_ANIM_SEQ_INTRO_PICHU_WOOPER   ; 1e
-	const SPRITE_ANIM_SEQ_CELEBI               ; 1f
-	const SPRITE_ANIM_SEQ_INTRO_UNOWN          ; 20
-	const SPRITE_ANIM_SEQ_INTRO_UNOWN_F        ; 21
-	const SPRITE_ANIM_SEQ_INTRO_SUICUNE_AWAY   ; 22
-
-; SpriteAnimFrameData indexes (see data/sprite_anim_frames.asm)
-	const_def
-	const SPRITE_ANIM_FRAMESET_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_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_0 ; 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_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 ; 20
-	const SPRITE_ANIM_FRAMESET_21
-	const SPRITE_ANIM_FRAMESET_22
-	const SPRITE_ANIM_FRAMESET_23
-	const SPRITE_ANIM_FRAMESET_24
-	const SPRITE_ANIM_FRAMESET_HEADBUTT ; 25
-	const SPRITE_ANIM_FRAMESET_26
-	const SPRITE_ANIM_FRAMESET_27
-	const SPRITE_ANIM_FRAMESET_28
-	const SPRITE_ANIM_FRAMESET_29
-	const SPRITE_ANIM_FRAMESET_2A
-	const SPRITE_ANIM_FRAMESET_2B
-	const SPRITE_ANIM_FRAMESET_2C
-	const SPRITE_ANIM_FRAMESET_BLUE_WALK ; 2d
-	const SPRITE_ANIM_FRAMESET_MAGNET_TRAIN_BLUE ; 2e
-	const SPRITE_ANIM_FRAMESET_MOBILE_TRADE_SENT_BALL ; 2f
-	const SPRITE_ANIM_FRAMESET_MOBILE_TRADE_OT_BALL ; 30
-	const SPRITE_ANIM_FRAMESET_FOR_MOBILE_22 ; 31
-	const SPRITE_ANIM_FRAMESET_FOR_MOBILE_23 ; 32
-	const SPRITE_ANIM_FRAMESET_FOR_MOBILE_24 ; 33
-	const SPRITE_ANIM_FRAMESET_FOR_MOBILE_25 ; 34
-	const SPRITE_ANIM_FRAMESET_INTRO_SUICUNE ; 35
-	const SPRITE_ANIM_FRAMESET_INTRO_SUICUNE_2 ; 36
-	const SPRITE_ANIM_FRAMESET_INTRO_PICHU ; 37
-	const SPRITE_ANIM_FRAMESET_INTRO_WOOPER ; 38
-	const SPRITE_ANIM_FRAMESET_INTRO_UNOWN_1 ; 39
-	const SPRITE_ANIM_FRAMESET_INTRO_UNOWN_2 ; 3a
-	const SPRITE_ANIM_FRAMESET_INTRO_UNOWN_3 ; 3b
-	const SPRITE_ANIM_FRAMESET_INTRO_UNOWN_4 ; 3c
-	const SPRITE_ANIM_FRAMESET_INTRO_UNOWN_F_2 ; 3d
-	const SPRITE_ANIM_FRAMESET_INTRO_SUICUNE_AWAY ; 3e
-	const SPRITE_ANIM_FRAMESET_INTRO_UNOWN_F ; 3f
-	const SPRITE_ANIM_FRAMESET_CELEBI_LEFT ; 40
-	const SPRITE_ANIM_FRAMESET_CELEBI_RIGHT ; 41
-
-; SpriteAnimOAMData indexes (see data/sprite_anim_oam.asm)
-	const_def
-	const SPRITE_ANIM_FRAME_IDX_RED_WALK_1 ; 00
-	const SPRITE_ANIM_FRAME_IDX_RED_WALK_2 ; 01
-	const SPRITE_ANIM_FRAME_IDX_02
-	const SPRITE_ANIM_FRAME_IDX_03
-	const SPRITE_ANIM_FRAME_IDX_04
-	const SPRITE_ANIM_FRAME_IDX_05
-	const SPRITE_ANIM_FRAME_IDX_06
-	const SPRITE_ANIM_FRAME_IDX_07
-	const SPRITE_ANIM_FRAME_IDX_08
-	const SPRITE_ANIM_FRAME_IDX_09
-	const SPRITE_ANIM_FRAME_IDX_0A
-	const SPRITE_ANIM_FRAME_IDX_0B
-	const SPRITE_ANIM_FRAME_IDX_0C
-	const SPRITE_ANIM_FRAME_IDX_0D
-	const SPRITE_ANIM_FRAME_IDX_0E
-	const SPRITE_ANIM_FRAME_IDX_0F
-	const SPRITE_ANIM_FRAME_IDX_10
-	const SPRITE_ANIM_FRAME_IDX_11
-	const SPRITE_ANIM_FRAME_IDX_12
-	const SPRITE_ANIM_FRAME_IDX_13
-	const SPRITE_ANIM_FRAME_IDX_14
-	const SPRITE_ANIM_FRAME_IDX_15
-	const SPRITE_ANIM_FRAME_IDX_16
-	const SPRITE_ANIM_FRAME_IDX_17
-	const SPRITE_ANIM_FRAME_IDX_18
-	const SPRITE_ANIM_FRAME_IDX_19
-	const SPRITE_ANIM_FRAME_IDX_1A
-	const SPRITE_ANIM_FRAME_IDX_1B
-	const SPRITE_ANIM_FRAME_IDX_1C
-	const SPRITE_ANIM_FRAME_IDX_1D
-	const SPRITE_ANIM_FRAME_IDX_GS_TITLE_TRAIL_1 ; 1e
-	const SPRITE_ANIM_FRAME_IDX_GS_TITLE_TRAIL_2 ; 1f
-	const SPRITE_ANIM_FRAME_IDX_TEXT_ENTRY_CURSOR ; 20
-	const SPRITE_ANIM_FRAME_IDX_FOR_FRAMESET_09 ; 21
-	const SPRITE_ANIM_FRAME_IDX_22
-	const SPRITE_ANIM_FRAME_IDX_GS_INTRO_STAR ; 23
-	const SPRITE_ANIM_FRAME_IDX_GS_INTRO_SPARKLE_1 ; 24
-	const SPRITE_ANIM_FRAME_IDX_GS_INTRO_SPARKLE_2 ; 25
-	const SPRITE_ANIM_FRAME_IDX_GS_INTRO_SPARKLE_3 ; 26
-	const SPRITE_ANIM_FRAME_IDX_SLOTS_GOLEM_1 ; 27
-	const SPRITE_ANIM_FRAME_IDX_SLOTS_GOLEM_2 ; 28
-	const SPRITE_ANIM_FRAME_IDX_SLOTS_CHANSEY_1 ; 29
-	const SPRITE_ANIM_FRAME_IDX_SLOTS_CHANSEY_2 ; 2a
-	const SPRITE_ANIM_FRAME_IDX_SLOTS_CHANSEY_3 ; 2b
-	const SPRITE_ANIM_FRAME_IDX_SLOTS_CHANSEY_4 ; 2c
-	const SPRITE_ANIM_FRAME_IDX_SLOTS_CHANSEY_5 ; 2d
-	const SPRITE_ANIM_FRAME_IDX_SLOTS_EGG ; 2e
-	const SPRITE_ANIM_FRAME_IDX_STILL_CURSOR ; 2f
-	const SPRITE_ANIM_FRAME_IDX_TRADE_POKE_BALL_1 ; 30
-	const SPRITE_ANIM_FRAME_IDX_TRADE_POKE_BALL_2 ; 31
-	const SPRITE_ANIM_FRAME_IDX_TRADE_POOF_1 ; 32
-	const SPRITE_ANIM_FRAME_IDX_TRADE_POOF_2 ; 33
-	const SPRITE_ANIM_FRAME_IDX_TRADE_POOF_3 ; 34
-	const SPRITE_ANIM_FRAME_IDX_35
-	const SPRITE_ANIM_FRAME_IDX_36
-	const SPRITE_ANIM_FRAME_IDX_TRADEMON_ICON_1 ; 37
-	const SPRITE_ANIM_FRAME_IDX_TRADEMON_ICON_2 ; 38
-	const SPRITE_ANIM_FRAME_IDX_TRADEMON_BUBBLE ; 39
-	const SPRITE_ANIM_FRAME_IDX_EVOLUTION_BALL_OF_LIGHT_1 ; 3a
-	const SPRITE_ANIM_FRAME_IDX_EVOLUTION_BALL_OF_LIGHT_2 ; 3b
-	const SPRITE_ANIM_FRAME_IDX_RADIO_TUNING_KNOB ; 3c
-	const SPRITE_ANIM_FRAME_IDX_PARTY_MON_WITH_MAIL_1 ; 3d
-	const SPRITE_ANIM_FRAME_IDX_PARTY_MON_WITH_MAIL_2 ; 3e
-	const SPRITE_ANIM_FRAME_IDX_PARTY_MON_WITH_ITEM_1 ; 3f
-	const SPRITE_ANIM_FRAME_IDX_PARTY_MON_WITH_ITEM_2 ; 40
-	const SPRITE_ANIM_FRAME_IDX_MAGNET_TRAIN_RED_1 ; 41
-	const SPRITE_ANIM_FRAME_IDX_MAGNET_TRAIN_RED_2 ; 42
-	const SPRITE_ANIM_FRAME_IDX_43
-	const SPRITE_ANIM_FRAME_IDX_44
-	const SPRITE_ANIM_FRAME_IDX_45
-	const SPRITE_ANIM_FRAME_IDX_46
-	const SPRITE_ANIM_FRAME_IDX_47
-	const SPRITE_ANIM_FRAME_IDX_48
-	const SPRITE_ANIM_FRAME_IDX_49
-	const SPRITE_ANIM_FRAME_IDX_4A
-	const SPRITE_ANIM_FRAME_IDX_4B
-	const SPRITE_ANIM_FRAME_IDX_4C
-	const SPRITE_ANIM_FRAME_IDX_4D
-	const SPRITE_ANIM_FRAME_IDX_4E
-	const SPRITE_ANIM_FRAME_IDX_LEAF ; 4f
-	const SPRITE_ANIM_FRAME_IDX_TREE_1 ; 50
-	const SPRITE_ANIM_FRAME_IDX_CUT_TREE_2 ; 51
-	const SPRITE_ANIM_FRAME_IDX_CUT_TREE_3 ; 52
-	const SPRITE_ANIM_FRAME_IDX_CUT_TREE_4 ; 53
-	const SPRITE_ANIM_FRAME_IDX_EGG_CRACK ; 54
-	const SPRITE_ANIM_FRAME_IDX_55
-	const SPRITE_ANIM_FRAME_IDX_56
-	const SPRITE_ANIM_FRAME_IDX_57
-	const SPRITE_ANIM_FRAME_IDX_58
-	const SPRITE_ANIM_FRAME_IDX_59
-	const SPRITE_ANIM_FRAME_IDX_5A
-	const SPRITE_ANIM_FRAME_IDX_HEADBUTT_TREE_2 ; 5b
-	const SPRITE_ANIM_FRAME_IDX_5C
-	const SPRITE_ANIM_FRAME_IDX_5D
-	const SPRITE_ANIM_FRAME_IDX_5E
-	const SPRITE_ANIM_FRAME_IDX_5F
-	const SPRITE_ANIM_FRAME_IDX_60
-	const SPRITE_ANIM_FRAME_IDX_61
-	const SPRITE_ANIM_FRAME_IDX_62
-	const SPRITE_ANIM_FRAME_IDX_BLUE_WALK_1 ; 63
-	const SPRITE_ANIM_FRAME_IDX_BLUE_WALK_2 ; 64
-	const SPRITE_ANIM_FRAME_IDX_MAGNET_TRAIN_BLUE_1 ; 65
-	const SPRITE_ANIM_FRAME_IDX_MAGNET_TRAIN_BLUE_2 ; 66
-	const SPRITE_ANIM_FRAME_IDX_FOR_MOBILE_22_1 ; 67
-	const SPRITE_ANIM_FRAME_IDX_FOR_MOBILE_22_2 ; 68
-	const SPRITE_ANIM_FRAME_IDX_FOR_MOBILE_25_1 ; 69
-	const SPRITE_ANIM_FRAME_IDX_FOR_MOBILE_25_2 ; 6a
-	const SPRITE_ANIM_FRAME_IDX_FOR_MOBILE_25_3 ; 6b
-	const SPRITE_ANIM_FRAME_IDX_FOR_MOBILE_23 ; 6c
-	const SPRITE_ANIM_FRAME_IDX_FOR_MOBILE_24 ; 6d
-	const SPRITE_ANIM_FRAME_IDX_INTRO_SUICUNE_1 ; 6e
-	const SPRITE_ANIM_FRAME_IDX_INTRO_SUICUNE_2 ; 6f
-	const SPRITE_ANIM_FRAME_IDX_INTRO_SUICUNE_3 ; 70
-	const SPRITE_ANIM_FRAME_IDX_INTRO_SUICUNE_4 ; 71
-	const SPRITE_ANIM_FRAME_IDX_INTRO_PICHU_1 ; 72
-	const SPRITE_ANIM_FRAME_IDX_INTRO_PICHU_2 ; 73
-	const SPRITE_ANIM_FRAME_IDX_INTRO_PICHU_3 ; 74
-	const SPRITE_ANIM_FRAME_IDX_INTRO_WOOPER ; 75
-	const SPRITE_ANIM_FRAME_IDX_INTRO_UNOWN_1 ; 76
-	const SPRITE_ANIM_FRAME_IDX_INTRO_UNOWN_2 ; 77
-	const SPRITE_ANIM_FRAME_IDX_INTRO_UNOWN_3 ; 78
-	const SPRITE_ANIM_FRAME_IDX_INTRO_UNOWN_F_2_1 ; 79
-	const SPRITE_ANIM_FRAME_IDX_INTRO_UNOWN_F_2_2 ; 7a
-	const SPRITE_ANIM_FRAME_IDX_INTRO_UNOWN_F_2_3 ; 7b
-	const SPRITE_ANIM_FRAME_IDX_INTRO_UNOWN_F_2_4 ; 7c
-	const SPRITE_ANIM_FRAME_IDX_INTRO_UNOWN_F_2_5 ; 7d
-	const SPRITE_ANIM_FRAME_IDX_INTRO_SUICUNE_AWAY ; 7e
-	const SPRITE_ANIM_FRAME_IDX_CELEBI_1 ; 7f
-	const SPRITE_ANIM_FRAME_IDX_CELEBI_2 ; 80
-	const SPRITE_ANIM_FRAME_IDX_GAMEFREAK_LOGO_1 ; 81
-	const SPRITE_ANIM_FRAME_IDX_GAMEFREAK_LOGO_2 ; 82
-	const SPRITE_ANIM_FRAME_IDX_GAMEFREAK_LOGO_3 ; 83
-	const SPRITE_ANIM_FRAME_IDX_GAMEFREAK_LOGO_4 ; 84
-	const SPRITE_ANIM_FRAME_IDX_GAMEFREAK_LOGO_5 ; 85
-	const SPRITE_ANIM_FRAME_IDX_GAMEFREAK_LOGO_6 ; 86
-	const SPRITE_ANIM_FRAME_IDX_GAMEFREAK_LOGO_7 ; 87
-	const SPRITE_ANIM_FRAME_IDX_GAMEFREAK_LOGO_8 ; 88
-	const SPRITE_ANIM_FRAME_IDX_GAMEFREAK_LOGO_9 ; 89
-	const SPRITE_ANIM_FRAME_IDX_GAMEFREAK_LOGO_10 ; 8A
-	const SPRITE_ANIM_FRAME_IDX_GAMEFREAK_LOGO_11 ; 8B
--- a/constants/type_constants.asm
+++ b/constants/type_constants.asm
@@ -1,6 +1,6 @@
-; TypeNames indexes (see text/types.asm)
+; TypeNames indexes (see data/type_names.asm)
 ; also used in:
-; - TypeMatchup (see battle.type_matchup.asm)
+; - TypeMatchups (see data/type_matchups.asm)
 ; - Pokedex_SearchForMons.TypeConversionTable and Pokedex_PlaceSearchScreenTypeStrings.TypeStrings (see engine/pokedex.asm)
 	const_def
 
--- /dev/null
+++ b/data/anims/ball_colors.asm
@@ -1,0 +1,16 @@
+; colors of balls thrown in battle
+
+BallColors: ; cd26c (33:526c)
+	db MASTER_BALL, PAL_BATTLE_OB_GREEN
+	db ULTRA_BALL,  PAL_BATTLE_OB_YELLOW
+	db GREAT_BALL,  PAL_BATTLE_OB_BLUE
+	db POKE_BALL,   PAL_BATTLE_OB_RED
+	db HEAVY_BALL,  PAL_BATTLE_OB_GRAY
+	db LEVEL_BALL,  PAL_BATTLE_OB_BROWN
+	db LURE_BALL,   PAL_BATTLE_OB_BLUE
+	db FAST_BALL,   PAL_BATTLE_OB_BLUE
+	db FRIEND_BALL, PAL_BATTLE_OB_YELLOW
+	db MOON_BALL,   PAL_BATTLE_OB_GRAY
+	db LOVE_BALL,   PAL_BATTLE_OB_RED
+	db -1,          PAL_BATTLE_OB_GRAY
+; cd284
--- /dev/null
+++ b/data/anims/framesets.asm
@@ -1,0 +1,1271 @@
+BattleAnimFrameData: ; ce85e
+; entries correspond to BATTLEANIMFRAMESET_* constants
+	dw .Frameset_00 ; BATTLEANIMFRAMESET_00
+	dw .Frameset_01 ; BATTLEANIMFRAMESET_01
+	dw .Frameset_02 ; BATTLEANIMFRAMESET_02
+	dw .Frameset_03 ; BATTLEANIMFRAMESET_03
+	dw .Frameset_04 ; BATTLEANIMFRAMESET_04
+	dw .Frameset_05 ; BATTLEANIMFRAMESET_05
+	dw .Frameset_06 ; BATTLEANIMFRAMESET_06
+	dw .Frameset_07 ; BATTLEANIMFRAMESET_07
+	dw .Frameset_08 ; BATTLEANIMFRAMESET_08
+	dw .Frameset_09 ; BATTLEANIMFRAMESET_09
+	dw .Frameset_0a ; BATTLEANIMFRAMESET_0A
+	dw .Frameset_0b ; BATTLEANIMFRAMESET_0B
+	dw .Frameset_0c ; BATTLEANIMFRAMESET_0C
+	dw .Frameset_0d ; BATTLEANIMFRAMESET_0D
+	dw .Frameset_0e ; BATTLEANIMFRAMESET_0E
+	dw .Frameset_0f ; BATTLEANIMFRAMESET_0F
+	dw .Frameset_10 ; BATTLEANIMFRAMESET_10
+	dw .Frameset_11 ; BATTLEANIMFRAMESET_11
+	dw .Frameset_12 ; BATTLEANIMFRAMESET_12
+	dw .Frameset_13 ; BATTLEANIMFRAMESET_13
+	dw .Frameset_14 ; BATTLEANIMFRAMESET_14
+	dw .Frameset_15 ; BATTLEANIMFRAMESET_15
+	dw .Frameset_16 ; BATTLEANIMFRAMESET_16
+	dw .Frameset_17 ; BATTLEANIMFRAMESET_17
+	dw .Frameset_18 ; BATTLEANIMFRAMESET_18
+	dw .Frameset_19 ; BATTLEANIMFRAMESET_19
+	dw .Frameset_1a ; BATTLEANIMFRAMESET_1A
+	dw .Frameset_1b ; BATTLEANIMFRAMESET_1B
+	dw .Frameset_1c ; BATTLEANIMFRAMESET_1C
+	dw .Frameset_1d ; BATTLEANIMFRAMESET_1D
+	dw .Frameset_1e ; BATTLEANIMFRAMESET_1E
+	dw .Frameset_1f ; BATTLEANIMFRAMESET_1F
+	dw .Frameset_20 ; BATTLEANIMFRAMESET_20
+	dw .Frameset_21 ; BATTLEANIMFRAMESET_21
+	dw .Frameset_22 ; BATTLEANIMFRAMESET_22
+	dw .Frameset_23 ; BATTLEANIMFRAMESET_23
+	dw .Frameset_24 ; BATTLEANIMFRAMESET_24
+	dw .Frameset_25 ; BATTLEANIMFRAMESET_25
+	dw .Frameset_26 ; BATTLEANIMFRAMESET_26
+	dw .Frameset_27 ; BATTLEANIMFRAMESET_27
+	dw .Frameset_28 ; BATTLEANIMFRAMESET_28
+	dw .Frameset_29 ; BATTLEANIMFRAMESET_29
+	dw .Frameset_2a ; BATTLEANIMFRAMESET_2A
+	dw .Frameset_2b ; BATTLEANIMFRAMESET_2B
+	dw .Frameset_2c ; BATTLEANIMFRAMESET_2C
+	dw .Frameset_2d ; BATTLEANIMFRAMESET_2D
+	dw .Frameset_2e ; BATTLEANIMFRAMESET_2E
+	dw .Frameset_2f ; BATTLEANIMFRAMESET_2F
+	dw .Frameset_30 ; BATTLEANIMFRAMESET_30
+	dw .Frameset_31 ; BATTLEANIMFRAMESET_31
+	dw .Frameset_32 ; BATTLEANIMFRAMESET_32
+	dw .Frameset_33 ; BATTLEANIMFRAMESET_33
+	dw .Frameset_34 ; BATTLEANIMFRAMESET_34
+	dw .Frameset_35 ; BATTLEANIMFRAMESET_35
+	dw .Frameset_36 ; BATTLEANIMFRAMESET_36
+	dw .Frameset_37 ; BATTLEANIMFRAMESET_37
+	dw .Frameset_38 ; BATTLEANIMFRAMESET_38
+	dw .Frameset_39 ; BATTLEANIMFRAMESET_39
+	dw .Frameset_3a ; BATTLEANIMFRAMESET_3A
+	dw .Frameset_3b ; BATTLEANIMFRAMESET_3B
+	dw .Frameset_3c ; BATTLEANIMFRAMESET_3C
+	dw .Frameset_3d ; BATTLEANIMFRAMESET_3D
+	dw .Frameset_3e ; BATTLEANIMFRAMESET_3E
+	dw .Frameset_3f ; BATTLEANIMFRAMESET_3F
+	dw .Frameset_40 ; BATTLEANIMFRAMESET_40
+	dw .Frameset_41 ; BATTLEANIMFRAMESET_41
+	dw .Frameset_42 ; BATTLEANIMFRAMESET_42
+	dw .Frameset_43 ; BATTLEANIMFRAMESET_43
+	dw .Frameset_44 ; BATTLEANIMFRAMESET_44
+	dw .Frameset_45 ; BATTLEANIMFRAMESET_45
+	dw .Frameset_46 ; BATTLEANIMFRAMESET_46
+	dw .Frameset_47 ; BATTLEANIMFRAMESET_47
+	dw .Frameset_48 ; BATTLEANIMFRAMESET_48
+	dw .Frameset_49 ; BATTLEANIMFRAMESET_49
+	dw .Frameset_4a ; BATTLEANIMFRAMESET_4A
+	dw .Frameset_4b ; BATTLEANIMFRAMESET_4B
+	dw .Frameset_4c ; BATTLEANIMFRAMESET_4C
+	dw .Frameset_4d ; BATTLEANIMFRAMESET_4D
+	dw .Frameset_4e ; BATTLEANIMFRAMESET_4E
+	dw .Frameset_4f ; BATTLEANIMFRAMESET_4F
+	dw .Frameset_50 ; BATTLEANIMFRAMESET_50
+	dw .Frameset_51 ; BATTLEANIMFRAMESET_51
+	dw .Frameset_52 ; BATTLEANIMFRAMESET_52
+	dw .Frameset_53 ; BATTLEANIMFRAMESET_53
+	dw .Frameset_54 ; BATTLEANIMFRAMESET_54
+	dw .Frameset_55 ; BATTLEANIMFRAMESET_55
+	dw .Frameset_56 ; BATTLEANIMFRAMESET_56
+	dw .Frameset_57 ; BATTLEANIMFRAMESET_57
+	dw .Frameset_58 ; BATTLEANIMFRAMESET_58
+	dw .Frameset_59 ; BATTLEANIMFRAMESET_59
+	dw .Frameset_5a ; BATTLEANIMFRAMESET_5A
+	dw .Frameset_5b ; BATTLEANIMFRAMESET_5B
+	dw .Frameset_5c ; BATTLEANIMFRAMESET_5C
+	dw .Frameset_5d ; BATTLEANIMFRAMESET_5D
+	dw .Frameset_5e ; BATTLEANIMFRAMESET_5E
+	dw .Frameset_5f ; BATTLEANIMFRAMESET_5F
+	dw .Frameset_60 ; BATTLEANIMFRAMESET_60
+	dw .Frameset_61 ; BATTLEANIMFRAMESET_61
+	dw .Frameset_62 ; BATTLEANIMFRAMESET_62
+	dw .Frameset_63 ; BATTLEANIMFRAMESET_63
+	dw .Frameset_64 ; BATTLEANIMFRAMESET_64
+	dw .Frameset_65 ; BATTLEANIMFRAMESET_65
+	dw .Frameset_66 ; BATTLEANIMFRAMESET_66
+	dw .Frameset_67 ; BATTLEANIMFRAMESET_67
+	dw .Frameset_68 ; BATTLEANIMFRAMESET_68
+	dw .Frameset_69 ; BATTLEANIMFRAMESET_69
+	dw .Frameset_6a ; BATTLEANIMFRAMESET_6A
+	dw .Frameset_6b ; BATTLEANIMFRAMESET_6B
+	dw .Frameset_6c ; BATTLEANIMFRAMESET_6C
+	dw .Frameset_6d ; BATTLEANIMFRAMESET_6D
+	dw .Frameset_6e ; BATTLEANIMFRAMESET_6E
+	dw .Frameset_6f ; BATTLEANIMFRAMESET_6F
+	dw .Frameset_70 ; BATTLEANIMFRAMESET_70
+	dw .Frameset_71 ; BATTLEANIMFRAMESET_71
+	dw .Frameset_72 ; BATTLEANIMFRAMESET_72
+	dw .Frameset_73 ; BATTLEANIMFRAMESET_73
+	dw .Frameset_74 ; BATTLEANIMFRAMESET_74
+	dw .Frameset_75 ; BATTLEANIMFRAMESET_75
+	dw .Frameset_76 ; BATTLEANIMFRAMESET_76
+	dw .Frameset_77 ; BATTLEANIMFRAMESET_77
+	dw .Frameset_78 ; BATTLEANIMFRAMESET_78
+	dw .Frameset_79 ; BATTLEANIMFRAMESET_79
+	dw .Frameset_7a ; BATTLEANIMFRAMESET_7A
+	dw .Frameset_7b ; BATTLEANIMFRAMESET_7B
+	dw .Frameset_7c ; BATTLEANIMFRAMESET_7C
+	dw .Frameset_7d ; BATTLEANIMFRAMESET_7D
+	dw .Frameset_7e ; BATTLEANIMFRAMESET_7E
+	dw .Frameset_7f ; BATTLEANIMFRAMESET_7F
+	dw .Frameset_80 ; BATTLEANIMFRAMESET_80
+	dw .Frameset_81 ; BATTLEANIMFRAMESET_81
+	dw .Frameset_82 ; BATTLEANIMFRAMESET_82
+	dw .Frameset_83 ; BATTLEANIMFRAMESET_83
+	dw .Frameset_84 ; BATTLEANIMFRAMESET_84
+	dw .Frameset_85 ; BATTLEANIMFRAMESET_85
+	dw .Frameset_86 ; BATTLEANIMFRAMESET_86
+	dw .Frameset_87 ; BATTLEANIMFRAMESET_87
+	dw .Frameset_88 ; BATTLEANIMFRAMESET_88
+	dw .Frameset_89 ; BATTLEANIMFRAMESET_89
+	dw .Frameset_8a ; BATTLEANIMFRAMESET_8A
+	dw .Frameset_8b ; BATTLEANIMFRAMESET_8B
+	dw .Frameset_8c ; BATTLEANIMFRAMESET_8C
+	dw .Frameset_8d ; BATTLEANIMFRAMESET_8D
+	dw .Frameset_8e ; BATTLEANIMFRAMESET_8E
+	dw .Frameset_8f ; BATTLEANIMFRAMESET_8F
+	dw .Frameset_90 ; BATTLEANIMFRAMESET_90
+	dw .Frameset_91 ; BATTLEANIMFRAMESET_91
+	dw .Frameset_92 ; BATTLEANIMFRAMESET_92
+	dw .Frameset_93 ; BATTLEANIMFRAMESET_93
+	dw .Frameset_94 ; BATTLEANIMFRAMESET_94
+	dw .Frameset_95 ; BATTLEANIMFRAMESET_95
+	dw .Frameset_96 ; BATTLEANIMFRAMESET_96
+	dw .Frameset_97 ; BATTLEANIMFRAMESET_97
+	dw .Frameset_98 ; BATTLEANIMFRAMESET_98
+	dw .Frameset_99 ; BATTLEANIMFRAMESET_99
+	dw .Frameset_9a ; BATTLEANIMFRAMESET_9A
+	dw .Frameset_9b ; BATTLEANIMFRAMESET_9B
+	dw .Frameset_9c ; BATTLEANIMFRAMESET_9C
+	dw .Frameset_9d ; BATTLEANIMFRAMESET_9D
+	dw .Frameset_9e ; BATTLEANIMFRAMESET_9E
+	dw .Frameset_9f ; BATTLEANIMFRAMESET_9F
+	dw .Frameset_a0 ; BATTLEANIMFRAMESET_A0
+	dw .Frameset_a1 ; BATTLEANIMFRAMESET_A1
+	dw .Frameset_a2 ; BATTLEANIMFRAMESET_A2
+	dw .Frameset_a3 ; BATTLEANIMFRAMESET_A3
+	dw .Frameset_a4 ; BATTLEANIMFRAMESET_A4
+	dw .Frameset_a5 ; BATTLEANIMFRAMESET_A5
+	dw .Frameset_a6 ; BATTLEANIMFRAMESET_A6
+	dw .Frameset_a7 ; BATTLEANIMFRAMESET_A7
+	dw .Frameset_a8 ; BATTLEANIMFRAMESET_A8
+	dw .Frameset_a9 ; BATTLEANIMFRAMESET_A9
+	dw .Frameset_aa ; BATTLEANIMFRAMESET_AA
+	dw .Frameset_ab ; BATTLEANIMFRAMESET_AB
+	dw .Frameset_ac ; BATTLEANIMFRAMESET_AC
+	dw .Frameset_ad ; BATTLEANIMFRAMESET_AD
+	dw .Frameset_ae ; BATTLEANIMFRAMESET_AE
+	dw .Frameset_af ; BATTLEANIMFRAMESET_AF
+	dw .Frameset_b0 ; BATTLEANIMFRAMESET_B0
+	dw .Frameset_b1 ; BATTLEANIMFRAMESET_B1
+	dw .Frameset_b2 ; BATTLEANIMFRAMESET_B2
+	dw .Frameset_b3 ; BATTLEANIMFRAMESET_B3
+	dw .Frameset_b4 ; BATTLEANIMFRAMESET_B4
+	dw .Frameset_b5 ; BATTLEANIMFRAMESET_B5
+	dw .Frameset_b6 ; BATTLEANIMFRAMESET_B6
+	dw .Frameset_b7 ; BATTLEANIMFRAMESET_B7
+	dw .Frameset_b8 ; BATTLEANIMFRAMESET_B8
+
+     ; OAM index (see data/anims/oam.asm), flip flags / duration
+.Frameset_00:
+	db BATTLEANIMOAMSET_00, $06
+	db -4
+
+.Frameset_01:
+	db BATTLEANIMOAMSET_01, $06
+	db -4
+
+.Frameset_02:
+	db BATTLEANIMOAMSET_02, $06
+	db -4
+
+.Frameset_03:
+	db BATTLEANIMOAMSET_03, $06
+	db -4
+
+.Frameset_04:
+	db BATTLEANIMOAMSET_04, $06
+	db -4
+
+.Frameset_05:
+	db BATTLEANIMOAMSET_05, $06
+	db -4
+
+.Frameset_06:
+	db BATTLEANIMOAMSET_06, $06
+	db -4
+
+.Frameset_07:
+	db BATTLEANIMOAMSET_03, $04
+	db BATTLEANIMOAMSET_01, $01
+	db BATTLEANIMOAMSET_03, $04
+	db BATTLEANIMOAMSET_01, $01
+	db BATTLEANIMOAMSET_03, $04
+	db BATTLEANIMOAMSET_01, $01
+	db BATTLEANIMOAMSET_03, $04
+	db BATTLEANIMOAMSET_01, $01
+	db -4
+
+.Frameset_3e:
+	db BATTLEANIMOAMSET_4B, $02
+	db BATTLEANIMOAMSET_4C, $02
+	db BATTLEANIMOAMSET_4D, $04
+	db BATTLEANIMOAMSET_4E, $02
+	db -3, $02
+	db BATTLEANIMOAMSET_4E, $02
+	db -3, $02
+	db BATTLEANIMOAMSET_4E, $02
+	db -3, $02
+	db BATTLEANIMOAMSET_4E, $02
+	db -4
+
+.Frameset_3f:
+	db BATTLEANIMOAMSET_4B, $42
+	db BATTLEANIMOAMSET_4C, $42
+	db BATTLEANIMOAMSET_4D, $44
+	db BATTLEANIMOAMSET_4E, $42
+	db -3, $02
+	db BATTLEANIMOAMSET_4E, $42
+	db -3, $02
+	db BATTLEANIMOAMSET_4E, $42
+	db -3, $02
+	db BATTLEANIMOAMSET_4E, $42
+	db -4
+
+.Frameset_40:
+	db BATTLEANIMOAMSET_4B, $c2
+	db BATTLEANIMOAMSET_4C, $c2
+	db BATTLEANIMOAMSET_4D, $c4
+	db BATTLEANIMOAMSET_4E, $c2
+	db -3, $02
+	db BATTLEANIMOAMSET_4E, $c2
+	db -3, $02
+	db BATTLEANIMOAMSET_4E, $c2
+	db -3, $02
+	db BATTLEANIMOAMSET_4E, $c2
+	db -4
+
+.Frameset_41:
+	db BATTLEANIMOAMSET_4B, $01
+	db BATTLEANIMOAMSET_4C, $01
+	db BATTLEANIMOAMSET_4D, $01
+	db BATTLEANIMOAMSET_4F, $01
+	db BATTLEANIMOAMSET_50, $01
+	db BATTLEANIMOAMSET_51, $01
+	db BATTLEANIMOAMSET_52, $02
+	db -3, $02
+	db BATTLEANIMOAMSET_52, $02
+	db -3, $02
+	db BATTLEANIMOAMSET_52, $02
+	db -3, $02
+	db BATTLEANIMOAMSET_52, $02
+	db -4
+
+.Frameset_42:
+	db BATTLEANIMOAMSET_4B, $41
+	db BATTLEANIMOAMSET_4C, $41
+	db BATTLEANIMOAMSET_4D, $41
+	db BATTLEANIMOAMSET_4F, $41
+	db BATTLEANIMOAMSET_50, $41
+	db BATTLEANIMOAMSET_51, $41
+	db BATTLEANIMOAMSET_52, $42
+	db -3, $02
+	db BATTLEANIMOAMSET_52, $42
+	db -3, $02
+	db BATTLEANIMOAMSET_52, $42
+	db -3, $02
+	db BATTLEANIMOAMSET_52, $42
+	db -4
+
+.Frameset_08:
+	db BATTLEANIMOAMSET_00, $03
+	db BATTLEANIMOAMSET_07, $03
+	db BATTLEANIMOAMSET_08, $03
+	db BATTLEANIMOAMSET_09, $03
+	db -4
+
+.Frameset_09:
+	db BATTLEANIMOAMSET_0A, $07
+	db BATTLEANIMOAMSET_0B, $07
+	db BATTLEANIMOAMSET_0A, $07
+	db BATTLEANIMOAMSET_0B, $47
+	db -2
+
+.Frameset_0a:
+	db BATTLEANIMOAMSET_0C, $08
+	db -1
+
+.Frameset_0b:
+	db BATTLEANIMOAMSET_0D, $08
+	db -1
+
+.Frameset_0c:
+	db BATTLEANIMOAMSET_0A, $08
+	db -1
+
+.Frameset_0d:
+	db BATTLEANIMOAMSET_0A, $07
+	db BATTLEANIMOAMSET_0B, $07
+	db BATTLEANIMOAMSET_0A, $07
+	db BATTLEANIMOAMSET_0B, $47
+	db BATTLEANIMOAMSET_0A, $07
+	db -1
+
+.Frameset_0e:
+	db BATTLEANIMOAMSET_0A, $08
+	db -1
+
+.Frameset_0f:
+	db BATTLEANIMOAMSET_0A, $04
+	db BATTLEANIMOAMSET_0E, $04
+	db -2
+
+.Frameset_10:
+	db BATTLEANIMOAMSET_0F, $04
+	db BATTLEANIMOAMSET_10, $04
+	db -2
+
+.Frameset_11:
+	db BATTLEANIMOAMSET_10, $04
+	db BATTLEANIMOAMSET_0F, $04
+	db BATTLEANIMOAMSET_0E, $04
+	db BATTLEANIMOAMSET_0A, $04
+	db BATTLEANIMOAMSET_0E, $04
+	db BATTLEANIMOAMSET_0A, $04
+	db BATTLEANIMOAMSET_0E, $04
+	db BATTLEANIMOAMSET_0A, $04
+	db -4
+
+.Frameset_12:
+	db BATTLEANIMOAMSET_10, $01
+	db BATTLEANIMOAMSET_0F, $01
+	db BATTLEANIMOAMSET_12, $01
+	db BATTLEANIMOAMSET_11, $01
+	db BATTLEANIMOAMSET_12, $01
+	db BATTLEANIMOAMSET_0F, $01
+	db -2
+
+.Frameset_13:
+	db BATTLEANIMOAMSET_10, $03
+	db BATTLEANIMOAMSET_0F, $03
+	db BATTLEANIMOAMSET_12, $01
+	db -3, $01
+	db BATTLEANIMOAMSET_12, $01
+	db -3, $01
+	db BATTLEANIMOAMSET_12, $01
+	db -3, $01
+	db BATTLEANIMOAMSET_12, $01
+	db -3, $01
+	db BATTLEANIMOAMSET_12, $03
+	db -4
+
+.Frameset_14:
+	db BATTLEANIMOAMSET_13, $14
+	db -4
+
+.Frameset_15:
+	db BATTLEANIMOAMSET_10, $01
+	db BATTLEANIMOAMSET_0F, $01
+	db -2
+
+.Frameset_16:
+	db BATTLEANIMOAMSET_14, $08
+	db -1
+
+.Frameset_17:
+	db BATTLEANIMOAMSET_17, $04
+	db BATTLEANIMOAMSET_16, $08
+	db BATTLEANIMOAMSET_15, $08
+	db BATTLEANIMOAMSET_16, $08
+	db BATTLEANIMOAMSET_17, $04
+	db BATTLEANIMOAMSET_17, $04
+	db BATTLEANIMOAMSET_16, $48
+	db BATTLEANIMOAMSET_15, $48
+	db BATTLEANIMOAMSET_16, $48
+	db BATTLEANIMOAMSET_17, $04
+	db -2
+
+.Frameset_56:
+	db BATTLEANIMOAMSET_69, $08
+	db -1
+
+.Frameset_57:
+	db BATTLEANIMOAMSET_69, $20
+	db BATTLEANIMOAMSET_6A, $04
+	db BATTLEANIMOAMSET_6B, $04
+	db BATTLEANIMOAMSET_6D, $04
+	db BATTLEANIMOAMSET_6C, $04
+	db -1
+
+.Frameset_58:
+	db BATTLEANIMOAMSET_6C, $08
+	db BATTLEANIMOAMSET_6D, $08
+	db -2
+
+.Frameset_18:
+	db BATTLEANIMOAMSET_18, $04
+	db BATTLEANIMOAMSET_19, $04
+	db BATTLEANIMOAMSET_1A, $04
+	db -4
+
+.Frameset_19:
+	db BATTLEANIMOAMSET_1B, $08
+	db -1
+
+.Frameset_1a:
+	db BATTLEANIMOAMSET_0F, $08
+	db -1
+
+.Frameset_1b:
+	db BATTLEANIMOAMSET_1C, $08
+	db -1
+
+.Frameset_1c:
+	db BATTLEANIMOAMSET_0A, $08
+	db -4
+
+.Frameset_1d:
+	db BATTLEANIMOAMSET_1D, $08
+	db -1
+
+.Frameset_1e:
+	db BATTLEANIMOAMSET_17, $08
+	db -1
+
+.Frameset_1f:
+	db BATTLEANIMOAMSET_0F, $03
+	db BATTLEANIMOAMSET_10, $03
+	db BATTLEANIMOAMSET_1E, $03
+	db -1
+
+.Frameset_20:
+	db BATTLEANIMOAMSET_1F, $10
+	db BATTLEANIMOAMSET_20, $03
+	db -4
+
+.Frameset_21:
+	db BATTLEANIMOAMSET_20, $08
+	db -1
+
+.Frameset_22:
+	db BATTLEANIMOAMSET_20, $08
+	db BATTLEANIMOAMSET_21, $08
+	db BATTLEANIMOAMSET_1B, $08
+	db BATTLEANIMOAMSET_21, $08
+	db -2
+
+.Frameset_23:
+	db BATTLEANIMOAMSET_22, $08
+	db -1
+
+.Frameset_24:
+	db BATTLEANIMOAMSET_1B, $08
+	db -1
+
+.Frameset_25:
+	db BATTLEANIMOAMSET_23, $08
+	db -1
+
+.Frameset_26:
+	db BATTLEANIMOAMSET_24, $08
+	db -1
+
+.Frameset_27:
+	db BATTLEANIMOAMSET_25, $08
+	db -1
+
+.Frameset_28:
+	db BATTLEANIMOAMSET_26, $08
+	db BATTLEANIMOAMSET_27, $08
+	db -1
+
+.Frameset_29:
+	db BATTLEANIMOAMSET_28, $08
+	db BATTLEANIMOAMSET_29, $08
+	db -4
+
+.Frameset_2a:
+	db BATTLEANIMOAMSET_2A, $01
+	db BATTLEANIMOAMSET_2B, $01
+	db BATTLEANIMOAMSET_2C, $01
+	db BATTLEANIMOAMSET_2D, $01
+	db BATTLEANIMOAMSET_2E, $01
+	db BATTLEANIMOAMSET_2D, $01
+	db BATTLEANIMOAMSET_2C, $01
+	db BATTLEANIMOAMSET_2B, $01
+	db BATTLEANIMOAMSET_2A, $01
+	db -4
+
+.Frameset_2b:
+	db BATTLEANIMOAMSET_14, $01
+	db BATTLEANIMOAMSET_15, $01
+	db -2
+
+.Frameset_2c:
+	db BATTLEANIMOAMSET_2F, $04
+	db BATTLEANIMOAMSET_30, $28
+	db -4
+
+.Frameset_2d:
+	db BATTLEANIMOAMSET_31, $08
+	db -1
+
+.Frameset_2e:
+	db BATTLEANIMOAMSET_32, $20
+	db BATTLEANIMOAMSET_33, $20
+	db BATTLEANIMOAMSET_34, $20
+	db BATTLEANIMOAMSET_35, $20 ; fallthrough
+.Frameset_2f:
+	db -3, $02
+	db BATTLEANIMOAMSET_35, $04
+	db -3, $02
+	db BATTLEANIMOAMSET_35, $04
+	db -3, $02
+	db BATTLEANIMOAMSET_35, $04
+	db -3, $02
+	db BATTLEANIMOAMSET_35, $04
+	db -4
+
+.Frameset_30:
+	db BATTLEANIMOAMSET_14, $04
+	db BATTLEANIMOAMSET_15, $04
+	db -2
+
+.Frameset_31:
+	db BATTLEANIMOAMSET_36, $02
+	db BATTLEANIMOAMSET_37, $02
+	db BATTLEANIMOAMSET_38, $02
+	db BATTLEANIMOAMSET_39, $20
+	db -4
+
+.Frameset_32:
+	db BATTLEANIMOAMSET_3A, $02
+	db BATTLEANIMOAMSET_3B, $02
+	db BATTLEANIMOAMSET_3C, $02
+	db BATTLEANIMOAMSET_3D, $20
+	db -4
+
+.Frameset_33:
+	db BATTLEANIMOAMSET_3A, $42
+	db BATTLEANIMOAMSET_3B, $42
+	db BATTLEANIMOAMSET_3C, $42
+	db BATTLEANIMOAMSET_3D, $60
+	db -4
+
+.Frameset_34:
+	db BATTLEANIMOAMSET_3E, $08
+	db BATTLEANIMOAMSET_3F, $08
+	db BATTLEANIMOAMSET_40, $08
+	db -1
+
+.Frameset_35:
+	db BATTLEANIMOAMSET_40, $02
+	db -3, $02
+	db BATTLEANIMOAMSET_40, $02
+	db -3, $02
+	db BATTLEANIMOAMSET_41, $02
+	db -3, $02
+	db BATTLEANIMOAMSET_41, $02
+	db -3, $02
+	db -2
+
+.Frameset_36:
+	db BATTLEANIMOAMSET_42, $02
+	db BATTLEANIMOAMSET_43, $02
+	db BATTLEANIMOAMSET_44, $02
+	db BATTLEANIMOAMSET_45, $02
+	db -2
+
+.Frameset_37:
+	db BATTLEANIMOAMSET_19, $02
+	db -3, $02
+	db -2
+
+.Frameset_38:
+	db BATTLEANIMOAMSET_46, $04
+	db BATTLEANIMOAMSET_47, $04
+	db -2
+
+.Frameset_39:
+	db BATTLEANIMOAMSET_18, $02
+	db -3, $02
+	db -2
+
+.Frameset_3a:
+	db BATTLEANIMOAMSET_48, $08
+	db -1
+
+.Frameset_3b:
+	db BATTLEANIMOAMSET_48, $48
+	db -1
+
+.Frameset_3c:
+	db BATTLEANIMOAMSET_49, $08
+	db -1
+
+.Frameset_3d:
+	db BATTLEANIMOAMSET_4A, $08
+	db -1
+
+.Frameset_43:
+	db BATTLEANIMOAMSET_20, $10
+	db BATTLEANIMOAMSET_1F, $10
+	db BATTLEANIMOAMSET_1E, $10
+	db -1
+
+.Frameset_4c:
+	db BATTLEANIMOAMSET_20, $08
+	db BATTLEANIMOAMSET_1F, $08
+	db BATTLEANIMOAMSET_1E, $08
+	db -1
+
+.Frameset_44:
+	db -3, $14
+	db BATTLEANIMOAMSET_55, $28
+	db BATTLEANIMOAMSET_54, $28
+	db BATTLEANIMOAMSET_53, $14
+	db -3, $04
+	db BATTLEANIMOAMSET_53, $04
+	db -3, $04
+	db BATTLEANIMOAMSET_53, $04
+	db -3, $04
+	db BATTLEANIMOAMSET_53, $04
+	db -4
+
+.Frameset_7e:
+	db BATTLEANIMOAMSET_1E, $08
+	db BATTLEANIMOAMSET_1F, $08
+	db BATTLEANIMOAMSET_20, $08
+	db -4
+
+.Frameset_45:
+	db -3, $00
+	db BATTLEANIMOAMSET_14, $00
+	db BATTLEANIMOAMSET_15, $00
+	db BATTLEANIMOAMSET_14, $40
+	db -3, $00
+	db BATTLEANIMOAMSET_16, $40
+	db BATTLEANIMOAMSET_15, $00
+	db BATTLEANIMOAMSET_16, $00
+	db -2
+
+.Frameset_46:
+	db BATTLEANIMOAMSET_56, $02
+	db BATTLEANIMOAMSET_57, $04
+	db -4
+
+.Frameset_47:
+	db BATTLEANIMOAMSET_56, $c2
+	db BATTLEANIMOAMSET_57, $c4
+	db -4
+
+.Frameset_48:
+	db BATTLEANIMOAMSET_56, $01
+	db BATTLEANIMOAMSET_57, $01
+	db BATTLEANIMOAMSET_58, $01
+	db BATTLEANIMOAMSET_57, $c1
+	db BATTLEANIMOAMSET_58, $c1
+	db BATTLEANIMOAMSET_57, $02
+	db -4
+
+.Frameset_49:
+	db BATTLEANIMOAMSET_56, $c1
+	db BATTLEANIMOAMSET_57, $c1
+	db BATTLEANIMOAMSET_58, $c1
+	db BATTLEANIMOAMSET_57, $01
+	db BATTLEANIMOAMSET_58, $01
+	db BATTLEANIMOAMSET_57, $c2
+	db -4
+
+.Frameset_4a:
+	db BATTLEANIMOAMSET_57, $c1
+	db BATTLEANIMOAMSET_58, $c1
+	db BATTLEANIMOAMSET_57, $01
+	db BATTLEANIMOAMSET_58, $01
+	db -2
+
+.Frameset_4b:
+	db BATTLEANIMOAMSET_59, $01
+	db BATTLEANIMOAMSET_5A, $01
+	db BATTLEANIMOAMSET_5B, $01
+	db BATTLEANIMOAMSET_5C, $02
+	db -4
+
+.Frameset_4d:
+	db BATTLEANIMOAMSET_0A, $0a
+	db BATTLEANIMOAMSET_0B, $43
+	db BATTLEANIMOAMSET_5D, $43
+	db BATTLEANIMOAMSET_0B, $c3
+	db BATTLEANIMOAMSET_0A, $82
+	db BATTLEANIMOAMSET_0B, $81
+	db BATTLEANIMOAMSET_5D, $01
+	db BATTLEANIMOAMSET_0B, $01
+	db -2
+
+.Frameset_4e:
+	db BATTLEANIMOAMSET_0A, $03
+	db BATTLEANIMOAMSET_0B, $47
+	db BATTLEANIMOAMSET_0A, $07
+	db BATTLEANIMOAMSET_0B, $07
+	db BATTLEANIMOAMSET_0A, $03
+	db -2
+
+.Frameset_4f:
+	db BATTLEANIMOAMSET_5E, $20
+	db BATTLEANIMOAMSET_5E, $20
+	db -4
+
+.Frameset_50:
+	db BATTLEANIMOAMSET_5F, $20
+	db BATTLEANIMOAMSET_5F, $20
+	db -4
+
+.Frameset_51:
+	db BATTLEANIMOAMSET_60, $08
+	db -1
+
+.Frameset_52:
+	db BATTLEANIMOAMSET_61, $01
+	db BATTLEANIMOAMSET_62, $01
+	db BATTLEANIMOAMSET_63, $01
+	db -1
+
+.Frameset_53:
+	db BATTLEANIMOAMSET_63, $07
+	db BATTLEANIMOAMSET_64, $07
+	db -2
+
+.Frameset_54:
+	db BATTLEANIMOAMSET_65, $01
+	db BATTLEANIMOAMSET_66, $01
+	db BATTLEANIMOAMSET_67, $01
+	db -1
+
+.Frameset_55:
+	db BATTLEANIMOAMSET_67, $07
+	db BATTLEANIMOAMSET_68, $07
+	db -2
+
+.Frameset_59:
+	db BATTLEANIMOAMSET_6E, $08
+	db -1
+
+.Frameset_5a:
+	db BATTLEANIMOAMSET_6F, $08
+	db -1
+
+.Frameset_5b:
+	db BATTLEANIMOAMSET_6E, $88
+	db -1
+
+.Frameset_5c:
+	db BATTLEANIMOAMSET_18, $04
+	db BATTLEANIMOAMSET_70, $04
+	db BATTLEANIMOAMSET_71, $04
+	db BATTLEANIMOAMSET_72, $04
+	db BATTLEANIMOAMSET_73, $04
+	db -4
+
+.Frameset_5d:
+	db BATTLEANIMOAMSET_74, $04
+	db BATTLEANIMOAMSET_75, $04
+	db -2
+
+.Frameset_5e:
+	db BATTLEANIMOAMSET_14, $08
+	db -1
+
+.Frameset_7a:
+	db BATTLEANIMOAMSET_74, $03
+	db BATTLEANIMOAMSET_14, $03
+	db BATTLEANIMOAMSET_15, $03
+	db BATTLEANIMOAMSET_14, $03
+	db BATTLEANIMOAMSET_15, $03
+	db -4
+
+.Frameset_af:
+	db BATTLEANIMOAMSET_14, $00
+	db BATTLEANIMOAMSET_15, $00
+	db BATTLEANIMOAMSET_14, $00
+	db BATTLEANIMOAMSET_15, $00
+	db BATTLEANIMOAMSET_74, $0c
+	db -4
+
+.Frameset_5f:
+	db BATTLEANIMOAMSET_76, $08
+	db -1
+
+.Frameset_60:
+	db BATTLEANIMOAMSET_77, $01
+	db BATTLEANIMOAMSET_78, $01
+	db BATTLEANIMOAMSET_79, $01
+	db BATTLEANIMOAMSET_7A, $01
+	db BATTLEANIMOAMSET_7B, $01
+	db BATTLEANIMOAMSET_7C, $01
+	db BATTLEANIMOAMSET_7D, $01
+	db BATTLEANIMOAMSET_7C, $c1
+	db BATTLEANIMOAMSET_7B, $c1
+	db BATTLEANIMOAMSET_7A, $c1
+	db BATTLEANIMOAMSET_79, $c1
+	db BATTLEANIMOAMSET_78, $c1
+	db BATTLEANIMOAMSET_77, $c1
+	db -4
+
+.Frameset_61:
+	db BATTLEANIMOAMSET_1B, $04
+	db BATTLEANIMOAMSET_7E, $04
+	db -2
+
+.Frameset_62:
+	db BATTLEANIMOAMSET_1B, $44
+	db BATTLEANIMOAMSET_7E, $44
+	db -2
+
+.Frameset_63:
+	db BATTLEANIMOAMSET_7F, $08
+	db -1
+
+.Frameset_64:
+	db BATTLEANIMOAMSET_25, $08
+	db -1
+
+.Frameset_65:
+	db BATTLEANIMOAMSET_80, $08
+	db -1
+
+.Frameset_66:
+	db BATTLEANIMOAMSET_83, $07
+	db BATTLEANIMOAMSET_82, $07
+	db BATTLEANIMOAMSET_81, $07
+	db BATTLEANIMOAMSET_82, $07
+	db BATTLEANIMOAMSET_83, $07
+	db BATTLEANIMOAMSET_82, $07
+	db BATTLEANIMOAMSET_81, $07
+	db -4
+
+.Frameset_67:
+	db BATTLEANIMOAMSET_1B, $10
+	db -4
+
+.Frameset_68:
+	db -3, $0f
+	db BATTLEANIMOAMSET_84, $0f
+	db BATTLEANIMOAMSET_85, $0f
+	db BATTLEANIMOAMSET_29, $0f
+	db BATTLEANIMOAMSET_28, $0f
+	db BATTLEANIMOAMSET_86, $20
+	db -4
+
+.Frameset_69:
+	db BATTLEANIMOAMSET_1B, $03
+	db BATTLEANIMOAMSET_87, $03
+	db BATTLEANIMOAMSET_88, $03
+	db BATTLEANIMOAMSET_89, $03
+	db -4
+
+.Frameset_6a:
+	db BATTLEANIMOAMSET_8A, $02
+	db BATTLEANIMOAMSET_8B, $02
+	db BATTLEANIMOAMSET_8C, $02
+	db BATTLEANIMOAMSET_8D, $02
+	db -4
+
+.Frameset_6b:
+	db BATTLEANIMOAMSET_61, $02
+	db BATTLEANIMOAMSET_62, $02
+	db BATTLEANIMOAMSET_63, $02
+	db -1
+
+.Frameset_6c:
+	db BATTLEANIMOAMSET_65, $02
+	db BATTLEANIMOAMSET_66, $02
+	db BATTLEANIMOAMSET_67, $02
+	db -1
+
+.Frameset_6d:
+	db BATTLEANIMOAMSET_8E, $08
+	db -1
+
+.Frameset_6e:
+	db BATTLEANIMOAMSET_8E, $48
+	db -1
+
+.Frameset_6f:
+	db BATTLEANIMOAMSET_8F, $10
+	db BATTLEANIMOAMSET_90, $10
+	db -2
+
+.Frameset_70:
+	db BATTLEANIMOAMSET_91, $10
+	db BATTLEANIMOAMSET_92, $10
+	db -2
+
+.Frameset_71:
+	db BATTLEANIMOAMSET_93, $08
+	db -1
+
+.Frameset_72:
+	db BATTLEANIMOAMSET_1E, $08
+	db -1
+
+.Frameset_73:
+	db BATTLEANIMOAMSET_1B, $07
+	db BATTLEANIMOAMSET_94, $07
+	db -2
+
+.Frameset_74:
+	db BATTLEANIMOAMSET_95, $08
+	db -1
+
+.Frameset_75:
+	db BATTLEANIMOAMSET_96, $08
+	db -1
+
+.Frameset_76:
+	db BATTLEANIMOAMSET_95, $08
+	db -1
+
+.Frameset_77:
+	db BATTLEANIMOAMSET_97, $01
+	db BATTLEANIMOAMSET_97, $41
+	db -2
+
+.Frameset_78:
+	db BATTLEANIMOAMSET_98, $08
+	db -1
+
+.Frameset_79:
+	db BATTLEANIMOAMSET_99, $20
+	db BATTLEANIMOAMSET_99, $20
+	db BATTLEANIMOAMSET_99, $20
+	db BATTLEANIMOAMSET_99, $20
+	db BATTLEANIMOAMSET_99, $20
+	db BATTLEANIMOAMSET_9A, $08
+	db -1
+
+.Frameset_7b:
+	db BATTLEANIMOAMSET_9B, $08
+	db -1
+
+.Frameset_7c:
+	db BATTLEANIMOAMSET_9C, $02
+	db BATTLEANIMOAMSET_9D, $02
+	db BATTLEANIMOAMSET_9E, $08
+	db -3, $02
+	db BATTLEANIMOAMSET_9E, $02
+	db -3, $02
+	db BATTLEANIMOAMSET_9E, $02
+	db -3, $02
+	db BATTLEANIMOAMSET_9E, $02
+	db -4
+
+.Frameset_7d:
+	db BATTLEANIMOAMSET_9F, $08
+	db -1
+
+.Frameset_7f:
+	db BATTLEANIMOAMSET_0F, $08
+	db -1
+
+.Frameset_80:
+	db BATTLEANIMOAMSET_6B, $18
+	db -4
+
+.Frameset_81:
+	db BATTLEANIMOAMSET_A0, $01 ; fallthrough
+.Frameset_82:
+	db BATTLEANIMOAMSET_A1, $01 ; fallthrough
+.Frameset_83:
+	db BATTLEANIMOAMSET_A2, $01
+	db -4
+
+.Frameset_84:
+	db BATTLEANIMOAMSET_A3, $08
+	db -1
+
+.Frameset_85:
+	db BATTLEANIMOAMSET_A4, $04
+	db BATTLEANIMOAMSET_A5, $04
+	db BATTLEANIMOAMSET_A6, $04
+	db BATTLEANIMOAMSET_A7, $04
+	db BATTLEANIMOAMSET_A6, $44
+	db BATTLEANIMOAMSET_A5, $44
+	db -2
+
+.Frameset_86:
+	db BATTLEANIMOAMSET_A8, $04
+	db BATTLEANIMOAMSET_A9, $04
+	db BATTLEANIMOAMSET_AA, $04
+	db BATTLEANIMOAMSET_AB, $04
+	db BATTLEANIMOAMSET_AA, $44
+	db BATTLEANIMOAMSET_A9, $44
+	db -2
+
+.Frameset_87:
+	db BATTLEANIMOAMSET_1B, $08
+	db -1
+
+.Frameset_88:
+	db BATTLEANIMOAMSET_AC, $08
+	db -1
+
+.Frameset_89:
+	db BATTLEANIMOAMSET_AD, $08
+	db -1
+
+.Frameset_8a:
+	db BATTLEANIMOAMSET_AE, $08
+	db -1
+
+.Frameset_8b:
+	db BATTLEANIMOAMSET_AF, $08
+	db -1
+
+.Frameset_8c:
+	db BATTLEANIMOAMSET_B0, $20
+	db -4
+
+.Frameset_8d:
+	db BATTLEANIMOAMSET_B1, $07
+	db BATTLEANIMOAMSET_B1, $47
+	db -2
+
+.Frameset_8e:
+	db BATTLEANIMOAMSET_B2, $08
+	db -1
+
+.Frameset_8f:
+	db BATTLEANIMOAMSET_B3, $08
+	db -1
+
+.Frameset_90:
+	db BATTLEANIMOAMSET_B3, $48
+	db -1
+
+.Frameset_91:
+	db BATTLEANIMOAMSET_B3, $88
+	db -1
+
+.Frameset_92:
+	db BATTLEANIMOAMSET_B3, $c8
+	db -1
+
+.Frameset_93:
+	db BATTLEANIMOAMSET_B5, $08
+	db -1
+
+.Frameset_94:
+	db BATTLEANIMOAMSET_B5, $48
+	db -1
+
+.Frameset_95:
+	db BATTLEANIMOAMSET_B5, $88
+	db -1
+
+.Frameset_96:
+	db BATTLEANIMOAMSET_B5, $c8
+	db -1
+
+.Frameset_97:
+	db BATTLEANIMOAMSET_B4, $08
+	db -1
+
+.Frameset_98:
+	db BATTLEANIMOAMSET_6B, $08
+	db -1
+
+.Frameset_99:
+	db BATTLEANIMOAMSET_B6, $08
+	db -1
+
+.Frameset_9a:
+	db BATTLEANIMOAMSET_B7, $20
+	db -1
+
+.Frameset_9b:
+	db BATTLEANIMOAMSET_1B, $20
+	db -1
+
+.Frameset_9c:
+	db BATTLEANIMOAMSET_B8, $20
+	db -1
+
+.Frameset_9d:
+	db BATTLEANIMOAMSET_B8, $60
+	db -1
+
+.Frameset_9e:
+	db BATTLEANIMOAMSET_B9, $20
+	db -1
+
+.Frameset_9f:
+	db BATTLEANIMOAMSET_BA, $20
+	db -1
+
+.Frameset_a0:
+	db BATTLEANIMOAMSET_BB, $60
+	db -1
+
+.Frameset_a1:
+	db BATTLEANIMOAMSET_BB, $20
+	db -1
+
+.Frameset_a2:
+	db BATTLEANIMOAMSET_BC, $20
+	db -1
+
+.Frameset_a3:
+	db BATTLEANIMOAMSET_BD, $0b
+	db BATTLEANIMOAMSET_BE, $0b
+	db BATTLEANIMOAMSET_1B, $0b
+	db -4
+
+.Frameset_a4:
+	db BATTLEANIMOAMSET_BF, $04
+	db BATTLEANIMOAMSET_C0, $04
+	db BATTLEANIMOAMSET_C1, $04
+	db -4
+
+.Frameset_a5:
+	db BATTLEANIMOAMSET_C2, $20
+	db BATTLEANIMOAMSET_C2, $20
+	db -4
+
+.Frameset_a6:
+	db BATTLEANIMOAMSET_4B, $02
+	db BATTLEANIMOAMSET_4C, $02
+	db BATTLEANIMOAMSET_4D, $20
+	db BATTLEANIMOAMSET_4D, $20
+	db BATTLEANIMOAMSET_4D, $20
+	db BATTLEANIMOAMSET_4F, $01
+	db BATTLEANIMOAMSET_50, $01
+	db BATTLEANIMOAMSET_51, $01
+	db BATTLEANIMOAMSET_52, $02
+	db -3, $02
+	db BATTLEANIMOAMSET_52, $02
+	db -3, $02
+	db BATTLEANIMOAMSET_52, $02
+	db -3, $02
+	db BATTLEANIMOAMSET_52, $02
+	db -4
+
+.Frameset_a7:
+	db BATTLEANIMOAMSET_4B, $c2
+	db BATTLEANIMOAMSET_4C, $c2
+	db BATTLEANIMOAMSET_4D, $e0
+	db BATTLEANIMOAMSET_4D, $e0
+	db BATTLEANIMOAMSET_4D, $e0
+	db BATTLEANIMOAMSET_4F, $c1
+	db BATTLEANIMOAMSET_50, $c1
+	db BATTLEANIMOAMSET_51, $c1
+	db BATTLEANIMOAMSET_52, $c2
+	db -3, $02
+	db BATTLEANIMOAMSET_52, $c2
+	db -3, $02
+	db BATTLEANIMOAMSET_52, $c2
+	db -3, $02
+	db BATTLEANIMOAMSET_52, $c2
+	db -4
+
+.Frameset_a8:
+	db BATTLEANIMOAMSET_C3, $01
+	db BATTLEANIMOAMSET_C3, $c1
+	db -2
+
+.Frameset_a9:
+	db BATTLEANIMOAMSET_C4, $20
+	db -1
+
+.Frameset_aa:
+	db BATTLEANIMOAMSET_C5, $04
+	db BATTLEANIMOAMSET_C6, $04
+	db BATTLEANIMOAMSET_C7, $04
+	db -4
+
+.Frameset_ab:
+	db BATTLEANIMOAMSET_C8, $01
+	db BATTLEANIMOAMSET_C8, $41
+	db -2
+
+.Frameset_ac:
+	db BATTLEANIMOAMSET_C9, $03
+	db BATTLEANIMOAMSET_05, $03
+	db -4
+
+.Frameset_ad:
+	db BATTLEANIMOAMSET_CA, $20
+	db BATTLEANIMOAMSET_CB, $03
+	db BATTLEANIMOAMSET_CA, $03
+	db BATTLEANIMOAMSET_CB, $03
+	db -2
+
+.Frameset_ae:
+	db BATTLEANIMOAMSET_03, $a0
+	db -1
+
+.Frameset_b0:
+	db BATTLEANIMOAMSET_CC, $20
+	db -1
+
+.Frameset_b1:
+	db BATTLEANIMOAMSET_7F, $02
+	db BATTLEANIMOAMSET_25, $02
+	db BATTLEANIMOAMSET_80, $02
+	db BATTLEANIMOAMSET_25, $02
+	db -2
+
+.Frameset_b2:
+	db BATTLEANIMOAMSET_CD, $04
+	db BATTLEANIMOAMSET_CE, $04
+	db BATTLEANIMOAMSET_CD, $c4
+	db BATTLEANIMOAMSET_CE, $c4
+	db -2
+
+.Frameset_b3:
+	db BATTLEANIMOAMSET_CF, $04
+	db BATTLEANIMOAMSET_D0, $04
+	db BATTLEANIMOAMSET_D1, $04
+	db BATTLEANIMOAMSET_D2, $04
+	db -4
+
+.Frameset_b4:
+	db BATTLEANIMOAMSET_D3, $20
+	db -1
+
+.Frameset_b5:
+	db BATTLEANIMOAMSET_D4, $08
+	db -1
+
+.Frameset_b6:
+	db BATTLEANIMOAMSET_D5, $08
+	db -1
+
+.Frameset_b7:
+	db BATTLEANIMOAMSET_D6, $08
+	db -1
+
+.Frameset_b8:
+	db BATTLEANIMOAMSET_D7, $08
+	db -1
+
+; ceeae
--- /dev/null
+++ b/data/anims/oam.asm
@@ -1,0 +1,1086 @@
+BattleAnimOAMData: ; ceeae
+; entries correspond to BATTLEANIMOAMSET_* constants
+	; vtile offset, length, pointer
+	dbbw $00, 16, .OAMData_00 ; BATTLEANIMOAMSET_00
+	dbbw $04,  9, .OAMData_01 ; BATTLEANIMOAMSET_01
+	dbbw $08,  4, .OAMData_02 ; BATTLEANIMOAMSET_02
+	dbbw $09,  4, .OAMData_03 ; BATTLEANIMOAMSET_03
+	dbbw $0d,  4, .OAMData_04 ; BATTLEANIMOAMSET_04
+	dbbw $0f,  4, .OAMData_03 ; BATTLEANIMOAMSET_05
+	dbbw $13,  4, .OAMData_04 ; BATTLEANIMOAMSET_06
+	dbbw $04, 16, .OAMData_00 ; BATTLEANIMOAMSET_07
+	dbbw $08, 16, .OAMData_00 ; BATTLEANIMOAMSET_08
+	dbbw $08, 16, .OAMData_09 ; BATTLEANIMOAMSET_09
+	dbbw $00,  4, .OAMData_04 ; BATTLEANIMOAMSET_0A
+	dbbw $02,  4, .OAMData_03 ; BATTLEANIMOAMSET_0B
+	dbbw $06,  2, .OAMData_0c ; BATTLEANIMOAMSET_0C
+	dbbw $07,  2, .OAMData_0c ; BATTLEANIMOAMSET_0D
+	dbbw $02,  4, .OAMData_04 ; BATTLEANIMOAMSET_0E
+	dbbw $04,  1, .OAMData_0f ; BATTLEANIMOAMSET_0F
+	dbbw $05,  1, .OAMData_0f ; BATTLEANIMOAMSET_10
+	dbbw $00,  2, .OAMData_11 ; BATTLEANIMOAMSET_11
+	dbbw $02,  2, .OAMData_11 ; BATTLEANIMOAMSET_12
+	dbbw $00,  4, .OAMData_13 ; BATTLEANIMOAMSET_13
+	dbbw $00,  1, .OAMData_0f ; BATTLEANIMOAMSET_14
+	dbbw $01,  1, .OAMData_0f ; BATTLEANIMOAMSET_15
+	dbbw $02,  1, .OAMData_0f ; BATTLEANIMOAMSET_16
+	dbbw $03,  1, .OAMData_0f ; BATTLEANIMOAMSET_17
+	dbbw $00,  4, .OAMData_02 ; BATTLEANIMOAMSET_18
+	dbbw $01, 16, .OAMData_00 ; BATTLEANIMOAMSET_19
+	dbbw $05, 16, .OAMData_00 ; BATTLEANIMOAMSET_1A
+	dbbw $00,  4, .OAMData_03 ; BATTLEANIMOAMSET_1B
+	dbbw $05, 12, .OAMData_1c ; BATTLEANIMOAMSET_1C
+	dbbw $02,  4, .OAMData_02 ; BATTLEANIMOAMSET_1D
+	dbbw $06,  1, .OAMData_0f ; BATTLEANIMOAMSET_1E
+	dbbw $07,  1, .OAMData_0f ; BATTLEANIMOAMSET_1F
+	dbbw $08,  1, .OAMData_0f ; BATTLEANIMOAMSET_20
+	dbbw $04,  4, .OAMData_03 ; BATTLEANIMOAMSET_21
+	dbbw $09, 22, .OAMData_22 ; BATTLEANIMOAMSET_22
+	dbbw $04,  2, .OAMData_11 ; BATTLEANIMOAMSET_23
+	dbbw $06,  2, .OAMData_11 ; BATTLEANIMOAMSET_24
+	dbbw $0c,  1, .OAMData_0f ; BATTLEANIMOAMSET_25
+	dbbw $0a,  1, .OAMData_0f ; BATTLEANIMOAMSET_26
+	dbbw $0b,  4, .OAMData_02 ; BATTLEANIMOAMSET_27
+	dbbw $08,  4, .OAMData_04 ; BATTLEANIMOAMSET_28
+	dbbw $06,  4, .OAMData_04 ; BATTLEANIMOAMSET_29
+	dbbw $00,  5, .OAMData_2a ; BATTLEANIMOAMSET_2A
+	dbbw $03,  6, .OAMData_2b ; BATTLEANIMOAMSET_2B
+	dbbw $00,  7, .OAMData_2c ; BATTLEANIMOAMSET_2C
+	dbbw $03,  8, .OAMData_2d ; BATTLEANIMOAMSET_2D
+	dbbw $00,  9, .OAMData_2e ; BATTLEANIMOAMSET_2E
+	dbbw $00,  4, .OAMData_2f ; BATTLEANIMOAMSET_2F
+	dbbw $02,  4, .OAMData_30 ; BATTLEANIMOAMSET_30
+	dbbw $04,  6, .OAMData_31 ; BATTLEANIMOAMSET_31
+	dbbw $00,  2, .OAMData_32 ; BATTLEANIMOAMSET_32
+	dbbw $00,  7, .OAMData_33 ; BATTLEANIMOAMSET_33
+	dbbw $00, 14, .OAMData_32 ; BATTLEANIMOAMSET_34
+	dbbw $00, 21, .OAMData_33 ; BATTLEANIMOAMSET_35
+	dbbw $00,  2, .OAMData_36 ; BATTLEANIMOAMSET_36
+	dbbw $00,  6, .OAMData_36 ; BATTLEANIMOAMSET_37
+	dbbw $00, 10, .OAMData_36 ; BATTLEANIMOAMSET_38
+	dbbw $00, 14, .OAMData_36 ; BATTLEANIMOAMSET_39
+	dbbw $00,  2, .OAMData_3a ; BATTLEANIMOAMSET_3A
+	dbbw $00,  6, .OAMData_3a ; BATTLEANIMOAMSET_3B
+	dbbw $00, 10, .OAMData_3a ; BATTLEANIMOAMSET_3C
+	dbbw $00, 14, .OAMData_3a ; BATTLEANIMOAMSET_3D
+	dbbw $00,  4, .OAMData_3e ; BATTLEANIMOAMSET_3E
+	dbbw $00, 16, .OAMData_3e ; BATTLEANIMOAMSET_3F
+	dbbw $00, 26, .OAMData_3e ; BATTLEANIMOAMSET_40
+	dbbw $00, 26, .OAMData_41 ; BATTLEANIMOAMSET_41
+	dbbw $0e,  4, .OAMData_42 ; BATTLEANIMOAMSET_42
+	dbbw $0e,  8, .OAMData_42 ; BATTLEANIMOAMSET_43
+	dbbw $0e,  4, .OAMData_44 ; BATTLEANIMOAMSET_44
+	dbbw $0e,  8, .OAMData_44 ; BATTLEANIMOAMSET_45
+	dbbw $0e,  4, .OAMData_46 ; BATTLEANIMOAMSET_46
+	dbbw $0e,  4, .OAMData_47 ; BATTLEANIMOAMSET_47
+	dbbw $00,  6, .OAMData_48 ; BATTLEANIMOAMSET_48
+	dbbw $03,  4, .OAMData_49 ; BATTLEANIMOAMSET_49
+	dbbw $03,  2, .OAMData_4a ; BATTLEANIMOAMSET_4A
+	dbbw $01,  5, .OAMData_0f ; BATTLEANIMOAMSET_4B
+	dbbw $01,  6, .OAMData_4c ; BATTLEANIMOAMSET_4C
+	dbbw $01,  7, .OAMData_4d ; BATTLEANIMOAMSET_4D
+	dbbw $01,  3, .OAMData_4d ; BATTLEANIMOAMSET_4E
+	dbbw $01,  8, .OAMData_4f ; BATTLEANIMOAMSET_4F
+	dbbw $01,  9, .OAMData_50 ; BATTLEANIMOAMSET_50
+	dbbw $01, 10, .OAMData_51 ; BATTLEANIMOAMSET_51
+	dbbw $01,  6, .OAMData_51 ; BATTLEANIMOAMSET_52
+	dbbw $00,  9, .OAMData_01 ; BATTLEANIMOAMSET_53
+	dbbw $04,  4, .OAMData_02 ; BATTLEANIMOAMSET_54
+	dbbw $05,  4, .OAMData_02 ; BATTLEANIMOAMSET_55
+	dbbw $00,  2, .OAMData_56 ; BATTLEANIMOAMSET_56
+	dbbw $02,  2, .OAMData_56 ; BATTLEANIMOAMSET_57
+	dbbw $04,  2, .OAMData_56 ; BATTLEANIMOAMSET_58
+	dbbw $02,  4, .OAMData_59 ; BATTLEANIMOAMSET_59
+	dbbw $02,  4, .OAMData_5a ; BATTLEANIMOAMSET_5A
+	dbbw $02,  2, .OAMData_0c ; BATTLEANIMOAMSET_5B
+	dbbw $04,  2, .OAMData_0c ; BATTLEANIMOAMSET_5C
+	dbbw $06,  4, .OAMData_5d ; BATTLEANIMOAMSET_5D
+	dbbw $08,  2, .OAMData_0c ; BATTLEANIMOAMSET_5E
+	dbbw $09,  2, .OAMData_0c ; BATTLEANIMOAMSET_5F
+	dbbw $05,  2, .OAMData_60 ; BATTLEANIMOAMSET_60
+	dbbw $00,  2, .OAMData_61 ; BATTLEANIMOAMSET_61
+	dbbw $00,  5, .OAMData_61 ; BATTLEANIMOAMSET_62
+	dbbw $00,  9, .OAMData_61 ; BATTLEANIMOAMSET_63
+	dbbw $09,  9, .OAMData_61 ; BATTLEANIMOAMSET_64
+	dbbw $00,  4, .OAMData_65 ; BATTLEANIMOAMSET_65
+	dbbw $00,  7, .OAMData_65 ; BATTLEANIMOAMSET_66
+	dbbw $00,  9, .OAMData_65 ; BATTLEANIMOAMSET_67
+	dbbw $09,  9, .OAMData_65 ; BATTLEANIMOAMSET_68
+	dbbw $04,  1, .OAMData_69 ; BATTLEANIMOAMSET_69
+	dbbw $05,  2, .OAMData_6a ; BATTLEANIMOAMSET_6A
+	dbbw $06,  4, .OAMData_03 ; BATTLEANIMOAMSET_6B
+	dbbw $0a,  4, .OAMData_03 ; BATTLEANIMOAMSET_6C
+	dbbw $0e,  4, .OAMData_03 ; BATTLEANIMOAMSET_6D
+	dbbw $08,  5, .OAMData_6e ; BATTLEANIMOAMSET_6E
+	dbbw $0d,  3, .OAMData_6f ; BATTLEANIMOAMSET_6F
+	dbbw $01,  8, .OAMData_70 ; BATTLEANIMOAMSET_70
+	dbbw $03,  8, .OAMData_70 ; BATTLEANIMOAMSET_71
+	dbbw $05,  8, .OAMData_70 ; BATTLEANIMOAMSET_72
+	dbbw $07,  8, .OAMData_70 ; BATTLEANIMOAMSET_73
+	dbbw $06,  4, .OAMData_02 ; BATTLEANIMOAMSET_74
+	dbbw $07,  4, .OAMData_02 ; BATTLEANIMOAMSET_75
+	dbbw $0a,  2, .OAMData_76 ; BATTLEANIMOAMSET_76
+	dbbw $00,  1, .OAMData_77 ; BATTLEANIMOAMSET_77
+	dbbw $00,  3, .OAMData_78 ; BATTLEANIMOAMSET_78
+	dbbw $00,  6, .OAMData_79 ; BATTLEANIMOAMSET_79
+	dbbw $00,  9, .OAMData_7a ; BATTLEANIMOAMSET_7A
+	dbbw $00, 12, .OAMData_7b ; BATTLEANIMOAMSET_7B
+	dbbw $00, 14, .OAMData_7c ; BATTLEANIMOAMSET_7C
+	dbbw $00, 15, .OAMData_7d ; BATTLEANIMOAMSET_7D
+	dbbw $04,  4, .OAMData_03 ; BATTLEANIMOAMSET_7E
+	dbbw $08,  4, .OAMData_03 ; BATTLEANIMOAMSET_7F
+	dbbw $0d,  1, .OAMData_0f ; BATTLEANIMOAMSET_80
+	dbbw $0e,  4, .OAMData_81 ; BATTLEANIMOAMSET_81
+	dbbw $10,  1, .OAMData_0f ; BATTLEANIMOAMSET_82
+	dbbw $11,  1, .OAMData_0f ; BATTLEANIMOAMSET_83
+	dbbw $04,  2, .OAMData_6a ; BATTLEANIMOAMSET_84
+	dbbw $05,  2, .OAMData_6a ; BATTLEANIMOAMSET_85
+	dbbw $0a,  4, .OAMData_04 ; BATTLEANIMOAMSET_86
+	dbbw $00,  8, .OAMData_87 ; BATTLEANIMOAMSET_87
+	dbbw $00, 12, .OAMData_88 ; BATTLEANIMOAMSET_88
+	dbbw $00, 16, .OAMData_87 ; BATTLEANIMOAMSET_89
+	dbbw $09,  2, .OAMData_8a ; BATTLEANIMOAMSET_8A
+	dbbw $09,  4, .OAMData_8a ; BATTLEANIMOAMSET_8B
+	dbbw $09,  6, .OAMData_8a ; BATTLEANIMOAMSET_8C
+	dbbw $09,  8, .OAMData_8a ; BATTLEANIMOAMSET_8D
+	dbbw $12,  5, .OAMData_8e ; BATTLEANIMOAMSET_8E
+	dbbw $00,  4, .OAMData_8f ; BATTLEANIMOAMSET_8F
+	dbbw $04,  4, .OAMData_8f ; BATTLEANIMOAMSET_90
+	dbbw $08,  4, .OAMData_8f ; BATTLEANIMOAMSET_91
+	dbbw $0c,  4, .OAMData_8f ; BATTLEANIMOAMSET_92
+	dbbw $00,  6, .OAMData_93 ; BATTLEANIMOAMSET_93
+	dbbw $04,  4, .OAMData_03 ; BATTLEANIMOAMSET_94
+	dbbw $0a,  4, .OAMData_04 ; BATTLEANIMOAMSET_95
+	dbbw $15,  4, .OAMData_30 ; BATTLEANIMOAMSET_96
+	dbbw $04,  4, .OAMData_30 ; BATTLEANIMOAMSET_97
+	dbbw $0c,  4, .OAMData_04 ; BATTLEANIMOAMSET_98
+	dbbw $0a,  4, .OAMData_99 ; BATTLEANIMOAMSET_99
+	dbbw $0c,  4, .OAMData_03 ; BATTLEANIMOAMSET_9A
+	dbbw $00, 36, .OAMData_9b ; BATTLEANIMOAMSET_9B
+	dbbw $0d,  2, .OAMData_9c ; BATTLEANIMOAMSET_9C
+	dbbw $0d,  4, .OAMData_9c ; BATTLEANIMOAMSET_9D
+	dbbw $0d,  6, .OAMData_9c ; BATTLEANIMOAMSET_9E
+	dbbw $02,  8, .OAMData_9f ; BATTLEANIMOAMSET_9F
+	dbbw $08,  7, .OAMData_a0 ; BATTLEANIMOAMSET_A0
+	dbbw $08,  5, .OAMData_a0 ; BATTLEANIMOAMSET_A1
+	dbbw $08,  3, .OAMData_a0 ; BATTLEANIMOAMSET_A2
+	dbbw $00, 16, .OAMData_1c ; BATTLEANIMOAMSET_A3
+	dbbw $00,  9, .OAMData_a4 ; BATTLEANIMOAMSET_A4
+	dbbw $06,  9, .OAMData_a4 ; BATTLEANIMOAMSET_A5
+	dbbw $0c,  9, .OAMData_a4 ; BATTLEANIMOAMSET_A6
+	dbbw $12,  9, .OAMData_a4 ; BATTLEANIMOAMSET_A7
+	dbbw $18,  9, .OAMData_a4 ; BATTLEANIMOAMSET_A8
+	dbbw $1e,  9, .OAMData_a4 ; BATTLEANIMOAMSET_A9
+	dbbw $24,  9, .OAMData_a4 ; BATTLEANIMOAMSET_AA
+	dbbw $2a,  9, .OAMData_a4 ; BATTLEANIMOAMSET_AB
+	dbbw $03,  4, .OAMData_ac ; BATTLEANIMOAMSET_AC
+	dbbw $12,  4, .OAMData_03 ; BATTLEANIMOAMSET_AD
+	dbbw $10,  4, .OAMData_04 ; BATTLEANIMOAMSET_AE
+	dbbw $16,  1, .OAMData_0f ; BATTLEANIMOAMSET_AF
+	dbbw $17,  4, .OAMData_02 ; BATTLEANIMOAMSET_B0
+	dbbw $18,  4, .OAMData_03 ; BATTLEANIMOAMSET_B1
+	dbbw $1c,  4, .OAMData_03 ; BATTLEANIMOAMSET_B2
+	dbbw $20,  3, .OAMData_03 ; BATTLEANIMOAMSET_B3
+	dbbw $23,  4, .OAMData_04 ; BATTLEANIMOAMSET_B4
+	dbbw $25,  3, .OAMData_03 ; BATTLEANIMOAMSET_B5
+	dbbw $17,  4, .OAMData_03 ; BATTLEANIMOAMSET_B6
+	dbbw $0a, 16, .OAMData_00 ; BATTLEANIMOAMSET_B7
+	dbbw $10, 16, .OAMData_1c ; BATTLEANIMOAMSET_B8
+	dbbw $00, 16, .OAMData_1c ; BATTLEANIMOAMSET_B9
+	dbbw $04,  4, .OAMData_03 ; BATTLEANIMOAMSET_BA
+	dbbw $08,  2, .OAMData_11 ; BATTLEANIMOAMSET_BB
+	dbbw $20,  6, .OAMData_bc ; BATTLEANIMOAMSET_BC
+	dbbw $08,  1, .OAMData_0f ; BATTLEANIMOAMSET_BD
+	dbbw $04,  4, .OAMData_03 ; BATTLEANIMOAMSET_BE
+	dbbw $1a,  4, .OAMData_30 ; BATTLEANIMOAMSET_BF
+	dbbw $16,  9, .OAMData_01 ; BATTLEANIMOAMSET_C0
+	dbbw $10, 16, .OAMData_c1 ; BATTLEANIMOAMSET_C1
+	dbbw $09,  6, .OAMData_c2 ; BATTLEANIMOAMSET_C2
+	dbbw $11,  9, .OAMData_c3 ; BATTLEANIMOAMSET_C3
+	dbbw $0e,  4, .OAMData_03 ; BATTLEANIMOAMSET_C4
+	dbbw $0b,  4, .OAMData_30 ; BATTLEANIMOAMSET_C5
+	dbbw $1c,  6, .OAMData_02 ; BATTLEANIMOAMSET_C6
+	dbbw $20, 16, .OAMData_c1 ; BATTLEANIMOAMSET_C7
+	dbbw $05,  6, .OAMData_c8 ; BATTLEANIMOAMSET_C8
+	dbbw $0b,  4, .OAMData_03 ; BATTLEANIMOAMSET_C9
+	dbbw $09,  4, .OAMData_ca ; BATTLEANIMOAMSET_CA
+	dbbw $0b,  4, .OAMData_04 ; BATTLEANIMOAMSET_CB
+	dbbw $11, 13, .OAMData_cc ; BATTLEANIMOAMSET_CC
+	dbbw $00,  9, .OAMData_c3 ; BATTLEANIMOAMSET_CD
+	dbbw $09,  9, .OAMData_c3 ; BATTLEANIMOAMSET_CE
+	dbbw $00, 12, .OAMData_cf ; BATTLEANIMOAMSET_CF
+	dbbw $06, 12, .OAMData_cf ; BATTLEANIMOAMSET_D0
+	dbbw $0c, 12, .OAMData_cf ; BATTLEANIMOAMSET_D1
+	dbbw $12, 12, .OAMData_cf ; BATTLEANIMOAMSET_D2
+	dbbw $00, 13, .OAMData_cc ; BATTLEANIMOAMSET_D3
+	dbbw $00,  7, .OAMData_d4 ; BATTLEANIMOAMSET_D4
+	dbbw $00,  6, .OAMData_d5 ; BATTLEANIMOAMSET_D5
+	dbbw $00, 14, .OAMData_d6 ; BATTLEANIMOAMSET_D6
+	dbbw $00, 12, .OAMData_d7 ; BATTLEANIMOAMSET_D7
+
+.OAMData_11:
+	dsprite  -1, 0,  -1, 4, $00, $00
+	dsprite   0, 0,  -1, 4, $01, $00
+
+.OAMData_56:
+	dsprite  -1, 4,  -1, 0, $00, $00
+	dsprite  -1, 4,   0, 0, $01, $00
+
+.OAMData_03:
+	dsprite  -1, 0,  -1, 0, $00, $00
+	dsprite  -1, 0,   0, 0, $01, $00
+	dsprite   0, 0,  -1, 0, $02, $00
+	dsprite   0, 0,   0, 0, $03, $00
+
+.OAMData_02:
+	dsprite  -1, 0,  -1, 0, $00, $00
+	dsprite  -1, 0,   0, 0, $00, $20
+	dsprite   0, 0,  -1, 0, $00, $40
+	dsprite   0, 0,   0, 0, $00, $60
+
+.OAMData_c3:
+	dsprite  -2, 4,  -2, 4, $00, $00
+	dsprite  -2, 4,  -1, 4, $01, $00
+	dsprite  -2, 4,   0, 4, $02, $00
+	dsprite  -1, 4,  -2, 4, $03, $00
+	dsprite  -1, 4,  -1, 4, $04, $00
+	dsprite  -1, 4,   0, 4, $05, $00
+	dsprite   0, 4,  -2, 4, $06, $00
+	dsprite   0, 4,  -1, 4, $07, $00
+	dsprite   0, 4,   0, 4, $08, $00
+
+.OAMData_01:
+	dsprite  -2, 4,  -2, 4, $00, $00
+	dsprite  -2, 4,  -1, 4, $01, $00
+	dsprite  -2, 4,   0, 4, $00, $20
+	dsprite  -1, 4,  -2, 4, $02, $00
+	dsprite  -1, 4,  -1, 4, $03, $00
+	dsprite  -1, 4,   0, 4, $02, $60
+	dsprite   0, 4,  -2, 4, $00, $40
+	dsprite   0, 4,  -1, 4, $01, $60
+	dsprite   0, 4,   0, 4, $00, $60
+
+.OAMData_cf:
+	dsprite  -2, 0,  -2, 4, $00, $00
+	dsprite  -2, 0,  -1, 4, $01, $00
+	dsprite  -2, 0,   0, 4, $02, $00
+	dsprite  -1, 0,  -2, 4, $03, $00
+	dsprite  -1, 0,  -1, 4, $04, $00
+	dsprite  -1, 0,   0, 4, $05, $00
+	dsprite   0, 0,  -2, 4, $05, $60
+	dsprite   0, 0,  -1, 4, $04, $60
+	dsprite   0, 0,   0, 4, $03, $60
+	dsprite   1, 0,  -2, 4, $02, $60
+	dsprite   1, 0,  -1, 4, $01, $60
+	dsprite   1, 0,   0, 4, $00, $60
+
+.OAMData_1c:
+	dsprite  -2, 0,  -2, 0, $00, $00
+	dsprite  -2, 0,  -1, 0, $01, $00
+	dsprite  -2, 0,   0, 0, $02, $00
+	dsprite  -2, 0,   1, 0, $03, $00
+	dsprite  -1, 0,  -2, 0, $04, $00
+	dsprite  -1, 0,  -1, 0, $05, $00
+	dsprite  -1, 0,   0, 0, $06, $00
+	dsprite  -1, 0,   1, 0, $07, $00
+	dsprite   0, 0,  -2, 0, $08, $00
+	dsprite   0, 0,  -1, 0, $09, $00
+	dsprite   0, 0,   0, 0, $0a, $00
+	dsprite   0, 0,   1, 0, $0b, $00
+	dsprite   1, 0,  -2, 0, $0c, $00
+	dsprite   1, 0,  -1, 0, $0d, $00
+	dsprite   1, 0,   0, 0, $0e, $00
+	dsprite   1, 0,   1, 0, $0f, $00
+
+.OAMData_00:
+	dsprite  -2, 0,  -2, 0, $00, $00
+	dsprite  -2, 0,  -1, 0, $01, $00
+	dsprite  -1, 0,  -2, 0, $02, $00
+	dsprite  -1, 0,  -1, 0, $03, $00
+	dsprite  -2, 0,   0, 0, $01, $20
+	dsprite  -2, 0,   1, 0, $00, $20
+	dsprite  -1, 0,   0, 0, $03, $20
+	dsprite  -1, 0,   1, 0, $02, $20
+	dsprite   0, 0,  -2, 0, $02, $40
+	dsprite   0, 0,  -1, 0, $03, $40
+	dsprite   1, 0,  -2, 0, $00, $40
+	dsprite   1, 0,  -1, 0, $01, $40
+	dsprite   0, 0,   0, 0, $03, $60
+	dsprite   0, 0,   1, 0, $02, $60
+	dsprite   1, 0,   0, 0, $01, $60
+	dsprite   1, 0,   1, 0, $00, $60
+
+.OAMData_09:
+	dsprite  -3, 4,  -3, 4, $00, $00
+	dsprite  -3, 4,  -2, 4, $01, $00
+	dsprite  -2, 4,  -3, 4, $02, $00
+	dsprite  -2, 4,  -2, 4, $03, $00
+	dsprite  -3, 4,   0, 4, $01, $20
+	dsprite  -3, 4,   1, 4, $00, $20
+	dsprite  -2, 4,   0, 4, $03, $20
+	dsprite  -2, 4,   1, 4, $02, $20
+	dsprite   0, 4,  -3, 4, $02, $40
+	dsprite   0, 4,  -2, 4, $03, $40
+	dsprite   1, 4,  -3, 4, $00, $40
+	dsprite   1, 4,  -2, 4, $01, $40
+	dsprite   0, 4,   0, 4, $03, $60
+	dsprite   0, 4,   1, 4, $02, $60
+	dsprite   1, 4,   0, 4, $01, $60
+	dsprite   1, 4,   1, 4, $00, $60
+
+.OAMData_0c:
+	dsprite  -1, 4,  -1, 0, $00, $00
+	dsprite  -1, 4,   0, 0, $00, $20
+
+.OAMData_6a:
+	dsprite   0, 0,  -1, 0, $00, $00
+	dsprite   0, 0,   0, 0, $00, $20
+
+.OAMData_04:
+	dsprite  -1, 0,  -1, 0, $00, $00
+	dsprite  -1, 0,   0, 0, $00, $20
+	dsprite   0, 0,  -1, 0, $01, $00
+	dsprite   0, 0,   0, 0, $01, $20
+
+.OAMData_5d:
+	dsprite  -1, 0,  -1, 0, $00, $00
+	dsprite  -1, 0,   0, 0, $01, $00
+	dsprite   0, 0,  -1, 0, $00, $40
+	dsprite   0, 0,   0, 0, $01, $40
+
+.OAMData_13:
+	dsprite  -1, 2,  -1, 0, $02, $00
+	dsprite   0, 2,  -1, 0, $03, $00
+	dsprite  -2, 6,   0, 0, $02, $00
+	dsprite  -1, 6,   0, 0, $03, $00
+
+.OAMData_22:
+	dsprite   1, 0, -11, 0, $01, $00
+	dsprite   0, 0, -10, 0, $02, $00
+	dsprite   0, 0,  -9, 0, $03, $00
+	dsprite   0, 0,  -8, 0, $00, $00
+	dsprite   0, 0,  -7, 0, $03, $00
+	dsprite   0, 0,  -6, 0, $00, $00
+	dsprite   0, 0,  -5, 0, $03, $00
+	dsprite   0, 0,  -4, 0, $00, $00
+	dsprite   0, 0,  -3, 0, $03, $00
+	dsprite   0, 0,  -2, 0, $00, $00
+	dsprite   0, 0,  -1, 0, $01, $00
+	dsprite  -1, 0,   0, 0, $02, $00
+	dsprite  -1, 0,   1, 0, $03, $00
+	dsprite  -1, 0,   2, 0, $00, $00
+	dsprite  -1, 0,   3, 0, $03, $00
+	dsprite  -1, 0,   4, 0, $00, $00
+	dsprite  -1, 0,   5, 0, $03, $00
+	dsprite  -1, 0,   6, 0, $00, $00
+	dsprite  -1, 0,   7, 0, $03, $00
+	dsprite  -1, 0,   8, 0, $00, $00
+	dsprite  -1, 0,   9, 0, $01, $00
+	dsprite  -2, 0,  10, 0, $02, $00
+
+.OAMData_2a:
+	dsprite  -3, 4,  -1, 0, $00, $00
+	dsprite  -3, 4,   0, 0, $00, $20
+	dsprite  -2, 4,  -1, 0, $01, $00
+	dsprite  -2, 4,   0, 0, $01, $20
+	dsprite  -1, 4,  -1, 4, $02, $00
+
+.OAMData_2b:
+	dsprite  -4, 4,  -1, 0, $00, $00
+	dsprite  -4, 4,   0, 0, $00, $20
+	dsprite  -3, 4,  -1, 0, $01, $00
+	dsprite  -3, 4,   0, 0, $01, $20
+	dsprite  -2, 4,  -1, 4, $02, $00
+	dsprite  -1, 4,  -1, 4, $02, $00
+
+.OAMData_2c:
+	dsprite  -5, 4,  -1, 0, $00, $00
+	dsprite  -5, 4,   0, 0, $00, $20
+	dsprite  -4, 4,  -1, 0, $01, $00
+	dsprite  -4, 4,   0, 0, $01, $20
+	dsprite  -3, 4,  -1, 4, $02, $00
+	dsprite  -2, 4,  -1, 4, $02, $00
+	dsprite  -1, 4,  -1, 4, $02, $00
+
+.OAMData_2d:
+	dsprite  -6, 4,  -1, 0, $00, $00
+	dsprite  -6, 4,   0, 0, $00, $20
+	dsprite  -5, 4,  -1, 0, $01, $00
+	dsprite  -5, 4,   0, 0, $01, $20
+	dsprite  -4, 4,  -1, 4, $02, $00
+	dsprite  -3, 4,  -1, 4, $02, $00
+	dsprite  -2, 4,  -1, 4, $02, $00
+	dsprite  -1, 4,  -1, 4, $02, $00
+
+.OAMData_2e:
+	dsprite  -7, 4,  -1, 0, $00, $00
+	dsprite  -7, 4,   0, 0, $00, $20
+	dsprite  -6, 4,  -1, 0, $01, $00
+	dsprite  -6, 4,   0, 0, $01, $20
+	dsprite  -5, 4,  -1, 4, $02, $00
+	dsprite  -4, 4,  -1, 4, $02, $00
+	dsprite  -3, 4,  -1, 4, $02, $00
+	dsprite  -2, 4,  -1, 4, $02, $00
+	dsprite  -1, 4,  -1, 4, $02, $00
+
+.OAMData_2f:
+	dsprite  -1, 0,  -1, 0, $00, $00
+	dsprite  -1, 0,   0, 0, $00, $20
+	dsprite   0, 0,  -1, 0, $01, $00
+	dsprite   0, 0,   0, 0, $00, $60
+
+.OAMData_30:
+	dsprite  -1, 0,  -1, 0, $00, $00
+	dsprite  -1, 0,   0, 0, $01, $00
+	dsprite   0, 0,  -1, 0, $01, $60
+	dsprite   0, 0,   0, 0, $00, $60
+
+.OAMData_31:
+	dsprite  -2, 4,  -1, 0, $00, $00
+	dsprite  -2, 4,   0, 0, $01, $00
+	dsprite  -1, 4,  -1, 0, $02, $00
+	dsprite  -1, 4,   0, 0, $03, $00
+	dsprite   0, 4,  -1, 0, $04, $00
+	dsprite   0, 4,   0, 0, $05, $00
+
+.OAMData_76:
+	dsprite  -1, 5,  -1, 0, $00, $00
+	dsprite  -1, 1,   0, 0, $00, $00
+
+.OAMData_32:
+	dsprite  -1, 0,  -2, 4, $00, $00
+	dsprite  -1, 0,   0, 4, $00, $00
+	dsprite  -3, 0,  -2, 4, $00, $00
+	dsprite  -3, 0,   0, 4, $00, $00
+	dsprite  -2, 0,  -3, 4, $00, $00
+	dsprite  -2, 0,  -2, 4, $01, $00
+	dsprite  -2, 0,  -1, 4, $00, $00
+	dsprite  -2, 0,   0, 4, $01, $00
+	dsprite  -2, 0,   1, 4, $00, $00
+	dsprite  -1, 0,  -4, 4, $00, $00
+	dsprite  -1, 0,  -3, 4, $01, $00
+	dsprite  -1, 0,  -1, 4, $01, $00
+	dsprite  -1, 0,   1, 4, $01, $00
+	dsprite  -1, 0,   2, 4, $00, $00
+
+.OAMData_33:
+	dsprite  -2, 0,  -2, 4, $00, $00
+	dsprite  -2, 0,   0, 4, $00, $00
+	dsprite  -1, 0,  -3, 4, $00, $00
+	dsprite  -1, 0,  -2, 4, $01, $00
+	dsprite  -1, 0,  -1, 4, $00, $00
+	dsprite  -1, 0,   0, 4, $01, $00
+	dsprite  -1, 0,   1, 4, $00, $00
+	dsprite  -4, 0,  -2, 4, $00, $00
+	dsprite  -4, 0,   0, 4, $00, $00
+	dsprite  -3, 0,  -3, 4, $00, $00
+	dsprite  -3, 0,  -2, 4, $01, $00
+	dsprite  -3, 0,  -1, 4, $00, $00
+	dsprite  -3, 0,   0, 4, $01, $00
+	dsprite  -3, 0,   1, 4, $00, $00
+	dsprite  -2, 0,  -4, 4, $00, $00
+	dsprite  -2, 0,  -3, 4, $01, $00
+	dsprite  -2, 0,  -1, 4, $01, $00
+	dsprite  -2, 0,   1, 4, $01, $00
+	dsprite  -2, 0,   2, 4, $00, $00
+	dsprite  -1, 0,  -4, 4, $01, $00
+	dsprite  -1, 0,   2, 4, $01, $00
+
+.OAMData_36:
+	dsprite  -7, 4,  -1, 0, $00, $00
+	dsprite  -7, 4,   0, 0, $01, $00
+	dsprite  -6, 4,  -1, 0, $02, $00
+	dsprite  -6, 4,   0, 0, $03, $00
+	dsprite  -5, 4,  -1, 0, $04, $00
+	dsprite  -5, 4,   0, 0, $05, $00
+	dsprite  -4, 4,  -1, 0, $06, $00
+	dsprite  -4, 4,   0, 0, $07, $00
+	dsprite  -3, 4,  -1, 0, $08, $00
+	dsprite  -3, 4,   0, 0, $09, $00
+	dsprite  -2, 4,  -1, 0, $0a, $00
+	dsprite  -2, 4,   0, 0, $0b, $00
+	dsprite  -1, 4,  -1, 0, $0c, $00
+	dsprite  -1, 4,   0, 0, $0d, $00
+
+.OAMData_3a:
+	dsprite  -7, 4,  -1, 0, $0c, $00
+	dsprite  -7, 4,   0, 0, $0d, $00
+	dsprite  -6, 4,  -1, 0, $08, $00
+	dsprite  -6, 4,   0, 0, $09, $00
+	dsprite  -5, 4,  -1, 0, $04, $00
+	dsprite  -5, 4,   0, 0, $05, $00
+	dsprite  -4, 4,  -1, 0, $00, $00
+	dsprite  -4, 4,   0, 0, $01, $00
+	dsprite  -3, 4,  -1, 0, $02, $00
+	dsprite  -3, 4,   0, 0, $03, $00
+	dsprite  -2, 4,   0, 0, $02, $00
+	dsprite  -2, 4,   1, 0, $03, $00
+	dsprite  -1, 4,   0, 0, $0a, $00
+	dsprite  -1, 4,   1, 0, $0b, $00
+
+.OAMData_3e:
+	dsprite   1, 4,  -2, 0, $00, $40
+	dsprite   1, 4,  -1, 0, $02, $40
+	dsprite   1, 4,   0, 0, $02, $60
+	dsprite   1, 4,   1, 0, $00, $60
+	dsprite  -1, 4,  -3, 0, $09, $20
+	dsprite  -1, 4,  -2, 0, $08, $20
+	dsprite  -1, 4,  -1, 0, $06, $00
+	dsprite  -1, 4,   0, 0, $07, $00
+	dsprite  -1, 4,   1, 0, $08, $00
+	dsprite  -1, 4,   2, 0, $09, $00
+	dsprite   0, 4,  -3, 0, $01, $20
+	dsprite   0, 4,  -2, 0, $00, $20
+	dsprite   0, 4,  -1, 0, $0c, $00
+	dsprite   0, 4,   0, 0, $0d, $00
+	dsprite   0, 4,   1, 0, $00, $00
+	dsprite   0, 4,   2, 0, $01, $00
+	dsprite  -3, 4,  -2, 0, $00, $00
+	dsprite  -3, 4,  -1, 0, $02, $00
+	dsprite  -3, 4,   0, 0, $02, $20
+	dsprite  -3, 4,   1, 0, $00, $20
+	dsprite  -2, 4,  -3, 0, $03, $20
+	dsprite  -2, 4,  -2, 0, $02, $20
+	dsprite  -2, 4,  -1, 0, $04, $00
+	dsprite  -2, 4,   0, 0, $05, $00
+	dsprite  -2, 4,   1, 0, $02, $00
+	dsprite  -2, 4,   2, 0, $03, $00
+
+.OAMData_41:
+	dsprite  -3, 4,  -2, 0, $00, $00
+	dsprite  -3, 4,  -1, 0, $02, $00
+	dsprite  -3, 4,   0, 0, $02, $20
+	dsprite  -3, 4,   1, 0, $00, $20
+	dsprite  -2, 4,  -3, 4, $00, $00
+	dsprite  -2, 4,  -2, 4, $01, $00
+	dsprite  -2, 4,  -1, 0, $05, $20
+	dsprite  -2, 4,   0, 0, $04, $20
+	dsprite  -2, 4,   0, 4, $01, $20
+	dsprite  -2, 4,   1, 4, $00, $20
+	dsprite  -1, 4,  -3, 4, $02, $00
+	dsprite  -1, 4,  -2, 4, $03, $00
+	dsprite  -1, 4,  -1, 0, $07, $20
+	dsprite  -1, 4,   0, 0, $06, $20
+	dsprite  -1, 4,   0, 4, $03, $20
+	dsprite  -1, 4,   1, 4, $02, $20
+	dsprite   0, 4,  -3, 4, $04, $00
+	dsprite   0, 4,  -2, 4, $05, $00
+	dsprite   0, 4,  -1, 0, $0d, $20
+	dsprite   0, 4,   0, 0, $0c, $20
+	dsprite   0, 4,   0, 4, $05, $20
+	dsprite   0, 4,   1, 4, $04, $20
+	dsprite   1, 4,  -2, 0, $00, $40
+	dsprite   1, 4,  -1, 0, $02, $40
+	dsprite   1, 4,   0, 0, $02, $60
+	dsprite   1, 4,   1, 0, $00, $60
+
+.OAMData_42:
+	dsprite  -3, 0,  -1, 4, $02, $00
+	dsprite   2, 0,  -1, 4, $02, $60
+	dsprite  -1, 4,  -3, 0, $01, $00
+	dsprite  -1, 4,   2, 0, $01, $60
+	dsprite  -4, 0,  -1, 4, $02, $00
+	dsprite   3, 0,  -1, 4, $02, $60
+	dsprite  -1, 4,  -4, 0, $01, $00
+	dsprite  -1, 4,   3, 0, $01, $60
+
+.OAMData_44:
+	dsprite  -3, 5,  -3, 5, $00, $20
+	dsprite  -3, 5,   1, 3, $00, $00
+	dsprite   1, 3,  -3, 5, $00, $60
+	dsprite   1, 3,   1, 3, $00, $40
+	dsprite  -4, 5,  -4, 5, $00, $20
+	dsprite  -4, 5,   2, 3, $00, $00
+	dsprite   2, 3,  -4, 5, $00, $60
+	dsprite   2, 3,   2, 3, $00, $40
+
+.OAMData_46:
+	dsprite  -3, 4,  -1, 4, $02, $00
+	dsprite   1, 4,  -1, 4, $02, $60
+	dsprite  -1, 4,  -3, 4, $01, $00
+	dsprite  -1, 4,   1, 4, $01, $60
+
+.OAMData_47:
+	dsprite  -2, 0,  -2, 0, $00, $20
+	dsprite  -2, 0,   1, 0, $00, $00
+	dsprite   1, 0,  -2, 0, $00, $60
+	dsprite   1, 0,   1, 0, $00, $40
+
+.OAMData_48:
+	dsprite  -3, 0,  -1, 4, $00, $00
+	dsprite  -2, 0,  -1, 2, $00, $00
+	dsprite  -1, 0,  -1, 0, $00, $00
+	dsprite   0, 0,  -1, 0, $00, $00
+	dsprite   1, 0,  -1, 2, $00, $00
+	dsprite   2, 0,  -1, 4, $00, $00
+
+.OAMData_49:
+	dsprite  -1, 4,  -2, 0, $00, $20
+	dsprite  -1, 2,  -1, 0, $00, $20
+	dsprite  -1, 2,   0, 0, $00, $00
+	dsprite  -1, 4,   1, 0, $00, $00
+
+.OAMData_4a:
+	dsprite  -1, 4,  -1, 0, $00, $60
+	dsprite  -1, 4,   0, 0, $00, $40
+
+.OAMData_0f:
+	dsprite  -1, 4,  -1, 4, $00, $00
+	dsprite  -1, 4,  -2, 4, $01, $00
+	dsprite  -1, 4,  -1, 4, $01, $20
+	dsprite   0, 4,  -2, 4, $01, $40
+	dsprite   0, 4,  -1, 4, $01, $60
+
+.OAMData_4c:
+	dsprite  -1, 4,  -1, 4, $00, $00
+	dsprite   0, 2,  -2, 6, $00, $00
+	dsprite   0, 2,  -3, 6, $01, $00
+	dsprite   0, 2,  -2, 6, $01, $20
+	dsprite   1, 2,  -3, 6, $01, $40
+	dsprite   1, 2,  -2, 6, $01, $60
+
+.OAMData_4d:
+	dsprite  -1, 4,  -1, 4, $00, $00
+	dsprite   0, 2,  -2, 6, $00, $00
+	dsprite   1, 0,  -2, 0, $00, $00
+	dsprite   1, 0,  -3, 0, $01, $00
+	dsprite   1, 0,  -2, 0, $01, $20
+	dsprite   2, 0,  -3, 0, $01, $40
+	dsprite   2, 0,  -2, 0, $01, $60
+
+.OAMData_4f:
+	dsprite  -1, 4,  -1, 4, $00, $00
+	dsprite   0, 2,  -2, 6, $00, $00
+	dsprite   1, 0,  -2, 0, $00, $00
+	dsprite   1, 6,  -3, 2, $00, $00
+	dsprite   1, 6,  -4, 2, $01, $00
+	dsprite   1, 6,  -3, 2, $01, $20
+	dsprite   2, 6,  -4, 2, $01, $40
+	dsprite   2, 6,  -3, 2, $01, $60
+
+.OAMData_50:
+	dsprite  -1, 4,  -1, 4, $00, $00
+	dsprite   0, 2,  -2, 6, $00, $00
+	dsprite   1, 0,  -2, 0, $00, $00
+	dsprite   1, 6,  -3, 2, $00, $00
+	dsprite   2, 4,  -4, 4, $00, $00
+	dsprite   2, 4,  -5, 4, $01, $00
+	dsprite   2, 4,  -4, 4, $01, $20
+	dsprite   3, 4,  -5, 4, $01, $40
+	dsprite   3, 4,  -4, 4, $01, $60
+
+.OAMData_51:
+	dsprite  -1, 4,  -1, 4, $00, $00
+	dsprite   0, 2,  -2, 6, $00, $00
+	dsprite   1, 0,  -2, 0, $00, $00
+	dsprite   1, 6,  -3, 2, $00, $00
+	dsprite   2, 4,  -4, 4, $00, $00
+	dsprite   3, 2,  -5, 6, $00, $00
+	dsprite   3, 2,  -6, 6, $01, $00
+	dsprite   3, 2,  -5, 6, $01, $20
+	dsprite   4, 2,  -6, 6, $01, $40
+	dsprite   4, 2,  -5, 6, $01, $60
+
+.OAMData_59:
+	dsprite  -1, 4,  -2, 0, $00, $00
+	dsprite  -1, 4,  -1, 0, $01, $00
+	dsprite  -1, 4,   0, 0, $01, $20
+	dsprite  -1, 4,   1, 0, $00, $20
+
+.OAMData_5a:
+	dsprite  -1, 4,  -2, 0, $02, $00
+	dsprite  -1, 4,  -1, 0, $01, $00
+	dsprite  -1, 4,   0, 0, $01, $20
+	dsprite  -1, 4,   1, 0, $02, $20
+
+.OAMData_60:
+	dsprite  -1, 0,  -1, 4, $00, $00
+
+.OAMData_69:
+	dsprite   0, 0,  -1, 4, $00, $00
+
+.OAMData_61:
+	dsprite  -1, 4,  -4, 4, $00, $00
+	dsprite  -1, 4,  -3, 4, $01, $00
+	dsprite  -1, 4,  -2, 4, $02, $00
+	dsprite  -1, 4,  -1, 4, $03, $00
+	dsprite  -1, 4,   0, 4, $04, $00
+	dsprite  -1, 4,   1, 4, $05, $00
+	dsprite  -1, 4,   2, 4, $06, $00
+	dsprite  -2, 4,   1, 4, $07, $00
+	dsprite  -2, 4,   2, 4, $08, $00
+
+.OAMData_65:
+	dsprite  -2, 4,  -4, 4, $08, $20
+	dsprite  -2, 4,  -3, 4, $07, $20
+	dsprite  -1, 4,  -4, 4, $06, $20
+	dsprite  -1, 4,  -3, 4, $05, $20
+	dsprite  -1, 4,  -2, 4, $04, $20
+	dsprite  -1, 4,  -1, 4, $03, $20
+	dsprite  -1, 4,   0, 4, $02, $20
+	dsprite  -1, 4,   1, 4, $01, $20
+	dsprite  -1, 4,   2, 4, $00, $20
+
+.OAMData_d4:
+	dsprite   0, 0,  -4, 4, $00, $10
+	dsprite   0, 0,  -3, 4, $01, $10
+	dsprite   0, 0,  -2, 4, $02, $10
+	dsprite   0, 0,  -1, 4, $03, $10
+	dsprite   0, 0,   0, 4, $04, $10
+	dsprite   0, 0,   1, 4, $05, $10
+	dsprite   0, 0,   2, 4, $06, $10
+
+.OAMData_d6:
+	dsprite  -1, 0,  -4, 4, $00, $10
+	dsprite   0, 0,  -4, 4, $01, $10
+	dsprite  -1, 0,  -3, 4, $02, $10
+	dsprite   0, 0,  -3, 4, $03, $10
+	dsprite  -1, 0,  -2, 4, $04, $10
+	dsprite   0, 0,  -2, 4, $05, $10
+	dsprite  -1, 0,  -1, 4, $06, $10
+	dsprite   0, 0,  -1, 4, $07, $10
+	dsprite  -1, 0,   0, 4, $08, $10
+	dsprite   0, 0,   0, 4, $09, $10
+	dsprite  -1, 0,   1, 4, $0a, $10
+	dsprite   0, 0,   1, 4, $0b, $10
+	dsprite  -1, 0,   2, 4, $0c, $10
+	dsprite   0, 0,   2, 4, $0d, $10
+
+.OAMData_d5:
+	dsprite   0, 0,  -3, 0, $00, $11
+	dsprite   0, 0,  -2, 0, $01, $11
+	dsprite   0, 0,  -1, 0, $02, $11
+	dsprite   0, 0,   0, 0, $03, $11
+	dsprite   0, 0,   1, 0, $04, $11
+	dsprite   0, 0,   2, 0, $05, $11
+
+.OAMData_d7:
+	dsprite   0, 0,  -3, 0, $00, $11
+	dsprite   1, 0,  -3, 0, $01, $11
+	dsprite   0, 0,  -2, 0, $02, $11
+	dsprite   1, 0,  -2, 0, $03, $11
+	dsprite   0, 0,  -1, 0, $04, $11
+	dsprite   1, 0,  -1, 0, $05, $11
+	dsprite   0, 0,   0, 0, $06, $11
+	dsprite   1, 0,   0, 0, $07, $11
+	dsprite   0, 0,   1, 0, $08, $11
+	dsprite   1, 0,   1, 0, $09, $11
+	dsprite   0, 0,   2, 0, $0a, $11
+	dsprite   1, 0,   2, 0, $0b, $11
+
+.OAMData_6e:
+	dsprite  -2, 4,   0, 4, $00, $00
+	dsprite  -1, 4,  -2, 4, $01, $00
+	dsprite  -1, 4,  -1, 4, $02, $00
+	dsprite  -1, 4,   0, 4, $03, $00
+	dsprite   0, 4,  -2, 4, $04, $00
+
+.OAMData_6f:
+	dsprite  -1, 4,  -2, 4, $00, $00
+	dsprite  -1, 4,  -1, 4, $01, $00
+	dsprite  -1, 4,   0, 4, $02, $00
+
+.OAMData_77:
+	dsprite  -4, 4,   1, 4, $01, $60
+
+.OAMData_78:
+	dsprite  -4, 4,   1, 4, $00, $00
+	dsprite  -4, 4,   0, 4, $01, $60
+	dsprite  -3, 4,   1, 4, $01, $60
+
+.OAMData_79:
+	dsprite  -4, 4,   1, 4, $01, $00
+	dsprite  -4, 4,   0, 4, $00, $00
+	dsprite  -4, 4,  -1, 4, $01, $60
+	dsprite  -3, 4,   1, 4, $00, $00
+	dsprite  -3, 4,   0, 4, $01, $60
+	dsprite  -2, 4,   1, 4, $01, $60
+
+.OAMData_7a:
+	dsprite  -4, 4,  -2, 4, $01, $60
+	dsprite  -4, 4,  -1, 4, $00, $00
+	dsprite  -4, 4,   0, 4, $01, $00
+	dsprite  -3, 4,  -1, 4, $01, $60
+	dsprite  -3, 4,   0, 4, $00, $00
+	dsprite  -3, 4,   1, 4, $01, $00
+	dsprite  -2, 4,   0, 4, $01, $60
+	dsprite  -2, 4,   1, 4, $00, $00
+	dsprite  -1, 4,   1, 4, $01, $60
+
+.OAMData_7b:
+	dsprite  -4, 4,  -3, 4, $01, $60
+	dsprite  -4, 4,  -2, 4, $00, $00
+	dsprite  -4, 4,  -1, 4, $01, $00
+	dsprite  -3, 4,  -2, 4, $01, $60
+	dsprite  -3, 4,  -1, 4, $00, $00
+	dsprite  -3, 4,   0, 4, $01, $00
+	dsprite  -2, 4,  -1, 4, $01, $60
+	dsprite  -2, 4,   0, 4, $00, $00
+	dsprite  -2, 4,   1, 4, $01, $00
+	dsprite  -1, 4,   0, 4, $01, $60
+	dsprite  -1, 4,   1, 4, $00, $00
+	dsprite   0, 4,   1, 4, $01, $60
+
+.OAMData_7c:
+	dsprite  -4, 4,  -3, 4, $00, $00
+	dsprite  -4, 4,  -2, 4, $01, $00
+	dsprite  -3, 4,  -3, 4, $01, $60
+	dsprite  -3, 4,  -2, 4, $00, $00
+	dsprite  -3, 4,  -1, 4, $01, $00
+	dsprite  -2, 4,  -2, 4, $01, $60
+	dsprite  -2, 4,  -1, 4, $00, $00
+	dsprite  -2, 4,   0, 4, $01, $00
+	dsprite  -1, 4,  -1, 4, $01, $60
+	dsprite  -1, 4,   0, 4, $00, $00
+	dsprite  -1, 4,   1, 4, $01, $00
+	dsprite   0, 4,   0, 4, $01, $60
+	dsprite   0, 4,   1, 4, $00, $00
+	dsprite   1, 4,   1, 4, $01, $60
+
+.OAMData_7d:
+	dsprite  -4, 4,  -3, 4, $01, $00
+	dsprite  -3, 4,  -3, 4, $00, $00
+	dsprite  -3, 4,  -2, 4, $01, $00
+	dsprite  -2, 4,  -3, 4, $01, $60
+	dsprite  -2, 4,  -2, 4, $00, $00
+	dsprite  -2, 4,  -1, 4, $01, $00
+	dsprite  -1, 4,  -2, 4, $01, $60
+	dsprite  -1, 4,  -1, 4, $00, $00
+	dsprite  -1, 4,   0, 4, $01, $00
+	dsprite   0, 4,  -1, 4, $01, $60
+	dsprite   0, 4,   0, 4, $00, $00
+	dsprite   0, 4,   1, 4, $01, $00
+	dsprite   1, 4,   0, 4, $01, $60
+	dsprite   1, 4,   1, 4, $00, $00
+	dsprite   2, 4,   1, 4, $01, $60
+
+.OAMData_70:
+	dsprite  -2, 0,  -1, 0, $00, $00
+	dsprite  -1, 0,  -1, 0, $01, $00
+	dsprite  -2, 0,   0, 0, $00, $20
+	dsprite  -1, 0,   0, 0, $01, $20
+	dsprite   0, 0,  -1, 0, $01, $40
+	dsprite   1, 0,  -1, 0, $00, $40
+	dsprite   0, 0,   0, 0, $01, $60
+	dsprite   1, 0,   0, 0, $00, $60
+
+.OAMData_81:
+	dsprite  -1, 0,  -1, 0, $00, $00
+	dsprite  -1, 0,   0, 0, $01, $00
+	dsprite   0, 0,  -1, 0, $01, $60
+	dsprite   0, 0,   0, 0, $00, $60
+
+.OAMData_87:
+	dsprite  -2, 4,  -1, 0, $00, $00
+	dsprite  -2, 4,   0, 0, $01, $00
+	dsprite  -1, 4,  -1, 0, $02, $00
+	dsprite  -1, 4,   0, 0, $03, $00
+	dsprite  -1, 4,  -1, 0, $00, $00
+	dsprite  -1, 4,   0, 0, $01, $00
+	dsprite   0, 4,  -1, 0, $02, $00
+	dsprite   0, 4,   0, 0, $03, $00
+	dsprite  -3, 4,  -1, 0, $00, $00
+	dsprite  -3, 4,   0, 0, $01, $00
+	dsprite  -2, 4,  -1, 0, $02, $00
+	dsprite  -2, 4,   0, 0, $03, $00
+	dsprite   0, 4,  -1, 0, $00, $00
+	dsprite   0, 4,   0, 0, $01, $00
+	dsprite   1, 4,  -1, 0, $02, $00
+	dsprite   1, 4,   0, 0, $03, $00
+
+.OAMData_88:
+	dsprite  -2, 0,  -1, 0, $00, $00
+	dsprite  -2, 0,   0, 0, $01, $00
+	dsprite  -1, 0,  -1, 0, $02, $00
+	dsprite  -1, 0,   0, 0, $03, $00
+	dsprite  -1, 0,  -1, 0, $00, $00
+	dsprite  -1, 0,   0, 0, $01, $00
+	dsprite   0, 0,  -1, 0, $02, $00
+	dsprite   0, 0,   0, 0, $03, $00
+	dsprite   0, 0,  -1, 0, $00, $00
+	dsprite   0, 0,   0, 0, $01, $00
+	dsprite   1, 0,  -1, 0, $02, $00
+	dsprite   1, 0,   0, 0, $03, $00
+
+.OAMData_8a:
+	dsprite  -1, 4,  -1, 4, $00, $00
+	dsprite  -1, 0,   0, 4, $00, $00
+	dsprite  -2, 4,   1, 4, $00, $00
+	dsprite  -2, 0,   2, 4, $00, $00
+	dsprite  -3, 4,   3, 4, $00, $00
+	dsprite  -3, 0,   4, 4, $00, $00
+	dsprite  -4, 0,   5, 4, $00, $00
+	dsprite  -5, 4,   6, 4, $00, $00
+
+.OAMData_8e:
+	dsprite  -3, 4,  -1, 4, $00, $00
+	dsprite  -2, 4,  -1, 4, $01, $00
+	dsprite  -1, 4,  -1, 4, $02, $00
+	dsprite   0, 4,  -1, 4, $01, $40
+	dsprite   1, 4,  -1, 4, $00, $40
+
+.OAMData_8f:
+	dsprite  -1, 4,  -2, 0, $00, $00
+	dsprite  -1, 4,  -1, 0, $01, $00
+	dsprite  -1, 4,   0, 0, $02, $00
+	dsprite  -1, 4,   1, 0, $03, $00
+
+.OAMData_93:
+	dsprite  -1, 0,  -2, 4, $00, $00
+	dsprite  -1, 0,  -1, 4, $01, $00
+	dsprite  -1, 0,   0, 4, $02, $00
+	dsprite   0, 0,  -2, 4, $03, $00
+	dsprite   0, 0,  -1, 4, $04, $00
+	dsprite   0, 0,   0, 4, $05, $00
+
+.OAMData_99:
+	dsprite  -1, 0,  -1, 0, $00, $00
+	dsprite  -1, 0,   0, 0, $05, $00
+	dsprite   0, 0,  -1, 0, $01, $00
+	dsprite   0, 0,   0, 0, $05, $00
+
+.OAMData_9b:
+	dsprite  -4, 4,   1, 0, $00, $00
+	dsprite  -4, 4,   2, 0, $01, $00
+	dsprite  -3, 4,  -1, 0, $02, $00
+	dsprite  -3, 4,   0, 0, $03, $00
+	dsprite  -3, 4,   1, 0, $04, $00
+	dsprite  -3, 4,   2, 0, $05, $00
+	dsprite  -3, 4,   3, 0, $06, $00
+	dsprite  -2, 4,  -2, 0, $07, $00
+	dsprite  -2, 4,  -1, 0, $08, $00
+	dsprite  -2, 4,   0, 0, $09, $00
+	dsprite  -2, 4,   1, 0, $0a, $00
+	dsprite  -2, 4,   2, 0, $0b, $00
+	dsprite  -2, 4,   3, 0, $0c, $00
+	dsprite  -2, 4,   4, 0, $0d, $00
+	dsprite  -1, 4,  -3, 0, $0e, $00
+	dsprite  -1, 4,  -2, 0, $0f, $00
+	dsprite  -1, 4,  -1, 0, $10, $00
+	dsprite  -1, 4,   0, 0, $11, $00
+	dsprite  -1, 4,   1, 0, $12, $00
+	dsprite  -1, 4,   2, 0, $13, $00
+	dsprite   0, 4,  -5, 0, $14, $00
+	dsprite   0, 4,  -4, 0, $15, $00
+	dsprite   0, 4,  -3, 0, $16, $00
+	dsprite   0, 4,  -2, 0, $17, $00
+	dsprite   0, 4,  -1, 0, $18, $00
+	dsprite   0, 4,   0, 0, $19, $00
+	dsprite   0, 4,   1, 0, $1a, $00
+	dsprite   0, 4,   2, 0, $1b, $00
+	dsprite   0, 4,   3, 0, $1c, $00
+	dsprite   1, 4,  -5, 0, $1d, $00
+	dsprite   1, 4,  -4, 0, $1e, $00
+	dsprite   1, 4,  -2, 0, $1f, $00
+	dsprite   1, 4,  -1, 0, $20, $00
+	dsprite   1, 4,   0, 0, $21, $00
+	dsprite   1, 4,   1, 0, $22, $00
+	dsprite   2, 4,   0, 0, $23, $00
+
+.OAMData_9c:
+	dsprite   0, 4,  -1, 0, $02, $00
+	dsprite   0, 4,   0, 0, $03, $00
+	dsprite  -1, 4,  -1, 0, $01, $00
+	dsprite  -1, 4,   0, 0, $01, $20
+	dsprite  -2, 4,  -1, 0, $00, $00
+	dsprite  -2, 4,   0, 0, $00, $20
+
+.OAMData_9f:
+	dsprite  -1, 0,  -2, 0, $00, $00
+	dsprite  -1, 0,  -1, 0, $01, $00
+	dsprite  -1, 0,   0, 0, $02, $00
+	dsprite  -1, 0,   1, 0, $03, $00
+	dsprite   0, 0,  -2, 0, $04, $00
+	dsprite   0, 0,  -1, 0, $05, $00
+	dsprite   0, 0,   0, 0, $06, $00
+	dsprite   0, 0,   1, 0, $07, $00
+
+.OAMData_a0:
+	dsprite  -2, 4,  -1, 4, $00, $00
+	dsprite  -1, 4,  -1, 4, $00, $00
+	dsprite   0, 4,  -1, 4, $00, $00
+	dsprite  -3, 4,  -1, 4, $00, $00
+	dsprite   1, 4,  -1, 4, $00, $00
+	dsprite  -4, 4,  -1, 4, $00, $00
+	dsprite   2, 4,  -1, 4, $00, $00
+
+.OAMData_a4:
+	dsprite  -2, 4,  -2, 4, $00, $00
+	dsprite  -2, 4,  -1, 4, $01, $00
+	dsprite  -2, 4,   0, 4, $02, $00
+	dsprite  -1, 4,  -2, 4, $03, $00
+	dsprite  -1, 4,  -1, 4, $04, $00
+	dsprite  -1, 4,   0, 4, $05, $00
+	dsprite   0, 4,  -2, 4, $00, $40
+	dsprite   0, 4,  -1, 4, $01, $40
+	dsprite   0, 4,   0, 4, $02, $40
+
+.OAMData_ac:
+	dsprite  -1, 4,  -2, 0, $00, $00
+	dsprite  -1, 4,  -1, 0, $01, $00
+	dsprite  -1, 4,   0, 0, $01, $20
+	dsprite  -1, 4,   1, 0, $00, $20
+
+.OAMData_bc:
+	dsprite  -1, 4,  -3, 0, $00, $00
+	dsprite  -1, 4,  -2, 0, $01, $00
+	dsprite  -1, 4,  -1, 0, $02, $00
+	dsprite  -1, 4,   0, 0, $02, $20
+	dsprite  -1, 4,   1, 0, $01, $20
+	dsprite  -1, 4,   2, 0, $00, $20
+
+.OAMData_c1:
+	dsprite  -2, 0,  -2, 0, $00, $00
+	dsprite  -2, 0,  -1, 0, $01, $00
+	dsprite  -2, 0,   0, 0, $02, $00
+	dsprite  -2, 0,   1, 0, $00, $20
+	dsprite  -1, 0,  -2, 0, $03, $00
+	dsprite  -1, 0,  -1, 0, $04, $00
+	dsprite  -1, 0,   0, 0, $04, $20
+	dsprite  -1, 0,   1, 0, $05, $00
+	dsprite   0, 0,  -2, 0, $05, $60
+	dsprite   0, 0,  -1, 0, $04, $40
+	dsprite   0, 0,   0, 0, $04, $60
+	dsprite   0, 0,   1, 0, $03, $60
+	dsprite   1, 0,  -2, 0, $00, $40
+	dsprite   1, 0,  -1, 0, $02, $60
+	dsprite   1, 0,   0, 0, $01, $60
+	dsprite   1, 0,   1, 0, $00, $60
+
+.OAMData_c2:
+	dsprite  -1, 0,  -2, 0, $00, $00
+	dsprite  -1, 0,  -1, 0, $01, $00
+	dsprite  -1, 0,   0, 0, $00, $60
+	dsprite   0, 0,  -1, 0, $00, $00
+	dsprite   0, 0,   0, 0, $01, $00
+	dsprite   0, 0,   1, 0, $00, $60
+
+.OAMData_c8:
+	dsprite  -1, 0,   1, 4, $00, $00
+	dsprite  -1, 0,   2, 4, $01, $00
+	dsprite   0, 0,  -1, 4, $02, $00
+	dsprite   0, 0,   0, 4, $03, $00
+	dsprite   0, 0,   1, 4, $04, $00
+	dsprite   0, 0,   2, 4, $05, $00
+
+.OAMData_ca:
+	dsprite  -1, 0,  -1, 0, $00, $00
+	dsprite  -1, 0,   0, 0, $01, $60
+	dsprite   0, 0,  -1, 0, $01, $00
+	dsprite   0, 0,   0, 0, $01, $20
+
+.OAMData_cc:
+	dsprite  -2, 0, -13, 4, $00, $00
+	dsprite  -4, 0, -11, 4, $00, $00
+	dsprite  -1, 0,  -9, 4, $00, $00
+	dsprite  -5, 0,  -7, 4, $00, $00
+	dsprite  -3, 0,  -5, 4, $00, $00
+	dsprite  -5, 0,  -3, 4, $00, $00
+	dsprite  -3, 0,  -1, 4, $00, $00
+	dsprite  -3, 0,   0, 4, $00, $00
+	dsprite  -5, 0,   2, 4, $00, $00
+	dsprite   0, 0,   4, 4, $00, $00
+	dsprite  -2, 0,   6, 4, $00, $00
+	dsprite  -4, 0,   8, 4, $00, $00
+	dsprite  -2, 0,  10, 4, $00, $00
+; cfcf6
--- /dev/null
+++ b/data/anims/object_gfx.asm
@@ -1,0 +1,51 @@
+anim_obj_gfx: MACRO
+; # tiles, label
+	db  \1
+	dba \2
+ENDM
+
+AnimObjGFX: ; cfcf6
+; entries correspond to ANIM_GFX_* constants
+	anim_obj_gfx  0, AnimObj00GFX
+	anim_obj_gfx 21, AnimObjHitGFX
+	anim_obj_gfx  6, AnimObjCutGFX
+	anim_obj_gfx  6, AnimObjFireGFX
+	anim_obj_gfx 20, AnimObjWaterGFX
+	anim_obj_gfx 26, AnimObjLightningGFX
+	anim_obj_gfx 18, AnimObjPlantGFX
+	anim_obj_gfx 12, AnimObjSmokeGFX
+	anim_obj_gfx  9, AnimObjExplosionGFX
+	anim_obj_gfx 17, AnimObjRocksGFX
+	anim_obj_gfx  6, AnimObjIceGFX
+	anim_obj_gfx 10, AnimObjPokeBallGFX
+	anim_obj_gfx  9, AnimObjPoisonGFX
+	anim_obj_gfx 13, AnimObjBubbleGFX
+	anim_obj_gfx 16, AnimObjNoiseGFX
+	anim_obj_gfx  2, AnimObjPowderGFX
+	anim_obj_gfx 11, AnimObjBeamGFX
+	anim_obj_gfx  9, AnimObjSpeedGFX
+	anim_obj_gfx  9, AnimObjChargeGFX
+	anim_obj_gfx 19, AnimObjWindGFX
+	anim_obj_gfx 10, AnimObjWhipGFX
+	anim_obj_gfx 12, AnimObjEggGFX
+	anim_obj_gfx 18, AnimObjRopeGFX
+	anim_obj_gfx 13, AnimObjPsychicGFX
+	anim_obj_gfx 10, AnimObjReflectGFX
+	anim_obj_gfx 27, AnimObjStatusGFX
+	anim_obj_gfx 12, AnimObjSandGFX
+	anim_obj_gfx 14, AnimObjWebGFX
+	anim_obj_gfx 16, AnimObjHazeGFX
+	anim_obj_gfx  7, AnimObjHornGFX
+	anim_obj_gfx  8, AnimObjFlowerGFX
+	anim_obj_gfx 40, AnimObjMiscGFX
+	anim_obj_gfx 36, AnimObjSkyAttackGFX
+	anim_obj_gfx 16, AnimObjGlobeGFX
+	anim_obj_gfx 48, AnimObjShapesGFX
+	anim_obj_gfx 18, AnimObjObjectsGFX
+	anim_obj_gfx 38, AnimObjShineGFX
+	anim_obj_gfx 35, AnimObjAngelsGFX
+	anim_obj_gfx 18, AnimObjWaveGFX
+	anim_obj_gfx 24, AnimObjAeroblastGFX
+	anim_obj_gfx  1, NULL
+	anim_obj_gfx  1, NULL
+; cfd9e
--- /dev/null
+++ b/data/anims/objects.asm
@@ -1,0 +1,209 @@
+ABSOLUTE_X EQU $00
+RELATIVE_X EQU $01
+
+battleanimobj: MACRO
+	db \1 ; flags
+	; bit 7: priority
+	; bit 6: y flip (for enemy)
+	; bit 5: x flip (for enemy)
+	; bit 0: enable enemy animation coord fixing (x = $b4 - x; see below for y)
+	db \2 ; enemy animation y fix param
+	; if $FF: y = y + 5 tiles
+	; else:   y = -y - (1 tile) * (is_softboiled_animation)
+	db \3 ; video sequence
+	db \4 ; callback
+	db \5 ; palette
+	db \6 ; tile offset
+endm
+
+BattleAnimObjects: ; ccb56
+; entries correspond to ANIM_OBJ_* constants
+	battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_00, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $01 ; ANIM_OBJ_00
+	battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_01, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $01 ; ANIM_OBJ_01
+	battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_02, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $01 ; ANIM_OBJ_02
+	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_00, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $01 ; ANIM_OBJ_03
+	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_01, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $01 ; ANIM_OBJ_04
+	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_02, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $01 ; ANIM_OBJ_05
+	battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_03, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $01 ; ANIM_OBJ_06
+	battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_04, BATTLEANIMFUNC_1B, PAL_BATTLE_OB_GRAY, $01 ; ANIM_OBJ_07
+	battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_05, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $01 ; ANIM_OBJ_08
+	battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_06, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $01 ; ANIM_OBJ_09
+	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_07, BATTLEANIMFUNC_09, PAL_BATTLE_OB_GRAY, $01 ; ANIM_OBJ_0A
+	battleanimobj RELATIVE_X, $aa, BATTLEANIMFRAMESET_10, BATTLEANIMFUNC_10, PAL_BATTLE_OB_RED, $03 ; ANIM_OBJ_0B
+	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_0E, BATTLEANIMFUNC_04, PAL_BATTLE_OB_RED, $03 ; ANIM_OBJ_0C
+	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_0F, BATTLEANIMFUNC_03, PAL_BATTLE_OB_RED, $03 ; ANIM_OBJ_0D
+	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_10, BATTLEANIMFUNC_08, PAL_BATTLE_OB_RED, $03 ; ANIM_OBJ_0E
+	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_0F, BATTLEANIMFUNC_0A, PAL_BATTLE_OB_RED, $03 ; ANIM_OBJ_0F
+	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_11, BATTLEANIMFUNC_03, PAL_BATTLE_OB_RED, $03 ; ANIM_OBJ_BURNED
+	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_12, BATTLEANIMFUNC_08, PAL_BATTLE_OB_BLUE, $0a ; ANIM_OBJ_BLIZZARD
+	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_13, BATTLEANIMFUNC_00, PAL_BATTLE_OB_BLUE, $0a ; ANIM_OBJ_12
+	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_14, BATTLEANIMFUNC_01, PAL_BATTLE_OB_BLUE, $0a ; ANIM_OBJ_ICE_BEAM
+	battleanimobj RELATIVE_X | X_FLIP, $78, BATTLEANIMFRAMESET_16, BATTLEANIMFUNC_RAZOR_LEAF, PAL_BATTLE_OB_GREEN, $06 ; ANIM_OBJ_RAZOR_LEAF
+	battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_09, BATTLEANIMFUNC_12, PAL_BATTLE_OB_RED, $0b ; ANIM_OBJ_POKE_BALL
+	battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_09, BATTLEANIMFUNC_13, PAL_BATTLE_OB_RED, $0b ; ANIM_OBJ_POKE_BALL_BLOCKED
+	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_18, BATTLEANIMFUNC_00, PAL_BATTLE_OB_RED, $08 ; ANIM_OBJ_17
+	battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_18, BATTLEANIMFUNC_00, PAL_BATTLE_OB_RED, $08 ; ANIM_OBJ_18
+	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_1D, BATTLEANIMFUNC_06, PAL_BATTLE_OB_GRAY, $0c ; ANIM_OBJ_19
+	battleanimobj RELATIVE_X, $b4, BATTLEANIMFRAMESET_1F, BATTLEANIMFUNC_38, PAL_BATTLE_OB_GRAY, $0c ; ANIM_OBJ_1A
+	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_08, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $07 ; ANIM_OBJ_1B
+	battleanimobj RELATIVE_X, $a0, BATTLEANIMFRAMESET_08, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $07 ; ANIM_OBJ_BALL_POOF
+	battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_19, BATTLEANIMFUNC_07, PAL_BATTLE_OB_BROWN, $09 ; ANIM_OBJ_1D
+	battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_1A, BATTLEANIMFUNC_07, PAL_BATTLE_OB_BROWN, $09 ; ANIM_OBJ_1E
+	battleanimobj RELATIVE_X, $b0, BATTLEANIMFRAMESET_1B, BATTLEANIMFUNC_36, PAL_BATTLE_OB_BROWN, $09 ; ANIM_OBJ_1F
+	battleanimobj RELATIVE_X, $b0, BATTLEANIMFRAMESET_84, BATTLEANIMFUNC_36, PAL_BATTLE_OB_BLUE, $21 ; ANIM_OBJ_20
+	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_21, BATTLEANIMFUNC_0C, PAL_BATTLE_OB_BLUE, $0d ; ANIM_OBJ_BUBBLE
+	battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_23, BATTLEANIMFUNC_0D, PAL_BATTLE_OB_BLUE, $0d ; ANIM_OBJ_22
+	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_24, BATTLEANIMFUNC_0E, PAL_BATTLE_OB_GRAY, $0e ; ANIM_OBJ_23
+	battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $80, BATTLEANIMFRAMESET_27, BATTLEANIMFUNC_0F, PAL_BATTLE_OB_BLUE, $04 ; ANIM_OBJ_24
+	battleanimobj RELATIVE_X, $b4, BATTLEANIMFRAMESET_2A, BATTLEANIMFUNC_00, PAL_BATTLE_OB_BLUE, $04 ; ANIM_OBJ_25
+	battleanimobj RELATIVE_X, $40, BATTLEANIMFRAMESET_2B, BATTLEANIMFUNC_11, PAL_BATTLE_OB_GREEN, $0f ; ANIM_OBJ_26
+	battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $98, BATTLEANIMFRAMESET_2C, BATTLEANIMFUNC_00, PAL_BATTLE_OB_YELLOW, $10 ; ANIM_OBJ_27
+	battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $98, BATTLEANIMFRAMESET_2D, BATTLEANIMFUNC_09, PAL_BATTLE_OB_YELLOW, $10 ; ANIM_OBJ_28
+	battleanimobj RELATIVE_X, $b8, BATTLEANIMFRAMESET_2E, BATTLEANIMFUNC_00, PAL_BATTLE_OB_BLUE, $0a ; ANIM_OBJ_ICE_BUILDUP
+	battleanimobj RELATIVE_X, $b8, BATTLEANIMFRAMESET_2F, BATTLEANIMFUNC_00, PAL_BATTLE_OB_BLUE, $0a ; ANIM_OBJ_FROZEN
+	battleanimobj RELATIVE_X, $b8, BATTLEANIMFRAMESET_30, BATTLEANIMFUNC_14, PAL_BATTLE_OB_BROWN, $11 ; ANIM_OBJ_MASTER_BALL_SPARKLE
+	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_21, BATTLEANIMFUNC_14, PAL_BATTLE_OB_YELLOW, $0d ; ANIM_OBJ_2C
+	battleanimobj RELATIVE_X | X_FLIP, $b0, BATTLEANIMFRAMESET_31, BATTLEANIMFUNC_00, PAL_BATTLE_OB_YELLOW, $05 ; ANIM_OBJ_2D
+	battleanimobj RELATIVE_X | X_FLIP, $b0, BATTLEANIMFRAMESET_32, BATTLEANIMFUNC_00, PAL_BATTLE_OB_YELLOW, $05 ; ANIM_OBJ_2E
+	battleanimobj RELATIVE_X | X_FLIP, $b0, BATTLEANIMFRAMESET_33, BATTLEANIMFUNC_00, PAL_BATTLE_OB_YELLOW, $05 ; ANIM_OBJ_2F
+	battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_34, BATTLEANIMFUNC_15, PAL_BATTLE_OB_YELLOW, $05 ; ANIM_OBJ_30
+	battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_36, BATTLEANIMFUNC_00, PAL_BATTLE_OB_YELLOW, $05 ; ANIM_OBJ_31
+	battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_37, BATTLEANIMFUNC_03, PAL_BATTLE_OB_GRAY, $08 ; ANIM_OBJ_LIGHTNING_BOLT
+	battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_38, BATTLEANIMFUNC_00, PAL_BATTLE_OB_YELLOW, $05 ; ANIM_OBJ_33
+	battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_39, BATTLEANIMFUNC_03, PAL_BATTLE_OB_GRAY, $08 ; ANIM_OBJ_34
+	battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_3A, BATTLEANIMFUNC_16, PAL_BATTLE_OB_GRAY, $02 ; ANIM_OBJ_35
+	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_3C, BATTLEANIMFUNC_17, PAL_BATTLE_OB_GRAY, $02 ; ANIM_OBJ_36
+	battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_3E, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $02 ; ANIM_OBJ_37
+	battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_3F, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $02 ; ANIM_OBJ_38
+	battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_40, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $02 ; ANIM_OBJ_39
+	battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_41, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $02 ; ANIM_OBJ_3A
+	battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_42, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $02 ; ANIM_OBJ_3B
+	battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_43, BATTLEANIMFUNC_18, PAL_BATTLE_OB_GREEN, $12 ; ANIM_OBJ_3C
+	battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_44, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GREEN, $12 ; ANIM_OBJ_3D
+	battleanimobj RELATIVE_X | X_FLIP, $b8, BATTLEANIMFRAMESET_45, BATTLEANIMFUNC_19, PAL_BATTLE_OB_GRAY, $13 ; ANIM_OBJ_GUST
+	battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_46, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $14 ; ANIM_OBJ_3F
+	battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_47, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $14 ; ANIM_OBJ_40
+	battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_48, BATTLEANIMFUNC_1A, PAL_BATTLE_OB_GRAY, $14 ; ANIM_OBJ_41
+	battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_49, BATTLEANIMFUNC_1A, PAL_BATTLE_OB_GRAY, $14 ; ANIM_OBJ_42
+	battleanimobj RELATIVE_X | X_FLIP, $98, BATTLEANIMFRAMESET_4A, BATTLEANIMFUNC_01, PAL_BATTLE_OB_GRAY, $14 ; ANIM_OBJ_43
+	battleanimobj RELATIVE_X | X_FLIP, $80, BATTLEANIMFRAMESET_4B, BATTLEANIMFUNC_00, PAL_BATTLE_OB_YELLOW, $11 ; ANIM_OBJ_44
+	battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_4C, BATTLEANIMFUNC_1C, PAL_BATTLE_OB_GREEN, $12 ; ANIM_OBJ_ABSORB
+	battleanimobj RELATIVE_X | X_FLIP, $b0, BATTLEANIMFRAMESET_4D, BATTLEANIMFUNC_1D, PAL_BATTLE_OB_GRAY, $15 ; ANIM_OBJ_46
+	battleanimobj RELATIVE_X, $b0, BATTLEANIMFRAMESET_51, BATTLEANIMFUNC_1E, PAL_BATTLE_OB_YELLOW, $11 ; ANIM_OBJ_47
+	battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_52, BATTLEANIMFUNC_1F, PAL_BATTLE_OB_GREEN, $16 ; ANIM_OBJ_48
+	battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_54, BATTLEANIMFUNC_1F, PAL_BATTLE_OB_GREEN, $16 ; ANIM_OBJ_49
+	battleanimobj RELATIVE_X | X_FLIP, $68, BATTLEANIMFRAMESET_56, BATTLEANIMFUNC_LEECH_SEED, PAL_BATTLE_OB_GREEN, $06 ; ANIM_OBJ_LEECH_SEED
+	battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_59, BATTLEANIMFUNC_21, PAL_BATTLE_OB_GRAY, $0e ; ANIM_OBJ_4B
+	battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_5C, BATTLEANIMFUNC_02, PAL_BATTLE_OB_GRAY, $17 ; ANIM_OBJ_4C
+	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_5D, BATTLEANIMFUNC_22, PAL_BATTLE_OB_YELLOW, $11 ; ANIM_OBJ_4D
+	battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $88, BATTLEANIMFRAMESET_5F, BATTLEANIMFUNC_00, PAL_BATTLE_OB_YELLOW, $10 ; ANIM_OBJ_4E
+	battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $88, BATTLEANIMFRAMESET_2D, BATTLEANIMFUNC_09, PAL_BATTLE_OB_YELLOW, $10 ; ANIM_OBJ_4F
+	battleanimobj RELATIVE_X | X_FLIP, $88, BATTLEANIMFRAMESET_60, BATTLEANIMFUNC_00, PAL_BATTLE_OB_YELLOW, $18 ; ANIM_OBJ_50
+	battleanimobj RELATIVE_X | X_FLIP, $80, BATTLEANIMFRAMESET_60, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $18 ; ANIM_OBJ_51
+	battleanimobj RELATIVE_X | X_FLIP, $50, BATTLEANIMFRAMESET_61, BATTLEANIMFUNC_23, PAL_BATTLE_OB_YELLOW, $19 ; ANIM_OBJ_CHICK
+	battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_63, BATTLEANIMFUNC_24, PAL_BATTLE_OB_GRAY, $19 ; ANIM_OBJ_53
+	battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_66, BATTLEANIMFUNC_25, PAL_BATTLE_OB_GRAY, $19 ; ANIM_OBJ_54
+	battleanimobj RELATIVE_X, $50, BATTLEANIMFRAMESET_1C, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $0c ; ANIM_OBJ_SKULL
+	battleanimobj RELATIVE_X | X_FLIP, $a8, BATTLEANIMFRAMESET_67, BATTLEANIMFUNC_26, PAL_BATTLE_OB_BROWN, $1a ; ANIM_OBJ_56
+	battleanimobj RELATIVE_X | X_FLIP, $a8, BATTLEANIMFRAMESET_68, BATTLEANIMFUNC_00, PAL_BATTLE_OB_BROWN, $1a ; ANIM_OBJ_57
+	battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_69, BATTLEANIMFUNC_01, PAL_BATTLE_OB_GRAY, $1a ; ANIM_OBJ_58
+	battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_6D, BATTLEANIMFUNC_28, PAL_BATTLE_OB_YELLOW, $19 ; ANIM_OBJ_PARALYZED
+	battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_6A, BATTLEANIMFUNC_27, PAL_BATTLE_OB_GRAY, $1b ; ANIM_OBJ_5A
+	battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_6F, BATTLEANIMFUNC_SPRIAL_DESCENT, PAL_BATTLE_OB_GRAY, $1c ; ANIM_OBJ_HAZE
+	battleanimobj RELATIVE_X | X_FLIP, $48, BATTLEANIMFRAMESET_70, BATTLEANIMFUNC_SPRIAL_DESCENT, PAL_BATTLE_OB_GRAY, $1c ; ANIM_OBJ_MIST
+	battleanimobj RELATIVE_X | X_FLIP, $48, BATTLEANIMFRAMESET_6F, BATTLEANIMFUNC_SPRIAL_DESCENT, PAL_BATTLE_OB_GRAY, $1c ; ANIM_OBJ_SMOG
+	battleanimobj RELATIVE_X | X_FLIP, $78, BATTLEANIMFRAMESET_6F, BATTLEANIMFUNC_POISON_GAS, PAL_BATTLE_OB_GRAY, $1c ; ANIM_OBJ_POISON_GAS
+	battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $90, BATTLEANIMFRAMESET_71, BATTLEANIMFUNC_HORN, PAL_BATTLE_OB_GRAY, $1d ; ANIM_OBJ_HORN
+	battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $90, BATTLEANIMFRAMESET_72, BATTLEANIMFUNC_2C, PAL_BATTLE_OB_GRAY, $1d ; ANIM_OBJ_60
+	battleanimobj RELATIVE_X, $48, BATTLEANIMFRAMESET_73, BATTLEANIMFUNC_2D, PAL_BATTLE_OB_RED, $1e ; ANIM_OBJ_61
+	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_74, BATTLEANIMFUNC_06, PAL_BATTLE_OB_GRAY, $15 ; ANIM_OBJ_62
+	battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_75, BATTLEANIMFUNC_2E, PAL_BATTLE_OB_BROWN, $19 ; ANIM_OBJ_63
+	battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_4A, BATTLEANIMFUNC_02, PAL_BATTLE_OB_GRAY, $14 ; ANIM_OBJ_64
+	battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_30, BATTLEANIMFUNC_2F, PAL_BATTLE_OB_GRAY, $11 ; ANIM_OBJ_65
+	battleanimobj RELATIVE_X, $78, BATTLEANIMFRAMESET_76, BATTLEANIMFUNC_POISON_GAS, PAL_BATTLE_OB_RED, $23 ; ANIM_OBJ_66
+	battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_77, BATTLEANIMFUNC_30, PAL_BATTLE_OB_GRAY, $1f ; ANIM_OBJ_67
+	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_77, BATTLEANIMFUNC_02, PAL_BATTLE_OB_GRAY, $1f ; ANIM_OBJ_68
+	battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_77, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $1f ; ANIM_OBJ_69
+	battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_78, BATTLEANIMFUNC_08, PAL_BATTLE_OB_YELLOW, $23 ; ANIM_OBJ_6A
+	battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_79, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $1f ; ANIM_OBJ_6B
+	battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_7A, BATTLEANIMFUNC_31, PAL_BATTLE_OB_YELLOW, $11 ; ANIM_OBJ_6C
+	battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_7A, BATTLEANIMFUNC_31, PAL_BATTLE_OB_YELLOW, $11 ; ANIM_OBJ_6D
+	battleanimobj RELATIVE_X | X_FLIP, $88, BATTLEANIMFRAMESET_7B, BATTLEANIMFUNC_32, PAL_BATTLE_OB_GRAY, $20 ; ANIM_OBJ_SKY_ATTACK_FEAROW
+	battleanimobj RELATIVE_X | X_FLIP, $98, BATTLEANIMFRAMESET_7C, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $04 ; ANIM_OBJ_LICK
+	battleanimobj RELATIVE_X | X_FLIP, $80, BATTLEANIMFRAMESET_7D, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $18 ; ANIM_OBJ_WITHDRAW
+	battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_21, BATTLEANIMFUNC_2F, PAL_BATTLE_OB_BLUE, $0d ; ANIM_OBJ_71
+	battleanimobj RELATIVE_X, $b0, BATTLEANIMFRAMESET_7E, BATTLEANIMFUNC_33, PAL_BATTLE_OB_YELLOW, $12 ; ANIM_OBJ_72
+	battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_7F, BATTLEANIMFUNC_2F, PAL_BATTLE_OB_GRAY, $08 ; ANIM_OBJ_73
+	battleanimobj RELATIVE_X | X_FLIP, $a0, BATTLEANIMFRAMESET_6F, BATTLEANIMFUNC_34, PAL_BATTLE_OB_GRAY, $1c ; ANIM_OBJ_74
+	battleanimobj RELATIVE_X | X_FLIP, $a0, BATTLEANIMFRAMESET_74, BATTLEANIMFUNC_35, PAL_BATTLE_OB_GRAY, $15 ; ANIM_OBJ_75
+	battleanimobj RELATIVE_X | X_FLIP, $b0, BATTLEANIMFRAMESET_80, BATTLEANIMFUNC_33, PAL_BATTLE_OB_GRAY, $14 ; ANIM_OBJ_76
+	battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_81, BATTLEANIMFUNC_37, PAL_BATTLE_OB_GRAY, $11 ; ANIM_OBJ_77
+	battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_85, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $22 ; ANIM_OBJ_78
+	battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_86, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $22 ; ANIM_OBJ_79
+	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_87, BATTLEANIMFUNC_39, PAL_BATTLE_OB_GRAY, $1f ; ANIM_OBJ_7A
+	battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_30, BATTLEANIMFUNC_3A, PAL_BATTLE_OB_YELLOW, $11 ; ANIM_OBJ_7B
+	battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_34, BATTLEANIMFUNC_00, PAL_BATTLE_OB_YELLOW, $05 ; ANIM_OBJ_7C
+	battleanimobj RELATIVE_X | X_FLIP | BEHIND_BG, $88, BATTLEANIMFRAMESET_88, BATTLEANIMFUNC_3B, PAL_BATTLE_OB_BLUE, $13 ; ANIM_OBJ_7D
+	battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_76, BATTLEANIMFUNC_25, PAL_BATTLE_OB_RED, $23 ; ANIM_OBJ_HEART
+	battleanimobj RELATIVE_X, $98, BATTLEANIMFRAMESET_10, BATTLEANIMFUNC_34, PAL_BATTLE_OB_RED, $03 ; ANIM_OBJ_7F
+	battleanimobj RELATIVE_X, $a8, BATTLEANIMFRAMESET_0F, BATTLEANIMFUNC_3C, PAL_BATTLE_OB_RED, $03 ; ANIM_OBJ_80
+	battleanimobj RELATIVE_X | X_FLIP, $68, BATTLEANIMFRAMESET_89, BATTLEANIMFUNC_SPRIAL_DESCENT, PAL_BATTLE_OB_GRAY, $1f ; ANIM_OBJ_COTTON_SPORE
+	battleanimobj RELATIVE_X | X_FLIP, $b0, BATTLEANIMFRAMESET_8A, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $1f ; ANIM_OBJ_82
+	battleanimobj RELATIVE_X | X_FLIP, $80, BATTLEANIMFRAMESET_8C, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $1f ; ANIM_OBJ_83
+	battleanimobj RELATIVE_X | X_FLIP, $50, BATTLEANIMFRAMESET_8D, BATTLEANIMFUNC_00, PAL_BATTLE_OB_YELLOW, $1f ; ANIM_OBJ_84
+	battleanimobj RELATIVE_X, $40, BATTLEANIMFRAMESET_24, BATTLEANIMFUNC_40, PAL_BATTLE_OB_GRAY, $0e ; ANIM_OBJ_85
+	battleanimobj RELATIVE_X | X_FLIP, $a8, BATTLEANIMFRAMESET_8E, BATTLEANIMFUNC_41, PAL_BATTLE_OB_RED, $1f ; ANIM_OBJ_86
+	battleanimobj RELATIVE_X | X_FLIP, $88, BATTLEANIMFRAMESET_8F, BATTLEANIMFUNC_3E, PAL_BATTLE_OB_GRAY, $1f ; ANIM_OBJ_87
+	battleanimobj RELATIVE_X | X_FLIP, $88, BATTLEANIMFRAMESET_93, BATTLEANIMFUNC_3E, PAL_BATTLE_OB_GRAY, $1f ; ANIM_OBJ_88
+	battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_97, BATTLEANIMFUNC_3D, PAL_BATTLE_OB_GRAY, $1f ; ANIM_OBJ_89
+	battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_78, BATTLEANIMFUNC_3D, PAL_BATTLE_OB_YELLOW, $23 ; ANIM_OBJ_8A
+	battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_99, BATTLEANIMFUNC_2E, PAL_BATTLE_OB_GRAY, $19 ; ANIM_OBJ_8B
+	battleanimobj RELATIVE_X | X_FLIP, $a0, BATTLEANIMFRAMESET_74, BATTLEANIMFUNC_02, PAL_BATTLE_OB_GRAY, $15 ; ANIM_OBJ_8C
+	battleanimobj RELATIVE_X | X_FLIP, $a0, BATTLEANIMFRAMESET_99, BATTLEANIMFUNC_35, PAL_BATTLE_OB_RED, $19 ; ANIM_OBJ_8D
+	battleanimobj RELATIVE_X | X_FLIP, $70, BATTLEANIMFRAMESET_8B, BATTLEANIMFUNC_3F, PAL_BATTLE_OB_GRAY, $1f ; ANIM_OBJ_SPIKES
+	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_15, BATTLEANIMFUNC_08, PAL_BATTLE_OB_GRAY, $0a ; ANIM_OBJ_8F
+	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_11, BATTLEANIMFUNC_02, PAL_BATTLE_OB_RED, $03 ; ANIM_OBJ_90
+	battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_7F, BATTLEANIMFUNC_42, PAL_BATTLE_OB_GRAY, $08 ; ANIM_OBJ_91
+	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_9A, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $1b ; ANIM_OBJ_92
+	battleanimobj RELATIVE_X | X_FLIP, $a0, BATTLEANIMFRAMESET_9B, BATTLEANIMFUNC_35, PAL_BATTLE_OB_RED, $23 ; ANIM_OBJ_93
+	battleanimobj RELATIVE_X | X_FLIP, $80, BATTLEANIMFRAMESET_9C, BATTLEANIMFUNC_23, PAL_BATTLE_OB_GRAY, $25 ; ANIM_OBJ_94
+	battleanimobj RELATIVE_X | X_FLIP, $80, BATTLEANIMFRAMESET_9D, BATTLEANIMFUNC_25, PAL_BATTLE_OB_GRAY, $25 ; ANIM_OBJ_95
+	battleanimobj RELATIVE_X | X_FLIP, $80, BATTLEANIMFRAMESET_9C, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $25 ; ANIM_OBJ_96
+	battleanimobj RELATIVE_X | X_FLIP, $80, BATTLEANIMFRAMESET_9E, BATTLEANIMFUNC_00, PAL_BATTLE_OB_BLUE, $25 ; ANIM_OBJ_97
+	battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $80, BATTLEANIMFRAMESET_9F, BATTLEANIMFUNC_3A, PAL_BATTLE_OB_GREEN, $23 ; ANIM_OBJ_98
+	battleanimobj RELATIVE_X | X_FLIP, $80, BATTLEANIMFRAMESET_A0, BATTLEANIMFUNC_16, PAL_BATTLE_OB_GRAY, $23 ; ANIM_OBJ_99
+	battleanimobj RELATIVE_X | X_FLIP, $70, BATTLEANIMFRAMESET_78, BATTLEANIMFUNC_43, PAL_BATTLE_OB_YELLOW, $23 ; ANIM_OBJ_9A
+	battleanimobj RELATIVE_X | X_FLIP, $c0, BATTLEANIMFRAMESET_A2, BATTLEANIMFUNC_01, PAL_BATTLE_OB_GRAY, $25 ; ANIM_OBJ_9B
+	battleanimobj RELATIVE_X | X_FLIP, $40, BATTLEANIMFRAMESET_A3, BATTLEANIMFUNC_44, PAL_BATTLE_OB_YELLOW, $24 ; ANIM_OBJ_9C
+	battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_A4, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $24 ; ANIM_OBJ_9D
+	battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_A5, BATTLEANIMFUNC_00, PAL_BATTLE_OB_YELLOW, $24 ; ANIM_OBJ_9E
+	battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_43, BATTLEANIMFUNC_45, PAL_BATTLE_OB_RED, $12 ; ANIM_OBJ_9F
+	battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_A6, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $02 ; ANIM_OBJ_A0
+	battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_A7, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $02 ; ANIM_OBJ_A1
+	battleanimobj RELATIVE_X | X_FLIP, $00, BATTLEANIMFRAMESET_B4, BATTLEANIMFUNC_4A, PAL_BATTLE_OB_BROWN, $0f ; ANIM_OBJ_A2
+	battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_A8, BATTLEANIMFUNC_02, PAL_BATTLE_OB_YELLOW, $05 ; ANIM_OBJ_A3
+	battleanimobj RELATIVE_X | X_FLIP, $40, BATTLEANIMFRAMESET_9C, BATTLEANIMFUNC_11, PAL_BATTLE_OB_GRAY, $25 ; ANIM_OBJ_A4
+	battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $90, BATTLEANIMFRAMESET_A9, BATTLEANIMFUNC_46, PAL_BATTLE_OB_GRAY, $23 ; ANIM_OBJ_A5
+	battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_24, BATTLEANIMFUNC_47, PAL_BATTLE_OB_GRAY, $0e ; ANIM_OBJ_PERISH_SONG
+	battleanimobj RELATIVE_X, $80, BATTLEANIMFRAMESET_AA, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $24 ; ANIM_OBJ_A7
+	battleanimobj RELATIVE_X | X_FLIP, $b8, BATTLEANIMFRAMESET_AB, BATTLEANIMFUNC_48, PAL_BATTLE_OB_GRAY, $13 ; ANIM_OBJ_A8
+	battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_AC, BATTLEANIMFUNC_44, PAL_BATTLE_OB_GRAY, $13 ; ANIM_OBJ_A9
+	battleanimobj RELATIVE_X, $a8, BATTLEANIMFRAMESET_05, BATTLEANIMFUNC_00, PAL_BATTLE_OB_GRAY, $01 ; ANIM_OBJ_AA
+	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_24, BATTLEANIMFUNC_43, PAL_BATTLE_OB_GRAY, $0e ; ANIM_OBJ_AB
+	battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_AD, BATTLEANIMFUNC_00, PAL_BATTLE_OB_BLUE, $17 ; ANIM_OBJ_AC
+	battleanimobj RELATIVE_X, $a8, BATTLEANIMFRAMESET_AE, BATTLEANIMFUNC_49, PAL_BATTLE_OB_GRAY, $01 ; ANIM_OBJ_AD
+	battleanimobj RELATIVE_X | X_FLIP, $90, BATTLEANIMFRAMESET_AF, BATTLEANIMFUNC_01, PAL_BATTLE_OB_YELLOW, $11 ; ANIM_OBJ_AE
+	battleanimobj RELATIVE_X | X_FLIP, $00, BATTLEANIMFRAMESET_B0, BATTLEANIMFUNC_4A, PAL_BATTLE_OB_GRAY, $04 ; ANIM_OBJ_AF
+	battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_70, BATTLEANIMFUNC_4B, PAL_BATTLE_OB_RED, $1c ; ANIM_OBJ_B0
+	battleanimobj RELATIVE_X, $88, BATTLEANIMFRAMESET_B1, BATTLEANIMFUNC_4C, PAL_BATTLE_OB_GRAY, $19 ; ANIM_OBJ_B1
+	battleanimobj RELATIVE_X, $b8, BATTLEANIMFRAMESET_19, BATTLEANIMFUNC_4D, PAL_BATTLE_OB_BROWN, $09 ; ANIM_OBJ_B2
+	battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $98, BATTLEANIMFRAMESET_B3, BATTLEANIMFUNC_00, PAL_BATTLE_OB_YELLOW, $27 ; ANIM_OBJ_B3
+	battleanimobj RELATIVE_X | X_FLIP | Y_FLIP, $98, BATTLEANIMFRAMESET_74, BATTLEANIMFUNC_04, PAL_BATTLE_OB_BLUE, $15 ; ANIM_OBJ_B4
+	battleanimobj RELATIVE_X | X_FLIP, $ff, BATTLEANIMFRAMESET_19, BATTLEANIMFUNC_4E, PAL_BATTLE_OB_BROWN, $09 ; ANIM_OBJ_B5
+	battleanimobj RELATIVE_X, $90, BATTLEANIMFRAMESET_73, BATTLEANIMFUNC_08, PAL_BATTLE_OB_RED, $1e ; ANIM_OBJ_FLOWER
+	battleanimobj RELATIVE_X, $ff, BATTLEANIMFRAMESET_89, BATTLEANIMFUNC_4F, PAL_BATTLE_OB_RED, $1f ; ANIM_OBJ_COTTON
+	battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_B5, BATTLEANIMFUNC_00, PAL_BATTLE_OB_ENEMY, $28 ; ANIM_OBJ_PLAYERFEETFOLLOW
+	battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_B6, BATTLEANIMFUNC_00, PAL_BATTLE_OB_PLAYER, $29 ; ANIM_OBJ_ENEMYFEETFOLLOW
+	battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_B7, BATTLEANIMFUNC_00, PAL_BATTLE_OB_ENEMY, $28 ; ANIM_OBJ_BA
+	battleanimobj ABSOLUTE_X, $00, BATTLEANIMFRAMESET_B8, BATTLEANIMFUNC_00, PAL_BATTLE_OB_PLAYER, $29 ; ANIM_OBJ_BB
+; ccfbe
--- a/data/battle/ball_colors.asm
+++ /dev/null
@@ -1,16 +1,0 @@
-; colors of balls thrown in battle
-
-BallColors: ; cd26c (33:526c)
-	db MASTER_BALL, PAL_BATTLE_OB_GREEN
-	db ULTRA_BALL,  PAL_BATTLE_OB_YELLOW
-	db GREAT_BALL,  PAL_BATTLE_OB_BLUE
-	db POKE_BALL,   PAL_BATTLE_OB_RED
-	db HEAVY_BALL,  PAL_BATTLE_OB_GRAY
-	db LEVEL_BALL,  PAL_BATTLE_OB_BROWN
-	db LURE_BALL,   PAL_BATTLE_OB_BLUE
-	db FAST_BALL,   PAL_BATTLE_OB_BLUE
-	db FRIEND_BALL, PAL_BATTLE_OB_YELLOW
-	db MOON_BALL,   PAL_BATTLE_OB_GRAY
-	db LOVE_BALL,   PAL_BATTLE_OB_RED
-	db -1,          PAL_BATTLE_OB_GRAY
-; cd284
--- a/data/battle/flee_mons.asm
+++ /dev/null
@@ -1,36 +1,0 @@
-FleeMons:
-; referenced by TryEnemyFlee and FastBallMultiplier
-
-SometimesFleeMons: ; 3c59a
-	db MAGNEMITE
-	db GRIMER
-	db TANGELA
-	db MR__MIME
-	db EEVEE
-	db PORYGON
-	db DRATINI
-	db DRAGONAIR
-	db TOGETIC
-	db UMBREON
-	db UNOWN
-	db SNUBBULL
-	db HERACROSS
-	db -1
-
-OftenFleeMons: ; 3c5a8
-	db CUBONE
-	db ARTICUNO
-	db ZAPDOS
-	db MOLTRES
-	db QUAGSIRE
-	db DELIBIRD
-	db PHANPY
-	db TEDDIURSA
-	db -1
-
-AlwaysFleeMons: ; 3c5b1
-	db RAIKOU
-	db ENTEI
-;	db SUICUNE
-	db -1
-; 3c5b4
--- a/data/flypoints.asm
+++ /dev/null
@@ -1,38 +1,0 @@
-flypoint: MACRO
-	const FLY_\1
-	db \2, SPAWN_\1
-ENDM
-
-Flypoints: ; 91c5e
-; landmark, spawn point
-	const_def
-; Johto
-	flypoint NEW_BARK,    NEW_BARK_TOWN
-	flypoint CHERRYGROVE, CHERRYGROVE_CITY
-	flypoint VIOLET,      VIOLET_CITY
-	flypoint AZALEA,      AZALEA_TOWN
-	flypoint GOLDENROD,   GOLDENROD_CITY
-	flypoint ECRUTEAK,    ECRUTEAK_CITY
-	flypoint OLIVINE,     OLIVINE_CITY
-	flypoint CIANWOOD,    CIANWOOD_CITY
-	flypoint MAHOGANY,    MAHOGANY_TOWN
-	flypoint LAKE,        LAKE_OF_RAGE
-	flypoint BLACKTHORN,  BLACKTHORN_CITY
-	flypoint MT_SILVER,   SILVER_CAVE
-
-; Kanto
-KANTO_FLYPOINT EQU const_value
-	flypoint PALLET,      PALLET_TOWN
-	flypoint VIRIDIAN,    VIRIDIAN_CITY
-	flypoint PEWTER,      PEWTER_CITY
-	flypoint CERULEAN,    CERULEAN_CITY
-	flypoint VERMILION,   VERMILION_CITY
-	flypoint ROCK_TUNNEL, ROCK_TUNNEL
-	flypoint LAVENDER,    LAVENDER_TOWN
-	flypoint CELADON,     CELADON_CITY
-	flypoint SAFFRON,     SAFFRON_CITY
-	flypoint FUCHSIA,     FUCHSIA_CITY
-	flypoint CINNABAR,    CINNABAR_ISLAND
-	flypoint INDIGO,      INDIGO_PLATEAU
-	db -1
-; 91c8f
--- /dev/null
+++ b/data/maps/flypoints.asm
@@ -1,0 +1,38 @@
+flypoint: MACRO
+	const FLY_\1
+	db \2, SPAWN_\1
+ENDM
+
+Flypoints: ; 91c5e
+; landmark, spawn point
+	const_def
+; Johto
+	flypoint NEW_BARK,    NEW_BARK_TOWN
+	flypoint CHERRYGROVE, CHERRYGROVE_CITY
+	flypoint VIOLET,      VIOLET_CITY
+	flypoint AZALEA,      AZALEA_TOWN
+	flypoint GOLDENROD,   GOLDENROD_CITY
+	flypoint ECRUTEAK,    ECRUTEAK_CITY
+	flypoint OLIVINE,     OLIVINE_CITY
+	flypoint CIANWOOD,    CIANWOOD_CITY
+	flypoint MAHOGANY,    MAHOGANY_TOWN
+	flypoint LAKE,        LAKE_OF_RAGE
+	flypoint BLACKTHORN,  BLACKTHORN_CITY
+	flypoint MT_SILVER,   SILVER_CAVE
+
+; Kanto
+KANTO_FLYPOINT EQU const_value
+	flypoint PALLET,      PALLET_TOWN
+	flypoint VIRIDIAN,    VIRIDIAN_CITY
+	flypoint PEWTER,      PEWTER_CITY
+	flypoint CERULEAN,    CERULEAN_CITY
+	flypoint VERMILION,   VERMILION_CITY
+	flypoint ROCK_TUNNEL, ROCK_TUNNEL
+	flypoint LAVENDER,    LAVENDER_TOWN
+	flypoint CELADON,     CELADON_CITY
+	flypoint SAFFRON,     SAFFRON_CITY
+	flypoint FUCHSIA,     FUCHSIA_CITY
+	flypoint CINNABAR,    CINNABAR_ISLAND
+	flypoint INDIGO,      INDIGO_PLATEAU
+	db -1
+; 91c8f
--- /dev/null
+++ b/data/maps/map_setup_scripts.asm
@@ -1,0 +1,177 @@
+MapSetupScripts: ; 15377
+; entries correspond to MAPSETUP_* constants (see constants/map_setup_constants.asm)
+	dw MapSetupScript_Warp
+	dw MapSetupScript_Continue
+	dw MapSetupScript_ReloadMap
+	dw MapSetupScript_Teleport
+	dw MapSetupScript_Door
+	dw MapSetupScript_Fall
+	dw MapSetupScript_Connection
+	dw MapSetupScript_LinkReturn
+	dw MapSetupScript_Train
+	dw MapSetupScript_Submenu
+	dw MapSetupScript_BadWarp
+	dw MapSetupScript_Fly
+; 1538f
+
+MapSetupScript_Teleport: ; 1538f
+	db map_prolong_sprites
+MapSetupScript_Fly: ; 15390
+	db map_fade_out_palettes
+	db map_keep_roam
+MapSetupScript_Warp: ; 15392
+	db map_lcd_off
+	db map_sound_off
+	db map_load_spawn
+	db map_attributes
+	db map_change_callback
+	db map_spawn_coord
+	db map_player_coord
+	db map_anchor_screen
+	db map_load_blocks
+	db map_buffer_screen
+	db map_load_graphics
+	db map_time_of_day
+	db map_load_objects
+	db map_lcd_on
+	db map_palettes
+	db map_face_down
+	db map_sprites
+	db map_bike_music
+	db map_max_volume
+	db map_fade_in_palettes
+	db map_animations_on
+	db map_wildmons
+	db map_end
+
+MapSetupScript_BadWarp: ; 153a9
+	db map_load_spawn
+	db map_attributes
+	db map_change_callback
+	db map_spawn_coord
+	db map_player_coord
+	db map_anchor_screen
+	db map_load_blocks
+	db map_buffer_screen
+	db map_lcd_off
+	db map_load_graphics
+	db map_time_of_day
+	db map_fade_out_music
+	db map_lcd_on
+	db map_load_objects
+	db map_palettes
+	db map_face_down
+	db map_sprites
+	db map_fade_music
+	db map_fade_in_palettes
+	db map_animations_on
+	db map_wildmons
+	db map_end
+
+MapSetupScript_Connection: ; 153bf
+	db map_animations_off
+	db map_load_connection
+	db map_attributes
+	db map_change_callback
+	db map_player_coord
+	db map_load_blocks
+	db map_load_tileset
+	db map_save_screen
+	db map_load_objects
+	db map_fade_music
+	db map_palettes
+	db map_stop_script
+	db map_keep_palettes
+	db map_wildmons
+	db map_update_roam
+	db map_animations_on
+	db map_end
+
+MapSetupScript_Fall: ; 153d0
+	db map_prolong_sprites
+MapSetupScript_Door: ; 153d1
+	db map_fade_out_palettes
+MapSetupScript_Train: ; 153d2
+	db map_load_warp
+	db map_attributes
+	db map_warp_face
+	db map_change_callback
+	db map_player_coord
+	db map_load_blocks
+	db map_buffer_screen
+	db map_lcd_off
+	db map_load_graphics
+	db map_time_of_day
+	db map_fade_out_music
+	db map_lcd_on
+	db map_load_objects
+	db map_palettes
+	db map_sprites
+	db map_fade_music
+	db map_fade_in_palettes
+	db map_animations_on
+	db map_wildmons
+	db map_update_roam
+	db map_end
+
+MapSetupScript_ReloadMap: ; 153e7
+	db map_fade
+	db map_clear_bg_palettes
+	db map_lcd_off
+	db map_sound_off
+	db map_load_blocks
+	db map_connection_blocks
+	db map_load_graphics
+	db map_time_of_day
+	db map_lcd_on
+	db map_palettes
+	db map_sprites
+	db map_music_force
+	db map_fade_in_palettes
+	db map_animations_on
+	db map_wildmons
+	db map_end
+
+MapSetupScript_LinkReturn: ; 153f7
+	db map_fade
+	db map_lcd_off
+	db map_sound_off
+	db map_change_callback
+	db map_load_blocks
+	db map_buffer_screen
+	db map_load_graphics
+	db map_time_of_day
+	db map_lcd_on
+	db map_palettes
+	db map_sprites
+	db map_bike_music
+	db map_fade_in_palettes
+	db map_animations_on
+	db map_wildmons
+	db map_text_scroll_off
+	db map_end
+
+MapSetupScript_Continue: ; 15408
+	db map_lcd_off
+	db map_sound_off
+	db map_attributes_2
+	db map_anchor_screen
+	db map_start_callback
+	db map_load_blocks
+	db map_connection_blocks
+	db map_buffer_screen
+	db map_load_graphics
+	db map_time_of_day
+	db map_lcd_on
+	db map_palettes
+	db map_sprites
+	db map_bike_music
+	db map_fade_in_palettes
+	db map_animations_on
+	db map_wildmons
+	db map_end
+
+MapSetupScript_Submenu: ; 1541a
+	db map_load_blocks
+	db map_connection_blocks
+	db map_end
--- /dev/null
+++ b/data/moves/effect_command_pointers.asm
@@ -1,0 +1,180 @@
+	dw 0 ; padding
+
+BattleCommandPointers: ; 3fd28
+; entries correspond to macros/scripts/effect_commands.asm
+	dw BattleCommand_CheckTurn ; 34084
+	dw BattleCommand_CheckObedience ; 343db
+	dw BattleCommand_UsedMoveText ; 34541
+	dw BattleCommand_DoTurn ; 34555
+	dw BattleCommand_Critical ; 34631
+	dw BattleCommand_DamageStats ; 352dc
+	dw BattleCommand_Stab ; 346d2 - 07
+	dw BattleCommand_DamageVariation ; 34cfd
+	dw BattleCommand_CheckHit ; 34d32
+	dw BattleCommand_LowerSub ; 34eee
+	dw BattleCommand_HitTargetNoSub ; 34f60
+	dw BattleCommand_RaiseSub ; 35004
+	dw BattleCommand_FailureText ; 35023
+	dw BattleCommand_CheckFaint ; 3505e
+	dw BattleCommand_CriticalText ; 35175
+	dw BattleCommand_SuperEffectiveText ; 351ad
+	dw BattleCommand_CheckDestinyBond ; 351c0
+	dw BattleCommand_BuildOpponentRage ; 35250
+	dw BattleCommand_PoisonTarget ; 35eee
+	dw BattleCommand_SleepTarget ; 35e5c
+	dw BattleCommand_DrainTarget ; 35fff
+	dw BattleCommand_EatDream ; 36008
+	dw BattleCommand_BurnTarget ; 3608c
+	dw BattleCommand_FreezeTarget ; 36102
+	dw BattleCommand_ParalyzeTarget ; 36165
+	dw BattleCommand_Selfdestruct ; 37380
+	dw BattleCommand_MirrorMove ; 373c9
+	dw BattleCommand_StatUp ; 361e4
+	dw BattleCommand_StatDown ; 362e3
+	dw BattleCommand_PayDay ; 3705c
+	dw BattleCommand_Conversion ; 3707f
+	dw BattleCommand_ResetStats ; 3710e
+	dw BattleCommand_StoreEnergy ; 36671
+	dw BattleCommand_UnleashEnergy ; 366e5
+	dw BattleCommand_ForceSwitch ; 3680f
+	dw BattleCommand_EndLoop ; 369b6
+	dw BattleCommand_FlinchTarget ; 36aa0
+	dw BattleCommand_OHKO ; 36af3
+	dw BattleCommand_Recoil ; 36cb2
+	dw BattleCommand_Mist ; 36c7e
+	dw BattleCommand_FocusEnergy ; 36c98
+	dw BattleCommand_Confuse ; 36d3b
+	dw BattleCommand_ConfuseTarget ; 36d1d
+	dw BattleCommand_Heal ; 3713e
+	dw BattleCommand_Transform ; 371cd
+	dw BattleCommand_Screen ; 372fc
+	dw BattleCommand_Poison ; 35f2c
+	dw BattleCommand_Paralyze ; 36dc7
+	dw BattleCommand_Substitute ; 36e7c
+	dw BattleCommand_RechargeNextTurn ; 36f0b
+	dw BattleCommand_Mimic ; 36f46
+	dw BattleCommand_Metronome ; 37418
+	dw BattleCommand_LeechSeed ; 36f9d
+	dw BattleCommand_Splash ; 36fe1
+	dw BattleCommand_Disable ; 36fed
+	dw BattleCommand_ClearText ; 37e85
+	dw BattleCommand_Charge ; 36b4d
+	dw BattleCommand_CheckCharge ; 36b3a
+	dw BattleCommand_TrapTarget ; 36c2d
+	dw BattleCommand3c ; 36c2c
+	dw BattleCommand_Rampage ; 36751
+	dw BattleCommand_CheckRampage ; 3671a
+	dw BattleCommand_ConstantDamage ; 35726
+	dw BattleCommand_Counter ; 35813
+	dw BattleCommand_Encore ; 35864
+	dw BattleCommand_PainSplit ; 35926
+	dw BattleCommand_Snore ; 359d0
+	dw BattleCommand_Conversion2 ; 359e6
+	dw BattleCommand_LockOn ; 35a53
+	dw BattleCommand_Sketch ; 35a74
+	dw BattleCommand_DefrostOpponent ; 35b16
+	dw BattleCommand_SleepTalk ; 35b33
+	dw BattleCommand_DestinyBond ; 35bff
+	dw BattleCommand_Spite ; 35c0f
+	dw BattleCommand_FalseSwipe ; 35c94
+	dw BattleCommand_HealBell ; 35cc9
+	dw BattleCommand_HeldFlinch ; 36ac9
+	dw BattleCommand_TripleKick ; 346b2
+	dw BattleCommand_KickCounter ; 346cd
+	dw BattleCommand_Thief ; 37492
+	dw BattleCommand_ArenaTrap ; 37517
+	dw BattleCommand_Nightmare ; 37536
+	dw BattleCommand_Defrost ; 37563
+	dw BattleCommand_Curse ; 37588
+	dw BattleCommand_Protect ; 37618
+	dw BattleCommand_Spikes ; 37683
+	dw BattleCommand_Foresight ; 376a0
+	dw BattleCommand_PerishSong ; 376c2
+	dw BattleCommand_StartSandstorm ; 376f8
+	dw BattleCommand_Endure ; 3766f
+	dw BattleCommand_CheckCurl ; 37718
+	dw BattleCommand_RolloutPower ; 37734
+	dw BattleCommand5d ; 37791
+	dw BattleCommand_FuryCutter ; 37792
+	dw BattleCommand_Attract ; 377ce
+	dw BattleCommand_HappinessPower ; 3784b
+	dw BattleCommand_Present ; 37874
+	dw BattleCommand_DamageCalc ; 35612 - 62
+	dw BattleCommand_FrustrationPower ; 3790e
+	dw BattleCommand_Safeguard ; 37939
+	dw BattleCommand_CheckSafeguard ; 37972
+	dw BattleCommand_GetMagnitude ; 37991
+	dw BattleCommand_BatonPass ; 379c9
+	dw BattleCommand_Pursuit ; 37b1d
+	dw BattleCommand_ClearHazards ; 37b39
+	dw BattleCommand_HealMorn ; 37b74
+	dw BattleCommand_HealDay ; 37b78
+	dw BattleCommand_HealNite ; 37b7c
+	dw BattleCommand_HiddenPower ; 37be8
+	dw BattleCommand_StartRain ; 37bf4
+	dw BattleCommand_StartSun ; 37c07
+	dw BattleCommand_AttackUp ; 361ac
+	dw BattleCommand_DefenseUp ; 361b0
+	dw BattleCommand_SpeedUp ; 361b4
+	dw BattleCommand_SpecialAttackUp ; 361b8
+	dw BattleCommand_SpecialDefenseUp ; 361bc
+	dw BattleCommand_AccuracyUp ; 361c0
+	dw BattleCommand_EvasionUp ; 361c4
+	dw BattleCommand_AttackUp2 ; 361c8
+	dw BattleCommand_DefenseUp2 ; 361cc
+	dw BattleCommand_SpeedUp2 ; 361d0
+	dw BattleCommand_SpecialAttackUp2 ; 361d4
+	dw BattleCommand_SpecialDefenseUp2 ; 361d8
+	dw BattleCommand_AccuracyUp2 ; 361dc
+	dw BattleCommand_EvasionUp2 ; 361e0
+	dw BattleCommand_AttackDown ; 362ad
+	dw BattleCommand_DefenseDown ; 362b1
+	dw BattleCommand_SpeedDown ; 362b5
+	dw BattleCommand_SpecialAttackDown ; 362b9
+	dw BattleCommand_SpecialDefenseDown ; 362bd
+	dw BattleCommand_AccuracyDown ; 362c1
+	dw BattleCommand_EvasionDown ; 362c5
+	dw BattleCommand_AttackDown2 ; 362c9
+	dw BattleCommand_DefenseDown2 ; 362cd
+	dw BattleCommand_SpeedDown2 ; 362d1
+	dw BattleCommand_SpecialAttackDown2 ; 362d5
+	dw BattleCommand_SpecialDefenseDown2 ; 362d9
+	dw BattleCommand_AccuracyDown2 ; 362dd
+	dw BattleCommand_EvasionDown2 ; 362e1
+	dw BattleCommand_StatUpMessage ; 363b8
+	dw BattleCommand_StatDownMessage ; 363e9
+	dw BattleCommand_StatUpFailText ; 3644c
+	dw BattleCommand_StatDownFailText ; 3646a
+	dw BattleCommand_EffectChance ; 34ecc
+	dw BattleCommand_StatDownAnim ; 34fdb
+	dw BattleCommand_StatUpAnim ; 34fd1
+	dw BattleCommand_SwitchTurn ; 34ffd - 93
+	dw BattleCommand_FakeOut ; 36a82
+	dw BattleCommand_BellyDrum ; 37c1a
+	dw BattleCommand_PsychUp ; 37c55
+	dw BattleCommand_Rage ; 36f1d
+	dw BattleCommand_DoubleFlyingDamage ; 36f25
+	dw BattleCommand_DoubleUndergroundDamage ; 36f2f
+	dw BattleCommand_MirrorCoat ; 37c95
+	dw BattleCommand_CheckFutureSight ; 37d0d
+	dw BattleCommand_FutureSight ; 37d34
+	dw BattleCommand_DoubleMinimizeDamage ; 37ce6
+	dw BattleCommand_SkipSunCharge ; 37d02
+	dw BattleCommand_ThunderAccuracy ; 37d94
+	dw BattleCommand_Teleport ; 36778
+	dw BattleCommand_BeatUp ; 35461
+	dw BattleCommand_RageDamage ; 3527b
+	dw BattleCommand_ResetTypeMatchup ; 34833
+	dw BattleCommand_AllStatsUp ; 36500
+	dw BattleCommanda5 ; 35165
+	dw BattleCommand_RaiseSubNoAnim ; 365af
+	dw BattleCommand_LowerSubNoAnim ; 365c3
+	dw BattleCommanda8 ; 355b5
+	dw BattleCommand_ClearMissDamage ; 355d5 - a9
+	dw BattleCommand_MoveDelay ; 37e80
+	dw BattleCommand_HitTarget ; 34f57
+	dw BattleCommand_TriStatusChance ; 3658f
+	dw BattleCommand_SuperEffectiveLoopText ; 351a5
+	dw BattleCommand_StartLoop ; 35197
+	dw BattleCommand_Curl ; 365a7
+; 3fe86
--- /dev/null
+++ b/data/moves/move_anims.asm
@@ -1,0 +1,5176 @@
+BattleAnimations:: ; c906f
+; entries correspond to constants/move_constants.asm
+	dw BattleAnim_0
+	dw BattleAnim_Pound
+	dw BattleAnim_KarateChop
+	dw BattleAnim_Doubleslap
+	dw BattleAnim_CometPunch
+	dw BattleAnim_MegaPunch
+	dw BattleAnim_PayDay
+	dw BattleAnim_FirePunch
+	dw BattleAnim_IcePunch
+	dw BattleAnim_Thunderpunch
+	dw BattleAnim_Scratch
+	dw BattleAnim_Vicegrip
+	dw BattleAnim_Guillotine
+	dw BattleAnim_RazorWind
+	dw BattleAnim_SwordsDance
+	dw BattleAnim_Cut
+	dw BattleAnim_Gust
+	dw BattleAnim_WingAttack
+	dw BattleAnim_Whirlwind
+	dw BattleAnim_Fly
+	dw BattleAnim_Bind
+	dw BattleAnim_Slam
+	dw BattleAnim_VineWhip
+	dw BattleAnim_Stomp
+	dw BattleAnim_DoubleKick
+	dw BattleAnim_MegaKick
+	dw BattleAnim_JumpKick
+	dw BattleAnim_RollingKick
+	dw BattleAnim_SandAttack
+	dw BattleAnim_Headbutt
+	dw BattleAnim_HornAttack
+	dw BattleAnim_FuryAttack
+	dw BattleAnim_HornDrill
+	dw BattleAnim_Tackle
+	dw BattleAnim_BodySlam
+	dw BattleAnim_Wrap
+	dw BattleAnim_TakeDown
+	dw BattleAnim_Thrash
+	dw BattleAnim_DoubleEdge
+	dw BattleAnim_TailWhip
+	dw BattleAnim_PoisonSting
+	dw BattleAnim_Twineedle
+	dw BattleAnim_PinMissile
+	dw BattleAnim_Leer
+	dw BattleAnim_Bite
+	dw BattleAnim_Growl
+	dw BattleAnim_Roar
+	dw BattleAnim_Sing
+	dw BattleAnim_Supersonic
+	dw BattleAnim_Sonicboom
+	dw BattleAnim_Disable
+	dw BattleAnim_Acid
+	dw BattleAnim_Ember
+	dw BattleAnim_Flamethrower
+	dw BattleAnim_Mist
+	dw BattleAnim_WaterGun
+	dw BattleAnim_HydroPump
+	dw BattleAnim_Surf
+	dw BattleAnim_IceBeam
+	dw BattleAnim_Blizzard
+	dw BattleAnim_Psybeam
+	dw BattleAnim_Bubblebeam
+	dw BattleAnim_AuroraBeam
+	dw BattleAnim_HyperBeam
+	dw BattleAnim_Peck
+	dw BattleAnim_DrillPeck
+	dw BattleAnim_Submission
+	dw BattleAnim_LowKick
+	dw BattleAnim_Counter
+	dw BattleAnim_SeismicToss
+	dw BattleAnim_Strength
+	dw BattleAnim_Absorb
+	dw BattleAnim_MegaDrain
+	dw BattleAnim_LeechSeed
+	dw BattleAnim_Growth
+	dw BattleAnim_RazorLeaf
+	dw BattleAnim_Solarbeam
+	dw BattleAnim_Poisonpowder
+	dw BattleAnim_StunSpore
+	dw BattleAnim_SleepPowder
+	dw BattleAnim_PetalDance
+	dw BattleAnim_StringShot
+	dw BattleAnim_DragonRage
+	dw BattleAnim_FireSpin
+	dw BattleAnim_Thundershock
+	dw BattleAnim_Thunderbolt
+	dw BattleAnim_ThunderWave
+	dw BattleAnim_Thunder
+	dw BattleAnim_RockThrow
+	dw BattleAnim_Earthquake
+	dw BattleAnim_Fissure
+	dw BattleAnim_Dig
+	dw BattleAnim_Toxic
+	dw BattleAnim_Confusion
+	dw BattleAnim_PsychicM
+	dw BattleAnim_Hypnosis
+	dw BattleAnim_Meditate
+	dw BattleAnim_Agility
+	dw BattleAnim_QuickAttack
+	dw BattleAnim_Rage
+	dw BattleAnim_Teleport
+	dw BattleAnim_NightShade
+	dw BattleAnim_Mimic
+	dw BattleAnim_Screech
+	dw BattleAnim_DoubleTeam
+	dw BattleAnim_Recover
+	dw BattleAnim_Harden
+	dw BattleAnim_Minimize
+	dw BattleAnim_Smokescreen
+	dw BattleAnim_ConfuseRay
+	dw BattleAnim_Withdraw
+	dw BattleAnim_DefenseCurl
+	dw BattleAnim_Barrier
+	dw BattleAnim_LightScreen
+	dw BattleAnim_Haze
+	dw BattleAnim_Reflect
+	dw BattleAnim_FocusEnergy
+	dw BattleAnim_Bide
+	dw BattleAnim_Metronome
+	dw BattleAnim_MirrorMove
+	dw BattleAnim_Selfdestruct
+	dw BattleAnim_EggBomb
+	dw BattleAnim_Lick
+	dw BattleAnim_Smog
+	dw BattleAnim_Sludge
+	dw BattleAnim_BoneClub
+	dw BattleAnim_FireBlast
+	dw BattleAnim_Waterfall
+	dw BattleAnim_Clamp
+	dw BattleAnim_Swift
+	dw BattleAnim_SkullBash
+	dw BattleAnim_SpikeCannon
+	dw BattleAnim_Constrict
+	dw BattleAnim_Amnesia
+	dw BattleAnim_Kinesis
+	dw BattleAnim_Softboiled
+	dw BattleAnim_HiJumpKick
+	dw BattleAnim_Glare
+	dw BattleAnim_DreamEater
+	dw BattleAnim_PoisonGas
+	dw BattleAnim_Barrage
+	dw BattleAnim_LeechLife
+	dw BattleAnim_LovelyKiss
+	dw BattleAnim_SkyAttack
+	dw BattleAnim_Transform
+	dw BattleAnim_Bubble
+	dw BattleAnim_DizzyPunch
+	dw BattleAnim_Spore
+	dw BattleAnim_Flash
+	dw BattleAnim_Psywave
+	dw BattleAnim_Splash
+	dw BattleAnim_AcidArmor
+	dw BattleAnim_Crabhammer
+	dw BattleAnim_Explosion
+	dw BattleAnim_FurySwipes
+	dw BattleAnim_Bonemerang
+	dw BattleAnim_Rest
+	dw BattleAnim_RockSlide
+	dw BattleAnim_HyperFang
+	dw BattleAnim_Sharpen
+	dw BattleAnim_Conversion
+	dw BattleAnim_TriAttack
+	dw BattleAnim_SuperFang
+	dw BattleAnim_Slash
+	dw BattleAnim_Substitute
+	dw BattleAnim_Struggle
+	dw BattleAnim_Sketch
+	dw BattleAnim_TripleKick
+	dw BattleAnim_Thief
+	dw BattleAnim_SpiderWeb
+	dw BattleAnim_MindReader
+	dw BattleAnim_Nightmare
+	dw BattleAnim_FlameWheel
+	dw BattleAnim_Snore
+	dw BattleAnim_Curse
+	dw BattleAnim_Flail
+	dw BattleAnim_Conversion2
+	dw BattleAnim_Aeroblast
+	dw BattleAnim_CottonSpore
+	dw BattleAnim_Reversal
+	dw BattleAnim_Spite
+	dw BattleAnim_PowderSnow
+	dw BattleAnim_Protect
+	dw BattleAnim_MachPunch
+	dw BattleAnim_ScaryFace
+	dw BattleAnim_FaintAttack
+	dw BattleAnim_SweetKiss
+	dw BattleAnim_BellyDrum
+	dw BattleAnim_SludgeBomb
+	dw BattleAnim_MudSlap
+	dw BattleAnim_Octazooka
+	dw BattleAnim_Spikes
+	dw BattleAnim_ZapCannon
+	dw BattleAnim_Foresight
+	dw BattleAnim_DestinyBond
+	dw BattleAnim_PerishSong
+	dw BattleAnim_IcyWind
+	dw BattleAnim_Detect
+	dw BattleAnim_BoneRush
+	dw BattleAnim_LockOn
+	dw BattleAnim_Outrage
+	dw BattleAnim_Sandstorm
+	dw BattleAnim_GigaDrain
+	dw BattleAnim_Endure
+	dw BattleAnim_Charm
+	dw BattleAnim_Rollout
+	dw BattleAnim_FalseSwipe
+	dw BattleAnim_Swagger
+	dw BattleAnim_MilkDrink
+	dw BattleAnim_Spark
+	dw BattleAnim_FuryCutter
+	dw BattleAnim_SteelWing
+	dw BattleAnim_MeanLook
+	dw BattleAnim_Attract
+	dw BattleAnim_SleepTalk
+	dw BattleAnim_HealBell
+	dw BattleAnim_Return
+	dw BattleAnim_Present
+	dw BattleAnim_Frustration
+	dw BattleAnim_Safeguard
+	dw BattleAnim_PainSplit
+	dw BattleAnim_SacredFire
+	dw BattleAnim_Magnitude
+	dw BattleAnim_Dynamicpunch
+	dw BattleAnim_Megahorn
+	dw BattleAnim_Dragonbreath
+	dw BattleAnim_BatonPass
+	dw BattleAnim_Encore
+	dw BattleAnim_Pursuit
+	dw BattleAnim_RapidSpin
+	dw BattleAnim_SweetScent
+	dw BattleAnim_IronTail
+	dw BattleAnim_MetalClaw
+	dw BattleAnim_VitalThrow
+	dw BattleAnim_MorningSun
+	dw BattleAnim_Synthesis
+	dw BattleAnim_Moonlight
+	dw BattleAnim_HiddenPower
+	dw BattleAnim_CrossChop
+	dw BattleAnim_Twister
+	dw BattleAnim_RainDance
+	dw BattleAnim_SunnyDay
+	dw BattleAnim_Crunch
+	dw BattleAnim_MirrorCoat
+	dw BattleAnim_PsychUp
+	dw BattleAnim_Extremespeed
+	dw BattleAnim_Ancientpower
+	dw BattleAnim_ShadowBall
+	dw BattleAnim_FutureSight
+	dw BattleAnim_RockSmash
+	dw BattleAnim_Whirlpool
+	dw BattleAnim_BeatUp
+	dw BattleAnim_252
+	dw BattleAnim_253
+	dw BattleAnim_254
+	dw BattleAnim_SweetScent2
+; $100
+	dw BattleAnim_ThrowPokeBall
+	dw BattleAnim_SendOutMon
+	dw BattleAnim_ReturnMon
+	dw BattleAnim_Confused
+	dw BattleAnim_Slp
+	dw BattleAnim_Brn
+	dw BattleAnim_Psn
+	dw BattleAnim_Sap
+	dw BattleAnim_Frz
+	dw BattleAnim_Par
+	dw BattleAnim_InLove
+	dw BattleAnim_InSandstorm
+	dw BattleAnim_InNightmare
+	dw BattleAnim_InWhirlpool
+	dw BattleAnim_Miss
+	dw BattleAnim_EnemyDamage
+	dw BattleAnim_EnemyStatDown
+	dw BattleAnim_PlayerStatDown
+	dw BattleAnim_PlayerDamage
+	dw BattleAnim_Wobble
+	dw BattleAnim_Shake
+	dw BattleAnim_HitConfusion
+; c929b
+
+BattleAnim_0: ; c929b
+BattleAnim_252: ; c929b
+BattleAnim_253: ; c929b
+BattleAnim_254: ; c929b
+BattleAnim_MirrorMove: ; c929b
+	anim_ret
+; c929c
+
+BattleAnim_SweetScent2: ; c929c
+	anim_2gfx ANIM_GFX_FLOWER, ANIM_GFX_MISC
+	anim_obj ANIM_OBJ_FLOWER,   8, 0,  12, 0, $2
+	anim_wait 2
+	anim_obj ANIM_OBJ_FLOWER,   8, 0,  10, 0, $2
+	anim_wait 64
+	anim_obj ANIM_OBJ_COTTON, -15, 0,   5, 0, $15
+	anim_obj ANIM_OBJ_COTTON, -15, 0,   5, 0, $2a
+	anim_obj ANIM_OBJ_COTTON, -15, 0,   5, 0, $3f
+	anim_bgeffect ANIM_BG_06, $0, $2, $0
+	anim_wait 128
+	anim_ret
+; c92c1
+
+BattleAnim_ThrowPokeBall
+	anim_if_param_equal NO_ITEM, .TheTrainerBlockedTheBall
+	anim_if_param_equal MASTER_BALL, .MasterBall
+	anim_if_param_equal ULTRA_BALL, .UltraBall
+	anim_if_param_equal GREAT_BALL, .GreatBall
+	; any other ball
+	anim_2gfx ANIM_GFX_POKE_BALL, ANIM_GFX_SMOKE
+	anim_sound 6, 2, SFX_THROW_BALL
+	anim_obj ANIM_OBJ_POKE_BALL,   8, 4,  11, 4, $40
+	anim_wait 36
+	anim_obj ANIM_OBJ_POKE_BALL, -15, 0,   8, 1, $0
+	anim_setobj $2, $7
+	anim_wait 16
+	anim_sound 0, 1, SFX_BALL_POOF
+	anim_obj ANIM_OBJ_BALL_POOF, -15, 0,   8, 0, $10
+	anim_wait 16
+	anim_jump .Shake
+; c92f2
+
+.TheTrainerBlockedTheBall:
+	anim_2gfx ANIM_GFX_POKE_BALL, ANIM_GFX_HIT
+	anim_sound 6, 2, SFX_THROW_BALL
+	anim_obj ANIM_OBJ_POKE_BALL_BLOCKED,   8, 0,  11, 4, $20
+	anim_wait 20
+	anim_obj ANIM_OBJ_01,  14, 0,   5, 0, $0
+	anim_wait 32
+	anim_ret
+; c9305
+
+.UltraBall:
+	anim_2gfx ANIM_GFX_POKE_BALL, ANIM_GFX_SMOKE
+	anim_sound 6, 2, SFX_THROW_BALL
+	anim_obj ANIM_OBJ_POKE_BALL,   8, 4,  11, 4, $40
+	anim_wait 36
+	anim_obj ANIM_OBJ_POKE_BALL, -15, 0,   8, 1, $0
+	anim_setobj $2, $7
+	anim_wait 16
+	anim_sound 0, 1, SFX_BALL_POOF
+	anim_obj ANIM_OBJ_BALL_POOF, -15, 0,   8, 0, $10
+	anim_wait 16
+	anim_jump .Shake
+; c9326
+
+.GreatBall:
+	anim_2gfx ANIM_GFX_POKE_BALL, ANIM_GFX_SMOKE
+	anim_sound 6, 2, SFX_THROW_BALL
+	anim_obj ANIM_OBJ_POKE_BALL,   8, 4,  11, 4, $40
+	anim_wait 36
+	anim_obj ANIM_OBJ_POKE_BALL, -15, 0,   8, 1, $0
+	anim_setobj $2, $7
+	anim_wait 16
+	anim_sound 0, 1, SFX_BALL_POOF
+	anim_obj ANIM_OBJ_BALL_POOF, -15, 0,   8, 0, $10
+	anim_wait 16
+	anim_jump .Shake
+; c9347
+
+.MasterBall:
+	anim_3gfx ANIM_GFX_POKE_BALL, ANIM_GFX_SMOKE, ANIM_GFX_SPEED
+	anim_sound 6, 2, SFX_THROW_BALL
+	anim_obj ANIM_OBJ_POKE_BALL,   8, 0,  11, 4, $20
+	anim_wait 36
+	anim_obj ANIM_OBJ_POKE_BALL, -15, 0,   8, 1, $0
+	anim_setobj $2, $7
+	anim_wait 16
+	anim_sound 0, 1, SFX_BALL_POOF
+	anim_obj ANIM_OBJ_BALL_POOF, -15, 0,   8, 0, $10
+	anim_wait 24
+	anim_sound 0, 1, SFX_MASTER_BALL
+	anim_obj ANIM_OBJ_MASTER_BALL_SPARKLE, -15, 0,   7, 0, $30
+	anim_obj ANIM_OBJ_MASTER_BALL_SPARKLE, -15, 0,   7, 0, $31
+	anim_obj ANIM_OBJ_MASTER_BALL_SPARKLE, -15, 0,   7, 0, $32
+	anim_obj ANIM_OBJ_MASTER_BALL_SPARKLE, -15, 0,   7, 0, $33
+	anim_obj ANIM_OBJ_MASTER_BALL_SPARKLE, -15, 0,   7, 0, $34
+	anim_obj ANIM_OBJ_MASTER_BALL_SPARKLE, -15, 0,   7, 0, $35
+	anim_obj ANIM_OBJ_MASTER_BALL_SPARKLE, -15, 0,   7, 0, $36
+	anim_obj ANIM_OBJ_MASTER_BALL_SPARKLE, -15, 0,   7, 0, $37
+	anim_wait 64
+.Shake:
+	anim_bgeffect ANIM_BG_RETURN_MON, $0, $0, $0
+	anim_wait 8
+	anim_incobj  2
+	anim_wait 16
+	anim_sound 0, 1, SFX_CHANGE_DEX_MODE
+	anim_incobj  1
+	anim_wait 32
+	anim_sound 0, 1, SFX_BALL_BOUNCE
+	anim_wait 32
+	anim_wait 32
+	anim_wait 32
+	anim_wait 8
+	anim_setvar $0
+.Loop:
+	anim_wait 48
+	anim_checkpokeball
+	anim_if_var_equal $1, .Click
+	anim_if_var_equal $2, .BreakFree
+	anim_incobj  1
+	anim_sound 0, 1, SFX_BALL_WIGGLE
+	anim_jump .Loop
+; c93bc
+
+.Click:
+	anim_clearsprites
+	anim_ret
+; c93be
+
+.BreakFree:
+	anim_setobj $1, $b
+	anim_sound 0, 1, SFX_BALL_POOF
+	anim_obj ANIM_OBJ_BALL_POOF, -15, 0,   8, 0, $10
+	anim_wait 2
+	anim_bgeffect ANIM_BG_ENTER_MON, $0, $0, $0
+	anim_wait 32
+	anim_ret
+; c93d1
+
+BattleAnim_SendOutMon: ; c93d1
+	anim_if_param_equal $0, .Normal
+	anim_if_param_equal $1, .Shiny
+	anim_if_param_equal $2, .Unknown
+	anim_1gfx ANIM_GFX_SMOKE
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_bgeffect ANIM_BG_2B, $0, $1, $0
+	anim_sound 0, 0, SFX_BALL_POOF
+	anim_obj ANIM_OBJ_1B,   6, 0,  12, 0, $0
+	anim_bgeffect ANIM_BG_ENTER_MON, $0, $1, $0
+	anim_wait 128
+	anim_wait 4
+	anim_call BattleAnim_ShowMon_0
+	anim_ret
+
+.Unknown:
+	anim_1gfx ANIM_GFX_SMOKE
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_bgeffect ANIM_BG_2A, $0, $1, $0
+	anim_wait 1
+	anim_bgeffect ANIM_BG_SHOW_MON, $0, $1, $0
+	anim_wait 4
+	anim_sound 0, 0, SFX_BALL_POOF
+	anim_obj ANIM_OBJ_1B,   6, 0,  12, 0, $0
+	anim_incbgeffect ANIM_BG_2A
+	anim_wait 96
+	anim_incbgeffect ANIM_BG_2A
+	anim_call BattleAnim_ShowMon_0
+	anim_ret
+
+.Shiny:
+	anim_1gfx ANIM_GFX_SPEED
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $4, $3
+	anim_bgeffect ANIM_BG_06, $0, $2, $0
+	anim_sound 0, 0, SFX_SHINE
+	anim_obj ANIM_OBJ_6D,   6, 0,  12, 0, $0
+	anim_wait 4
+	anim_sound 0, 0, SFX_SHINE
+	anim_obj ANIM_OBJ_6D,   6, 0,  12, 0, $8
+	anim_wait 4
+	anim_sound 0, 0, SFX_SHINE
+	anim_obj ANIM_OBJ_6D,   6, 0,  12, 0, $10
+	anim_wait 4
+	anim_sound 0, 0, SFX_SHINE
+	anim_obj ANIM_OBJ_6D,   6, 0,  12, 0, $18
+	anim_wait 4
+	anim_sound 0, 0, SFX_SHINE
+	anim_obj ANIM_OBJ_6D,   6, 0,  12, 0, $20
+	anim_wait 4
+	anim_sound 0, 0, SFX_SHINE
+	anim_obj ANIM_OBJ_6D,   6, 0,  12, 0, $28
+	anim_wait 4
+	anim_sound 0, 0, SFX_SHINE
+	anim_obj ANIM_OBJ_6D,   6, 0,  12, 0, $30
+	anim_wait 4
+	anim_sound 0, 0, SFX_SHINE
+	anim_obj ANIM_OBJ_6D,   6, 0,  12, 0, $38
+	anim_wait 32
+	anim_ret
+
+.Normal:
+	anim_1gfx ANIM_GFX_SMOKE
+	anim_sound 0, 0, SFX_BALL_POOF
+	anim_obj ANIM_OBJ_BALL_POOF,   5, 4,  12, 0, $0
+	anim_wait 4
+	anim_bgeffect ANIM_BG_ENTER_MON, $0, $1, $0
+	anim_wait 32
+	anim_ret
+; c9483
+
+BattleAnim_ReturnMon: ; c9483
+	anim_sound 0, 0, SFX_BALL_POOF
+BattleAnim_BatonPass_branch_c9486: ; c9486
+	anim_bgeffect ANIM_BG_RETURN_MON, $0, $1, $0
+	anim_wait 32
+	anim_ret
+; c948d
+
+BattleAnim_Confused: ; c948d
+	anim_1gfx ANIM_GFX_STATUS
+	anim_sound 0, 0, SFX_KINESIS
+	anim_obj ANIM_OBJ_CHICK,   5, 4,   7, 0, $15
+	anim_obj ANIM_OBJ_CHICK,   5, 4,   7, 0, $aa
+	anim_obj ANIM_OBJ_CHICK,   5, 4,   7, 0, $bf
+	anim_wait 96
+	anim_ret
+; c94a3
+
+BattleAnim_Slp: ; c94a3
+	anim_1gfx ANIM_GFX_STATUS
+	anim_sound 0, 0, SFX_TAIL_WHIP
+.loop
+	anim_obj ANIM_OBJ_54,   8, 0,  10, 0, $0
+	anim_wait 40
+	anim_loop 3, .loop
+	anim_wait 32
+	anim_ret
+; c94b4
+
+BattleAnim_Brn: ; c94b4
+	anim_1gfx ANIM_GFX_FIRE
+.loop
+	anim_sound 0, 0, SFX_BURN
+	anim_obj ANIM_OBJ_BURNED,   7, 0,  11, 0, $10
+	anim_wait 4
+	anim_loop 3, .loop
+	anim_wait 6
+	anim_ret
+; c94c5
+
+BattleAnim_Psn: ; c94c5
+	anim_1gfx ANIM_GFX_POISON
+	anim_sound 0, 0, SFX_POISON
+	anim_obj ANIM_OBJ_SKULL,   8, 0,   7, 0, $0
+	anim_wait 8
+	anim_sound 0, 0, SFX_POISON
+	anim_obj ANIM_OBJ_SKULL,   6, 0,   7, 0, $0
+	anim_wait 8
+	anim_ret
+; c94da
+
+BattleAnim_Sap: ; c94da
+	anim_1gfx ANIM_GFX_CHARGE
+	anim_sound 6, 3, SFX_WATER_GUN
+	anim_obj ANIM_OBJ_ABSORB,  16, 0,   6, 0, $2
+	anim_wait 6
+	anim_sound 6, 3, SFX_WATER_GUN
+	anim_obj ANIM_OBJ_ABSORB, -15, 0,   8, 0, $3
+	anim_wait 6
+	anim_sound 6, 3, SFX_WATER_GUN
+	anim_obj ANIM_OBJ_ABSORB, -15, 0,   4, 0, $4
+	anim_wait 16
+	anim_ret
+; c94f8
+
+BattleAnim_Frz: ; c94f8
+	anim_1gfx ANIM_GFX_ICE
+	anim_obj ANIM_OBJ_FROZEN,   5, 4,  13, 6, $0
+	anim_sound 0, 0, SFX_SHINE
+	anim_wait 16
+	anim_sound 0, 0, SFX_SHINE
+	anim_wait 16
+	anim_ret
+; c9508
+
+BattleAnim_Par: ; c9508
+	anim_1gfx ANIM_GFX_STATUS
+	anim_bgeffect ANIM_BG_06, $0, $2, $0
+	anim_sound 0, 0, SFX_THUNDERSHOCK
+	anim_obj ANIM_OBJ_PARALYZED,   2, 4,  11, 0, $42
+	anim_obj ANIM_OBJ_PARALYZED,   9, 4,  11, 0, $c2
+	anim_wait 128
+	anim_ret
+; c951e
+
+BattleAnim_InLove: ; c951e
+	anim_1gfx ANIM_GFX_OBJECTS
+	anim_sound 0, 0, SFX_LICK
+	anim_obj ANIM_OBJ_HEART,   8, 0,   9, 4, $0
+	anim_wait 32
+	anim_sound 0, 0, SFX_LICK
+	anim_obj ANIM_OBJ_HEART,   4, 4,   9, 0, $0
+	anim_wait 32
+	anim_ret
+; c9533
+
+BattleAnim_InSandstorm: ; c9533
+	anim_1gfx ANIM_GFX_POWDER
+	anim_obj ANIM_OBJ_A2,  11, 0,   0, 0, $0
+	anim_wait 8
+	anim_obj ANIM_OBJ_A2,   9, 0,   0, 0, $1
+	anim_wait 8
+	anim_obj ANIM_OBJ_A2,   7, 0,   0, 0, $2
+.loop
+	anim_sound 0, 1, SFX_MENU
+	anim_wait 8
+	anim_loop 6, .loop
+	anim_wait 8
+	anim_ret
+; c9550
+
+BattleAnim_InNightmare: ; c9550
+	anim_1gfx ANIM_GFX_ANGELS
+	anim_sound 0, 0, SFX_BUBBLEBEAM
+	anim_obj ANIM_OBJ_95,   8, 4,  10, 0, $0
+	anim_wait 40
+	anim_ret
+; c955c
+
+BattleAnim_InWhirlpool: ; c955c
+	anim_1gfx ANIM_GFX_WIND
+	anim_bgeffect ANIM_BG_WHIRLPOOL, $0, $0, $0
+	anim_sound 0, 1, SFX_SURF
+.loop
+	anim_obj ANIM_OBJ_GUST, -16, 4,   9, 0, $0
+	anim_wait 6
+	anim_loop 6, .loop
+	anim_incbgeffect ANIM_BG_WHIRLPOOL
+	anim_wait 1
+	anim_ret
+; c9574
+
+BattleAnim_HitConfusion: ; c9574
+	anim_1gfx ANIM_GFX_HIT
+	anim_sound 0, 0, SFX_POUND
+	anim_obj ANIM_OBJ_04,   5, 4,  12, 0, $0
+	anim_wait 16
+	anim_ret
+; c9580
+
+BattleAnim_Miss: ; c9580
+	anim_ret
+; c9581
+
+BattleAnim_EnemyDamage: ; c9581
+.loop
+	anim_bgeffect ANIM_BG_HIDE_MON, $0, $0, $0
+	anim_wait 5
+	anim_bgeffect ANIM_BG_SHOW_MON, $0, $0, $0
+	anim_wait 5
+	anim_loop 3, .loop
+	anim_ret
+; c9592
+
+BattleAnim_EnemyStatDown: ; c9592
+	anim_call BattleAnim_FollowEnemyFeet_1
+	anim_bgeffect ANIM_BG_VIBRATE_MON, $0, $0, $0
+	anim_wait 40
+	anim_call BattleAnim_ShowMon_1
+	anim_wait 1
+	anim_ret
+; c95a0
+
+BattleAnim_PlayerStatDown: ; c95a0
+	anim_call BattleAnim_FollowEnemyFeet_1
+	anim_bgeffect ANIM_BG_WOBBLE_MON, $0, $0, $0
+	anim_wait 40
+	anim_call BattleAnim_ShowMon_1
+	anim_wait 1
+	anim_ret
+; c95ae
+
+BattleAnim_PlayerDamage: ; c95ae
+	anim_bgeffect ANIM_BG_20, $20, $2, $20
+	anim_wait 40
+	anim_ret
+; c95b5
+
+BattleAnim_Wobble: ; c95b5
+	anim_bgeffect ANIM_BG_35, $0, $0, $0
+	anim_wait 40
+	anim_ret
+; c95bc
+
+BattleAnim_Shake: ; c95bc
+	anim_bgeffect ANIM_BG_1F, $20, $2, $40
+	anim_wait 40
+	anim_ret
+; c95c3
+
+BattleAnim_Pound: ; c95c3
+	anim_1gfx ANIM_GFX_HIT
+	anim_sound 0, 1, SFX_POUND
+	anim_obj ANIM_OBJ_08, -15, 0,   7, 0, $0
+	anim_wait 6
+	anim_obj ANIM_OBJ_01, -15, 0,   7, 0, $0
+	anim_wait 16
+	anim_ret
+; c95d5
+
+BattleAnim_KarateChop: ; c95d5
+	anim_1gfx ANIM_GFX_HIT
+	anim_sound 0, 1, SFX_KARATE_CHOP
+	anim_obj ANIM_OBJ_08, -15, 0,   5, 0, $0
+	anim_wait 6
+	anim_obj ANIM_OBJ_01, -15, 0,   5, 0, $0
+	anim_wait 6
+	anim_sound 0, 1, SFX_KARATE_CHOP
+	anim_obj ANIM_OBJ_08, -15, 0,   5, 4, $0
+	anim_wait 6
+	anim_obj ANIM_OBJ_01, -15, 0,   5, 4, $0
+	anim_wait 6
+	anim_sound 0, 1, SFX_KARATE_CHOP
+	anim_obj ANIM_OBJ_08, -15, 0,   6, 0, $0
+	anim_wait 6
+	anim_obj ANIM_OBJ_01, -15, 0,   6, 0, $0
+	anim_wait 16
+	anim_ret
+; c9605
+
+BattleAnim_Doubleslap: ; c9605
+	anim_1gfx ANIM_GFX_HIT
+	anim_if_param_equal $1, BattleAnim_Doubleslap_branch_c961b
+	anim_sound 0, 1, SFX_DOUBLESLAP
+	anim_obj ANIM_OBJ_08, -14, 0,   6, 0, $0
+	anim_wait 6
+	anim_obj ANIM_OBJ_01, -14, 0,   6, 0, $0
+	anim_wait 8
+	anim_ret
+; c961b
+
+BattleAnim_Doubleslap_branch_c961b: ; c961b
+	anim_sound 0, 1, SFX_DOUBLESLAP
+	anim_obj ANIM_OBJ_08,  15, 0,   6, 0, $0
+	anim_wait 6
+	anim_obj ANIM_OBJ_01,  15, 0,   6, 0, $0
+	anim_wait 8
+	anim_ret
+; c962b
+
+BattleAnim_CometPunch: ; c962b
+	anim_1gfx ANIM_GFX_HIT
+	anim_if_param_equal $1, BattleAnim_CometPunch_branch_c9641
+	anim_sound 0, 1, SFX_COMET_PUNCH
+	anim_obj ANIM_OBJ_06, -14, 0,   6, 0, $0
+	anim_wait 6
+	anim_obj ANIM_OBJ_01, -14, 0,   6, 0, $0
+	anim_wait 8
+	anim_ret
+; c9641
+
+BattleAnim_CometPunch_branch_c9641: ; c9641
+	anim_sound 0, 1, SFX_COMET_PUNCH
+	anim_obj ANIM_OBJ_06,  15, 0,   8, 0, $0
+	anim_wait 6
+	anim_obj ANIM_OBJ_01,  15, 0,   8, 0, $0
+	anim_wait 8
+	anim_ret
+; c9651
+
+BattleAnim_Bide_branch_c9651: ; c9651
+BattleAnim_MegaPunch: ; c9651
+	anim_1gfx ANIM_GFX_HIT
+	anim_bgeffect ANIM_BG_1F, $40, $2, $0
+	anim_wait 48
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $3
+.loop
+	anim_sound 0, 1, SFX_MEGA_PUNCH
+	anim_obj ANIM_OBJ_06, -15, 0,   7, 0, $0
+	anim_obj ANIM_OBJ_00, -15, 0,   7, 0, $0
+	anim_wait 6
+	anim_obj ANIM_OBJ_06, -15, 0,   7, 0, $0
+	anim_wait 6
+	anim_loop 3, .loop
+	anim_ret
+; c9677
+
+BattleAnim_Stomp: ; c9677
+	anim_1gfx ANIM_GFX_HIT
+	anim_sound 0, 1, SFX_STOMP
+	anim_obj ANIM_OBJ_07, -15, 0,   5, 0, $0
+	anim_wait 6
+	anim_obj ANIM_OBJ_01, -15, 0,   5, 0, $0
+	anim_wait 6
+	anim_sound 0, 1, SFX_STOMP
+	anim_obj ANIM_OBJ_07, -15, 0,   5, 4, $0
+	anim_wait 6
+	anim_obj ANIM_OBJ_01, -15, 0,   5, 4, $0
+	anim_wait 6
+	anim_sound 0, 1, SFX_STOMP
+	anim_obj ANIM_OBJ_07, -15, 0,   6, 0, $0
+	anim_wait 6
+	anim_obj ANIM_OBJ_01, -15, 0,   6, 0, $0
+	anim_wait 16
+	anim_ret
+; c96a7
+
+BattleAnim_DoubleKick: ; c96a7
+	anim_1gfx ANIM_GFX_HIT
+	anim_if_param_equal $1, BattleAnim_DoubleKick_branch_c96bd
+	anim_sound 0, 1, SFX_DOUBLE_KICK
+	anim_obj ANIM_OBJ_07, -14, 0,   6, 0, $0
+	anim_wait 6
+	anim_obj ANIM_OBJ_01, -14, 0,   6, 0, $0
+	anim_wait 8
+	anim_ret
+; c96bd
+
+BattleAnim_DoubleKick_branch_c96bd: ; c96bd
+	anim_sound 0, 1, SFX_DOUBLE_KICK
+	anim_obj ANIM_OBJ_07,  15, 0,   8, 0, $0
+	anim_wait 6
+	anim_obj ANIM_OBJ_01,  15, 0,   8, 0, $0
+	anim_wait 8
+	anim_ret
+; c96cd
+
+BattleAnim_JumpKick: ; c96cd
+	anim_1gfx ANIM_GFX_HIT
+	anim_if_param_equal $1, BattleAnim_JumpKick_branch_c96f1
+	anim_sound 0, 1, SFX_JUMP_KICK
+	anim_obj ANIM_OBJ_07,  14, 0,   9, 0, $0
+	anim_obj ANIM_OBJ_07,  12, 4,   7, 4, $0
+	anim_setobj $1, $2
+	anim_setobj $2, $2
+	anim_wait 24
+	anim_sound 0, 1, SFX_DOUBLE_KICK
+	anim_obj ANIM_OBJ_04, -15, 0,   6, 0, $0
+	anim_wait 16
+	anim_ret
+; c96f1
+
+BattleAnim_JumpKick_branch_c96f1: ; c96f1
+	anim_wait 8
+	anim_sound 0, 0, SFX_DOUBLE_KICK
+	anim_obj ANIM_OBJ_04,   5, 4,  11, 0, $0
+	anim_wait 16
+	anim_ret
+; c96fc
+
+BattleAnim_HiJumpKick: ; c96fc
+	anim_1gfx ANIM_GFX_HIT
+	anim_bgeffect ANIM_BG_1F, $40, $2, $0
+	anim_if_param_equal $1, BattleAnim_HiJumpKick_branch_c971e
+	anim_wait 32
+	anim_sound 0, 1, SFX_JUMP_KICK
+	anim_obj ANIM_OBJ_07,  14, 0,   9, 0, $0
+	anim_setobj $1, $2
+	anim_wait 16
+	anim_sound 0, 1, SFX_DOUBLE_KICK
+	anim_obj ANIM_OBJ_04, -15, 0,   6, 0, $0
+	anim_wait 16
+	anim_ret
+; c971e
+
+BattleAnim_HiJumpKick_branch_c971e: ; c971e
+	anim_wait 16
+	anim_sound 0, 0, SFX_DOUBLE_KICK
+	anim_obj ANIM_OBJ_04,   5, 4,  11, 0, $0
+	anim_wait 16
+	anim_ret
+; c9729
+
+BattleAnim_RollingKick: ; c9729
+	anim_1gfx ANIM_GFX_HIT
+	anim_sound 0, 1, SFX_DOUBLE_KICK
+	anim_obj ANIM_OBJ_07,  14, 0,   7, 0, $0
+	anim_setobj $1, $3
+	anim_wait 12
+	anim_obj ANIM_OBJ_01, -15, 0,   6, 0, $0
+	anim_wait 16
+	anim_ret
+; c973e
+
+BattleAnim_MegaKick: ; c973e
+	anim_1gfx ANIM_GFX_HIT
+	anim_bgeffect ANIM_BG_1F, $40, $2, $0
+	anim_wait 67
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $3
+.loop
+	anim_sound 0, 1, SFX_MEGA_KICK
+	anim_obj ANIM_OBJ_07, -15, 0,   7, 0, $0
+	anim_obj ANIM_OBJ_00, -15, 0,   7, 0, $0
+	anim_wait 6
+	anim_obj ANIM_OBJ_07, -15, 0,   7, 0, $0
+	anim_wait 6
+	anim_loop 3, .loop
+	anim_ret
+; c9764
+
+BattleAnim_HyperFang: ; c9764
+	anim_1gfx ANIM_GFX_HIT
+	anim_bgeffect ANIM_BG_1F, $20, $1, $0
+	anim_sound 0, 1, SFX_BITE
+	anim_obj ANIM_OBJ_09, -15, 0,   7, 0, $0
+	anim_wait 6
+	anim_obj ANIM_OBJ_01, -15, 0,   7, 0, $0
+	anim_wait 16
+	anim_ret
+; c977b
+
+BattleAnim_SuperFang: ; c977b
+	anim_1gfx ANIM_GFX_HIT
+	anim_bgeffect ANIM_BG_1F, $40, $2, $0
+	anim_wait 48
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $3
+.loop
+	anim_sound 0, 1, SFX_BITE
+	anim_obj ANIM_OBJ_09, -15, 0,   7, 0, $0
+	anim_obj ANIM_OBJ_00, -15, 0,   7, 0, $0
+	anim_wait 6
+	anim_obj ANIM_OBJ_09, -15, 0,   7, 0, $0
+	anim_wait 6
+	anim_loop 3, .loop
+	anim_ret
+; c97a1
+
+BattleAnim_Ember: ; c97a1
+	anim_1gfx ANIM_GFX_FIRE
+	anim_sound 6, 2, SFX_EMBER
+	anim_obj ANIM_OBJ_0B,   8, 0,  12, 0, $12
+	anim_wait 4
+	anim_sound 6, 2, SFX_EMBER
+	anim_obj ANIM_OBJ_0B,   8, 0,  12, 4, $14
+	anim_wait 4
+	anim_sound 6, 2, SFX_EMBER
+	anim_obj ANIM_OBJ_0B,   8, 0,  10, 4, $13
+	anim_wait 16
+	anim_incobj  1
+	anim_incobj  2
+	anim_incobj  3
+	anim_sound 0, 1, SFX_EMBER
+	anim_obj ANIM_OBJ_0B,  15, 0,   8, 4, $30
+	anim_obj ANIM_OBJ_0B, -16, 4,   8, 4, $30
+	anim_obj ANIM_OBJ_0B, -14, 0,   8, 4, $30
+	anim_wait 32
+	anim_ret
+; c97d8
+
+BattleAnim_FirePunch: ; c97d8
+	anim_2gfx ANIM_GFX_HIT, ANIM_GFX_FIRE
+	anim_obj ANIM_OBJ_0A, -15, 0,   7, 0, $43
+	anim_call BattleAnim_FirePunch_branch_cbbcc
+	anim_wait 16
+	anim_ret
+; c97e5
+
+BattleAnim_FireSpin: ; c97e5
+	anim_1gfx ANIM_GFX_FIRE
+.loop
+	anim_sound 6, 2, SFX_EMBER
+	anim_obj ANIM_OBJ_0E,   8, 0,  11, 0, $4
+	anim_wait 2
+	anim_sound 6, 2, SFX_EMBER
+	anim_obj ANIM_OBJ_0E,   8, 0,  12, 0, $3
+	anim_wait 2
+	anim_sound 6, 2, SFX_EMBER
+	anim_obj ANIM_OBJ_0E,   8, 0,  11, 0, $3
+	anim_wait 2
+	anim_sound 6, 2, SFX_EMBER
+	anim_obj ANIM_OBJ_0E,   8, 0,  12, 0, $4
+	anim_wait 2
+	anim_loop 2, .loop
+	anim_wait 96
+	anim_ret
+; c9811
+
+BattleAnim_DragonRage: ; c9811
+	anim_1gfx ANIM_GFX_FIRE
+.loop
+	anim_sound 6, 2, SFX_EMBER
+	anim_obj ANIM_OBJ_0C,   8, 0,  11, 4, $0
+	anim_wait 3
+	anim_loop 16, .loop
+	anim_wait 64
+	anim_ret
+; c9822
+
+BattleAnim_Flamethrower: ; c9822
+	anim_1gfx ANIM_GFX_FIRE
+	anim_sound 6, 2, SFX_EMBER
+	anim_obj ANIM_OBJ_0D,   8, 0,  11, 4, $3
+	anim_wait 2
+	anim_obj ANIM_OBJ_0D,   9, 3,  10, 6, $5
+	anim_wait 2
+	anim_obj ANIM_OBJ_0D,  10, 5,  10, 1, $7
+	anim_wait 2
+	anim_obj ANIM_OBJ_0D,  12, 0,   9, 4, $9
+	anim_wait 2
+	anim_obj ANIM_OBJ_0D,  13, 2,   8, 7, $b
+	anim_wait 2
+	anim_obj ANIM_OBJ_0D,  14, 4,   8, 2, $c
+	anim_wait 2
+	anim_obj ANIM_OBJ_0D,  15, 6,   7, 5, $a
+	anim_wait 2
+	anim_obj ANIM_OBJ_0D, -15, 0,   7, 0, $8
+	anim_wait 16
+.loop
+	anim_sound 0, 1, SFX_EMBER
+	anim_wait 16
+	anim_loop 6, .loop
+	anim_wait 16
+	anim_ret
+; c9861
+
+BattleAnim_FireBlast: ; c9861
+	anim_1gfx ANIM_GFX_FIRE
+.loop1
+	anim_sound 6, 2, SFX_EMBER
+	anim_obj ANIM_OBJ_0F,   8, 0,  11, 4, $7
+	anim_wait 6
+	anim_loop 10, .loop1
+.loop2
+	anim_sound 0, 1, SFX_EMBER
+	anim_wait 8
+	anim_loop 10, .loop2
+	anim_incobj  1
+	anim_incobj  2
+	anim_incobj  3
+	anim_incobj  4
+	anim_incobj  5
+	anim_incobj  6
+	anim_incobj  7
+	anim_incobj  8
+	anim_incobj  9
+	anim_incobj 10
+	anim_wait 2
+.loop3
+	anim_sound 0, 1, SFX_EMBER
+	anim_obj ANIM_OBJ_0F, -15, 0,   7, 0, $1
+	anim_obj ANIM_OBJ_0F, -15, 0,   7, 0, $2
+	anim_obj ANIM_OBJ_0F, -15, 0,   7, 0, $3
+	anim_obj ANIM_OBJ_0F, -15, 0,   7, 0, $4
+	anim_obj ANIM_OBJ_0F, -15, 0,   7, 0, $5
+	anim_wait 16
+	anim_loop 2, .loop3
+	anim_wait 32
+	anim_ret
+; c98b0
+
+BattleAnim_IcePunch: ; c98b0
+	anim_2gfx ANIM_GFX_HIT, ANIM_GFX_ICE
+	anim_obj ANIM_OBJ_0A, -15, 0,   7, 0, $43
+	anim_call BattleAnim_IcePunch_branch_cbbdf
+	anim_wait 32
+	anim_ret
+; c98bd
+
+BattleAnim_IceBeam: ; c98bd
+	anim_1gfx ANIM_GFX_ICE
+.loop
+	anim_sound 6, 2, SFX_SHINE
+	anim_obj ANIM_OBJ_ICE_BEAM,   8, 0,  11, 4, $4
+	anim_wait 4
+	anim_loop 5, .loop
+	anim_obj ANIM_OBJ_ICE_BUILDUP, -15, 0,   9, 2, $10
+.loop2
+	anim_sound 6, 2, SFX_SHINE
+	anim_obj ANIM_OBJ_ICE_BEAM,   8, 0,  11, 4, $4
+	anim_wait 4
+	anim_loop 15, .loop2
+	anim_wait 48
+	anim_sound 0, 1, SFX_SHINE
+	anim_wait 8
+	anim_sound 0, 1, SFX_SHINE
+	anim_wait 8
+	anim_ret
+; c98e8
+
+BattleAnim_Blizzard: ; c98e8
+	anim_1gfx ANIM_GFX_ICE
+.loop
+	anim_sound 6, 2, SFX_SHINE
+	anim_obj ANIM_OBJ_BLIZZARD,   8, 0,  11, 0, $63
+	anim_wait 2
+	anim_sound 6, 2, SFX_SHINE
+	anim_obj ANIM_OBJ_BLIZZARD,   8, 0,  10, 0, $64
+	anim_wait 2
+	anim_sound 6, 2, SFX_SHINE
+	anim_obj ANIM_OBJ_BLIZZARD,   8, 0,  12, 0, $63
+	anim_wait 2
+	anim_loop 3, .loop
+	anim_bgeffect ANIM_BG_WHITE_HUES, $0, $8, $0
+	anim_wait 32
+	anim_obj ANIM_OBJ_ICE_BUILDUP, -15, 0,   9, 2, $10
+	anim_wait 128
+	anim_sound 0, 1, SFX_SHINE
+	anim_wait 8
+	anim_sound 0, 1, SFX_SHINE
+	anim_wait 24
+	anim_ret
+; c991e
+
+BattleAnim_Bubble: ; c991e
+	anim_1gfx ANIM_GFX_BUBBLE
+	anim_sound 32, 2, SFX_WATER_GUN
+	anim_obj ANIM_OBJ_BUBBLE,   8, 0,  11, 4, $c1
+	anim_wait 6
+	anim_sound 32, 2, SFX_WATER_GUN
+	anim_obj ANIM_OBJ_BUBBLE,   8, 0,  11, 4, $e1
+	anim_wait 6
+	anim_sound 32, 2, SFX_WATER_GUN
+	anim_obj ANIM_OBJ_BUBBLE,   8, 0,  11, 4, $d1
+	anim_wait 128
+	anim_wait 32
+	anim_ret
+; c993d
+
+BattleAnim_Bubblebeam: ; c993d
+	anim_1gfx ANIM_GFX_BUBBLE
+.loop
+	anim_sound 16, 2, SFX_BUBBLEBEAM
+	anim_obj ANIM_OBJ_BUBBLE,   8, 0,  11, 4, $92
+	anim_wait 6
+	anim_sound 16, 2, SFX_BUBBLEBEAM
+	anim_obj ANIM_OBJ_BUBBLE,   8, 0,  11, 4, $b3
+	anim_wait 6
+	anim_sound 16, 2, SFX_BUBBLEBEAM
+	anim_obj ANIM_OBJ_BUBBLE,   8, 0,  11, 4, $f4
+	anim_wait 8
+	anim_loop 3, .loop
+	anim_wait 64
+	anim_clearobjs
+	anim_bgeffect ANIM_BG_30, $0, $0, $0
+	anim_wait 1
+	anim_call BattleAnim_FollowPlayerHead_1
+	anim_bgeffect ANIM_BG_31, $1c, $0, $0
+	anim_wait 19
+	anim_call BattleAnim_ShowMon_1
+	anim_bgeffect ANIM_BG_32, $0, $0, $0
+	anim_wait 8
+	anim_ret
+; c9979
+
+BattleAnim_WaterGun: ; c9979
+	anim_bgeffect ANIM_BG_30, $0, $0, $0
+	anim_1gfx ANIM_GFX_WATER
+	anim_call BattleAnim_FollowPlayerHead_1
+	anim_sound 16, 2, SFX_WATER_GUN
+	anim_obj ANIM_OBJ_24,   8, 0,  11, 0, $0
+	anim_wait 8
+	anim_obj ANIM_OBJ_24,   8, 0,   9, 4, $0
+	anim_wait 8
+	anim_obj ANIM_OBJ_24,   8, 0,  10, 2, $0
+	anim_wait 24
+	anim_bgeffect ANIM_BG_31, $1c, $0, $0
+	anim_wait 8
+	anim_bgeffect ANIM_BG_31, $8, $0, $0
+	anim_wait 8
+	anim_bgeffect ANIM_BG_31, $30, $0, $0
+	anim_wait 32
+	anim_call BattleAnim_ShowMon_1
+	anim_bgeffect ANIM_BG_32, $0, $0, $0
+	anim_wait 16
+	anim_ret
+; c99b4
+
+BattleAnim_HydroPump: ; c99b4
+	anim_bgeffect ANIM_BG_30, $0, $0, $0
+	anim_1gfx ANIM_GFX_WATER
+	anim_call BattleAnim_FollowPlayerHead_1
+	anim_sound 0, 1, SFX_HYDRO_PUMP
+	anim_obj ANIM_OBJ_25,  13, 4,   9, 0, $0
+	anim_bgeffect ANIM_BG_31, $1c, $0, $0
+	anim_wait 8
+	anim_sound 0, 1, SFX_HYDRO_PUMP
+	anim_obj ANIM_OBJ_25,  14, 4,   9, 0, $0
+	anim_bgeffect ANIM_BG_31, $8, $0, $0
+	anim_wait 8
+	anim_sound 0, 1, SFX_HYDRO_PUMP
+	anim_obj ANIM_OBJ_25,  15, 4,   9, 0, $0
+	anim_bgeffect ANIM_BG_31, $30, $0, $0
+	anim_wait 8
+	anim_sound 0, 1, SFX_HYDRO_PUMP
+	anim_obj ANIM_OBJ_25, -16, 4,   9, 0, $0
+	anim_bgeffect ANIM_BG_31, $1c, $0, $0
+	anim_wait 8
+	anim_sound 0, 1, SFX_HYDRO_PUMP
+	anim_obj ANIM_OBJ_25, -15, 4,   9, 0, $0
+	anim_bgeffect ANIM_BG_31, $8, $0, $0
+	anim_wait 8
+	anim_sound 0, 1, SFX_HYDRO_PUMP
+	anim_obj ANIM_OBJ_25, -14, 4,   9, 0, $0
+	anim_bgeffect ANIM_BG_31, $30, $0, $0
+	anim_wait 8
+	anim_sound 0, 1, SFX_HYDRO_PUMP
+	anim_obj ANIM_OBJ_25, -13, 4,   9, 0, $0
+	anim_bgeffect ANIM_BG_31, $1c, $0, $0
+	anim_wait 32
+	anim_call BattleAnim_ShowMon_1
+	anim_bgeffect ANIM_BG_32, $0, $0, $0
+	anim_wait 16
+	anim_ret
+; c9a2a
+
+BattleAnim_Surf: ; c9a2a
+	anim_1gfx ANIM_GFX_BUBBLE
+	anim_bgeffect ANIM_BG_SURF, $0, $0, $0
+	anim_obj ANIM_OBJ_22,  11, 0,  13, 0, $8
+.loop
+	anim_sound 0, 1, SFX_SURF
+	anim_wait 32
+	anim_loop 4, .loop
+	anim_incobj  1
+	anim_wait 56
+	anim_ret
+; c9a42
+
+BattleAnim_VineWhip: ; c9a42
+	anim_1gfx ANIM_GFX_WHIP
+	anim_sound 0, 1, SFX_VINE_WHIP
+	anim_obj ANIM_OBJ_40,  14, 4,   6, 4, $80
+	anim_wait 4
+	anim_sound 0, 1, SFX_VINE_WHIP
+	anim_obj ANIM_OBJ_3F,  16, 0,   7, 4, $0
+	anim_wait 4
+	anim_incobj  1
+	anim_wait 4
+	anim_ret
+; c9a5a
+
+BattleAnim_LeechSeed: ; c9a5a
+	anim_1gfx ANIM_GFX_PLANT
+	anim_sound 16, 2, SFX_VINE_WHIP
+	anim_obj ANIM_OBJ_LEECH_SEED,   6, 0,  10, 0, $20
+	anim_wait 8
+	anim_sound 16, 2, SFX_VINE_WHIP
+	anim_obj ANIM_OBJ_LEECH_SEED,   6, 0,  10, 0, $30
+	anim_wait 8
+	anim_sound 16, 2, SFX_VINE_WHIP
+	anim_obj ANIM_OBJ_LEECH_SEED,   6, 0,  10, 0, $28
+	anim_wait 32
+	anim_sound 0, 1, SFX_CHARGE
+	anim_wait 128
+	anim_ret
+; c9a7c
+
+BattleAnim_RazorLeaf: ; c9a7c
+	anim_1gfx ANIM_GFX_PLANT
+	anim_sound 0, 0, SFX_VINE_WHIP
+	anim_obj ANIM_OBJ_RAZOR_LEAF,   6, 0,  10, 0, $28
+	anim_obj ANIM_OBJ_RAZOR_LEAF,   6, 0,  10, 0, $5c
+	anim_obj ANIM_OBJ_RAZOR_LEAF,   6, 0,  10, 0, $10
+	anim_obj ANIM_OBJ_RAZOR_LEAF,   6, 0,  10, 0, $e8
+	anim_obj ANIM_OBJ_RAZOR_LEAF,   6, 0,  10, 0, $9c
+	anim_obj ANIM_OBJ_RAZOR_LEAF,   6, 0,  10, 0, $d0
+	anim_wait 6
+	anim_obj ANIM_OBJ_RAZOR_LEAF,   6, 0,  10, 0, $1c
+	anim_obj ANIM_OBJ_RAZOR_LEAF,   6, 0,  10, 0, $50
+	anim_obj ANIM_OBJ_RAZOR_LEAF,   6, 0,  10, 0, $dc
+	anim_obj ANIM_OBJ_RAZOR_LEAF,   6, 0,  10, 0, $90
+	anim_wait 80
+	anim_sound 16, 2, SFX_VINE_WHIP
+	anim_incobj  3
+	anim_wait 2
+	anim_sound 16, 2, SFX_VINE_WHIP
+	anim_incobj  5
+	anim_wait 2
+	anim_sound 16, 2, SFX_VINE_WHIP
+	anim_incobj  7
+	anim_wait 2
+	anim_sound 16, 2, SFX_VINE_WHIP
+	anim_incobj  9
+	anim_wait 2
+	anim_sound 16, 2, SFX_VINE_WHIP
+	anim_incobj  1
+	anim_wait 2
+	anim_sound 16, 2, SFX_VINE_WHIP
+	anim_incobj  2
+	anim_wait 2
+	anim_sound 16, 2, SFX_VINE_WHIP
+	anim_incobj  4
+	anim_wait 2
+	anim_sound 16, 2, SFX_VINE_WHIP
+	anim_incobj  6
+	anim_wait 2
+	anim_sound 16, 2, SFX_VINE_WHIP
+	anim_incobj  8
+	anim_wait 2
+	anim_sound 16, 2, SFX_VINE_WHIP
+	anim_incobj 10
+	anim_wait 64
+	anim_ret
+; c9af2
+
+BattleAnim_Solarbeam: ; c9af2
+	anim_if_param_equal $0, .FireSolarBeam
+	; charge turn
+	anim_1gfx ANIM_GFX_CHARGE
+	anim_sound 0, 0, SFX_CHARGE
+	anim_obj ANIM_OBJ_3D,   6, 0,  10, 4, $0
+	anim_obj ANIM_OBJ_3C,   6, 0,  10, 4, $0
+	anim_obj ANIM_OBJ_3C,   6, 0,  10, 4, $8
+	anim_obj ANIM_OBJ_3C,   6, 0,  10, 4, $10
+	anim_obj ANIM_OBJ_3C,   6, 0,  10, 4, $18
+	anim_obj ANIM_OBJ_3C,   6, 0,  10, 4, $20
+	anim_obj ANIM_OBJ_3C,   6, 0,  10, 4, $28
+	anim_obj ANIM_OBJ_3C,   6, 0,  10, 4, $30
+	anim_obj ANIM_OBJ_3C,   6, 0,  10, 4, $38
+	anim_wait 104
+	anim_bgeffect ANIM_BG_FLASH_WHITE, $0, $4, $2
+	anim_wait 64
+	anim_ret
+; c9b30
+
+.FireSolarBeam
+	anim_1gfx ANIM_GFX_BEAM
+	anim_bgeffect ANIM_BG_06, $0, $2, $0
+	anim_call BattleAnim_Solarbeam_branch_cbb39
+	anim_wait 48
+	anim_ret
+; c9b3c
+
+BattleAnim_Thunderpunch: ; c9b3c
+	anim_2gfx ANIM_GFX_HIT, ANIM_GFX_LIGHTNING
+	anim_obj ANIM_OBJ_0A, -15, 0,   7, 0, $43
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $2
+	anim_sound 0, 1, SFX_THUNDER
+	anim_obj ANIM_OBJ_2F, -13, 0,   8, 4, $0
+	anim_wait 64
+	anim_ret
+; c9b53
+
+BattleAnim_Thundershock: ; c9b53
+	anim_2gfx ANIM_GFX_LIGHTNING, ANIM_GFX_EXPLOSION
+	anim_obj ANIM_OBJ_34, -15, 0,   7, 0, $2
+	anim_wait 16
+	anim_sound 0, 1, SFX_THUNDERSHOCK
+	anim_obj ANIM_OBJ_33, -15, 0,   7, 0, $0
+	anim_wait 96
+	anim_ret
+; c9b66
+
+BattleAnim_Thunderbolt: ; c9b66
+	anim_2gfx ANIM_GFX_LIGHTNING, ANIM_GFX_EXPLOSION
+	anim_obj ANIM_OBJ_LIGHTNING_BOLT, -15, 0,   7, 0, $2
+	anim_wait 16
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $4, $2
+	anim_sound 0, 1, SFX_THUNDERSHOCK
+	anim_obj ANIM_OBJ_31, -15, 0,   7, 0, $0
+	anim_wait 64
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $4, $2
+	anim_wait 64
+	anim_ret
+; c9b84
+
+BattleAnim_ThunderWave: ; c9b84
+	anim_1gfx ANIM_GFX_LIGHTNING
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $4, $3
+	anim_sound 0, 1, SFX_THUNDERSHOCK
+	anim_obj ANIM_OBJ_30, -15, 0,   7, 0, $0
+	anim_wait 20
+	anim_bgp $1b
+	anim_incobj  1
+	anim_wait 96
+	anim_ret
+; c9b9a
+
+BattleAnim_Thunder: ; c9b9a
+	anim_1gfx ANIM_GFX_LIGHTNING
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $6, $20
+	anim_sound 0, 1, SFX_THUNDER
+	anim_obj ANIM_OBJ_2E,  15, 0,   8, 4, $0
+	anim_wait 16
+	anim_sound 0, 1, SFX_THUNDER
+	anim_obj ANIM_OBJ_2F, -13, 0,   8, 4, $0
+	anim_wait 16
+	anim_sound 0, 1, SFX_THUNDER
+	anim_obj ANIM_OBJ_2D, -15, 0,   8, 4, $0
+	anim_wait 48
+	anim_ret
+; c9bbd
+
+BattleAnim_RazorWind: ; c9bbd
+	anim_if_param_equal $1, BattleAnim_RazorWind_branch_c9fb5
+	anim_1gfx ANIM_GFX_WHIP
+	anim_bgeffect ANIM_BG_06, $0, $1, $0
+.loop
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $4, $2
+	anim_sound 0, 1, SFX_RAZOR_WIND
+	anim_obj ANIM_OBJ_42, -13, 0,   5, 0, $3
+	anim_wait 4
+	anim_sound 0, 1, SFX_RAZOR_WIND
+	anim_obj ANIM_OBJ_42, -15, 0,   7, 0, $3
+	anim_wait 4
+	anim_sound 0, 1, SFX_RAZOR_WIND
+	anim_obj ANIM_OBJ_42, -13, 0,   8, 0, $3
+	anim_wait 4
+	anim_sound 0, 1, SFX_RAZOR_WIND
+	anim_obj ANIM_OBJ_41,  15, 0,   5, 0, $83
+	anim_wait 4
+	anim_sound 0, 1, SFX_RAZOR_WIND
+	anim_obj ANIM_OBJ_41,  15, 0,   8, 0, $83
+	anim_wait 4
+	anim_loop 3, .loop
+	anim_wait 24
+	anim_ret
+; c9c00
+
+BattleAnim_Sonicboom_JP: ; c9c00
+	anim_2gfx ANIM_GFX_WHIP, ANIM_GFX_HIT
+.loop
+	anim_sound 3, 0, SFX_RAZOR_WIND
+	anim_obj ANIM_OBJ_43,   8, 0,  10, 0, $3
+	anim_wait 8
+	anim_sound 3, 0, SFX_RAZOR_WIND
+	anim_obj ANIM_OBJ_43,   8, 0,  11, 0, $2
+	anim_wait 8
+	anim_sound 3, 0, SFX_RAZOR_WIND
+	anim_obj ANIM_OBJ_43,   8, 0,  12, 0, $4
+	anim_wait 8
+	anim_loop 2, .loop
+	anim_wait 32
+	anim_incobj  1
+	anim_incobj  2
+	anim_incobj  3
+	anim_incobj  4
+	anim_incobj  5
+	anim_incobj  6
+	anim_obj ANIM_OBJ_01, -15, 0,   7, 0, $0
+	anim_wait 16
+	anim_ret
+; c9c36
+
+BattleAnim_Gust: ; c9c36
+BattleAnim_Sonicboom: ; c9c36
+	anim_2gfx ANIM_GFX_WIND, ANIM_GFX_HIT
+.loop
+	anim_sound 0, 1, SFX_RAZOR_WIND
+	anim_obj ANIM_OBJ_GUST, -15, 0,   9, 0, $0
+	anim_wait 6
+	anim_loop 9, .loop
+	anim_obj ANIM_OBJ_01, -14, 0,   8, 0, $18
+	anim_wait 8
+	anim_obj ANIM_OBJ_01,  16, 0,   4, 0, $18
+	anim_wait 16
+	anim_ret
+; c9c53
+
+BattleAnim_Selfdestruct: ; c9c53
+	anim_1gfx ANIM_GFX_EXPLOSION
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $24
+	anim_if_param_equal $1, .loop
+	anim_call BattleAnim_Selfdestruct_branch_cbb8f
+	anim_wait 16
+	anim_ret
+; c9c63
+
+.loop
+	anim_call BattleAnim_Selfdestruct_branch_cbb62
+	anim_wait 5
+	anim_bgeffect ANIM_BG_HIDE_MON, $0, $1, $0
+	anim_loop 2, .loop
+	anim_wait 16
+	anim_ret
+; c9c72
+
+BattleAnim_Explosion: ; c9c72
+	anim_1gfx ANIM_GFX_EXPLOSION
+	anim_bgeffect ANIM_BG_1F, $60, $4, $10
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $24
+	anim_if_param_equal $1, .loop
+	anim_call BattleAnim_Explosion_branch_cbb8f
+	anim_wait 16
+	anim_ret
+; c9c87
+
+.loop
+	anim_call BattleAnim_Explosion_branch_cbb62
+	anim_wait 5
+	anim_bgeffect ANIM_BG_HIDE_MON, $0, $1, $0
+	anim_loop 2, .loop
+	anim_wait 16
+	anim_ret
+; c9c96
+
+BattleAnim_Acid: ; c9c96
+	anim_1gfx ANIM_GFX_POISON
+	anim_call BattleAnim_Acid_branch_cbc35
+	anim_wait 64
+	anim_ret
+; c9c9d
+
+BattleAnim_RockThrow: ; c9c9d
+	anim_1gfx ANIM_GFX_ROCKS
+	anim_bgeffect ANIM_BG_1F, $60, $1, $0
+	anim_sound 0, 1, SFX_STRENGTH
+	anim_obj ANIM_OBJ_1E,  16, 0,   8, 0, $40
+	anim_wait 2
+	anim_sound 0, 1, SFX_STRENGTH
+	anim_obj ANIM_OBJ_1D,  15, 0,   8, 4, $30
+	anim_wait 2
+	anim_sound 0, 1, SFX_STRENGTH
+	anim_obj ANIM_OBJ_1E, -13, 0,   8, 4, $30
+	anim_wait 2
+	anim_sound 0, 1, SFX_STRENGTH
+	anim_obj ANIM_OBJ_1D, -14, 0,   8, 0, $40
+	anim_wait 2
+	anim_sound 0, 1, SFX_STRENGTH
+	anim_obj ANIM_OBJ_1E, -15, 0,   8, 4, $30
+	anim_wait 96
+	anim_ret
+; c9cd2
+
+BattleAnim_RockSlide: ; c9cd2
+	anim_1gfx ANIM_GFX_ROCKS
+	anim_bgeffect ANIM_BG_1F, $c0, $1, $0
+.loop
+	anim_sound 0, 1, SFX_STRENGTH
+	anim_obj ANIM_OBJ_1E,  16, 0,   8, 0, $40
+	anim_wait 4
+	anim_sound 0, 1, SFX_STRENGTH
+	anim_obj ANIM_OBJ_1D,  15, 0,   8, 4, $30
+	anim_wait 4
+	anim_sound 0, 1, SFX_STRENGTH
+	anim_obj ANIM_OBJ_1E, -13, 0,   8, 4, $30
+	anim_wait 4
+	anim_sound 0, 1, SFX_STRENGTH
+	anim_obj ANIM_OBJ_1D, -14, 0,   8, 0, $40
+	anim_wait 4
+	anim_sound 0, 1, SFX_STRENGTH
+	anim_obj ANIM_OBJ_1E, -15, 0,   8, 4, $30
+	anim_wait 16
+	anim_loop 4, .loop
+	anim_wait 96
+	anim_ret
+; c9d0c
+
+BattleAnim_Sing: ; c9d0c
+	anim_1gfx ANIM_GFX_NOISE
+	anim_sound 16, 2, SFX_SING
+.loop
+	anim_obj ANIM_OBJ_23,   8, 0,  11, 4, $0
+	anim_wait 8
+	anim_obj ANIM_OBJ_23,   8, 0,  11, 4, $1
+	anim_wait 8
+	anim_obj ANIM_OBJ_23,   8, 0,  11, 4, $2
+	anim_wait 8
+	anim_obj ANIM_OBJ_23,   8, 0,  11, 4, $0
+	anim_wait 8
+	anim_obj ANIM_OBJ_23,   8, 0,  11, 4, $2
+	anim_wait 8
+	anim_loop 4, .loop
+	anim_wait 64
+	anim_ret
+; c9d35
+
+BattleAnim_Poisonpowder: ; c9d35
+BattleAnim_SleepPowder: ; c9d35
+BattleAnim_Spore: ; c9d35
+BattleAnim_StunSpore: ; c9d35
+	anim_1gfx ANIM_GFX_POWDER
+.loop
+	anim_sound 0, 1, SFX_POWDER
+	anim_obj ANIM_OBJ_26,  13, 0,   2, 0, $0
+	anim_wait 4
+	anim_sound 0, 1, SFX_POWDER
+	anim_obj ANIM_OBJ_26, -15, 0,   2, 0, $0
+	anim_wait 4
+	anim_sound 0, 1, SFX_POWDER
+	anim_obj ANIM_OBJ_26,  14, 0,   2, 0, $0
+	anim_wait 4
+	anim_sound 0, 1, SFX_POWDER
+	anim_obj ANIM_OBJ_26,  16, 0,   2, 0, $0
+	anim_wait 4
+	anim_sound 0, 1, SFX_POWDER
+	anim_obj ANIM_OBJ_26,  15, 0,   2, 0, $0
+	anim_wait 4
+	anim_loop 2, .loop
+	anim_wait 96
+	anim_ret
+; c9d6a
+
+BattleAnim_HyperBeam: ; c9d6a
+	anim_1gfx ANIM_GFX_BEAM
+	anim_bgeffect ANIM_BG_1F, $30, $4, $10
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $40
+	anim_bgeffect ANIM_BG_06, $0, $2, $0
+	anim_call BattleAnim_HyperBeam_branch_cbb39
+	anim_wait 48
+	anim_ret
+; c9d80
+
+BattleAnim_AuroraBeam: ; c9d80
+	anim_1gfx ANIM_GFX_BEAM
+	anim_bgeffect ANIM_BG_06, $0, $2, $0
+	anim_bgeffect ANIM_BG_ALTERNATE_HUES, $0, $2, $0
+	anim_wait 64
+	anim_call BattleAnim_AuroraBeam_branch_cbb39
+	anim_wait 48
+	anim_incobj  5
+	anim_wait 64
+	anim_ret
+; c9d95
+
+BattleAnim_Vicegrip: ; c9d95
+	anim_1gfx ANIM_GFX_CUT
+	anim_sound 0, 1, SFX_VICEGRIP
+	anim_obj ANIM_OBJ_37, -13, 0,   5, 0, $0
+	anim_obj ANIM_OBJ_39,  15, 0,   9, 0, $0
+	anim_wait 32
+	anim_ret
+; c9da6
+
+BattleAnim_Scratch: ; c9da6
+	anim_1gfx ANIM_GFX_CUT
+	anim_sound 0, 1, SFX_SCRATCH
+	anim_obj ANIM_OBJ_37, -14, 0,   6, 0, $0
+	anim_obj ANIM_OBJ_37, -15, 4,   5, 4, $0
+	anim_obj ANIM_OBJ_37, -15, 0,   5, 0, $0
+	anim_wait 32
+	anim_ret
+; c9dbc
+
+BattleAnim_FurySwipes: ; c9dbc
+	anim_1gfx ANIM_GFX_CUT
+	anim_if_param_equal $1, BattleAnim_FurySwipes_branch_c9dd9
+	anim_sound 0, 1, SFX_SCRATCH
+	anim_obj ANIM_OBJ_37, -14, 0,   6, 0, $0
+	anim_obj ANIM_OBJ_37, -15, 4,   5, 4, $0
+	anim_obj ANIM_OBJ_37, -15, 0,   5, 0, $0
+	anim_sound 0, 1, SFX_SCRATCH
+	anim_wait 32
+	anim_ret
+; c9dd9
+
+BattleAnim_FurySwipes_branch_c9dd9: ; c9dd9
+	anim_sound 0, 1, SFX_SCRATCH
+	anim_obj ANIM_OBJ_38,  15, 0,   6, 0, $0
+	anim_obj ANIM_OBJ_38,  15, 4,   5, 4, $0
+	anim_obj ANIM_OBJ_38,  16, 0,   5, 0, $0
+	anim_sound 0, 1, SFX_SCRATCH
+	anim_wait 32
+	anim_ret
+; c9df0
+
+BattleAnim_Cut: ; c9df0
+	anim_1gfx ANIM_GFX_CUT
+	anim_sound 0, 1, SFX_CUT
+	anim_obj ANIM_OBJ_3A, -13, 0,   5, 0, $0
+	anim_wait 32
+	anim_ret
+; c9dfc
+
+BattleAnim_Slash: ; c9dfc
+	anim_1gfx ANIM_GFX_CUT
+	anim_sound 0, 1, SFX_CUT
+	anim_obj ANIM_OBJ_3A, -13, 0,   5, 0, $0
+	anim_obj ANIM_OBJ_3A, -14, 4,   4, 4, $0
+	anim_wait 32
+	anim_ret
+; c9e0d
+
+BattleAnim_Clamp: ; c9e0d
+	anim_2gfx ANIM_GFX_CUT, ANIM_GFX_HIT
+	anim_obj ANIM_OBJ_35, -15, 0,   7, 0, $a0
+	anim_obj ANIM_OBJ_35, -15, 0,   7, 0, $20
+	anim_wait 16
+	anim_sound 0, 1, SFX_BITE
+	anim_obj ANIM_OBJ_01, -14, 0,   6, 0, $18
+	anim_wait 32
+	anim_sound 0, 1, SFX_BITE
+	anim_obj ANIM_OBJ_01,  16, 0,   8, 0, $18
+	anim_wait 16
+	anim_ret
+; c9e2e
+
+BattleAnim_Bite: ; c9e2e
+	anim_2gfx ANIM_GFX_CUT, ANIM_GFX_HIT
+	anim_obj ANIM_OBJ_36, -15, 0,   7, 0, $98
+	anim_obj ANIM_OBJ_36, -15, 0,   7, 0, $18
+	anim_wait 8
+	anim_sound 0, 1, SFX_BITE
+	anim_obj ANIM_OBJ_01, -14, 0,   6, 0, $18
+	anim_wait 16
+	anim_sound 0, 1, SFX_BITE
+	anim_obj ANIM_OBJ_01,  16, 0,   8, 0, $18
+	anim_wait 8
+	anim_ret
+; c9e4f
+
+BattleAnim_Teleport: ; c9e4f
+	anim_1gfx ANIM_GFX_SPEED
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_bgeffect ANIM_BG_TELEPORT, $0, $1, $0
+	anim_wait 32
+	anim_bgeffect ANIM_BG_HIDE_MON, $0, $1, $0
+	anim_wait 3
+	anim_incbgeffect ANIM_BG_TELEPORT
+	anim_call BattleAnim_ShowMon_0
+	anim_bgeffect ANIM_BG_06, $0, $1, $0
+	anim_call BattleAnim_Teleport_branch_cbb12
+	anim_wait 64
+	anim_ret
+; c9e6f
+
+BattleAnim_Fly: ; c9e6f
+	anim_if_param_equal $1, BattleAnim_Fly_branch_c9e89
+	anim_if_param_equal $2, BattleAnim_Fly_branch_c9e82
+	anim_1gfx ANIM_GFX_HIT
+	anim_sound 0, 1, SFX_WING_ATTACK
+	anim_obj ANIM_OBJ_01, -15, 0,   7, 0, $0
+	anim_wait 32
+BattleAnim_Fly_branch_c9e82: ; c9e82
+	anim_bgeffect ANIM_BG_SHOW_MON, $0, $1, $0
+	anim_wait 32
+	anim_ret
+; c9e89
+
+BattleAnim_Fly_branch_c9e89: ; c9e89
+	anim_1gfx ANIM_GFX_SPEED
+	anim_bgeffect ANIM_BG_06, $0, $1, $0
+	anim_bgeffect ANIM_BG_HIDE_MON, $0, $1, $0
+	anim_call BattleAnim_Fly_branch_cbb12
+	anim_wait 64
+	anim_ret
+; c9e9a
+
+BattleAnim_DoubleTeam: ; c9e9a
+	anim_call BattleAnim_FollowPlayerHead_0
+	anim_sound 0, 0, SFX_PSYBEAM
+	anim_bgeffect ANIM_BG_DOUBLE_TEAM, $0, $1, $0
+	anim_wait 96
+	anim_incbgeffect ANIM_BG_DOUBLE_TEAM
+	anim_wait 24
+	anim_incbgeffect ANIM_BG_DOUBLE_TEAM
+	anim_call BattleAnim_ShowMon_0
+	anim_ret
+; c9eaf
+
+BattleAnim_Recover: ; c9eaf
+	anim_1gfx ANIM_GFX_BUBBLE
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_sound 0, 0, SFX_FULL_HEAL
+	anim_bgeffect ANIM_BG_18, $0, $1, $40
+	anim_obj ANIM_OBJ_2C,   5, 4,  11, 0, $30
+	anim_obj ANIM_OBJ_2C,   5, 4,  11, 0, $31
+	anim_obj ANIM_OBJ_2C,   5, 4,  11, 0, $32
+	anim_obj ANIM_OBJ_2C,   5, 4,  11, 0, $33
+	anim_obj ANIM_OBJ_2C,   5, 4,  11, 0, $34
+	anim_obj ANIM_OBJ_2C,   5, 4,  11, 0, $35
+	anim_obj ANIM_OBJ_2C,   5, 4,  11, 0, $36
+	anim_obj ANIM_OBJ_2C,   5, 4,  11, 0, $37
+	anim_wait 64
+	anim_incbgeffect ANIM_BG_18
+	anim_call BattleAnim_ShowMon_0
+	anim_ret
+; c9eeb
+
+BattleAnim_Absorb: ; c9eeb
+	anim_1gfx ANIM_GFX_CHARGE
+	anim_obj ANIM_OBJ_3D,   5, 4,  11, 0, $0
+.loop
+	anim_sound 6, 3, SFX_WATER_GUN
+	anim_obj ANIM_OBJ_ABSORB,  16, 0,   6, 0, $2
+	anim_wait 6
+	anim_sound 6, 3, SFX_WATER_GUN
+	anim_obj ANIM_OBJ_ABSORB, -15, 0,   8, 0, $3
+	anim_wait 6
+	anim_sound 6, 3, SFX_WATER_GUN
+	anim_obj ANIM_OBJ_ABSORB, -15, 0,   4, 0, $4
+	anim_wait 6
+	anim_loop 5, .loop
+	anim_wait 32
+	anim_ret
+; c9f13
+
+BattleAnim_MegaDrain: ; c9f13
+	anim_1gfx ANIM_GFX_CHARGE
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_bgeffect ANIM_BG_1C, $0, $0, $10
+	anim_setvar $0
+.loop
+	anim_sound 6, 3, SFX_WATER_GUN
+	anim_obj ANIM_OBJ_ABSORB,  16, 0,   6, 0, $2
+	anim_wait 6
+	anim_sound 6, 3, SFX_WATER_GUN
+	anim_obj ANIM_OBJ_ABSORB, -15, 0,   8, 0, $3
+	anim_wait 6
+	anim_sound 6, 3, SFX_WATER_GUN
+	anim_obj ANIM_OBJ_ABSORB, -15, 0,   4, 0, $4
+	anim_wait 6
+	anim_incvar
+	anim_if_var_equal $7, .done
+	anim_if_var_equal $2, .spawn
+	anim_jump .loop
+; c9f46
+
+.spawn
+	anim_obj ANIM_OBJ_3D,   5, 4,  11, 0, $0
+	anim_jump .loop
+; c9f4e
+
+.done
+	anim_wait 32
+	anim_incbgeffect ANIM_BG_1C
+	anim_call BattleAnim_ShowMon_0
+	anim_ret
+; c9f55
+
+BattleAnim_EggBomb: ; c9f55
+	anim_2gfx ANIM_GFX_EGG, ANIM_GFX_EXPLOSION
+	anim_sound 0, 0, SFX_SWITCH_POKEMON
+	anim_obj ANIM_OBJ_46,   5, 4,  13, 0, $1
+	anim_wait 128
+	anim_wait 96
+	anim_incobj  1
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $3
+	anim_sound 0, 1, SFX_EGG_BOMB
+	anim_obj ANIM_OBJ_18,  16, 0,   8, 0, $0
+	anim_wait 8
+	anim_sound 0, 1, SFX_EGG_BOMB
+	anim_obj ANIM_OBJ_18, -14, 0,   8, 4, $0
+	anim_wait 8
+	anim_sound 0, 1, SFX_EGG_BOMB
+	anim_obj ANIM_OBJ_18, -15, 0,   9, 0, $0
+	anim_wait 24
+	anim_ret
+; c9f85
+
+BattleAnim_Softboiled: ; c9f85
+	anim_2gfx ANIM_GFX_EGG, ANIM_GFX_BUBBLE
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_sound 0, 0, SFX_SWITCH_POKEMON
+	anim_obj ANIM_OBJ_46,   5, 4,  13, 0, $6
+	anim_wait 128
+	anim_incobj  2
+	anim_obj ANIM_OBJ_46,   9, 4,  13, 0, $b
+	anim_wait 16
+	anim_bgeffect ANIM_BG_18, $0, $1, $40
+	anim_sound 0, 0, SFX_METRONOME
+.loop
+	anim_obj ANIM_OBJ_2C,   5, 4,  11, 0, $20
+	anim_wait 8
+	anim_loop 8, .loop
+	anim_wait 128
+	anim_incbgeffect ANIM_BG_18
+	anim_call BattleAnim_ShowMon_0
+	anim_ret
+; c9fb5
+
+BattleAnim_FocusEnergy: ; c9fb5
+BattleAnim_RazorWind_branch_c9fb5: ; c9fb5
+BattleAnim_SkullBash_branch_c9fb5: ; c9fb5
+BattleAnim_SkyAttack_branch_c9fb5: ; c9fb5
+	anim_1gfx ANIM_GFX_SPEED
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_bgeffect ANIM_BG_16, $0, $1, $40
+	anim_bgeffect ANIM_BG_06, $0, $2, $0
+.loop
+	anim_sound 0, 0, SFX_SWORDS_DANCE
+	anim_obj ANIM_OBJ_47,   5, 4,  13, 4, $6
+	anim_wait 2
+	anim_obj ANIM_OBJ_47,   4, 4,  13, 4, $6
+	anim_wait 2
+	anim_obj ANIM_OBJ_47,   6, 4,  13, 4, $8
+	anim_wait 2
+	anim_obj ANIM_OBJ_47,   3, 4,  13, 4, $8
+	anim_wait 2
+	anim_obj ANIM_OBJ_47,   7, 4,  13, 4, $6
+	anim_wait 2
+	anim_obj ANIM_OBJ_47,   2, 4,  13, 4, $8
+	anim_wait 2
+	anim_obj ANIM_OBJ_47,   8, 4,  13, 4, $8
+	anim_wait 2
+	anim_loop 3, .loop
+	anim_wait 8
+	anim_incbgeffect ANIM_BG_16
+	anim_call BattleAnim_ShowMon_0
+	anim_ret
+; c9ffc
+
+BattleAnim_Bide: ; c9ffc
+	anim_if_param_equal $0, BattleAnim_Bide_branch_c9651
+	anim_1gfx ANIM_GFX_HIT
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_sound 0, 0, SFX_ESCAPE_ROPE
+	anim_bgeffect ANIM_BG_1A, $0, $1, $20
+	anim_wait 72
+	anim_incbgeffect ANIM_BG_1A
+	anim_call BattleAnim_ShowMon_0
+	anim_ret
+; ca014
+
+BattleAnim_Bind: ; ca014
+	anim_1gfx ANIM_GFX_ROPE
+	anim_sound 0, 1, SFX_BIND
+	anim_obj ANIM_OBJ_48, -16, 4,   8, 0, $0
+	anim_wait 8
+	anim_obj ANIM_OBJ_49, -16, 4,   7, 0, $0
+	anim_wait 8
+	anim_obj ANIM_OBJ_48, -16, 4,   6, 0, $0
+	anim_wait 64
+	anim_sound 0, 1, SFX_BIND
+	anim_incobj  1
+	anim_incobj  2
+	anim_incobj  3
+	anim_wait 96
+	anim_ret
+; ca036
+
+BattleAnim_Wrap: ; ca036
+	anim_1gfx ANIM_GFX_ROPE
+	anim_sound 0, 1, SFX_BIND
+	anim_obj ANIM_OBJ_48, -16, 4,   8, 0, $0
+	anim_wait 8
+	anim_obj ANIM_OBJ_48, -16, 4,   7, 0, $0
+	anim_wait 8
+	anim_obj ANIM_OBJ_48, -16, 4,   6, 0, $0
+	anim_wait 64
+	anim_sound 0, 1, SFX_BIND
+	anim_incobj  1
+	anim_incobj  2
+	anim_incobj  3
+	anim_wait 96
+	anim_ret
+; ca058
+
+BattleAnim_Confusion: ; ca058
+	anim_1gfx ANIM_GFX_HIT
+	anim_call BattleAnim_FollowPlayerHead_1
+	anim_sound 0, 1, SFX_PSYCHIC
+	anim_bgeffect ANIM_BG_NIGHT_SHADE, $0, $0, $8
+	anim_wait 128
+	anim_incbgeffect ANIM_BG_NIGHT_SHADE
+	anim_call BattleAnim_ShowMon_1
+	anim_ret
+; ca06c
+
+BattleAnim_Constrict: ; ca06c
+	anim_1gfx ANIM_GFX_ROPE
+	anim_sound 0, 1, SFX_BIND
+	anim_obj ANIM_OBJ_49, -16, 4,   8, 0, $0
+	anim_wait 8
+	anim_obj ANIM_OBJ_48, -16, 4,   6, 0, $0
+	anim_wait 8
+	anim_obj ANIM_OBJ_49, -16, 4,   5, 0, $0
+	anim_wait 8
+	anim_obj ANIM_OBJ_48, -16, 4,   7, 0, $0
+	anim_wait 64
+	anim_ret
+; ca08a
+
+BattleAnim_Earthquake: ; ca08a
+	anim_bgeffect ANIM_BG_1F, $60, $4, $10
+.loop
+	anim_sound 0, 1, SFX_EMBER
+	anim_wait 24
+	anim_loop 4, .loop
+	anim_ret
+; ca098
+
+BattleAnim_Fissure: ; ca098
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $40
+	anim_bgeffect ANIM_BG_1F, $60, $4, $0
+.loop
+	anim_sound 0, 1, SFX_EMBER
+	anim_wait 24
+	anim_loop 4, .loop
+	anim_ret
+; ca0ab
+
+BattleAnim_Growl: ; ca0ab
+	anim_1gfx ANIM_GFX_NOISE
+	anim_enemyfeetobj
+	anim_bgeffect ANIM_BG_06, $0, $2, $0
+	anim_cry $0
+.loop
+	anim_call BattleAnim_Growl_branch_cbbbc
+	anim_wait 16
+	anim_loop 3, .loop
+	anim_wait 9
+	anim_bgeffect ANIM_BG_FEET_FOLLOW, $0, $1, $0
+	anim_wait 8
+	anim_bgeffect ANIM_BG_19, $0, $0, $40
+	anim_wait 64
+	anim_incbgeffect ANIM_BG_19
+	anim_wait 1
+	anim_bgeffect ANIM_BG_SHOW_MON, $0, $1, $0
+	anim_wait 5
+	anim_incobj 10
+	anim_wait 8
+	anim_ret
+; ca0d7
+
+BattleAnim_Roar: ; ca0d7
+	anim_1gfx ANIM_GFX_NOISE
+	anim_bgeffect ANIM_BG_06, $0, $2, $0
+	anim_cry $1
+.loop
+	anim_call BattleAnim_Roar_branch_cbbbc
+	anim_wait 16
+	anim_loop 3, .loop
+	anim_wait 16
+	anim_if_param_equal $0, .done
+	anim_bgeffect ANIM_BG_27, $0, $0, $0
+	anim_wait 64
+.done
+	anim_ret
+; ca0f4
+
+BattleAnim_Supersonic: ; ca0f4
+	anim_1gfx ANIM_GFX_PSYCHIC
+.loop
+	anim_sound 6, 2, SFX_SUPERSONIC
+	anim_obj ANIM_OBJ_4C,   8, 0,  11, 0, $2
+	anim_wait 4
+	anim_loop 10, .loop
+	anim_wait 64
+	anim_ret
+; ca105
+
+BattleAnim_Screech: ; ca105
+	anim_1gfx ANIM_GFX_PSYCHIC
+	anim_bgeffect ANIM_BG_1F, $8, $1, $20
+	anim_sound 6, 2, SFX_SCREECH
+.loop
+	anim_obj ANIM_OBJ_4C,   8, 0,  11, 0, $2
+	anim_wait 2
+	anim_loop 2, .loop
+	anim_wait 64
+	anim_ret
+; ca11b
+
+BattleAnim_ConfuseRay: ; ca11b
+	anim_1gfx ANIM_GFX_SPEED
+	anim_bgeffect ANIM_BG_06, $0, $2, $0
+	anim_bgeffect ANIM_BG_08, $0, $4, $0
+	anim_obj ANIM_OBJ_4D,   8, 0,  11, 0, $0
+	anim_obj ANIM_OBJ_4D,   8, 0,  11, 0, $80
+	anim_obj ANIM_OBJ_4D,   8, 0,  11, 0, $88
+	anim_obj ANIM_OBJ_4D,   8, 0,  11, 0, $90
+	anim_obj ANIM_OBJ_4D,   8, 0,  11, 0, $98
+	anim_obj ANIM_OBJ_4D,   8, 0,  11, 0, $a0
+	anim_obj ANIM_OBJ_4D,   8, 0,  11, 0, $a8
+	anim_obj ANIM_OBJ_4D,   8, 0,  11, 0, $b0
+	anim_obj ANIM_OBJ_4D,   8, 0,  11, 0, $b8
+.loop
+	anim_sound 6, 2, SFX_WHIRLWIND
+	anim_wait 16
+	anim_loop 8, .loop
+	anim_wait 32
+	anim_ret
+; ca15e
+
+BattleAnim_Leer: ; ca15e
+	anim_1gfx ANIM_GFX_BEAM
+	anim_bgeffect ANIM_BG_06, $0, $2, $0
+	anim_call BattleAnim_Leer_branch_cbadc
+	anim_wait 16
+	anim_ret
+; ca16a
+
+BattleAnim_Reflect: ; ca16a
+	anim_1gfx ANIM_GFX_REFLECT
+	anim_bgeffect ANIM_BG_06, $0, $2, $0
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $4, $2
+	anim_sound 0, 0, SFX_SHINE
+	anim_obj ANIM_OBJ_50,   9, 0,  10, 0, $0
+	anim_wait 24
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $4, $2
+	anim_sound 0, 0, SFX_SHINE
+	anim_obj ANIM_OBJ_50,   9, 0,  10, 0, $0
+	anim_wait 64
+	anim_ret
+; ca18e
+
+BattleAnim_LightScreen: ; ca18e
+	anim_2gfx ANIM_GFX_SPEED, ANIM_GFX_REFLECT
+	anim_bgeffect ANIM_BG_06, $0, $2, $0
+	anim_sound 0, 0, SFX_FLASH
+	anim_obj ANIM_OBJ_50,   9, 0,  10, 0, $0
+	anim_wait 4
+	anim_obj ANIM_OBJ_6D,   9, 0,  10, 0, $0
+	anim_wait 4
+	anim_obj ANIM_OBJ_6D,   9, 0,  10, 0, $8
+	anim_wait 4
+	anim_obj ANIM_OBJ_6D,   9, 0,  10, 0, $10
+	anim_wait 4
+	anim_obj ANIM_OBJ_6D,   9, 0,  10, 0, $18
+	anim_wait 4
+	anim_obj ANIM_OBJ_50,   9, 0,  10, 0, $0
+	anim_obj ANIM_OBJ_6D,   9, 0,  10, 0, $20
+	anim_wait 4
+	anim_obj ANIM_OBJ_6D,   9, 0,  10, 0, $28
+	anim_wait 4
+	anim_obj ANIM_OBJ_6D,   9, 0,  10, 0, $30
+	anim_wait 4
+	anim_obj ANIM_OBJ_6D,   9, 0,  10, 0, $38
+	anim_wait 64
+	anim_ret
+; ca1d5
+
+BattleAnim_Amnesia: ; ca1d5
+	anim_1gfx ANIM_GFX_STATUS
+	anim_sound 0, 0, SFX_LICK
+	anim_obj ANIM_OBJ_53,   8, 0,  10, 0, $2
+	anim_wait 16
+	anim_obj ANIM_OBJ_53,   8, 4,  10, 0, $1
+	anim_wait 16
+	anim_obj ANIM_OBJ_53,   9, 0,  10, 0, $0
+	anim_wait 64
+	anim_ret
+; ca1ed
+
+BattleAnim_DizzyPunch: ; ca1ed
+	anim_2gfx ANIM_GFX_STATUS, ANIM_GFX_HIT
+	anim_sound 0, 1, SFX_MEGA_PUNCH
+	anim_obj ANIM_OBJ_00, -15, 0,   5, 0, $0
+	anim_obj ANIM_OBJ_02, -15, 0,   8, 0, $0
+	anim_wait 16
+	anim_sound 0, 1, SFX_KINESIS
+	anim_obj ANIM_OBJ_CHICK, -15, 0,   3, 0, $15
+	anim_obj ANIM_OBJ_CHICK, -15, 0,   3, 0, $aa
+	anim_obj ANIM_OBJ_CHICK, -15, 0,   3, 0, $bf
+	anim_wait 96
+	anim_ret
+; ca212
+
+BattleAnim_Rest: ; ca212
+	anim_1gfx ANIM_GFX_STATUS
+	anim_sound 0, 0, SFX_TAIL_WHIP
+.loop
+	anim_obj ANIM_OBJ_54,   8, 0,  10, 0, $0
+	anim_wait 40
+	anim_loop 3, .loop
+	anim_wait 32
+	anim_ret
+; ca223
+
+BattleAnim_AcidArmor: ; ca223
+	anim_1gfx ANIM_GFX_HIT
+	anim_call BattleAnim_FollowPlayerHead_0
+	anim_bgeffect ANIM_BG_ACID_ARMOR, $0, $1, $8
+	anim_sound 0, 0, SFX_MEGA_PUNCH
+	anim_wait 64
+	anim_incbgeffect ANIM_BG_ACID_ARMOR
+	anim_call BattleAnim_ShowMon_0
+	anim_ret
+; ca237
+
+BattleAnim_Splash: ; ca237
+	anim_1gfx ANIM_GFX_HIT
+	anim_sound 0, 0, SFX_VICEGRIP
+	anim_call BattleAnim_FollowPlayerHead_0
+	anim_bgeffect ANIM_BG_BOUNCE_DOWN, $0, $1, $0
+	anim_wait 96
+	anim_incbgeffect ANIM_BG_BOUNCE_DOWN
+	anim_call BattleAnim_ShowMon_0
+	anim_ret
+; ca24b
+
+BattleAnim_Dig: ; ca24b
+	anim_2gfx ANIM_GFX_SAND, ANIM_GFX_HIT
+	anim_if_param_equal $0, .hit
+	anim_if_param_equal $2, .fail
+	anim_call BattleAnim_FollowPlayerHead_0
+	anim_bgeffect ANIM_BG_DIG, $0, $1, $1
+	anim_obj ANIM_OBJ_57,   9, 0,  13, 0, $0
+.loop
+	anim_sound 0, 0, SFX_RAZOR_WIND
+	anim_obj ANIM_OBJ_56,   7, 0,  13, 0, $0
+	anim_wait 16
+	anim_loop 6, .loop
+	anim_wait 32
+	anim_bgeffect ANIM_BG_HIDE_MON, $0, $1, $0
+	anim_wait 8
+	anim_incbgeffect ANIM_BG_DIG
+	anim_call BattleAnim_ShowMon_0
+	anim_ret
+
+.hit
+	anim_sound 0, 1, SFX_MEGA_PUNCH
+	anim_obj ANIM_OBJ_01, -15, 0,   7, 0, $0
+	anim_wait 32
+.fail
+	anim_bgeffect ANIM_BG_ENTER_MON, $0, $1, $0
+	anim_wait 32
+	anim_ret
+; ca28d
+
+BattleAnim_SandAttack: ; ca28d
+	anim_1gfx ANIM_GFX_SAND
+	anim_call BattleAnim_SandAttack_branch_cbc5b
+	anim_ret
+; ca293
+
+BattleAnim_StringShot: ; ca293
+	anim_1gfx ANIM_GFX_WEB
+	anim_bgeffect ANIM_BG_07, $0, $2, $0
+	anim_sound 6, 2, SFX_MENU
+	anim_obj ANIM_OBJ_5A,   8, 0,  10, 0, $0
+	anim_wait 4
+	anim_sound 0, 1, SFX_MENU
+	anim_obj ANIM_OBJ_5A, -16, 4,   6, 0, $1
+	anim_wait 4
+	anim_sound 6, 2, SFX_MENU
+	anim_obj ANIM_OBJ_5A,   8, 0,  11, 0, $0
+	anim_wait 4
+	anim_sound 0, 1, SFX_MENU
+	anim_obj ANIM_OBJ_5A, -16, 4,   8, 0, $1
+	anim_wait 4
+	anim_sound 6, 2, SFX_MENU
+	anim_obj ANIM_OBJ_5A,   8, 0,  10, 4, $0
+	anim_wait 4
+	anim_sound 0, 1, SFX_MENU
+	anim_obj ANIM_OBJ_5A, -16, 4,   7, 0, $2
+	anim_wait 64
+	anim_ret
+; ca2d1
+
+BattleAnim_Headbutt: ; ca2d1
+	anim_1gfx ANIM_GFX_HIT
+	anim_bgeffect ANIM_BG_1F, $14, $2, $0
+	anim_wait 32
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_bgeffect ANIM_BG_TACKLE, $0, $1, $0
+	anim_wait 4
+	anim_sound 0, 1, SFX_HEADBUTT
+	anim_obj ANIM_OBJ_01, -15, 0,   7, 0, $0
+	anim_wait 8
+	anim_call BattleAnim_ShowMon_0
+	anim_ret
+; ca2ef
+
+BattleAnim_Tackle: ; ca2ef
+	anim_1gfx ANIM_GFX_HIT
+	anim_call BattleAnim_FollowPlayerHead_0
+	anim_bgeffect ANIM_BG_TACKLE, $0, $1, $0
+	anim_wait 4
+	anim_sound 0, 1, SFX_TACKLE
+	anim_obj ANIM_OBJ_00, -15, 0,   6, 0, $0
+	anim_wait 8
+	anim_call BattleAnim_ShowMon_0
+	anim_ret
+; ca307
+
+BattleAnim_BodySlam: ; ca307
+	anim_1gfx ANIM_GFX_HIT
+	anim_call BattleAnim_FollowPlayerHead_0
+	anim_bgeffect ANIM_BG_BOUNCE_DOWN, $0, $1, $0
+	anim_wait 32
+	anim_incbgeffect ANIM_BG_BOUNCE_DOWN
+	anim_wait 4
+	anim_bgeffect ANIM_BG_25, $0, $1, $0
+	anim_wait 3
+	anim_sound 0, 1, SFX_TACKLE
+	anim_obj ANIM_OBJ_01, -15, 0,   6, 0, $0
+	anim_wait 6
+	anim_sound 0, 1, SFX_TACKLE
+	anim_obj ANIM_OBJ_01, -14, 0,   6, 0, $0
+	anim_wait 3
+	anim_call BattleAnim_ShowMon_0
+	anim_ret
+; ca331
+
+BattleAnim_TakeDown: ; ca331
+	anim_1gfx ANIM_GFX_HIT
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_bgeffect ANIM_BG_TACKLE, $0, $1, $0
+	anim_wait 3
+	anim_sound 0, 1, SFX_TACKLE
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $4, $2
+	anim_obj ANIM_OBJ_01,  16, 0,   7, 0, $0
+	anim_wait 6
+	anim_sound 0, 1, SFX_TACKLE
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $4, $2
+	anim_obj ANIM_OBJ_01, -14, 0,   6, 0, $0
+	anim_wait 3
+	anim_call BattleAnim_ShowMon_0
+	anim_ret
+; ca35c
+
+BattleAnim_DoubleEdge: ; ca35c
+	anim_1gfx ANIM_GFX_HIT
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $4, $10
+	anim_bgeffect ANIM_BG_TACKLE, $0, $1, $0
+	anim_wait 3
+	anim_sound 0, 1, SFX_TACKLE
+	anim_obj ANIM_OBJ_00,  16, 0,   6, 0, $0
+	anim_wait 6
+	anim_sound 0, 1, SFX_TACKLE
+	anim_obj ANIM_OBJ_00, -14, 0,   6, 0, $0
+	anim_wait 3
+	anim_call BattleAnim_ShowMon_0
+	anim_ret
+; ca382
+
+BattleAnim_Submission: ; ca382
+	anim_1gfx ANIM_GFX_HIT
+	anim_call BattleAnim_FollowEnemyFeet_1
+	anim_bgeffect ANIM_BG_26, $0, $0, $0
+	anim_sound 0, 1, SFX_SUBMISSION
+	anim_wait 32
+	anim_obj ANIM_OBJ_01,  15, 0,   6, 0, $0
+	anim_wait 32
+	anim_obj ANIM_OBJ_01, -13, 0,   7, 0, $0
+	anim_wait 32
+	anim_obj ANIM_OBJ_01, -15, 0,   6, 4, $0
+	anim_wait 32
+	anim_incbgeffect ANIM_BG_26
+	anim_call BattleAnim_ShowMon_1
+	anim_ret
+; ca3a8
+
+BattleAnim_Whirlwind: ; ca3a8
+	anim_1gfx ANIM_GFX_WIND
+.loop
+	anim_sound 0, 0, SFX_RAZOR_WIND
+	anim_obj ANIM_OBJ_GUST,   8, 0,  14, 0, $0
+	anim_wait 6
+	anim_loop 9, .loop
+	anim_incobj  1
+	anim_incobj  2
+	anim_incobj  3
+	anim_incobj  4
+	anim_incobj  5
+	anim_incobj  6
+	anim_incobj  7
+	anim_incobj  8
+	anim_incobj  9
+	anim_sound 16, 2, SFX_WHIRLWIND
+	anim_wait 128
+	anim_if_param_equal $0, .done
+	anim_bgeffect ANIM_BG_27, $0, $0, $0
+	anim_wait 64
+.done
+	anim_ret
+; ca3d8
+
+BattleAnim_Hypnosis: ; ca3d8
+	anim_1gfx ANIM_GFX_PSYCHIC
+.loop
+	anim_sound 6, 2, SFX_SUPERSONIC
+	anim_obj ANIM_OBJ_4C,   8, 0,  11, 0, $2
+	anim_obj ANIM_OBJ_4C,   7, 0,  10, 0, $2
+	anim_wait 8
+	anim_loop 3, .loop
+	anim_wait 56
+	anim_ret
+; ca3ee
+
+BattleAnim_Haze: ; ca3ee
+	anim_1gfx ANIM_GFX_HAZE
+	anim_sound 0, 1, SFX_SURF
+.loop
+	anim_obj ANIM_OBJ_HAZE,   6, 0,   7, 0, $0
+	anim_obj ANIM_OBJ_HAZE, -16, 4,   2, 0, $0
+	anim_wait 12
+	anim_loop 5, .loop
+	anim_wait 96
+	anim_ret
+; ca404
+
+BattleAnim_Mist: ; ca404
+	anim_obp0 $54
+	anim_1gfx ANIM_GFX_HAZE
+	anim_sound 0, 0, SFX_SURF
+.loop
+	anim_obj ANIM_OBJ_MIST,   6, 0,   7, 0, $0
+	anim_wait 8
+	anim_loop 10, .loop
+	anim_wait 96
+	anim_ret
+; ca417
+
+BattleAnim_Smog: ; ca417
+	anim_1gfx ANIM_GFX_HAZE
+	anim_sound 0, 1, SFX_BUBBLEBEAM
+.loop
+	anim_obj ANIM_OBJ_SMOG, -16, 4,   2, 0, $0
+	anim_wait 8
+	anim_loop 10, .loop
+	anim_wait 96
+	anim_ret
+; ca428
+
+BattleAnim_PoisonGas: ; ca428
+	anim_1gfx ANIM_GFX_HAZE
+	anim_sound 16, 2, SFX_BUBBLEBEAM
+.loop
+	anim_obj ANIM_OBJ_POISON_GAS,   5, 4,  10, 0, $2
+	anim_wait 8
+	anim_loop 10, .loop
+	anim_wait 128
+	anim_ret
+; ca439
+
+BattleAnim_HornAttack: ; ca439
+	anim_2gfx ANIM_GFX_HORN, ANIM_GFX_HIT
+	anim_obj ANIM_OBJ_HORN,   9, 0,  10, 0, $1
+	anim_wait 16
+	anim_sound 0, 1, SFX_HORN_ATTACK
+	anim_obj ANIM_OBJ_01, -15, 0,   7, 0, $0
+	anim_wait 16
+	anim_ret
+; ca44c
+
+BattleAnim_FuryAttack: ; ca44c
+	anim_2gfx ANIM_GFX_HORN, ANIM_GFX_HIT
+	anim_obj ANIM_OBJ_HORN,   9, 0,   9, 0, $2
+	anim_wait 8
+	anim_sound 0, 1, SFX_HORN_ATTACK
+	anim_obj ANIM_OBJ_04,  16, 0,   5, 0, $0
+	anim_wait 8
+	anim_obj ANIM_OBJ_HORN,  10, 0,  11, 0, $2
+	anim_wait 8
+	anim_sound 0, 1, SFX_HORN_ATTACK
+	anim_obj ANIM_OBJ_04, -15, 0,   7, 0, $0
+	anim_wait 8
+	anim_obj ANIM_OBJ_HORN,   9, 4,  10, 0, $2
+	anim_wait 8
+	anim_sound 0, 1, SFX_HORN_ATTACK
+	anim_obj ANIM_OBJ_04, -16, 4,   6, 0, $0
+	anim_wait 8
+	anim_ret
+; ca47d
+
+BattleAnim_HornDrill: ; ca47d
+	anim_2gfx ANIM_GFX_HORN, ANIM_GFX_HIT
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $40
+	anim_obj ANIM_OBJ_HORN,   9, 0,  10, 0, $3
+	anim_wait 8
+.loop
+	anim_sound 0, 1, SFX_HORN_ATTACK
+	anim_obj ANIM_OBJ_00, -16, 4,   5, 0, $0
+	anim_wait 8
+	anim_sound 0, 1, SFX_HORN_ATTACK
+	anim_obj ANIM_OBJ_00, -15, 4,   6, 0, $0
+	anim_wait 8
+	anim_sound 0, 1, SFX_HORN_ATTACK
+	anim_obj ANIM_OBJ_00, -16, 4,   7, 0, $0
+	anim_wait 8
+	anim_sound 0, 1, SFX_HORN_ATTACK
+	anim_obj ANIM_OBJ_00,  15, 4,   6, 0, $0
+	anim_wait 8
+	anim_loop 3, .loop
+	anim_ret
+; ca4b4
+
+BattleAnim_PoisonSting: ; ca4b4
+	anim_2gfx ANIM_GFX_HORN, ANIM_GFX_HIT
+	anim_obj ANIM_OBJ_60,   8, 0,  11, 4, $14
+	anim_wait 16
+	anim_sound 0, 1, SFX_POISON_STING
+	anim_obj ANIM_OBJ_05, -15, 0,   7, 0, $0
+	anim_wait 16
+	anim_ret
+; ca4c7
+
+BattleAnim_Twineedle: ; ca4c7
+	anim_2gfx ANIM_GFX_HORN, ANIM_GFX_HIT
+	anim_sound 0, 1, SFX_POISON_STING
+	anim_obj ANIM_OBJ_60,   8, 0,  11, 4, $14
+	anim_obj ANIM_OBJ_60,   7, 0,  10, 4, $14
+	anim_wait 16
+	anim_sound 0, 1, SFX_POISON_STING
+	anim_obj ANIM_OBJ_05, -15, 0,   7, 0, $0
+	anim_obj ANIM_OBJ_05,  16, 0,   6, 0, $0
+	anim_wait 16
+	anim_ret
+; ca4e7
+
+BattleAnim_PinMissile: ; ca4e7
+	anim_2gfx ANIM_GFX_HORN, ANIM_GFX_HIT
+.loop
+	anim_obj ANIM_OBJ_60,   8, 0,  11, 4, $28
+	anim_wait 8
+	anim_obj ANIM_OBJ_60,   7, 0,  10, 4, $28
+	anim_sound 0, 1, SFX_POISON_STING
+	anim_obj ANIM_OBJ_05, -15, 0,   7, 0, $0
+	anim_wait 8
+	anim_obj ANIM_OBJ_60,   6, 4,  11, 0, $28
+	anim_sound 0, 1, SFX_POISON_STING
+	anim_obj ANIM_OBJ_05,  16, 0,   6, 0, $0
+	anim_wait 8
+	anim_sound 0, 1, SFX_POISON_STING
+	anim_obj ANIM_OBJ_05, -16, 4,   6, 4, $0
+	anim_loop 3, .loop
+	anim_wait 16
+	anim_ret
+; ca51a
+
+BattleAnim_SpikeCannon: ; ca51a
+	anim_2gfx ANIM_GFX_HORN, ANIM_GFX_HIT
+.loop
+	anim_obj ANIM_OBJ_60,   8, 0,  11, 4, $18
+	anim_wait 8
+	anim_obj ANIM_OBJ_60,   7, 0,  10, 4, $18
+	anim_sound 0, 1, SFX_POISON_STING
+	anim_obj ANIM_OBJ_05, -15, 0,   7, 0, $0
+	anim_wait 8
+	anim_obj ANIM_OBJ_60,   6, 4,  11, 0, $18
+	anim_sound 0, 1, SFX_POISON_STING
+	anim_obj ANIM_OBJ_05,  16, 0,   6, 0, $0
+	anim_wait 8
+	anim_sound 0, 1, SFX_POISON_STING
+	anim_obj ANIM_OBJ_05, -16, 4,   6, 4, $0
+	anim_loop 3, .loop
+	anim_wait 16
+	anim_ret
+; ca54d
+
+BattleAnim_Transform: ; ca54d
+	anim_1gfx ANIM_GFX_HIT
+	anim_call BattleAnim_FollowPlayerHead_0
+	anim_transform
+	anim_sound 0, 0, SFX_PSYBEAM
+	anim_bgeffect ANIM_BG_WAVE_DEFORM_USER, $0, $1, $0
+	anim_wait 48
+	anim_updateactorpic
+	anim_incbgeffect ANIM_BG_WAVE_DEFORM_USER
+	anim_wait 48
+	anim_call BattleAnim_ShowMon_0
+	anim_ret
+; ca564
+
+BattleAnim_PetalDance: ; ca564
+	anim_sound 0, 0, SFX_MENU
+	anim_2gfx ANIM_GFX_FLOWER, ANIM_GFX_HIT
+.loop
+	anim_obj ANIM_OBJ_61,   6, 0,   7, 0, $0
+	anim_wait 11
+	anim_loop 8, .loop
+	anim_wait 128
+	anim_wait 64
+	anim_sound 0, 1, SFX_COMET_PUNCH
+	anim_obj ANIM_OBJ_00, -15, 0,   7, 0, $0
+	anim_wait 16
+	anim_ret
+; ca580
+
+BattleAnim_Barrage: ; ca580
+	anim_2gfx ANIM_GFX_EGG, ANIM_GFX_EXPLOSION
+	anim_sound 6, 2, SFX_THROW_BALL
+	anim_obj ANIM_OBJ_62,   8, 0,  11, 4, $10
+	anim_wait 36
+	anim_sound 0, 1, SFX_EGG_BOMB
+	anim_obj ANIM_OBJ_18, -15, 0,   7, 0, $0
+	anim_wait 16
+	anim_ret
+; ca596
+
+BattleAnim_PayDay: ; ca596
+	anim_2gfx ANIM_GFX_HIT, ANIM_GFX_STATUS
+	anim_sound 0, 1, SFX_POUND
+	anim_obj ANIM_OBJ_01,  16, 0,   7, 0, $0
+	anim_wait 16
+	anim_sound 0, 1, SFX_PAY_DAY
+	anim_obj ANIM_OBJ_63,  15, 0,   9, 4, $1
+	anim_wait 64
+	anim_ret
+; ca5ac
+
+BattleAnim_Mimic: ; ca5ac
+	anim_1gfx ANIM_GFX_SPEED
+	anim_obp0 $fc
+	anim_sound 63, 3, SFX_LICK
+	anim_obj ANIM_OBJ_65, -16, 4,   5, 4, $0
+	anim_obj ANIM_OBJ_65, -16, 4,   5, 4, $8
+	anim_obj ANIM_OBJ_65, -16, 4,   5, 4, $10
+	anim_obj ANIM_OBJ_65, -16, 4,   5, 4, $18
+	anim_obj ANIM_OBJ_65, -16, 4,   5, 4, $20
+	anim_obj ANIM_OBJ_65, -16, 4,   5, 4, $28
+	anim_obj ANIM_OBJ_65, -16, 4,   5, 4, $30
+	anim_obj ANIM_OBJ_65, -16, 4,   5, 4, $38
+	anim_wait 128
+	anim_wait 48
+	anim_ret
+; ca5de
+
+BattleAnim_LovelyKiss: ; ca5de
+	anim_2gfx ANIM_GFX_OBJECTS, ANIM_GFX_ANGELS
+	anim_bgeffect ANIM_BG_07, $0, $2, $0
+	anim_obj ANIM_OBJ_96, -13, 0,   5, 0, $0
+	anim_wait 32
+	anim_sound 0, 1, SFX_LICK
+	anim_obj ANIM_OBJ_HEART,  16, 0,   5, 0, $0
+	anim_wait 40
+	anim_ret
+; ca5f6
+
+BattleAnim_Bonemerang: ; ca5f6
+	anim_2gfx ANIM_GFX_MISC, ANIM_GFX_HIT
+	anim_sound 6, 2, SFX_HYDRO_PUMP
+	anim_obj ANIM_OBJ_67,  11, 0,   7, 0, $1c
+	anim_wait 24
+	anim_sound 0, 1, SFX_MOVE_PUZZLE_PIECE
+	anim_obj ANIM_OBJ_01, -15, 0,   7, 0, $0
+	anim_wait 24
+	anim_ret
+; ca60c
+
+BattleAnim_Swift: ; ca60c
+	anim_1gfx ANIM_GFX_OBJECTS
+	anim_sound 6, 2, SFX_METRONOME
+	anim_obj ANIM_OBJ_6A,   8, 0,  11, 0, $4
+	anim_wait 4
+	anim_obj ANIM_OBJ_6A,   8, 0,   9, 0, $4
+	anim_wait 4
+	anim_obj ANIM_OBJ_6A,   8, 0,   9, 4, $4
+	anim_wait 64
+	anim_ret
+; ca624
+
+BattleAnim_Crabhammer: ; ca624
+	anim_1gfx ANIM_GFX_HIT
+	anim_bgeffect ANIM_BG_1F, $40, $2, $0
+	anim_wait 48
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $3
+.loop
+	anim_sound 0, 1, SFX_MEGA_PUNCH
+	anim_obj ANIM_OBJ_00, -15, 0,   7, 0, $0
+	anim_wait 12
+	anim_loop 3, .loop
+	anim_ret
+; ca63f
+
+BattleAnim_SkullBash: ; ca63f
+	anim_if_param_equal $1, BattleAnim_SkullBash_branch_c9fb5
+	anim_1gfx ANIM_GFX_HIT
+	anim_bgeffect ANIM_BG_1F, $14, $2, $0
+	anim_wait 32
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $3
+	anim_bgeffect ANIM_BG_TACKLE, $0, $1, $0
+	anim_wait 4
+.loop
+	anim_sound 0, 1, SFX_HEADBUTT
+	anim_obj ANIM_OBJ_01, -15, 0,   7, 0, $0
+	anim_wait 8
+	anim_loop 3, .loop
+	anim_call BattleAnim_ShowMon_0
+	anim_ret
+; ca66a
+
+BattleAnim_Kinesis: ; ca66a
+	anim_2gfx ANIM_GFX_MISC, ANIM_GFX_NOISE
+	anim_bgeffect ANIM_BG_06, $0, $2, $0
+	anim_obj ANIM_OBJ_6B,  10, 0,   9, 4, $0
+	anim_wait 32
+.loop
+	anim_sound 0, 0, SFX_KINESIS
+	anim_obj ANIM_OBJ_4B,   8, 0,  11, 0, $0
+	anim_wait 32
+	anim_loop 3, .loop
+	anim_wait 32
+	anim_sound 0, 0, SFX_KINESIS_2
+	anim_wait 32
+	anim_ret
+; ca68b
+
+BattleAnim_Peck: ; ca68b
+	anim_1gfx ANIM_GFX_HIT
+	anim_sound 0, 1, SFX_PECK
+	anim_obj ANIM_OBJ_02,  16, 0,   6, 0, $0
+	anim_wait 8
+	anim_sound 0, 1, SFX_PECK
+	anim_obj ANIM_OBJ_02, -15, 0,   7, 0, $0
+	anim_wait 16
+	anim_ret
+; ca6a0
+
+BattleAnim_DrillPeck: ; ca6a0
+	anim_1gfx ANIM_GFX_HIT
+.loop
+	anim_sound 0, 1, SFX_PECK
+	anim_obj ANIM_OBJ_02,  15, 4,   7, 0, $0
+	anim_wait 4
+	anim_sound 0, 1, SFX_PECK
+	anim_obj ANIM_OBJ_02, -16, 4,   6, 0, $0
+	anim_wait 4
+	anim_sound 0, 1, SFX_PECK
+	anim_obj ANIM_OBJ_02, -15, 4,   7, 0, $0
+	anim_wait 4
+	anim_sound 0, 1, SFX_PECK
+	anim_obj ANIM_OBJ_02, -16, 4,   8, 0, $0
+	anim_wait 4
+	anim_loop 5, .loop
+	anim_wait 16
+	anim_ret
+; ca6cc
+
+BattleAnim_Guillotine: ; ca6cc
+	anim_1gfx ANIM_GFX_CUT
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $10
+	anim_bgeffect ANIM_BG_1F, $40, $2, $0
+	anim_sound 0, 1, SFX_VICEGRIP
+	anim_obj ANIM_OBJ_37, -13, 4,   5, 4, $0
+	anim_obj ANIM_OBJ_37, -13, 0,   5, 0, $0
+	anim_obj ANIM_OBJ_37, -14, 4,   4, 4, $0
+	anim_obj ANIM_OBJ_39,  15, 4,   9, 4, $0
+	anim_obj ANIM_OBJ_39,  15, 0,   9, 0, $0
+	anim_obj ANIM_OBJ_39,  14, 4,   8, 4, $0
+	anim_obj ANIM_OBJ_39,  15, 0,   9, 0, $0
+	anim_wait 32
+	anim_ret
+; ca700
+
+BattleAnim_Flash: ; ca700
+	anim_1gfx ANIM_GFX_SPEED
+	anim_sound 0, 1, SFX_FLASH
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $6, $20
+	anim_wait 4
+	anim_obj ANIM_OBJ_6C, -15, 0,   7, 0, $0
+	anim_wait 4
+	anim_obj ANIM_OBJ_6C, -15, 0,   7, 0, $8
+	anim_wait 4
+	anim_obj ANIM_OBJ_6C, -15, 0,   7, 0, $10
+	anim_wait 4
+	anim_obj ANIM_OBJ_6C, -15, 0,   7, 0, $18
+	anim_wait 4
+	anim_obj ANIM_OBJ_6C, -15, 0,   7, 0, $20
+	anim_wait 4
+	anim_obj ANIM_OBJ_6C, -15, 0,   7, 0, $28
+	anim_wait 4
+	anim_obj ANIM_OBJ_6C, -15, 0,   7, 0, $30
+	anim_wait 4
+	anim_obj ANIM_OBJ_6C, -15, 0,   7, 0, $38
+	anim_wait 32
+	anim_ret
+; ca73c
+
+BattleAnim_Substitute: ; ca73c
+	anim_sound 0, 0, SFX_SURF
+	anim_if_param_equal $3, BattleAnim_Substitute_branch_ca77c
+	anim_if_param_equal $2, BattleAnim_Substitute_branch_ca76e
+	anim_if_param_equal $1, BattleAnim_Substitute_branch_ca760
+	anim_1gfx ANIM_GFX_SMOKE
+	anim_bgeffect ANIM_BG_27, $0, $1, $0
+	anim_wait 48
+	anim_raisesub
+	anim_obj ANIM_OBJ_BALL_POOF,   6, 0,  12, 0, $0
+	anim_bgeffect ANIM_BG_ENTER_MON, $0, $1, $0
+	anim_wait 32
+	anim_ret
+; ca760
+
+BattleAnim_Substitute_branch_ca760: ; ca760
+	anim_bgeffect ANIM_BG_27, $0, $1, $0
+	anim_wait 48
+	anim_dropsub
+	anim_bgeffect ANIM_BG_SHOW_MON, $0, $1, $0
+	anim_wait 32
+	anim_ret
+; ca76e
+
+BattleAnim_Substitute_branch_ca76e: ; ca76e
+	anim_bgeffect ANIM_BG_27, $0, $1, $0
+	anim_wait 48
+	anim_raisesub
+	anim_bgeffect ANIM_BG_SHOW_MON, $0, $1, $0
+	anim_wait 32
+	anim_ret
+; ca77c
+
+BattleAnim_Substitute_branch_ca77c: ; ca77c
+	anim_bgeffect ANIM_BG_HIDE_MON, $0, $1, $0
+	anim_wait 48
+	anim_dropsub
+	anim_bgeffect ANIM_BG_SHOW_MON, $0, $1, $0
+	anim_wait 32
+	anim_ret
+; ca78a
+
+BattleAnim_Minimize: ; ca78a
+	anim_sound 0, 0, SFX_SURF
+	anim_1gfx ANIM_GFX_HIT
+	anim_call BattleAnim_FollowPlayerHead_0
+	anim_minimize
+	anim_bgeffect ANIM_BG_WAVE_DEFORM_USER, $0, $1, $0
+	anim_wait 48
+	anim_updateactorpic
+	anim_incbgeffect ANIM_BG_WAVE_DEFORM_USER
+	anim_wait 48
+	anim_call BattleAnim_ShowMon_0
+	anim_ret
+; ca7a1
+
+BattleAnim_SkyAttack: ; ca7a1
+	anim_if_param_equal $1, BattleAnim_SkyAttack_branch_c9fb5
+	anim_1gfx ANIM_GFX_SKY_ATTACK
+	anim_bgeffect ANIM_BG_27, $0, $1, $0
+	anim_wait 32
+	anim_sound 0, 0, SFX_HYPER_BEAM
+	anim_obj ANIM_OBJ_SKY_ATTACK_FEAROW,   6, 0,  11, 0, $40
+	anim_wait 64
+	anim_incobj  1
+	anim_wait 21
+	anim_sound 0, 1, SFX_HYPER_BEAM
+	anim_bgeffect ANIM_BG_ALTERNATE_HUES, $0, $2, $0
+	anim_wait 64
+	anim_incobj  1
+	anim_wait 32
+	anim_bgeffect ANIM_BG_SHOW_MON, $0, $1, $0
+	anim_wait 16
+	anim_ret
+; ca7cc
+
+BattleAnim_NightShade: ; ca7cc
+	anim_1gfx ANIM_GFX_HIT
+	anim_bgp $1b
+	anim_obp1 $1b
+	anim_wait 32
+	anim_call BattleAnim_FollowPlayerHead_1
+	anim_bgeffect ANIM_BG_NIGHT_SHADE, $0, $0, $8
+	anim_sound 0, 1, SFX_PSYCHIC
+	anim_wait 96
+	anim_incbgeffect ANIM_BG_NIGHT_SHADE
+	anim_call BattleAnim_ShowMon_1
+	anim_ret
+; ca7e5
+
+BattleAnim_Lick: ; ca7e5
+	anim_1gfx ANIM_GFX_WATER
+	anim_sound 0, 1, SFX_LICK
+	anim_obj ANIM_OBJ_LICK, -15, 0,   7, 0, $0
+	anim_wait 64
+	anim_ret
+; ca7f1
+
+BattleAnim_TriAttack: ; ca7f1
+	anim_3gfx ANIM_GFX_FIRE, ANIM_GFX_ICE, ANIM_GFX_LIGHTNING
+	anim_call BattleAnim_TriAttack_branch_cbbcc
+	anim_wait 16
+	anim_call BattleAnim_TriAttack_branch_cbbdf
+	anim_wait 16
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $4, $4
+	anim_sound 0, 1, SFX_THUNDER
+	anim_obj ANIM_OBJ_2F, -13, 0,   8, 4, $0
+	anim_wait 16
+	anim_ret
+; ca80c
+
+BattleAnim_Withdraw: ; ca80c
+	anim_1gfx ANIM_GFX_REFLECT
+	anim_call BattleAnim_FollowPlayerHead_0
+	anim_bgeffect ANIM_BG_WITHDRAW, $0, $1, $50
+	anim_wait 48
+	anim_sound 0, 0, SFX_SHINE
+	anim_obj ANIM_OBJ_WITHDRAW,   6, 0,  11, 0, $0
+	anim_wait 64
+	anim_incobj  2
+	anim_wait 1
+	anim_incbgeffect ANIM_BG_WITHDRAW
+	anim_call BattleAnim_ShowMon_0
+	anim_ret
+; ca829
+
+BattleAnim_Psybeam: ; ca829
+	anim_1gfx ANIM_GFX_PSYCHIC
+	anim_bgeffect ANIM_BG_06, $0, $2, $0
+	anim_bgeffect ANIM_BG_08, $0, $4, $0
+.loop
+	anim_sound 6, 2, SFX_PSYBEAM
+	anim_obj ANIM_OBJ_4C,   8, 0,  11, 0, $4
+	anim_wait 4
+	anim_loop 10, .loop
+	anim_wait 48
+	anim_ret
+; ca844
+
+BattleAnim_DreamEater: ; ca844
+	anim_1gfx ANIM_GFX_BUBBLE
+	anim_bgp $1b
+	anim_obp0 $27
+	anim_sound 6, 3, SFX_WATER_GUN
+	anim_call BattleAnim_DreamEater_branch_cbab3
+	anim_wait 128
+	anim_wait 48
+	anim_ret
+; ca853
+
+BattleAnim_LeechLife: ; ca853
+	anim_1gfx ANIM_GFX_BUBBLE
+	anim_sound 6, 3, SFX_WATER_GUN
+	anim_call BattleAnim_LeechLife_branch_cbab3
+	anim_wait 128
+	anim_wait 48
+	anim_ret
+; ca85e
+
+BattleAnim_Harden: ; ca85e
+	anim_1gfx ANIM_GFX_REFLECT
+	anim_obp0 $0
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_call BattleAnim_Harden_branch_cbc43
+	anim_call BattleAnim_ShowMon_0
+	anim_ret
+; ca86c
+
+BattleAnim_Psywave: ; ca86c
+	anim_1gfx ANIM_GFX_PSYCHIC
+	anim_bgeffect ANIM_BG_PSYCHIC, $0, $0, $0
+.loop
+	anim_sound 6, 2, SFX_PSYCHIC
+	anim_obj ANIM_OBJ_4C,   8, 0,  10, 0, $2
+	anim_wait 8
+	anim_sound 6, 2, SFX_PSYCHIC
+	anim_obj ANIM_OBJ_4C,   8, 0,  11, 0, $3
+	anim_wait 8
+	anim_sound 6, 2, SFX_PSYCHIC
+	anim_obj ANIM_OBJ_4C,   8, 0,  12, 0, $4
+	anim_wait 8
+	anim_loop 3, .loop
+	anim_wait 32
+	anim_incbgeffect ANIM_BG_PSYCHIC
+	anim_wait 4
+	anim_ret
+; ca897
+
+BattleAnim_Glare: ; ca897
+	anim_1gfx ANIM_GFX_BEAM
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $20
+	anim_bgeffect ANIM_BG_06, $0, $2, $0
+	anim_call BattleAnim_Glare_branch_cbadc
+	anim_wait 16
+	anim_ret
+; ca8a8
+
+BattleAnim_Thrash: ; ca8a8
+	anim_1gfx ANIM_GFX_HIT
+	anim_sound 0, 1, SFX_POUND
+	anim_obj ANIM_OBJ_08,  15, 0,   9, 0, $0
+	anim_obj ANIM_OBJ_00,  15, 0,   9, 0, $0
+	anim_wait 6
+	anim_sound 0, 1, SFX_MOVE_PUZZLE_PIECE
+	anim_obj ANIM_OBJ_06, -15, 0,   7, 0, $0
+	anim_obj ANIM_OBJ_00, -15, 0,   7, 0, $0
+	anim_wait 6
+	anim_sound 0, 1, SFX_DOUBLE_KICK
+	anim_obj ANIM_OBJ_07, -13, 0,   5, 0, $0
+	anim_obj ANIM_OBJ_00, -13, 0,   5, 0, $0
+	anim_wait 16
+	anim_ret
+; ca8d5
+
+BattleAnim_Growth: ; ca8d5
+	anim_bgeffect ANIM_BG_WHITE_HUES, $0, $8, $0
+	anim_1gfx ANIM_GFX_CHARGE
+	anim_sound 0, 0, SFX_SWORDS_DANCE
+	anim_obj ANIM_OBJ_72,   6, 0,  13, 4, $0
+	anim_obj ANIM_OBJ_72,   6, 0,  13, 4, $8
+	anim_obj ANIM_OBJ_72,   6, 0,  13, 4, $10
+	anim_obj ANIM_OBJ_72,   6, 0,  13, 4, $18
+	anim_obj ANIM_OBJ_72,   6, 0,  13, 4, $20
+	anim_obj ANIM_OBJ_72,   6, 0,  13, 4, $28
+	anim_obj ANIM_OBJ_72,   6, 0,  13, 4, $30
+	anim_obj ANIM_OBJ_72,   6, 0,  13, 4, $38
+	anim_wait 64
+	anim_ret
+; ca909
+
+BattleAnim_Conversion2: ; ca909
+	anim_1gfx ANIM_GFX_EXPLOSION
+	anim_sound 63, 3, SFX_SHARPEN
+	anim_obj ANIM_OBJ_73, -16, 4,   5, 4, $0
+	anim_obj ANIM_OBJ_73, -16, 4,   5, 4, $8
+	anim_obj ANIM_OBJ_73, -16, 4,   5, 4, $10
+	anim_obj ANIM_OBJ_73, -16, 4,   5, 4, $18
+	anim_obj ANIM_OBJ_73, -16, 4,   5, 4, $20
+	anim_obj ANIM_OBJ_73, -16, 4,   5, 4, $28
+	anim_obj ANIM_OBJ_73, -16, 4,   5, 4, $30
+	anim_obj ANIM_OBJ_73, -16, 4,   5, 4, $38
+	anim_wait 128
+	anim_wait 48
+	anim_ret
+; ca939
+
+BattleAnim_Smokescreen: ; ca939
+	anim_3gfx ANIM_GFX_HAZE, ANIM_GFX_EGG, ANIM_GFX_SMOKE
+	anim_sound 6, 2, SFX_THROW_BALL
+	anim_obj ANIM_OBJ_75,   8, 0,  11, 4, $6c
+	anim_wait 24
+	anim_incobj  1
+	anim_sound 0, 1, SFX_BALL_POOF
+	anim_obj ANIM_OBJ_BALL_POOF,  13, 4,   8, 6, $10
+	anim_wait 8
+.loop
+	anim_sound 0, 1, SFX_MENU
+	anim_obj ANIM_OBJ_74, -16, 4,   7, 4, $20
+	anim_wait 8
+	anim_loop 5, .loop
+	anim_wait 128
+	anim_ret
+; ca960
+
+BattleAnim_Strength: ; ca960
+	anim_2gfx ANIM_GFX_ROCKS, ANIM_GFX_HIT
+	anim_bgeffect ANIM_BG_20, $10, $1, $20
+	anim_sound 0, 0, SFX_STRENGTH
+	anim_obj ANIM_OBJ_1F,   8, 0,  13, 0, $1
+	anim_wait 128
+	anim_incobj  1
+	anim_wait 20
+	anim_sound 0, 1, SFX_MEGA_PUNCH
+	anim_obj ANIM_OBJ_00, -16, 4,   5, 0, $0
+	anim_wait 16
+	anim_ret
+; ca97e
+
+BattleAnim_SwordsDance: ; ca97e
+	anim_1gfx ANIM_GFX_WHIP
+	anim_sound 0, 0, SFX_SWORDS_DANCE
+	anim_obj ANIM_OBJ_76,   6, 0,  13, 4, $0
+	anim_obj ANIM_OBJ_76,   6, 0,  13, 4, $d
+	anim_obj ANIM_OBJ_76,   6, 0,  13, 4, $1a
+	anim_obj ANIM_OBJ_76,   6, 0,  13, 4, $27
+	anim_obj ANIM_OBJ_76,   6, 0,  13, 4, $34
+	anim_wait 56
+	anim_ret
+; ca99e
+
+BattleAnim_QuickAttack: ; ca99e
+	anim_2gfx ANIM_GFX_SPEED, ANIM_GFX_HIT
+	anim_sound 0, 0, SFX_MENU
+	anim_bgeffect ANIM_BG_HIDE_MON, $0, $1, $0
+	anim_obj ANIM_OBJ_77,   3, 0,  11, 0, $2
+	anim_obj ANIM_OBJ_77,   4, 0,  11, 0, $1
+	anim_obj ANIM_OBJ_77,   5, 0,  11, 0, $0
+	anim_obj ANIM_OBJ_77,   6, 0,  11, 0, $80
+	anim_obj ANIM_OBJ_77,   7, 0,  11, 0, $81
+	anim_obj ANIM_OBJ_77,   8, 0,  11, 0, $82
+	anim_wait 12
+	anim_sound 0, 1, SFX_COMET_PUNCH
+	anim_obj ANIM_OBJ_01, -15, 0,   7, 0, $0
+	anim_wait 8
+	anim_bgeffect ANIM_BG_SHOW_MON, $0, $1, $0
+	anim_wait 16
+	anim_ret
+; ca9d8
+
+BattleAnim_Meditate: ; ca9d8
+	anim_1gfx ANIM_GFX_HIT
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_sound 0, 0, SFX_PSYBEAM
+	anim_bgeffect ANIM_BG_WAVE_DEFORM_USER, $0, $1, $0
+	anim_wait 48
+	anim_incbgeffect ANIM_BG_WAVE_DEFORM_USER
+	anim_wait 48
+	anim_call BattleAnim_ShowMon_0
+	anim_ret
+; ca9ed
+
+BattleAnim_Sharpen: ; ca9ed
+	anim_1gfx ANIM_GFX_SHAPES
+	anim_obp0 $e4
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_sound 0, 0, SFX_SHARPEN
+	anim_bgeffect ANIM_BG_18, $0, $1, $40
+	anim_obj ANIM_OBJ_78,   6, 0,  11, 0, $0
+	anim_wait 96
+	anim_incobj  2
+	anim_incbgeffect ANIM_BG_18
+	anim_call BattleAnim_ShowMon_0
+	anim_ret
+; caa0a
+
+BattleAnim_DefenseCurl: ; caa0a
+	anim_1gfx ANIM_GFX_SHAPES
+	anim_obp0 $e4
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_sound 0, 0, SFX_SHARPEN
+	anim_bgeffect ANIM_BG_18, $0, $1, $40
+	anim_obj ANIM_OBJ_79,   6, 0,  11, 0, $0
+	anim_wait 96
+	anim_incobj  2
+	anim_incbgeffect ANIM_BG_18
+	anim_call BattleAnim_ShowMon_0
+	anim_ret
+; caa27
+
+BattleAnim_SeismicToss: ; caa27
+	anim_2gfx ANIM_GFX_GLOBE, ANIM_GFX_HIT
+	anim_bgeffect ANIM_BG_20, $10, $1, $20
+	anim_sound 0, 0, SFX_STRENGTH
+	anim_obj ANIM_OBJ_20,   8, 0,  13, 0, $1
+	anim_wait 128
+	anim_incobj  1
+	anim_wait 20
+	anim_sound 0, 1, SFX_MEGA_PUNCH
+	anim_obj ANIM_OBJ_00, -16, 4,   5, 0, $0
+	anim_wait 16
+	anim_ret
+; caa45
+
+BattleAnim_Rage: ; caa45
+	anim_1gfx ANIM_GFX_HIT
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_bgeffect ANIM_BG_1A, $0, $1, $20
+	anim_sound 0, 0, SFX_RAGE
+	anim_wait 72
+	anim_incbgeffect ANIM_BG_1A
+	anim_call BattleAnim_ShowMon_0
+	anim_sound 0, 1, SFX_MOVE_PUZZLE_PIECE
+	anim_obj ANIM_OBJ_00,  15, 0,   9, 0, $0
+	anim_wait 6
+	anim_sound 0, 1, SFX_COMET_PUNCH
+	anim_obj ANIM_OBJ_00, -15, 0,   7, 0, $0
+	anim_wait 6
+	anim_sound 0, 1, SFX_MEGA_PUNCH
+	anim_obj ANIM_OBJ_00, -13, 0,   5, 0, $0
+	anim_wait 16
+	anim_ret
+; caa74
+
+BattleAnim_Agility: ; caa74
+	anim_1gfx ANIM_GFX_WIND
+	anim_obp0 $fc
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_bgeffect ANIM_BG_18, $0, $1, $40
+	anim_obj ANIM_OBJ_7D,   1, 0,   3, 0, $10
+	anim_obj ANIM_OBJ_7D,   1, 0,   6, 0, $2
+	anim_obj ANIM_OBJ_7D,   1, 0,  11, 0, $8
+	anim_wait 4
+	anim_obj ANIM_OBJ_7D,   1, 0,   4, 0, $6
+	anim_obj ANIM_OBJ_7D,   1, 0,   7, 0, $c
+	anim_obj ANIM_OBJ_7D,   1, 0,  10, 0, $4
+	anim_obj ANIM_OBJ_7D,   1, 0,  13, 0, $e
+.loop
+	anim_sound 0, 0, SFX_RAZOR_WIND
+	anim_wait 4
+	anim_loop 18, .loop
+	anim_incbgeffect ANIM_BG_18
+	anim_call BattleAnim_ShowMon_0
+	anim_ret
+; caab2
+
+BattleAnim_BoneClub: ; caab2
+	anim_2gfx ANIM_GFX_HIT, ANIM_GFX_MISC
+	anim_obj ANIM_OBJ_68,   8, 0,  11, 0, $2
+	anim_wait 32
+	anim_sound 0, 1, SFX_BONE_CLUB
+	anim_obj ANIM_OBJ_01, -15, 0,   7, 0, $0
+	anim_wait 16
+	anim_ret
+; caac5
+
+BattleAnim_Barrier: ; caac5
+	anim_1gfx ANIM_GFX_REFLECT
+	anim_enemyfeetobj
+	anim_bgeffect ANIM_BG_06, $0, $2, $0
+	anim_wait 8
+	anim_sound 0, 0, SFX_SHINE
+	anim_obj ANIM_OBJ_50,   9, 0,  10, 0, $0
+	anim_wait 32
+	anim_sound 0, 0, SFX_SHINE
+	anim_obj ANIM_OBJ_50,   9, 0,  10, 0, $0
+	anim_wait 32
+	anim_ret
+; caae1
+
+BattleAnim_Waterfall: ; caae1
+	anim_1gfx ANIM_GFX_HIT
+	anim_call BattleAnim_FollowPlayerHead_0
+	anim_bgeffect ANIM_BG_25, $0, $1, $0
+	anim_wait 16
+	anim_call BattleAnim_ShowMon_0
+	anim_sound 0, 1, SFX_LICK
+	anim_obj ANIM_OBJ_01, -15, 0,   7, 0, $0
+	anim_wait 3
+	anim_sound 0, 1, SFX_LICK
+	anim_obj ANIM_OBJ_01, -15, 0,   6, 0, $0
+	anim_wait 3
+	anim_sound 0, 1, SFX_LICK
+	anim_obj ANIM_OBJ_01, -15, 0,   5, 0, $0
+	anim_wait 3
+	anim_sound 0, 1, SFX_LICK
+	anim_obj ANIM_OBJ_01, -15, 0,   4, 0, $0
+	anim_wait 3
+	anim_sound 0, 1, SFX_LICK
+	anim_obj ANIM_OBJ_01, -15, 0,   3, 0, $0
+	anim_wait 8
+	anim_ret
+; cab1d
+
+BattleAnim_PsychicM: ; cab1d
+	anim_1gfx ANIM_GFX_PSYCHIC
+	anim_bgeffect ANIM_BG_ALTERNATE_HUES, $0, $2, $0
+	anim_bgeffect ANIM_BG_PSYCHIC, $0, $0, $0
+.loop
+	anim_sound 6, 2, SFX_PSYCHIC
+	anim_obj ANIM_OBJ_4C,   8, 0,  11, 0, $2
+	anim_wait 8
+	anim_loop 8, .loop
+	anim_wait 96
+	anim_incbgeffect ANIM_BG_PSYCHIC
+	anim_wait 4
+	anim_ret
+; cab3b
+
+BattleAnim_Sludge: ; cab3b
+	anim_1gfx ANIM_GFX_POISON
+	anim_call BattleAnim_Sludge_branch_cbc15
+	anim_wait 56
+	anim_ret
+; cab42
+
+BattleAnim_Toxic: ; cab42
+	anim_1gfx ANIM_GFX_POISON
+	anim_bgeffect ANIM_BG_BLACK_HUES, $0, $8, $0
+	anim_call BattleAnim_Toxic_branch_cbc35
+	anim_wait 32
+	anim_call BattleAnim_Toxic_branch_cbc15
+	anim_wait 64
+	anim_ret
+; cab52
+
+BattleAnim_Metronome: ; cab52
+	anim_2gfx ANIM_GFX_MISC, ANIM_GFX_SPEED
+	anim_sound 0, 0, SFX_METRONOME
+	anim_obj ANIM_OBJ_7A,   9, 0,  11, 0, $0
+.loop
+	anim_obj ANIM_OBJ_7B,   9, 0,  10, 0, $0
+	anim_wait 8
+	anim_loop 5, .loop
+	anim_wait 48
+	anim_ret
+; cab69
+
+BattleAnim_Counter: ; cab69
+	anim_1gfx ANIM_GFX_HIT
+.loop
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $6, $2
+	anim_sound 0, 1, SFX_POUND
+	anim_obj ANIM_OBJ_08,  15, 0,   9, 0, $0
+	anim_obj ANIM_OBJ_00,  15, 0,   9, 0, $0
+	anim_wait 6
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $6, $2
+	anim_sound 0, 1, SFX_COMET_PUNCH
+	anim_obj ANIM_OBJ_06, -15, 0,   5, 0, $0
+	anim_obj ANIM_OBJ_00, -15, 0,   5, 0, $0
+	anim_wait 6
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $6, $2
+	anim_sound 0, 1, SFX_MEGA_KICK
+	anim_obj ANIM_OBJ_07, -13, 0,   7, 0, $0
+	anim_obj ANIM_OBJ_00, -13, 0,   7, 0, $0
+	anim_wait 6
+	anim_loop 3, .loop
+	anim_wait 16
+	anim_ret
+; cabaa
+
+BattleAnim_LowKick: ; cabaa
+	anim_1gfx ANIM_GFX_HIT
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $4, $2
+	anim_sound 0, 1, SFX_DOUBLE_KICK
+	anim_obj ANIM_OBJ_07,  15, 4,   8, 0, $0
+	anim_obj ANIM_OBJ_00,  15, 4,   8, 0, $0
+	anim_wait 6
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $4, $2
+	anim_sound 0, 1, SFX_DOUBLE_KICK
+	anim_obj ANIM_OBJ_07, -16, 4,   8, 0, $0
+	anim_obj ANIM_OBJ_00, -16, 4,   8, 0, $0
+	anim_wait 6
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $4, $2
+	anim_sound 0, 1, SFX_DOUBLE_KICK
+	anim_obj ANIM_OBJ_07, -15, 4,   8, 0, $0
+	anim_obj ANIM_OBJ_00, -15, 4,   8, 0, $0
+	anim_wait 16
+	anim_ret
+; cabe6
+
+BattleAnim_WingAttack: ; cabe6
+	anim_1gfx ANIM_GFX_HIT
+	anim_sound 0, 1, SFX_WING_ATTACK
+	anim_obj ANIM_OBJ_01, -14, 4,   7, 0, $0
+	anim_obj ANIM_OBJ_01,  14, 4,   7, 0, $0
+	anim_wait 6
+	anim_sound 0, 1, SFX_WING_ATTACK
+	anim_obj ANIM_OBJ_01, -14, 0,   7, 0, $0
+	anim_obj ANIM_OBJ_01,  15, 0,   7, 0, $0
+	anim_wait 6
+	anim_sound 0, 1, SFX_WING_ATTACK
+	anim_obj ANIM_OBJ_01, -15, 4,   7, 0, $0
+	anim_obj ANIM_OBJ_01,  15, 4,   7, 0, $0
+	anim_wait 16
+	anim_ret
+; cac13
+
+BattleAnim_Slam: ; cac13
+	anim_1gfx ANIM_GFX_HIT
+	anim_sound 0, 1, SFX_WING_ATTACK
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $2
+	anim_obj ANIM_OBJ_01,  15, 4,   5, 0, $0
+	anim_wait 16
+	anim_ret
+; cac24
+
+BattleAnim_Disable: ; cac24
+	anim_2gfx ANIM_GFX_LIGHTNING, ANIM_GFX_STATUS
+	anim_bgeffect ANIM_BG_06, $0, $2, $0
+	anim_obj ANIM_OBJ_7C, -16, 4,   7, 0, $0
+	anim_wait 16
+	anim_sound 0, 1, SFX_BIND
+	anim_obj ANIM_OBJ_PARALYZED,  13, 0,   7, 0, $42
+	anim_obj ANIM_OBJ_PARALYZED, -12, 0,   7, 0, $c2
+	anim_wait 96
+	anim_ret
+; cac41
+
+BattleAnim_TailWhip: ; cac41
+	anim_1gfx ANIM_GFX_HIT
+	anim_call BattleAnim_FollowPlayerHead_0
+	anim_sound 0, 0, SFX_TAIL_WHIP
+	anim_bgeffect ANIM_BG_26, $0, $1, $0
+	anim_wait 32
+	anim_incbgeffect ANIM_BG_26
+	anim_call BattleAnim_ShowMon_0
+	anim_ret
+; cac55
+
+BattleAnim_Struggle: ; cac55
+	anim_1gfx ANIM_GFX_HIT
+	anim_sound 0, 1, SFX_POUND
+	anim_obj ANIM_OBJ_01, -15, 0,   7, 0, $0
+	anim_wait 16
+	anim_ret
+; cac61
+
+BattleAnim_Sketch: ; cac61
+	anim_1gfx ANIM_GFX_OBJECTS
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_bgeffect ANIM_BG_1A, $0, $1, $20
+	anim_sound 0, 0, SFX_SKETCH
+	anim_obj ANIM_OBJ_98,   9, 0,  10, 0, $0
+	anim_wait 80
+	anim_incbgeffect ANIM_BG_1A
+	anim_call BattleAnim_ShowMon_0
+	anim_wait 1
+	anim_ret
+; cac7b
+
+BattleAnim_TripleKick: ; cac7b
+	anim_1gfx ANIM_GFX_HIT
+	anim_if_param_equal $1, BattleAnim_TripleKick_branch_cac95
+	anim_if_param_equal $2, BattleAnim_TripleKick_branch_caca5
+	anim_sound 0, 1, SFX_MEGA_KICK
+	anim_obj ANIM_OBJ_07, -14, 0,   6, 0, $0
+	anim_wait 6
+	anim_obj ANIM_OBJ_01, -14, 0,   6, 0, $0
+	anim_wait 8
+	anim_ret
+; cac95
+
+BattleAnim_TripleKick_branch_cac95: ; cac95
+	anim_sound 0, 1, SFX_DOUBLE_KICK
+	anim_obj ANIM_OBJ_07,  15, 0,   8, 0, $0
+	anim_wait 6
+	anim_obj ANIM_OBJ_01,  15, 0,   8, 0, $0
+	anim_wait 8
+	anim_ret
+; caca5
+
+BattleAnim_TripleKick_branch_caca5: ; caca5
+	anim_sound 0, 1, SFX_DOUBLE_KICK
+	anim_obj ANIM_OBJ_07, -16, 4,   4, 0, $0
+	anim_wait 6
+	anim_obj ANIM_OBJ_01, -16, 4,   4, 0, $0
+	anim_wait 8
+	anim_ret
+; cacb5
+
+BattleAnim_Thief: ; cacb5
+	anim_1gfx ANIM_GFX_HIT
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_bgeffect ANIM_BG_TACKLE, $0, $1, $0
+	anim_wait 16
+	anim_sound 0, 1, SFX_THIEF
+	anim_obj ANIM_OBJ_01,  16, 0,   6, 0, $0
+	anim_wait 16
+	anim_call BattleAnim_ShowMon_0
+	anim_wait 1
+	anim_1gfx ANIM_GFX_STATUS
+	anim_sound 0, 1, SFX_THIEF_2
+	anim_obj ANIM_OBJ_8B,  15, 0,   9, 4, $1
+	anim_wait 64
+	anim_ret
+; cacd9
+
+BattleAnim_SpiderWeb: ; cacd9
+	anim_1gfx ANIM_GFX_WEB
+	anim_bgeffect ANIM_BG_07, $0, $2, $0
+	anim_obj ANIM_OBJ_92, -16, 4,   6, 0, $0
+	anim_sound 6, 2, SFX_SPIDER_WEB
+	anim_obj ANIM_OBJ_5A,   8, 0,  10, 0, $0
+	anim_wait 4
+	anim_obj ANIM_OBJ_5A,   8, 0,  11, 0, $0
+	anim_wait 4
+	anim_obj ANIM_OBJ_5A,   8, 0,  10, 4, $0
+	anim_wait 64
+	anim_ret
+; cacfb
+
+BattleAnim_MindReader: ; cacfb
+	anim_1gfx ANIM_GFX_MISC
+	anim_sound 0, 1, SFX_MIND_READER
+.loop
+	anim_obj ANIM_OBJ_88, -16, 4,   6, 0, $3
+	anim_obj ANIM_OBJ_88, -16, 4,   6, 0, $12
+	anim_obj ANIM_OBJ_88, -16, 4,   6, 0, $20
+	anim_obj ANIM_OBJ_88, -16, 4,   6, 0, $31
+	anim_wait 16
+	anim_loop 2, .loop
+	anim_wait 32
+	anim_ret
+; cad1b
+
+BattleAnim_Nightmare: ; cad1b
+	anim_1gfx ANIM_GFX_ANGELS
+	anim_bgp $1b
+	anim_obp0 $f
+	anim_obj ANIM_OBJ_94, -16, 4,   5, 0, $0
+	anim_obj ANIM_OBJ_94, -16, 4,   5, 0, $a0
+	anim_sound 0, 1, SFX_NIGHTMARE
+	anim_wait 96
+	anim_ret
+; cad30
+
+BattleAnim_FlameWheel: ; cad30
+	anim_1gfx ANIM_GFX_FIRE
+.loop
+	anim_sound 0, 0, SFX_EMBER
+	anim_obj ANIM_OBJ_7F,   6, 0,  12, 0, $0
+	anim_wait 6
+	anim_loop 8, .loop
+	anim_wait 96
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_bgeffect ANIM_BG_TACKLE, $0, $1, $0
+	anim_wait 4
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $4, $3
+	anim_sound 0, 1, SFX_EMBER
+	anim_obj ANIM_OBJ_0F, -15, 0,   6, 0, $1
+	anim_obj ANIM_OBJ_0F, -15, 0,   6, 0, $4
+	anim_obj ANIM_OBJ_0F, -15, 0,   6, 0, $5
+	anim_wait 8
+	anim_bgeffect ANIM_BG_SHOW_MON, $0, $0, $0
+	anim_wait 4
+	anim_incobj  9
+	anim_wait 8
+	anim_ret
+; cad6b
+
+BattleAnim_Snore: ; cad6b
+	anim_2gfx ANIM_GFX_STATUS, ANIM_GFX_NOISE
+	anim_obj ANIM_OBJ_54,   8, 0,  10, 0, $0
+	anim_wait 32
+	anim_bgeffect ANIM_BG_1F, $60, $2, $0
+	anim_sound 0, 0, SFX_SNORE
+.loop
+	anim_call BattleAnim_Snore_branch_cbbbc
+	anim_wait 16
+	anim_loop 2, .loop
+	anim_wait 8
+	anim_ret
+; cad86
+
+BattleAnim_Curse: ; cad86
+	anim_if_param_equal $1, .NotGhost
+	anim_2gfx ANIM_GFX_HIT, ANIM_GFX_OBJECTS
+	anim_obj ANIM_OBJ_A5,   8, 4,   9, 0, $0
+	anim_sound 0, 0, SFX_CURSE
+	anim_wait 32
+	anim_incobj  1
+	anim_wait 12
+	anim_sound 0, 0, SFX_POISON_STING
+	anim_obj ANIM_OBJ_04,   5, 4,  12, 0, $0
+	anim_wait 16
+	anim_ret
+; cada3
+
+.NotGhost: ; cada3
+	anim_1gfx ANIM_GFX_SPEED
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_bgeffect ANIM_BG_19, $0, $1, $40
+	anim_sound 0, 0, SFX_SHARPEN
+	anim_wait 64
+	anim_incbgeffect ANIM_BG_19
+	anim_wait 1
+	anim_bgeffect ANIM_BG_16, $0, $1, $40
+.loop
+	anim_sound 0, 0, SFX_SWORDS_DANCE
+	anim_obj ANIM_OBJ_47,   5, 4,  13, 4, $6
+	anim_wait 2
+	anim_obj ANIM_OBJ_47,   4, 4,  13, 4, $6
+	anim_wait 2
+	anim_obj ANIM_OBJ_47,   6, 4,  13, 4, $8
+	anim_wait 2
+	anim_obj ANIM_OBJ_47,   3, 4,  13, 4, $8
+	anim_wait 2
+	anim_obj ANIM_OBJ_47,   7, 4,  13, 4, $6
+	anim_wait 2
+	anim_obj ANIM_OBJ_47,   2, 4,  13, 4, $8
+	anim_wait 2
+	anim_obj ANIM_OBJ_47,   8, 4,  13, 4, $8
+	anim_wait 2
+	anim_loop 3, .loop
+	anim_wait 8
+	anim_incbgeffect ANIM_BG_16
+	anim_call BattleAnim_ShowMon_0
+	anim_ret
+; cadf1
+
+BattleAnim_Flail: ; cadf1
+	anim_1gfx ANIM_GFX_HIT
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_sound 0, 0, SFX_SUBMISSION
+	anim_bgeffect ANIM_BG_2C, $0, $1, $0
+	anim_wait 8
+	anim_obj ANIM_OBJ_01,  15, 0,   6, 0, $0
+	anim_wait 8
+	anim_obj ANIM_OBJ_01, -13, 0,   6, 0, $0
+	anim_wait 8
+	anim_obj ANIM_OBJ_01, -15, 0,   6, 0, $0
+	anim_wait 8
+	anim_incbgeffect ANIM_BG_2C
+	anim_call BattleAnim_ShowMon_0
+	anim_ret
+; cae17
+
+BattleAnim_Conversion: ; cae17
+	anim_1gfx ANIM_GFX_EXPLOSION
+	anim_bgeffect ANIM_BG_ALTERNATE_HUES, $0, $2, $0
+	anim_sound 63, 3, SFX_SHARPEN
+	anim_obj ANIM_OBJ_91,   6, 0,  11, 0, $0
+	anim_obj ANIM_OBJ_91,   6, 0,  11, 0, $8
+	anim_obj ANIM_OBJ_91,   6, 0,  11, 0, $10
+	anim_obj ANIM_OBJ_91,   6, 0,  11, 0, $18
+	anim_obj ANIM_OBJ_91,   6, 0,  11, 0, $20
+	anim_obj ANIM_OBJ_91,   6, 0,  11, 0, $28
+	anim_obj ANIM_OBJ_91,   6, 0,  11, 0, $30
+	anim_obj ANIM_OBJ_91,   6, 0,  11, 0, $38
+	anim_wait 128
+	anim_ret
+; cae4b
+
+BattleAnim_Aeroblast: ; cae4b
+	anim_2gfx ANIM_GFX_BEAM, ANIM_GFX_AEROBLAST
+	anim_bgp $1b
+	anim_bgeffect ANIM_BG_1F, $50, $4, $10
+	anim_bgeffect ANIM_BG_06, $0, $2, $0
+	anim_sound 0, 0, SFX_AEROBLAST
+	anim_obj ANIM_OBJ_B3,   9, 0,  11, 0, $0
+	anim_wait 32
+	anim_sound 0, 0, SFX_HYPER_BEAM
+	anim_obj ANIM_OBJ_27,  10, 0,  10, 4, $0
+	anim_wait 2
+	anim_sound 0, 1, SFX_HYPER_BEAM
+	anim_obj ANIM_OBJ_27,  12, 0,   9, 4, $0
+	anim_wait 2
+	anim_sound 0, 1, SFX_HYPER_BEAM
+	anim_obj ANIM_OBJ_27,  14, 0,   8, 4, $0
+	anim_obj ANIM_OBJ_28,  15, 6,   7, 6, $0
+	anim_wait 48
+	anim_ret
+; cae84
+
+BattleAnim_CottonSpore: ; cae84
+	anim_obp0 $54
+	anim_1gfx ANIM_GFX_MISC
+	anim_sound 0, 1, SFX_POWDER
+.loop ; cae8b
+	anim_obj ANIM_OBJ_COTTON_SPORE, -16, 4,   4, 0, $0
+	anim_wait 8
+	anim_loop 5, .loop
+	anim_wait 96
+	anim_ret
+; cae97
+
+BattleAnim_Reversal: ; cae97
+	anim_2gfx ANIM_GFX_SHINE, ANIM_GFX_HIT
+	anim_bgeffect ANIM_BG_07, $0, $0, $0
+	anim_sound 0, 1, SFX_MEGA_PUNCH
+	anim_obj ANIM_OBJ_04,  14, 0,   8, 0, $0
+	anim_wait 2
+	anim_sound 0, 1, SFX_SHINE
+	anim_obj ANIM_OBJ_A7,  15, 0,   7, 0, $0
+	anim_wait 2
+	anim_sound 0, 1, SFX_MEGA_PUNCH
+	anim_obj ANIM_OBJ_04,  16, 0,   7, 0, $0
+	anim_wait 2
+	anim_sound 0, 1, SFX_SHINE
+	anim_obj ANIM_OBJ_A7, -15, 0,   6, 0, $0
+	anim_wait 2
+	anim_sound 0, 1, SFX_MEGA_PUNCH
+	anim_obj ANIM_OBJ_04, -14, 0,   6, 0, $0
+	anim_wait 2
+	anim_sound 0, 1, SFX_SHINE
+	anim_obj ANIM_OBJ_A7, -13, 0,   5, 0, $0
+	anim_wait 24
+	anim_ret
+; caed6
+
+BattleAnim_Spite: ; caed6
+	anim_1gfx ANIM_GFX_ANGELS
+	anim_obj ANIM_OBJ_A4, -16, 4,   2, 0, $0
+	anim_sound 0, 1, SFX_SPITE
+	anim_wait 96
+	anim_ret
+; caee2
+
+BattleAnim_PowderSnow: ; caee2
+	anim_1gfx ANIM_GFX_ICE
+.loop ; caee4
+	anim_sound 6, 2, SFX_SHINE
+	anim_obj ANIM_OBJ_8F,   8, 0,  11, 0, $23
+	anim_wait 2
+	anim_sound 6, 2, SFX_SHINE
+	anim_obj ANIM_OBJ_8F,   8, 0,  10, 0, $24
+	anim_wait 2
+	anim_sound 6, 2, SFX_SHINE
+	anim_obj ANIM_OBJ_8F,   8, 0,  12, 0, $23
+	anim_wait 2
+	anim_loop 2, .loop
+	anim_bgeffect ANIM_BG_WHITE_HUES, $0, $8, $0
+	anim_wait 40
+	anim_call BattleAnim_PowderSnow_branch_cbbdf
+	anim_wait 32
+	anim_ret
+; caf0e
+
+BattleAnim_Protect: ; caf0e
+	anim_1gfx ANIM_GFX_OBJECTS
+	anim_bgeffect ANIM_BG_07, $0, $2, $0
+	anim_obj ANIM_OBJ_8A,  10, 0,  10, 0, $0
+	anim_obj ANIM_OBJ_8A,  10, 0,  10, 0, $d
+	anim_obj ANIM_OBJ_8A,  10, 0,  10, 0, $1a
+	anim_obj ANIM_OBJ_8A,  10, 0,  10, 0, $27
+	anim_obj ANIM_OBJ_8A,  10, 0,  10, 0, $34
+	anim_sound 0, 0, SFX_PROTECT
+	anim_wait 96
+	anim_ret
+; caf33
+
+BattleAnim_MachPunch: ; caf33
+	anim_2gfx ANIM_GFX_SPEED, ANIM_GFX_HIT
+	anim_bgeffect ANIM_BG_HIDE_MON, $0, $1, $0
+	anim_sound 0, 0, SFX_MENU
+	anim_obj ANIM_OBJ_77,   3, 0,  11, 0, $2
+	anim_obj ANIM_OBJ_77,   4, 0,  11, 0, $1
+	anim_obj ANIM_OBJ_77,   5, 0,  11, 0, $0
+	anim_obj ANIM_OBJ_77,   6, 0,  11, 0, $80
+	anim_obj ANIM_OBJ_77,   7, 0,  11, 0, $81
+	anim_obj ANIM_OBJ_77,   8, 0,  11, 0, $82
+	anim_wait 12
+	anim_sound 0, 1, SFX_MEGA_PUNCH
+	anim_obj ANIM_OBJ_06, -15, 0,   7, 0, $0
+	anim_wait 6
+	anim_obj ANIM_OBJ_01, -15, 0,   7, 0, $0
+	anim_wait 8
+	anim_bgeffect ANIM_BG_SHOW_MON, $0, $1, $0
+	anim_wait 16
+	anim_ret
+; caf73
+
+BattleAnim_ScaryFace: ; caf73
+	anim_1gfx ANIM_GFX_BEAM
+	anim_bgeffect ANIM_BG_ALTERNATE_HUES, $0, $2, $0
+	anim_bgeffect ANIM_BG_06, $0, $2, $0
+	anim_call BattleAnim_ScaryFace_branch_cbadc
+	anim_wait 64
+	anim_ret
+; caf84
+
+BattleAnim_FaintAttack: ; caf84
+	anim_1gfx ANIM_GFX_HIT
+	anim_sound 0, 0, SFX_CURSE
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_bgeffect ANIM_BG_1D, $0, $1, $80
+	anim_wait 96
+	anim_sound 0, 1, SFX_COMET_PUNCH
+	anim_obj ANIM_OBJ_04,  15, 0,   4, 0, $0
+	anim_wait 8
+	anim_sound 0, 1, SFX_COMET_PUNCH
+	anim_obj ANIM_OBJ_04, -13, 0,   5, 0, $0
+	anim_wait 8
+	anim_sound 0, 1, SFX_COMET_PUNCH
+	anim_obj ANIM_OBJ_04, -15, 0,   6, 0, $0
+	anim_wait 32
+	anim_incbgeffect ANIM_BG_1D
+	anim_call BattleAnim_ShowMon_0
+	anim_wait 4
+	anim_ret
+; cafb4
+
+BattleAnim_SweetKiss: ; cafb4
+	anim_2gfx ANIM_GFX_OBJECTS, ANIM_GFX_ANGELS
+	anim_bgeffect ANIM_BG_07, $0, $2, $0
+	anim_obj ANIM_OBJ_97,  12, 0,   5, 0, $0
+	anim_sound 0, 1, SFX_SWEET_KISS
+	anim_wait 32
+	anim_sound 0, 1, SFX_SWEET_KISS_2
+	anim_obj ANIM_OBJ_HEART,  15, 0,   5, 0, $0
+	anim_wait 40
+	anim_ret
+; cafcf
+
+BattleAnim_BellyDrum: ; cafcf
+	anim_2gfx ANIM_GFX_HIT, ANIM_GFX_NOISE
+	anim_sound 0, 0, SFX_BELLY_DRUM
+	anim_obj ANIM_OBJ_AA,   8, 0,  13, 0, $0
+	anim_obj ANIM_OBJ_AB,   8, 0,  11, 4, $f8
+	anim_wait 24
+	anim_sound 0, 0, SFX_BELLY_DRUM
+	anim_obj ANIM_OBJ_AA,   8, 0,  13, 0, $0
+	anim_obj ANIM_OBJ_AB,   8, 0,  11, 4, $f8
+	anim_wait 24
+	anim_sound 0, 0, SFX_BELLY_DRUM
+	anim_obj ANIM_OBJ_AA,   8, 0,  13, 0, $0
+	anim_obj ANIM_OBJ_AB,   8, 0,  11, 4, $f8
+	anim_wait 12
+	anim_sound 0, 0, SFX_BELLY_DRUM
+	anim_obj ANIM_OBJ_AA,   8, 0,  13, 0, $0
+	anim_obj ANIM_OBJ_AB,   8, 0,  11, 4, $f8
+	anim_wait 12
+	anim_sound 0, 0, SFX_BELLY_DRUM
+	anim_obj ANIM_OBJ_AA,   8, 0,  13, 0, $0
+	anim_obj ANIM_OBJ_AB,   8, 0,  11, 4, $f8
+	anim_wait 24
+	anim_sound 0, 0, SFX_BELLY_DRUM
+	anim_obj ANIM_OBJ_AA,   8, 0,  13, 0, $0
+	anim_obj ANIM_OBJ_AB,   8, 0,  11, 4, $f8
+	anim_wait 12
+	anim_sound 0, 0, SFX_BELLY_DRUM
+	anim_obj ANIM_OBJ_AA,   8, 0,  13, 0, $0
+	anim_obj ANIM_OBJ_AB,   8, 0,  11, 4, $f8
+	anim_wait 12
+	anim_sound 0, 0, SFX_BELLY_DRUM
+	anim_obj ANIM_OBJ_AA,   8, 0,  13, 0, $0
+	anim_obj ANIM_OBJ_AB,   8, 0,  11, 4, $f8
+	anim_wait 12
+	anim_sound 0, 0, SFX_BELLY_DRUM
+	anim_obj ANIM_OBJ_AA,   8, 0,  13, 0, $0
+	anim_obj ANIM_OBJ_AB,   8, 0,  11, 4, $f8
+	anim_wait 12
+	anim_ret
+; cb051
+
+BattleAnim_SludgeBomb: ; cb051
+	anim_2gfx ANIM_GFX_EGG, ANIM_GFX_POISON
+	anim_bgeffect ANIM_BG_BLACK_HUES, $0, $8, $0
+	anim_sound 6, 2, SFX_SLUDGE_BOMB
+	anim_obj ANIM_OBJ_62,   8, 0,  11, 4, $10
+	anim_wait 36
+	anim_call BattleAnim_SludgeBomb_branch_cbc15
+	anim_wait 64
+	anim_ret
+; cb067
+
+BattleAnim_MudSlap: ; cb067
+	anim_1gfx ANIM_GFX_SAND
+	anim_obp0 $fc
+	anim_call BattleAnim_MudSlap_branch_cbc5b
+	anim_ret
+; cb06f
+
+BattleAnim_Octazooka: ; cb06f
+	anim_3gfx ANIM_GFX_HAZE, ANIM_GFX_EGG, ANIM_GFX_SMOKE
+	anim_sound 6, 2, SFX_SLUDGE_BOMB
+	anim_obj ANIM_OBJ_8C,   8, 0,  11, 4, $4
+	anim_wait 16
+	anim_obj ANIM_OBJ_BALL_POOF, -16, 4,   7, 0, $10
+	anim_wait 8
+	anim_if_param_equal $0, .done
+.loop
+	anim_obj ANIM_OBJ_74, -16, 4,   7, 4, $20
+	anim_wait 8
+	anim_loop 5, .loop
+	anim_wait 128
+.done
+	anim_ret
+; cb092
+
+BattleAnim_Spikes: ; cb092
+	anim_1gfx ANIM_GFX_MISC
+	anim_sound 6, 2, SFX_MENU
+	anim_obj ANIM_OBJ_SPIKES,   6, 0,  11, 0, $20
+	anim_wait 8
+	anim_sound 6, 2, SFX_MENU
+	anim_obj ANIM_OBJ_SPIKES,   6, 0,  11, 0, $30
+	anim_wait 8
+	anim_sound 6, 2, SFX_MENU
+	anim_obj ANIM_OBJ_SPIKES,   6, 0,  11, 0, $28
+	anim_wait 64
+	anim_ret
+; cb0b0
+
+BattleAnim_ZapCannon: ; cb0b0
+	anim_2gfx ANIM_GFX_LIGHTNING, ANIM_GFX_EXPLOSION
+	anim_bgp $1b
+	anim_obp0 $30
+	anim_sound 6, 2, SFX_ZAP_CANNON
+	anim_obj ANIM_OBJ_A3,   8, 0,  11, 4, $2
+	anim_wait 40
+	anim_sound 0, 1, SFX_THUNDERSHOCK
+	anim_obj ANIM_OBJ_LIGHTNING_BOLT, -15, 0,   7, 0, $2
+	anim_wait 16
+	anim_obj ANIM_OBJ_31, -15, 0,   7, 0, $0
+	anim_wait 128
+	anim_ret
+; cb0d0
+
+BattleAnim_Foresight: ; cb0d0
+	anim_1gfx ANIM_GFX_SHINE
+	anim_call BattleAnim_FollowEnemyFeet_1
+	anim_bgeffect ANIM_BG_07, $0, $0, $0
+	anim_sound 0, 1, SFX_FORESIGHT
+	anim_obj ANIM_OBJ_A7, -16, 4,   5, 0, $0
+	anim_wait 24
+	anim_bgeffect ANIM_BG_19, $0, $0, $40
+	anim_wait 64
+	anim_incbgeffect ANIM_BG_19
+	anim_call BattleAnim_ShowMon_1
+	anim_wait 8
+	anim_ret
+; cb0f0
+
+BattleAnim_DestinyBond: ; cb0f0
+	anim_1gfx ANIM_GFX_ANGELS
+	anim_bgp $1b
+	anim_obp0 $0
+	anim_if_param_equal $1, BattleAnim_DestinyBond_branch_cb104
+	anim_sound 6, 2, SFX_WHIRLWIND
+	anim_obj ANIM_OBJ_9B,   5, 4,  15, 0, $2
+	anim_wait 128
+	anim_ret
+; cb104
+
+BattleAnim_DestinyBond_branch_cb104: ; cb104
+	anim_obj ANIM_OBJ_9B, -16, 4,   9, 4, $0
+	anim_sound 0, 1, SFX_KINESIS
+	anim_bgeffect ANIM_BG_RETURN_MON, $0, $0, $0
+	anim_wait 32
+	anim_ret
+; cb113
+
+BattleAnim_PerishSong: ; cb113
+	anim_1gfx ANIM_GFX_NOISE
+	anim_bgeffect ANIM_BG_06, $0, $2, $0
+	anim_bgeffect ANIM_BG_ALTERNATE_HUES, $0, $2, $0
+	anim_sound 0, 2, SFX_PERISH_SONG
+	anim_obj ANIM_OBJ_PERISH_SONG,  11, 0,   0, 0, $0
+	anim_obj ANIM_OBJ_PERISH_SONG,  11, 0,   0, 0, $8
+	anim_obj ANIM_OBJ_PERISH_SONG,  11, 0,   0, 0, $10
+	anim_obj ANIM_OBJ_PERISH_SONG,  11, 0,   0, 0, $18
+	anim_obj ANIM_OBJ_PERISH_SONG,  11, 0,   0, 0, $20
+	anim_obj ANIM_OBJ_PERISH_SONG,  11, 0,   0, 0, $28
+	anim_obj ANIM_OBJ_PERISH_SONG,  11, 0,   0, 0, $30
+	anim_obj ANIM_OBJ_PERISH_SONG,  11, 0,   0, 0, $38
+	anim_wait 112
+	anim_ret
+; cb14c
+
+BattleAnim_IcyWind: ; cb14c
+	anim_1gfx ANIM_GFX_SPEED
+	anim_bgeffect ANIM_BG_06, $0, $2, $0
+	anim_bgeffect ANIM_BG_ALTERNATE_HUES, $0, $2, $0
+	anim_playerheadobj
+	anim_sound 0, 0, SFX_PSYCHIC
+.loop
+	anim_wait 8
+	anim_obj ANIM_OBJ_AE,   8, 0,  11, 0, $4
+	anim_wait 8
+	anim_obj ANIM_OBJ_AE,   8, 0,  10, 0, $4
+	anim_wait 8
+	anim_obj ANIM_OBJ_AE,   8, 0,  12, 0, $4
+	anim_wait 8
+	anim_loop 2, .loop
+	anim_wait 16
+	anim_bgeffect ANIM_BG_HEAD_FOLLOW, $0, $1, $0
+	anim_wait 6
+	anim_bgeffect ANIM_BG_NIGHT_SHADE, $0, $0, $8
+	anim_wait 64
+	anim_incbgeffect ANIM_BG_NIGHT_SHADE
+	anim_bgeffect ANIM_BG_SHOW_MON, $0, $1, $0
+	anim_wait 4
+	anim_incobj  7
+	anim_wait 1
+	anim_ret
+; cb18c
+
+BattleAnim_Detect: ; cb18c
+	anim_1gfx ANIM_GFX_SHINE
+	anim_bgeffect ANIM_BG_07, $0, $0, $0
+	anim_sound 0, 0, SFX_FORESIGHT
+	anim_obj ANIM_OBJ_A7,   8, 0,  11, 0, $0
+	anim_wait 24
+	anim_ret
+; cb19d
+
+BattleAnim_BoneRush: ; cb19d
+	anim_2gfx ANIM_GFX_HIT, ANIM_GFX_MISC
+	anim_sound 0, 1, SFX_BONE_CLUB
+	anim_obj ANIM_OBJ_69, -16, 4,   7, 0, $2
+	anim_wait 16
+	anim_sound 0, 1, SFX_COMET_PUNCH
+	anim_obj ANIM_OBJ_01,  15, 0,   6, 0, $0
+	anim_wait 16
+	anim_sound 0, 1, SFX_COMET_PUNCH
+	anim_obj ANIM_OBJ_01, -14, 0,   8, 0, $0
+	anim_wait 16
+	anim_ret
+; cb1bc
+
+BattleAnim_LockOn: ; cb1bc
+	anim_1gfx ANIM_GFX_MISC
+	anim_sound 0, 1, SFX_MIND_READER
+.loop
+	anim_obj ANIM_OBJ_87, -16, 4,   6, 0, $3
+	anim_obj ANIM_OBJ_87, -16, 4,   6, 0, $12
+	anim_obj ANIM_OBJ_87, -16, 4,   6, 0, $20
+	anim_obj ANIM_OBJ_87, -16, 4,   6, 0, $31
+	anim_wait 16
+	anim_loop 2, .loop
+	anim_wait 32
+	anim_ret
+; cb1dc
+
+BattleAnim_Outrage: ; cb1dc
+	anim_1gfx ANIM_GFX_HIT
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_bgeffect ANIM_BG_1A, $0, $1, $20
+	anim_sound 0, 0, SFX_OUTRAGE
+	anim_wait 72
+	anim_incbgeffect ANIM_BG_1A
+	anim_call BattleAnim_ShowMon_0
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $4, $3
+	anim_sound 0, 1, SFX_MOVE_PUZZLE_PIECE
+	anim_obj ANIM_OBJ_00,  15, 0,   9, 0, $0
+	anim_wait 6
+	anim_sound 0, 1, SFX_COMET_PUNCH
+	anim_obj ANIM_OBJ_00, -15, 0,   7, 0, $0
+	anim_wait 6
+	anim_sound 0, 1, SFX_MEGA_PUNCH
+	anim_obj ANIM_OBJ_00, -13, 0,   5, 0, $0
+	anim_wait 16
+	anim_ret
+; cb210
+
+BattleAnim_Sandstorm: ; cb210
+	anim_1gfx ANIM_GFX_POWDER
+	anim_obj ANIM_OBJ_A2,  11, 0,   0, 0, $0
+	anim_wait 8
+	anim_obj ANIM_OBJ_A2,   9, 0,   0, 0, $1
+	anim_wait 8
+	anim_obj ANIM_OBJ_A2,   7, 0,   0, 0, $2
+.loop
+	anim_sound 0, 1, SFX_MENU
+	anim_wait 8
+	anim_loop 16, .loop
+	anim_wait 8
+	anim_ret
+; cb22d
+
+BattleAnim_GigaDrain: ; cb22d
+	anim_2gfx ANIM_GFX_BUBBLE, ANIM_GFX_CHARGE
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_bgeffect ANIM_BG_1C, $0, $0, $10
+	anim_sound 6, 3, SFX_GIGA_DRAIN
+	anim_call BattleAnim_GigaDrain_branch_cbab3
+	anim_wait 48
+	anim_wait 128
+	anim_incbgeffect ANIM_BG_1C
+	anim_call BattleAnim_ShowMon_0
+	anim_wait 1
+	anim_1gfx ANIM_GFX_SHINE
+	anim_bgeffect ANIM_BG_07, $0, $0, $0
+.loop
+	anim_sound 0, 0, SFX_METRONOME
+	anim_obj ANIM_OBJ_9D,   3, 0,   8, 0, $0
+	anim_wait 5
+	anim_obj ANIM_OBJ_9D,   7, 0,  13, 0, $0
+	anim_wait 5
+	anim_obj ANIM_OBJ_9D,   3, 0,  13, 0, $0
+	anim_wait 5
+	anim_obj ANIM_OBJ_9D,   7, 0,   8, 0, $0
+	anim_wait 5
+	anim_obj ANIM_OBJ_9D,   5, 0,  10, 4, $0
+	anim_wait 5
+	anim_loop 2, .loop
+	anim_wait 32
+	anim_ret
+; cb274
+
+BattleAnim_Endure: ; cb274
+	anim_1gfx ANIM_GFX_SPEED
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_bgeffect ANIM_BG_1A, $0, $1, $20
+	anim_bgeffect ANIM_BG_07, $0, $2, $0
+.loop
+	anim_sound 0, 0, SFX_SWORDS_DANCE
+	anim_obj ANIM_OBJ_47,   5, 4,  13, 4, $6
+	anim_wait 2
+	anim_obj ANIM_OBJ_47,   4, 4,  13, 4, $6
+	anim_wait 2
+	anim_obj ANIM_OBJ_47,   6, 4,  13, 4, $8
+	anim_wait 2
+	anim_obj ANIM_OBJ_47,   3, 4,  13, 4, $8
+	anim_wait 2
+	anim_obj ANIM_OBJ_47,   7, 4,  13, 4, $6
+	anim_wait 2
+	anim_obj ANIM_OBJ_47,   2, 4,  13, 4, $8
+	anim_wait 2
+	anim_obj ANIM_OBJ_47,   8, 4,  13, 4, $8
+	anim_wait 2
+	anim_loop 5, .loop
+	anim_wait 8
+	anim_incbgeffect ANIM_BG_1A
+	anim_call BattleAnim_ShowMon_0
+	anim_ret
+; cb2bb
+
+BattleAnim_Charm: ; cb2bb
+	anim_1gfx ANIM_GFX_OBJECTS
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_bgeffect ANIM_BG_26, $0, $1, $0
+	anim_sound 0, 0, SFX_ATTRACT
+	anim_obj ANIM_OBJ_HEART,   8, 0,  10, 0, $0
+	anim_wait 32
+	anim_incbgeffect ANIM_BG_26
+	anim_call BattleAnim_ShowMon_0
+	anim_wait 4
+	anim_ret
+; cb2d5
+
+BattleAnim_Rollout: ; cb2d5
+	anim_1gfx ANIM_GFX_HIT
+	anim_sound 0, 0, SFX_SPARK
+	anim_call BattleAnim_FollowPlayerHead_0
+	anim_bgeffect ANIM_BG_2E, $60, $1, $1
+	anim_bgeffect ANIM_BG_25, $0, $1, $0
+	anim_wait 4
+	anim_sound 0, 1, SFX_MEGA_PUNCH
+	anim_obj ANIM_OBJ_03, -15, 0,   5, 0, $0
+	anim_wait 8
+	anim_call BattleAnim_ShowMon_0
+	anim_ret
+; cb2f5
+
+BattleAnim_FalseSwipe: ; cb2f5
+	anim_2gfx ANIM_GFX_SHINE, ANIM_GFX_CUT
+	anim_bgeffect ANIM_BG_07, $0, $0, $0
+	anim_sound 0, 1, SFX_CUT
+	anim_obj ANIM_OBJ_3A, -13, 0,   5, 0, $0
+	anim_wait 4
+	anim_obj ANIM_OBJ_9D, -15, 0,   5, 0, $0
+	anim_wait 32
+	anim_ret
+; cb30d
+
+BattleAnim_Swagger: ; cb30d
+	anim_2gfx ANIM_GFX_MISC, ANIM_GFX_WIND
+.loop
+	anim_sound 0, 0, SFX_MENU
+	anim_obj ANIM_OBJ_A9,   9, 0,  11, 0, $44
+	anim_wait 32
+	anim_loop 2, .loop
+	anim_wait 32
+	anim_sound 0, 1, SFX_KINESIS_2
+	anim_obj ANIM_OBJ_83,  13, 0,   5, 0, $0
+	anim_wait 40
+	anim_ret
+; cb328
+
+BattleAnim_MilkDrink: ; cb328
+	anim_2gfx ANIM_GFX_MISC, ANIM_GFX_BUBBLE
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_obj ANIM_OBJ_82,   9, 2,  13, 0, $0
+	anim_wait 16
+	anim_bgeffect ANIM_BG_18, $0, $1, $40
+	anim_sound 0, 0, SFX_MILK_DRINK
+.loop
+	anim_obj ANIM_OBJ_2C,   5, 4,  11, 0, $20
+	anim_wait 8
+	anim_loop 8, .loop
+	anim_wait 128
+	anim_incbgeffect ANIM_BG_18
+	anim_call BattleAnim_ShowMon_0
+	anim_ret
+; cb34d
+
+BattleAnim_Spark: ; cb34d
+	anim_2gfx ANIM_GFX_LIGHTNING, ANIM_GFX_EXPLOSION
+	anim_sound 0, 0, SFX_ZAP_CANNON
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $4, $3
+	anim_obj ANIM_OBJ_30,   6, 0,  11, 4, $0
+	anim_wait 24
+	anim_setobj $1, $3
+	anim_wait 1
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_bgeffect ANIM_BG_TACKLE, $0, $1, $0
+	anim_sound 0, 0, SFX_SPARK
+	anim_wait 16
+	anim_bgeffect ANIM_BG_SHOW_MON, $0, $0, $0
+	anim_wait 4
+	anim_incobj  2
+	anim_wait 1
+	anim_sound 0, 1, SFX_THUNDERSHOCK
+	anim_obj ANIM_OBJ_LIGHTNING_BOLT, -15, 0,   7, 0, $2
+	anim_obj ANIM_OBJ_33, -15, 0,   7, 0, $0
+	anim_wait 32
+	anim_ret
+; cb386
+
+BattleAnim_FuryCutter: ; cb386
+	anim_1gfx ANIM_GFX_CUT
+.loop
+	anim_sound 0, 1, SFX_CUT
+	anim_if_param_and %00000001, .obj1
+	anim_obj ANIM_OBJ_3A, -13, 0,   5, 0, $0
+	anim_jump .okay
+
+.obj1
+	anim_obj ANIM_OBJ_3B,  14, 0,   5, 0, $0
+.okay
+	anim_wait 16
+	anim_jumpuntil .loop
+	anim_ret
+; cb3a1
+
+BattleAnim_SteelWing: ; cb3a1
+	anim_1gfx ANIM_GFX_REFLECT
+	anim_obp0 $0
+	anim_sound 0, 0, SFX_RAGE
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_call BattleAnim_SteelWing_branch_cbc43
+	anim_call BattleAnim_ShowMon_0
+	anim_1gfx ANIM_GFX_HIT
+	anim_resetobp0
+	anim_sound 0, 1, SFX_WING_ATTACK
+	anim_obj ANIM_OBJ_01, -14, 4,   7, 0, $0
+	anim_obj ANIM_OBJ_01,  14, 4,   7, 0, $0
+	anim_wait 6
+	anim_sound 0, 1, SFX_WING_ATTACK
+	anim_obj ANIM_OBJ_01, -14, 0,   7, 0, $0
+	anim_obj ANIM_OBJ_01,  15, 0,   7, 0, $0
+	anim_wait 6
+	anim_sound 0, 1, SFX_WING_ATTACK
+	anim_obj ANIM_OBJ_01, -15, 4,   7, 0, $0
+	anim_obj ANIM_OBJ_01,  15, 4,   7, 0, $0
+	anim_wait 16
+	anim_ret
+; cb3df
+
+BattleAnim_MeanLook: ; cb3df
+	anim_1gfx ANIM_GFX_PSYCHIC
+	anim_obp0 $e0
+	anim_sound 0, 1, SFX_MEAN_LOOK
+	anim_obj ANIM_OBJ_AC, -14, 4,   4, 0, $0
+	anim_wait 5
+	anim_obj ANIM_OBJ_AC,  14, 4,   8, 0, $0
+	anim_wait 5
+	anim_obj ANIM_OBJ_AC, -14, 4,   8, 0, $0
+	anim_wait 5
+	anim_obj ANIM_OBJ_AC,  14, 4,   4, 0, $0
+	anim_wait 5
+	anim_obj ANIM_OBJ_AC, -16, 4,   6, 0, $0
+	anim_wait 128
+	anim_ret
+; cb405
+
+BattleAnim_Attract: ; cb405
+	anim_1gfx ANIM_GFX_OBJECTS
+.loop
+	anim_sound 0, 0, SFX_ATTRACT
+	anim_obj ANIM_OBJ_66,   5, 4,  10, 0, $2
+	anim_wait 8
+	anim_loop 5, .loop
+	anim_wait 128
+	anim_wait 64
+	anim_ret
+; cb417
+
+BattleAnim_SleepTalk: ; cb417
+	anim_1gfx ANIM_GFX_STATUS
+.loop
+	anim_sound 0, 0, SFX_STRENGTH
+	anim_obj ANIM_OBJ_54,   8, 0,  10, 0, $0
+	anim_wait 40
+	anim_loop 2, .loop
+	anim_wait 32
+	anim_ret
+; cb428
+
+BattleAnim_HealBell: ; cb428
+	anim_2gfx ANIM_GFX_MISC, ANIM_GFX_NOISE
+	anim_obj ANIM_OBJ_84,   9, 0,   7, 0, $0
+	anim_wait 32
+.loop
+	anim_sound 0, 0, SFX_HEAL_BELL
+	anim_obj ANIM_OBJ_85,   9, 0,   6, 4, $0
+	anim_wait 8
+	anim_sound 0, 0, SFX_HEAL_BELL
+	anim_obj ANIM_OBJ_85,   9, 0,   6, 4, $1
+	anim_wait 8
+	anim_sound 0, 0, SFX_HEAL_BELL
+	anim_obj ANIM_OBJ_85,   9, 0,   6, 4, $2
+	anim_wait 8
+	anim_sound 0, 0, SFX_HEAL_BELL
+	anim_obj ANIM_OBJ_85,   9, 0,   6, 4, $0
+	anim_wait 8
+	anim_sound 0, 0, SFX_HEAL_BELL
+	anim_obj ANIM_OBJ_85,   9, 0,   6, 4, $2
+	anim_wait 8
+	anim_loop 4, .loop
+	anim_wait 64
+	anim_ret
+; cb464
+
+BattleAnim_Return: ; cb464
+	anim_1gfx ANIM_GFX_HIT
+	anim_call BattleAnim_FollowPlayerHead_0
+	anim_bgeffect ANIM_BG_BOUNCE_DOWN, $0, $1, $0
+	anim_sound 0, 0, SFX_RETURN
+	anim_wait 64
+	anim_incbgeffect ANIM_BG_BOUNCE_DOWN
+	anim_wait 32
+	anim_bgeffect ANIM_BG_25, $0, $1, $0
+	anim_wait 4
+	anim_sound 0, 1, SFX_COMET_PUNCH
+	anim_obj ANIM_OBJ_03, -15, 0,   5, 0, $0
+	anim_wait 8
+	anim_call BattleAnim_ShowMon_0
+	anim_ret
+; cb488
+
+BattleAnim_Present: ; cb488
+	anim_2gfx ANIM_GFX_STATUS, ANIM_GFX_BUBBLE
+	anim_sound 0, 1, SFX_PRESENT
+	anim_obj ANIM_OBJ_8D,   8, 0,  11, 0, $6c
+	anim_wait 56
+	anim_obj ANIM_OBJ_53,  13, 0,   6, 0, $0
+	anim_wait 48
+	anim_incobj  2
+	anim_if_param_equal $3, .heal
+	anim_incobj  1
+	anim_wait 1
+	anim_1gfx ANIM_GFX_EXPLOSION
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $12
+.loop
+	anim_call BattleAnim_Present_branch_cbb8f
+	anim_wait 16
+	anim_jumpuntil .loop
+	anim_ret
+
+.heal
+	anim_sound 0, 1, SFX_METRONOME
+.loop2
+	anim_obj ANIM_OBJ_2C, -16, 4,   6, 0, $24
+	anim_wait 8
+	anim_loop 8, .loop2
+	anim_wait 128
+	anim_ret
+; cb4c1
+
+BattleAnim_Frustration: ; cb4c1
+	anim_1gfx ANIM_GFX_MISC
+	anim_sound 0, 0, SFX_KINESIS_2
+	anim_obj ANIM_OBJ_83,   9, 0,  10, 0, $0
+	anim_wait 40
+	anim_1gfx ANIM_GFX_HIT
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_bgeffect ANIM_BG_26, $0, $1, $0
+	anim_wait 8
+	anim_sound 0, 1, SFX_COMET_PUNCH
+	anim_obj ANIM_OBJ_01,  15, 0,   6, 0, $0
+	anim_wait 8
+	anim_sound 0, 1, SFX_COMET_PUNCH
+	anim_obj ANIM_OBJ_01, -13, 0,   6, 0, $0
+	anim_wait 8
+	anim_sound 0, 1, SFX_COMET_PUNCH
+	anim_obj ANIM_OBJ_01, -15, 0,   6, 0, $0
+	anim_wait 8
+	anim_incbgeffect ANIM_BG_26
+	anim_wait 1
+	anim_call BattleAnim_ShowMon_0
+	anim_ret
+; cb4f9
+
+BattleAnim_Safeguard: ; cb4f9
+	anim_1gfx ANIM_GFX_MISC
+	anim_bgeffect ANIM_BG_06, $0, $2, $0
+	anim_obj ANIM_OBJ_89,  10, 0,  10, 0, $0
+	anim_obj ANIM_OBJ_89,  10, 0,  10, 0, $d
+	anim_obj ANIM_OBJ_89,  10, 0,  10, 0, $1a
+	anim_obj ANIM_OBJ_89,  10, 0,  10, 0, $27
+	anim_obj ANIM_OBJ_89,  10, 0,  10, 0, $34
+	anim_sound 0, 0, SFX_PROTECT
+	anim_wait 96
+	anim_ret
+; cb51e
+
+BattleAnim_PainSplit: ; cb51e
+	anim_2gfx ANIM_GFX_HIT, ANIM_GFX_OBJECTS
+	anim_call BattleAnim_FollowPlayerHead_0
+	anim_bgeffect ANIM_BG_25, $0, $1, $0
+	anim_wait 4
+	anim_sound 0, 1, SFX_TACKLE
+	anim_obj ANIM_OBJ_04,  14, 0,   6, 0, $0
+	anim_obj ANIM_OBJ_04,   9, 4,  12, 0, $0
+	anim_wait 8
+	anim_call BattleAnim_ShowMon_0
+	anim_wait 1
+	anim_ret
+; cb53d
+
+BattleAnim_SacredFire: ; cb53d
+	anim_1gfx ANIM_GFX_FIRE
+	anim_bgeffect ANIM_BG_06, $0, $2, $0
+	anim_bgeffect ANIM_BG_ALTERNATE_HUES, $0, $2, $0
+.loop
+	anim_sound 0, 0, SFX_EMBER
+	anim_obj ANIM_OBJ_80,   6, 0,  13, 0, $0
+	anim_wait 8
+	anim_loop 8, .loop
+	anim_wait 96
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_bgeffect ANIM_BG_TACKLE, $0, $1, $0
+	anim_wait 4
+	anim_sound 0, 1, SFX_EMBER
+	anim_obj ANIM_OBJ_0F, -15, 0,   6, 0, $1
+	anim_obj ANIM_OBJ_0F, -15, 0,   6, 0, $4
+	anim_obj ANIM_OBJ_0F, -15, 0,   6, 0, $5
+	anim_wait 8
+	anim_bgeffect ANIM_BG_SHOW_MON, $0, $0, $0
+	anim_wait 4
+	anim_incobj  9
+	anim_wait 8
+	anim_ret
+; cb57d
+
+BattleAnim_Magnitude: ; cb57d
+	anim_1gfx ANIM_GFX_ROCKS
+.loop
+	anim_bgeffect ANIM_BG_1F, $e, $4, $0
+	anim_sound 0, 1, SFX_STRENGTH
+	anim_obj ANIM_OBJ_1E,  16, 0,   8, 0, $40
+	anim_wait 2
+	anim_obj ANIM_OBJ_1E,  15, 0,   8, 4, $30
+	anim_wait 2
+	anim_obj ANIM_OBJ_1E, -13, 0,   8, 4, $30
+	anim_wait 2
+	anim_obj ANIM_OBJ_1E, -14, 0,   8, 0, $40
+	anim_wait 2
+	anim_obj ANIM_OBJ_1E, -15, 0,   8, 4, $30
+	anim_wait 2
+	anim_jumpuntil .loop
+	anim_wait 96
+	anim_ret
+; cb5aa
+
+BattleAnim_Dynamicpunch: ; cb5aa
+	anim_2gfx ANIM_GFX_HIT, ANIM_GFX_EXPLOSION
+	anim_sound 0, 1, SFX_COMET_PUNCH
+	anim_obj ANIM_OBJ_0A, -15, 0,   7, 0, $43
+	anim_wait 16
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $12
+	anim_call BattleAnim_Dynamicpunch_branch_cbb8f
+	anim_wait 16
+	anim_ret
+; cb5c0
+
+BattleAnim_Megahorn: ; cb5c0
+	anim_2gfx ANIM_GFX_HORN, ANIM_GFX_HIT
+	anim_bgeffect ANIM_BG_1F, $40, $2, $0
+	anim_wait 48
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $3
+	anim_obj ANIM_OBJ_HORN,   9, 0,  10, 0, $1
+	anim_sound 0, 1, SFX_HORN_ATTACK
+	anim_wait 16
+	anim_obj ANIM_OBJ_00, -15, 0,   7, 0, $0
+	anim_wait 16
+	anim_ret
+; cb5de
+
+BattleAnim_Dragonbreath: ; cb5de
+	anim_1gfx ANIM_GFX_FIRE
+	anim_sound 6, 2, SFX_EMBER
+.loop
+	anim_obj ANIM_OBJ_90,   8, 0,  11, 4, $4
+	anim_wait 4
+	anim_loop 10, .loop
+	anim_wait 64
+	anim_ret
+; cb5ef
+
+BattleAnim_BatonPass: ; cb5ef
+	anim_1gfx ANIM_GFX_MISC
+	anim_obj ANIM_OBJ_86,   5, 4,  13, 0, $20
+	anim_sound 0, 0, SFX_BATON_PASS
+	anim_call BattleAnim_BatonPass_branch_c9486
+	anim_wait 64
+	anim_ret
+; cb5fe
+
+BattleAnim_Encore: ; cb5fe
+	anim_1gfx ANIM_GFX_OBJECTS
+	anim_obj ANIM_OBJ_99,   8, 0,  10, 0, $90
+	anim_obj ANIM_OBJ_99,   8, 0,  10, 0, $10
+	anim_sound 0, 0, SFX_ENCORE
+	anim_wait 16
+	anim_obj ANIM_OBJ_9A,   8, 0,   9, 0, $2c
+	anim_wait 32
+	anim_obj ANIM_OBJ_9A,   8, 0,   9, 0, $34
+	anim_wait 16
+	anim_ret
+; cb61b
+
+BattleAnim_Pursuit: ; cb61b
+	anim_1gfx ANIM_GFX_HIT
+	anim_if_param_equal $1, BattleAnim_Pursuit_branch_cb62b
+	anim_sound 0, 1, SFX_COMET_PUNCH
+	anim_obj ANIM_OBJ_01, -15, 0,   7, 0, $0
+	anim_wait 16
+	anim_ret
+; cb62b
+
+BattleAnim_Pursuit_branch_cb62b: ; cb62b
+	anim_bgeffect ANIM_BG_HIDE_MON, $0, $0, $0
+	anim_wait 4
+	anim_call BattleAnim_FollowEnemyFeet_1
+	anim_obj ANIM_OBJ_AD, -16, 4,   8, 0, $0
+	anim_wait 64
+	anim_obj ANIM_OBJ_AD, -16, 4,   8, 0, $1
+	anim_sound 0, 1, SFX_BALL_POOF
+	anim_bgeffect ANIM_BG_ENTER_MON, $0, $0, $0
+	anim_wait 64
+	anim_incobj  3
+	anim_wait 16
+	anim_sound 0, 1, SFX_MEGA_PUNCH
+	anim_obj ANIM_OBJ_00,  15, 0,   7, 0, $0
+	anim_bgeffect ANIM_BG_2D, $0, $0, $0
+	anim_wait 16
+	anim_call BattleAnim_ShowMon_1
+	anim_wait 1
+	anim_ret
+; cb65e
+
+BattleAnim_RapidSpin: ; cb65e
+	anim_2gfx ANIM_GFX_WIND, ANIM_GFX_HIT
+	anim_obp0 $e4
+.loop
+	anim_sound 0, 0, SFX_MENU
+	anim_obj ANIM_OBJ_A8,   5, 4,  14, 0, $0
+	anim_wait 2
+	anim_loop 5, .loop
+	anim_wait 24
+	anim_call BattleAnim_FollowPlayerHead_0
+	anim_bgeffect ANIM_BG_25, $0, $1, $0
+	anim_wait 4
+	anim_resetobp0
+	anim_sound 0, 1, SFX_MEGA_KICK
+	anim_obj ANIM_OBJ_04, -15, 0,   5, 0, $0
+	anim_wait 8
+	anim_bgeffect ANIM_BG_SHOW_MON, $0, $0, $0
+	anim_wait 4
+	anim_incobj  6
+	anim_wait 1
+	anim_ret
+; cb68e
+
+BattleAnim_SweetScent: ; cb68e
+	anim_2gfx ANIM_GFX_FLOWER, ANIM_GFX_MISC
+	anim_sound 0, 0, SFX_SWEET_SCENT
+	anim_obj ANIM_OBJ_FLOWER,   8, 0,  12, 0, $2
+	anim_wait 2
+	anim_obj ANIM_OBJ_FLOWER,   8, 0,  10, 0, $2
+	anim_wait 96
+	anim_obp0 $54
+	anim_sound 0, 1, SFX_SWEET_SCENT_2
+	anim_obj ANIM_OBJ_COTTON, -15, 0,   5, 0, $15
+	anim_obj ANIM_OBJ_COTTON, -15, 0,   5, 0, $2a
+	anim_obj ANIM_OBJ_COTTON, -15, 0,   5, 0, $3f
+	anim_wait 128
+	anim_ret
+; cb6b6
+
+BattleAnim_IronTail: ; cb6b6
+	anim_1gfx ANIM_GFX_REFLECT
+	anim_obp0 $0
+	anim_sound 0, 0, SFX_RAGE
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_call BattleAnim_IronTail_branch_cbc43
+	anim_wait 4
+	anim_1gfx ANIM_GFX_HIT
+	anim_resetobp0
+	anim_bgeffect ANIM_BG_26, $0, $1, $0
+	anim_wait 16
+	anim_sound 0, 1, SFX_MEGA_KICK
+	anim_obj ANIM_OBJ_00, -15, 0,   6, 0, $0
+	anim_wait 16
+	anim_incbgeffect ANIM_BG_26
+	anim_call BattleAnim_ShowMon_0
+	anim_ret
+; cb6dc
+
+BattleAnim_MetalClaw: ; cb6dc
+	anim_1gfx ANIM_GFX_REFLECT
+	anim_obp0 $0
+	anim_sound 0, 0, SFX_RAGE
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_call BattleAnim_MetalClaw_branch_cbc43
+	anim_call BattleAnim_ShowMon_0
+	anim_1gfx ANIM_GFX_CUT
+	anim_resetobp0
+	anim_sound 0, 1, SFX_SCRATCH
+	anim_obj ANIM_OBJ_37, -14, 0,   6, 0, $0
+	anim_obj ANIM_OBJ_37, -15, 4,   5, 4, $0
+	anim_obj ANIM_OBJ_37, -15, 0,   5, 0, $0
+	anim_wait 32
+	anim_ret
+; cb703
+
+BattleAnim_VitalThrow: ; cb703
+	anim_1gfx ANIM_GFX_HIT
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_bgeffect ANIM_BG_2F, $0, $1, $0
+	anim_wait 16
+	anim_sound 0, 0, SFX_MENU
+	anim_obj ANIM_OBJ_04,   8, 0,  12, 0, $0
+	anim_wait 8
+	anim_sound 0, 0, SFX_MENU
+	anim_obj ANIM_OBJ_04,   7, 0,  11, 0, $0
+	anim_wait 8
+	anim_sound 0, 0, SFX_MENU
+	anim_obj ANIM_OBJ_04,   8, 4,  13, 0, $0
+	anim_wait 8
+	anim_incbgeffect ANIM_BG_2F
+	anim_wait 16
+	anim_call BattleAnim_ShowMon_0
+	anim_sound 0, 1, SFX_MEGA_PUNCH
+	anim_obj ANIM_OBJ_03, -16, 4,   7, 0, $0
+	anim_wait 16
+	anim_ret
+; cb739
+
+BattleAnim_MorningSun: ; cb739
+	anim_1gfx ANIM_GFX_SHINE
+	anim_bgeffect ANIM_BG_07, $0, $0, $0
+	anim_sound 0, 0, SFX_MORNING_SUN
+.loop
+	anim_obj ANIM_OBJ_9C,   2, 0,   6, 0, $88
+	anim_wait 6
+	anim_loop 5, .loop
+	anim_wait 32
+	anim_if_param_equal 0, .zero
+	anim_call BattleAnim_MorningSun_branch_cbc6a
+	anim_ret
+; cb756
+
+.zero
+	anim_call BattleAnim_MorningSun_branch_cbc80
+	anim_ret
+; cb75a
+
+BattleAnim_Synthesis: ; cb75a
+	anim_1gfx ANIM_GFX_SHINE
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_bgeffect ANIM_BG_18, $0, $1, $40
+	anim_bgeffect ANIM_BG_07, $0, $0, $0
+	anim_sound 0, 0, SFX_OUTRAGE
+	anim_wait 72
+	anim_incbgeffect ANIM_BG_18
+	anim_call BattleAnim_ShowMon_0
+	anim_if_param_equal $1, .one
+	anim_call BattleAnim_Synthesis_branch_cbc6a
+	anim_ret
+; cb77a
+
+.one
+	anim_call BattleAnim_Synthesis_branch_cbc80
+	anim_ret
+; cb77e
+
+BattleAnim_Crunch: ; cb77e
+	anim_2gfx ANIM_GFX_CUT, ANIM_GFX_HIT
+	anim_bgp $1b
+	anim_obp0 $c0
+	anim_bgeffect ANIM_BG_1F, $20, $2, $0
+	anim_obj ANIM_OBJ_36, -15, 0,   7, 0, $a8
+	anim_obj ANIM_OBJ_36, -15, 0,   7, 0, $28
+	anim_wait 8
+	anim_sound 0, 1, SFX_BITE
+	anim_obj ANIM_OBJ_00, -14, 0,   6, 0, $18
+	anim_wait 16
+	anim_sound 0, 1, SFX_BITE
+	anim_obj ANIM_OBJ_00,  16, 0,   8, 0, $18
+	anim_wait 8
+	anim_ret
+; cb7a8
+
+BattleAnim_Moonlight: ; cb7a8
+	anim_1gfx ANIM_GFX_SHINE
+	anim_bgp $1b
+	anim_bgeffect ANIM_BG_07, $0, $0, $0
+	anim_obj ANIM_OBJ_9E,   0, 0,   5, 0, $0
+	anim_obj ANIM_OBJ_9E,   2, 0,   7, 0, $0
+	anim_obj ANIM_OBJ_9E,   4, 0,   9, 0, $0
+	anim_obj ANIM_OBJ_9E,   6, 0,  11, 0, $0
+	anim_obj ANIM_OBJ_9E,   8, 0,  13, 0, $0
+	anim_wait 1
+	anim_sound 0, 0, SFX_MOONLIGHT
+	anim_wait 63
+	anim_if_param_equal $3, .three
+	anim_call BattleAnim_Moonlight_branch_cbc6a
+	anim_ret
+
+.three
+	anim_call BattleAnim_Moonlight_branch_cbc80
+	anim_ret
+; cb7db
+
+BattleAnim_HiddenPower: ; cb7db
+	anim_1gfx ANIM_GFX_CHARGE
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_bgeffect ANIM_BG_1A, $0, $1, $20
+	anim_bgeffect ANIM_BG_07, $0, $2, $0
+	anim_obj ANIM_OBJ_9F,   5, 4,  11, 0, $0
+	anim_obj ANIM_OBJ_9F,   5, 4,  11, 0, $8
+	anim_obj ANIM_OBJ_9F,   5, 4,  11, 0, $10
+	anim_obj ANIM_OBJ_9F,   5, 4,  11, 0, $18
+	anim_obj ANIM_OBJ_9F,   5, 4,  11, 0, $20
+	anim_obj ANIM_OBJ_9F,   5, 4,  11, 0, $28
+	anim_obj ANIM_OBJ_9F,   5, 4,  11, 0, $30
+	anim_obj ANIM_OBJ_9F,   5, 4,  11, 0, $38
+.loop
+	anim_sound 0, 0, SFX_SWORDS_DANCE
+	anim_wait 8
+	anim_loop 12, .loop
+	anim_incbgeffect ANIM_BG_1A
+	anim_call BattleAnim_ShowMon_0
+	anim_wait 1
+	anim_incobj  2
+	anim_incobj  3
+	anim_incobj  4
+	anim_incobj  5
+	anim_incobj  6
+	anim_incobj  7
+	anim_incobj  8
+	anim_incobj  9
+	anim_wait 16
+	anim_1gfx ANIM_GFX_HIT
+	anim_obj ANIM_OBJ_00, -15, 0,   7, 0, $0
+	anim_wait 32
+	anim_ret
+; cb83a
+
+BattleAnim_CrossChop: ; cb83a
+	anim_1gfx ANIM_GFX_CUT
+	anim_sound 0, 1, SFX_CUT
+	anim_obj ANIM_OBJ_A0, -13, 0,   5, 0, $0
+	anim_obj ANIM_OBJ_A1,  15, 0,   9, 0, $0
+	anim_wait 8
+	anim_bgeffect ANIM_BG_1F, $58, $2, $0
+	anim_wait 92
+	anim_sound 0, 1, SFX_VICEGRIP
+	anim_bgeffect ANIM_BG_FLASH_INVERTED, $0, $8, $10
+	anim_wait 16
+	anim_ret
+; cb85a
+
+BattleAnim_Twister: ; cb85a
+	anim_2gfx ANIM_GFX_WIND, ANIM_GFX_HIT
+.loop1
+	anim_sound 0, 0, SFX_RAZOR_WIND
+	anim_obj ANIM_OBJ_GUST,   8, 0,  14, 0, $0
+	anim_wait 6
+	anim_loop 9, .loop1
+.loop2
+	anim_sound 0, 0, SFX_RAZOR_WIND
+	anim_wait 8
+	anim_loop 8, .loop2
+	anim_incobj  1
+	anim_incobj  2
+	anim_incobj  3
+	anim_incobj  4
+	anim_incobj  5
+	anim_incobj  6
+	anim_incobj  7
+	anim_incobj  8
+	anim_incobj  9
+	anim_wait 64
+	anim_obj ANIM_OBJ_01, -14, 0,   8, 0, $18
+.loop3
+	anim_sound 0, 1, SFX_RAZOR_WIND
+	anim_wait 8
+	anim_loop 4, .loop3
+	anim_obj ANIM_OBJ_01,  16, 0,   4, 0, $18
+.loop4
+	anim_sound 0, 1, SFX_RAZOR_WIND
+	anim_wait 8
+	anim_loop 4, .loop4
+	anim_incobj  1
+	anim_incobj  2
+	anim_incobj  3
+	anim_incobj  4
+	anim_incobj  5
+	anim_incobj  6
+	anim_incobj  7
+	anim_incobj  8
+	anim_incobj  9
+	anim_wait 32
+	anim_ret
+; cb8b3
+
+BattleAnim_RainDance: ; cb8b3
+	anim_1gfx ANIM_GFX_WATER
+	anim_bgp $f8
+	anim_obp0 $7c
+	anim_sound 0, 1, SFX_RAIN_DANCE
+	anim_obj ANIM_OBJ_AF,  11, 0,   0, 0, $0
+	anim_wait 8
+	anim_obj ANIM_OBJ_AF,  11, 0,   0, 0, $1
+	anim_wait 8
+	anim_obj ANIM_OBJ_AF,  11, 0,   0, 0, $2
+	anim_wait 128
+	anim_ret
+; cb8cf
+
+BattleAnim_SunnyDay: ; cb8cf
+	anim_1gfx ANIM_GFX_WATER
+	anim_bgp $90
+	anim_sound 0, 1, SFX_MORNING_SUN
+	anim_obj ANIM_OBJ_AF,  11, 0,   0, 0, $2
+	anim_wait 8
+	anim_obj ANIM_OBJ_AF,  11, 0,   0, 0, $2
+	anim_wait 8
+	anim_obj ANIM_OBJ_AF,  11, 0,   0, 0, $2
+	anim_wait 128
+	anim_ret
+; cb8e9
+
+BattleAnim_MirrorCoat: ; cb8e9
+	anim_2gfx ANIM_GFX_REFLECT, ANIM_GFX_SPEED
+	anim_bgeffect ANIM_BG_06, $0, $2, $0
+.loop
+	anim_sound 0, 0, SFX_SHINE
+	anim_obj ANIM_OBJ_50,   9, 0,  10, 0, $0
+	anim_obj ANIM_OBJ_AE,   8, 0,   9, 0, $4
+	anim_wait 8
+	anim_obj ANIM_OBJ_AE,   8, 0,  11, 0, $4
+	anim_wait 8
+	anim_obj ANIM_OBJ_AE,   8, 0,  10, 0, $4
+	anim_wait 8
+	anim_obj ANIM_OBJ_AE,   8, 0,  12, 0, $4
+	anim_wait 8
+	anim_loop 3, .loop
+	anim_wait 32
+	anim_ret
+; cb917
+
+BattleAnim_PsychUp: ; cb917
+	anim_1gfx ANIM_GFX_STATUS
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_bgeffect ANIM_BG_1A, $0, $1, $20
+	anim_sound 0, 0, SFX_PSYBEAM
+	anim_obj ANIM_OBJ_B1,   5, 4,  11, 0, $0
+	anim_obj ANIM_OBJ_B1,   5, 4,  11, 0, $10
+	anim_obj ANIM_OBJ_B1,   5, 4,  11, 0, $20
+	anim_obj ANIM_OBJ_B1,   5, 4,  11, 0, $30
+	anim_wait 64
+	anim_incbgeffect ANIM_BG_1A
+	anim_call BattleAnim_ShowMon_0
+	anim_wait 16
+	anim_ret
+; cb940
+
+BattleAnim_Extremespeed: ; cb940
+	anim_2gfx ANIM_GFX_SPEED, ANIM_GFX_CUT
+	anim_bgeffect ANIM_BG_HIDE_MON, $0, $1, $0
+	anim_sound 0, 0, SFX_MENU
+	anim_obj ANIM_OBJ_77,   3, 0,  11, 0, $2
+	anim_obj ANIM_OBJ_77,   4, 0,  11, 0, $1
+	anim_obj ANIM_OBJ_77,   5, 0,  11, 0, $0
+	anim_obj ANIM_OBJ_77,   6, 0,  11, 0, $80
+	anim_obj ANIM_OBJ_77,   7, 0,  11, 0, $81
+	anim_obj ANIM_OBJ_77,   8, 0,  11, 0, $82
+	anim_wait 12
+	anim_sound 0, 1, SFX_CUT
+	anim_obj ANIM_OBJ_3A, -13, 0,   5, 0, $0
+	anim_wait 32
+	anim_bgeffect ANIM_BG_SHOW_MON, $0, $1, $0
+	anim_wait 16
+	anim_ret
+; cb97a
+
+BattleAnim_Ancientpower: ; cb97a
+	anim_2gfx ANIM_GFX_ROCKS, ANIM_GFX_HIT
+	anim_sound 0, 0, SFX_SPARK
+	anim_obj ANIM_OBJ_B2,   8, 0,  13, 4, $20
+	anim_wait 8
+	anim_sound 0, 0, SFX_SPARK
+	anim_obj ANIM_OBJ_B2,   9, 3,  12, 6, $20
+	anim_wait 8
+	anim_sound 0, 0, SFX_SPARK
+	anim_obj ANIM_OBJ_B2,  10, 5,  12, 1, $20
+	anim_wait 8
+	anim_sound 0, 0, SFX_SPARK
+	anim_obj ANIM_OBJ_B2,  12, 0,  11, 4, $20
+	anim_wait 8
+	anim_sound 0, 1, SFX_SPARK
+	anim_obj ANIM_OBJ_B2,  13, 2,  10, 7, $20
+	anim_wait 8
+	anim_sound 0, 1, SFX_SPARK
+	anim_obj ANIM_OBJ_B2,  14, 4,  10, 2, $20
+	anim_wait 8
+	anim_sound 0, 1, SFX_SPARK
+	anim_obj ANIM_OBJ_B2,  15, 6,   9, 5, $20
+	anim_wait 8
+	anim_sound 0, 1, SFX_SPARK
+	anim_obj ANIM_OBJ_00, -15, 0,   7, 0, $0
+	anim_wait 6
+	anim_ret
+; cb9c6
+
+BattleAnim_ShadowBall: ; cb9c6
+	anim_2gfx ANIM_GFX_EGG, ANIM_GFX_SMOKE
+	anim_bgp $1b
+	anim_sound 6, 2, SFX_SLUDGE_BOMB
+	anim_obj ANIM_OBJ_B4,   8, 0,  11, 4, $2
+	anim_wait 32
+	anim_obj ANIM_OBJ_BALL_POOF, -16, 4,   7, 0, $10
+	anim_wait 24
+	anim_ret
+; cb9db
+
+BattleAnim_FutureSight: ; cb9db
+	anim_1gfx ANIM_GFX_WIND
+	anim_bgeffect ANIM_BG_06, $0, $2, $0
+	anim_bgeffect ANIM_BG_ALTERNATE_HUES, $0, $2, $0
+	anim_bgeffect ANIM_BG_PSYCHIC, $0, $0, $0
+	anim_obj ANIM_OBJ_7D,   1, 0,   3, 0, $10
+	anim_obj ANIM_OBJ_7D,   1, 0,   6, 0, $2
+	anim_obj ANIM_OBJ_7D,   1, 0,  11, 0, $8
+	anim_wait 4
+	anim_obj ANIM_OBJ_7D,   1, 0,   4, 0, $6
+	anim_obj ANIM_OBJ_7D,   1, 0,   7, 0, $c
+	anim_obj ANIM_OBJ_7D,   1, 0,  10, 0, $4
+	anim_obj ANIM_OBJ_7D,   1, 0,  13, 0, $e
+.loop
+	anim_sound 0, 0, SFX_THROW_BALL
+	anim_wait 16
+	anim_loop 4, .loop
+	anim_incbgeffect ANIM_BG_PSYCHIC
+	anim_ret
+; cba1b
+
+BattleAnim_RockSmash: ; cba1b
+	anim_2gfx ANIM_GFX_ROCKS, ANIM_GFX_HIT
+	anim_sound 0, 1, SFX_SPARK
+	anim_obj ANIM_OBJ_01,  16, 0,   7, 0, $0
+	anim_sound 0, 1, SFX_SPARK
+	anim_obj ANIM_OBJ_B5,  16, 0,   8, 0, $28
+	anim_obj ANIM_OBJ_B5,  16, 0,   8, 0, $5c
+	anim_sound 0, 1, SFX_SPARK
+	anim_obj ANIM_OBJ_B5,  16, 0,   8, 0, $10
+	anim_obj ANIM_OBJ_B5,  16, 0,   8, 0, $e8
+	anim_sound 0, 1, SFX_SPARK
+	anim_obj ANIM_OBJ_B5,  16, 0,   8, 0, $9c
+	anim_obj ANIM_OBJ_B5,  16, 0,   8, 0, $d0
+	anim_wait 6
+	anim_sound 0, 1, SFX_SPARK
+	anim_obj ANIM_OBJ_B5,  16, 0,   8, 0, $1c
+	anim_obj ANIM_OBJ_B5,  16, 0,   8, 0, $50
+	anim_sound 0, 1, SFX_SPARK
+	anim_obj ANIM_OBJ_B5,  16, 0,   8, 0, $dc
+	anim_obj ANIM_OBJ_B5,  16, 0,   8, 0, $90
+	anim_wait 32
+	anim_ret
+; cba6a
+
+BattleAnim_Whirlpool: ; cba6a
+	anim_1gfx ANIM_GFX_WIND
+	anim_bgeffect ANIM_BG_WHIRLPOOL, $0, $0, $0
+	anim_sound 0, 1, SFX_SURF
+	anim_wait 16
+.loop
+	anim_obj ANIM_OBJ_GUST, -16, 4,   9, 0, $0
+	anim_wait 6
+	anim_loop 9, .loop
+	anim_wait 64
+	anim_incbgeffect ANIM_BG_WHIRLPOOL
+	anim_wait 1
+	anim_ret
+; cba84
+
+BattleAnim_BeatUp: ; cba84
+	anim_if_param_equal $0, .current_mon
+	anim_sound 0, 0, SFX_BALL_POOF
+	anim_bgeffect ANIM_BG_RETURN_MON, $0, $1, $0
+	anim_wait 16
+	anim_beatup
+	anim_sound 0, 0, SFX_BALL_POOF
+	anim_bgeffect ANIM_BG_ENTER_MON, $0, $1, $0
+	anim_wait 16
+.current_mon
+	anim_1gfx ANIM_GFX_HIT
+	anim_call BattleAnim_FollowEnemyFeet_0
+	anim_bgeffect ANIM_BG_TACKLE, $0, $1, $0
+	anim_wait 4
+	anim_sound 0, 1, SFX_BEAT_UP
+	anim_obj ANIM_OBJ_00, -15, 0,   6, 0, $0
+	anim_wait 8
+	anim_call BattleAnim_ShowMon_0
+	anim_ret
+; cbab3
+
+BattleAnim_DreamEater_branch_cbab3: ; cbab3
+BattleAnim_GigaDrain_branch_cbab3: ; cbab3
+BattleAnim_LeechLife_branch_cbab3: ; cbab3
+	anim_obj ANIM_OBJ_71, -16, 4,   5, 4, $0
+	anim_obj ANIM_OBJ_71, -16, 4,   5, 4, $8
+	anim_obj ANIM_OBJ_71, -16, 4,   5, 4, $10
+	anim_obj ANIM_OBJ_71, -16, 4,   5, 4, $18
+	anim_obj ANIM_OBJ_71, -16, 4,   5, 4, $20
+	anim_obj ANIM_OBJ_71, -16, 4,   5, 4, $28
+	anim_obj ANIM_OBJ_71, -16, 4,   5, 4, $30
+	anim_obj ANIM_OBJ_71, -16, 4,   5, 4, $38
+	anim_ret
+; cbadc
+
+BattleAnim_Glare_branch_cbadc: ; cbadc
+BattleAnim_Leer_branch_cbadc: ; cbadc
+BattleAnim_ScaryFace_branch_cbadc: ; cbadc
+	anim_sound 6, 2, SFX_LEER
+	anim_obj ANIM_OBJ_4E,   9, 0,  10, 4, $0
+	anim_obj ANIM_OBJ_4E,   8, 0,  10, 0, $0
+	anim_obj ANIM_OBJ_4E,  11, 0,   9, 4, $0
+	anim_obj ANIM_OBJ_4E,  10, 0,   9, 0, $0
+	anim_obj ANIM_OBJ_4E,  13, 0,   8, 4, $0
+	anim_obj ANIM_OBJ_4E,  12, 0,   8, 0, $0
+	anim_obj ANIM_OBJ_4E,  15, 0,   7, 4, $0
+	anim_obj ANIM_OBJ_4E,  14, 0,   7, 0, $0
+	anim_obj ANIM_OBJ_4F, -16, 2,   6, 6, $0
+	anim_obj ANIM_OBJ_4F,  15, 2,   6, 2, $0
+	anim_ret
+; cbb12
+
+BattleAnim_Fly_branch_cbb12: ; cbb12
+BattleAnim_Teleport_branch_cbb12: ; cbb12
+	anim_sound 0, 0, SFX_WARP_TO
+	anim_obj ANIM_OBJ_44,   5, 4,  13, 4, $0
+	anim_obj ANIM_OBJ_44,   5, 4,  12, 4, $0
+	anim_obj ANIM_OBJ_44,   5, 4,  11, 4, $0
+	anim_obj ANIM_OBJ_44,   5, 4,  10, 4, $0
+	anim_obj ANIM_OBJ_44,   5, 4,   9, 4, $0
+	anim_obj ANIM_OBJ_44,   5, 4,   8, 4, $0
+	anim_obj ANIM_OBJ_44,   5, 4,   7, 4, $0
+	anim_ret
+; cbb39
+
+BattleAnim_AuroraBeam_branch_cbb39: ; cbb39
+BattleAnim_HyperBeam_branch_cbb39: ; cbb39
+BattleAnim_Solarbeam_branch_cbb39: ; cbb39
+	anim_sound 0, 0, SFX_HYPER_BEAM
+	anim_obj ANIM_OBJ_27,   8, 0,  11, 4, $0
+	anim_wait 4
+	anim_sound 0, 0, SFX_HYPER_BEAM
+	anim_obj ANIM_OBJ_27,  10, 0,  10, 4, $0
+	anim_wait 4
+	anim_sound 0, 1, SFX_HYPER_BEAM
+	anim_obj ANIM_OBJ_27,  12, 0,   9, 4, $0
+	anim_wait 4
+	anim_sound 0, 1, SFX_HYPER_BEAM
+	anim_obj ANIM_OBJ_27,  14, 0,   8, 4, $0
+	anim_obj ANIM_OBJ_28,  15, 6,   7, 6, $0
+	anim_ret
+; cbb62
+
+BattleAnim_Explosion_branch_cbb62: ; cbb62
+BattleAnim_Selfdestruct_branch_cbb62: ; cbb62
+	anim_sound 0, 0, SFX_EGG_BOMB
+	anim_obj ANIM_OBJ_17,   3, 0,   8, 0, $0
+	anim_wait 5
+	anim_sound 0, 0, SFX_EGG_BOMB
+	anim_obj ANIM_OBJ_17,   7, 0,  13, 0, $0
+	anim_wait 5
+	anim_sound 0, 0, SFX_EGG_BOMB
+	anim_obj ANIM_OBJ_17,   3, 0,  13, 0, $0
+	anim_wait 5
+	anim_sound 0, 0, SFX_EGG_BOMB
+	anim_obj ANIM_OBJ_17,   7, 0,   8, 0, $0
+	anim_wait 5
+	anim_sound 0, 0, SFX_EGG_BOMB
+	anim_obj ANIM_OBJ_17,   5, 0,  10, 4, $0
+	anim_ret
+; cbb8f
+
+BattleAnim_Dynamicpunch_branch_cbb8f: ; cbb8f
+BattleAnim_Explosion_branch_cbb8f: ; cbb8f
+BattleAnim_Present_branch_cbb8f: ; cbb8f
+BattleAnim_Selfdestruct_branch_cbb8f: ; cbb8f
+	anim_sound 0, 1, SFX_EGG_BOMB
+	anim_obj ANIM_OBJ_17, -14, 4,   4, 0, $0
+	anim_wait 5
+	anim_sound 0, 1, SFX_EGG_BOMB
+	anim_obj ANIM_OBJ_17,  14, 4,   9, 0, $0
+	anim_wait 5
+	anim_sound 0, 1, SFX_EGG_BOMB
+	anim_obj ANIM_OBJ_17, -14, 4,   9, 0, $0
+	anim_wait 5
+	anim_sound 0, 1, SFX_EGG_BOMB
+	anim_obj ANIM_OBJ_17,  14, 4,   4, 0, $0
+	anim_wait 5
+	anim_sound 0, 1, SFX_EGG_BOMB
+	anim_obj ANIM_OBJ_17, -16, 4,   6, 4, $0
+	anim_ret
+; cbbbc
+
+BattleAnim_Growl_branch_cbbbc: ; cbbbc
+BattleAnim_Roar_branch_cbbbc: ; cbbbc
+BattleAnim_Snore_branch_cbbbc: ; cbbbc
+	anim_obj ANIM_OBJ_4B,   8, 0,   9, 4, $0
+	anim_obj ANIM_OBJ_4B,   8, 0,  11, 0, $1
+	anim_obj ANIM_OBJ_4B,   8, 0,  12, 4, $2
+	anim_ret
+; cbbcc
+
+BattleAnim_FirePunch_branch_cbbcc: ; cbbcc
+BattleAnim_TriAttack_branch_cbbcc: ; cbbcc
+	anim_sound 0, 1, SFX_EMBER
+.loop
+	anim_obj ANIM_OBJ_BURNED, -15, 0,   7, 0, $10
+	anim_obj ANIM_OBJ_BURNED, -15, 0,   7, 0, $90
+	anim_wait 4
+	anim_loop 4, .loop
+	anim_ret
+; cbbdf
+
+BattleAnim_IcePunch_branch_cbbdf: ; cbbdf
+BattleAnim_PowderSnow_branch_cbbdf: ; cbbdf
+BattleAnim_TriAttack_branch_cbbdf: ; cbbdf
+	anim_sound 0, 1, SFX_SHINE
+	anim_obj ANIM_OBJ_12,  16, 0,   5, 2, $0
+	anim_wait 6
+	anim_sound 0, 1, SFX_SHINE
+	anim_obj ANIM_OBJ_12, -14, 0,   8, 6, $0
+	anim_wait 6
+	anim_sound 0, 1, SFX_SHINE
+	anim_obj ANIM_OBJ_12,  15, 0,   7, 0, $0
+	anim_wait 6
+	anim_sound 0, 1, SFX_SHINE
+	anim_obj ANIM_OBJ_12, -13, 0,   7, 0, $0
+	anim_wait 6
+	anim_sound 0, 1, SFX_SHINE
+	anim_obj ANIM_OBJ_12, -14, 0,   5, 2, $0
+	anim_wait 6
+	anim_sound 0, 1, SFX_SHINE
+	anim_obj ANIM_OBJ_12,  16, 0,   8, 6, $0
+	anim_ret
+; cbc15
+
+BattleAnim_SludgeBomb_branch_cbc15: ; cbc15
+BattleAnim_Sludge_branch_cbc15: ; cbc15
+BattleAnim_Toxic_branch_cbc15: ; cbc15
+.loop
+	anim_sound 0, 1, SFX_UNKNOWN_7F
+	anim_obj ANIM_OBJ_1A, -16, 4,   9, 0, $0
+	anim_wait 8
+	anim_sound 0, 1, SFX_UNKNOWN_7F
+	anim_obj ANIM_OBJ_1A,  14, 4,   9, 0, $0
+	anim_wait 8
+	anim_sound 0, 1, SFX_UNKNOWN_7F
+	anim_obj ANIM_OBJ_1A, -14, 4,   9, 0, $0
+	anim_wait 8
+	anim_loop 5, .loop
+	anim_ret
+; cbc35
+
+BattleAnim_Acid_branch_cbc35: ; cbc35
+BattleAnim_Toxic_branch_cbc35: ; cbc35
+.loop
+	anim_sound 6, 2, SFX_BUBBLEBEAM
+	anim_obj ANIM_OBJ_19,   8, 0,  11, 4, $10
+	anim_wait 5
+	anim_loop 8, .loop
+	anim_ret
+; cbc43
+
+BattleAnim_Harden_branch_cbc43: ; cbc43
+BattleAnim_IronTail_branch_cbc43: ; cbc43
+BattleAnim_MetalClaw_branch_cbc43: ; cbc43
+BattleAnim_SteelWing_branch_cbc43: ; cbc43
+	anim_sound 0, 0, SFX_SHINE
+	anim_bgeffect ANIM_BG_17, $0, $1, $40
+	anim_wait 8
+	anim_obj ANIM_OBJ_51,   6, 0,  10, 4, $0
+	anim_wait 32
+	anim_obj ANIM_OBJ_51,   6, 0,  10, 4, $0
+	anim_wait 64
+	anim_incbgeffect ANIM_BG_17
+	anim_ret
+; cbc5b
+
+BattleAnim_MudSlap_branch_cbc5b: ; cbc5b
+BattleAnim_SandAttack_branch_cbc5b: ; cbc5b
+.loop
+	anim_sound 6, 2, SFX_MENU
+	anim_obj ANIM_OBJ_58,   8, 0,  11, 4, $4
+	anim_wait 4
+	anim_loop 8, .loop
+	anim_wait 32
+	anim_ret
+; cbc6a
+
+BattleAnim_Moonlight_branch_cbc6a: ; cbc6a
+BattleAnim_MorningSun_branch_cbc6a: ; cbc6a
+BattleAnim_Synthesis_branch_cbc6a: ; cbc6a
+	anim_sound 0, 0, SFX_METRONOME
+	anim_obj ANIM_OBJ_9D,   5, 4,   8, 0, $0
+	anim_wait 5
+	anim_obj ANIM_OBJ_9D,   3, 0,  12, 0, $0
+	anim_wait 5
+	anim_obj ANIM_OBJ_9D,   7, 0,  13, 0, $0
+	anim_wait 21
+	anim_ret
+; cbc80
+
+BattleAnim_Moonlight_branch_cbc80: ; cbc80
+BattleAnim_MorningSun_branch_cbc80: ; cbc80
+BattleAnim_Synthesis_branch_cbc80: ; cbc80
+	anim_sound 0, 0, SFX_METRONOME
+.loop
+	anim_obj ANIM_OBJ_9D,   3, 0,   8, 0, $0
+	anim_wait 5
+	anim_obj ANIM_OBJ_9D,   7, 0,  13, 0, $0
+	anim_wait 5
+	anim_obj ANIM_OBJ_9D,   3, 0,  13, 0, $0
+	anim_wait 5
+	anim_obj ANIM_OBJ_9D,   7, 0,   8, 0, $0
+	anim_wait 5
+	anim_obj ANIM_OBJ_9D,   5, 0,  10, 4, $0
+	anim_wait 5
+	anim_loop 2, .loop
+	anim_wait 16
+	anim_ret
+; cbca7
+
+BattleAnim_FollowEnemyFeet_0: ; cbca7
+	anim_enemyfeetobj
+	anim_bgeffect ANIM_BG_FEET_FOLLOW, $0, $0, $0
+	anim_wait 6
+	anim_ret
+; cbcaf
+
+BattleAnim_FollowPlayerHead_0: ; cbcaf
+	anim_playerheadobj
+	anim_bgeffect ANIM_BG_HEAD_FOLLOW, $0, $0, $0
+	anim_wait 6
+	anim_ret
+; cbcb7
+
+BattleAnim_ShowMon_0: ; cbcb7
+	anim_wait 1
+	anim_bgeffect ANIM_BG_SHOW_MON, $0, $0, $0
+	anim_wait 5
+	anim_incobj  1
+	anim_wait 1
+	anim_ret
+; cbcc2
+
+BattleAnim_FollowEnemyFeet_1: ; cbcc2
+	anim_enemyfeetobj
+	anim_bgeffect ANIM_BG_FEET_FOLLOW, $0, $1, $0
+	anim_wait 6
+	anim_ret
+; cbcca
+
+BattleAnim_FollowPlayerHead_1: ; cbcca
+	anim_playerheadobj
+	anim_bgeffect ANIM_BG_HEAD_FOLLOW, $0, $1, $0
+	anim_wait 4
+	anim_ret
+; cbcd2
+
+BattleAnim_ShowMon_1: ; cbcd2
+	anim_wait 1
+	anim_bgeffect ANIM_BG_SHOW_MON, $0, $1, $0
+	anim_wait 4
+	anim_incobj  1
+	anim_wait 1
+	anim_ret
+; cbcdd
--- /dev/null
+++ b/data/moves/move_descriptions.asm
@@ -1,0 +1,1270 @@
+MoveDescriptions:: ; 2cb52
+; entries correspond to move ids (see constants/move_constants.asm)
+	dw PoundDescription
+	dw KarateChopDescription
+	dw DoubleslapDescription
+	dw CometPunchDescription
+	dw MegaPunchDescription
+	dw PayDayDescription
+	dw FirePunchDescription
+	dw IcePunchDescription
+	dw ThunderpunchDescription
+	dw ScratchDescription
+	dw VicegripDescription
+	dw GuillotineDescription
+	dw RazorWindDescription
+	dw SwordsDanceDescription
+	dw CutDescription
+	dw GustDescription
+	dw WingAttackDescription
+	dw WhirlwindDescription
+	dw FlyDescription
+	dw BindDescription
+	dw SlamDescription
+	dw VineWhipDescription
+	dw StompDescription
+	dw DoubleKickDescription
+	dw MegaKickDescription
+	dw JumpKickDescription
+	dw RollingKickDescription
+	dw SandAttackDescription
+	dw HeadbuttDescription
+	dw HornAttackDescription
+	dw FuryAttackDescription
+	dw HornDrillDescription
+	dw TackleDescription
+	dw BodySlamDescription
+	dw WrapDescription
+	dw TakeDownDescription
+	dw ThrashDescription
+	dw DoubleEdgeDescription
+	dw TailWhipDescription
+	dw PoisonStingDescription
+	dw TwineedleDescription
+	dw PinMissileDescription
+	dw LeerDescription
+	dw BiteDescription
+	dw GrowlDescription
+	dw RoarDescription
+	dw SingDescription
+	dw SupersonicDescription
+	dw SonicboomDescription
+	dw DisableDescription
+	dw AcidDescription
+	dw EmberDescription
+	dw FlamethrowerDescription
+	dw MistDescription
+	dw WaterGunDescription
+	dw HydroPumpDescription
+	dw SurfDescription
+	dw IceBeamDescription
+	dw BlizzardDescription
+	dw PsybeamDescription
+	dw BubblebeamDescription
+	dw AuroraBeamDescription
+	dw HyperBeamDescription
+	dw PeckDescription
+	dw DrillPeckDescription
+	dw SubmissionDescription
+	dw LowKickDescription
+	dw CounterDescription
+	dw SeismicTossDescription
+	dw StrengthDescription
+	dw AbsorbDescription
+	dw MegaDrainDescription
+	dw LeechSeedDescription
+	dw GrowthDescription
+	dw RazorLeafDescription
+	dw SolarbeamDescription
+	dw PoisonpowderDescription
+	dw StunSporeDescription
+	dw SleepPowderDescription
+	dw PetalDanceDescription
+	dw StringShotDescription
+	dw DragonRageDescription
+	dw FireSpinDescription
+	dw ThundershockDescription
+	dw ThunderboltDescription
+	dw ThunderWaveDescription
+	dw ThunderDescription
+	dw RockThrowDescription
+	dw EarthquakeDescription
+	dw FissureDescription
+	dw DigDescription
+	dw ToxicDescription
+	dw ConfusionDescription
+	dw PsychicMDescription
+	dw HypnosisDescription
+	dw MeditateDescription
+	dw AgilityDescription
+	dw QuickAttackDescription
+	dw RageDescription
+	dw TeleportDescription
+	dw NightShadeDescription
+	dw MimicDescription
+	dw ScreechDescription
+	dw DoubleTeamDescription
+	dw RecoverDescription
+	dw HardenDescription
+	dw MinimizeDescription
+	dw SmokescreenDescription
+	dw ConfuseRayDescription
+	dw WithdrawDescription
+	dw DefenseCurlDescription
+	dw BarrierDescription
+	dw LightScreenDescription
+	dw HazeDescription
+	dw ReflectDescription
+	dw FocusEnergyDescription
+	dw BideDescription
+	dw MetronomeDescription
+	dw MirrorMoveDescription
+	dw SelfdestructDescription
+	dw EggBombDescription
+	dw LickDescription
+	dw SmogDescription
+	dw SludgeDescription
+	dw BoneClubDescription
+	dw FireBlastDescription
+	dw WaterfallDescription
+	dw ClampDescription
+	dw SwiftDescription
+	dw SkullBashDescription
+	dw SpikeCannonDescription
+	dw ConstrictDescription
+	dw AmnesiaDescription
+	dw KinesisDescription
+	dw SoftboiledDescription
+	dw HiJumpKickDescription
+	dw GlareDescription
+	dw DreamEaterDescription
+	dw PoisonGasDescription
+	dw BarrageDescription
+	dw LeechLifeDescription
+	dw LovelyKissDescription
+	dw SkyAttackDescription
+	dw TransformDescription
+	dw BubbleDescription
+	dw DizzyPunchDescription
+	dw SporeDescription
+	dw FlashDescription
+	dw PsywaveDescription
+	dw SplashDescription
+	dw AcidArmorDescription
+	dw CrabhammerDescription
+	dw ExplosionDescription
+	dw FurySwipesDescription
+	dw BonemerangDescription
+	dw RestDescription
+	dw RockSlideDescription
+	dw HyperFangDescription
+	dw SharpenDescription
+	dw ConversionDescription
+	dw TriAttackDescription
+	dw SuperFangDescription
+	dw SlashDescription
+	dw SubstituteDescription
+	dw StruggleDescription
+	dw SketchDescription
+	dw TripleKickDescription
+	dw ThiefDescription
+	dw SpiderWebDescription
+	dw MindReaderDescription
+	dw NightmareDescription
+	dw FlameWheelDescription
+	dw SnoreDescription
+	dw CurseDescription
+	dw FlailDescription
+	dw Conversion2Description
+	dw AeroblastDescription
+	dw CottonSporeDescription
+	dw ReversalDescription
+	dw SpiteDescription
+	dw PowderSnowDescription
+	dw ProtectDescription
+	dw MachPunchDescription
+	dw ScaryFaceDescription
+	dw FaintAttackDescription
+	dw SweetKissDescription
+	dw BellyDrumDescription
+	dw SludgeBombDescription
+	dw MudSlapDescription
+	dw OctazookaDescription
+	dw SpikesDescription
+	dw ZapCannonDescription
+	dw ForesightDescription
+	dw DestinyBondDescription
+	dw PerishSongDescription
+	dw IcyWindDescription
+	dw DetectDescription
+	dw BoneRushDescription
+	dw LockOnDescription
+	dw OutrageDescription
+	dw SandstormDescription
+	dw GigaDrainDescription
+	dw EndureDescription
+	dw CharmDescription
+	dw RolloutDescription
+	dw FalseSwipeDescription
+	dw SwaggerDescription
+	dw MilkDrinkDescription
+	dw SparkDescription
+	dw FuryCutterDescription
+	dw SteelWingDescription
+	dw MeanLookDescription
+	dw AttractDescription
+	dw SleepTalkDescription
+	dw HealBellDescription
+	dw ReturnDescription
+	dw PresentDescription
+	dw FrustrationDescription
+	dw SafeguardDescription
+	dw PainSplitDescription
+	dw SacredFireDescription
+	dw MagnitudeDescription
+	dw DynamicpunchDescription
+	dw MegahornDescription
+	dw DragonbreathDescription
+	dw BatonPassDescription
+	dw EncoreDescription
+	dw PursuitDescription
+	dw RapidSpinDescription
+	dw SweetScentDescription
+	dw IronTailDescription
+	dw MetalClawDescription
+	dw VitalThrowDescription
+	dw MorningSunDescription
+	dw SynthesisDescription
+	dw MoonlightDescription
+	dw HiddenPowerDescription
+	dw CrossChopDescription
+	dw TwisterDescription
+	dw RainDanceDescription
+	dw SunnyDayDescription
+	dw CrunchDescription
+	dw MirrorCoatDescription
+	dw PsychUpDescription
+	dw ExtremespeedDescription
+	dw AncientpowerDescription
+	dw ShadowBallDescription
+	dw FutureSightDescription
+	dw RockSmashDescription
+	dw WhirlpoolDescription
+	dw BeatUpDescription
+	dw MoveFCDescription
+	dw MoveFDDescription
+	dw MoveFEDescription
+	dw MoveFFDescription
+	dw Move00Description
+; 2cd52
+
+MoveFCDescription:
+MoveFDDescription:
+MoveFEDescription:
+MoveFFDescription:
+Move00Description:
+	db "?@"
+
+PoundDescription:
+	db   "Pounds with fore-"
+	next "legs or tail.@"
+
+KarateChopDescription:
+	db   "Has a high criti-"
+	next "cal hit ratio.@"
+
+DoubleslapDescription:
+	db   "Repeatedly slaps"
+	next "2-5 times.@"
+
+CometPunchDescription:
+	db   "Repeatedly punches"
+	next "2-5 times.@"
+
+MegaPunchDescription:
+	db   "A powerful punch"
+	next "thrown very hard.@"
+
+PayDayDescription:
+	db   "Throws coins. Gets"
+	next "them back later.@"
+
+FirePunchDescription:
+	db   "A fiery punch. May"
+	next "cause a burn.@"
+
+IcePunchDescription:
+	db   "An icy punch. May"
+	next "cause freezing.@"
+
+ThunderpunchDescription:
+	db   "An electric punch."
+	next "It may paralyze.@"
+
+ScratchDescription:
+	db   "Scratches with"
+	next "sharp claws.@"
+
+VicegripDescription:
+	db   "Grips with power-"
+	next "ful pincers.@"
+
+GuillotineDescription:
+	db   "A one-hit KO,"
+	next "pincer attack.@"
+
+RazorWindDescription:
+	db   "1st turn: Prepare"
+	next "2nd turn: Attack@"
+
+SwordsDanceDescription:
+	db   "A dance that in-"
+	next "creases ATTACK.@"
+
+CutDescription:
+	db   "Cuts using claws,"
+	next "scythes, etc.@"
+
+GustDescription:
+	db   "Whips up a strong"
+	next "gust of wind.@"
+
+WingAttackDescription:
+	db   "Strikes the target"
+	next "with wings.@"
+
+WhirlwindDescription:
+	db   "Blows away the foe"
+	next "& ends battle.@"
+
+FlyDescription:
+	db   "1st turn: Fly"
+	next "2nd turn: Attack@"
+
+BindDescription:
+	db   "Binds the target"
+	next "for 2-5 turns.@"
+
+SlamDescription:
+	db   "Slams the foe with"
+	next "a tail, vine, etc.@"
+
+VineWhipDescription:
+	db   "Whips the foe with"
+	next "slender vines.@"
+
+StompDescription:
+	db   "An attack that may"
+	next "cause flinching.@"
+
+DoubleKickDescription:
+	db   "A double kicking"
+	next "attack.@"
+
+MegaKickDescription:
+	db   "A powerful kicking"
+	next "attack.@"
+
+JumpKickDescription:
+	db   "May miss, damaging"
+	next "the user.@"
+
+RollingKickDescription:
+	db   "A fast, spinning"
+	next "kick.@"
+
+SandAttackDescription:
+	db   "Reduces accuracy"
+	next "by throwing sand.@"
+
+HeadbuttDescription:
+	db   "An attack that may"
+	next "make foe flinch.@"
+
+HornAttackDescription:
+	db   "An attack using a"
+	next "horn to jab.@"
+
+FuryAttackDescription:
+	db   "Jabs the target"
+	next "2-5 times.@"
+
+HornDrillDescription:
+	db   "A one-hit KO,"
+	next "drill attack.@"
+
+TackleDescription:
+	db   "A full-body charge"
+	next "attack.@"
+
+BodySlamDescription:
+	db   "An attack that may"
+	next "cause paralysis.@"
+
+WrapDescription:
+	db   "Squeezes the foe"
+	next "for 2-5 turns.@"
+
+TakeDownDescription:
+	db   "A tackle that also"
+	next "hurts the user.@"
+
+ThrashDescription:
+	db   "Works 2-3 turns"
+	next "and confuses user.@"
+
+DoubleEdgeDescription:
+	db   "A tackle that also"
+	next "hurts the user.@"
+
+TailWhipDescription:
+	db   "Lowers the foe's"
+	next "DEFENSE.@"
+
+PoisonStingDescription:
+	db   "An attack that may"
+	next "poison the target.@"
+
+TwineedleDescription:
+	db   "Jabs the foe twice"
+	next "using stingers.@"
+
+PinMissileDescription:
+	db   "Fires pins that"
+	next "strike 2-5 times.@"
+
+LeerDescription:
+	db   "Reduces the foe's"
+	next "DEFENSE.@"
+
+BiteDescription:
+	db   "An attack that may"
+	next "cause flinching.@"
+
+GrowlDescription:
+	db   "Reduces the foe's"
+	next "ATTACK.@"
+
+RoarDescription:
+	db   "Scares wild foes"
+	next "to end battle.@"
+
+SingDescription:
+	db   "May cause the foe"
+	next "to fall asleep.@"
+
+SupersonicDescription:
+	db   "Sound waves that"
+	next "cause confusion.@"
+
+SonicboomDescription:
+	db   "Always inflicts"
+	next "20HP damage.@"
+
+DisableDescription:
+	db   "Disables the foe's"
+	next "most recent move.@"
+
+AcidDescription:
+	db   "An attack that may"
+	next "lower DEFENSE.@"
+
+EmberDescription:
+	db   "An attack that may"
+	next "inflict a burn.@"
+
+FlamethrowerDescription:
+	db   "An attack that may"
+	next "inflict a burn.@"
+
+MistDescription:
+	db   "Prevents stat"
+	next "reduction.@"
+
+WaterGunDescription:
+	db   "Squirts water to"
+	next "attack.@"
+
+HydroPumpDescription:
+	db   "A powerful water-"
+	next "type attack.@"
+
+SurfDescription:
+	db   "A strong water-"
+	next "type attack.@"
+
+IceBeamDescription:
+	db   "An attack that may"
+	next "freeze the foe.@"
+
+BlizzardDescription:
+	db   "An attack that may"
+	next "freeze the foe.@"
+
+PsybeamDescription:
+	db   "An attack that may"
+	next "confuse the foe.@"
+
+BubblebeamDescription:
+	db   "An attack that may"
+	next "lower SPEED.@"
+
+AuroraBeamDescription:
+	db   "An attack that may"
+	next "lower ATTACK.@"
+
+HyperBeamDescription:
+	db   "1st turn: Attack"
+	next "2nd turn: Rest@"
+
+PeckDescription:
+	db   "Jabs the foe with"
+	next "a beak, etc.@"
+
+DrillPeckDescription:
+	db   "A strong, spin-"
+	next "ning-peck attack.@"
+
+SubmissionDescription:
+	db   "An attack that al-"
+	next "so hurts the user.@"
+
+LowKickDescription:
+	db   "An attack that may"
+	next "cause flinching.@"
+
+CounterDescription:
+	db   "Returns a physical"
+	next "blow double.@"
+
+SeismicTossDescription:
+	db   "The user's level"
+	next "equals damage HP.@"
+
+StrengthDescription:
+	db   "A powerful physi-"
+	next "cal attack.@"
+
+AbsorbDescription:
+	db   "Steals 1/2 of the"
+	next "damage inflicted.@"
+
+MegaDrainDescription:
+	db   "Steals 1/2 of the"
+	next "damage inflicted.@"
+
+LeechSeedDescription:
+	db   "Steals HP from the"
+	next "foe on every turn.@"
+
+GrowthDescription:
+	db   "Raises the SPCL."
+	next "ATK rating.@"
+
+RazorLeafDescription:
+	db   "Has a high criti-"
+	next "cal hit ratio.@"
+
+SolarbeamDescription:
+	db   "1st turn: Prepare"
+	next "2nd turn: Attack@"
+
+PoisonpowderDescription:
+	db   "A move that may"
+	next "poison the foe.@"
+
+StunSporeDescription:
+	db   "A move that may"
+	next "paralyze the foe.@"
+
+SleepPowderDescription:
+	db   "May cause the foe"
+	next "to fall asleep.@"
+
+PetalDanceDescription:
+	db   "Works 2-3 turns"
+	next "and confuses user.@"
+
+StringShotDescription:
+	db   "A move that lowers"
+	next "the foe's SPEED.@"
+
+DragonRageDescription:
+	db   "Always inflicts"
+	next "40HP damage.@"
+
+FireSpinDescription:
+	db   "Traps foe in fire"
+	next "for 2-5 turns.@"
+
+ThundershockDescription:
+	db   "An attack that may"
+	next "cause paralysis.@"
+
+ThunderboltDescription:
+	db   "An attack that may"
+	next "cause paralysis.@"
+
+ThunderWaveDescription:
+	db   "A move that may"
+	next "cause paralysis.@"
+
+ThunderDescription:
+	db   "An attack that may"
+	next "cause paralysis.@"
+
+RockThrowDescription:
+	db   "Drops rocks on the"
+	next "enemy.@"
+
+EarthquakeDescription:
+	db   "Tough but useless"
+	next "vs. flying foes.@"
+
+FissureDescription:
+	db   "A ground-type,"
+	next "one-hit KO attack.@"
+
+DigDescription:
+	db   "1st turn: Burrow"
+	next "2nd turn: Attack@"
+
+ToxicDescription:
+	db   "A poison move with"
+	next "increasing damage.@"
+
+ConfusionDescription:
+	db   "An attack that may"
+	next "cause confusion.@"
+
+PsychicMDescription:
+	db   "An attack that may"
+	next "lower SPCL.DEF.@"
+
+HypnosisDescription:
+	db   "May put the foe to"
+	next "sleep.@"
+
+MeditateDescription:
+	db   "Raises the user's"
+	next "ATTACK.@"
+
+AgilityDescription:
+	db   "Sharply increases"
+	next "the user's SPEED.@"
+
+QuickAttackDescription:
+	db   "Lets the user get"
+	next "in the first hit.@"
+
+RageDescription:
+	db   "Raises ATTACK if"
+	next "the user is hit.@"
+
+TeleportDescription:
+	db   "A move for fleeing"
+	next "from battle.@"
+
+NightShadeDescription:
+	db   "The user's level"
+	next "equals damage HP.@"
+
+MimicDescription:
+	db   "Copies a move used"
+	next "by the foe.@"
+
+ScreechDescription:
+	db   "Sharply reduces"
+	next "the foe's DEFENSE.@"
+
+DoubleTeamDescription:
+	db   "Heightens evasive-"
+	next "ness.@"
+
+RecoverDescription:
+	db   "Restores HP by 1/2"
+	next "the max HP.@"
+
+HardenDescription:
+	db   "Raises the user's"
+	next "DEFENSE.@"
+
+MinimizeDescription:
+	db   "Heightens evasive-"
+	next "ness.@"
+
+SmokescreenDescription:
+	db   "Lowers the foe's"
+	next "accuracy.@"
+
+ConfuseRayDescription:
+	db   "A move that causes"
+	next "confusion.@"
+
+WithdrawDescription:
+	db   "Heightens the"
+	next "user's DEFENSE.@"
+
+DefenseCurlDescription:
+	db   "Heightens the"
+	next "user's DEFENSE.@"
+
+BarrierDescription:
+	db   "Sharply increases"
+	next "user's DEFENSE.@"
+
+LightScreenDescription:
+	db   "Ups SPCL.DEF with"
+	next "a wall of light.@"
+
+HazeDescription:
+	db   "Eliminates all"
+	next "stat changes.@"
+
+ReflectDescription:
+	db   "Raises DEFENSE"
+	next "with a barrier.@"
+
+FocusEnergyDescription:
+	db   "Raises the criti-"
+	next "cal hit ratio.@"
+
+BideDescription:
+	db   "Waits 2-3 turns &"
+	next "hits back double.@"
+
+MetronomeDescription:
+	db   "Randomly uses any"
+	next "#MON move.@"
+
+MirrorMoveDescription:
+	db   "Counters with the"
+	next "same move.@"
+
+SelfdestructDescription:
+	db   "Powerful but makes"
+	next "the user faint.@"
+
+EggBombDescription:
+	db   "Eggs are hurled at"
+	next "the foe.@"
+
+LickDescription:
+	db   "An attack that may"
+	next "cause paralysis.@"
+
+SmogDescription:
+	db   "An attack that may"
+	next "poison the foe.@"
+
+SludgeDescription:
+	db   "An attack that may"
+	next "poison the foe.@"
+
+BoneClubDescription:
+	db   "An attack that may"
+	next "cause flinching.@"
+
+FireBlastDescription:
+	db   "An attack that"
+	next "may cause a burn.@"
+
+WaterfallDescription:
+	db   "An aquatic charge"
+	next "attack.@"
+
+ClampDescription:
+	db   "Traps the foe for"
+	next "2-5 turns.@"
+
+SwiftDescription:
+	db   "An attack that"
+	next "never misses.@"
+
+SkullBashDescription:
+	db   "1st turn: Prepare"
+	next "2nd turn: Attack@"
+
+SpikeCannonDescription:
+	db   "Fires spikes to"
+	next "hit 2-5 times.@"
+
+ConstrictDescription:
+	db   "An attack that may"
+	next "lower SPEED.@"
+
+AmnesiaDescription:
+	db   "Sharply raises the"
+	next "user's SPCL.DEF.@"
+
+KinesisDescription:
+	db   "Reduces the foe's"
+	next "accuracy.@"
+
+SoftboiledDescription:
+	db   "Restores HP by 1/2"
+	next "the user's max HP.@"
+
+HiJumpKickDescription:
+	db   "May miss and hurt"
+	next "the user.@"
+
+GlareDescription:
+	db   "A move that may"
+	next "cause paralysis.@"
+
+DreamEaterDescription:
+	db   "Steals HP from a"
+	next "sleeping victim.@"
+
+PoisonGasDescription:
+	db   "A move that may"
+	next "poison the foe.@"
+
+BarrageDescription:
+	db   "Throws orbs to hit"
+	next "2-5 times.@"
+
+LeechLifeDescription:
+	db   "Steals 1/2 of the"
+	next "damage inflicted.@"
+
+LovelyKissDescription:
+	db   "May cause the foe"
+	next "to fall asleep.@"
+
+SkyAttackDescription:
+	db   "1st turn: Prepare"
+	next "2nd turn: Attack@"
+TransformDescription:
+	db   "The user assumes"
+	next "the foe's guise.@"
+
+BubbleDescription:
+	db   "An attack that may"
+	next "reduce SPEED.@"
+
+DizzyPunchDescription:
+	db   "An attack that may"
+	next "cause confusion.@"
+
+SporeDescription:
+	db   "A move that"
+	next "induces sleep.@"
+
+FlashDescription:
+	db   "Blinds the foe to"
+	next "reduce accuracy.@"
+
+PsywaveDescription:
+	db   "An attack with"
+	next "variable power.@"
+
+SplashDescription:
+	db   "Has no effect"
+	next "whatsoever.@"
+
+AcidArmorDescription:
+	db   "Sharply raises the"
+	next "user's DEFENSE.@"
+
+CrabhammerDescription:
+	db   "Has a high criti-"
+	next "cal hit ratio.@"
+
+ExplosionDescription:
+	db   "Very powerful but"
+	next "makes user faint.@"
+
+FurySwipesDescription:
+	db   "Quickly scratches"
+	next "2-5 times.@"
+
+BonemerangDescription:
+	db   "An attack that"
+	next "strikes twice.@"
+
+RestDescription:
+	db   "Sleep for 2 turns"
+	next "to fully recover.@"
+
+RockSlideDescription:
+	db   "An attack that may"
+	next "cause flinching.@"
+
+HyperFangDescription:
+	db   "An attack that may"
+	next "cause flinching.@"
+
+SharpenDescription:
+	db   "A move that raises"
+	next "the user's ATTACK.@"
+
+ConversionDescription:
+	db   "Change user's type"
+	next "to a move's type.@"
+
+TriAttackDescription:
+	db   "Fires three kinds"
+	next "of beams at once.@"
+
+SuperFangDescription:
+	db   "Cuts the foe's HP"
+	next "by 1/2.@"
+
+SlashDescription:
+	db   "Has a high criti-"
+	next "cal hit ratio.@"
+
+SubstituteDescription:
+	db   "Makes a decoy with"
+	next "1/4 user's max HP.@"
+
+StruggleDescription:
+	db   "Used only if all"
+	next "PP are exhausted.@"
+
+SketchDescription:
+	db   "Copies the foe's"
+	next "move permanently.@"
+
+TripleKickDescription:
+	db   "Hits three times"
+	next "with rising power.@"
+
+ThiefDescription:
+	db   "An attack that may"
+	next "steal a held item.@"
+
+SpiderWebDescription:
+	db   "Prevents fleeing"
+	next "or switching.@"
+
+MindReaderDescription:
+	db   "Ensures the next"
+	next "attack will hit.@"
+
+NightmareDescription:
+	db   "A sleeper loses"
+	next "1/4 HP every turn.@"
+
+FlameWheelDescription:
+	db   "An attack that may"
+	next "cause a burn.@"
+
+SnoreDescription:
+	db   "An attack useable"
+	next "only while asleep.@"
+
+CurseDescription:
+	db   "Works differently"
+	next "for ghost-types.@"
+
+FlailDescription:
+	db   "Stronger if the"
+	next "user's HP is low.@"
+
+Conversion2Description:
+	db   "The user's type is"
+	next "made resistant.@"
+
+AeroblastDescription:
+	db   "Has a high criti-"
+	next "cal hit ratio.@"
+
+CottonSporeDescription:
+	db   "Sharply reduces"
+	next "the foe's SPEED.@"
+
+ReversalDescription:
+	db   "Stronger if the"
+	next "user's HP is low.@"
+
+SpiteDescription:
+	db   "Cuts the PP of the"
+	next "foe's last move.@"
+
+PowderSnowDescription:
+	db   "An attack that may"
+	next "cause freezing.@"
+
+ProtectDescription:
+	db   "Foils attack that"
+	next "turn. It may fail.@"
+
+MachPunchDescription:
+	db   "A fast punch that"
+	next "lands first.@"
+
+ScaryFaceDescription:
+	db   "Sharply reduces"
+	next "the foe's SPEED.@"
+
+FaintAttackDescription:
+	db   "An attack that"
+	next "never misses.@"
+
+SweetKissDescription:
+	db   "A move that causes"
+	next "confusion.@"
+
+BellyDrumDescription:
+	db   "Reduces own HP to"
+	next "maximize ATTACK.@"
+
+SludgeBombDescription:
+	db   "An attack that may"
+	next "poison the foe.@"
+
+MudSlapDescription:
+	db   "Reduces the foe's"
+	next "accuracy.@"
+
+OctazookaDescription:
+	db   "An attack that may"
+	next "reduce accuracy.@"
+
+SpikesDescription:
+	db   "Hurts foes when"
+	next "they switch out.@"
+
+ZapCannonDescription:
+	db   "An attack that"
+	next "always paralyzes.@"
+
+ForesightDescription:
+	db   "Negates accuracy"
+	next "reduction moves.@"
+
+DestinyBondDescription:
+	db   "The foe faints if"
+	next "the user does.@"
+
+PerishSongDescription:
+	db   "Both user and foe"
+	next "faint in 3 turns.@"
+
+IcyWindDescription:
+	db   "An icy attack that"
+	next "lowers SPEED.@"
+
+DetectDescription:
+	db   "Evades attack that"
+	next "turn. It may fail.@"
+
+BoneRushDescription:
+	db   "An attack that"
+	next "hits 2-5 times.@"
+
+LockOnDescription:
+	db   "Ensures the next"
+	next "attack will hit.@"
+
+OutrageDescription:
+	db   "Works 2-3 turns"
+	next "and confuses user.@"
+
+SandstormDescription:
+	db   "Inflicts damage"
+	next "every turn.@"
+
+GigaDrainDescription:
+	db   "Steals 1/2 of the"
+	next "damage inflicted.@"
+
+EndureDescription:
+	db   "Always leaves at"
+	next "least 1HP.@"
+
+CharmDescription:
+	db   "Sharply lowers the"
+	next "foe's ATTACK.@"
+
+RolloutDescription:
+	db   "Attacks 5 turns"
+	next "with rising power.@"
+
+FalseSwipeDescription:
+	db   "Leaves the foe"
+	next "with at least 1HP.@"
+
+SwaggerDescription:
+	db   "Causes confusion"
+	next "and raises ATTACK.@"
+
+MilkDrinkDescription:
+	db   "Restores HP by 1/2"
+	next "the max HP.@"
+
+SparkDescription:
+	db   "An attack that may"
+	next "cause paralysis.@"
+
+FuryCutterDescription:
+	db   "Successive hits"
+	next "raise power.@"
+
+SteelWingDescription:
+	db   "Stiff wings strike"
+	next "the foe.@"
+
+MeanLookDescription:
+	db   "Prevents fleeing"
+	next "or switching.@"
+
+AttractDescription:
+	db   "Makes the opposite"
+	next "gender infatuated.@"
+
+SleepTalkDescription:
+	db   "Randomly attacks"
+	next "while asleep.@"
+
+HealBellDescription:
+	db   "Eliminates all"
+	next "status problems.@"
+
+ReturnDescription:
+	db   "An attack that is"
+	next "based on loyalty.@"
+
+PresentDescription:
+	db   "A bomb that may"
+	next "restore HP.@"
+
+FrustrationDescription:
+	db   "An attack based on"
+	next "lack of loyalty.@"
+
+SafeguardDescription:
+	db   "Prevents all"
+	next "status problems.@"
+
+PainSplitDescription:
+	db   "Adds user & foe's"
+	next "HPs. Shares total.@"
+
+SacredFireDescription:
+	db   "An attack that may"
+	next "inflict a burn.@"
+
+MagnitudeDescription:
+	db   "A ground attack"
+	next "with random power.@"
+
+DynamicpunchDescription:
+	db   "An attack that"
+	next "always confuses.@"
+
+MegahornDescription:
+	db   "A powerful charge"
+	next "attack.@"
+
+DragonbreathDescription:
+	db   "A strong breath"
+	next "attack.@"
+
+BatonPassDescription:
+	db   "Switches while"
+	next "keeping effects.@"
+
+EncoreDescription:
+	db   "Makes the foe re-"
+	next "peat 2-6 times.@"
+
+PursuitDescription:
+	db   "Heavily strikes"
+	next "switching #MON.@"
+
+RapidSpinDescription:
+	db   "A high-speed"
+	next "spinning attack.@"
+
+SweetScentDescription:
+	db   "Reduces the foe's"
+	next "evasiveness.@"
+
+IronTailDescription:
+	db   "An attack that may"
+	next "reduce DEFENSE.@"
+
+MetalClawDescription:
+	db   "An attack that may"
+	next "up user's ATTACK.@"
+
+VitalThrowDescription:
+	db   "A 2nd-strike move"
+	next "that never misses.@"
+
+MorningSunDescription:
+	db   "Restores HP"
+	next "(varies by time).@"
+
+SynthesisDescription:
+	db   "Restores HP"
+	next "(varies by time).@"
+
+MoonlightDescription:
+	db   "Restores HP"
+	next "(varies by time).@"
+
+HiddenPowerDescription:
+	db   "The power varies"
+	next "with the #MON.@"
+
+CrossChopDescription:
+	db   "Has a high criti-"
+	next "cal hit ratio.@"
+
+TwisterDescription:
+	db   "Whips up a tornado"
+	next "to attack.@"
+
+RainDanceDescription:
+	db   "Boosts water-type"
+	next "moves for 5 turns.@"
+
+SunnyDayDescription:
+	db   "Boosts fire-type"
+	next "moves for 5 turns.@"
+
+CrunchDescription:
+	db   "An attack that may"
+	next "lower SPCL.DEF.@"
+
+MirrorCoatDescription:
+	db   "Counters a SPCL."
+	next "ATK move double.@"
+
+PsychUpDescription:
+	db   "Copies the foe's"
+	next "stat changes.@"
+
+ExtremespeedDescription:
+	db   "A powerful first-"
+	next "strike move.@"
+
+AncientpowerDescription:
+	db   "An attack that may"
+	next "raise all stats.@"
+
+ShadowBallDescription:
+	db   "An attack that may"
+	next "lower SPCL.DEF.@"
+
+FutureSightDescription:
+	db   "An attack that"
+	next "hits on 3rd turn.@"
+
+RockSmashDescription:
+	db   "An attack that may"
+	next "lower DEFENSE.@"
+
+WhirlpoolDescription:
+	db   "Traps the foe for"
+	next "2-5 turns.@"
+
+BeatUpDescription:
+	db   "Party #MON join"
+	next "in the attack.@"
+; 2ed44
--- /dev/null
+++ b/data/moves/move_effects.asm
@@ -1,0 +1,2075 @@
+MoveEffects: ; 2732e
+
+NormalHit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+DoSleep:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	checksafeguard
+	sleeptarget
+	endmove
+
+PoisonHit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	poisontarget
+	endmove
+
+LeechHit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	draintarget
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+BurnHit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	burntarget
+	endmove
+
+FreezeHit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	freezetarget
+	endmove
+
+ParalyzeHit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	paralyzetarget
+	endmove
+
+Selfdestruct:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	selfdestruct
+	hittargetnosub
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+DreamEater:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	eatdream
+	checkdestinybond
+	buildopponentrage
+	endmove
+
+MirrorMove:
+	checkobedience
+	usedmovetext
+	doturn
+	mirrormove
+	endmove
+
+AttackUp:
+	checkobedience
+	usedmovetext
+	doturn
+	attackup
+	lowersub
+	statupanim
+	raisesub
+	statupmessage
+	statupfailtext
+	endmove
+
+DefenseUp:
+	checkobedience
+	usedmovetext
+	doturn
+	defenseup
+	lowersub
+	statupanim
+	raisesub
+	statupmessage
+	statupfailtext
+	endmove
+
+SpeedUp:
+	checkobedience
+	usedmovetext
+	doturn
+	speedup
+	lowersub
+	statupanim
+	raisesub
+	statupmessage
+	statupfailtext
+	endmove
+
+SpecialAttackUp:
+	checkobedience
+	usedmovetext
+	doturn
+	specialattackup
+	lowersub
+	statupanim
+	raisesub
+	statupmessage
+	statupfailtext
+	endmove
+
+SpecialDefenseUp:
+	checkobedience
+	usedmovetext
+	doturn
+	specialdefenseup
+	lowersub
+	statupanim
+	raisesub
+	statupmessage
+	statupfailtext
+	endmove
+
+AccuracyUp:
+	checkobedience
+	usedmovetext
+	doturn
+	accuracyup
+	lowersub
+	statupanim
+	raisesub
+	statupmessage
+	statupfailtext
+	endmove
+
+EvasionUp:
+	checkobedience
+	usedmovetext
+	doturn
+	lowersub
+	evasionup
+	statupanim
+	lowersubnoanim
+	raisesub
+	statupmessage
+	statupfailtext
+	endmove
+
+AttackUp2:
+	checkobedience
+	usedmovetext
+	doturn
+	attackup2
+	lowersub
+	statupanim
+	raisesub
+	statupmessage
+	statupfailtext
+	endmove
+
+DefenseUp2:
+	checkobedience
+	usedmovetext
+	doturn
+	defenseup2
+	lowersub
+	statupanim
+	raisesub
+	statupmessage
+	statupfailtext
+	endmove
+
+SpeedUp2:
+	checkobedience
+	usedmovetext
+	doturn
+	speedup2
+	lowersub
+	statupanim
+	raisesub
+	statupmessage
+	statupfailtext
+	endmove
+
+SpecialAttackUp2:
+	checkobedience
+	usedmovetext
+	doturn
+	specialattackup2
+	lowersub
+	statupanim
+	raisesub
+	statupmessage
+	statupfailtext
+	endmove
+
+SpecialDefenseUp2:
+	checkobedience
+	usedmovetext
+	doturn
+	specialdefenseup2
+	lowersub
+	statupanim
+	raisesub
+	statupmessage
+	statupfailtext
+	endmove
+
+AccuracyUp2:
+	checkobedience
+	usedmovetext
+	doturn
+	accuracyup2
+	lowersub
+	statupanim
+	raisesub
+	statupmessage
+	statupfailtext
+	endmove
+
+EvasionUp2:
+	checkobedience
+	usedmovetext
+	doturn
+	evasionup2
+	lowersub
+	statupanim
+	raisesub
+	statupmessage
+	statupfailtext
+	endmove
+
+AttackDown:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	attackdown
+	lowersub
+	statdownanim
+	raisesub
+	statdownmessage
+	statdownfailtext
+	endmove
+
+DefenseDown:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	defensedown
+	lowersub
+	statdownanim
+	raisesub
+	statdownmessage
+	statdownfailtext
+	endmove
+
+SpeedDown:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	speeddown
+	lowersub
+	statdownanim
+	raisesub
+	statdownmessage
+	statdownfailtext
+	endmove
+
+SpecialAttackDown:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	specialattackdown
+	lowersub
+	statdownanim
+	raisesub
+	statdownmessage
+	statdownfailtext
+	endmove
+
+SpecialDefenseDown:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	specialdefensedown
+	lowersub
+	statdownanim
+	raisesub
+	statdownmessage
+	statdownfailtext
+	endmove
+
+AccuracyDown:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	accuracydown
+	lowersub
+	statdownanim
+	raisesub
+	statdownmessage
+	statdownfailtext
+	endmove
+
+EvasionDown:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	evasiondown
+	lowersub
+	statdownanim
+	raisesub
+	statdownmessage
+	statdownfailtext
+	endmove
+
+AttackDown2:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	attackdown2
+	lowersub
+	statdownanim
+	raisesub
+	statdownmessage
+	statdownfailtext
+	endmove
+
+DefenseDown2:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	defensedown2
+	lowersub
+	statdownanim
+	raisesub
+	statdownmessage
+	statdownfailtext
+	endmove
+
+SpeedDown2:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	speeddown2
+	lowersub
+	statdownanim
+	raisesub
+	statdownmessage
+	statdownfailtext
+	endmove
+
+SpecialAttackDown2:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	specialattackdown2
+	lowersub
+	statdownanim
+	raisesub
+	statdownmessage
+	statdownfailtext
+	endmove
+
+SpecialDefenseDown2:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	specialdefensedown2
+	lowersub
+	statdownanim
+	raisesub
+	statdownmessage
+	statdownfailtext
+	endmove
+
+AccuracyDown2:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	accuracydown2
+	lowersub
+	statdownanim
+	raisesub
+	statdownmessage
+	statdownfailtext
+	endmove
+
+EvasionDown2:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	evasiondown2
+	lowersub
+	statdownanim
+	raisesub
+	statdownmessage
+	statdownfailtext
+	endmove
+
+AttackDownHit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	attackdown
+	statdownmessage
+	endmove
+
+DefenseDownHit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	effectchance ; bug: duplicate effectchance shouldn't be here
+	defensedown
+	statdownmessage
+	endmove
+
+SpeedDownHit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	speeddown
+	statdownmessage
+	endmove
+
+SpecialAttackDownHit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	specialattackdown
+	statdownmessage
+	endmove
+
+SpecialDefenseDownHit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	specialdefensedown
+	statdownmessage
+	endmove
+
+AccuracyDownHit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	accuracydown
+	statdownmessage
+	endmove
+
+EvasionDownHit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	evasiondown
+	statdownmessage
+	endmove
+
+DefenseUpHit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	defenseup
+	statupmessage
+	endmove
+
+AttackUpHit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	attackup
+	statupmessage
+	endmove
+
+AllUpHit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	allstatsup
+	endmove
+
+PayDay:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	payday
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+Conversion:
+	checkobedience
+	usedmovetext
+	doturn
+	conversion
+	endmove
+
+ResetStats:
+	checkobedience
+	usedmovetext
+	doturn
+	resetstats
+	endmove
+
+Bide:
+	storeenergy
+	checkobedience
+	doturn
+	usedmovetext
+	unleashenergy
+	resettypematchup
+	checkhit
+	hittarget
+	effect0xa5
+	checkfaint
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+Rampage:
+	checkrampage
+	checkobedience
+	doturn
+	rampage
+	usedmovetext
+	checkhit
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	clearmissdamage
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+ForceSwitch:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	forceswitch
+	endmove
+
+MultiHit:
+	checkobedience
+	usedmovetext
+	doturn
+	startloop
+	lowersub
+	checkhit
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	clearmissdamage
+	hittargetnosub
+	failuretext
+	checkfaint
+	criticaltext
+	cleartext
+	supereffectivelooptext
+	checkdestinybond
+	buildopponentrage
+	endloop
+	raisesub
+	kingsrock
+	endmove
+
+PoisonMultiHit:
+	checkobedience
+	usedmovetext
+	doturn
+	startloop
+	lowersub
+	checkhit
+	effectchance
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	clearmissdamage
+	hittargetnosub
+	failuretext
+	checkfaint
+	criticaltext
+	cleartext
+	supereffectivelooptext
+	checkdestinybond
+	buildopponentrage
+	endloop
+	raisesub
+	kingsrock
+	poisontarget
+	endmove
+
+FlinchHit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	flinchtarget
+	endmove
+
+OHKOHit:
+	checkobedience
+	usedmovetext
+	doturn
+	stab
+	ohko
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	endmove
+
+RecoilHit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	recoil
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+Mist:
+	checkobedience
+	usedmovetext
+	doturn
+	mist
+	endmove
+
+FocusEnergy:
+	checkobedience
+	usedmovetext
+	doturn
+	focusenergy
+	endmove
+
+DoConfuse:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	checksafeguard
+	confuse
+	endmove
+
+ConfuseHit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	confusetarget
+	endmove
+
+Heal:
+	checkobedience
+	usedmovetext
+	doturn
+	heal
+	endmove
+
+Transform:
+	checkobedience
+	usedmovetext
+	doturn
+	transform
+	endmove
+
+LightScreen:
+Reflect:
+	checkobedience
+	usedmovetext
+	doturn
+	screen
+	endmove
+
+TriAttack:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	tristatuschance
+	endmove
+
+Toxic:
+DoPoison:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	stab
+	checksafeguard
+	poison
+	endmove
+
+DoParalyze:
+	checkobedience
+	usedmovetext
+	doturn
+	stab
+	checkhit
+	checksafeguard
+	paralyze
+	endmove
+
+SkyAttack:
+	checkcharge
+	checkobedience
+	doturn
+	charge
+	usedmovetext
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	flinchtarget
+	kingsrock
+	endmove
+
+Substitute:
+	checkobedience
+	usedmovetext
+	doturn
+	substitute
+	endmove
+
+HyperBeam:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	rechargenextturn
+	checkdestinybond
+	buildopponentrage
+	endmove
+
+Rage:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	checkhit
+	ragedamage
+	damagevariation
+	hittarget
+	failuretext
+	rage
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+Mimic:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	mimic
+	endmove
+
+Metronome:
+	checkobedience
+	usedmovetext
+	doturn
+	metronome
+	endmove
+
+LeechSeed:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	leechseed
+	endmove
+
+Splash:
+	checkobedience
+	usedmovetext
+	doturn
+	splash
+	endmove
+
+Disable:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	disable
+	endmove
+
+RazorWind:
+	checkcharge
+	checkobedience
+	doturn
+	charge
+	usedmovetext
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+Fly:
+	checkcharge
+	checkobedience
+	doturn
+	charge
+	usedmovetext
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	hittargetnosub
+	raisesub
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+TrapTarget:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	clearmissdamage
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	traptarget
+	endmove
+
+SuperFang:
+Psywave:
+StaticDamage:
+	checkobedience
+	usedmovetext
+	doturn
+	constantdamage
+	checkhit
+	resettypematchup
+	hittarget
+	failuretext
+	checkfaint
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+Reversal:
+	checkobedience
+	usedmovetext
+	doturn
+	constantdamage
+	stab
+	checkhit
+	hittarget
+	failuretext
+	checkfaint
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+Counter:
+	checkobedience
+	usedmovetext
+	doturn
+	counter
+	hittarget
+	failuretext
+	checkfaint
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+Encore:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	encore
+	endmove
+
+PainSplit:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	painsplit
+	endmove
+
+Snore:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	snore
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	flinchtarget
+	kingsrock
+	endmove
+
+Conversion2:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	conversion2
+	endmove
+
+LockOn:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	lockon
+	endmove
+
+Sketch:
+	checkobedience
+	usedmovetext
+	doturn
+	sketch
+	endmove
+
+DefrostOpponent:
+	checkobedience
+	usedmovetext
+	doturn
+	defrostopponent
+	endmove
+
+SleepTalk:
+	checkobedience
+	usedmovetext
+	doturn
+	sleeptalk
+	endmove
+
+DestinyBond:
+	checkobedience
+	usedmovetext
+	doturn
+	destinybond
+	endmove
+
+Spite:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	spite
+	endmove
+
+FalseSwipe:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	falseswipe
+	checkhit
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+HealBell:
+	checkobedience
+	usedmovetext
+	doturn
+	healbell
+	endmove
+
+TripleKick:
+	checkobedience
+	usedmovetext
+	doturn
+	startloop
+	lowersub
+	checkhit
+	critical
+	damagestats
+	damagecalc
+	triplekick
+	stab
+	damagevariation
+	clearmissdamage
+	hittargetnosub
+	failuretext
+	checkfaint
+	criticaltext
+	cleartext
+	supereffectivelooptext
+	checkdestinybond
+	buildopponentrage
+	kickcounter
+	endloop
+	raisesub
+	kingsrock
+	endmove
+
+Thief:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	thief
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+MeanLook:
+	checkobedience
+	usedmovetext
+	doturn
+	arenatrap
+	endmove
+
+Nightmare:
+	checkobedience
+	usedmovetext
+	doturn
+	nightmare
+	endmove
+
+FlameWheel:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	defrost
+	checkdestinybond
+	buildopponentrage
+	burntarget
+	endmove
+
+Curse:
+	checkobedience
+	usedmovetext
+	doturn
+	curse
+	endmove
+
+Protect:
+	checkobedience
+	usedmovetext
+	doturn
+	protect
+	endmove
+
+Spikes:
+	checkobedience
+	usedmovetext
+	doturn
+	spikes
+	endmove
+
+Foresight:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	foresight
+	endmove
+
+PerishSong:
+	checkobedience
+	usedmovetext
+	doturn
+	perishsong
+	endmove
+
+Sandstorm:
+	checkobedience
+	usedmovetext
+	doturn
+	startsandstorm
+	endmove
+
+Endure:
+	checkobedience
+	usedmovetext
+	doturn
+	endure
+	endmove
+
+Rollout:
+	checkcurl
+	checkobedience
+	doturn
+	usedmovetext
+	critical
+	damagestats
+	damagecalc
+	stab
+	checkhit
+	rolloutpower
+	damagevariation
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+Swagger:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	switchturn
+	attackup2
+	switchturn
+	lowersub
+	statupanim
+	raisesub
+	failuretext
+	switchturn
+	statupmessage
+	switchturn
+	confusetarget
+	endmove
+
+FuryCutter:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	checkhit
+	furycutter
+	damagevariation
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+Attract:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	attract
+	endmove
+
+Return:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	happinesspower
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+Present:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	critical
+	damagestats
+	present
+	damagecalc
+	stab
+	damagevariation
+	clearmissdamage
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+Frustration:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	frustrationpower
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+Safeguard:
+	checkobedience
+	usedmovetext
+	doturn
+	safeguard
+	endmove
+
+SacredFire:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	defrost
+	checkdestinybond
+	buildopponentrage
+	burntarget
+	endmove
+
+Magnitude:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	getmagnitude
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	doubleundergrounddamage
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+BatonPass:
+	checkobedience
+	usedmovetext
+	doturn
+	batonpass
+	endmove
+
+Pursuit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	pursuit
+	checkhit
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+RapidSpin:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	clearhazards
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+MorningSun:
+	checkobedience
+	usedmovetext
+	doturn
+	healmorn
+	endmove
+
+Synthesis:
+	checkobedience
+	usedmovetext
+	doturn
+	healday
+	endmove
+
+Moonlight:
+	checkobedience
+	usedmovetext
+	doturn
+	healnite
+	endmove
+
+HiddenPower:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	hiddenpower
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+RainDance:
+	checkobedience
+	usedmovetext
+	doturn
+	startrain
+	endmove
+
+SunnyDay:
+	checkobedience
+	usedmovetext
+	doturn
+	startsun
+	endmove
+
+FakeOut:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	fakeout
+	hittarget
+	failuretext
+	endmove
+
+BellyDrum:
+	checkobedience
+	usedmovetext
+	doturn
+	bellydrum
+	endmove
+
+PsychUp:
+	checkobedience
+	usedmovetext
+	doturn
+	psychup
+	endmove
+
+MirrorCoat:
+	checkobedience
+	usedmovetext
+	doturn
+	mirrorcoat
+	hittarget
+	failuretext
+	checkfaint
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+SkullBash:
+	checkcharge
+	checkobedience
+	doturn
+	charge
+	usedmovetext
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endturn
+	defenseup
+	statupmessage
+	endmove
+
+Twister:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	doubleflyingdamage
+	checkhit
+	effectchance
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	flinchtarget
+	endmove
+
+Earthquake:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	doubleundergrounddamage
+	checkhit
+	effectchance
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	endmove
+
+FutureSight:
+	checkfuturesight
+	checkobedience
+	usedmovetext
+	doturn
+	damagestats
+	damagecalc
+	futuresight
+	damagevariation ; skip here if last turn
+	checkhit
+	hittargetnosub
+	failuretext
+	checkfaint
+	checkdestinybond
+	buildopponentrage
+	endmove
+
+Gust:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	doubleflyingdamage
+	checkhit
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	endmove
+
+Stomp:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	doubleminimizedamage
+	checkhit
+	effectchance
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	flinchtarget
+	endmove
+
+Solarbeam:
+	checkcharge
+	checkobedience
+	doturn
+	skipsuncharge
+	charge
+	usedmovetext
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+Thunder:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	thunderaccuracy
+	checkhit
+	effectchance
+	stab
+	damagevariation
+	hittarget
+	failuretext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	paralyzetarget
+	endmove
+
+Teleport:
+	checkobedience
+	usedmovetext
+	doturn
+	teleport
+	endmove
+
+BeatUp:
+	checkobedience
+	usedmovetext
+	movedelay
+	doturn
+	startloop
+	lowersub
+	checkhit
+	critical
+	beatup
+	damagecalc
+	damagevariation
+	clearmissdamage
+	hittargetnosub
+	failuretext
+	checkfaint
+	criticaltext
+	cleartext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	endloop
+	effect0xa8
+	raisesub
+	kingsrock
+	endmove
+
+DefenseCurl:
+	checkobedience
+	usedmovetext
+	doturn
+	defenseup
+	curl
+	lowersub
+	statupanim
+	raisesub
+	statupmessage
+	statupfailtext
+	endmove
--- /dev/null
+++ b/data/moves/move_effects_pointers.asm
@@ -1,0 +1,159 @@
+MoveEffectsPointers: ; 271f4
+; entries correspond to EFFECT_* constants
+	dw NormalHit
+	dw DoSleep
+	dw PoisonHit
+	dw LeechHit
+	dw BurnHit
+	dw FreezeHit
+	dw ParalyzeHit
+	dw Selfdestruct
+	dw DreamEater
+	dw MirrorMove
+	dw AttackUp
+	dw DefenseUp
+	dw SpeedUp
+	dw SpecialAttackUp
+	dw SpecialDefenseUp
+	dw AccuracyUp
+	dw EvasionUp
+	dw NormalHit
+	dw AttackDown
+	dw DefenseDown
+	dw SpeedDown
+	dw SpecialAttackDown
+	dw SpecialDefenseDown
+	dw AccuracyDown
+	dw EvasionDown
+	dw ResetStats
+	dw Bide
+	dw Rampage
+	dw ForceSwitch
+	dw MultiHit
+	dw Conversion
+	dw FlinchHit
+	dw Heal
+	dw Toxic
+	dw PayDay
+	dw LightScreen
+	dw TriAttack
+	dw NormalHit
+	dw OHKOHit
+	dw RazorWind
+	dw SuperFang
+	dw StaticDamage
+	dw TrapTarget
+	dw NormalHit
+	dw MultiHit
+	dw NormalHit
+	dw Mist
+	dw FocusEnergy
+	dw RecoilHit
+	dw DoConfuse
+	dw AttackUp2
+	dw DefenseUp2
+	dw SpeedUp2
+	dw SpecialAttackUp2
+	dw SpecialDefenseUp2
+	dw AccuracyUp2
+	dw EvasionUp2
+	dw Transform
+	dw AttackDown2
+	dw DefenseDown2
+	dw SpeedDown2
+	dw SpecialAttackDown2
+	dw SpecialDefenseDown2
+	dw AccuracyDown2
+	dw EvasionDown2
+	dw Reflect
+	dw DoPoison
+	dw DoParalyze
+	dw AttackDownHit
+	dw DefenseDownHit
+	dw SpeedDownHit
+	dw SpecialAttackDownHit
+	dw SpecialDefenseDownHit
+	dw AccuracyDownHit
+	dw EvasionDownHit
+	dw SkyAttack
+	dw ConfuseHit
+	dw PoisonMultiHit
+	dw NormalHit
+	dw Substitute
+	dw HyperBeam
+	dw Rage
+	dw Mimic
+	dw Metronome
+	dw LeechSeed
+	dw Splash
+	dw Disable
+	dw StaticDamage
+	dw Psywave
+	dw Counter
+	dw Encore
+	dw PainSplit
+	dw Snore
+	dw Conversion2
+	dw LockOn
+	dw Sketch
+	dw DefrostOpponent
+	dw SleepTalk
+	dw DestinyBond
+	dw Reversal
+	dw Spite
+	dw FalseSwipe
+	dw HealBell
+	dw NormalHit
+	dw TripleKick
+	dw Thief
+	dw MeanLook
+	dw Nightmare
+	dw FlameWheel
+	dw Curse
+	dw NormalHit
+	dw Protect
+	dw Spikes
+	dw Foresight
+	dw PerishSong
+	dw Sandstorm
+	dw Endure
+	dw Rollout
+	dw Swagger
+	dw FuryCutter
+	dw Attract
+	dw Return
+	dw Present
+	dw Frustration
+	dw Safeguard
+	dw SacredFire
+	dw Magnitude
+	dw BatonPass
+	dw Pursuit
+	dw RapidSpin
+	dw NormalHit
+	dw NormalHit
+	dw MorningSun
+	dw Synthesis
+	dw Moonlight
+	dw HiddenPower
+	dw RainDance
+	dw SunnyDay
+	dw DefenseUpHit
+	dw AttackUpHit
+	dw AllUpHit
+	dw FakeOut
+	dw BellyDrum
+	dw PsychUp
+	dw MirrorCoat
+	dw SkullBash
+	dw Twister
+	dw Earthquake
+	dw FutureSight
+	dw Gust
+	dw Stomp
+	dw Solarbeam
+	dw Thunder
+	dw Teleport
+	dw BeatUp
+	dw Fly
+	dw DefenseCurl
--- /dev/null
+++ b/data/moves/move_names.asm
@@ -1,0 +1,252 @@
+MoveNames::
+	db "POUND@"
+	db "KARATE CHOP@"
+	db "DOUBLESLAP@"
+	db "COMET PUNCH@"
+	db "MEGA PUNCH@"
+	db "PAY DAY@"
+	db "FIRE PUNCH@"
+	db "ICE PUNCH@"
+	db "THUNDERPUNCH@"
+	db "SCRATCH@"
+	db "VICEGRIP@"
+	db "GUILLOTINE@"
+	db "RAZOR WIND@"
+	db "SWORDS DANCE@"
+	db "CUT@"
+	db "GUST@"
+	db "WING ATTACK@"
+	db "WHIRLWIND@"
+	db "FLY@"
+	db "BIND@"
+	db "SLAM@"
+	db "VINE WHIP@"
+	db "STOMP@"
+	db "DOUBLE KICK@"
+	db "MEGA KICK@"
+	db "JUMP KICK@"
+	db "ROLLING KICK@"
+	db "SAND-ATTACK@"
+	db "HEADBUTT@"
+	db "HORN ATTACK@"
+	db "FURY ATTACK@"
+	db "HORN DRILL@"
+	db "TACKLE@"
+	db "BODY SLAM@"
+	db "WRAP@"
+	db "TAKE DOWN@"
+	db "THRASH@"
+	db "DOUBLE-EDGE@"
+	db "TAIL WHIP@"
+	db "POISON STING@"
+	db "TWINEEDLE@"
+	db "PIN MISSILE@"
+	db "LEER@"
+	db "BITE@"
+	db "GROWL@"
+	db "ROAR@"
+	db "SING@"
+	db "SUPERSONIC@"
+	db "SONICBOOM@"
+	db "DISABLE@"
+	db "ACID@"
+	db "EMBER@"
+	db "FLAMETHROWER@"
+	db "MIST@"
+	db "WATER GUN@"
+	db "HYDRO PUMP@"
+	db "SURF@"
+	db "ICE BEAM@"
+	db "BLIZZARD@"
+	db "PSYBEAM@"
+	db "BUBBLEBEAM@"
+	db "AURORA BEAM@"
+	db "HYPER BEAM@"
+	db "PECK@"
+	db "DRILL PECK@"
+	db "SUBMISSION@"
+	db "LOW KICK@"
+	db "COUNTER@"
+	db "SEISMIC TOSS@"
+	db "STRENGTH@"
+	db "ABSORB@"
+	db "MEGA DRAIN@"
+	db "LEECH SEED@"
+	db "GROWTH@"
+	db "RAZOR LEAF@"
+	db "SOLARBEAM@"
+	db "POISONPOWDER@"
+	db "STUN SPORE@"
+	db "SLEEP POWDER@"
+	db "PETAL DANCE@"
+	db "STRING SHOT@"
+	db "DRAGON RAGE@"
+	db "FIRE SPIN@"
+	db "THUNDERSHOCK@"
+	db "THUNDERBOLT@"
+	db "THUNDER WAVE@"
+	db "THUNDER@"
+	db "ROCK THROW@"
+	db "EARTHQUAKE@"
+	db "FISSURE@"
+	db "DIG@"
+	db "TOXIC@"
+	db "CONFUSION@"
+	db "PSYCHIC@"
+	db "HYPNOSIS@"
+	db "MEDITATE@"
+	db "AGILITY@"
+	db "QUICK ATTACK@"
+	db "RAGE@"
+	db "TELEPORT@"
+	db "NIGHT SHADE@"
+	db "MIMIC@"
+	db "SCREECH@"
+	db "DOUBLE TEAM@"
+	db "RECOVER@"
+	db "HARDEN@"
+	db "MINIMIZE@"
+	db "SMOKESCREEN@"
+	db "CONFUSE RAY@"
+	db "WITHDRAW@"
+	db "DEFENSE CURL@"
+	db "BARRIER@"
+	db "LIGHT SCREEN@"
+	db "HAZE@"
+	db "REFLECT@"
+	db "FOCUS ENERGY@"
+	db "BIDE@"
+	db "METRONOME@"
+	db "MIRROR MOVE@"
+	db "SELFDESTRUCT@"
+	db "EGG BOMB@"
+	db "LICK@"
+	db "SMOG@"
+	db "SLUDGE@"
+	db "BONE CLUB@"
+	db "FIRE BLAST@"
+	db "WATERFALL@"
+	db "CLAMP@"
+	db "SWIFT@"
+	db "SKULL BASH@"
+	db "SPIKE CANNON@"
+	db "CONSTRICT@"
+	db "AMNESIA@"
+	db "KINESIS@"
+	db "SOFTBOILED@"
+	db "HI JUMP KICK@"
+	db "GLARE@"
+	db "DREAM EATER@"
+	db "POISON GAS@"
+	db "BARRAGE@"
+	db "LEECH LIFE@"
+	db "LOVELY KISS@"
+	db "SKY ATTACK@"
+	db "TRANSFORM@"
+	db "BUBBLE@"
+	db "DIZZY PUNCH@"
+	db "SPORE@"
+	db "FLASH@"
+	db "PSYWAVE@"
+	db "SPLASH@"
+	db "ACID ARMOR@"
+	db "CRABHAMMER@"
+	db "EXPLOSION@"
+	db "FURY SWIPES@"
+	db "BONEMERANG@"
+	db "REST@"
+	db "ROCK SLIDE@"
+	db "HYPER FANG@"
+	db "SHARPEN@"
+	db "CONVERSION@"
+	db "TRI ATTACK@"
+	db "SUPER FANG@"
+	db "SLASH@"
+	db "SUBSTITUTE@"
+	db "STRUGGLE@"
+	db "SKETCH@"
+	db "TRIPLE KICK@"
+	db "THIEF@"
+	db "SPIDER WEB@"
+	db "MIND READER@"
+	db "NIGHTMARE@"
+	db "FLAME WHEEL@"
+	db "SNORE@"
+	db "CURSE@"
+	db "FLAIL@"
+	db "CONVERSION2@"
+	db "AEROBLAST@"
+	db "COTTON SPORE@"
+	db "REVERSAL@"
+	db "SPITE@"
+	db "POWDER SNOW@"
+	db "PROTECT@"
+	db "MACH PUNCH@"
+	db "SCARY FACE@"
+	db "FAINT ATTACK@"
+	db "SWEET KISS@"
+	db "BELLY DRUM@"
+	db "SLUDGE BOMB@"
+	db "MUD-SLAP@"
+	db "OCTAZOOKA@"
+	db "SPIKES@"
+	db "ZAP CANNON@"
+	db "FORESIGHT@"
+	db "DESTINY BOND@"
+	db "PERISH SONG@"
+	db "ICY WIND@"
+	db "DETECT@"
+	db "BONE RUSH@"
+	db "LOCK-ON@"
+	db "OUTRAGE@"
+	db "SANDSTORM@"
+	db "GIGA DRAIN@"
+	db "ENDURE@"
+	db "CHARM@"
+	db "ROLLOUT@"
+	db "FALSE SWIPE@"
+	db "SWAGGER@"
+	db "MILK DRINK@"
+	db "SPARK@"
+	db "FURY CUTTER@"
+	db "STEEL WING@"
+	db "MEAN LOOK@"
+	db "ATTRACT@"
+	db "SLEEP TALK@"
+	db "HEAL BELL@"
+	db "RETURN@"
+	db "PRESENT@"
+	db "FRUSTRATION@"
+	db "SAFEGUARD@"
+	db "PAIN SPLIT@"
+	db "SACRED FIRE@"
+	db "MAGNITUDE@"
+	db "DYNAMICPUNCH@"
+	db "MEGAHORN@"
+	db "DRAGONBREATH@"
+	db "BATON PASS@"
+	db "ENCORE@"
+	db "PURSUIT@"
+	db "RAPID SPIN@"
+	db "SWEET SCENT@"
+	db "IRON TAIL@"
+	db "METAL CLAW@"
+	db "VITAL THROW@"
+	db "MORNING SUN@"
+	db "SYNTHESIS@"
+	db "MOONLIGHT@"
+	db "HIDDEN POWER@"
+	db "CROSS CHOP@"
+	db "TWISTER@"
+	db "RAIN DANCE@"
+	db "SUNNY DAY@"
+	db "CRUNCH@"
+	db "MIRROR COAT@"
+	db "PSYCH UP@"
+	db "EXTREMESPEED@"
+	db "ANCIENTPOWER@"
+	db "SHADOW BALL@"
+	db "FUTURE SIGHT@"
+	db "ROCK SMASH@"
+	db "WHIRLPOOL@"
+	db "BEAT UP@"
--- /dev/null
+++ b/data/moves/moves.asm
@@ -1,0 +1,265 @@
+; Characteristics of each move.
+
+move: MACRO
+	db \1 ; animation
+	db \2 ; effect
+	db \3 ; power
+	db \4 ; type
+	db \5 percent ; accuracy
+	db \6 ; pp
+	db \7 percent ; effect chance
+ENDM
+
+Moves: ; 41afb
+; entries correspond to constants/move_constants.asm
+	move POUND,        EFFECT_NORMAL_HIT,         40, NORMAL,   100, 35,   0
+	move KARATE_CHOP,  EFFECT_NORMAL_HIT,         50, FIGHTING, 100, 25,   0
+	move DOUBLESLAP,   EFFECT_MULTI_HIT,          15, NORMAL,    85, 10,   0
+	move COMET_PUNCH,  EFFECT_MULTI_HIT,          18, NORMAL,    85, 15,   0
+	move MEGA_PUNCH,   EFFECT_NORMAL_HIT,         80, NORMAL,    85, 20,   0
+	move PAY_DAY,      EFFECT_PAY_DAY,            40, NORMAL,   100, 20,   0
+	move FIRE_PUNCH,   EFFECT_BURN_HIT,           75, FIRE,     100, 15,  10
+	move ICE_PUNCH,    EFFECT_FREEZE_HIT,         75, ICE,      100, 15,  10
+	move THUNDERPUNCH, EFFECT_PARALYZE_HIT,       75, ELECTRIC, 100, 15,  10
+	move SCRATCH,      EFFECT_NORMAL_HIT,         40, NORMAL,   100, 35,   0
+	move VICEGRIP,     EFFECT_NORMAL_HIT,         55, NORMAL,   100, 30,   0
+	move GUILLOTINE,   EFFECT_OHKO,                0, NORMAL,    30,  5,   0
+	move RAZOR_WIND,   EFFECT_RAZOR_WIND,         80, NORMAL,    75, 10,   0
+	move SWORDS_DANCE, EFFECT_ATTACK_UP_2,         0, NORMAL,   100, 30,   0
+	move CUT,          EFFECT_NORMAL_HIT,         50, NORMAL,    95, 30,   0
+	move GUST,         EFFECT_GUST,               40, FLYING,   100, 35,   0
+	move WING_ATTACK,  EFFECT_NORMAL_HIT,         60, FLYING,   100, 35,   0
+	move WHIRLWIND,    EFFECT_FORCE_SWITCH,        0, NORMAL,   100, 20,   0
+	move FLY,          EFFECT_FLY,                70, FLYING,    95, 15,   0
+	move BIND,         EFFECT_TRAP_TARGET,        15, NORMAL,    75, 20,   0
+	move SLAM,         EFFECT_NORMAL_HIT,         80, NORMAL,    75, 20,   0
+	move VINE_WHIP,    EFFECT_NORMAL_HIT,         35, GRASS,    100, 10,   0
+	move STOMP,        EFFECT_STOMP,              65, NORMAL,   100, 20,  30
+	move DOUBLE_KICK,  EFFECT_DOUBLE_HIT,         30, FIGHTING, 100, 30,   0
+	move MEGA_KICK,    EFFECT_NORMAL_HIT,        120, NORMAL,    75,  5,   0
+	move JUMP_KICK,    EFFECT_JUMP_KICK,          70, FIGHTING,  95, 25,   0
+	move ROLLING_KICK, EFFECT_FLINCH_HIT,         60, FIGHTING,  85, 15,  30
+	move SAND_ATTACK,  EFFECT_ACCURACY_DOWN,       0, GROUND,   100, 15,   0
+	move HEADBUTT,     EFFECT_FLINCH_HIT,         70, NORMAL,   100, 15,  30
+	move HORN_ATTACK,  EFFECT_NORMAL_HIT,         65, NORMAL,   100, 25,   0
+	move FURY_ATTACK,  EFFECT_MULTI_HIT,          15, NORMAL,    85, 20,   0
+	move HORN_DRILL,   EFFECT_OHKO,                1, NORMAL,    30,  5,   0
+	move TACKLE,       EFFECT_NORMAL_HIT,         35, NORMAL,    95, 35,   0
+	move BODY_SLAM,    EFFECT_PARALYZE_HIT,       85, NORMAL,   100, 15,  30
+	move WRAP,         EFFECT_TRAP_TARGET,        15, NORMAL,    85, 20,   0
+	move TAKE_DOWN,    EFFECT_RECOIL_HIT,         90, NORMAL,    85, 20,   0
+	move THRASH,       EFFECT_RAMPAGE,            90, NORMAL,   100, 20,   0
+	move DOUBLE_EDGE,  EFFECT_RECOIL_HIT,        120, NORMAL,   100, 15,   0
+	move TAIL_WHIP,    EFFECT_DEFENSE_DOWN,        0, NORMAL,   100, 30,   0
+	move POISON_STING, EFFECT_POISON_HIT,         15, POISON,   100, 35,  30
+	move TWINEEDLE,    EFFECT_POISON_MULTI_HIT,   25, BUG,      100, 20,  20
+	move PIN_MISSILE,  EFFECT_MULTI_HIT,          14, BUG,       85, 20,   0
+	move LEER,         EFFECT_DEFENSE_DOWN,        0, NORMAL,   100, 30,   0
+	move BITE,         EFFECT_FLINCH_HIT,         60, DARK,     100, 25,  30
+	move GROWL,        EFFECT_ATTACK_DOWN,         0, NORMAL,   100, 40,   0
+	move ROAR,         EFFECT_FORCE_SWITCH,        0, NORMAL,   100, 20,   0
+	move SING,         EFFECT_SLEEP,               0, NORMAL,    55, 15,   0
+	move SUPERSONIC,   EFFECT_CONFUSE,             0, NORMAL,    55, 20,   0
+	move SONICBOOM,    EFFECT_STATIC_DAMAGE,      20, NORMAL,    90, 20,   0
+	move DISABLE,      EFFECT_DISABLE,             0, NORMAL,    55, 20,   0
+	move ACID,         EFFECT_DEFENSE_DOWN_HIT,   40, POISON,   100, 30,  10
+	move EMBER,        EFFECT_BURN_HIT,           40, FIRE,     100, 25,  10
+	move FLAMETHROWER, EFFECT_BURN_HIT,           95, FIRE,     100, 15,  10
+	move MIST,         EFFECT_MIST,                0, ICE,      100, 30,   0
+	move WATER_GUN,    EFFECT_NORMAL_HIT,         40, WATER,    100, 25,   0
+	move HYDRO_PUMP,   EFFECT_NORMAL_HIT,        120, WATER,     80,  5,   0
+	move SURF,         EFFECT_NORMAL_HIT,         95, WATER,    100, 15,   0
+	move ICE_BEAM,     EFFECT_FREEZE_HIT,         95, ICE,      100, 10,  10
+	move BLIZZARD,     EFFECT_FREEZE_HIT,        120, ICE,       70,  5,  10
+	move PSYBEAM,      EFFECT_CONFUSE_HIT,        65, PSYCHIC,  100, 20,  10
+	move BUBBLEBEAM,   EFFECT_SPEED_DOWN_HIT,     65, WATER,    100, 20,  10
+	move AURORA_BEAM,  EFFECT_ATTACK_DOWN_HIT,    65, ICE,      100, 20,  10
+	move HYPER_BEAM,   EFFECT_HYPER_BEAM,        150, NORMAL,    90,  5,   0
+	move PECK,         EFFECT_NORMAL_HIT,         35, FLYING,   100, 35,   0
+	move DRILL_PECK,   EFFECT_NORMAL_HIT,         80, FLYING,   100, 20,   0
+	move SUBMISSION,   EFFECT_RECOIL_HIT,         80, FIGHTING,  80, 25,   0
+	move LOW_KICK,     EFFECT_FLINCH_HIT,         50, FIGHTING,  90, 20,  30
+	move COUNTER,      EFFECT_COUNTER,             1, FIGHTING, 100, 20,   0
+	move SEISMIC_TOSS, EFFECT_LEVEL_DAMAGE,        1, FIGHTING, 100, 20,   0
+	move STRENGTH,     EFFECT_NORMAL_HIT,         80, NORMAL,   100, 15,   0
+	move ABSORB,       EFFECT_LEECH_HIT,          20, GRASS,    100, 20,   0
+	move MEGA_DRAIN,   EFFECT_LEECH_HIT,          40, GRASS,    100, 10,   0
+	move LEECH_SEED,   EFFECT_LEECH_SEED,          0, GRASS,     90, 10,   0
+	move GROWTH,       EFFECT_SP_ATK_UP,           0, NORMAL,   100, 40,   0
+	move RAZOR_LEAF,   EFFECT_NORMAL_HIT,         55, GRASS,     95, 25,   0
+	move SOLARBEAM,    EFFECT_SOLARBEAM,         120, GRASS,    100, 10,   0
+	move POISONPOWDER, EFFECT_POISON,              0, POISON,    75, 35,   0
+	move STUN_SPORE,   EFFECT_PARALYZE,            0, GRASS,     75, 30,   0
+	move SLEEP_POWDER, EFFECT_SLEEP,               0, GRASS,     75, 15,   0
+	move PETAL_DANCE,  EFFECT_RAMPAGE,            70, GRASS,    100, 20,   0
+	move STRING_SHOT,  EFFECT_SPEED_DOWN,          0, BUG,       95, 40,   0
+	move DRAGON_RAGE,  EFFECT_STATIC_DAMAGE,      40, DRAGON,   100, 10,   0
+	move FIRE_SPIN,    EFFECT_TRAP_TARGET,        15, FIRE,      70, 15,   0
+	move THUNDERSHOCK, EFFECT_PARALYZE_HIT,       40, ELECTRIC, 100, 30,  10
+	move THUNDERBOLT,  EFFECT_PARALYZE_HIT,       95, ELECTRIC, 100, 15,  10
+	move THUNDER_WAVE, EFFECT_PARALYZE,            0, ELECTRIC, 100, 20,   0
+	move THUNDER,      EFFECT_THUNDER,           120, ELECTRIC,  70, 10,  30
+	move ROCK_THROW,   EFFECT_NORMAL_HIT,         50, ROCK,      90, 15,   0
+	move EARTHQUAKE,   EFFECT_EARTHQUAKE,        100, GROUND,   100, 10,   0
+	move FISSURE,      EFFECT_OHKO,                1, GROUND,    30,  5,   0
+	move DIG,          EFFECT_FLY,                60, GROUND,   100, 10,   0
+	move TOXIC,        EFFECT_TOXIC,               0, POISON,    85, 10,   0
+	move CONFUSION,    EFFECT_CONFUSE_HIT,        50, PSYCHIC,  100, 25,  10
+	move PSYCHIC_M,    EFFECT_SP_DEF_DOWN_HIT,    90, PSYCHIC,  100, 10,  10
+	move HYPNOSIS,     EFFECT_SLEEP,               0, PSYCHIC,   60, 20,   0
+	move MEDITATE,     EFFECT_ATTACK_UP,           0, PSYCHIC,  100, 40,   0
+	move AGILITY,      EFFECT_SPEED_UP_2,          0, PSYCHIC,  100, 30,   0
+	move QUICK_ATTACK, EFFECT_PRIORITY_HIT,       40, NORMAL,   100, 30,   0
+	move RAGE,         EFFECT_RAGE,               20, NORMAL,   100, 20,   0
+	move TELEPORT,     EFFECT_TELEPORT,            0, PSYCHIC,  100, 20,   0
+	move NIGHT_SHADE,  EFFECT_LEVEL_DAMAGE,        1, GHOST,    100, 15,   0
+	move MIMIC,        EFFECT_MIMIC,               0, NORMAL,   100, 10,   0
+	move SCREECH,      EFFECT_DEFENSE_DOWN_2,      0, NORMAL,    85, 40,   0
+	move DOUBLE_TEAM,  EFFECT_EVASION_UP,          0, NORMAL,   100, 15,   0
+	move RECOVER,      EFFECT_HEAL,                0, NORMAL,   100, 20,   0
+	move HARDEN,       EFFECT_DEFENSE_UP,          0, NORMAL,   100, 30,   0
+	move MINIMIZE,     EFFECT_EVASION_UP,          0, NORMAL,   100, 20,   0
+	move SMOKESCREEN,  EFFECT_ACCURACY_DOWN,       0, NORMAL,   100, 20,   0
+	move CONFUSE_RAY,  EFFECT_CONFUSE,             0, GHOST,    100, 10,   0
+	move WITHDRAW,     EFFECT_DEFENSE_UP,          0, WATER,    100, 40,   0
+	move DEFENSE_CURL, EFFECT_DEFENSE_CURL,        0, NORMAL,   100, 40,   0
+	move BARRIER,      EFFECT_DEFENSE_UP_2,        0, PSYCHIC,  100, 30,   0
+	move LIGHT_SCREEN, EFFECT_LIGHT_SCREEN,        0, PSYCHIC,  100, 30,   0
+	move HAZE,         EFFECT_RESET_STATS,         0, ICE,      100, 30,   0
+	move REFLECT,      EFFECT_REFLECT,             0, PSYCHIC,  100, 20,   0
+	move FOCUS_ENERGY, EFFECT_FOCUS_ENERGY,        0, NORMAL,   100, 30,   0
+	move BIDE,         EFFECT_BIDE,                0, NORMAL,   100, 10,   0
+	move METRONOME,    EFFECT_METRONOME,           0, NORMAL,   100, 10,   0
+	move MIRROR_MOVE,  EFFECT_MIRROR_MOVE,         0, FLYING,   100, 20,   0
+	move SELFDESTRUCT, EFFECT_SELFDESTRUCT,      200, NORMAL,   100,  5,   0
+	move EGG_BOMB,     EFFECT_NORMAL_HIT,        100, NORMAL,    75, 10,   0
+	move LICK,         EFFECT_PARALYZE_HIT,       20, GHOST,    100, 30,  30
+	move SMOG,         EFFECT_POISON_HIT,         20, POISON,    70, 20,  40
+	move SLUDGE,       EFFECT_POISON_HIT,         65, POISON,   100, 20,  30
+	move BONE_CLUB,    EFFECT_FLINCH_HIT,         65, GROUND,    85, 20,  10
+	move FIRE_BLAST,   EFFECT_BURN_HIT,          120, FIRE,      85,  5,  10
+	move WATERFALL,    EFFECT_NORMAL_HIT,         80, WATER,    100, 15,   0
+	move CLAMP,        EFFECT_TRAP_TARGET,        35, WATER,     75, 10,   0
+	move SWIFT,        EFFECT_ALWAYS_HIT,         60, NORMAL,   100, 20,   0
+	move SKULL_BASH,   EFFECT_SKULL_BASH,        100, NORMAL,   100, 15,   0
+	move SPIKE_CANNON, EFFECT_MULTI_HIT,          20, NORMAL,   100, 15,   0
+	move CONSTRICT,    EFFECT_SPEED_DOWN_HIT,     10, NORMAL,   100, 35,  10
+	move AMNESIA,      EFFECT_SP_DEF_UP_2,         0, PSYCHIC,  100, 20,   0
+	move KINESIS,      EFFECT_ACCURACY_DOWN,       0, PSYCHIC,   80, 15,   0
+	move SOFTBOILED,   EFFECT_HEAL,                0, NORMAL,   100, 10,   0
+	move HI_JUMP_KICK, EFFECT_JUMP_KICK,          85, FIGHTING,  90, 20,   0
+	move GLARE,        EFFECT_PARALYZE,            0, NORMAL,    75, 30,   0
+	move DREAM_EATER,  EFFECT_DREAM_EATER,       100, PSYCHIC,  100, 15,   0
+	move POISON_GAS,   EFFECT_POISON,              0, POISON,    55, 40,   0
+	move BARRAGE,      EFFECT_MULTI_HIT,          15, NORMAL,    85, 20,   0
+	move LEECH_LIFE,   EFFECT_LEECH_HIT,          20, BUG,      100, 15,   0
+	move LOVELY_KISS,  EFFECT_SLEEP,               0, NORMAL,    75, 10,   0
+	move SKY_ATTACK,   EFFECT_SKY_ATTACK,        140, FLYING,    90,  5,   0
+	move TRANSFORM,    EFFECT_TRANSFORM,           0, NORMAL,   100, 10,   0
+	move BUBBLE,       EFFECT_SPEED_DOWN_HIT,     20, WATER,    100, 30,  10
+	move DIZZY_PUNCH,  EFFECT_CONFUSE_HIT,        70, NORMAL,   100, 10,  20
+	move SPORE,        EFFECT_SLEEP,               0, GRASS,    100, 15,   0
+	move FLASH,        EFFECT_ACCURACY_DOWN,       0, NORMAL,    70, 20,   0
+	move PSYWAVE,      EFFECT_PSYWAVE,             1, PSYCHIC,   80, 15,   0
+	move SPLASH,       EFFECT_SPLASH,              0, NORMAL,   100, 40,   0
+	move ACID_ARMOR,   EFFECT_DEFENSE_UP_2,        0, POISON,   100, 40,   0
+	move CRABHAMMER,   EFFECT_NORMAL_HIT,         90, WATER,     85, 10,   0
+	move EXPLOSION,    EFFECT_SELFDESTRUCT,      250, NORMAL,   100,  5,   0
+	move FURY_SWIPES,  EFFECT_MULTI_HIT,          18, NORMAL,    80, 15,   0
+	move BONEMERANG,   EFFECT_DOUBLE_HIT,         50, GROUND,    90, 10,   0
+	move REST,         EFFECT_HEAL,                0, PSYCHIC,  100, 10,   0
+	move ROCK_SLIDE,   EFFECT_FLINCH_HIT,         75, ROCK,      90, 10,  30
+	move HYPER_FANG,   EFFECT_FLINCH_HIT,         80, NORMAL,    90, 15,  10
+	move SHARPEN,      EFFECT_ATTACK_UP,           0, NORMAL,   100, 30,   0
+	move CONVERSION,   EFFECT_CONVERSION,          0, NORMAL,   100, 30,   0
+	move TRI_ATTACK,   EFFECT_TRI_ATTACK,         80, NORMAL,   100, 10,  20
+	move SUPER_FANG,   EFFECT_SUPER_FANG,          1, NORMAL,    90, 10,   0
+	move SLASH,        EFFECT_NORMAL_HIT,         70, NORMAL,   100, 20,   0
+	move SUBSTITUTE,   EFFECT_SUBSTITUTE,          0, NORMAL,   100, 10,   0
+	move STRUGGLE,     EFFECT_RECOIL_HIT,         50, NORMAL,   100,  1,   0
+	move SKETCH,       EFFECT_SKETCH,              0, NORMAL,   100,  1,   0
+	move TRIPLE_KICK,  EFFECT_TRIPLE_KICK,        10, FIGHTING,  90, 10,   0
+	move THIEF,        EFFECT_THIEF,              40, DARK,     100, 10, 100
+	move SPIDER_WEB,   EFFECT_MEAN_LOOK,           0, BUG,      100, 10,   0
+	move MIND_READER,  EFFECT_LOCK_ON,             0, NORMAL,   100,  5,   0
+	move NIGHTMARE,    EFFECT_NIGHTMARE,           0, GHOST,    100, 15,   0
+	move FLAME_WHEEL,  EFFECT_FLAME_WHEEL,        60, FIRE,     100, 25,  10
+	move SNORE,        EFFECT_SNORE,              40, NORMAL,   100, 15,  30
+	move CURSE,        EFFECT_CURSE,               0, CURSE_T,  100, 10,   0
+	move FLAIL,        EFFECT_REVERSAL,            1, NORMAL,   100, 15,   0
+	move CONVERSION2,  EFFECT_CONVERSION2,         0, NORMAL,   100, 30,   0
+	move AEROBLAST,    EFFECT_NORMAL_HIT,        100, FLYING,    95,  5,   0
+	move COTTON_SPORE, EFFECT_SPEED_DOWN_2,        0, GRASS,     85, 40,   0
+	move REVERSAL,     EFFECT_REVERSAL,            1, FIGHTING, 100, 15,   0
+	move SPITE,        EFFECT_SPITE,               0, GHOST,    100, 10,   0
+	move POWDER_SNOW,  EFFECT_FREEZE_HIT,         40, ICE,      100, 25,  10
+	move PROTECT,      EFFECT_PROTECT,             0, NORMAL,   100, 10,   0
+	move MACH_PUNCH,   EFFECT_PRIORITY_HIT,       40, FIGHTING, 100, 30,   0
+	move SCARY_FACE,   EFFECT_SPEED_DOWN_2,        0, NORMAL,    90, 10,   0
+	move FAINT_ATTACK, EFFECT_ALWAYS_HIT,         60, DARK,     100, 20,   0
+	move SWEET_KISS,   EFFECT_CONFUSE,             0, NORMAL,    75, 10,   0
+	move BELLY_DRUM,   EFFECT_BELLY_DRUM,          0, NORMAL,   100, 10,   0
+	move SLUDGE_BOMB,  EFFECT_POISON_HIT,         90, POISON,   100, 10,  30
+	move MUD_SLAP,     EFFECT_ACCURACY_DOWN_HIT,  20, GROUND,   100, 10, 100
+	move OCTAZOOKA,    EFFECT_ACCURACY_DOWN_HIT,  65, WATER,     85, 10,  50
+	move SPIKES,       EFFECT_SPIKES,              0, GROUND,   100, 20,   0
+	move ZAP_CANNON,   EFFECT_PARALYZE_HIT,      100, ELECTRIC,  50,  5, 100
+	move FORESIGHT,    EFFECT_FORESIGHT,           0, NORMAL,   100, 40,   0
+	move DESTINY_BOND, EFFECT_DESTINY_BOND,        0, GHOST,    100,  5,   0
+	move PERISH_SONG,  EFFECT_PERISH_SONG,         0, NORMAL,   100,  5,   0
+	move ICY_WIND,     EFFECT_SPEED_DOWN_HIT,     55, ICE,       95, 15, 100
+	move DETECT,       EFFECT_PROTECT,             0, FIGHTING, 100,  5,   0
+	move BONE_RUSH,    EFFECT_MULTI_HIT,          25, GROUND,    80, 10,   0
+	move LOCK_ON,      EFFECT_LOCK_ON,             0, NORMAL,   100,  5,   0
+	move OUTRAGE,      EFFECT_RAMPAGE,            90, DRAGON,   100, 15,   0
+	move SANDSTORM,    EFFECT_SANDSTORM,           0, ROCK,     100, 10,   0
+	move GIGA_DRAIN,   EFFECT_LEECH_HIT,          60, GRASS,    100,  5,   0
+	move ENDURE,       EFFECT_ENDURE,              0, NORMAL,   100, 10,   0
+	move CHARM,        EFFECT_ATTACK_DOWN_2,       0, NORMAL,   100, 20,   0
+	move ROLLOUT,      EFFECT_ROLLOUT,            30, ROCK,      90, 20,   0
+	move FALSE_SWIPE,  EFFECT_FALSE_SWIPE,        40, NORMAL,   100, 40,   0
+	move SWAGGER,      EFFECT_SWAGGER,             0, NORMAL,    90, 15, 100
+	move MILK_DRINK,   EFFECT_HEAL,                0, NORMAL,   100, 10,   0
+	move SPARK,        EFFECT_PARALYZE_HIT,       65, ELECTRIC, 100, 20,  30
+	move FURY_CUTTER,  EFFECT_FURY_CUTTER,        10, BUG,       95, 20,   0
+	move STEEL_WING,   EFFECT_DEFENSE_UP_HIT,     70, STEEL,     90, 25,  10
+	move MEAN_LOOK,    EFFECT_MEAN_LOOK,           0, NORMAL,   100,  5,   0
+	move ATTRACT,      EFFECT_ATTRACT,             0, NORMAL,   100, 15,   0
+	move SLEEP_TALK,   EFFECT_SLEEP_TALK,          0, NORMAL,   100, 10,   0
+	move HEAL_BELL,    EFFECT_HEAL_BELL,           0, NORMAL,   100,  5,   0
+	move RETURN,       EFFECT_RETURN,              1, NORMAL,   100, 20,   0
+	move PRESENT,      EFFECT_PRESENT,             1, NORMAL,    90, 15,   0
+	move FRUSTRATION,  EFFECT_FRUSTRATION,         1, NORMAL,   100, 20,   0
+	move SAFEGUARD,    EFFECT_SAFEGUARD,           0, NORMAL,   100, 25,   0
+	move PAIN_SPLIT,   EFFECT_PAIN_SPLIT,          0, NORMAL,   100, 20,   0
+	move SACRED_FIRE,  EFFECT_SACRED_FIRE,       100, FIRE,      95,  5,  50
+	move MAGNITUDE,    EFFECT_MAGNITUDE,           1, GROUND,   100, 30,   0
+	move DYNAMICPUNCH, EFFECT_CONFUSE_HIT,       100, FIGHTING,  50,  5, 100
+	move MEGAHORN,     EFFECT_NORMAL_HIT,        120, BUG,       85, 10,   0
+	move DRAGONBREATH, EFFECT_PARALYZE_HIT,       60, DRAGON,   100, 20,  30
+	move BATON_PASS,   EFFECT_BATON_PASS,          0, NORMAL,   100, 40,   0
+	move ENCORE,       EFFECT_ENCORE,              0, NORMAL,   100,  5,   0
+	move PURSUIT,      EFFECT_PURSUIT,            40, DARK,     100, 20,   0
+	move RAPID_SPIN,   EFFECT_RAPID_SPIN,         20, NORMAL,   100, 40,   0
+	move SWEET_SCENT,  EFFECT_EVASION_DOWN,        0, NORMAL,   100, 20,   0
+	move IRON_TAIL,    EFFECT_DEFENSE_DOWN_HIT,  100, STEEL,     75, 15,  30
+	move METAL_CLAW,   EFFECT_ATTACK_UP_HIT,      50, STEEL,     95, 35,  10
+	move VITAL_THROW,  EFFECT_ALWAYS_HIT,         70, FIGHTING, 100, 10,   0
+	move MORNING_SUN,  EFFECT_MORNING_SUN,         0, NORMAL,   100,  5,   0
+	move SYNTHESIS,    EFFECT_SYNTHESIS,           0, GRASS,    100,  5,   0
+	move MOONLIGHT,    EFFECT_MOONLIGHT,           0, NORMAL,   100,  5,   0
+	move HIDDEN_POWER, EFFECT_HIDDEN_POWER,        1, NORMAL,   100, 15,   0
+	move CROSS_CHOP,   EFFECT_NORMAL_HIT,        100, FIGHTING,  80,  5,   0
+	move TWISTER,      EFFECT_TWISTER,            40, DRAGON,   100, 20,  20
+	move RAIN_DANCE,   EFFECT_RAIN_DANCE,          0, WATER,     90,  5,   0
+	move SUNNY_DAY,    EFFECT_SUNNY_DAY,           0, FIRE,      90,  5,   0
+	move CRUNCH,       EFFECT_SP_DEF_DOWN_HIT,    80, DARK,     100, 15,  20
+	move MIRROR_COAT,  EFFECT_MIRROR_COAT,         1, PSYCHIC,  100, 20,   0
+	move PSYCH_UP,     EFFECT_PSYCH_UP,            0, NORMAL,   100, 10,   0
+	move EXTREMESPEED, EFFECT_PRIORITY_HIT,       80, NORMAL,   100,  5,   0
+	move ANCIENTPOWER, EFFECT_ALL_UP_HIT,         60, ROCK,     100,  5,  10
+	move SHADOW_BALL,  EFFECT_SP_DEF_DOWN_HIT,    80, GHOST,    100, 15,  20
+	move FUTURE_SIGHT, EFFECT_FUTURE_SIGHT,       80, PSYCHIC,   90, 15,   0
+	move ROCK_SMASH,   EFFECT_DEFENSE_DOWN_HIT,   20, FIGHTING, 100, 15,  50
+	move WHIRLPOOL,    EFFECT_TRAP_TARGET,        15, WATER,     70, 15,   0
+	move BEAT_UP,      EFFECT_BEAT_UP,            10, DARK,     100, 10,   0
--- /dev/null
+++ b/data/moves/tmhm_moves.asm
@@ -1,0 +1,66 @@
+TMHMMoves: ; 1167a
+; TMs
+	db DYNAMICPUNCH
+	db HEADBUTT
+	db CURSE
+	db ROLLOUT
+	db ROAR
+	db TOXIC
+	db ZAP_CANNON
+	db ROCK_SMASH
+	db PSYCH_UP
+	db HIDDEN_POWER
+	db SUNNY_DAY
+	db SWEET_SCENT
+	db SNORE
+	db BLIZZARD
+	db HYPER_BEAM
+	db ICY_WIND
+	db PROTECT
+	db RAIN_DANCE
+	db GIGA_DRAIN
+	db ENDURE
+	db FRUSTRATION
+	db SOLARBEAM
+	db IRON_TAIL
+	db DRAGONBREATH
+	db THUNDER
+	db EARTHQUAKE
+	db RETURN
+	db DIG
+	db PSYCHIC_M
+	db SHADOW_BALL
+	db MUD_SLAP
+	db DOUBLE_TEAM
+	db ICE_PUNCH
+	db SWAGGER
+	db SLEEP_TALK
+	db SLUDGE_BOMB
+	db SANDSTORM
+	db FIRE_BLAST
+	db SWIFT
+	db DEFENSE_CURL
+	db THUNDERPUNCH
+	db DREAM_EATER
+	db DETECT
+	db REST
+	db ATTRACT
+	db THIEF
+	db STEEL_WING
+	db FIRE_PUNCH
+	db FURY_CUTTER
+	db NIGHTMARE
+; HMs
+	db CUT
+	db FLY
+	db SURF
+	db STRENGTH
+	db FLASH
+	db WHIRLPOOL
+	db WATERFALL
+; Move tutor
+	db FLAMETHROWER
+	db THUNDERBOLT
+	db ICE_BEAM
+	db 0 ; end
+; 116b7
--- a/data/mystery_gift/decos.asm
+++ /dev/null
@@ -1,40 +1,0 @@
-MysteryGiftDecos: ; 2c74a
-	db DECOFLAG_PIKACHU_DOLL
-	db DECOFLAG_BULBASAUR_DOLL
-	db DECOFLAG_CHARMANDER_DOLL
-	db DECOFLAG_SQUIRTLE_DOLL
-	db DECOFLAG_POLIWAG_DOLL
-	db DECOFLAG_DIGLETT_DOLL
-	db DECOFLAG_STARMIE_DOLL
-	db DECOFLAG_MAGIKARP_DOLL
-	db DECOFLAG_ODDISH_DOLL
-	db DECOFLAG_GENGAR_DOLL
-	db DECOFLAG_CLEFAIRY_POSTER
-	db DECOFLAG_JIGGLYPUFF_POSTER
-	db DECOFLAG_SNES
-	db DECOFLAG_SHELLDER_DOLL
-	db DECOFLAG_VOLTORB_DOLL
-	db DECOFLAG_WEEDLE_DOLL
-	db DECOFLAG_MAGNAPLANT
-	db DECOFLAG_TROPICPLANT
-	db DECOFLAG_FAMICOM
-	db DECOFLAG_N64
-	db DECOFLAG_SURF_PIKACHU_DOLL
-	db DECOFLAG_JIGGLYPUFF_DOLL
-	db DECOFLAG_PINK_BED
-	db DECOFLAG_POLKADOT_BED
-	db DECOFLAG_RED_CARPET
-	db DECOFLAG_BLUE_CARPET
-	db DECOFLAG_YELLOW_CARPET
-	db DECOFLAG_GREEN_CARPET
-	db DECOFLAG_JUMBOPLANT
-	db DECOFLAG_VIRTUAL_BOY
-	db DECOFLAG_MACHOP_DOLL
-	db DECOFLAG_PIKACHU_POSTER
-	db DECOFLAG_TENTACOOL_DOLL
-	db DECOFLAG_BIG_ONIX_DOLL
-	db DECOFLAG_PIKACHU_BED
-	db DECOFLAG_GRIMER_DOLL
-	db DECOFLAG_UNOWN_DOLL
-MysteryGiftDecosEnd
-; 2c76f
--- a/data/mystery_gift/items.asm
+++ /dev/null
@@ -1,40 +1,0 @@
-MysteryGiftItems: ; 2c725
-	db BERRY
-	db PRZCUREBERRY
-	db MINT_BERRY
-	db ICE_BERRY
-	db BURNT_BERRY
-	db PSNCUREBERRY
-	db GUARD_SPEC
-	db X_DEFEND
-	db X_ATTACK
-	db BITTER_BERRY
-	db DIRE_HIT
-	db X_SPECIAL
-	db X_ACCURACY
-	db EON_MAIL
-	db MORPH_MAIL
-	db MUSIC_MAIL
-	db MIRACLEBERRY
-	db GOLD_BERRY
-	db REVIVE
-	db GREAT_BALL
-	db SUPER_REPEL
-	db MAX_REPEL
-	db ELIXER
-	db ETHER
-	db WATER_STONE
-	db FIRE_STONE
-	db LEAF_STONE
-	db THUNDERSTONE
-	db MAX_ETHER
-	db MAX_ELIXER
-	db MAX_REVIVE
-	db SCOPE_LENS
-	db HP_UP
-	db PP_UP
-	db RARE_CANDY
-	db BLUESKY_MAIL
-	db MIRAGE_MAIL
-MysteryGiftItemsEnd:
-; 2c74a
--- /dev/null
+++ b/data/mystery_gift_decos.asm
@@ -1,0 +1,40 @@
+MysteryGiftDecos: ; 2c74a
+	db DECOFLAG_PIKACHU_DOLL
+	db DECOFLAG_BULBASAUR_DOLL
+	db DECOFLAG_CHARMANDER_DOLL
+	db DECOFLAG_SQUIRTLE_DOLL
+	db DECOFLAG_POLIWAG_DOLL
+	db DECOFLAG_DIGLETT_DOLL
+	db DECOFLAG_STARMIE_DOLL
+	db DECOFLAG_MAGIKARP_DOLL
+	db DECOFLAG_ODDISH_DOLL
+	db DECOFLAG_GENGAR_DOLL
+	db DECOFLAG_CLEFAIRY_POSTER
+	db DECOFLAG_JIGGLYPUFF_POSTER
+	db DECOFLAG_SNES
+	db DECOFLAG_SHELLDER_DOLL
+	db DECOFLAG_VOLTORB_DOLL
+	db DECOFLAG_WEEDLE_DOLL
+	db DECOFLAG_MAGNAPLANT
+	db DECOFLAG_TROPICPLANT
+	db DECOFLAG_FAMICOM
+	db DECOFLAG_N64
+	db DECOFLAG_SURF_PIKACHU_DOLL
+	db DECOFLAG_JIGGLYPUFF_DOLL
+	db DECOFLAG_PINK_BED
+	db DECOFLAG_POLKADOT_BED
+	db DECOFLAG_RED_CARPET
+	db DECOFLAG_BLUE_CARPET
+	db DECOFLAG_YELLOW_CARPET
+	db DECOFLAG_GREEN_CARPET
+	db DECOFLAG_JUMBOPLANT
+	db DECOFLAG_VIRTUAL_BOY
+	db DECOFLAG_MACHOP_DOLL
+	db DECOFLAG_PIKACHU_POSTER
+	db DECOFLAG_TENTACOOL_DOLL
+	db DECOFLAG_BIG_ONIX_DOLL
+	db DECOFLAG_PIKACHU_BED
+	db DECOFLAG_GRIMER_DOLL
+	db DECOFLAG_UNOWN_DOLL
+MysteryGiftDecosEnd
+; 2c76f
--- /dev/null
+++ b/data/mystery_gift_items.asm
@@ -1,0 +1,40 @@
+MysteryGiftItems: ; 2c725
+	db BERRY
+	db PRZCUREBERRY
+	db MINT_BERRY
+	db ICE_BERRY
+	db BURNT_BERRY
+	db PSNCUREBERRY
+	db GUARD_SPEC
+	db X_DEFEND
+	db X_ATTACK
+	db BITTER_BERRY
+	db DIRE_HIT
+	db X_SPECIAL
+	db X_ACCURACY
+	db EON_MAIL
+	db MORPH_MAIL
+	db MUSIC_MAIL
+	db MIRACLEBERRY
+	db GOLD_BERRY
+	db REVIVE
+	db GREAT_BALL
+	db SUPER_REPEL
+	db MAX_REPEL
+	db ELIXER
+	db ETHER
+	db WATER_STONE
+	db FIRE_STONE
+	db LEAF_STONE
+	db THUNDERSTONE
+	db MAX_ETHER
+	db MAX_ELIXER
+	db MAX_REVIVE
+	db SCOPE_LENS
+	db HP_UP
+	db PP_UP
+	db RARE_CANDY
+	db BLUESKY_MAIL
+	db MIRAGE_MAIL
+MysteryGiftItemsEnd:
+; 2c74a
--- a/data/sprite_anim_frames.asm
+++ /dev/null
@@ -1,499 +1,0 @@
-SpriteAnimFrameData: ; 8d6e6
-; entries correspond to SPRITE_ANIM_FRAMESET_* constants
-	dw .Frameset_00
-	dw .Frameset_PartyMon
-	dw .Frameset_PartyMonWithMail
-	dw .Frameset_PartyMonWithItem
-	dw .Frameset_PartyMonFast
-	dw .Frameset_PartyMonWithMailFast
-	dw .Frameset_PartyMonWithItemFast
-	dw .Frameset_GSTitleTrail
-	dw .Frameset_TextEntryCursor
-	dw .Frameset_09
-	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_TradePokeBall0
-	dw .Frameset_TradePoof
-	dw .Frameset_TradeTubeBulge
-	dw .Frameset_TrademonIcon
-	dw .Frameset_TrademonBubble
-	dw .Frameset_EvolutionBallOfLight
-	dw .Frameset_RadioTuningKnob
-	dw .Frameset_MagnetTrainRed
-	dw .Frameset_1c
-	dw .Frameset_Leaf
-	dw .Frameset_CutTree
-	dw .Frameset_EggCrack
-	dw .Frameset_EggHatch
-	dw .Frameset_21
-	dw .Frameset_22
-	dw .Frameset_23
-	dw .Frameset_24
-	dw .Frameset_HeadbuttTree
-	dw .Frameset_26
-	dw .Frameset_27
-	dw .Frameset_28
-	dw .Frameset_29
-	dw .Frameset_2a
-	dw .Frameset_2b
-	dw .Frameset_2c
-	dw .Frameset_BlueWalk
-	dw .Frameset_MagnetTrainBlue
-	dw .Frameset_MobileTradeSentBall
-	dw .Frameset_MobileTradeOTBall
-	dw .Frameset_ForMobile22
-	dw .Frameset_ForMobile23
-	dw .Frameset_ForMobile24
-	dw .Frameset_ForMobile25
-	dw .Frameset_IntroSuicune
-	dw .Frameset_IntroSuicune2
-	dw .Frameset_IntroPichu
-	dw .Frameset_IntroWooper
-	dw .Frameset_IntroUnown1
-	dw .Frameset_IntroUnown2
-	dw .Frameset_IntroUnown3
-	dw .Frameset_IntroUnown4
-	dw .Frameset_IntroUnownF2
-	dw .Frameset_IntroSuicuneAway
-	dw .Frameset_IntroUnownF
-	dw .Frameset_CelebiLeft
-	dw .Frameset_CelebiRight
-; 8d76a
-
-.Frameset_00:
-	frame SPRITE_ANIM_FRAME_IDX_RED_WALK_1, 32
-	endanim
-
-.Frameset_PartyMon:
-	frame SPRITE_ANIM_FRAME_IDX_RED_WALK_1,  8
-	frame SPRITE_ANIM_FRAME_IDX_RED_WALK_2,  8
-	dorestart
-
-.Frameset_PartyMonWithMail:
-	frame SPRITE_ANIM_FRAME_IDX_PARTY_MON_WITH_MAIL_1,  8
-	frame SPRITE_ANIM_FRAME_IDX_PARTY_MON_WITH_MAIL_2,  8
-	dorestart
-
-.Frameset_PartyMonWithItem:
-	frame SPRITE_ANIM_FRAME_IDX_PARTY_MON_WITH_ITEM_1,  8
-	frame SPRITE_ANIM_FRAME_IDX_PARTY_MON_WITH_ITEM_2,  8
-	dorestart
-
-.Frameset_PartyMonFast:
-	frame SPRITE_ANIM_FRAME_IDX_RED_WALK_1,  4
-	frame SPRITE_ANIM_FRAME_IDX_RED_WALK_2,  4
-	dorestart
-
-.Frameset_PartyMonWithMailFast:
-	frame SPRITE_ANIM_FRAME_IDX_PARTY_MON_WITH_MAIL_1,  4
-	frame SPRITE_ANIM_FRAME_IDX_PARTY_MON_WITH_MAIL_2,  4
-	dorestart
-
-.Frameset_PartyMonWithItemFast:
-	frame SPRITE_ANIM_FRAME_IDX_PARTY_MON_WITH_ITEM_1,  4
-	frame SPRITE_ANIM_FRAME_IDX_PARTY_MON_WITH_ITEM_2,  4
-	dorestart
-
-.Frameset_RedWalk:
-	frame SPRITE_ANIM_FRAME_IDX_RED_WALK_1,  8
-	frame SPRITE_ANIM_FRAME_IDX_RED_WALK_2,  8
-	frame SPRITE_ANIM_FRAME_IDX_RED_WALK_1,  8
-	frame SPRITE_ANIM_FRAME_IDX_RED_WALK_2,  8, OAM_X_FLIP
-	dorestart
-
-.Frameset_BlueWalk:
-	frame SPRITE_ANIM_FRAME_IDX_BLUE_WALK_1,  8
-	frame SPRITE_ANIM_FRAME_IDX_BLUE_WALK_2,  8
-	frame SPRITE_ANIM_FRAME_IDX_BLUE_WALK_1,  8
-	frame SPRITE_ANIM_FRAME_IDX_BLUE_WALK_2,  8, OAM_X_FLIP
-	dorestart
-
-.Frameset_MagnetTrainBlue:
-	frame SPRITE_ANIM_FRAME_IDX_MAGNET_TRAIN_BLUE_1,  8
-	frame SPRITE_ANIM_FRAME_IDX_MAGNET_TRAIN_BLUE_2,  8
-	frame SPRITE_ANIM_FRAME_IDX_MAGNET_TRAIN_BLUE_1,  8
-	frame SPRITE_ANIM_FRAME_IDX_MAGNET_TRAIN_BLUE_2,  8, OAM_X_FLIP
-	dorestart
-
-.Frameset_GSTitleTrail:
-	frame SPRITE_ANIM_FRAME_IDX_GS_TITLE_TRAIL_1,  1
-	frame SPRITE_ANIM_FRAME_IDX_GS_TITLE_TRAIL_2,  1
-	dorestart
-
-.Frameset_TextEntryCursor:
-	frame SPRITE_ANIM_FRAME_IDX_TEXT_ENTRY_CURSOR,  1
-	dorepeat  1
-	dorestart
-
-.Frameset_09:
-	frame SPRITE_ANIM_FRAME_IDX_FOR_FRAMESET_09,  1
-	dorepeat  1
-	dorestart
-
-.Frameset_GameFreakLogo:
-	frame SPRITE_ANIM_FRAME_IDX_GAMEFREAK_LOGO_1,  12
-	frame SPRITE_ANIM_FRAME_IDX_GAMEFREAK_LOGO_2,   1
-	frame SPRITE_ANIM_FRAME_IDX_GAMEFREAK_LOGO_3,   1
-	frame SPRITE_ANIM_FRAME_IDX_GAMEFREAK_LOGO_2,   4
-	frame SPRITE_ANIM_FRAME_IDX_GAMEFREAK_LOGO_1,  12
-	frame SPRITE_ANIM_FRAME_IDX_GAMEFREAK_LOGO_2,  12
-	frame SPRITE_ANIM_FRAME_IDX_GAMEFREAK_LOGO_3,   4
-	frame SPRITE_ANIM_FRAME_IDX_GAMEFREAK_LOGO_4,  32
-	frame SPRITE_ANIM_FRAME_IDX_GAMEFREAK_LOGO_5,   3
-	frame SPRITE_ANIM_FRAME_IDX_GAMEFREAK_LOGO_6,   3
-	frame SPRITE_ANIM_FRAME_IDX_GAMEFREAK_LOGO_7,   4
-	frame SPRITE_ANIM_FRAME_IDX_GAMEFREAK_LOGO_8,   4
-	frame SPRITE_ANIM_FRAME_IDX_GAMEFREAK_LOGO_9,   4
-	frame SPRITE_ANIM_FRAME_IDX_GAMEFREAK_LOGO_10, 10
-	frame SPRITE_ANIM_FRAME_IDX_GAMEFREAK_LOGO_11,  7
-	endanim
-
-.Frameset_GSIntroStar:
-	frame SPRITE_ANIM_FRAME_IDX_GS_INTRO_STAR,  3
-	frame SPRITE_ANIM_FRAME_IDX_GS_INTRO_STAR,  3, OAM_Y_FLIP
-	dorestart
-
-.Frameset_GSIntroSparkle:
-	frame SPRITE_ANIM_FRAME_IDX_GS_INTRO_SPARKLE_1,  2
-	frame SPRITE_ANIM_FRAME_IDX_GS_INTRO_SPARKLE_2,  2
-	frame SPRITE_ANIM_FRAME_IDX_GS_INTRO_SPARKLE_3,  2
-	frame SPRITE_ANIM_FRAME_IDX_GS_INTRO_SPARKLE_2,  2
-	dorestart
-
-.Frameset_SlotsGolem:
-	frame SPRITE_ANIM_FRAME_IDX_SLOTS_GOLEM_1,  7
-	frame SPRITE_ANIM_FRAME_IDX_SLOTS_GOLEM_2,  7
-	frame SPRITE_ANIM_FRAME_IDX_SLOTS_GOLEM_1,  7, OAM_Y_FLIP
-	frame SPRITE_ANIM_FRAME_IDX_SLOTS_GOLEM_2,  7, OAM_X_FLIP
-	dorestart
-
-.Frameset_SlotsChansey:
-	frame SPRITE_ANIM_FRAME_IDX_SLOTS_CHANSEY_1,  7
-	frame SPRITE_ANIM_FRAME_IDX_SLOTS_CHANSEY_2,  7
-	frame SPRITE_ANIM_FRAME_IDX_SLOTS_CHANSEY_1,  7
-	frame SPRITE_ANIM_FRAME_IDX_SLOTS_CHANSEY_3,  7
-	dorestart
-
-.Frameset_SlotsChansey2:
-	frame SPRITE_ANIM_FRAME_IDX_SLOTS_CHANSEY_1,  7
-	frame SPRITE_ANIM_FRAME_IDX_SLOTS_CHANSEY_4,  7
-	frame SPRITE_ANIM_FRAME_IDX_SLOTS_CHANSEY_5,  7
-	frame SPRITE_ANIM_FRAME_IDX_SLOTS_CHANSEY_4,  7
-	frame SPRITE_ANIM_FRAME_IDX_SLOTS_CHANSEY_1,  7
-	endanim
-
-.Frameset_SlotsEgg:
-	frame SPRITE_ANIM_FRAME_IDX_SLOTS_EGG, 20
-	endanim
-
-.Frameset_StillCursor:
-	frame SPRITE_ANIM_FRAME_IDX_STILL_CURSOR, 32
-	endanim
-
-.Frameset_TradePokeBall:
-	frame SPRITE_ANIM_FRAME_IDX_TRADE_POKE_BALL_1, 32
-	endanim
-
-.Frameset_TradePokeBall0:
-	frame SPRITE_ANIM_FRAME_IDX_TRADE_POKE_BALL_1,  3
-	frame SPRITE_ANIM_FRAME_IDX_TRADE_POKE_BALL_2,  3
-	frame SPRITE_ANIM_FRAME_IDX_TRADE_POKE_BALL_1,  3
-	frame SPRITE_ANIM_FRAME_IDX_TRADE_POKE_BALL_2,  3, OAM_X_FLIP
-	dorestart
-
-.Frameset_TradePoof:
-	frame SPRITE_ANIM_FRAME_IDX_TRADE_POOF_1,  4
-	frame SPRITE_ANIM_FRAME_IDX_TRADE_POOF_2,  4
-	frame SPRITE_ANIM_FRAME_IDX_TRADE_POOF_3,  4
-	delanim
-
-.Frameset_TradeTubeBulge:
-	frame SPRITE_ANIM_FRAME_IDX_35,  3
-	frame SPRITE_ANIM_FRAME_IDX_36,  3
-	dorestart
-
-.Frameset_TrademonIcon:
-	frame SPRITE_ANIM_FRAME_IDX_TRADEMON_ICON_1,  7
-	frame SPRITE_ANIM_FRAME_IDX_TRADEMON_ICON_2,  7
-	dorestart
-
-.Frameset_TrademonBubble:
-	frame SPRITE_ANIM_FRAME_IDX_TRADEMON_BUBBLE, 32
-	endanim
-
-.Frameset_EvolutionBallOfLight:
-	frame SPRITE_ANIM_FRAME_IDX_EVOLUTION_BALL_OF_LIGHT_2,  2
-	frame SPRITE_ANIM_FRAME_IDX_EVOLUTION_BALL_OF_LIGHT_1,  2
-	frame SPRITE_ANIM_FRAME_IDX_EVOLUTION_BALL_OF_LIGHT_2,  2
-	endanim
-
-.Frameset_RadioTuningKnob:
-	frame SPRITE_ANIM_FRAME_IDX_RADIO_TUNING_KNOB, 32
-	endanim
-
-.Frameset_MagnetTrainRed:
-	frame SPRITE_ANIM_FRAME_IDX_MAGNET_TRAIN_RED_1,  8
-	frame SPRITE_ANIM_FRAME_IDX_MAGNET_TRAIN_RED_2,  8
-	frame SPRITE_ANIM_FRAME_IDX_MAGNET_TRAIN_RED_1,  8
-	frame SPRITE_ANIM_FRAME_IDX_MAGNET_TRAIN_RED_2,  8, OAM_X_FLIP
-	dorestart
-
-; XXX
-	frame SPRITE_ANIM_FRAME_IDX_43,  8
-	frame SPRITE_ANIM_FRAME_IDX_44,  8
-	dorestart
-
-; XXX
-	frame SPRITE_ANIM_FRAME_IDX_45,  8
-	frame SPRITE_ANIM_FRAME_IDX_46,  8
-	dorestart
-
-; XXX
-	frame SPRITE_ANIM_FRAME_IDX_47,  8
-	frame SPRITE_ANIM_FRAME_IDX_48,  8
-	dorestart
-
-; XXX
-	frame SPRITE_ANIM_FRAME_IDX_49,  1
-	frame SPRITE_ANIM_FRAME_IDX_49,  1, OAM_X_FLIP
-	frame SPRITE_ANIM_FRAME_IDX_49,  1, OAM_X_FLIP, OAM_Y_FLIP
-	frame SPRITE_ANIM_FRAME_IDX_49,  1, OAM_Y_FLIP
-	dorestart
-
-; XXX
-	frame SPRITE_ANIM_FRAME_IDX_4A, 32
-	endanim
-
-; XXX
-	frame SPRITE_ANIM_FRAME_IDX_4B, 32
-	endanim
-
-; XXX
-	frame SPRITE_ANIM_FRAME_IDX_4C, 32
-	endanim
-
-; XXX
-	frame SPRITE_ANIM_FRAME_IDX_4D, 32
-	endanim
-
-; XXX
-	frame SPRITE_ANIM_FRAME_IDX_4E,  3
-	dorepeat  3
-	dorestart
-
-.Frameset_1c:
-	dorepeat 32
-	endanim
-
-.Frameset_Leaf:
-	frame SPRITE_ANIM_FRAME_IDX_LEAF, 32
-	endanim
-
-.Frameset_CutTree:
-	frame SPRITE_ANIM_FRAME_IDX_TREE_1,      2
-	frame SPRITE_ANIM_FRAME_IDX_CUT_TREE_2, 16
-	dorepeat  1
-	frame SPRITE_ANIM_FRAME_IDX_CUT_TREE_3,  1
-	dorepeat  1
-	frame SPRITE_ANIM_FRAME_IDX_CUT_TREE_4,  1
-	delanim
-
-.Frameset_EggCrack:
-	frame SPRITE_ANIM_FRAME_IDX_EGG_CRACK, 32
-	endanim
-
-.Frameset_EggHatch:
-	frame SPRITE_ANIM_FRAME_IDX_55, 32
-	endanim
-
-.Frameset_21:
-	frame SPRITE_ANIM_FRAME_IDX_55, 32, OAM_X_FLIP
-	endanim
-
-.Frameset_22:
-	frame SPRITE_ANIM_FRAME_IDX_55, 32, OAM_Y_FLIP
-	endanim
-
-.Frameset_23:
-	frame SPRITE_ANIM_FRAME_IDX_55, 32, OAM_X_FLIP, OAM_Y_FLIP
-	endanim
-
-.Frameset_24:
-	frame SPRITE_ANIM_FRAME_IDX_56, 10
-	frame SPRITE_ANIM_FRAME_IDX_57,  9
-	frame SPRITE_ANIM_FRAME_IDX_58, 10
-	frame SPRITE_ANIM_FRAME_IDX_59, 10
-	frame SPRITE_ANIM_FRAME_IDX_58,  9
-	frame SPRITE_ANIM_FRAME_IDX_5A, 10
-	dorestart
-
-.Frameset_HeadbuttTree:
-	frame SPRITE_ANIM_FRAME_IDX_TREE_1,           2
-	frame SPRITE_ANIM_FRAME_IDX_HEADBUTT_TREE_2,  2
-	frame SPRITE_ANIM_FRAME_IDX_TREE_1,           2
-	frame SPRITE_ANIM_FRAME_IDX_HEADBUTT_TREE_2,  2, OAM_X_FLIP
-	dorestart
-
-.Frameset_26:
-	frame SPRITE_ANIM_FRAME_IDX_5C,  2
-	endanim
-
-.Frameset_27:
-	frame SPRITE_ANIM_FRAME_IDX_5D,  2
-	endanim
-
-.Frameset_28:
-	frame SPRITE_ANIM_FRAME_IDX_5E,  2
-	endanim
-
-.Frameset_29:
-	frame SPRITE_ANIM_FRAME_IDX_5F,  2
-	endanim
-
-.Frameset_2a:
-	frame SPRITE_ANIM_FRAME_IDX_60,  2
-	endanim
-
-.Frameset_2b:
-	frame SPRITE_ANIM_FRAME_IDX_61,  2
-	endanim
-
-.Frameset_2c:
-	frame SPRITE_ANIM_FRAME_IDX_62,  2
-	endanim
-
-.Frameset_MobileTradeSentBall:
-	frame SPRITE_ANIM_FRAME_IDX_TRADE_POOF_1,  3
-	frame SPRITE_ANIM_FRAME_IDX_TRADE_POOF_2,  3
-	frame SPRITE_ANIM_FRAME_IDX_TRADE_POOF_3,  3
-	frame SPRITE_ANIM_FRAME_IDX_TRADE_POKE_BALL_1,  3
-	frame SPRITE_ANIM_FRAME_IDX_TRADE_POKE_BALL_2,  3
-	frame SPRITE_ANIM_FRAME_IDX_TRADE_POKE_BALL_1,  3
-	frame SPRITE_ANIM_FRAME_IDX_TRADE_POKE_BALL_2,  3, OAM_X_FLIP
-	frame SPRITE_ANIM_FRAME_IDX_TRADE_POKE_BALL_1,  3
-	frame SPRITE_ANIM_FRAME_IDX_TRADE_POKE_BALL_2,  3
-	frame SPRITE_ANIM_FRAME_IDX_TRADE_POKE_BALL_1,  3
-	frame SPRITE_ANIM_FRAME_IDX_TRADE_POKE_BALL_2,  3, OAM_X_FLIP
-	frame SPRITE_ANIM_FRAME_IDX_TRADE_POKE_BALL_1,  3
-	frame SPRITE_ANIM_FRAME_IDX_TRADE_POKE_BALL_2,  3
-	frame SPRITE_ANIM_FRAME_IDX_TRADE_POKE_BALL_1,  3
-	frame SPRITE_ANIM_FRAME_IDX_TRADE_POKE_BALL_2,  3, OAM_X_FLIP
-	endanim
-
-.Frameset_MobileTradeOTBall:
-	frame SPRITE_ANIM_FRAME_IDX_TRADE_POKE_BALL_1,  3
-	frame SPRITE_ANIM_FRAME_IDX_TRADE_POKE_BALL_2,  3
-	frame SPRITE_ANIM_FRAME_IDX_TRADE_POKE_BALL_1,  3
-	frame SPRITE_ANIM_FRAME_IDX_TRADE_POKE_BALL_2,  3, OAM_X_FLIP
-	frame SPRITE_ANIM_FRAME_IDX_TRADE_POKE_BALL_1,  3
-	frame SPRITE_ANIM_FRAME_IDX_TRADE_POKE_BALL_2,  3
-	frame SPRITE_ANIM_FRAME_IDX_TRADE_POKE_BALL_1,  3
-	frame SPRITE_ANIM_FRAME_IDX_TRADE_POKE_BALL_2,  3, OAM_X_FLIP
-	frame SPRITE_ANIM_FRAME_IDX_TRADE_POKE_BALL_1,  3
-	frame SPRITE_ANIM_FRAME_IDX_TRADE_POKE_BALL_2,  3
-	frame SPRITE_ANIM_FRAME_IDX_TRADE_POKE_BALL_1,  3
-	frame SPRITE_ANIM_FRAME_IDX_TRADE_POKE_BALL_2,  3, OAM_X_FLIP
-	frame SPRITE_ANIM_FRAME_IDX_TRADE_POOF_1,  3
-	frame SPRITE_ANIM_FRAME_IDX_TRADE_POOF_2,  3
-	frame SPRITE_ANIM_FRAME_IDX_TRADE_POOF_3,  3
-	delanim
-
-.Frameset_ForMobile22:
-	frame SPRITE_ANIM_FRAME_IDX_FOR_MOBILE_22_1,  3
-	frame SPRITE_ANIM_FRAME_IDX_FOR_MOBILE_22_2,  3
-	dorestart
-
-.Frameset_ForMobile23:
-	frame SPRITE_ANIM_FRAME_IDX_FOR_MOBILE_23,  3
-	endanim
-
-.Frameset_ForMobile24:
-	frame SPRITE_ANIM_FRAME_IDX_FOR_MOBILE_24,  3
-	endanim
-
-.Frameset_ForMobile25:
-	frame SPRITE_ANIM_FRAME_IDX_FOR_MOBILE_25_1,  2
-	frame SPRITE_ANIM_FRAME_IDX_FOR_MOBILE_25_2,  2
-	frame SPRITE_ANIM_FRAME_IDX_FOR_MOBILE_25_3,  2
-	delanim
-
-.Frameset_IntroSuicune:
-	frame SPRITE_ANIM_FRAME_IDX_INTRO_SUICUNE_1,  3
-	frame SPRITE_ANIM_FRAME_IDX_INTRO_SUICUNE_2,  3
-	frame SPRITE_ANIM_FRAME_IDX_INTRO_SUICUNE_3,  3
-	frame SPRITE_ANIM_FRAME_IDX_INTRO_SUICUNE_4,  3
-	dorestart
-
-.Frameset_IntroSuicune2:
-	frame SPRITE_ANIM_FRAME_IDX_INTRO_SUICUNE_4,  3
-	frame SPRITE_ANIM_FRAME_IDX_INTRO_SUICUNE_1,  7
-	endanim
-
-.Frameset_IntroPichu:
-	frame SPRITE_ANIM_FRAME_IDX_INTRO_PICHU_1, 32
-	frame SPRITE_ANIM_FRAME_IDX_INTRO_PICHU_2,  7
-	frame SPRITE_ANIM_FRAME_IDX_INTRO_PICHU_3,  7
-	endanim
-
-.Frameset_IntroWooper:
-	frame SPRITE_ANIM_FRAME_IDX_INTRO_WOOPER,  3
-	endanim
-
-.Frameset_IntroUnown1:
-	frame SPRITE_ANIM_FRAME_IDX_INTRO_UNOWN_1,  3
-	frame SPRITE_ANIM_FRAME_IDX_INTRO_UNOWN_2,  3
-	frame SPRITE_ANIM_FRAME_IDX_INTRO_UNOWN_3,  7
-	delanim
-
-.Frameset_IntroUnown2:
-	frame SPRITE_ANIM_FRAME_IDX_INTRO_UNOWN_1,  3, OAM_X_FLIP
-	frame SPRITE_ANIM_FRAME_IDX_INTRO_UNOWN_2,  3, OAM_X_FLIP
-	frame SPRITE_ANIM_FRAME_IDX_INTRO_UNOWN_3,  7, OAM_X_FLIP
-	delanim
-
-.Frameset_IntroUnown3:
-	frame SPRITE_ANIM_FRAME_IDX_INTRO_UNOWN_1,  3, OAM_Y_FLIP
-	frame SPRITE_ANIM_FRAME_IDX_INTRO_UNOWN_2,  3, OAM_Y_FLIP
-	frame SPRITE_ANIM_FRAME_IDX_INTRO_UNOWN_3,  7, OAM_Y_FLIP
-	delanim
-
-.Frameset_IntroUnown4:
-	frame SPRITE_ANIM_FRAME_IDX_INTRO_UNOWN_1,  3, OAM_X_FLIP, OAM_Y_FLIP
-	frame SPRITE_ANIM_FRAME_IDX_INTRO_UNOWN_2,  3, OAM_X_FLIP, OAM_Y_FLIP
-	frame SPRITE_ANIM_FRAME_IDX_INTRO_UNOWN_3,  7, OAM_X_FLIP, OAM_Y_FLIP
-	delanim
-
-.Frameset_IntroUnownF2:
-	frame SPRITE_ANIM_FRAME_IDX_INTRO_UNOWN_F_2_1,  3
-	frame SPRITE_ANIM_FRAME_IDX_INTRO_UNOWN_F_2_2,  3
-	frame SPRITE_ANIM_FRAME_IDX_INTRO_UNOWN_F_2_3,  3
-	frame SPRITE_ANIM_FRAME_IDX_INTRO_UNOWN_F_2_4,  7
-	frame SPRITE_ANIM_FRAME_IDX_INTRO_UNOWN_F_2_5,  7
-	endanim
-
-.Frameset_IntroSuicuneAway:
-	frame SPRITE_ANIM_FRAME_IDX_INTRO_SUICUNE_AWAY,  3
-	endanim
-
-.Frameset_IntroUnownF:
-	dorepeat 0
-	endanim
-
-.Frameset_CelebiLeft:
-	frame SPRITE_ANIM_FRAME_IDX_CELEBI_1,  8
-	frame SPRITE_ANIM_FRAME_IDX_CELEBI_2,  8
-	endanim
-
-.Frameset_CelebiRight:
-	frame SPRITE_ANIM_FRAME_IDX_CELEBI_1,  8, OAM_X_FLIP
-	frame SPRITE_ANIM_FRAME_IDX_CELEBI_2,  8, OAM_X_FLIP
-	endanim
-; 8d94d
--- a/data/sprite_anim_oam.asm
+++ /dev/null
@@ -1,1131 +1,0 @@
-SpriteAnimOAMData: ; 8d94d
-; entries correspond to SPRITE_ANIM_FRAME_IDX_* constants
-	; vtile offset, pointer
-	dbw $00, .OAMData_RedWalk ; SPRITE_ANIM_FRAME_IDX_RED_WALK_1
-	dbw $04, .OAMData_RedWalk ; SPRITE_ANIM_FRAME_IDX_RED_WALK_2
-	dbw $4c, .OAMData_1x1_Palette0 ; SPRITE_ANIM_FRAME_IDX_02
-	dbw $5c, .OAMData_1x1_Palette0 ; SPRITE_ANIM_FRAME_IDX_03
-	dbw $6c, .OAMData_04 ; SPRITE_ANIM_FRAME_IDX_04
-	dbw $6e, .OAMData_04 ; SPRITE_ANIM_FRAME_IDX_05
-	dbw $2d, .OAMData_06 ; SPRITE_ANIM_FRAME_IDX_06
-	dbw $4d, .OAMData_06 ; SPRITE_ANIM_FRAME_IDX_07
-	dbw $60, .OAMData_08 ; SPRITE_ANIM_FRAME_IDX_08
-	dbw $00, .OAMData_08 ; SPRITE_ANIM_FRAME_IDX_09
-	dbw $00, .OAMData_08 ; SPRITE_ANIM_FRAME_IDX_0A
-	dbw $06, .OAMData_08 ; SPRITE_ANIM_FRAME_IDX_0B
-	dbw $0c, .OAMData_0c ; SPRITE_ANIM_FRAME_IDX_0C
-	dbw $0d, .OAMData_1x1_Palette0 ; SPRITE_ANIM_FRAME_IDX_0D
-	dbw $00, .OAMData_0e ; SPRITE_ANIM_FRAME_IDX_0E
-	dbw $04, .OAMData_0e ; SPRITE_ANIM_FRAME_IDX_0F
-	dbw $08, .OAMData_0e ; SPRITE_ANIM_FRAME_IDX_10
-	dbw $40, .OAMData_0e ; SPRITE_ANIM_FRAME_IDX_11
-	dbw $44, .OAMData_0e ; SPRITE_ANIM_FRAME_IDX_12
-	dbw $48, .OAMData_0e ; SPRITE_ANIM_FRAME_IDX_13
-	dbw $4c, .OAMData_0e ; SPRITE_ANIM_FRAME_IDX_14
-	dbw $80, .OAMData_15 ; SPRITE_ANIM_FRAME_IDX_15
-	dbw $85, .OAMData_15 ; SPRITE_ANIM_FRAME_IDX_16
-	dbw $8a, .OAMData_15 ; SPRITE_ANIM_FRAME_IDX_17
-	dbw $00, .OAMData_18 ; SPRITE_ANIM_FRAME_IDX_18
-	dbw $01, .OAMData_TradePoofBubble ; SPRITE_ANIM_FRAME_IDX_19
-	dbw $09, .OAMData_1a ; SPRITE_ANIM_FRAME_IDX_1A
-	dbw $10, .OAMData_1b ; SPRITE_ANIM_FRAME_IDX_1B
-	dbw $29, .OAMData_1b ; SPRITE_ANIM_FRAME_IDX_1C
-	dbw $42, .OAMData_1b ; SPRITE_ANIM_FRAME_IDX_1D
-	dbw $f8, .OAMData_GSTitleTrail ; SPRITE_ANIM_FRAME_IDX_GS_TITLE_TRAIL_1
-	dbw $fa, .OAMData_GSTitleTrail ; SPRITE_ANIM_FRAME_IDX_GS_TITLE_TRAIL_2
-	dbw $00, .OAMData_TextEntryCursor ; SPRITE_ANIM_FRAME_IDX_TEXT_ENTRY_CURSOR
-	dbw $00, .OAMData_ForFrameset09 ; SPRITE_ANIM_FRAME_IDX_FOR_FRAMESET_09
-	dbw $00, .OAMData_22 ; SPRITE_ANIM_FRAME_IDX_22
-	dbw $0f, .OAMData_GSIntroStar ; SPRITE_ANIM_FRAME_IDX_GS_INTRO_STAR
-	dbw $11, .OAMData_1x1_Palette0 ; SPRITE_ANIM_FRAME_IDX_GS_INTRO_SPARKLE_1
-	dbw $12, .OAMData_1x1_Palette0 ; SPRITE_ANIM_FRAME_IDX_GS_INTRO_SPARKLE_2
-	dbw $13, .OAMData_1x1_Palette0 ; SPRITE_ANIM_FRAME_IDX_GS_INTRO_SPARKLE_3
-	dbw $00, .OAMData_SlotsGolem ; SPRITE_ANIM_FRAME_IDX_SLOTS_GOLEM_1
-	dbw $08, .OAMData_SlotsGolem ; SPRITE_ANIM_FRAME_IDX_SLOTS_GOLEM_2
-	dbw $10, .OAMData_SlotsChansey1 ; SPRITE_ANIM_FRAME_IDX_SLOTS_CHANSEY_1
-	dbw $10, .OAMData_SlotsChansey2 ; SPRITE_ANIM_FRAME_IDX_SLOTS_CHANSEY_2
-	dbw $10, .OAMData_SlotsChansey3 ; SPRITE_ANIM_FRAME_IDX_SLOTS_CHANSEY_3
-	dbw $10, .OAMData_SlotsChansey4 ; SPRITE_ANIM_FRAME_IDX_SLOTS_CHANSEY_4
-	dbw $10, .OAMData_SlotsChansey5 ; SPRITE_ANIM_FRAME_IDX_SLOTS_CHANSEY_5
-	dbw $3a, .OAMData_1x1_Palette0 ; SPRITE_ANIM_FRAME_IDX_SLOTS_EGG
-	dbw $00, .OAMData_RedWalk ; SPRITE_ANIM_FRAME_IDX_STILL_CURSOR
-	dbw $00, .OAMData_TradePokeBall1 ; SPRITE_ANIM_FRAME_IDX_TRADE_POKE_BALL_1
-	dbw $02, .OAMData_MagnetTrainRed ; SPRITE_ANIM_FRAME_IDX_TRADE_POKE_BALL_2
-	dbw $06, .OAMData_TradePoofBubble ; SPRITE_ANIM_FRAME_IDX_TRADE_POOF_1
-	dbw $0a, .OAMData_TradePoofBubble ; SPRITE_ANIM_FRAME_IDX_TRADE_POOF_2
-	dbw $0e, .OAMData_TradePoofBubble ; SPRITE_ANIM_FRAME_IDX_TRADE_POOF_3
-	dbw $12, .OAMData_35 ; SPRITE_ANIM_FRAME_IDX_35
-	dbw $13, .OAMData_35 ; SPRITE_ANIM_FRAME_IDX_36
-	dbw $00, .OAMData_RedWalk ; SPRITE_ANIM_FRAME_IDX_TRADEMON_ICON_1
-	dbw $04, .OAMData_RedWalk ; SPRITE_ANIM_FRAME_IDX_TRADEMON_ICON_2
-	dbw $10, .OAMData_TradePoofBubble ; SPRITE_ANIM_FRAME_IDX_TRADEMON_BUBBLE
-	dbw $00, .OAMData_MagnetTrainRed ; SPRITE_ANIM_FRAME_IDX_EVOLUTION_BALL_OF_LIGHT_1
-	dbw $04, .OAMData_1x1_Palette0 ; SPRITE_ANIM_FRAME_IDX_EVOLUTION_BALL_OF_LIGHT_2
-	dbw $00, .OAMData_RadioTuningKnob ; SPRITE_ANIM_FRAME_IDX_RADIO_TUNING_KNOB
-	dbw $00, .OAMData_PartyMonWithMail1 ; SPRITE_ANIM_FRAME_IDX_PARTY_MON_WITH_MAIL_1
-	dbw $00, .OAMData_PartyMonWithMail2 ; SPRITE_ANIM_FRAME_IDX_PARTY_MON_WITH_MAIL_2
-	dbw $00, .OAMData_PartyMonWithItem1 ; SPRITE_ANIM_FRAME_IDX_PARTY_MON_WITH_ITEM_1
-	dbw $00, .OAMData_PartyMonWithItem2 ; SPRITE_ANIM_FRAME_IDX_PARTY_MON_WITH_ITEM_2
-	dbw $00, .OAMData_MagnetTrainRed ; SPRITE_ANIM_FRAME_IDX_MAGNET_TRAIN_RED_1
-	dbw $04, .OAMData_MagnetTrainRed ; SPRITE_ANIM_FRAME_IDX_MAGNET_TRAIN_RED_2
-	dbw $00, .OAMData_43 ; SPRITE_ANIM_FRAME_IDX_43
-	dbw $30, .OAMData_43 ; SPRITE_ANIM_FRAME_IDX_44
-	dbw $03, .OAMData_43 ; SPRITE_ANIM_FRAME_IDX_45
-	dbw $33, .OAMData_43 ; SPRITE_ANIM_FRAME_IDX_46
-	dbw $06, .OAMData_43 ; SPRITE_ANIM_FRAME_IDX_47
-	dbw $36, .OAMData_43 ; SPRITE_ANIM_FRAME_IDX_48
-	dbw $09, .OAMData_43 ; SPRITE_ANIM_FRAME_IDX_49
-	dbw $39, .OAMData_43 ; SPRITE_ANIM_FRAME_IDX_4A
-	dbw $0c, .OAMData_4b ; SPRITE_ANIM_FRAME_IDX_4B
-	dbw $0c, .OAMData_4c ; SPRITE_ANIM_FRAME_IDX_4C
-	dbw $3c, .OAMData_1x1_Palette0 ; SPRITE_ANIM_FRAME_IDX_4D
-	dbw $3e, .OAMData_1x1_Palette0 ; SPRITE_ANIM_FRAME_IDX_4E
-	dbw $00, .OAMData_Leaf ; SPRITE_ANIM_FRAME_IDX_LEAF
-	dbw $00, .OAMData_Tree ; SPRITE_ANIM_FRAME_IDX_TREE_1
-	dbw $00, .OAMData_CutTree2 ; SPRITE_ANIM_FRAME_IDX_CUT_TREE_2
-	dbw $00, .OAMData_CutTree3 ; SPRITE_ANIM_FRAME_IDX_CUT_TREE_3
-	dbw $00, .OAMData_CutTree4 ; SPRITE_ANIM_FRAME_IDX_CUT_TREE_4
-	dbw $00, .OAMData_1x1_Palette0 ; SPRITE_ANIM_FRAME_IDX_EGG_CRACK
-	dbw $01, .OAMData_1x1_Palette0 ; SPRITE_ANIM_FRAME_IDX_55
-	dbw $00, .OAMData_56 ; SPRITE_ANIM_FRAME_IDX_56
-	dbw $00, .OAMData_57 ; SPRITE_ANIM_FRAME_IDX_57
-	dbw $00, .OAMData_58 ; SPRITE_ANIM_FRAME_IDX_58
-	dbw $00, .OAMData_59 ; SPRITE_ANIM_FRAME_IDX_59
-	dbw $00, .OAMData_5a ; SPRITE_ANIM_FRAME_IDX_5A
-	dbw $04, .OAMData_Tree ; SPRITE_ANIM_FRAME_IDX_HEADBUTT_TREE_2
-	dbw $00, .OAMData_5c ; SPRITE_ANIM_FRAME_IDX_5C
-	dbw $00, .OAMData_5d ; SPRITE_ANIM_FRAME_IDX_5D
-	dbw $00, .OAMData_5e ; SPRITE_ANIM_FRAME_IDX_5E
-	dbw $00, .OAMData_5f ; SPRITE_ANIM_FRAME_IDX_5F
-	dbw $00, .OAMData_60 ; SPRITE_ANIM_FRAME_IDX_60
-	dbw $00, .OAMData_61 ; SPRITE_ANIM_FRAME_IDX_61
-	dbw $00, .OAMData_62 ; SPRITE_ANIM_FRAME_IDX_62
-	dbw $00, .OAMData_BlueWalk ; SPRITE_ANIM_FRAME_IDX_BLUE_WALK_1
-	dbw $04, .OAMData_BlueWalk ; SPRITE_ANIM_FRAME_IDX_BLUE_WALK_2
-	dbw $00, .OAMData_MagnetTrainBlue ; SPRITE_ANIM_FRAME_IDX_MAGNET_TRAIN_BLUE_1
-	dbw $04, .OAMData_MagnetTrainBlue ; SPRITE_ANIM_FRAME_IDX_MAGNET_TRAIN_BLUE_2
-	dbw $20, .OAMData_ForMobile22 ; SPRITE_ANIM_FRAME_IDX_FOR_MOBILE_22_1
-	dbw $21, .OAMData_ForMobile22 ; SPRITE_ANIM_FRAME_IDX_FOR_MOBILE_22_2
-	dbw $22, .OAMData_ForMobile25_1 ; SPRITE_ANIM_FRAME_IDX_FOR_MOBILE_25_1
-	dbw $23, .OAMData_ForMobile25_2 ; SPRITE_ANIM_FRAME_IDX_FOR_MOBILE_25_2
-	dbw $27, .OAMData_ForMobile25_3 ; SPRITE_ANIM_FRAME_IDX_FOR_MOBILE_25_3
-	dbw $2a, .OAMData_ForMobile23 ; SPRITE_ANIM_FRAME_IDX_FOR_MOBILE_23
-	dbw $2a, .OAMData_ForMobile24 ; SPRITE_ANIM_FRAME_IDX_FOR_MOBILE_24
-	dbw $00, .OAMData_IntroSuicune1 ; SPRITE_ANIM_FRAME_IDX_INTRO_SUICUNE_1
-	dbw $08, .OAMData_IntroSuicune2 ; SPRITE_ANIM_FRAME_IDX_INTRO_SUICUNE_2
-	dbw $60, .OAMData_IntroSuicune3 ; SPRITE_ANIM_FRAME_IDX_INTRO_SUICUNE_3
-	dbw $68, .OAMData_IntroSuicune4 ; SPRITE_ANIM_FRAME_IDX_INTRO_SUICUNE_4
-	dbw $00, .OAMData_IntroPichu ; SPRITE_ANIM_FRAME_IDX_INTRO_PICHU_1
-	dbw $05, .OAMData_IntroPichu ; SPRITE_ANIM_FRAME_IDX_INTRO_PICHU_2
-	dbw $0a, .OAMData_IntroPichu ; SPRITE_ANIM_FRAME_IDX_INTRO_PICHU_3
-	dbw $50, .OAMData_IntroWooper ; SPRITE_ANIM_FRAME_IDX_INTRO_WOOPER
-	dbw $00, .OAMData_IntroUnown1 ; SPRITE_ANIM_FRAME_IDX_INTRO_UNOWN_1
-	dbw $01, .OAMData_IntroUnown2 ; SPRITE_ANIM_FRAME_IDX_INTRO_UNOWN_2
-	dbw $04, .OAMData_IntroUnown3 ; SPRITE_ANIM_FRAME_IDX_INTRO_UNOWN_3
-	dbw $00, .OAMData_18 ; SPRITE_ANIM_FRAME_IDX_INTRO_UNOWN_F_2_1
-	dbw $01, .OAMData_IntroUnownF2_2 ; SPRITE_ANIM_FRAME_IDX_INTRO_UNOWN_F_2_2
-	dbw $03, .OAMData_IntroUnownF2_3 ; SPRITE_ANIM_FRAME_IDX_INTRO_UNOWN_F_2_3
-	dbw $08, .OAMData_IntroUnownF2_4_5 ; SPRITE_ANIM_FRAME_IDX_INTRO_UNOWN_F_2_4
-	dbw $1c, .OAMData_IntroUnownF2_4_5 ; SPRITE_ANIM_FRAME_IDX_INTRO_UNOWN_F_2_5
-	dbw $80, .OAMData_IntroSuicuneAway ; SPRITE_ANIM_FRAME_IDX_INTRO_SUICUNE_AWAY
-	dbw $00, .OAMData_Celebi ; SPRITE_ANIM_FRAME_IDX_CELEBI_1
-	dbw $04, .OAMData_Celebi ; SPRITE_ANIM_FRAME_IDX_CELEBI_2
-	dbw $d0, .OAMData_GameFreakLogo1_3 ; SPRITE_ANIM_FRAME_IDX_GAMEFREAK_LOGO_1
-	dbw $d3, .OAMData_GameFreakLogo1_3 ; SPRITE_ANIM_FRAME_IDX_GAMEFREAK_LOGO_2
-	dbw $d6, .OAMData_GameFreakLogo1_3 ; SPRITE_ANIM_FRAME_IDX_GAMEFREAK_LOGO_3
-	dbw $6c, .OAMData_GameFreakLogo4_11 ; SPRITE_ANIM_FRAME_IDX_GAMEFREAK_LOGO_4
-	dbw $68, .OAMData_GameFreakLogo4_11 ; SPRITE_ANIM_FRAME_IDX_GAMEFREAK_LOGO_5
-	dbw $64, .OAMData_GameFreakLogo4_11 ; SPRITE_ANIM_FRAME_IDX_GAMEFREAK_LOGO_6
-	dbw $60, .OAMData_GameFreakLogo4_11 ; SPRITE_ANIM_FRAME_IDX_GAMEFREAK_LOGO_7
-	dbw $0c, .OAMData_GameFreakLogo4_11 ; SPRITE_ANIM_FRAME_IDX_GAMEFREAK_LOGO_8
-	dbw $08, .OAMData_GameFreakLogo4_11 ; SPRITE_ANIM_FRAME_IDX_GAMEFREAK_LOGO_9
-	dbw $04, .OAMData_GameFreakLogo4_11 ; SPRITE_ANIM_FRAME_IDX_GAMEFREAK_LOGO_10
-	dbw $00, .OAMData_GameFreakLogo4_11 ; SPRITE_ANIM_FRAME_IDX_GAMEFREAK_LOGO_11
-
-.OAMData_1x1_Palette0:
-	db 1
-	dsprite -1,  4, -1,  4, $00, $00
-
-.OAMData_04:
-	db 4
-	dsprite -1,  0, -1,  0, $00, $00
-	dsprite -1,  0,  0,  0, $01, $00
-	dsprite  0,  0, -1,  0, $10, $00
-	dsprite  0,  0,  0,  0, $11, $00
-
-.OAMData_GSIntroStar:
-	db 4
-	dsprite -1,  0, -1,  0, $00, 0
-	dsprite -1,  0,  0,  0, $00, 0 | X_FLIP
-	dsprite  0,  0, -1,  0, $01, 0
-	dsprite  0,  0,  0,  0, $01, 0 | X_FLIP
-
-.OAMData_TradePokeBall1:
-	db 4
-	dsprite -1,  0, -1,  0, $00, $80
-	dsprite -1,  0,  0,  0, $00, $a0
-	dsprite  0,  0, -1,  0, $01, $80
-	dsprite  0,  0,  0,  0, $01, $a0
-
-.OAMData_18:
-	db 4
-	dsprite -1,  0, -1,  0, $00, $00
-	dsprite -1,  0,  0,  0, $00, $20
-	dsprite  0,  0, -1,  0, $00, $40
-	dsprite  0,  0,  0,  0, $00, $60
-
-.OAMData_35:
-	db 4
-	dsprite -1,  0, -1,  0, $00, $07
-	dsprite -1,  0,  0,  0, $00, $27
-	dsprite  0,  0, -1,  0, $00, $47
-	dsprite  0,  0,  0,  0, $00, $67
-; 8db4b
-
-; 8db4b
-	db 4
-	dsprite -1,  0, -1,  0, $00, $80
-	dsprite -1,  0,  0,  0, $00, $a0
-	dsprite  0,  0, -1,  0, $00, $c0
-	dsprite  0,  0,  0,  0, $00, $e0
-
-.OAMData_TradePoofBubble:
-	db 16
-	dsprite -2,  0, -2,  0, $00, 0
-	dsprite -2,  0, -1,  0, $01, 0
-	dsprite -1,  0, -2,  0, $02, 0
-	dsprite -1,  0, -1,  0, $03, 0
-	dsprite -2,  0,  0,  0, $01, 0 | X_FLIP
-	dsprite -2,  0,  1,  0, $00, 0 | X_FLIP
-	dsprite -1,  0,  0,  0, $03, 0 | X_FLIP
-	dsprite -1,  0,  1,  0, $02, 0 | X_FLIP
-	dsprite  0,  0, -2,  0, $02, 0 | Y_FLIP
-	dsprite  0,  0, -1,  0, $03, 0 | Y_FLIP
-	dsprite  1,  0, -2,  0, $00, 0 | Y_FLIP
-	dsprite  1,  0, -1,  0, $01, 0 | Y_FLIP
-	dsprite  0,  0,  0,  0, $03, 0 | X_FLIP | Y_FLIP
-	dsprite  0,  0,  1,  0, $02, 0 | X_FLIP | Y_FLIP
-	dsprite  1,  0,  0,  0, $01, 0 | X_FLIP | Y_FLIP
-	dsprite  1,  0,  1,  0, $00, 0 | X_FLIP | Y_FLIP
-
-.OAMData_1a:
-	db 36
-	dsprite -3,  0, -3,  0, $00, $00
-	dsprite -3,  0, -2,  0, $01, $00
-	dsprite -3,  0, -1,  0, $02, $00
-	dsprite -2,  0, -3,  0, $03, $00
-	dsprite -2,  0, -2,  0, $04, $00
-	dsprite -2,  0, -1,  0, $05, $00
-	dsprite -1,  0, -3,  0, $06, $00
-	dsprite -1,  0, -2,  0, $05, $00
-	dsprite -1,  0, -1,  0, $05, $00
-	dsprite -3,  0,  0,  0, $02, $20
-	dsprite -3,  0,  1,  0, $01, $20
-	dsprite -3,  0,  2,  0, $00, $20
-	dsprite -2,  0,  0,  0, $05, $20
-	dsprite -2,  0,  1,  0, $04, $20
-	dsprite -2,  0,  2,  0, $03, $20
-	dsprite -1,  0,  0,  0, $05, $20
-	dsprite -1,  0,  1,  0, $05, $20
-	dsprite -1,  0,  2,  0, $06, $20
-	dsprite  0,  0, -3,  0, $06, $40
-	dsprite  0,  0, -2,  0, $05, $40
-	dsprite  0,  0, -1,  0, $05, $40
-	dsprite  1,  0, -3,  0, $03, $40
-	dsprite  1,  0, -2,  0, $04, $40
-	dsprite  1,  0, -1,  0, $05, $40
-	dsprite  2,  0, -3,  0, $00, $40
-	dsprite  2,  0, -2,  0, $01, $40
-	dsprite  2,  0, -1,  0, $02, $40
-	dsprite  0,  0,  0,  0, $05, $60
-	dsprite  0,  0,  1,  0, $05, $60
-	dsprite  0,  0,  2,  0, $06, $60
-	dsprite  1,  0,  0,  0, $05, $60
-	dsprite  1,  0,  1,  0, $04, $60
-	dsprite  1,  0,  2,  0, $03, $60
-	dsprite  2,  0,  0,  0, $02, $60
-	dsprite  2,  0,  1,  0, $01, $60
-	dsprite  2,  0,  2,  0, $00, $60
-
-.OAMData_43:
-	db 9
-	dsprite -2,  4, -2,  4, $00, $00
-	dsprite -2,  4, -1,  4, $01, $00
-	dsprite -2,  4,  0,  4, $02, $00
-	dsprite -1,  4, -2,  4, $10, $00
-	dsprite -1,  4, -1,  4, $11, $00
-	dsprite -1,  4,  0,  4, $12, $00
-	dsprite  0,  4, -2,  4, $20, $00
-	dsprite  0,  4, -1,  4, $21, $00
-	dsprite  0,  4,  0,  4, $22, $00
-
-.OAMData_0e:
-	db 16
-	dsprite -2,  0, -2,  0, $00, $00
-	dsprite -2,  0, -1,  0, $01, $00
-	dsprite -2,  0,  0,  0, $02, $00
-	dsprite -2,  0,  1,  0, $03, $00
-	dsprite -1,  0, -2,  0, $10, $00
-	dsprite -1,  0, -1,  0, $11, $00
-	dsprite -1,  0,  0,  0, $12, $00
-	dsprite -1,  0,  1,  0, $13, $00
-	dsprite  0,  0, -2,  0, $20, $00
-	dsprite  0,  0, -1,  0, $21, $00
-	dsprite  0,  0,  0,  0, $22, $00
-	dsprite  0,  0,  1,  0, $23, $00
-	dsprite  1,  0, -2,  0, $30, $00
-	dsprite  1,  0, -1,  0, $31, $00
-	dsprite  1,  0,  0,  0, $32, $00
-	dsprite  1,  0,  1,  0, $33, $00
-
-.OAMData_1b:
-	db 25
-	dsprite -3,  4, -3,  4, $00, $00
-	dsprite -2,  4, -3,  4, $01, $00
-	dsprite -1,  4, -3,  4, $02, $00
-	dsprite  0,  4, -3,  4, $03, $00
-	dsprite  1,  4, -3,  4, $04, $00
-	dsprite -3,  4, -2,  4, $05, $00
-	dsprite -2,  4, -2,  4, $06, $00
-	dsprite -1,  4, -2,  4, $07, $00
-	dsprite  0,  4, -2,  4, $08, $00
-	dsprite  1,  4, -2,  4, $09, $00
-	dsprite -3,  4, -1,  4, $0a, $00
-	dsprite -2,  4, -1,  4, $0b, $00
-	dsprite -1,  4, -1,  4, $0c, $00
-	dsprite  0,  4, -1,  4, $0d, $00
-	dsprite  1,  4, -1,  4, $0e, $00
-	dsprite -3,  4,  0,  4, $0f, $00
-	dsprite -2,  4,  0,  4, $10, $00
-	dsprite -1,  4,  0,  4, $11, $00
-	dsprite  0,  4,  0,  4, $12, $00
-	dsprite  1,  4,  0,  4, $13, $00
-	dsprite -3,  4,  1,  4, $14, $00
-	dsprite -2,  4,  1,  4, $15, $00
-	dsprite -1,  4,  1,  4, $16, $00
-	dsprite  0,  4,  1,  4, $17, $00
-	dsprite  1,  4,  1,  4, $18, $00
-; 8dcf9
-
-; 8dcf9
-	db 36
-	dsprite -3,  0, -3,  0, $00, $00
-	dsprite -3,  0, -2,  0, $01, $00
-	dsprite -3,  0, -1,  0, $02, $00
-	dsprite -3,  0,  0,  0, $03, $00
-	dsprite -3,  0,  1,  0, $04, $00
-	dsprite -3,  0,  2,  0, $05, $00
-	dsprite -2,  0, -3,  0, $06, $00
-	dsprite -2,  0, -2,  0, $07, $00
-	dsprite -2,  0, -1,  0, $08, $00
-	dsprite -2,  0,  0,  0, $09, $00
-	dsprite -2,  0,  1,  0, $0a, $00
-	dsprite -2,  0,  2,  0, $0b, $00
-	dsprite -1,  0, -3,  0, $0c, $00
-	dsprite -1,  0, -2,  0, $0d, $00
-	dsprite -1,  0, -1,  0, $0e, $00
-	dsprite -1,  0,  0,  0, $0f, $00
-	dsprite -1,  0,  1,  0, $10, $00
-	dsprite -1,  0,  2,  0, $11, $00
-	dsprite  0,  0, -3,  0, $12, $00
-	dsprite  0,  0, -2,  0, $13, $00
-	dsprite  0,  0, -1,  0, $14, $00
-	dsprite  0,  0,  0,  0, $15, $00
-	dsprite  0,  0,  1,  0, $16, $00
-	dsprite  0,  0,  2,  0, $17, $00
-	dsprite  1,  0, -3,  0, $18, $00
-	dsprite  1,  0, -2,  0, $19, $00
-	dsprite  1,  0, -1,  0, $1a, $00
-	dsprite  1,  0,  0,  0, $1b, $00
-	dsprite  1,  0,  1,  0, $1c, $00
-	dsprite  1,  0,  2,  0, $1d, $00
-	dsprite  2,  0, -3,  0, $1e, $00
-	dsprite  2,  0, -2,  0, $1f, $00
-	dsprite  2,  0, -1,  0, $20, $00
-	dsprite  2,  0,  0,  0, $21, $00
-	dsprite  2,  0,  1,  0, $22, $00
-	dsprite  2,  0,  2,  0, $23, $00
-
-.OAMData_RedWalk:
-	db 4
-	dsprite -1,  0, -1,  0, $00, PAL_OW_RED
-	dsprite -1,  0,  0,  0, $01, PAL_OW_RED
-	dsprite  0,  0, -1,  0, $02, PAL_OW_RED
-	dsprite  0,  0,  0,  0, $03, PAL_OW_RED
-
-.OAMData_MagnetTrainRed:
-	db 4
-	dsprite -1,  0, -1,  0, $00, PAL_OW_RED | BEHIND_BG
-	dsprite -1,  0,  0,  0, $01, PAL_OW_RED | BEHIND_BG
-	dsprite  0,  0, -1,  0, $02, PAL_OW_RED | BEHIND_BG
-	dsprite  0,  0,  0,  0, $03, PAL_OW_RED | BEHIND_BG
-
-.OAMData_PartyMonWithMail1:
-	db 4
-	dsprite -1,  0, -1,  0, $00, PAL_OW_RED
-	dsprite -1,  0,  0,  0, $01, PAL_OW_RED
-	dsprite  0,  0, -1,  0, $08, PAL_OW_RED
-	dsprite  0,  0,  0,  0, $03, PAL_OW_RED
-
-.OAMData_PartyMonWithMail2:
-	db 4
-	dsprite -1,  0, -1,  0, $04, PAL_OW_RED
-	dsprite -1,  0,  0,  0, $05, PAL_OW_RED
-	dsprite  0,  0, -1,  0, $08, PAL_OW_RED
-	dsprite  0,  0,  0,  0, $07, PAL_OW_RED
-
-.OAMData_PartyMonWithItem1:
-	db 4
-	dsprite -1,  0, -1,  0, $00, PAL_OW_RED
-	dsprite -1,  0,  0,  0, $01, PAL_OW_RED
-	dsprite  0,  0, -1,  0, $09, PAL_OW_RED
-	dsprite  0,  0,  0,  0, $03, PAL_OW_RED
-
-.OAMData_PartyMonWithItem2:
-	db 4
-	dsprite -1,  0, -1,  0, $04, PAL_OW_RED
-	dsprite -1,  0,  0,  0, $05, PAL_OW_RED
-	dsprite  0,  0, -1,  0, $09, PAL_OW_RED
-	dsprite  0,  0,  0,  0, $07, PAL_OW_RED
-
-.OAMData_06:
-	db 6
-	dsprite -1,  0, -2,  4, $00, $01
-	dsprite -1,  0, -1,  4, $01, $01
-	dsprite -1,  0,  0,  4, $02, $01
-	dsprite  0,  0, -2,  4, $10, $01
-	dsprite  0,  0, -1,  4, $11, $01
-	dsprite  0,  0,  0,  4, $12, $01
-
-.OAMData_08:
-	db 29
-	dsprite -3,  0, -3,  0, $00, $00
-	dsprite -3,  0, -2,  0, $01, $00
-	dsprite -3,  0, -1,  0, $02, $00
-	dsprite -3,  0,  0,  0, $03, $00
-	dsprite -2,  0, -3,  0, $10, $00
-	dsprite -2,  0, -2,  0, $11, $00
-	dsprite -2,  0, -1,  0, $12, $00
-	dsprite -2,  0,  0,  0, $13, $00
-	dsprite -1,  0, -3,  0, $20, $00
-	dsprite -1,  0, -2,  0, $21, $00
-	dsprite -1,  0, -1,  0, $22, $00
-	dsprite -1,  0,  0,  0, $23, $00
-	dsprite -1,  0,  1,  0, $24, $00
-	dsprite  0,  0, -3,  0, $30, $80
-	dsprite  0,  0, -2,  0, $31, $80
-	dsprite  0,  0, -1,  0, $32, $80
-	dsprite  0,  0,  0,  0, $33, $80
-	dsprite  0,  0,  1,  0, $34, $80
-	dsprite  1,  0, -3,  0, $40, $80
-	dsprite  1,  0, -2,  0, $41, $80
-	dsprite  1,  0, -1,  0, $42, $80
-	dsprite  1,  0,  0,  0, $43, $80
-	dsprite  1,  0,  1,  0, $44, $80
-	dsprite  1,  0,  2,  0, $45, $80
-	dsprite  2,  0, -2,  0, $51, $80
-	dsprite  2,  0, -1,  0, $52, $80
-	dsprite  2,  0,  0,  0, $53, $80
-	dsprite  2,  0,  1,  0, $54, $80
-	dsprite  2,  0,  2,  0, $55, $80
-
-.OAMData_0c:
-	db 2
-	dsprite -1,  0, -1,  4, $00, $00
-	dsprite  0,  0, -1,  4, $10, $00
-
-.OAMData_15:
-	db 5
-	dsprite -2,  0,  3,  0, $00, $00
-	dsprite -2,  0,  4,  0, $01, $00
-	dsprite -1,  0,  2,  0, $02, $00
-	dsprite -1,  0,  3,  0, $03, $00
-	dsprite  0,  0,  2,  0, $04, $00
-
-.OAMData_Leaf:
-	db 1
-	dsprite -1,  4, -1,  4, $00, PAL_OW_TREE
-
-.OAMData_Tree:
-	db 4
-	dsprite -1,  0, -1,  0, $00, PAL_OW_TREE
-	dsprite -1,  0,  0,  0, $01, PAL_OW_TREE
-	dsprite  0,  0, -1,  0, $02, PAL_OW_TREE
-	dsprite  0,  0,  0,  0, $03, PAL_OW_TREE
-
-.OAMData_TextEntryCursor:
-	db 4
-	dsprite -1,  7, -1,  7, $00, 0
-	dsprite -1,  7,  0,  0, $00, 0 | X_FLIP
-	dsprite  0,  0, -1,  7, $00, 0 | Y_FLIP
-	dsprite  0,  0,  0,  0, $00, 0 | X_FLIP | Y_FLIP
-
-.OAMData_ForFrameset09:
-	db 10
-	dsprite -1,  7,  0,  0, $00, 0
-	dsprite -1,  7,  1,  0, $01, 0
-	dsprite -1,  7,  2,  0, $01, 0
-	dsprite -1,  7,  3,  0, $01, 0
-	dsprite -1,  7,  4,  0, $00, 0 | X_FLIP
-	dsprite  0,  0,  0,  0, $00, 0 | Y_FLIP
-	dsprite  0,  0,  1,  0, $01, 0 | Y_FLIP
-	dsprite  0,  0,  2,  0, $01, 0 | Y_FLIP
-	dsprite  0,  0,  3,  0, $01, 0 | Y_FLIP
-	dsprite  0,  0,  4,  0, $00, 0 | X_FLIP | Y_FLIP
-
-.OAMData_22:
-	db 15
-	dsprite -3,  4, -2,  4, $00, $11
-	dsprite -3,  4, -1,  4, $01, $11
-	dsprite -3,  4,  0,  4, $02, $11
-	dsprite -2,  4, -2,  4, $03, $11
-	dsprite -2,  4, -1,  4, $04, $11
-	dsprite -2,  4,  0,  4, $05, $11
-	dsprite -1,  4, -2,  4, $06, $11
-	dsprite -1,  4, -1,  4, $07, $11
-	dsprite -1,  4,  0,  4, $08, $11
-	dsprite  0,  4, -2,  4, $09, $11
-	dsprite  0,  4, -1,  4, $0a, $11
-	dsprite  0,  4,  0,  4, $0b, $11
-	dsprite  1,  4, -2,  4, $0c, $11
-	dsprite  1,  4, -1,  4, $0d, $11
-	dsprite  1,  4,  0,  4, $0e, $11
-
-.OAMData_SlotsGolem:
-	db 6
-	dsprite -2,  4, -2,  4, $00, 5 | OBP_NUM
-	dsprite -2,  4, -1,  4, $02, 5 | OBP_NUM
-	dsprite -2,  4,  0,  4, $00, 5 | OBP_NUM | X_FLIP
-	dsprite  0,  4, -2,  4, $04, 5 | OBP_NUM
-	dsprite  0,  4, -1,  4, $06, 5 | OBP_NUM
-	dsprite  0,  4,  0,  4, $04, 5 | OBP_NUM | X_FLIP
-
-.OAMData_SlotsChansey1:
-	db 6
-	dsprite -2,  4, -2,  4, $00, 6 | OBP_NUM
-	dsprite -2,  4, -1,  4, $02, 6 | OBP_NUM
-	dsprite -2,  4,  0,  4, $04, 6 | OBP_NUM
-	dsprite  0,  4, -2,  4, $06, 6 | OBP_NUM
-	dsprite  0,  4, -1,  4, $08, 6 | OBP_NUM
-	dsprite  0,  4,  0,  4, $0a, 6 | OBP_NUM
-
-.OAMData_SlotsChansey2:
-	db 6
-	dsprite -2,  4, -2,  4, $00, 6 | OBP_NUM
-	dsprite -2,  4, -1,  4, $02, 6 | OBP_NUM
-	dsprite -2,  4,  0,  4, $04, 6 | OBP_NUM
-	dsprite  0,  4, -2,  4, $0c, 6 | OBP_NUM
-	dsprite  0,  4, -1,  4, $0e, 6 | OBP_NUM
-	dsprite  0,  4,  0,  4, $10, 6 | OBP_NUM
-
-.OAMData_SlotsChansey3:
-	db 6
-	dsprite -2,  4, -2,  4, $00, 6 | OBP_NUM
-	dsprite -2,  4, -1,  4, $02, 6 | OBP_NUM
-	dsprite -2,  4,  0,  4, $04, 6 | OBP_NUM
-	dsprite  0,  4, -2,  4, $12, 6 | OBP_NUM
-	dsprite  0,  4, -1,  4, $14, 6 | OBP_NUM
-	dsprite  0,  4,  0,  4, $16, 6 | OBP_NUM
-
-.OAMData_SlotsChansey4:
-	db 6
-	dsprite -2,  4, -2,  4, $00, 6 | OBP_NUM
-	dsprite -2,  4, -1,  4, $02, 6 | OBP_NUM
-	dsprite -2,  4,  0,  4, $04, 6 | OBP_NUM
-	dsprite  0,  4, -2,  4, $18, 6 | OBP_NUM
-	dsprite  0,  4, -1,  4, $1a, 6 | OBP_NUM
-	dsprite  0,  4,  0,  4, $1c, 6 | OBP_NUM
-
-.OAMData_SlotsChansey5:
-	db 6
-	dsprite -2,  4, -2,  4, $1e, 6 | OBP_NUM
-	dsprite -2,  4, -1,  4, $20, 6 | OBP_NUM
-	dsprite -2,  4,  0,  4, $22, 6 | OBP_NUM
-	dsprite  0,  4, -2,  4, $24, 6 | OBP_NUM
-	dsprite  0,  4, -1,  4, $26, 6 | OBP_NUM
-	dsprite  0,  4,  0,  4, $28, 6 | OBP_NUM
-
-.OAMData_RadioTuningKnob:
-	db 3
-	dsprite -2,  4, -1,  4, $00, 0 | OBP_NUM
-	dsprite -1,  4, -1,  4, $00, 0 | OBP_NUM
-	dsprite  0,  4, -1,  4, $00, 0 | OBP_NUM
-
-.OAMData_4b:
-	db 6
-	dsprite  0,  0,  0,  0, $00, $00
-	dsprite  0,  0,  1,  0, $01, $00
-	dsprite  0,  0,  2,  0, $01, $00
-	dsprite  0,  0,  3,  0, $01, $00
-	dsprite  0,  0,  4,  0, $02, $00
-	dsprite  0,  0,  5,  0, $03, $00
-
-.OAMData_4c:
-	db 4
-	dsprite  0,  0,  0,  0, $00, $00
-	dsprite  0,  0,  1,  0, $01, $00
-	dsprite  0,  0,  2,  0, $02, $00
-	dsprite  0,  0,  3,  0, $03, $00
-
-.OAMData_CutTree2:
-	db 4
-	dsprite -1,  0, -2,  6, $00, PAL_OW_TREE
-	dsprite -1,  0,  0,  2, $01, PAL_OW_TREE
-	dsprite  0,  0, -2,  6, $02, PAL_OW_TREE
-	dsprite  0,  0,  0,  2, $03, PAL_OW_TREE
-
-.OAMData_CutTree3:
-	db 4
-	dsprite -1,  0, -2,  4, $00, PAL_OW_TREE
-	dsprite -1,  0,  0,  4, $01, PAL_OW_TREE
-	dsprite  0,  0, -2,  4, $02, PAL_OW_TREE
-	dsprite  0,  0,  0,  4, $03, PAL_OW_TREE
-
-.OAMData_CutTree4:
-	db 4
-	dsprite -1,  0, -2,  0, $00, PAL_OW_TREE
-	dsprite -1,  0,  1,  0, $01, PAL_OW_TREE
-	dsprite  0,  0, -2,  0, $02, PAL_OW_TREE
-	dsprite  0,  0,  1,  0, $03, PAL_OW_TREE
-
-.OAMData_56:
-	db 19
-	dsprite -1,  0, -4,  0, $00, $00
-	dsprite -2,  0, -3,  0, $02, $00
-	dsprite  0,  0, -3,  0, $04, $00
-	dsprite -3,  0, -2,  0, $06, $00
-	dsprite -1,  0, -2,  0, $08, $00
-	dsprite  1,  0, -2,  0, $0a, $00
-	dsprite -3,  0, -1,  0, $0c, $00
-	dsprite -1,  0, -1,  0, $0e, $00
-	dsprite  1,  0, -1,  0, $10, $00
-	dsprite -3,  0,  0,  0, $12, $00
-	dsprite -1,  0,  0,  0, $14, $00
-	dsprite  1,  0,  0,  0, $16, $00
-	dsprite -3,  0,  1,  0, $18, $00
-	dsprite -1,  0,  1,  0, $1a, $00
-	dsprite  1,  0,  1,  0, $1c, $00
-	dsprite -1,  0,  2,  0, $1e, $00
-	dsprite  1,  0,  2,  0, $20, $00
-	dsprite -2,  0,  3,  0, $22, $00
-	dsprite  0,  0,  3,  0, $24, $00
-
-.OAMData_57:
-	db 16
-	dsprite -1,  0, -4,  0, $00, $00
-	dsprite -2,  0, -3,  0, $02, $00
-	dsprite  0,  0, -3,  0, $04, $00
-	dsprite -1,  0, -2,  0, $26, $00
-	dsprite  1,  0, -2,  0, $0a, $00
-	dsprite -3,  0, -1,  0, $28, $00
-	dsprite -1,  0, -1,  0, $2a, $00
-	dsprite  1,  0, -1,  0, $10, $00
-	dsprite -1,  0,  0,  0, $2c, $00
-	dsprite  1,  0,  0,  0, $16, $00
-	dsprite -1,  0,  1,  0, $30, $00
-	dsprite  1,  0,  1,  0, $1c, $00
-	dsprite -1,  0,  2,  0, $1e, $00
-	dsprite  1,  0,  2,  0, $20, $00
-	dsprite -2,  0,  3,  0, $22, $00
-	dsprite  0,  0,  3,  0, $24, $00
-
-.OAMData_58:
-	db 15
-	dsprite -1,  0, -4,  0, $00, $00
-	dsprite -2,  0, -3,  0, $02, $00
-	dsprite  0,  0, -3,  0, $32, $00
-	dsprite -1,  0, -2,  0, $34, $00
-	dsprite  1,  0, -2,  0, $36, $00
-	dsprite -1,  0, -1,  0, $38, $00
-	dsprite  1,  0, -1,  0, $3a, $00
-	dsprite -1,  0,  0,  0, $3c, $00
-	dsprite  1,  0,  0,  0, $3e, $00
-	dsprite -1,  0,  1,  0, $30, $00
-	dsprite  1,  0,  1,  0, $1c, $00
-	dsprite -1,  0,  2,  0, $1e, $00
-	dsprite  1,  0,  2,  0, $20, $00
-	dsprite -2,  0,  3,  0, $22, $00
-	dsprite  0,  0,  3,  0, $24, $00
-
-.OAMData_59:
-	db 17
-	dsprite -1,  0, -4,  0, $00, $00
-	dsprite -2,  0, -3,  0, $02, $00
-	dsprite  0,  0, -3,  0, $04, $00
-	dsprite -1,  0, -2,  0, $40, $00
-	dsprite  1,  0, -2,  0, $42, $00
-	dsprite  3,  0, -2,  0, $44, $00
-	dsprite -1,  0, -1,  0, $46, $00
-	dsprite  1,  0, -1,  0, $48, $00
-	dsprite  3,  0, -1,  0, $4a, $00
-	dsprite -1,  0,  0,  0, $4c, $00
-	dsprite  1,  0,  0,  0, $4e, $00
-	dsprite -1,  0,  1,  0, $30, $00
-	dsprite  1,  0,  1,  0, $1c, $00
-	dsprite -1,  0,  2,  0, $1e, $00
-	dsprite  1,  0,  2,  0, $20, $00
-	dsprite -2,  0,  3,  0, $22, $00
-	dsprite  0,  0,  3,  0, $24, $00
-
-.OAMData_5a:
-	db 17
-	dsprite -1,  0, -4,  0, $00, $00
-	dsprite -2,  0, -3,  0, $02, $00
-	dsprite  0,  0, -3,  0, $04, $00
-	dsprite -1,  0, -2,  0, $50, $00
-	dsprite  1,  0, -2,  0, $0a, $00
-	dsprite -3,  0, -1,  0, $52, $00
-	dsprite -1,  0, -1,  0, $54, $00
-	dsprite  1,  0, -1,  0, $10, $00
-	dsprite -3,  0,  0,  0, $56, $00
-	dsprite -1,  0,  0,  0, $2e, $00
-	dsprite  1,  0,  0,  0, $16, $00
-	dsprite -1,  0,  1,  0, $30, $00
-	dsprite  1,  0,  1,  0, $1c, $00
-	dsprite -1,  0,  2,  0, $1e, $00
-	dsprite  1,  0,  2,  0, $20, $00
-	dsprite -2,  0,  3,  0, $22, $00
-	dsprite  0,  0,  3,  0, $24, $00
-
-.OAMData_GSTitleTrail:
-	db 1
-	dsprite -1,  4, -1,  4, $00, 1 | OBP_NUM
-
-.OAMData_5c:
-	db 12
-	dsprite  0,  0,  0,  0, $30, $00
-	dsprite  0,  0,  1,  0, $31, $00
-	dsprite  0,  0,  2,  0, $31, $00
-	dsprite  0,  0,  3,  0, $31, $00
-	dsprite  0,  0,  4,  0, $31, $00
-	dsprite  0,  0,  5,  0, $32, $00
-	dsprite  1,  0,  0,  0, $33, $00
-	dsprite  1,  0,  1,  0, $34, $00
-	dsprite  1,  0,  2,  0, $34, $00
-	dsprite  1,  0,  3,  0, $34, $00
-	dsprite  1,  0,  4,  0, $34, $00
-	dsprite  1,  0,  5,  0, $35, $00
-
-.OAMData_5d:
-	db 1
-	dsprite  0,  0,  0,  0, $ed, $00
-
-.OAMData_5e:
-	db 4
-	dsprite -1,  7, -1,  7, $30, $00
-	dsprite -1,  7,  0,  1, $32, $00
-	dsprite  0,  1, -1,  7, $33, $00
-	dsprite  0,  1,  0,  1, $35, $00
-
-.OAMData_5f:
-	db 8
-	dsprite -1,  7, -1,  7, $30, $00
-	dsprite -1,  7,  0,  4, $31, $00
-	dsprite -1,  7,  1,  4, $31, $00
-	dsprite -1,  7,  2,  1, $32, $00
-	dsprite  0,  1, -1,  7, $33, $00
-	dsprite  0,  1,  0,  4, $34, $00
-	dsprite  0,  1,  1,  4, $34, $00
-	dsprite  0,  1,  2,  1, $35, $00
-
-.OAMData_60:
-	db 1
-	dsprite  0,  0,  0,  0, $34, $00
-
-.OAMData_61:
-	db 2
-	dsprite  0,  0,  0,  0, $30, $00
-	dsprite  1,  0,  0,  0, $33, $00
-
-.OAMData_62:
-	db 2
-	dsprite  0,  0,  0,  0, $32, $00
-	dsprite  1,  0,  0,  0, $35, $00
-
-.OAMData_BlueWalk:
-	db 4
-	dsprite -1,  0, -1,  0, $00, PAL_OW_BLUE
-	dsprite -1,  0,  0,  0, $01, PAL_OW_BLUE
-	dsprite  0,  0, -1,  0, $02, PAL_OW_BLUE
-	dsprite  0,  0,  0,  0, $03, PAL_OW_BLUE
-
-.OAMData_MagnetTrainBlue:
-	db 4
-	dsprite -1,  0, -1,  0, $00, PAL_OW_BLUE | BEHIND_BG
-	dsprite -1,  0,  0,  0, $01, PAL_OW_BLUE | BEHIND_BG
-	dsprite  0,  0, -1,  0, $02, PAL_OW_BLUE | BEHIND_BG
-	dsprite  0,  0,  0,  0, $03, PAL_OW_BLUE | BEHIND_BG
-
-.OAMData_ForMobile22:
-	db 1
-	dsprite -1,  4, -1,  4, $00, 2
-
-.OAMData_ForMobile23:
-	db 4
-	dsprite -2,  0, -1,  4, $00, 3
-	dsprite -1,  0, -1,  4, $01, 3
-	dsprite  0,  0, -1,  4, $02, 3
-	dsprite  1,  0, -1,  4, $03, 3
-
-.OAMData_ForMobile24:
-	db 4
-	dsprite -2,  0, -1,  4, $03, 4 | Y_FLIP
-	dsprite -1,  0, -1,  4, $02, 4 | Y_FLIP
-	dsprite  0,  0, -1,  4, $01, 4 | Y_FLIP
-	dsprite  1,  0, -1,  4, $00, 4 | Y_FLIP
-
-.OAMData_ForMobile25_1:
-	db 4
-	dsprite -1,  0, -1,  0, $00, 1
-	dsprite -1,  0,  0,  0, $00, 1 | X_FLIP
-	dsprite  0,  0, -1,  0, $00, 1 | Y_FLIP
-	dsprite  0,  0,  0,  0, $00, 1 | X_FLIP | Y_FLIP
-
-.OAMData_ForMobile25_2:
-	db 8
-	dsprite -2,  4, -2,  4, $00, 1
-	dsprite -2,  4, -1,  4, $01, 1
-	dsprite -2,  4,  0,  4, $00, 1 | X_FLIP
-	dsprite -1,  4, -2,  4, $02, 1
-	dsprite -1,  4,  0,  4, $02, 1 | X_FLIP
-	dsprite  0,  4, -2,  4, $00, 1 | Y_FLIP
-	dsprite  0,  4, -1,  4, $01, 1 | Y_FLIP
-	dsprite  0,  4,  0,  4, $00, 1 | X_FLIP | Y_FLIP
-
-.OAMData_ForMobile25_3:
-	db 12
-	dsprite -2,  0, -2,  0, $00, 1
-	dsprite -2,  0, -1,  0, $01, 1
-	dsprite -1,  0, -2,  0, $02, 1
-	dsprite -2,  0,  0,  0, $01, 1 | X_FLIP
-	dsprite -2,  0,  1,  0, $00, 1 | X_FLIP
-	dsprite -1,  0,  1,  0, $02, 1 | X_FLIP
-	dsprite  0,  0, -2,  0, $02, 1 | Y_FLIP
-	dsprite  1,  0, -2,  0, $00, 1 | Y_FLIP
-	dsprite  1,  0, -1,  0, $01, 1 | Y_FLIP
-	dsprite  0,  0,  1,  0, $02, 1 | X_FLIP | Y_FLIP
-	dsprite  1,  0,  0,  0, $01, 1 | X_FLIP | Y_FLIP
-	dsprite  1,  0,  1,  0, $00, 1 | X_FLIP | Y_FLIP
-
-.OAMData_IntroSuicune1:
-	db 36
-	dsprite -3,  0,  1,  0, $05, 0
-	dsprite -3,  0,  2,  0, $06, 0
-	dsprite -3,  0,  3,  0, $07, 0
-	dsprite -2,  0, -3,  0, $11, 0
-	dsprite -2,  0, -2,  0, $12, 0
-	dsprite -2,  0, -1,  0, $13, 0
-	dsprite -2,  0,  0,  0, $14, 0
-	dsprite -2,  0,  1,  0, $15, 0
-	dsprite -2,  0,  2,  0, $16, 0
-	dsprite -2,  0,  3,  0, $17, 0
-	dsprite -1,  0, -4,  0, $20, 0
-	dsprite -1,  0, -3,  0, $21, 0
-	dsprite -1,  0, -2,  0, $22, 0
-	dsprite -1,  0, -1,  0, $23, 0
-	dsprite -1,  0,  0,  0, $24, 0
-	dsprite -1,  0,  1,  0, $25, 0
-	dsprite -1,  0,  2,  0, $26, 0
-	dsprite -1,  0,  3,  0, $27, 0
-	dsprite  0,  0, -4,  0, $30, 0
-	dsprite  0,  0, -3,  0, $31, 0
-	dsprite  0,  0, -2,  0, $32, 0
-	dsprite  0,  0, -1,  0, $33, 0
-	dsprite  0,  0,  0,  0, $34, 0
-	dsprite  0,  0,  1,  0, $35, 0
-	dsprite  0,  0,  2,  0, $36, 0
-	dsprite  1,  0, -4,  0, $40, 0
-	dsprite  1,  0, -3,  0, $41, 0
-	dsprite  1,  0, -2,  0, $42, 0
-	dsprite  1,  0, -1,  0, $43, 0
-	dsprite  1,  0,  0,  0, $44, 0
-	dsprite  1,  0,  1,  0, $45, 0
-	dsprite  1,  0,  2,  0, $46, 0
-	dsprite  1,  0,  3,  0, $47, 0
-	dsprite  2,  0, -4,  0, $50, 0
-	dsprite  2,  0, -3,  0, $51, 0
-	dsprite  2,  0,  3,  0, $57, 0
-
-.OAMData_IntroSuicune2:
-	db 28
-	dsprite -3,  0,  0,  0, $04, 0
-	dsprite -3,  0,  1,  0, $05, 0
-	dsprite -3,  0,  2,  0, $06, 0
-	dsprite -2,  0, -3,  0, $11, 0
-	dsprite -2,  0, -2,  0, $12, 0
-	dsprite -2,  0, -1,  0, $13, 0
-	dsprite -2,  0,  0,  0, $14, 0
-	dsprite -2,  0,  1,  0, $15, 0
-	dsprite -2,  0,  2,  0, $16, 0
-	dsprite -1,  0, -3,  0, $21, 0
-	dsprite -1,  0, -2,  0, $22, 0
-	dsprite -1,  0, -1,  0, $23, 0
-	dsprite -1,  0,  0,  0, $24, 0
-	dsprite -1,  0,  1,  0, $25, 0
-	dsprite -1,  0,  2,  0, $26, 0
-	dsprite  0,  0, -4,  0, $30, 0
-	dsprite  0,  0, -3,  0, $31, 0
-	dsprite  0,  0, -2,  0, $32, 0
-	dsprite  0,  0, -1,  0, $33, 0
-	dsprite  0,  0,  0,  0, $34, 0
-	dsprite  0,  0,  1,  0, $35, 0
-	dsprite  1,  0, -2,  0, $42, 0
-	dsprite  1,  0, -1,  0, $43, 0
-	dsprite  1,  0,  0,  0, $44, 0
-	dsprite  1,  0,  1,  0, $45, 0
-	dsprite  2,  0, -1,  0, $53, 0
-	dsprite  2,  0,  0,  0, $54, 0
-	dsprite  2,  0,  1,  0, $55, 0
-
-.OAMData_IntroSuicune3:
-	db 30
-	dsprite -3,  0,  0,  0, $04, 0
-	dsprite -3,  0,  1,  0, $05, 0
-	dsprite -2,  0, -3,  0, $11, 0
-	dsprite -2,  0, -2,  0, $12, 0
-	dsprite -2,  0, -1,  0, $13, 0
-	dsprite -2,  0,  0,  0, $14, 0
-	dsprite -2,  0,  1,  0, $15, 0
-	dsprite -2,  0,  2,  0, $16, 0
-	dsprite -2,  0,  3,  0, $17, 0
-	dsprite -1,  0, -4,  0, $20, 0
-	dsprite -1,  0, -3,  0, $21, 0
-	dsprite -1,  0, -2,  0, $22, 0
-	dsprite -1,  0, -1,  0, $23, 0
-	dsprite -1,  0,  0,  0, $24, 0
-	dsprite -1,  0,  1,  0, $25, 0
-	dsprite -1,  0,  2,  0, $26, 0
-	dsprite  0,  0, -4,  0, $30, 0
-	dsprite  0,  0, -3,  0, $31, 0
-	dsprite  0,  0, -2,  0, $32, 0
-	dsprite  0,  0, -1,  0, $33, 0
-	dsprite  0,  0,  0,  0, $34, 0
-	dsprite  0,  0,  1,  0, $35, 0
-	dsprite  1,  0, -2,  0, $42, 0
-	dsprite  1,  0, -1,  0, $43, 0
-	dsprite  1,  0,  0,  0, $44, 0
-	dsprite  1,  0,  1,  0, $45, 0
-	dsprite  2,  0, -2,  0, $52, 0
-	dsprite  2,  0, -1,  0, $53, 0
-	dsprite  2,  0,  0,  0, $54, 0
-	dsprite  2,  0,  1,  0, $55, 0
-
-.OAMData_IntroSuicune4:
-	db 31
-	dsprite -2,  0, -3,  0, $11, 0
-	dsprite -2,  0, -2,  0, $12, 0
-	dsprite -2,  0, -1,  0, $13, 0
-	dsprite -2,  0,  0,  0, $14, 0
-	dsprite -2,  0,  1,  0, $15, 0
-	dsprite -2,  0,  2,  0, $16, 0
-	dsprite -2,  0,  3,  0, $17, 0
-	dsprite -1,  0, -4,  0, $20, 0
-	dsprite -1,  0, -3,  0, $21, 0
-	dsprite -1,  0, -2,  0, $22, 0
-	dsprite -1,  0, -1,  0, $23, 0
-	dsprite -1,  0,  0,  0, $24, 0
-	dsprite -1,  0,  1,  0, $25, 0
-	dsprite -1,  0,  2,  0, $26, 0
-	dsprite -1,  0,  3,  0, $27, 0
-	dsprite  0,  0, -4,  0, $30, 0
-	dsprite  0,  0, -3,  0, $31, 0
-	dsprite  0,  0, -2,  0, $32, 0
-	dsprite  0,  0, -1,  0, $33, 0
-	dsprite  0,  0,  0,  0, $34, 0
-	dsprite  0,  0,  1,  0, $35, 0
-	dsprite  0,  0,  2,  0, $36, 0
-	dsprite  1,  0, -3,  0, $41, 0
-	dsprite  1,  0, -2,  0, $42, 0
-	dsprite  1,  0, -1,  0, $43, 0
-	dsprite  1,  0,  0,  0, $44, 0
-	dsprite  1,  0,  1,  0, $45, 0
-	dsprite  2,  0, -3,  0, $51, 0
-	dsprite  2,  0, -2,  0, $52, 0
-	dsprite  2,  0,  0,  0, $54, 0
-	dsprite  2,  0,  1,  0, $55, 0
-
-.OAMData_IntroPichu:
-	db 25
-	dsprite -3,  4, -3,  4, $00, 1 | VRAM_BANK_1
-	dsprite -3,  4, -2,  4, $01, 1 | VRAM_BANK_1
-	dsprite -3,  4, -1,  4, $02, 1 | VRAM_BANK_1
-	dsprite -3,  4,  0,  4, $03, 1 | VRAM_BANK_1
-	dsprite -3,  4,  1,  4, $04, 1 | VRAM_BANK_1
-	dsprite -2,  4, -3,  4, $10, 1 | VRAM_BANK_1
-	dsprite -2,  4, -2,  4, $11, 1 | VRAM_BANK_1
-	dsprite -2,  4, -1,  4, $12, 1 | VRAM_BANK_1
-	dsprite -2,  4,  0,  4, $13, 1 | VRAM_BANK_1
-	dsprite -2,  4,  1,  4, $14, 1 | VRAM_BANK_1
-	dsprite -1,  4, -3,  4, $20, 1 | VRAM_BANK_1
-	dsprite -1,  4, -2,  4, $21, 1 | VRAM_BANK_1
-	dsprite -1,  4, -1,  4, $22, 1 | VRAM_BANK_1
-	dsprite -1,  4,  0,  4, $23, 1 | VRAM_BANK_1
-	dsprite -1,  4,  1,  4, $24, 1 | VRAM_BANK_1
-	dsprite  0,  4, -3,  4, $30, 1 | VRAM_BANK_1
-	dsprite  0,  4, -2,  4, $31, 1 | VRAM_BANK_1
-	dsprite  0,  4, -1,  4, $32, 1 | VRAM_BANK_1
-	dsprite  0,  4,  0,  4, $33, 1 | VRAM_BANK_1
-	dsprite  0,  4,  1,  4, $34, 1 | VRAM_BANK_1
-	dsprite  1,  4, -3,  4, $40, 1 | VRAM_BANK_1
-	dsprite  1,  4, -2,  4, $41, 1 | VRAM_BANK_1
-	dsprite  1,  4, -1,  4, $42, 1 | VRAM_BANK_1
-	dsprite  1,  4,  0,  4, $43, 1 | VRAM_BANK_1
-	dsprite  1,  4,  1,  4, $44, 1 | VRAM_BANK_1
-
-.OAMData_IntroWooper:
-	db 16
-	dsprite -2,  0, -3,  4, $00, 2 | VRAM_BANK_1
-	dsprite -2,  0, -2,  4, $01, 2 | VRAM_BANK_1
-	dsprite -2,  0, -1,  4, $02, 2 | VRAM_BANK_1
-	dsprite -2,  0,  0,  4, $03, 2 | VRAM_BANK_1
-	dsprite -1,  0, -3,  4, $04, 2 | VRAM_BANK_1
-	dsprite -1,  0, -2,  4, $05, 2 | VRAM_BANK_1
-	dsprite -1,  0, -1,  4, $06, 2 | VRAM_BANK_1
-	dsprite -1,  0,  0,  4, $07, 2 | VRAM_BANK_1
-	dsprite  0,  0, -3,  4, $08, 2 | VRAM_BANK_1
-	dsprite  0,  0, -2,  4, $09, 2 | VRAM_BANK_1
-	dsprite  0,  0, -1,  4, $0a, 2 | VRAM_BANK_1
-	dsprite  0,  0,  0,  4, $0b, 2 | VRAM_BANK_1
-	dsprite  1,  0, -3,  4, $0c, 2 | VRAM_BANK_1
-	dsprite  1,  0, -2,  4, $0d, 2 | VRAM_BANK_1
-	dsprite  1,  0, -1,  4, $0e, 2 | VRAM_BANK_1
-	dsprite  1,  0,  0,  4, $0f, 2 | VRAM_BANK_1
-
-.OAMData_IntroUnown1:
-	db 1
-	dsprite -1,  4, -1,  4, $00, $00
-
-.OAMData_IntroUnown2:
-	db 3
-	dsprite  0,  0, -1,  0, $00, $00
-	dsprite -1,  0, -1,  0, $01, $00
-	dsprite -1,  0,  0,  0, $02, $00
-
-.OAMData_IntroUnown3:
-	db 7
-	dsprite  1,  0, -2,  0, $00, $00
-	dsprite  0,  0, -2,  0, $01, $00
-	dsprite -1,  0, -2,  0, $02, $00
-	dsprite -1,  0, -1,  0, $03, $00
-	dsprite -2,  0, -1,  0, $04, $00
-	dsprite -2,  0,  0,  0, $05, $00
-	dsprite -2,  0,  1,  0, $06, $00
-
-.OAMData_IntroUnownF2_2:
-	db 8
-	dsprite -1,  0, -2,  0, $00, 0
-	dsprite -1,  0, -1,  0, $01, 0
-	dsprite -1,  0,  0,  0, $01, 0 | X_FLIP
-	dsprite -1,  0,  1,  0, $00, 0 | X_FLIP
-	dsprite  0,  0, -2,  0, $00, 0 | Y_FLIP
-	dsprite  0,  0, -1,  0, $01, 0 | Y_FLIP
-	dsprite  0,  0,  0,  0, $01, 0 | X_FLIP | Y_FLIP
-	dsprite  0,  0,  1,  0, $00, 0 | X_FLIP | Y_FLIP
-
-.OAMData_IntroUnownF2_3:
-	db 12
-	dsprite -3,  0, -1,  0, $00, 0
-	dsprite -2,  0, -1,  0, $01, 0
-	dsprite -1,  0, -1,  0, $02, 0
-	dsprite -3,  0,  0,  0, $00, 0 | X_FLIP
-	dsprite -2,  0,  0,  0, $01, 0 | X_FLIP
-	dsprite -1,  0,  0,  0, $02, 0 | X_FLIP
-	dsprite  0,  0, -1,  0, $02, 0 | Y_FLIP
-	dsprite  1,  0, -1,  0, $01, 0 | Y_FLIP
-	dsprite  2,  0, -1,  0, $00, 0 | Y_FLIP
-	dsprite  0,  0,  0,  0, $02, 0 | X_FLIP | Y_FLIP
-	dsprite  1,  0,  0,  0, $01, 0 | X_FLIP | Y_FLIP
-	dsprite  2,  0,  0,  0, $00, 0 | X_FLIP | Y_FLIP
-
-.OAMData_IntroUnownF2_4_5:
-	db 20
-	dsprite -3,  4, -2,  0, $00, 0
-	dsprite -3,  4, -1,  0, $01, 0
-	dsprite -3,  4,  0,  0, $02, 0
-	dsprite -3,  4,  1,  0, $03, 0
-	dsprite -2,  4, -2,  0, $04, 0
-	dsprite -2,  4, -1,  0, $05, 0
-	dsprite -2,  4,  0,  0, $06, 0
-	dsprite -2,  4,  1,  0, $07, 0
-	dsprite -1,  4, -2,  0, $08, 0
-	dsprite -1,  4, -1,  0, $09, 0
-	dsprite -1,  4,  0,  0, $0a, 0
-	dsprite -1,  4,  1,  0, $0b, 0
-	dsprite  0,  4, -2,  0, $0c, 0
-	dsprite  0,  4, -1,  0, $0d, 0
-	dsprite  0,  4,  0,  0, $0e, 0
-	dsprite  0,  4,  1,  0, $0f, 0
-	dsprite  1,  4, -2,  0, $10, 0
-	dsprite  1,  4, -1,  0, $11, 0
-	dsprite  1,  4,  0,  0, $12, 0
-	dsprite  1,  4,  1,  0, $13, 0
-
-.OAMData_IntroSuicuneAway:
-	db 20
-	dsprite  0,  0,   1,  0, $00, 1 | BEHIND_BG
-	dsprite  1,  0,   2,  0, $00, 1 | BEHIND_BG
-	dsprite  2,  0,   3,  0, $00, 1 | BEHIND_BG
-	dsprite  3,  0,   4,  0, $00, 1 | BEHIND_BG
-	dsprite  4,  0,   5,  0, $00, 1 | BEHIND_BG
-	dsprite  3,  0,   6,  0, $00, 1 | BEHIND_BG
-	dsprite  2,  0,   7,  0, $00, 1 | BEHIND_BG
-	dsprite  1,  0,   8,  0, $00, 1 | BEHIND_BG
-	dsprite  0,  0,   9,  0, $00, 1 | BEHIND_BG
-	dsprite  1,  0,  10,  0, $00, 1 | BEHIND_BG
-	dsprite  2,  0,  11,  0, $00, 1 | BEHIND_BG
-	dsprite  3,  0,  12,  0, $00, 1 | BEHIND_BG
-	dsprite  4,  0,  13,  0, $00, 1 | BEHIND_BG
-	dsprite  3,  0,  14,  0, $00, 1 | BEHIND_BG
-	dsprite  2,  0,  15,  0, $00, 1 | BEHIND_BG
-	dsprite  1,  0,  16,  0, $00, 1 | BEHIND_BG
-	dsprite  0,  0, -15,  0, $00, 1 | BEHIND_BG
-	dsprite  1,  0, -14,  0, $00, 1 | BEHIND_BG
-	dsprite  2,  0, -13,  0, $00, 1 | BEHIND_BG
-	dsprite  3,  0, -12,  0, $00, 1 | BEHIND_BG
-
-.OAMData_Celebi:
-	db 4
-	dsprite -1,  0, -1,  0, $00, PAL_OW_GREEN
-	dsprite -1,  0,  0,  0, $01, PAL_OW_GREEN
-	dsprite  0,  0, -1,  0, $02, PAL_OW_GREEN
-	dsprite  0,  0,  0,  0, $03, PAL_OW_GREEN
-
-.OAMData_GameFreakLogo1_3:
-	db 9
-	dsprite -2,  0, -2,  4, $00, 1
-	dsprite -2,  0, -1,  4, $01, 1
-	dsprite -2,  0,  0,  4, $02, 1
-	dsprite -1,  0, -2,  4, $10, 1
-	dsprite -1,  0, -1,  4, $11, 1
-	dsprite -1,  0,  0,  4, $12, 1
-	dsprite  0,  0, -2,  4, $20, 1
-	dsprite  0,  0, -1,  4, $21, 1
-	dsprite  0,  0,  0,  4, $22, 1
-
-.OAMData_GameFreakLogo4_11:
-	db 24
-	dsprite -5,  0, -2,  4, $00, 1
-	dsprite -5,  0, -1,  4, $01, 1
-	dsprite -5,  0,  0,  4, $02, 1
-	dsprite -5,  0,  1,  4, $03, 1
-	dsprite -4,  0, -2,  4, $10, 1
-	dsprite -4,  0, -1,  4, $11, 1
-	dsprite -4,  0,  0,  4, $12, 1
-	dsprite -4,  0,  1,  4, $13, 1
-	dsprite -3,  0, -2,  4, $20, 1
-	dsprite -3,  0, -1,  4, $21, 1
-	dsprite -3,  0,  0,  4, $22, 1
-	dsprite -3,  0,  1,  4, $23, 1
-	dsprite -2,  0, -2,  4, $30, 1
-	dsprite -2,  0, -1,  4, $31, 1
-	dsprite -2,  0,  0,  4, $32, 1
-	dsprite -2,  0,  1,  4, $33, 1
-	dsprite -1,  0, -2,  4, $40, 1
-	dsprite -1,  0, -1,  4, $41, 1
-	dsprite -1,  0,  0,  4, $42, 1
-	dsprite -1,  0,  1,  4, $43, 1
-	dsprite  0,  0, -2,  4, $50, 1
-	dsprite  0,  0, -1,  4, $51, 1
-	dsprite  0,  0,  0,  4, $52, 1
-	dsprite  0,  0,  1,  4, $53, 1
-; 8e706
--- a/data/sprite_anim_seqs.asm
+++ /dev/null
@@ -1,49 +1,0 @@
-SpriteAnimSeqData: ; 8d1c4
-; 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_TITLE_TRAIL,          SPRITE_ANIM_SEQ_GS_TITLE_TRAIL,       $00 ; SPRITE_ANIM_INDEX_GS_TITLE_TRAIL
-	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,       $00 ; 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_FOR_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_24,                      SPRITE_ANIM_SEQ_19,                   $00 ; SPRITE_ANIM_INDEX_1A
-	db SPRITE_ANIM_FRAMESET_HEADBUTT,                SPRITE_ANIM_SEQ_NULL,                 $00 ; SPRITE_ANIM_INDEX_HEADBUTT
-	db SPRITE_ANIM_FRAMESET_EGG_HATCH,               SPRITE_ANIM_SEQ_REVEAL_NEW_MON,       $00 ; SPRITE_ANIM_INDEX_EGG_HATCH
-	db SPRITE_ANIM_FRAMESET_26,                      SPRITE_ANIM_SEQ_1A,                   $00 ; SPRITE_ANIM_INDEX_1D
-	db SPRITE_ANIM_FRAMESET_BLUE_WALK,               SPRITE_ANIM_SEQ_NULL,                 $00 ; SPRITE_ANIM_INDEX_BLUE_WALK
-	db SPRITE_ANIM_FRAMESET_MAGNET_TRAIN_BLUE,       SPRITE_ANIM_SEQ_NULL,                 $00 ; SPRITE_ANIM_INDEX_MAGNET_TRAIN_BLUE
-	db SPRITE_ANIM_FRAMESET_MOBILE_TRADE_SENT_BALL,  SPRITE_ANIM_SEQ_NULL,                 $00 ; SPRITE_ANIM_INDEX_MOBILE_TRADE_SENT_BALL
-	db SPRITE_ANIM_FRAMESET_MOBILE_TRADE_OT_BALL,    SPRITE_ANIM_SEQ_NULL,                 $00 ; SPRITE_ANIM_INDEX_MOBILE_TRADE_OT_BALL
-	db SPRITE_ANIM_FRAMESET_FOR_MOBILE_22,           SPRITE_ANIM_SEQ_NULL,                 $00 ; SPRITE_ANIM_INDEX_MOBILE_22
-	db SPRITE_ANIM_FRAMESET_FOR_MOBILE_23,           SPRITE_ANIM_SEQ_FOR_MOBILE_23,        $00 ; SPRITE_ANIM_INDEX_MOBILE_23
-	db SPRITE_ANIM_FRAMESET_FOR_MOBILE_24,           SPRITE_ANIM_SEQ_FOR_MOBILE_24,        $00 ; SPRITE_ANIM_INDEX_MOBILE_24
-	db SPRITE_ANIM_FRAMESET_FOR_MOBILE_25,           SPRITE_ANIM_SEQ_NULL,                 $00 ; SPRITE_ANIM_INDEX_MOBILE_25
-	db SPRITE_ANIM_FRAMESET_INTRO_SUICUNE,           SPRITE_ANIM_SEQ_INTRO_SUICUNE,        $00 ; SPRITE_ANIM_INDEX_INTRO_SUICUNE
-	db SPRITE_ANIM_FRAMESET_INTRO_PICHU,             SPRITE_ANIM_SEQ_INTRO_PICHU_WOOPER,   $00 ; SPRITE_ANIM_INDEX_INTRO_PICHU
-	db SPRITE_ANIM_FRAMESET_INTRO_WOOPER,            SPRITE_ANIM_SEQ_INTRO_PICHU_WOOPER,   $00 ; SPRITE_ANIM_INDEX_INTRO_WOOPER
-	db SPRITE_ANIM_FRAMESET_INTRO_UNOWN_1,           SPRITE_ANIM_SEQ_INTRO_UNOWN,          $00 ; SPRITE_ANIM_INDEX_INTRO_UNOWN
-	db SPRITE_ANIM_FRAMESET_INTRO_UNOWN_F,           SPRITE_ANIM_SEQ_INTRO_UNOWN_F,        $00 ; SPRITE_ANIM_INDEX_INTRO_UNOWN_F
-	db SPRITE_ANIM_FRAMESET_INTRO_SUICUNE_AWAY,      SPRITE_ANIM_SEQ_INTRO_SUICUNE_AWAY,   $00 ; SPRITE_ANIM_INDEX_INTRO_SUICUNE_AWAY
-	db SPRITE_ANIM_FRAMESET_CELEBI_LEFT,             SPRITE_ANIM_SEQ_NULL,                 $00 ; SPRITE_ANIM_INDEX_CELEBI
-; 8d24b
--- /dev/null
+++ b/data/sprites/framesets.asm
@@ -1,0 +1,499 @@
+SpriteAnimFrameData: ; 8d6e6
+; entries correspond to SPRITE_ANIM_FRAMESET_* constants
+	dw .Frameset_00
+	dw .Frameset_PartyMon
+	dw .Frameset_PartyMonWithMail
+	dw .Frameset_PartyMonWithItem
+	dw .Frameset_PartyMonFast
+	dw .Frameset_PartyMonWithMailFast
+	dw .Frameset_PartyMonWithItemFast
+	dw .Frameset_GSTitleTrail
+	dw .Frameset_TextEntryCursor
+	dw .Frameset_09
+	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_TradePokeBall0
+	dw .Frameset_TradePoof
+	dw .Frameset_TradeTubeBulge
+	dw .Frameset_TrademonIcon
+	dw .Frameset_TrademonBubble
+	dw .Frameset_EvolutionBallOfLight
+	dw .Frameset_RadioTuningKnob
+	dw .Frameset_MagnetTrainRed
+	dw .Frameset_1c
+	dw .Frameset_Leaf
+	dw .Frameset_CutTree
+	dw .Frameset_EggCrack
+	dw .Frameset_EggHatch
+	dw .Frameset_21
+	dw .Frameset_22
+	dw .Frameset_23
+	dw .Frameset_24
+	dw .Frameset_HeadbuttTree
+	dw .Frameset_26
+	dw .Frameset_27
+	dw .Frameset_28
+	dw .Frameset_29
+	dw .Frameset_2a
+	dw .Frameset_2b
+	dw .Frameset_2c
+	dw .Frameset_BlueWalk
+	dw .Frameset_MagnetTrainBlue
+	dw .Frameset_MobileTradeSentBall
+	dw .Frameset_MobileTradeOTBall
+	dw .Frameset_ForMobile22
+	dw .Frameset_ForMobile23
+	dw .Frameset_ForMobile24
+	dw .Frameset_ForMobile25
+	dw .Frameset_IntroSuicune
+	dw .Frameset_IntroSuicune2
+	dw .Frameset_IntroPichu
+	dw .Frameset_IntroWooper
+	dw .Frameset_IntroUnown1
+	dw .Frameset_IntroUnown2
+	dw .Frameset_IntroUnown3
+	dw .Frameset_IntroUnown4
+	dw .Frameset_IntroUnownF2
+	dw .Frameset_IntroSuicuneAway
+	dw .Frameset_IntroUnownF
+	dw .Frameset_CelebiLeft
+	dw .Frameset_CelebiRight
+; 8d76a
+
+.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_PartyMonFast:
+	frame SPRITE_ANIM_OAMSET_RED_WALK_1,  4
+	frame SPRITE_ANIM_OAMSET_RED_WALK_2,  4
+	dorestart
+
+.Frameset_PartyMonWithMailFast:
+	frame SPRITE_ANIM_OAMSET_PARTY_MON_WITH_MAIL_1,  4
+	frame SPRITE_ANIM_OAMSET_PARTY_MON_WITH_MAIL_2,  4
+	dorestart
+
+.Frameset_PartyMonWithItemFast:
+	frame SPRITE_ANIM_OAMSET_PARTY_MON_WITH_ITEM_1,  4
+	frame SPRITE_ANIM_OAMSET_PARTY_MON_WITH_ITEM_2,  4
+	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_BlueWalk:
+	frame SPRITE_ANIM_OAMSET_BLUE_WALK_1,  8
+	frame SPRITE_ANIM_OAMSET_BLUE_WALK_2,  8
+	frame SPRITE_ANIM_OAMSET_BLUE_WALK_1,  8
+	frame SPRITE_ANIM_OAMSET_BLUE_WALK_2,  8, OAM_X_FLIP
+	dorestart
+
+.Frameset_MagnetTrainBlue:
+	frame SPRITE_ANIM_OAMSET_MAGNET_TRAIN_BLUE_1,  8
+	frame SPRITE_ANIM_OAMSET_MAGNET_TRAIN_BLUE_2,  8
+	frame SPRITE_ANIM_OAMSET_MAGNET_TRAIN_BLUE_1,  8
+	frame SPRITE_ANIM_OAMSET_MAGNET_TRAIN_BLUE_2,  8, OAM_X_FLIP
+	dorestart
+
+.Frameset_GSTitleTrail:
+	frame SPRITE_ANIM_OAMSET_GS_TITLE_TRAIL_1,  1
+	frame SPRITE_ANIM_OAMSET_GS_TITLE_TRAIL_2,  1
+	dorestart
+
+.Frameset_TextEntryCursor:
+	frame SPRITE_ANIM_OAMSET_TEXT_ENTRY_CURSOR,  1
+	dorepeat  1
+	dorestart
+
+.Frameset_09:
+	frame SPRITE_ANIM_OAMSET_FOR_FRAMESET_09,  1
+	dorepeat  1
+	dorestart
+
+.Frameset_GameFreakLogo:
+	frame SPRITE_ANIM_OAMSET_GAMEFREAK_LOGO_1,  12
+	frame SPRITE_ANIM_OAMSET_GAMEFREAK_LOGO_2,   1
+	frame SPRITE_ANIM_OAMSET_GAMEFREAK_LOGO_3,   1
+	frame SPRITE_ANIM_OAMSET_GAMEFREAK_LOGO_2,   4
+	frame SPRITE_ANIM_OAMSET_GAMEFREAK_LOGO_1,  12
+	frame SPRITE_ANIM_OAMSET_GAMEFREAK_LOGO_2,  12
+	frame SPRITE_ANIM_OAMSET_GAMEFREAK_LOGO_3,   4
+	frame SPRITE_ANIM_OAMSET_GAMEFREAK_LOGO_4,  32
+	frame SPRITE_ANIM_OAMSET_GAMEFREAK_LOGO_5,   3
+	frame SPRITE_ANIM_OAMSET_GAMEFREAK_LOGO_6,   3
+	frame SPRITE_ANIM_OAMSET_GAMEFREAK_LOGO_7,   4
+	frame SPRITE_ANIM_OAMSET_GAMEFREAK_LOGO_8,   4
+	frame SPRITE_ANIM_OAMSET_GAMEFREAK_LOGO_9,   4
+	frame SPRITE_ANIM_OAMSET_GAMEFREAK_LOGO_10, 10
+	frame SPRITE_ANIM_OAMSET_GAMEFREAK_LOGO_11,  7
+	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_TradePokeBall0:
+	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_35,  3
+	frame SPRITE_ANIM_OAMSET_36,  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
+
+; XXX
+	frame SPRITE_ANIM_OAMSET_43,  8
+	frame SPRITE_ANIM_OAMSET_44,  8
+	dorestart
+
+; XXX
+	frame SPRITE_ANIM_OAMSET_45,  8
+	frame SPRITE_ANIM_OAMSET_46,  8
+	dorestart
+
+; XXX
+	frame SPRITE_ANIM_OAMSET_47,  8
+	frame SPRITE_ANIM_OAMSET_48,  8
+	dorestart
+
+; XXX
+	frame SPRITE_ANIM_OAMSET_49,  1
+	frame SPRITE_ANIM_OAMSET_49,  1, OAM_X_FLIP
+	frame SPRITE_ANIM_OAMSET_49,  1, OAM_X_FLIP, OAM_Y_FLIP
+	frame SPRITE_ANIM_OAMSET_49,  1, OAM_Y_FLIP
+	dorestart
+
+; XXX
+	frame SPRITE_ANIM_OAMSET_4A, 32
+	endanim
+
+; XXX
+	frame SPRITE_ANIM_OAMSET_4B, 32
+	endanim
+
+; XXX
+	frame SPRITE_ANIM_OAMSET_4C, 32
+	endanim
+
+; XXX
+	frame SPRITE_ANIM_OAMSET_4D, 32
+	endanim
+
+; XXX
+	frame SPRITE_ANIM_OAMSET_4E,  3
+	dorepeat  3
+	dorestart
+
+.Frameset_1c:
+	dorepeat 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
+	dorepeat  1
+	frame SPRITE_ANIM_OAMSET_CUT_TREE_3,  1
+	dorepeat  1
+	frame SPRITE_ANIM_OAMSET_CUT_TREE_4,  1
+	delanim
+
+.Frameset_EggCrack:
+	frame SPRITE_ANIM_OAMSET_EGG_CRACK, 32
+	endanim
+
+.Frameset_EggHatch:
+	frame SPRITE_ANIM_OAMSET_55, 32
+	endanim
+
+.Frameset_21:
+	frame SPRITE_ANIM_OAMSET_55, 32, OAM_X_FLIP
+	endanim
+
+.Frameset_22:
+	frame SPRITE_ANIM_OAMSET_55, 32, OAM_Y_FLIP
+	endanim
+
+.Frameset_23:
+	frame SPRITE_ANIM_OAMSET_55, 32, OAM_X_FLIP, OAM_Y_FLIP
+	endanim
+
+.Frameset_24:
+	frame SPRITE_ANIM_OAMSET_56, 10
+	frame SPRITE_ANIM_OAMSET_57,  9
+	frame SPRITE_ANIM_OAMSET_58, 10
+	frame SPRITE_ANIM_OAMSET_59, 10
+	frame SPRITE_ANIM_OAMSET_58,  9
+	frame SPRITE_ANIM_OAMSET_5A, 10
+	dorestart
+
+.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
+
+.Frameset_26:
+	frame SPRITE_ANIM_OAMSET_5C,  2
+	endanim
+
+.Frameset_27:
+	frame SPRITE_ANIM_OAMSET_5D,  2
+	endanim
+
+.Frameset_28:
+	frame SPRITE_ANIM_OAMSET_5E,  2
+	endanim
+
+.Frameset_29:
+	frame SPRITE_ANIM_OAMSET_5F,  2
+	endanim
+
+.Frameset_2a:
+	frame SPRITE_ANIM_OAMSET_60,  2
+	endanim
+
+.Frameset_2b:
+	frame SPRITE_ANIM_OAMSET_61,  2
+	endanim
+
+.Frameset_2c:
+	frame SPRITE_ANIM_OAMSET_62,  2
+	endanim
+
+.Frameset_MobileTradeSentBall:
+	frame SPRITE_ANIM_OAMSET_TRADE_POOF_1,  3
+	frame SPRITE_ANIM_OAMSET_TRADE_POOF_2,  3
+	frame SPRITE_ANIM_OAMSET_TRADE_POOF_3,  3
+	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
+	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
+	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
+	endanim
+
+.Frameset_MobileTradeOTBall:
+	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
+	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
+	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
+	frame SPRITE_ANIM_OAMSET_TRADE_POOF_1,  3
+	frame SPRITE_ANIM_OAMSET_TRADE_POOF_2,  3
+	frame SPRITE_ANIM_OAMSET_TRADE_POOF_3,  3
+	delanim
+
+.Frameset_ForMobile22:
+	frame SPRITE_ANIM_OAMSET_FOR_MOBILE_22_1,  3
+	frame SPRITE_ANIM_OAMSET_FOR_MOBILE_22_2,  3
+	dorestart
+
+.Frameset_ForMobile23:
+	frame SPRITE_ANIM_OAMSET_FOR_MOBILE_23,  3
+	endanim
+
+.Frameset_ForMobile24:
+	frame SPRITE_ANIM_OAMSET_FOR_MOBILE_24,  3
+	endanim
+
+.Frameset_ForMobile25:
+	frame SPRITE_ANIM_OAMSET_FOR_MOBILE_25_1,  2
+	frame SPRITE_ANIM_OAMSET_FOR_MOBILE_25_2,  2
+	frame SPRITE_ANIM_OAMSET_FOR_MOBILE_25_3,  2
+	delanim
+
+.Frameset_IntroSuicune:
+	frame SPRITE_ANIM_OAMSET_INTRO_SUICUNE_1,  3
+	frame SPRITE_ANIM_OAMSET_INTRO_SUICUNE_2,  3
+	frame SPRITE_ANIM_OAMSET_INTRO_SUICUNE_3,  3
+	frame SPRITE_ANIM_OAMSET_INTRO_SUICUNE_4,  3
+	dorestart
+
+.Frameset_IntroSuicune2:
+	frame SPRITE_ANIM_OAMSET_INTRO_SUICUNE_4,  3
+	frame SPRITE_ANIM_OAMSET_INTRO_SUICUNE_1,  7
+	endanim
+
+.Frameset_IntroPichu:
+	frame SPRITE_ANIM_OAMSET_INTRO_PICHU_1, 32
+	frame SPRITE_ANIM_OAMSET_INTRO_PICHU_2,  7
+	frame SPRITE_ANIM_OAMSET_INTRO_PICHU_3,  7
+	endanim
+
+.Frameset_IntroWooper:
+	frame SPRITE_ANIM_OAMSET_INTRO_WOOPER,  3
+	endanim
+
+.Frameset_IntroUnown1:
+	frame SPRITE_ANIM_OAMSET_INTRO_UNOWN_1,  3
+	frame SPRITE_ANIM_OAMSET_INTRO_UNOWN_2,  3
+	frame SPRITE_ANIM_OAMSET_INTRO_UNOWN_3,  7
+	delanim
+
+.Frameset_IntroUnown2:
+	frame SPRITE_ANIM_OAMSET_INTRO_UNOWN_1,  3, OAM_X_FLIP
+	frame SPRITE_ANIM_OAMSET_INTRO_UNOWN_2,  3, OAM_X_FLIP
+	frame SPRITE_ANIM_OAMSET_INTRO_UNOWN_3,  7, OAM_X_FLIP
+	delanim
+
+.Frameset_IntroUnown3:
+	frame SPRITE_ANIM_OAMSET_INTRO_UNOWN_1,  3, OAM_Y_FLIP
+	frame SPRITE_ANIM_OAMSET_INTRO_UNOWN_2,  3, OAM_Y_FLIP
+	frame SPRITE_ANIM_OAMSET_INTRO_UNOWN_3,  7, OAM_Y_FLIP
+	delanim
+
+.Frameset_IntroUnown4:
+	frame SPRITE_ANIM_OAMSET_INTRO_UNOWN_1,  3, OAM_X_FLIP, OAM_Y_FLIP
+	frame SPRITE_ANIM_OAMSET_INTRO_UNOWN_2,  3, OAM_X_FLIP, OAM_Y_FLIP
+	frame SPRITE_ANIM_OAMSET_INTRO_UNOWN_3,  7, OAM_X_FLIP, OAM_Y_FLIP
+	delanim
+
+.Frameset_IntroUnownF2:
+	frame SPRITE_ANIM_OAMSET_INTRO_UNOWN_F_2_1,  3
+	frame SPRITE_ANIM_OAMSET_INTRO_UNOWN_F_2_2,  3
+	frame SPRITE_ANIM_OAMSET_INTRO_UNOWN_F_2_3,  3
+	frame SPRITE_ANIM_OAMSET_INTRO_UNOWN_F_2_4,  7
+	frame SPRITE_ANIM_OAMSET_INTRO_UNOWN_F_2_5,  7
+	endanim
+
+.Frameset_IntroSuicuneAway:
+	frame SPRITE_ANIM_OAMSET_INTRO_SUICUNE_AWAY,  3
+	endanim
+
+.Frameset_IntroUnownF:
+	dorepeat 0
+	endanim
+
+.Frameset_CelebiLeft:
+	frame SPRITE_ANIM_OAMSET_CELEBI_1,  8
+	frame SPRITE_ANIM_OAMSET_CELEBI_2,  8
+	endanim
+
+.Frameset_CelebiRight:
+	frame SPRITE_ANIM_OAMSET_CELEBI_1,  8, OAM_X_FLIP
+	frame SPRITE_ANIM_OAMSET_CELEBI_2,  8, OAM_X_FLIP
+	endanim
+; 8d94d
--- /dev/null
+++ b/data/sprites/oam.asm
@@ -1,0 +1,1131 @@
+SpriteAnimOAMData: ; 8d94d
+; entries correspond to SPRITE_ANIM_OAMSET_* constants
+	; vtile offset, 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_02
+	dbw $5c, .OAMData_1x1_Palette0 ; SPRITE_ANIM_OAMSET_03
+	dbw $6c, .OAMData_04 ; SPRITE_ANIM_OAMSET_04
+	dbw $6e, .OAMData_04 ; SPRITE_ANIM_OAMSET_05
+	dbw $2d, .OAMData_06 ; SPRITE_ANIM_OAMSET_06
+	dbw $4d, .OAMData_06 ; SPRITE_ANIM_OAMSET_07
+	dbw $60, .OAMData_08 ; SPRITE_ANIM_OAMSET_08
+	dbw $00, .OAMData_08 ; SPRITE_ANIM_OAMSET_09
+	dbw $00, .OAMData_08 ; SPRITE_ANIM_OAMSET_0A
+	dbw $06, .OAMData_08 ; SPRITE_ANIM_OAMSET_0B
+	dbw $0c, .OAMData_0c ; SPRITE_ANIM_OAMSET_0C
+	dbw $0d, .OAMData_1x1_Palette0 ; SPRITE_ANIM_OAMSET_0D
+	dbw $00, .OAMData_0e ; SPRITE_ANIM_OAMSET_0E
+	dbw $04, .OAMData_0e ; SPRITE_ANIM_OAMSET_0F
+	dbw $08, .OAMData_0e ; SPRITE_ANIM_OAMSET_10
+	dbw $40, .OAMData_0e ; SPRITE_ANIM_OAMSET_11
+	dbw $44, .OAMData_0e ; SPRITE_ANIM_OAMSET_12
+	dbw $48, .OAMData_0e ; SPRITE_ANIM_OAMSET_13
+	dbw $4c, .OAMData_0e ; SPRITE_ANIM_OAMSET_14
+	dbw $80, .OAMData_15 ; SPRITE_ANIM_OAMSET_15
+	dbw $85, .OAMData_15 ; SPRITE_ANIM_OAMSET_16
+	dbw $8a, .OAMData_15 ; SPRITE_ANIM_OAMSET_17
+	dbw $00, .OAMData_18 ; SPRITE_ANIM_OAMSET_18
+	dbw $01, .OAMData_TradePoofBubble ; SPRITE_ANIM_OAMSET_19
+	dbw $09, .OAMData_1a ; SPRITE_ANIM_OAMSET_1A
+	dbw $10, .OAMData_1b ; SPRITE_ANIM_OAMSET_1B
+	dbw $29, .OAMData_1b ; SPRITE_ANIM_OAMSET_1C
+	dbw $42, .OAMData_1b ; SPRITE_ANIM_OAMSET_1D
+	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_ForFrameset09 ; SPRITE_ANIM_OAMSET_FOR_FRAMESET_09
+	dbw $00, .OAMData_22 ; SPRITE_ANIM_OAMSET_22
+	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_35 ; SPRITE_ANIM_OAMSET_35
+	dbw $13, .OAMData_35 ; SPRITE_ANIM_OAMSET_36
+	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_43 ; SPRITE_ANIM_OAMSET_43
+	dbw $30, .OAMData_43 ; SPRITE_ANIM_OAMSET_44
+	dbw $03, .OAMData_43 ; SPRITE_ANIM_OAMSET_45
+	dbw $33, .OAMData_43 ; SPRITE_ANIM_OAMSET_46
+	dbw $06, .OAMData_43 ; SPRITE_ANIM_OAMSET_47
+	dbw $36, .OAMData_43 ; SPRITE_ANIM_OAMSET_48
+	dbw $09, .OAMData_43 ; SPRITE_ANIM_OAMSET_49
+	dbw $39, .OAMData_43 ; SPRITE_ANIM_OAMSET_4A
+	dbw $0c, .OAMData_4b ; SPRITE_ANIM_OAMSET_4B
+	dbw $0c, .OAMData_4c ; SPRITE_ANIM_OAMSET_4C
+	dbw $3c, .OAMData_1x1_Palette0 ; SPRITE_ANIM_OAMSET_4D
+	dbw $3e, .OAMData_1x1_Palette0 ; SPRITE_ANIM_OAMSET_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_55
+	dbw $00, .OAMData_56 ; SPRITE_ANIM_OAMSET_56
+	dbw $00, .OAMData_57 ; SPRITE_ANIM_OAMSET_57
+	dbw $00, .OAMData_58 ; SPRITE_ANIM_OAMSET_58
+	dbw $00, .OAMData_59 ; SPRITE_ANIM_OAMSET_59
+	dbw $00, .OAMData_5a ; SPRITE_ANIM_OAMSET_5A
+	dbw $04, .OAMData_Tree ; SPRITE_ANIM_OAMSET_HEADBUTT_TREE_2
+	dbw $00, .OAMData_5c ; SPRITE_ANIM_OAMSET_5C
+	dbw $00, .OAMData_5d ; SPRITE_ANIM_OAMSET_5D
+	dbw $00, .OAMData_5e ; SPRITE_ANIM_OAMSET_5E
+	dbw $00, .OAMData_5f ; SPRITE_ANIM_OAMSET_5F
+	dbw $00, .OAMData_60 ; SPRITE_ANIM_OAMSET_60
+	dbw $00, .OAMData_61 ; SPRITE_ANIM_OAMSET_61
+	dbw $00, .OAMData_62 ; SPRITE_ANIM_OAMSET_62
+	dbw $00, .OAMData_BlueWalk ; SPRITE_ANIM_OAMSET_BLUE_WALK_1
+	dbw $04, .OAMData_BlueWalk ; SPRITE_ANIM_OAMSET_BLUE_WALK_2
+	dbw $00, .OAMData_MagnetTrainBlue ; SPRITE_ANIM_OAMSET_MAGNET_TRAIN_BLUE_1
+	dbw $04, .OAMData_MagnetTrainBlue ; SPRITE_ANIM_OAMSET_MAGNET_TRAIN_BLUE_2
+	dbw $20, .OAMData_ForMobile22 ; SPRITE_ANIM_OAMSET_FOR_MOBILE_22_1
+	dbw $21, .OAMData_ForMobile22 ; SPRITE_ANIM_OAMSET_FOR_MOBILE_22_2
+	dbw $22, .OAMData_ForMobile25_1 ; SPRITE_ANIM_OAMSET_FOR_MOBILE_25_1
+	dbw $23, .OAMData_ForMobile25_2 ; SPRITE_ANIM_OAMSET_FOR_MOBILE_25_2
+	dbw $27, .OAMData_ForMobile25_3 ; SPRITE_ANIM_OAMSET_FOR_MOBILE_25_3
+	dbw $2a, .OAMData_ForMobile23 ; SPRITE_ANIM_OAMSET_FOR_MOBILE_23
+	dbw $2a, .OAMData_ForMobile24 ; SPRITE_ANIM_OAMSET_FOR_MOBILE_24
+	dbw $00, .OAMData_IntroSuicune1 ; SPRITE_ANIM_OAMSET_INTRO_SUICUNE_1
+	dbw $08, .OAMData_IntroSuicune2 ; SPRITE_ANIM_OAMSET_INTRO_SUICUNE_2
+	dbw $60, .OAMData_IntroSuicune3 ; SPRITE_ANIM_OAMSET_INTRO_SUICUNE_3
+	dbw $68, .OAMData_IntroSuicune4 ; SPRITE_ANIM_OAMSET_INTRO_SUICUNE_4
+	dbw $00, .OAMData_IntroPichu ; SPRITE_ANIM_OAMSET_INTRO_PICHU_1
+	dbw $05, .OAMData_IntroPichu ; SPRITE_ANIM_OAMSET_INTRO_PICHU_2
+	dbw $0a, .OAMData_IntroPichu ; SPRITE_ANIM_OAMSET_INTRO_PICHU_3
+	dbw $50, .OAMData_IntroWooper ; SPRITE_ANIM_OAMSET_INTRO_WOOPER
+	dbw $00, .OAMData_IntroUnown1 ; SPRITE_ANIM_OAMSET_INTRO_UNOWN_1
+	dbw $01, .OAMData_IntroUnown2 ; SPRITE_ANIM_OAMSET_INTRO_UNOWN_2
+	dbw $04, .OAMData_IntroUnown3 ; SPRITE_ANIM_OAMSET_INTRO_UNOWN_3
+	dbw $00, .OAMData_18 ; SPRITE_ANIM_OAMSET_INTRO_UNOWN_F_2_1
+	dbw $01, .OAMData_IntroUnownF2_2 ; SPRITE_ANIM_OAMSET_INTRO_UNOWN_F_2_2
+	dbw $03, .OAMData_IntroUnownF2_3 ; SPRITE_ANIM_OAMSET_INTRO_UNOWN_F_2_3
+	dbw $08, .OAMData_IntroUnownF2_4_5 ; SPRITE_ANIM_OAMSET_INTRO_UNOWN_F_2_4
+	dbw $1c, .OAMData_IntroUnownF2_4_5 ; SPRITE_ANIM_OAMSET_INTRO_UNOWN_F_2_5
+	dbw $80, .OAMData_IntroSuicuneAway ; SPRITE_ANIM_OAMSET_INTRO_SUICUNE_AWAY
+	dbw $00, .OAMData_Celebi ; SPRITE_ANIM_OAMSET_CELEBI_1
+	dbw $04, .OAMData_Celebi ; SPRITE_ANIM_OAMSET_CELEBI_2
+	dbw $d0, .OAMData_GameFreakLogo1_3 ; SPRITE_ANIM_OAMSET_GAMEFREAK_LOGO_1
+	dbw $d3, .OAMData_GameFreakLogo1_3 ; SPRITE_ANIM_OAMSET_GAMEFREAK_LOGO_2
+	dbw $d6, .OAMData_GameFreakLogo1_3 ; SPRITE_ANIM_OAMSET_GAMEFREAK_LOGO_3
+	dbw $6c, .OAMData_GameFreakLogo4_11 ; SPRITE_ANIM_OAMSET_GAMEFREAK_LOGO_4
+	dbw $68, .OAMData_GameFreakLogo4_11 ; SPRITE_ANIM_OAMSET_GAMEFREAK_LOGO_5
+	dbw $64, .OAMData_GameFreakLogo4_11 ; SPRITE_ANIM_OAMSET_GAMEFREAK_LOGO_6
+	dbw $60, .OAMData_GameFreakLogo4_11 ; SPRITE_ANIM_OAMSET_GAMEFREAK_LOGO_7
+	dbw $0c, .OAMData_GameFreakLogo4_11 ; SPRITE_ANIM_OAMSET_GAMEFREAK_LOGO_8
+	dbw $08, .OAMData_GameFreakLogo4_11 ; SPRITE_ANIM_OAMSET_GAMEFREAK_LOGO_9
+	dbw $04, .OAMData_GameFreakLogo4_11 ; SPRITE_ANIM_OAMSET_GAMEFREAK_LOGO_10
+	dbw $00, .OAMData_GameFreakLogo4_11 ; SPRITE_ANIM_OAMSET_GAMEFREAK_LOGO_11
+
+.OAMData_1x1_Palette0:
+	db 1
+	dsprite -1,  4, -1,  4, $00, $00
+
+.OAMData_04:
+	db 4
+	dsprite -1,  0, -1,  0, $00, $00
+	dsprite -1,  0,  0,  0, $01, $00
+	dsprite  0,  0, -1,  0, $10, $00
+	dsprite  0,  0,  0,  0, $11, $00
+
+.OAMData_GSIntroStar:
+	db 4
+	dsprite -1,  0, -1,  0, $00, 0
+	dsprite -1,  0,  0,  0, $00, 0 | X_FLIP
+	dsprite  0,  0, -1,  0, $01, 0
+	dsprite  0,  0,  0,  0, $01, 0 | X_FLIP
+
+.OAMData_TradePokeBall1:
+	db 4
+	dsprite -1,  0, -1,  0, $00, $80
+	dsprite -1,  0,  0,  0, $00, $a0
+	dsprite  0,  0, -1,  0, $01, $80
+	dsprite  0,  0,  0,  0, $01, $a0
+
+.OAMData_18:
+	db 4
+	dsprite -1,  0, -1,  0, $00, $00
+	dsprite -1,  0,  0,  0, $00, $20
+	dsprite  0,  0, -1,  0, $00, $40
+	dsprite  0,  0,  0,  0, $00, $60
+
+.OAMData_35:
+	db 4
+	dsprite -1,  0, -1,  0, $00, $07
+	dsprite -1,  0,  0,  0, $00, $27
+	dsprite  0,  0, -1,  0, $00, $47
+	dsprite  0,  0,  0,  0, $00, $67
+; 8db4b
+
+; 8db4b
+	db 4
+	dsprite -1,  0, -1,  0, $00, $80
+	dsprite -1,  0,  0,  0, $00, $a0
+	dsprite  0,  0, -1,  0, $00, $c0
+	dsprite  0,  0,  0,  0, $00, $e0
+
+.OAMData_TradePoofBubble:
+	db 16
+	dsprite -2,  0, -2,  0, $00, 0
+	dsprite -2,  0, -1,  0, $01, 0
+	dsprite -1,  0, -2,  0, $02, 0
+	dsprite -1,  0, -1,  0, $03, 0
+	dsprite -2,  0,  0,  0, $01, 0 | X_FLIP
+	dsprite -2,  0,  1,  0, $00, 0 | X_FLIP
+	dsprite -1,  0,  0,  0, $03, 0 | X_FLIP
+	dsprite -1,  0,  1,  0, $02, 0 | X_FLIP
+	dsprite  0,  0, -2,  0, $02, 0 | Y_FLIP
+	dsprite  0,  0, -1,  0, $03, 0 | Y_FLIP
+	dsprite  1,  0, -2,  0, $00, 0 | Y_FLIP
+	dsprite  1,  0, -1,  0, $01, 0 | Y_FLIP
+	dsprite  0,  0,  0,  0, $03, 0 | X_FLIP | Y_FLIP
+	dsprite  0,  0,  1,  0, $02, 0 | X_FLIP | Y_FLIP
+	dsprite  1,  0,  0,  0, $01, 0 | X_FLIP | Y_FLIP
+	dsprite  1,  0,  1,  0, $00, 0 | X_FLIP | Y_FLIP
+
+.OAMData_1a:
+	db 36
+	dsprite -3,  0, -3,  0, $00, $00
+	dsprite -3,  0, -2,  0, $01, $00
+	dsprite -3,  0, -1,  0, $02, $00
+	dsprite -2,  0, -3,  0, $03, $00
+	dsprite -2,  0, -2,  0, $04, $00
+	dsprite -2,  0, -1,  0, $05, $00
+	dsprite -1,  0, -3,  0, $06, $00
+	dsprite -1,  0, -2,  0, $05, $00
+	dsprite -1,  0, -1,  0, $05, $00
+	dsprite -3,  0,  0,  0, $02, $20
+	dsprite -3,  0,  1,  0, $01, $20
+	dsprite -3,  0,  2,  0, $00, $20
+	dsprite -2,  0,  0,  0, $05, $20
+	dsprite -2,  0,  1,  0, $04, $20
+	dsprite -2,  0,  2,  0, $03, $20
+	dsprite -1,  0,  0,  0, $05, $20
+	dsprite -1,  0,  1,  0, $05, $20
+	dsprite -1,  0,  2,  0, $06, $20
+	dsprite  0,  0, -3,  0, $06, $40
+	dsprite  0,  0, -2,  0, $05, $40
+	dsprite  0,  0, -1,  0, $05, $40
+	dsprite  1,  0, -3,  0, $03, $40
+	dsprite  1,  0, -2,  0, $04, $40
+	dsprite  1,  0, -1,  0, $05, $40
+	dsprite  2,  0, -3,  0, $00, $40
+	dsprite  2,  0, -2,  0, $01, $40
+	dsprite  2,  0, -1,  0, $02, $40
+	dsprite  0,  0,  0,  0, $05, $60
+	dsprite  0,  0,  1,  0, $05, $60
+	dsprite  0,  0,  2,  0, $06, $60
+	dsprite  1,  0,  0,  0, $05, $60
+	dsprite  1,  0,  1,  0, $04, $60
+	dsprite  1,  0,  2,  0, $03, $60
+	dsprite  2,  0,  0,  0, $02, $60
+	dsprite  2,  0,  1,  0, $01, $60
+	dsprite  2,  0,  2,  0, $00, $60
+
+.OAMData_43:
+	db 9
+	dsprite -2,  4, -2,  4, $00, $00
+	dsprite -2,  4, -1,  4, $01, $00
+	dsprite -2,  4,  0,  4, $02, $00
+	dsprite -1,  4, -2,  4, $10, $00
+	dsprite -1,  4, -1,  4, $11, $00
+	dsprite -1,  4,  0,  4, $12, $00
+	dsprite  0,  4, -2,  4, $20, $00
+	dsprite  0,  4, -1,  4, $21, $00
+	dsprite  0,  4,  0,  4, $22, $00
+
+.OAMData_0e:
+	db 16
+	dsprite -2,  0, -2,  0, $00, $00
+	dsprite -2,  0, -1,  0, $01, $00
+	dsprite -2,  0,  0,  0, $02, $00
+	dsprite -2,  0,  1,  0, $03, $00
+	dsprite -1,  0, -2,  0, $10, $00
+	dsprite -1,  0, -1,  0, $11, $00
+	dsprite -1,  0,  0,  0, $12, $00
+	dsprite -1,  0,  1,  0, $13, $00
+	dsprite  0,  0, -2,  0, $20, $00
+	dsprite  0,  0, -1,  0, $21, $00
+	dsprite  0,  0,  0,  0, $22, $00
+	dsprite  0,  0,  1,  0, $23, $00
+	dsprite  1,  0, -2,  0, $30, $00
+	dsprite  1,  0, -1,  0, $31, $00
+	dsprite  1,  0,  0,  0, $32, $00
+	dsprite  1,  0,  1,  0, $33, $00
+
+.OAMData_1b:
+	db 25
+	dsprite -3,  4, -3,  4, $00, $00
+	dsprite -2,  4, -3,  4, $01, $00
+	dsprite -1,  4, -3,  4, $02, $00
+	dsprite  0,  4, -3,  4, $03, $00
+	dsprite  1,  4, -3,  4, $04, $00
+	dsprite -3,  4, -2,  4, $05, $00
+	dsprite -2,  4, -2,  4, $06, $00
+	dsprite -1,  4, -2,  4, $07, $00
+	dsprite  0,  4, -2,  4, $08, $00
+	dsprite  1,  4, -2,  4, $09, $00
+	dsprite -3,  4, -1,  4, $0a, $00
+	dsprite -2,  4, -1,  4, $0b, $00
+	dsprite -1,  4, -1,  4, $0c, $00
+	dsprite  0,  4, -1,  4, $0d, $00
+	dsprite  1,  4, -1,  4, $0e, $00
+	dsprite -3,  4,  0,  4, $0f, $00
+	dsprite -2,  4,  0,  4, $10, $00
+	dsprite -1,  4,  0,  4, $11, $00
+	dsprite  0,  4,  0,  4, $12, $00
+	dsprite  1,  4,  0,  4, $13, $00
+	dsprite -3,  4,  1,  4, $14, $00
+	dsprite -2,  4,  1,  4, $15, $00
+	dsprite -1,  4,  1,  4, $16, $00
+	dsprite  0,  4,  1,  4, $17, $00
+	dsprite  1,  4,  1,  4, $18, $00
+; 8dcf9
+
+; 8dcf9
+	db 36
+	dsprite -3,  0, -3,  0, $00, $00
+	dsprite -3,  0, -2,  0, $01, $00
+	dsprite -3,  0, -1,  0, $02, $00
+	dsprite -3,  0,  0,  0, $03, $00
+	dsprite -3,  0,  1,  0, $04, $00
+	dsprite -3,  0,  2,  0, $05, $00
+	dsprite -2,  0, -3,  0, $06, $00
+	dsprite -2,  0, -2,  0, $07, $00
+	dsprite -2,  0, -1,  0, $08, $00
+	dsprite -2,  0,  0,  0, $09, $00
+	dsprite -2,  0,  1,  0, $0a, $00
+	dsprite -2,  0,  2,  0, $0b, $00
+	dsprite -1,  0, -3,  0, $0c, $00
+	dsprite -1,  0, -2,  0, $0d, $00
+	dsprite -1,  0, -1,  0, $0e, $00
+	dsprite -1,  0,  0,  0, $0f, $00
+	dsprite -1,  0,  1,  0, $10, $00
+	dsprite -1,  0,  2,  0, $11, $00
+	dsprite  0,  0, -3,  0, $12, $00
+	dsprite  0,  0, -2,  0, $13, $00
+	dsprite  0,  0, -1,  0, $14, $00
+	dsprite  0,  0,  0,  0, $15, $00
+	dsprite  0,  0,  1,  0, $16, $00
+	dsprite  0,  0,  2,  0, $17, $00
+	dsprite  1,  0, -3,  0, $18, $00
+	dsprite  1,  0, -2,  0, $19, $00
+	dsprite  1,  0, -1,  0, $1a, $00
+	dsprite  1,  0,  0,  0, $1b, $00
+	dsprite  1,  0,  1,  0, $1c, $00
+	dsprite  1,  0,  2,  0, $1d, $00
+	dsprite  2,  0, -3,  0, $1e, $00
+	dsprite  2,  0, -2,  0, $1f, $00
+	dsprite  2,  0, -1,  0, $20, $00
+	dsprite  2,  0,  0,  0, $21, $00
+	dsprite  2,  0,  1,  0, $22, $00
+	dsprite  2,  0,  2,  0, $23, $00
+
+.OAMData_RedWalk:
+	db 4
+	dsprite -1,  0, -1,  0, $00, PAL_OW_RED
+	dsprite -1,  0,  0,  0, $01, PAL_OW_RED
+	dsprite  0,  0, -1,  0, $02, PAL_OW_RED
+	dsprite  0,  0,  0,  0, $03, PAL_OW_RED
+
+.OAMData_MagnetTrainRed:
+	db 4
+	dsprite -1,  0, -1,  0, $00, PAL_OW_RED | BEHIND_BG
+	dsprite -1,  0,  0,  0, $01, PAL_OW_RED | BEHIND_BG
+	dsprite  0,  0, -1,  0, $02, PAL_OW_RED | BEHIND_BG
+	dsprite  0,  0,  0,  0, $03, PAL_OW_RED | BEHIND_BG
+
+.OAMData_PartyMonWithMail1:
+	db 4
+	dsprite -1,  0, -1,  0, $00, PAL_OW_RED
+	dsprite -1,  0,  0,  0, $01, PAL_OW_RED
+	dsprite  0,  0, -1,  0, $08, PAL_OW_RED
+	dsprite  0,  0,  0,  0, $03, PAL_OW_RED
+
+.OAMData_PartyMonWithMail2:
+	db 4
+	dsprite -1,  0, -1,  0, $04, PAL_OW_RED
+	dsprite -1,  0,  0,  0, $05, PAL_OW_RED
+	dsprite  0,  0, -1,  0, $08, PAL_OW_RED
+	dsprite  0,  0,  0,  0, $07, PAL_OW_RED
+
+.OAMData_PartyMonWithItem1:
+	db 4
+	dsprite -1,  0, -1,  0, $00, PAL_OW_RED
+	dsprite -1,  0,  0,  0, $01, PAL_OW_RED
+	dsprite  0,  0, -1,  0, $09, PAL_OW_RED
+	dsprite  0,  0,  0,  0, $03, PAL_OW_RED
+
+.OAMData_PartyMonWithItem2:
+	db 4
+	dsprite -1,  0, -1,  0, $04, PAL_OW_RED
+	dsprite -1,  0,  0,  0, $05, PAL_OW_RED
+	dsprite  0,  0, -1,  0, $09, PAL_OW_RED
+	dsprite  0,  0,  0,  0, $07, PAL_OW_RED
+
+.OAMData_06:
+	db 6
+	dsprite -1,  0, -2,  4, $00, $01
+	dsprite -1,  0, -1,  4, $01, $01
+	dsprite -1,  0,  0,  4, $02, $01
+	dsprite  0,  0, -2,  4, $10, $01
+	dsprite  0,  0, -1,  4, $11, $01
+	dsprite  0,  0,  0,  4, $12, $01
+
+.OAMData_08:
+	db 29
+	dsprite -3,  0, -3,  0, $00, $00
+	dsprite -3,  0, -2,  0, $01, $00
+	dsprite -3,  0, -1,  0, $02, $00
+	dsprite -3,  0,  0,  0, $03, $00
+	dsprite -2,  0, -3,  0, $10, $00
+	dsprite -2,  0, -2,  0, $11, $00
+	dsprite -2,  0, -1,  0, $12, $00
+	dsprite -2,  0,  0,  0, $13, $00
+	dsprite -1,  0, -3,  0, $20, $00
+	dsprite -1,  0, -2,  0, $21, $00
+	dsprite -1,  0, -1,  0, $22, $00
+	dsprite -1,  0,  0,  0, $23, $00
+	dsprite -1,  0,  1,  0, $24, $00
+	dsprite  0,  0, -3,  0, $30, $80
+	dsprite  0,  0, -2,  0, $31, $80
+	dsprite  0,  0, -1,  0, $32, $80
+	dsprite  0,  0,  0,  0, $33, $80
+	dsprite  0,  0,  1,  0, $34, $80
+	dsprite  1,  0, -3,  0, $40, $80
+	dsprite  1,  0, -2,  0, $41, $80
+	dsprite  1,  0, -1,  0, $42, $80
+	dsprite  1,  0,  0,  0, $43, $80
+	dsprite  1,  0,  1,  0, $44, $80
+	dsprite  1,  0,  2,  0, $45, $80
+	dsprite  2,  0, -2,  0, $51, $80
+	dsprite  2,  0, -1,  0, $52, $80
+	dsprite  2,  0,  0,  0, $53, $80
+	dsprite  2,  0,  1,  0, $54, $80
+	dsprite  2,  0,  2,  0, $55, $80
+
+.OAMData_0c:
+	db 2
+	dsprite -1,  0, -1,  4, $00, $00
+	dsprite  0,  0, -1,  4, $10, $00
+
+.OAMData_15:
+	db 5
+	dsprite -2,  0,  3,  0, $00, $00
+	dsprite -2,  0,  4,  0, $01, $00
+	dsprite -1,  0,  2,  0, $02, $00
+	dsprite -1,  0,  3,  0, $03, $00
+	dsprite  0,  0,  2,  0, $04, $00
+
+.OAMData_Leaf:
+	db 1
+	dsprite -1,  4, -1,  4, $00, PAL_OW_TREE
+
+.OAMData_Tree:
+	db 4
+	dsprite -1,  0, -1,  0, $00, PAL_OW_TREE
+	dsprite -1,  0,  0,  0, $01, PAL_OW_TREE
+	dsprite  0,  0, -1,  0, $02, PAL_OW_TREE
+	dsprite  0,  0,  0,  0, $03, PAL_OW_TREE
+
+.OAMData_TextEntryCursor:
+	db 4
+	dsprite -1,  7, -1,  7, $00, 0
+	dsprite -1,  7,  0,  0, $00, 0 | X_FLIP
+	dsprite  0,  0, -1,  7, $00, 0 | Y_FLIP
+	dsprite  0,  0,  0,  0, $00, 0 | X_FLIP | Y_FLIP
+
+.OAMData_ForFrameset09:
+	db 10
+	dsprite -1,  7,  0,  0, $00, 0
+	dsprite -1,  7,  1,  0, $01, 0
+	dsprite -1,  7,  2,  0, $01, 0
+	dsprite -1,  7,  3,  0, $01, 0
+	dsprite -1,  7,  4,  0, $00, 0 | X_FLIP
+	dsprite  0,  0,  0,  0, $00, 0 | Y_FLIP
+	dsprite  0,  0,  1,  0, $01, 0 | Y_FLIP
+	dsprite  0,  0,  2,  0, $01, 0 | Y_FLIP
+	dsprite  0,  0,  3,  0, $01, 0 | Y_FLIP
+	dsprite  0,  0,  4,  0, $00, 0 | X_FLIP | Y_FLIP
+
+.OAMData_22:
+	db 15
+	dsprite -3,  4, -2,  4, $00, $11
+	dsprite -3,  4, -1,  4, $01, $11
+	dsprite -3,  4,  0,  4, $02, $11
+	dsprite -2,  4, -2,  4, $03, $11
+	dsprite -2,  4, -1,  4, $04, $11
+	dsprite -2,  4,  0,  4, $05, $11
+	dsprite -1,  4, -2,  4, $06, $11
+	dsprite -1,  4, -1,  4, $07, $11
+	dsprite -1,  4,  0,  4, $08, $11
+	dsprite  0,  4, -2,  4, $09, $11
+	dsprite  0,  4, -1,  4, $0a, $11
+	dsprite  0,  4,  0,  4, $0b, $11
+	dsprite  1,  4, -2,  4, $0c, $11
+	dsprite  1,  4, -1,  4, $0d, $11
+	dsprite  1,  4,  0,  4, $0e, $11
+
+.OAMData_SlotsGolem:
+	db 6
+	dsprite -2,  4, -2,  4, $00, 5 | OBP_NUM
+	dsprite -2,  4, -1,  4, $02, 5 | OBP_NUM
+	dsprite -2,  4,  0,  4, $00, 5 | OBP_NUM | X_FLIP
+	dsprite  0,  4, -2,  4, $04, 5 | OBP_NUM
+	dsprite  0,  4, -1,  4, $06, 5 | OBP_NUM
+	dsprite  0,  4,  0,  4, $04, 5 | OBP_NUM | X_FLIP
+
+.OAMData_SlotsChansey1:
+	db 6
+	dsprite -2,  4, -2,  4, $00, 6 | OBP_NUM
+	dsprite -2,  4, -1,  4, $02, 6 | OBP_NUM
+	dsprite -2,  4,  0,  4, $04, 6 | OBP_NUM
+	dsprite  0,  4, -2,  4, $06, 6 | OBP_NUM
+	dsprite  0,  4, -1,  4, $08, 6 | OBP_NUM
+	dsprite  0,  4,  0,  4, $0a, 6 | OBP_NUM
+
+.OAMData_SlotsChansey2:
+	db 6
+	dsprite -2,  4, -2,  4, $00, 6 | OBP_NUM
+	dsprite -2,  4, -1,  4, $02, 6 | OBP_NUM
+	dsprite -2,  4,  0,  4, $04, 6 | OBP_NUM
+	dsprite  0,  4, -2,  4, $0c, 6 | OBP_NUM
+	dsprite  0,  4, -1,  4, $0e, 6 | OBP_NUM
+	dsprite  0,  4,  0,  4, $10, 6 | OBP_NUM
+
+.OAMData_SlotsChansey3:
+	db 6
+	dsprite -2,  4, -2,  4, $00, 6 | OBP_NUM
+	dsprite -2,  4, -1,  4, $02, 6 | OBP_NUM
+	dsprite -2,  4,  0,  4, $04, 6 | OBP_NUM
+	dsprite  0,  4, -2,  4, $12, 6 | OBP_NUM
+	dsprite  0,  4, -1,  4, $14, 6 | OBP_NUM
+	dsprite  0,  4,  0,  4, $16, 6 | OBP_NUM
+
+.OAMData_SlotsChansey4:
+	db 6
+	dsprite -2,  4, -2,  4, $00, 6 | OBP_NUM
+	dsprite -2,  4, -1,  4, $02, 6 | OBP_NUM
+	dsprite -2,  4,  0,  4, $04, 6 | OBP_NUM
+	dsprite  0,  4, -2,  4, $18, 6 | OBP_NUM
+	dsprite  0,  4, -1,  4, $1a, 6 | OBP_NUM
+	dsprite  0,  4,  0,  4, $1c, 6 | OBP_NUM
+
+.OAMData_SlotsChansey5:
+	db 6
+	dsprite -2,  4, -2,  4, $1e, 6 | OBP_NUM
+	dsprite -2,  4, -1,  4, $20, 6 | OBP_NUM
+	dsprite -2,  4,  0,  4, $22, 6 | OBP_NUM
+	dsprite  0,  4, -2,  4, $24, 6 | OBP_NUM
+	dsprite  0,  4, -1,  4, $26, 6 | OBP_NUM
+	dsprite  0,  4,  0,  4, $28, 6 | OBP_NUM
+
+.OAMData_RadioTuningKnob:
+	db 3
+	dsprite -2,  4, -1,  4, $00, 0 | OBP_NUM
+	dsprite -1,  4, -1,  4, $00, 0 | OBP_NUM
+	dsprite  0,  4, -1,  4, $00, 0 | OBP_NUM
+
+.OAMData_4b:
+	db 6
+	dsprite  0,  0,  0,  0, $00, $00
+	dsprite  0,  0,  1,  0, $01, $00
+	dsprite  0,  0,  2,  0, $01, $00
+	dsprite  0,  0,  3,  0, $01, $00
+	dsprite  0,  0,  4,  0, $02, $00
+	dsprite  0,  0,  5,  0, $03, $00
+
+.OAMData_4c:
+	db 4
+	dsprite  0,  0,  0,  0, $00, $00
+	dsprite  0,  0,  1,  0, $01, $00
+	dsprite  0,  0,  2,  0, $02, $00
+	dsprite  0,  0,  3,  0, $03, $00
+
+.OAMData_CutTree2:
+	db 4
+	dsprite -1,  0, -2,  6, $00, PAL_OW_TREE
+	dsprite -1,  0,  0,  2, $01, PAL_OW_TREE
+	dsprite  0,  0, -2,  6, $02, PAL_OW_TREE
+	dsprite  0,  0,  0,  2, $03, PAL_OW_TREE
+
+.OAMData_CutTree3:
+	db 4
+	dsprite -1,  0, -2,  4, $00, PAL_OW_TREE
+	dsprite -1,  0,  0,  4, $01, PAL_OW_TREE
+	dsprite  0,  0, -2,  4, $02, PAL_OW_TREE
+	dsprite  0,  0,  0,  4, $03, PAL_OW_TREE
+
+.OAMData_CutTree4:
+	db 4
+	dsprite -1,  0, -2,  0, $00, PAL_OW_TREE
+	dsprite -1,  0,  1,  0, $01, PAL_OW_TREE
+	dsprite  0,  0, -2,  0, $02, PAL_OW_TREE
+	dsprite  0,  0,  1,  0, $03, PAL_OW_TREE
+
+.OAMData_56:
+	db 19
+	dsprite -1,  0, -4,  0, $00, $00
+	dsprite -2,  0, -3,  0, $02, $00
+	dsprite  0,  0, -3,  0, $04, $00
+	dsprite -3,  0, -2,  0, $06, $00
+	dsprite -1,  0, -2,  0, $08, $00
+	dsprite  1,  0, -2,  0, $0a, $00
+	dsprite -3,  0, -1,  0, $0c, $00
+	dsprite -1,  0, -1,  0, $0e, $00
+	dsprite  1,  0, -1,  0, $10, $00
+	dsprite -3,  0,  0,  0, $12, $00
+	dsprite -1,  0,  0,  0, $14, $00
+	dsprite  1,  0,  0,  0, $16, $00
+	dsprite -3,  0,  1,  0, $18, $00
+	dsprite -1,  0,  1,  0, $1a, $00
+	dsprite  1,  0,  1,  0, $1c, $00
+	dsprite -1,  0,  2,  0, $1e, $00
+	dsprite  1,  0,  2,  0, $20, $00
+	dsprite -2,  0,  3,  0, $22, $00
+	dsprite  0,  0,  3,  0, $24, $00
+
+.OAMData_57:
+	db 16
+	dsprite -1,  0, -4,  0, $00, $00
+	dsprite -2,  0, -3,  0, $02, $00
+	dsprite  0,  0, -3,  0, $04, $00
+	dsprite -1,  0, -2,  0, $26, $00
+	dsprite  1,  0, -2,  0, $0a, $00
+	dsprite -3,  0, -1,  0, $28, $00
+	dsprite -1,  0, -1,  0, $2a, $00
+	dsprite  1,  0, -1,  0, $10, $00
+	dsprite -1,  0,  0,  0, $2c, $00
+	dsprite  1,  0,  0,  0, $16, $00
+	dsprite -1,  0,  1,  0, $30, $00
+	dsprite  1,  0,  1,  0, $1c, $00
+	dsprite -1,  0,  2,  0, $1e, $00
+	dsprite  1,  0,  2,  0, $20, $00
+	dsprite -2,  0,  3,  0, $22, $00
+	dsprite  0,  0,  3,  0, $24, $00
+
+.OAMData_58:
+	db 15
+	dsprite -1,  0, -4,  0, $00, $00
+	dsprite -2,  0, -3,  0, $02, $00
+	dsprite  0,  0, -3,  0, $32, $00
+	dsprite -1,  0, -2,  0, $34, $00
+	dsprite  1,  0, -2,  0, $36, $00
+	dsprite -1,  0, -1,  0, $38, $00
+	dsprite  1,  0, -1,  0, $3a, $00
+	dsprite -1,  0,  0,  0, $3c, $00
+	dsprite  1,  0,  0,  0, $3e, $00
+	dsprite -1,  0,  1,  0, $30, $00
+	dsprite  1,  0,  1,  0, $1c, $00
+	dsprite -1,  0,  2,  0, $1e, $00
+	dsprite  1,  0,  2,  0, $20, $00
+	dsprite -2,  0,  3,  0, $22, $00
+	dsprite  0,  0,  3,  0, $24, $00
+
+.OAMData_59:
+	db 17
+	dsprite -1,  0, -4,  0, $00, $00
+	dsprite -2,  0, -3,  0, $02, $00
+	dsprite  0,  0, -3,  0, $04, $00
+	dsprite -1,  0, -2,  0, $40, $00
+	dsprite  1,  0, -2,  0, $42, $00
+	dsprite  3,  0, -2,  0, $44, $00
+	dsprite -1,  0, -1,  0, $46, $00
+	dsprite  1,  0, -1,  0, $48, $00
+	dsprite  3,  0, -1,  0, $4a, $00
+	dsprite -1,  0,  0,  0, $4c, $00
+	dsprite  1,  0,  0,  0, $4e, $00
+	dsprite -1,  0,  1,  0, $30, $00
+	dsprite  1,  0,  1,  0, $1c, $00
+	dsprite -1,  0,  2,  0, $1e, $00
+	dsprite  1,  0,  2,  0, $20, $00
+	dsprite -2,  0,  3,  0, $22, $00
+	dsprite  0,  0,  3,  0, $24, $00
+
+.OAMData_5a:
+	db 17
+	dsprite -1,  0, -4,  0, $00, $00
+	dsprite -2,  0, -3,  0, $02, $00
+	dsprite  0,  0, -3,  0, $04, $00
+	dsprite -1,  0, -2,  0, $50, $00
+	dsprite  1,  0, -2,  0, $0a, $00
+	dsprite -3,  0, -1,  0, $52, $00
+	dsprite -1,  0, -1,  0, $54, $00
+	dsprite  1,  0, -1,  0, $10, $00
+	dsprite -3,  0,  0,  0, $56, $00
+	dsprite -1,  0,  0,  0, $2e, $00
+	dsprite  1,  0,  0,  0, $16, $00
+	dsprite -1,  0,  1,  0, $30, $00
+	dsprite  1,  0,  1,  0, $1c, $00
+	dsprite -1,  0,  2,  0, $1e, $00
+	dsprite  1,  0,  2,  0, $20, $00
+	dsprite -2,  0,  3,  0, $22, $00
+	dsprite  0,  0,  3,  0, $24, $00
+
+.OAMData_GSTitleTrail:
+	db 1
+	dsprite -1,  4, -1,  4, $00, 1 | OBP_NUM
+
+.OAMData_5c:
+	db 12
+	dsprite  0,  0,  0,  0, $30, $00
+	dsprite  0,  0,  1,  0, $31, $00
+	dsprite  0,  0,  2,  0, $31, $00
+	dsprite  0,  0,  3,  0, $31, $00
+	dsprite  0,  0,  4,  0, $31, $00
+	dsprite  0,  0,  5,  0, $32, $00
+	dsprite  1,  0,  0,  0, $33, $00
+	dsprite  1,  0,  1,  0, $34, $00
+	dsprite  1,  0,  2,  0, $34, $00
+	dsprite  1,  0,  3,  0, $34, $00
+	dsprite  1,  0,  4,  0, $34, $00
+	dsprite  1,  0,  5,  0, $35, $00
+
+.OAMData_5d:
+	db 1
+	dsprite  0,  0,  0,  0, $ed, $00
+
+.OAMData_5e:
+	db 4
+	dsprite -1,  7, -1,  7, $30, $00
+	dsprite -1,  7,  0,  1, $32, $00
+	dsprite  0,  1, -1,  7, $33, $00
+	dsprite  0,  1,  0,  1, $35, $00
+
+.OAMData_5f:
+	db 8
+	dsprite -1,  7, -1,  7, $30, $00
+	dsprite -1,  7,  0,  4, $31, $00
+	dsprite -1,  7,  1,  4, $31, $00
+	dsprite -1,  7,  2,  1, $32, $00
+	dsprite  0,  1, -1,  7, $33, $00
+	dsprite  0,  1,  0,  4, $34, $00
+	dsprite  0,  1,  1,  4, $34, $00
+	dsprite  0,  1,  2,  1, $35, $00
+
+.OAMData_60:
+	db 1
+	dsprite  0,  0,  0,  0, $34, $00
+
+.OAMData_61:
+	db 2
+	dsprite  0,  0,  0,  0, $30, $00
+	dsprite  1,  0,  0,  0, $33, $00
+
+.OAMData_62:
+	db 2
+	dsprite  0,  0,  0,  0, $32, $00
+	dsprite  1,  0,  0,  0, $35, $00
+
+.OAMData_BlueWalk:
+	db 4
+	dsprite -1,  0, -1,  0, $00, PAL_OW_BLUE
+	dsprite -1,  0,  0,  0, $01, PAL_OW_BLUE
+	dsprite  0,  0, -1,  0, $02, PAL_OW_BLUE
+	dsprite  0,  0,  0,  0, $03, PAL_OW_BLUE
+
+.OAMData_MagnetTrainBlue:
+	db 4
+	dsprite -1,  0, -1,  0, $00, PAL_OW_BLUE | BEHIND_BG
+	dsprite -1,  0,  0,  0, $01, PAL_OW_BLUE | BEHIND_BG
+	dsprite  0,  0, -1,  0, $02, PAL_OW_BLUE | BEHIND_BG
+	dsprite  0,  0,  0,  0, $03, PAL_OW_BLUE | BEHIND_BG
+
+.OAMData_ForMobile22:
+	db 1
+	dsprite -1,  4, -1,  4, $00, 2
+
+.OAMData_ForMobile23:
+	db 4
+	dsprite -2,  0, -1,  4, $00, 3
+	dsprite -1,  0, -1,  4, $01, 3
+	dsprite  0,  0, -1,  4, $02, 3
+	dsprite  1,  0, -1,  4, $03, 3
+
+.OAMData_ForMobile24:
+	db 4
+	dsprite -2,  0, -1,  4, $03, 4 | Y_FLIP
+	dsprite -1,  0, -1,  4, $02, 4 | Y_FLIP
+	dsprite  0,  0, -1,  4, $01, 4 | Y_FLIP
+	dsprite  1,  0, -1,  4, $00, 4 | Y_FLIP
+
+.OAMData_ForMobile25_1:
+	db 4
+	dsprite -1,  0, -1,  0, $00, 1
+	dsprite -1,  0,  0,  0, $00, 1 | X_FLIP
+	dsprite  0,  0, -1,  0, $00, 1 | Y_FLIP
+	dsprite  0,  0,  0,  0, $00, 1 | X_FLIP | Y_FLIP
+
+.OAMData_ForMobile25_2:
+	db 8
+	dsprite -2,  4, -2,  4, $00, 1
+	dsprite -2,  4, -1,  4, $01, 1
+	dsprite -2,  4,  0,  4, $00, 1 | X_FLIP
+	dsprite -1,  4, -2,  4, $02, 1
+	dsprite -1,  4,  0,  4, $02, 1 | X_FLIP
+	dsprite  0,  4, -2,  4, $00, 1 | Y_FLIP
+	dsprite  0,  4, -1,  4, $01, 1 | Y_FLIP
+	dsprite  0,  4,  0,  4, $00, 1 | X_FLIP | Y_FLIP
+
+.OAMData_ForMobile25_3:
+	db 12
+	dsprite -2,  0, -2,  0, $00, 1
+	dsprite -2,  0, -1,  0, $01, 1
+	dsprite -1,  0, -2,  0, $02, 1
+	dsprite -2,  0,  0,  0, $01, 1 | X_FLIP
+	dsprite -2,  0,  1,  0, $00, 1 | X_FLIP
+	dsprite -1,  0,  1,  0, $02, 1 | X_FLIP
+	dsprite  0,  0, -2,  0, $02, 1 | Y_FLIP
+	dsprite  1,  0, -2,  0, $00, 1 | Y_FLIP
+	dsprite  1,  0, -1,  0, $01, 1 | Y_FLIP
+	dsprite  0,  0,  1,  0, $02, 1 | X_FLIP | Y_FLIP
+	dsprite  1,  0,  0,  0, $01, 1 | X_FLIP | Y_FLIP
+	dsprite  1,  0,  1,  0, $00, 1 | X_FLIP | Y_FLIP
+
+.OAMData_IntroSuicune1:
+	db 36
+	dsprite -3,  0,  1,  0, $05, 0
+	dsprite -3,  0,  2,  0, $06, 0
+	dsprite -3,  0,  3,  0, $07, 0
+	dsprite -2,  0, -3,  0, $11, 0
+	dsprite -2,  0, -2,  0, $12, 0
+	dsprite -2,  0, -1,  0, $13, 0
+	dsprite -2,  0,  0,  0, $14, 0
+	dsprite -2,  0,  1,  0, $15, 0
+	dsprite -2,  0,  2,  0, $16, 0
+	dsprite -2,  0,  3,  0, $17, 0
+	dsprite -1,  0, -4,  0, $20, 0
+	dsprite -1,  0, -3,  0, $21, 0
+	dsprite -1,  0, -2,  0, $22, 0
+	dsprite -1,  0, -1,  0, $23, 0
+	dsprite -1,  0,  0,  0, $24, 0
+	dsprite -1,  0,  1,  0, $25, 0
+	dsprite -1,  0,  2,  0, $26, 0
+	dsprite -1,  0,  3,  0, $27, 0
+	dsprite  0,  0, -4,  0, $30, 0
+	dsprite  0,  0, -3,  0, $31, 0
+	dsprite  0,  0, -2,  0, $32, 0
+	dsprite  0,  0, -1,  0, $33, 0
+	dsprite  0,  0,  0,  0, $34, 0
+	dsprite  0,  0,  1,  0, $35, 0
+	dsprite  0,  0,  2,  0, $36, 0
+	dsprite  1,  0, -4,  0, $40, 0
+	dsprite  1,  0, -3,  0, $41, 0
+	dsprite  1,  0, -2,  0, $42, 0
+	dsprite  1,  0, -1,  0, $43, 0
+	dsprite  1,  0,  0,  0, $44, 0
+	dsprite  1,  0,  1,  0, $45, 0
+	dsprite  1,  0,  2,  0, $46, 0
+	dsprite  1,  0,  3,  0, $47, 0
+	dsprite  2,  0, -4,  0, $50, 0
+	dsprite  2,  0, -3,  0, $51, 0
+	dsprite  2,  0,  3,  0, $57, 0
+
+.OAMData_IntroSuicune2:
+	db 28
+	dsprite -3,  0,  0,  0, $04, 0
+	dsprite -3,  0,  1,  0, $05, 0
+	dsprite -3,  0,  2,  0, $06, 0
+	dsprite -2,  0, -3,  0, $11, 0
+	dsprite -2,  0, -2,  0, $12, 0
+	dsprite -2,  0, -1,  0, $13, 0
+	dsprite -2,  0,  0,  0, $14, 0
+	dsprite -2,  0,  1,  0, $15, 0
+	dsprite -2,  0,  2,  0, $16, 0
+	dsprite -1,  0, -3,  0, $21, 0
+	dsprite -1,  0, -2,  0, $22, 0
+	dsprite -1,  0, -1,  0, $23, 0
+	dsprite -1,  0,  0,  0, $24, 0
+	dsprite -1,  0,  1,  0, $25, 0
+	dsprite -1,  0,  2,  0, $26, 0
+	dsprite  0,  0, -4,  0, $30, 0
+	dsprite  0,  0, -3,  0, $31, 0
+	dsprite  0,  0, -2,  0, $32, 0
+	dsprite  0,  0, -1,  0, $33, 0
+	dsprite  0,  0,  0,  0, $34, 0
+	dsprite  0,  0,  1,  0, $35, 0
+	dsprite  1,  0, -2,  0, $42, 0
+	dsprite  1,  0, -1,  0, $43, 0
+	dsprite  1,  0,  0,  0, $44, 0
+	dsprite  1,  0,  1,  0, $45, 0
+	dsprite  2,  0, -1,  0, $53, 0
+	dsprite  2,  0,  0,  0, $54, 0
+	dsprite  2,  0,  1,  0, $55, 0
+
+.OAMData_IntroSuicune3:
+	db 30
+	dsprite -3,  0,  0,  0, $04, 0
+	dsprite -3,  0,  1,  0, $05, 0
+	dsprite -2,  0, -3,  0, $11, 0
+	dsprite -2,  0, -2,  0, $12, 0
+	dsprite -2,  0, -1,  0, $13, 0
+	dsprite -2,  0,  0,  0, $14, 0
+	dsprite -2,  0,  1,  0, $15, 0
+	dsprite -2,  0,  2,  0, $16, 0
+	dsprite -2,  0,  3,  0, $17, 0
+	dsprite -1,  0, -4,  0, $20, 0
+	dsprite -1,  0, -3,  0, $21, 0
+	dsprite -1,  0, -2,  0, $22, 0
+	dsprite -1,  0, -1,  0, $23, 0
+	dsprite -1,  0,  0,  0, $24, 0
+	dsprite -1,  0,  1,  0, $25, 0
+	dsprite -1,  0,  2,  0, $26, 0
+	dsprite  0,  0, -4,  0, $30, 0
+	dsprite  0,  0, -3,  0, $31, 0
+	dsprite  0,  0, -2,  0, $32, 0
+	dsprite  0,  0, -1,  0, $33, 0
+	dsprite  0,  0,  0,  0, $34, 0
+	dsprite  0,  0,  1,  0, $35, 0
+	dsprite  1,  0, -2,  0, $42, 0
+	dsprite  1,  0, -1,  0, $43, 0
+	dsprite  1,  0,  0,  0, $44, 0
+	dsprite  1,  0,  1,  0, $45, 0
+	dsprite  2,  0, -2,  0, $52, 0
+	dsprite  2,  0, -1,  0, $53, 0
+	dsprite  2,  0,  0,  0, $54, 0
+	dsprite  2,  0,  1,  0, $55, 0
+
+.OAMData_IntroSuicune4:
+	db 31
+	dsprite -2,  0, -3,  0, $11, 0
+	dsprite -2,  0, -2,  0, $12, 0
+	dsprite -2,  0, -1,  0, $13, 0
+	dsprite -2,  0,  0,  0, $14, 0
+	dsprite -2,  0,  1,  0, $15, 0
+	dsprite -2,  0,  2,  0, $16, 0
+	dsprite -2,  0,  3,  0, $17, 0
+	dsprite -1,  0, -4,  0, $20, 0
+	dsprite -1,  0, -3,  0, $21, 0
+	dsprite -1,  0, -2,  0, $22, 0
+	dsprite -1,  0, -1,  0, $23, 0
+	dsprite -1,  0,  0,  0, $24, 0
+	dsprite -1,  0,  1,  0, $25, 0
+	dsprite -1,  0,  2,  0, $26, 0
+	dsprite -1,  0,  3,  0, $27, 0
+	dsprite  0,  0, -4,  0, $30, 0
+	dsprite  0,  0, -3,  0, $31, 0
+	dsprite  0,  0, -2,  0, $32, 0
+	dsprite  0,  0, -1,  0, $33, 0
+	dsprite  0,  0,  0,  0, $34, 0
+	dsprite  0,  0,  1,  0, $35, 0
+	dsprite  0,  0,  2,  0, $36, 0
+	dsprite  1,  0, -3,  0, $41, 0
+	dsprite  1,  0, -2,  0, $42, 0
+	dsprite  1,  0, -1,  0, $43, 0
+	dsprite  1,  0,  0,  0, $44, 0
+	dsprite  1,  0,  1,  0, $45, 0
+	dsprite  2,  0, -3,  0, $51, 0
+	dsprite  2,  0, -2,  0, $52, 0
+	dsprite  2,  0,  0,  0, $54, 0
+	dsprite  2,  0,  1,  0, $55, 0
+
+.OAMData_IntroPichu:
+	db 25
+	dsprite -3,  4, -3,  4, $00, 1 | VRAM_BANK_1
+	dsprite -3,  4, -2,  4, $01, 1 | VRAM_BANK_1
+	dsprite -3,  4, -1,  4, $02, 1 | VRAM_BANK_1
+	dsprite -3,  4,  0,  4, $03, 1 | VRAM_BANK_1
+	dsprite -3,  4,  1,  4, $04, 1 | VRAM_BANK_1
+	dsprite -2,  4, -3,  4, $10, 1 | VRAM_BANK_1
+	dsprite -2,  4, -2,  4, $11, 1 | VRAM_BANK_1
+	dsprite -2,  4, -1,  4, $12, 1 | VRAM_BANK_1
+	dsprite -2,  4,  0,  4, $13, 1 | VRAM_BANK_1
+	dsprite -2,  4,  1,  4, $14, 1 | VRAM_BANK_1
+	dsprite -1,  4, -3,  4, $20, 1 | VRAM_BANK_1
+	dsprite -1,  4, -2,  4, $21, 1 | VRAM_BANK_1
+	dsprite -1,  4, -1,  4, $22, 1 | VRAM_BANK_1
+	dsprite -1,  4,  0,  4, $23, 1 | VRAM_BANK_1
+	dsprite -1,  4,  1,  4, $24, 1 | VRAM_BANK_1
+	dsprite  0,  4, -3,  4, $30, 1 | VRAM_BANK_1
+	dsprite  0,  4, -2,  4, $31, 1 | VRAM_BANK_1
+	dsprite  0,  4, -1,  4, $32, 1 | VRAM_BANK_1
+	dsprite  0,  4,  0,  4, $33, 1 | VRAM_BANK_1
+	dsprite  0,  4,  1,  4, $34, 1 | VRAM_BANK_1
+	dsprite  1,  4, -3,  4, $40, 1 | VRAM_BANK_1
+	dsprite  1,  4, -2,  4, $41, 1 | VRAM_BANK_1
+	dsprite  1,  4, -1,  4, $42, 1 | VRAM_BANK_1
+	dsprite  1,  4,  0,  4, $43, 1 | VRAM_BANK_1
+	dsprite  1,  4,  1,  4, $44, 1 | VRAM_BANK_1
+
+.OAMData_IntroWooper:
+	db 16
+	dsprite -2,  0, -3,  4, $00, 2 | VRAM_BANK_1
+	dsprite -2,  0, -2,  4, $01, 2 | VRAM_BANK_1
+	dsprite -2,  0, -1,  4, $02, 2 | VRAM_BANK_1
+	dsprite -2,  0,  0,  4, $03, 2 | VRAM_BANK_1
+	dsprite -1,  0, -3,  4, $04, 2 | VRAM_BANK_1
+	dsprite -1,  0, -2,  4, $05, 2 | VRAM_BANK_1
+	dsprite -1,  0, -1,  4, $06, 2 | VRAM_BANK_1
+	dsprite -1,  0,  0,  4, $07, 2 | VRAM_BANK_1
+	dsprite  0,  0, -3,  4, $08, 2 | VRAM_BANK_1
+	dsprite  0,  0, -2,  4, $09, 2 | VRAM_BANK_1
+	dsprite  0,  0, -1,  4, $0a, 2 | VRAM_BANK_1
+	dsprite  0,  0,  0,  4, $0b, 2 | VRAM_BANK_1
+	dsprite  1,  0, -3,  4, $0c, 2 | VRAM_BANK_1
+	dsprite  1,  0, -2,  4, $0d, 2 | VRAM_BANK_1
+	dsprite  1,  0, -1,  4, $0e, 2 | VRAM_BANK_1
+	dsprite  1,  0,  0,  4, $0f, 2 | VRAM_BANK_1
+
+.OAMData_IntroUnown1:
+	db 1
+	dsprite -1,  4, -1,  4, $00, $00
+
+.OAMData_IntroUnown2:
+	db 3
+	dsprite  0,  0, -1,  0, $00, $00
+	dsprite -1,  0, -1,  0, $01, $00
+	dsprite -1,  0,  0,  0, $02, $00
+
+.OAMData_IntroUnown3:
+	db 7
+	dsprite  1,  0, -2,  0, $00, $00
+	dsprite  0,  0, -2,  0, $01, $00
+	dsprite -1,  0, -2,  0, $02, $00
+	dsprite -1,  0, -1,  0, $03, $00
+	dsprite -2,  0, -1,  0, $04, $00
+	dsprite -2,  0,  0,  0, $05, $00
+	dsprite -2,  0,  1,  0, $06, $00
+
+.OAMData_IntroUnownF2_2:
+	db 8
+	dsprite -1,  0, -2,  0, $00, 0
+	dsprite -1,  0, -1,  0, $01, 0
+	dsprite -1,  0,  0,  0, $01, 0 | X_FLIP
+	dsprite -1,  0,  1,  0, $00, 0 | X_FLIP
+	dsprite  0,  0, -2,  0, $00, 0 | Y_FLIP
+	dsprite  0,  0, -1,  0, $01, 0 | Y_FLIP
+	dsprite  0,  0,  0,  0, $01, 0 | X_FLIP | Y_FLIP
+	dsprite  0,  0,  1,  0, $00, 0 | X_FLIP | Y_FLIP
+
+.OAMData_IntroUnownF2_3:
+	db 12
+	dsprite -3,  0, -1,  0, $00, 0
+	dsprite -2,  0, -1,  0, $01, 0
+	dsprite -1,  0, -1,  0, $02, 0
+	dsprite -3,  0,  0,  0, $00, 0 | X_FLIP
+	dsprite -2,  0,  0,  0, $01, 0 | X_FLIP
+	dsprite -1,  0,  0,  0, $02, 0 | X_FLIP
+	dsprite  0,  0, -1,  0, $02, 0 | Y_FLIP
+	dsprite  1,  0, -1,  0, $01, 0 | Y_FLIP
+	dsprite  2,  0, -1,  0, $00, 0 | Y_FLIP
+	dsprite  0,  0,  0,  0, $02, 0 | X_FLIP | Y_FLIP
+	dsprite  1,  0,  0,  0, $01, 0 | X_FLIP | Y_FLIP
+	dsprite  2,  0,  0,  0, $00, 0 | X_FLIP | Y_FLIP
+
+.OAMData_IntroUnownF2_4_5:
+	db 20
+	dsprite -3,  4, -2,  0, $00, 0
+	dsprite -3,  4, -1,  0, $01, 0
+	dsprite -3,  4,  0,  0, $02, 0
+	dsprite -3,  4,  1,  0, $03, 0
+	dsprite -2,  4, -2,  0, $04, 0
+	dsprite -2,  4, -1,  0, $05, 0
+	dsprite -2,  4,  0,  0, $06, 0
+	dsprite -2,  4,  1,  0, $07, 0
+	dsprite -1,  4, -2,  0, $08, 0
+	dsprite -1,  4, -1,  0, $09, 0
+	dsprite -1,  4,  0,  0, $0a, 0
+	dsprite -1,  4,  1,  0, $0b, 0
+	dsprite  0,  4, -2,  0, $0c, 0
+	dsprite  0,  4, -1,  0, $0d, 0
+	dsprite  0,  4,  0,  0, $0e, 0
+	dsprite  0,  4,  1,  0, $0f, 0
+	dsprite  1,  4, -2,  0, $10, 0
+	dsprite  1,  4, -1,  0, $11, 0
+	dsprite  1,  4,  0,  0, $12, 0
+	dsprite  1,  4,  1,  0, $13, 0
+
+.OAMData_IntroSuicuneAway:
+	db 20
+	dsprite  0,  0,   1,  0, $00, 1 | BEHIND_BG
+	dsprite  1,  0,   2,  0, $00, 1 | BEHIND_BG
+	dsprite  2,  0,   3,  0, $00, 1 | BEHIND_BG
+	dsprite  3,  0,   4,  0, $00, 1 | BEHIND_BG
+	dsprite  4,  0,   5,  0, $00, 1 | BEHIND_BG
+	dsprite  3,  0,   6,  0, $00, 1 | BEHIND_BG
+	dsprite  2,  0,   7,  0, $00, 1 | BEHIND_BG
+	dsprite  1,  0,   8,  0, $00, 1 | BEHIND_BG
+	dsprite  0,  0,   9,  0, $00, 1 | BEHIND_BG
+	dsprite  1,  0,  10,  0, $00, 1 | BEHIND_BG
+	dsprite  2,  0,  11,  0, $00, 1 | BEHIND_BG
+	dsprite  3,  0,  12,  0, $00, 1 | BEHIND_BG
+	dsprite  4,  0,  13,  0, $00, 1 | BEHIND_BG
+	dsprite  3,  0,  14,  0, $00, 1 | BEHIND_BG
+	dsprite  2,  0,  15,  0, $00, 1 | BEHIND_BG
+	dsprite  1,  0,  16,  0, $00, 1 | BEHIND_BG
+	dsprite  0,  0, -15,  0, $00, 1 | BEHIND_BG
+	dsprite  1,  0, -14,  0, $00, 1 | BEHIND_BG
+	dsprite  2,  0, -13,  0, $00, 1 | BEHIND_BG
+	dsprite  3,  0, -12,  0, $00, 1 | BEHIND_BG
+
+.OAMData_Celebi:
+	db 4
+	dsprite -1,  0, -1,  0, $00, PAL_OW_GREEN
+	dsprite -1,  0,  0,  0, $01, PAL_OW_GREEN
+	dsprite  0,  0, -1,  0, $02, PAL_OW_GREEN
+	dsprite  0,  0,  0,  0, $03, PAL_OW_GREEN
+
+.OAMData_GameFreakLogo1_3:
+	db 9
+	dsprite -2,  0, -2,  4, $00, 1
+	dsprite -2,  0, -1,  4, $01, 1
+	dsprite -2,  0,  0,  4, $02, 1
+	dsprite -1,  0, -2,  4, $10, 1
+	dsprite -1,  0, -1,  4, $11, 1
+	dsprite -1,  0,  0,  4, $12, 1
+	dsprite  0,  0, -2,  4, $20, 1
+	dsprite  0,  0, -1,  4, $21, 1
+	dsprite  0,  0,  0,  4, $22, 1
+
+.OAMData_GameFreakLogo4_11:
+	db 24
+	dsprite -5,  0, -2,  4, $00, 1
+	dsprite -5,  0, -1,  4, $01, 1
+	dsprite -5,  0,  0,  4, $02, 1
+	dsprite -5,  0,  1,  4, $03, 1
+	dsprite -4,  0, -2,  4, $10, 1
+	dsprite -4,  0, -1,  4, $11, 1
+	dsprite -4,  0,  0,  4, $12, 1
+	dsprite -4,  0,  1,  4, $13, 1
+	dsprite -3,  0, -2,  4, $20, 1
+	dsprite -3,  0, -1,  4, $21, 1
+	dsprite -3,  0,  0,  4, $22, 1
+	dsprite -3,  0,  1,  4, $23, 1
+	dsprite -2,  0, -2,  4, $30, 1
+	dsprite -2,  0, -1,  4, $31, 1
+	dsprite -2,  0,  0,  4, $32, 1
+	dsprite -2,  0,  1,  4, $33, 1
+	dsprite -1,  0, -2,  4, $40, 1
+	dsprite -1,  0, -1,  4, $41, 1
+	dsprite -1,  0,  0,  4, $42, 1
+	dsprite -1,  0,  1,  4, $43, 1
+	dsprite  0,  0, -2,  4, $50, 1
+	dsprite  0,  0, -1,  4, $51, 1
+	dsprite  0,  0,  0,  4, $52, 1
+	dsprite  0,  0,  1,  4, $53, 1
+; 8e706
--- /dev/null
+++ b/data/sprites/sequences.asm
@@ -1,0 +1,49 @@
+SpriteAnimSeqData: ; 8d1c4
+; 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_TITLE_TRAIL,          SPRITE_ANIM_SEQ_GS_TITLE_TRAIL,       $00 ; SPRITE_ANIM_INDEX_GS_TITLE_TRAIL
+	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,       $00 ; 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_FOR_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_24,                      SPRITE_ANIM_SEQ_19,                   $00 ; SPRITE_ANIM_INDEX_1A
+	db SPRITE_ANIM_FRAMESET_HEADBUTT,                SPRITE_ANIM_SEQ_NULL,                 $00 ; SPRITE_ANIM_INDEX_HEADBUTT
+	db SPRITE_ANIM_FRAMESET_EGG_HATCH,               SPRITE_ANIM_SEQ_REVEAL_NEW_MON,       $00 ; SPRITE_ANIM_INDEX_EGG_HATCH
+	db SPRITE_ANIM_FRAMESET_26,                      SPRITE_ANIM_SEQ_1A,                   $00 ; SPRITE_ANIM_INDEX_1D
+	db SPRITE_ANIM_FRAMESET_BLUE_WALK,               SPRITE_ANIM_SEQ_NULL,                 $00 ; SPRITE_ANIM_INDEX_BLUE_WALK
+	db SPRITE_ANIM_FRAMESET_MAGNET_TRAIN_BLUE,       SPRITE_ANIM_SEQ_NULL,                 $00 ; SPRITE_ANIM_INDEX_MAGNET_TRAIN_BLUE
+	db SPRITE_ANIM_FRAMESET_MOBILE_TRADE_SENT_BALL,  SPRITE_ANIM_SEQ_NULL,                 $00 ; SPRITE_ANIM_INDEX_MOBILE_TRADE_SENT_BALL
+	db SPRITE_ANIM_FRAMESET_MOBILE_TRADE_OT_BALL,    SPRITE_ANIM_SEQ_NULL,                 $00 ; SPRITE_ANIM_INDEX_MOBILE_TRADE_OT_BALL
+	db SPRITE_ANIM_FRAMESET_FOR_MOBILE_22,           SPRITE_ANIM_SEQ_NULL,                 $00 ; SPRITE_ANIM_INDEX_MOBILE_22
+	db SPRITE_ANIM_FRAMESET_FOR_MOBILE_23,           SPRITE_ANIM_SEQ_FOR_MOBILE_23,        $00 ; SPRITE_ANIM_INDEX_MOBILE_23
+	db SPRITE_ANIM_FRAMESET_FOR_MOBILE_24,           SPRITE_ANIM_SEQ_FOR_MOBILE_24,        $00 ; SPRITE_ANIM_INDEX_MOBILE_24
+	db SPRITE_ANIM_FRAMESET_FOR_MOBILE_25,           SPRITE_ANIM_SEQ_NULL,                 $00 ; SPRITE_ANIM_INDEX_MOBILE_25
+	db SPRITE_ANIM_FRAMESET_INTRO_SUICUNE,           SPRITE_ANIM_SEQ_INTRO_SUICUNE,        $00 ; SPRITE_ANIM_INDEX_INTRO_SUICUNE
+	db SPRITE_ANIM_FRAMESET_INTRO_PICHU,             SPRITE_ANIM_SEQ_INTRO_PICHU_WOOPER,   $00 ; SPRITE_ANIM_INDEX_INTRO_PICHU
+	db SPRITE_ANIM_FRAMESET_INTRO_WOOPER,            SPRITE_ANIM_SEQ_INTRO_PICHU_WOOPER,   $00 ; SPRITE_ANIM_INDEX_INTRO_WOOPER
+	db SPRITE_ANIM_FRAMESET_INTRO_UNOWN_1,           SPRITE_ANIM_SEQ_INTRO_UNOWN,          $00 ; SPRITE_ANIM_INDEX_INTRO_UNOWN
+	db SPRITE_ANIM_FRAMESET_INTRO_UNOWN_F,           SPRITE_ANIM_SEQ_INTRO_UNOWN_F,        $00 ; SPRITE_ANIM_INDEX_INTRO_UNOWN_F
+	db SPRITE_ANIM_FRAMESET_INTRO_SUICUNE_AWAY,      SPRITE_ANIM_SEQ_INTRO_SUICUNE_AWAY,   $00 ; SPRITE_ANIM_INDEX_INTRO_SUICUNE_AWAY
+	db SPRITE_ANIM_FRAMESET_CELEBI_LEFT,             SPRITE_ANIM_SEQ_NULL,                 $00 ; SPRITE_ANIM_INDEX_CELEBI
+; 8d24b
--- a/data/tmhm_moves.asm
+++ /dev/null
@@ -1,69 +1,0 @@
-TMHMMoves: ; 1167a
-; TMs
-	db DYNAMICPUNCH
-	db HEADBUTT
-	db CURSE
-	db ROLLOUT
-	db ROAR
-	db TOXIC
-	db ZAP_CANNON
-	db ROCK_SMASH
-	db PSYCH_UP
-	db HIDDEN_POWER
-	db SUNNY_DAY
-	db SWEET_SCENT
-	db SNORE
-	db BLIZZARD
-	db HYPER_BEAM
-	db ICY_WIND
-	db PROTECT
-	db RAIN_DANCE
-	db GIGA_DRAIN
-	db ENDURE
-	db FRUSTRATION
-	db SOLARBEAM
-	db IRON_TAIL
-	db DRAGONBREATH
-	db THUNDER
-	db EARTHQUAKE
-	db RETURN
-	db DIG
-	db PSYCHIC_M
-	db SHADOW_BALL
-	db MUD_SLAP
-	db DOUBLE_TEAM
-	db ICE_PUNCH
-	db SWAGGER
-	db SLEEP_TALK
-	db SLUDGE_BOMB
-	db SANDSTORM
-	db FIRE_BLAST
-	db SWIFT
-	db DEFENSE_CURL
-	db THUNDERPUNCH
-	db DREAM_EATER
-	db DETECT
-	db REST
-	db ATTRACT
-	db THIEF
-	db STEEL_WING
-	db FIRE_PUNCH
-	db FURY_CUTTER
-	db NIGHTMARE
-
-; HMs
-	db CUT
-	db FLY
-	db SURF
-	db STRENGTH
-	db FLASH
-	db WHIRLPOOL
-	db WATERFALL
-
-; Move tutor
-	db FLAMETHROWER
-	db THUNDERBOLT
-	db ICE_BEAM
-
-	db 0 ; end
-; 116b7
--- /dev/null
+++ b/data/type_matchups.asm
@@ -1,0 +1,125 @@
+; The multiplier is divided by 10, so we can use values like 0.5.
+; All other cases are neutral (1x).
+SUPER_EFFECTIVE    EQU 20
+NOT_VERY_EFFECTIVE EQU 05
+NO_EFFECT          EQU 00
+
+TypeMatchups: ; 34bb1
+	;  attacker  defender*=
+	db NORMAL,    ROCK,      NOT_VERY_EFFECTIVE
+	db NORMAL,    STEEL,     NOT_VERY_EFFECTIVE
+	db FIRE,      FIRE,      NOT_VERY_EFFECTIVE
+	db FIRE,      WATER,     NOT_VERY_EFFECTIVE
+	db FIRE,      GRASS,     SUPER_EFFECTIVE
+	db FIRE,      ICE,       SUPER_EFFECTIVE
+	db FIRE,      BUG,       SUPER_EFFECTIVE
+	db FIRE,      ROCK,      NOT_VERY_EFFECTIVE
+	db FIRE,      DRAGON,    NOT_VERY_EFFECTIVE
+	db FIRE,      STEEL,     SUPER_EFFECTIVE
+	db WATER,     FIRE,      SUPER_EFFECTIVE
+	db WATER,     WATER,     NOT_VERY_EFFECTIVE
+	db WATER,     GRASS,     NOT_VERY_EFFECTIVE
+	db WATER,     GROUND,    SUPER_EFFECTIVE
+	db WATER,     ROCK,      SUPER_EFFECTIVE
+	db WATER,     DRAGON,    NOT_VERY_EFFECTIVE
+	db ELECTRIC,  WATER,     SUPER_EFFECTIVE
+	db ELECTRIC,  ELECTRIC,  NOT_VERY_EFFECTIVE
+	db ELECTRIC,  GRASS,     NOT_VERY_EFFECTIVE
+	db ELECTRIC,  GROUND,    NO_EFFECT
+	db ELECTRIC,  FLYING,    SUPER_EFFECTIVE
+	db ELECTRIC,  DRAGON,    NOT_VERY_EFFECTIVE
+	db GRASS,     FIRE,      NOT_VERY_EFFECTIVE
+	db GRASS,     WATER,     SUPER_EFFECTIVE
+	db GRASS,     GRASS,     NOT_VERY_EFFECTIVE
+	db GRASS,     POISON,    NOT_VERY_EFFECTIVE
+	db GRASS,     GROUND,    SUPER_EFFECTIVE
+	db GRASS,     FLYING,    NOT_VERY_EFFECTIVE
+	db GRASS,     BUG,       NOT_VERY_EFFECTIVE
+	db GRASS,     ROCK,      SUPER_EFFECTIVE
+	db GRASS,     DRAGON,    NOT_VERY_EFFECTIVE
+	db GRASS,     STEEL,     NOT_VERY_EFFECTIVE
+	db ICE,       WATER,     NOT_VERY_EFFECTIVE
+	db ICE,       GRASS,     SUPER_EFFECTIVE
+	db ICE,       ICE,       NOT_VERY_EFFECTIVE
+	db ICE,       GROUND,    SUPER_EFFECTIVE
+	db ICE,       FLYING,    SUPER_EFFECTIVE
+	db ICE,       DRAGON,    SUPER_EFFECTIVE
+	db ICE,       STEEL,     NOT_VERY_EFFECTIVE
+	db ICE,       FIRE,      NOT_VERY_EFFECTIVE
+	db FIGHTING,  NORMAL,    SUPER_EFFECTIVE
+	db FIGHTING,  ICE,       SUPER_EFFECTIVE
+	db FIGHTING,  POISON,    NOT_VERY_EFFECTIVE
+	db FIGHTING,  FLYING,    NOT_VERY_EFFECTIVE
+	db FIGHTING,  PSYCHIC,   NOT_VERY_EFFECTIVE
+	db FIGHTING,  BUG,       NOT_VERY_EFFECTIVE
+	db FIGHTING,  ROCK,      SUPER_EFFECTIVE
+	db FIGHTING,  DARK,      SUPER_EFFECTIVE
+	db FIGHTING,  STEEL,     SUPER_EFFECTIVE
+	db POISON,    GRASS,     SUPER_EFFECTIVE
+	db POISON,    POISON,    NOT_VERY_EFFECTIVE
+	db POISON,    GROUND,    NOT_VERY_EFFECTIVE
+	db POISON,    ROCK,      NOT_VERY_EFFECTIVE
+	db POISON,    GHOST,     NOT_VERY_EFFECTIVE
+	db POISON,    STEEL,     NO_EFFECT
+	db GROUND,    FIRE,      SUPER_EFFECTIVE
+	db GROUND,    ELECTRIC,  SUPER_EFFECTIVE
+	db GROUND,    GRASS,     NOT_VERY_EFFECTIVE
+	db GROUND,    POISON,    SUPER_EFFECTIVE
+	db GROUND,    FLYING,    NO_EFFECT
+	db GROUND,    BUG,       NOT_VERY_EFFECTIVE
+	db GROUND,    ROCK,      SUPER_EFFECTIVE
+	db GROUND,    STEEL,     SUPER_EFFECTIVE
+	db FLYING,    ELECTRIC,  NOT_VERY_EFFECTIVE
+	db FLYING,    GRASS,     SUPER_EFFECTIVE
+	db FLYING,    FIGHTING,  SUPER_EFFECTIVE
+	db FLYING,    BUG,       SUPER_EFFECTIVE
+	db FLYING,    ROCK,      NOT_VERY_EFFECTIVE
+	db FLYING,    STEEL,     NOT_VERY_EFFECTIVE
+	db PSYCHIC,   FIGHTING,  SUPER_EFFECTIVE
+	db PSYCHIC,   POISON,    SUPER_EFFECTIVE
+	db PSYCHIC,   PSYCHIC,   NOT_VERY_EFFECTIVE
+	db PSYCHIC,   DARK,      NO_EFFECT
+	db PSYCHIC,   STEEL,     NOT_VERY_EFFECTIVE
+	db BUG,       FIRE,      NOT_VERY_EFFECTIVE
+	db BUG,       GRASS,     SUPER_EFFECTIVE
+	db BUG,       FIGHTING,  NOT_VERY_EFFECTIVE
+	db BUG,       POISON,    NOT_VERY_EFFECTIVE
+	db BUG,       FLYING,    NOT_VERY_EFFECTIVE
+	db BUG,       PSYCHIC,   SUPER_EFFECTIVE
+	db BUG,       GHOST,     NOT_VERY_EFFECTIVE
+	db BUG,       DARK,      SUPER_EFFECTIVE
+	db BUG,       STEEL,     NOT_VERY_EFFECTIVE
+	db ROCK,      FIRE,      SUPER_EFFECTIVE
+	db ROCK,      ICE,       SUPER_EFFECTIVE
+	db ROCK,      FIGHTING,  NOT_VERY_EFFECTIVE
+	db ROCK,      GROUND,    NOT_VERY_EFFECTIVE
+	db ROCK,      FLYING,    SUPER_EFFECTIVE
+	db ROCK,      BUG,       SUPER_EFFECTIVE
+	db ROCK,      STEEL,     NOT_VERY_EFFECTIVE
+	db GHOST,     NORMAL,    NO_EFFECT
+	db GHOST,     PSYCHIC,   SUPER_EFFECTIVE
+	db GHOST,     DARK,      NOT_VERY_EFFECTIVE
+	db GHOST,     STEEL,     NOT_VERY_EFFECTIVE
+	db GHOST,     GHOST,     SUPER_EFFECTIVE
+	db DRAGON,    DRAGON,    SUPER_EFFECTIVE
+	db DRAGON,    STEEL,     NOT_VERY_EFFECTIVE
+	db DARK,      FIGHTING,  NOT_VERY_EFFECTIVE
+	db DARK,      PSYCHIC,   SUPER_EFFECTIVE
+	db DARK,      GHOST,     SUPER_EFFECTIVE
+	db DARK,      DARK,      NOT_VERY_EFFECTIVE
+	db DARK,      STEEL,     NOT_VERY_EFFECTIVE
+	db STEEL,     FIRE,      NOT_VERY_EFFECTIVE
+	db STEEL,     WATER,     NOT_VERY_EFFECTIVE
+	db STEEL,     ELECTRIC,  NOT_VERY_EFFECTIVE
+	db STEEL,     ICE,       SUPER_EFFECTIVE
+	db STEEL,     ROCK,      SUPER_EFFECTIVE
+	db STEEL,     STEEL,     NOT_VERY_EFFECTIVE
+
+	db $fe ; end
+
+; Foresight removes Ghost's immunities.
+	db NORMAL,    GHOST,     NO_EFFECT
+	db FIGHTING,  GHOST,     NO_EFFECT
+
+	db $ff ; end (with Foresight)
+; 34cfd
--- /dev/null
+++ b/data/type_names.asm
@@ -1,0 +1,50 @@
+TypeNames: ; 5097b
+; entries correspond to types (see constants/type_constants.asm)
+	dw Normal
+	dw Fighting
+	dw Flying
+	dw Poison
+	dw Ground
+	dw Rock
+	dw Bird
+	dw Bug
+	dw Ghost
+	dw Steel
+	dw Normal
+	dw Normal
+	dw Normal
+	dw Normal
+	dw Normal
+	dw Normal
+	dw Normal
+	dw Normal
+	dw Normal
+	dw CurseType
+	dw Fire
+	dw Water
+	dw Grass
+	dw Electric
+	dw Psychic
+	dw Ice
+	dw Dragon
+	dw Dark
+
+Normal:    db "NORMAL@"
+Fighting:  db "FIGHTING@"
+Flying:    db "FLYING@"
+Poison:    db "POISON@"
+CurseType: db "???@"
+Fire:      db "FIRE@"
+Water:     db "WATER@"
+Grass:     db "GRASS@"
+Electric:  db "ELECTRIC@"
+Psychic:   db "PSYCHIC@"
+Ice:       db "ICE@"
+Ground:    db "GROUND@"
+Rock:      db "ROCK@"
+Bird:      db "BIRD@"
+Bug:       db "BUG@"
+Ghost:     db "GHOST@"
+Steel:     db "STEEL@"
+Dragon:    db "DRAGON@"
+Dark:      db "DARK@"
--- /dev/null
+++ b/data/wild/flee_mons.asm
@@ -1,0 +1,36 @@
+FleeMons:
+; referenced by TryEnemyFlee and FastBallMultiplier
+
+SometimesFleeMons: ; 3c59a
+	db MAGNEMITE
+	db GRIMER
+	db TANGELA
+	db MR__MIME
+	db EEVEE
+	db PORYGON
+	db DRATINI
+	db DRAGONAIR
+	db TOGETIC
+	db UMBREON
+	db UNOWN
+	db SNUBBULL
+	db HERACROSS
+	db -1
+
+OftenFleeMons: ; 3c5a8
+	db CUBONE
+	db ARTICUNO
+	db ZAPDOS
+	db MOLTRES
+	db QUAGSIRE
+	db DELIBIRD
+	db PHANPY
+	db TEDDIURSA
+	db -1
+
+AlwaysFleeMons: ; 3c5b1
+	db RAIKOU
+	db ENTEI
+;	db SUICUNE
+	db -1
+; 3c5b4
--- a/docs/bugs_and_glitches.md
+++ b/docs/bugs_and_glitches.md
@@ -56,7 +56,7 @@
 
 ([Video](https://www.youtube.com/watch?v=rGqu3d3pdok&t=450))
 
-This is a bug with `SpeciesItemBoost` in [battle/effect_commands.asm](/battle/effect_commands.asm):
+This is a bug with `SpeciesItemBoost` in [engine/battle/effect_commands.asm](/engine/battle/effect_commands.asm):
 
 ```asm
 ; Double the stat
@@ -90,7 +90,7 @@
 
 ([Video](https://www.youtube.com/watch?v=rGqu3d3pdok&t=450))
 
-This is a bug with `DittoMetalPowder` in [battle/effect_commands.asm](/battle/effect_commands.asm):
+This is a bug with `DittoMetalPowder` in [engine/battle/effect_commands.asm](/engine/battle/effect_commands.asm):
 
 ```asm
 	ld a, c
@@ -146,7 +146,7 @@
 
 ([Video](https://www.youtube.com/watch?v=zuCLMikWo4Y))
 
-This is a bug with `BattleCommand_BellyDrum` in [battle/effect_commands.asm](/battle/effect_commands.asm):
+This is a bug with `BattleCommand_BellyDrum` in [engine/battle/effect_commands.asm](/engine/battle/effect_commands.asm):
 
 ```asm
 BattleCommand_BellyDrum: ; 37c1a
@@ -186,7 +186,7 @@
 
 This bug affects Acid, Iron Tail, and Rock Smash.
 
-This is a bug with `DefenseDownHit` in [battle/moves/move_effects.asm](/battle/moves/move_effects.asm):
+This is a bug with `DefenseDownHit` in [data/moves/move_effects.asm](/data/moves/move_effects.asm):
 
 ```asm
 DefenseDownHit:
@@ -227,7 +227,7 @@
 
 ([Video](https://www.youtube.com/watch?v=1v9x4SgMggs))
 
-This is a bug with `CheckPlayerHasUsableMoves` in [battle/core.asm](/battle/core.asm):
+This is a bug with `CheckPlayerHasUsableMoves` in [engine/battle/core.asm](/engine/battle/core.asm):
 
 ```asm
 .done
@@ -259,7 +259,7 @@
 
 This bug affects Attract, Curse, Foresight, Mean Look, Mimic, Nightmare, Spider Web, Transform, and stat-lowering effects of moves like String Shot or Bubble during the semi-invulnerable turn of Fly or Dig.
 
-This is a bug with `CheckHiddenOpponent` in [battle/effect_commands.asm](/battle/effect_commands.asm):
+This is a bug with `CheckHiddenOpponent` in [engine/battle/effect_commands.asm](/engine/battle/effect_commands.asm):
 
 ```asm
 CheckHiddenOpponent: ; 37daa
@@ -277,7 +277,7 @@
 
 ([Video](https://www.youtube.com/watch?v=202-iAsrIa8))
 
-This is a bug with `BattleCommand_BeatUp` in [battle/effect_commands.asm](/battle/effect_commands.asm):
+This is a bug with `BattleCommand_BeatUp` in [engine/battle/effect_commands.asm](/engine/battle/effect_commands.asm):
 
 ```asm
 .got_mon
@@ -314,7 +314,7 @@
 
 This bug existed for all battles in Gold and Silver, and was only fixed for single-player battles in Crystal to preserve link compatibility.
 
-This is a bug with `BattleCommand_Present` in [battle/effects/present.asm](/battle/effects/present.asm):
+This is a bug with `BattleCommand_Present` in [engine/battle/effect_commands/present.asm](/engine/battle/effect_commands/present.asm):
 
 ```asm
 BattleCommand_Present: ; 37874
@@ -355,7 +355,7 @@
 
 ([Video](https://www.youtube.com/watch?v=cygMO-zHTls))
 
-This is a bug with `AI_Smart_MeanLook` in [battle/ai/scoring.asm](/battle/ai/scoring.asm):
+This is a bug with `AI_Smart_MeanLook` in [engine/battle/ai/scoring.asm](/engine/battle/ai/scoring.asm):
 
 ```asm
 ; 80% chance to greatly encourage this move if the enemy is badly poisoned (buggy).
@@ -370,7 +370,7 @@
 
 ## AI makes a false assumption about `CheckTypeMatchup`
 
-In [battle/effect_commands.asm](/battle/effect_commands.asm):
+In [engine/battle/effect_commands.asm](/engine/battle/effect_commands.asm):
 
 ```asm
 BattleCheckTypeMatchup: ; 347c8
@@ -401,7 +401,7 @@
 
 ([Video](https://www.youtube.com/watch?v=rGqu3d3pdok&t=322))
 
-This is a bug with `AI_HealStatus` in [battle/ai/items.asm](/battle/ai/items.asm):
+This is a bug with `AI_HealStatus` in [engine/battle/ai/items.asm](/engine/battle/ai/items.asm):
 
 ```asm
 AI_HealStatus: ; 384e0
@@ -429,7 +429,7 @@
 
 ([Video](https://www.youtube.com/watch?v=SE-BfsFgZVM))
 
-This is a bug with `LongAnim_UpdateVariables` in [engine/anim_hp_bar.asm](/engine/anim_hp_bar.asm):
+This is a bug with `LongAnim_UpdateVariables` in [engine/battle/anim_hp_bar.asm](/engine/battle/anim_hp_bar.asm):
 
 ```asm
 	; This routine is buggy. The result from ComputeHPBarPixels is stored
@@ -727,7 +727,7 @@
 
 ## Magikarp in Lake of Rage are shorter, not longer
 
-This is a bug with `LoadEnemyMon.CheckMagikarpArea` in [battle/core.asm](/battle/core.asm):
+This is a bug with `LoadEnemyMon.CheckMagikarpArea` in [engine/battle/core.asm](/engine/battle/core.asm):
 
 ```asm
 .CheckMagikarpArea:
--- a/docs/move_anim_commands.md
+++ b/docs/move_anim_commands.md
@@ -1,6 +1,6 @@
 # Move Animation Commands
 
-Defined in [macros/scripts/move_anim.asm](/macros/scripts/move_anim.asm) and [battle/anims.asm:BattleAnimations](/battle/anims.asm).
+Defined in [macros/scripts/move_anim.asm](/macros/scripts/move_anim.asm) and [data/moves/move_anims.asm:BattleAnimations](/data/moves/move_anims.asm).
 
 
 ## `$00`−`$EF`: `anim_wait` *length*
--- a/docs/pic_animations.md
+++ b/docs/pic_animations.md
@@ -1,6 +1,6 @@
 # Pic Animations
 
-Defined in [macros/scripts/gfx_anim.asm](/macros/scripts/gfx_anim.asm) and [battle/anim_commands.asm:BattleAnimCommands](/battle/anim_commands.asm).
+Defined in [macros/scripts/gfx_anim.asm](/macros/scripts/gfx_anim.asm) and [engine/anims/anim_commands.asm:BattleAnimCommands](/engine/anims/anim_commands.asm).
 
 
 Pic animations are assembled in 3 parts:
--- a/engine/anim_hp_bar.asm
+++ /dev/null
@@ -1,435 +1,0 @@
-_AnimateHPBar: ; d627
-	call .IsMaximumMoreThan48Pixels
-	jr c, .MoreThan48Pixels
-	call .ComputePixels
-.ShortAnimLoop:
-	push bc
-	push hl
-	call ShortAnim_UpdateVariables
-	pop hl
-	pop bc
-	push af
-	push bc
-	push hl
-	call ShortHPBarAnim_UpdateTiles
-	call HPBarAnim_BGMapUpdate
-	pop hl
-	pop bc
-	pop af
-	jr nc, .ShortAnimLoop
-	ret
-
-.MoreThan48Pixels:
-	call .ComputePixels
-.LongAnimLoop:
-	push bc
-	push hl
-	call LongAnim_UpdateVariables
-	pop hl
-	pop bc
-	ret c
-	push af
-	push bc
-	push hl
-	call LongHPBarAnim_UpdateTiles
-	call HPBarAnim_BGMapUpdate
-	pop hl
-	pop bc
-	pop af
-	jr nc, .LongAnimLoop
-	ret
-; d65f
-
-.IsMaximumMoreThan48Pixels: ; d65f
-	ld a, [wCurHPAnimMaxHP + 1]
-	and a
-	jr nz, .player
-	ld a, [wCurHPAnimMaxHP]
-	cp 6 * 8
-	jr nc, .player
-	and a
-	ret
-
-.player
-	scf
-	ret
-; d670
-
-.ComputePixels: ; d670
-	push hl
-	ld hl, wCurHPAnimMaxHP
-	ld a, [hli]
-	ld e, a
-	ld a, [hli]
-	ld d, a
-	ld a, [hli]
-	ld c, a
-	ld a, [hli]
-	ld b, a
-	pop hl
-	call ComputeHPBarPixels
-	ld a, e
-	ld [wCurHPBarPixels], a
-
-	ld a, [wCurHPAnimNewHP]
-	ld c, a
-	ld a, [wCurHPAnimNewHP + 1]
-	ld b, a
-	ld a, [wCurHPAnimMaxHP]
-	ld e, a
-	ld a, [wCurHPAnimMaxHP + 1]
-	ld d, a
-	call ComputeHPBarPixels
-	ld a, e
-	ld [wNewHPBarPixels], a
-
-	push hl
-	ld hl, wCurHPAnimOldHP
-	ld a, [hli]
-	ld c, a
-	ld a, [hli]
-	ld b, a
-	ld a, [hli]
-	ld e, a
-	ld a, [hli]
-	ld d, a
-	pop hl
-	ld a, e
-	sub c
-	ld e, a
-	ld a, d
-	sbc b
-	ld d, a
-	jr c, .negative
-	ld a, [wCurHPAnimOldHP]
-	ld [wCurHPAnimLowHP], a
-	ld a, [wCurHPAnimNewHP]
-	ld [wCurHPAnimHighHP], a
-	ld bc, 1
-	jr .got_direction
-
-.negative
-	ld a, [wCurHPAnimOldHP]
-	ld [wCurHPAnimHighHP], a
-	ld a, [wCurHPAnimNewHP]
-	ld [wCurHPAnimLowHP], a
-	ld a, e
-	xor $ff
-	inc a
-	ld e, a
-	ld a, d
-	xor $ff
-	ld d, a
-	ld bc, -1
-.got_direction
-	ld a, d
-	ld [wCurHPAnimDeltaHP], a
-	ld a, e
-	ld [wCurHPAnimDeltaHP + 1], a
-	ret
-; d6e2
-
-ShortAnim_UpdateVariables: ; d6e2
-	ld hl, wCurHPBarPixels
-	ld a, [wNewHPBarPixels]
-	cp [hl]
-	jr nz, .not_finished
-	scf
-	ret
-
-.not_finished
-	ld a, c
-	add [hl]
-	ld [hl], a
-	call ShortHPBar_CalcPixelFrame
-	and a
-	ret
-; d6f5
-
-LongAnim_UpdateVariables: ; d6f5
-.loop
-	ld hl, wCurHPAnimOldHP
-	ld a, [hli]
-	ld e, a
-	ld a, [hli]
-	ld d, a
-	ld a, e
-	cp [hl]
-	jr nz, .next
-	inc hl
-	ld a, d
-	cp [hl]
-	jr nz, .next
-	scf
-	ret
-
-.next
-	ld l, e
-	ld h, d
-	add hl, bc
-	ld a, l
-	ld [wCurHPAnimOldHP], a
-	ld a, h
-	ld [wCurHPAnimOldHP + 1], a
-	push hl
-	push de
-	push bc
-	ld hl, wCurHPAnimMaxHP
-	ld a, [hli]
-	ld e, a
-	ld a, [hli]
-	ld d, a
-	ld a, [hli]
-	ld c, a
-	ld a, [hli]
-	ld b, a
-	; This routine is buggy. The result from ComputeHPBarPixels is stored
-	; in e. However, the pop de opcode deletes this result before it is even
-	; used. The game then proceeds as though it never deleted that output.
-	; To fix, uncomment the line below.
-	call ComputeHPBarPixels
-	; ld a, e
-	pop bc
-	pop de
-	pop hl
-	ld a, e ; Comment or delete this line to fix the above bug.
-	ld hl, wCurHPBarPixels
-	cp [hl]
-	jr z, .loop
-	ld [hl], a
-	and a
-	ret
-; d730
-
-ShortHPBarAnim_UpdateTiles: ; d730
-	call HPBarAnim_UpdateHPRemaining
-	ld d, $6
-	ld a, [wWhichHPBar]
-	and $1
-	ld b, a
-	ld a, [wCurHPBarPixels]
-	ld e, a
-	ld c, a
-	push de
-	call HPBarAnim_RedrawHPBar
-	pop de
-	call HPBarAnim_PaletteUpdate
-	ret
-; d749
-
-LongHPBarAnim_UpdateTiles: ; d749
-	call HPBarAnim_UpdateHPRemaining
-	ld a, [wCurHPAnimOldHP]
-	ld c, a
-	ld a, [wCurHPAnimOldHP + 1]
-	ld b, a
-	ld a, [wCurHPAnimMaxHP]
-	ld e, a
-	ld a, [wCurHPAnimMaxHP + 1]
-	ld d, a
-	call ComputeHPBarPixels
-	ld c, e
-	ld d, $6
-	ld a, [wWhichHPBar]
-	and $1
-	ld b, a
-	push de
-	call HPBarAnim_RedrawHPBar
-	pop de
-	call HPBarAnim_PaletteUpdate
-	ret
-; d771
-
-HPBarAnim_RedrawHPBar: ; d771
-	ld a, [wWhichHPBar]
-	cp $2
-	jr nz, .skip
-	ld a, 2 * SCREEN_WIDTH
-	add l
-	ld l, a
-	ld a, 0
-	adc h
-	ld h, a
-.skip
-	call DrawBattleHPBar
-	ret
-; d784
-
-HPBarAnim_UpdateHPRemaining: ; d784
-	ld a, [wWhichHPBar]
-	and a
-	ret z
-	cp $1
-	jr z, .load_15
-	ld de, SCREEN_WIDTH + 2
-	jr .loaded_de
-
-.load_15
-	ld de, SCREEN_WIDTH + 1
-.loaded_de
-	push hl
-	add hl, de
-	ld a, " "
-	ld [hli], a
-	ld [hli], a
-	ld [hld], a
-	dec hl
-	ld a, [wCurHPAnimOldHP]
-	ld [StringBuffer2 + 1], a
-	ld a, [wCurHPAnimOldHP + 1]
-	ld [StringBuffer2], a
-	ld de, StringBuffer2
-	lb bc, 2, 3
-	call PrintNum
-	pop hl
-	ret
-; d7b4
-
-HPBarAnim_PaletteUpdate: ; d7b4
-	ld a, [hCGB]
-	and a
-	ret z
-	ld hl, wCurHPAnimPal
-	call SetHPPal
-	ld a, [wCurHPAnimPal]
-	ld c, a
-	farcall ApplyHPBarPals
-	ret
-; d7c9
-
-HPBarAnim_BGMapUpdate: ; d7c9
-	ld a, [hCGB]
-	and a
-	jr nz, .cgb
-	call DelayFrame
-	call DelayFrame
-	ret
-
-.cgb
-	ld a, [wWhichHPBar]
-	and a
-	jr z, .load_0
-	cp $1
-	jr z, .load_1
-	ld a, [CurPartyMon]
-	cp $3
-	jr nc, .bottom_half_of_screen
-	ld c, $0
-	jr .got_third
-
-.bottom_half_of_screen
-	ld c, $1
-.got_third
-	push af
-	cp $2
-	jr z, .skip_delay
-	cp $5
-	jr z, .skip_delay
-	ld a, $2
-	ld [hBGMapMode], a
-	ld a, c
-	ld [hBGMapThird], a
-	call DelayFrame
-.skip_delay
-	ld a, $1
-	ld [hBGMapMode], a
-	ld a, c
-	ld [hBGMapThird], a
-	call DelayFrame
-	pop af
-	cp $2
-	jr z, .two_frames
-	cp $5
-	jr z, .two_frames
-	ret
-
-.two_frames
-	inc c
-	ld a, $2
-	ld [hBGMapMode], a
-	ld a, c
-	ld [hBGMapThird], a
-	call DelayFrame
-	ld a, $1
-	ld [hBGMapMode], a
-	ld a, c
-	ld [hBGMapThird], a
-	call DelayFrame
-	ret
-
-.load_0
-	ld c, $0
-	jr .finish
-
-.load_1
-	ld c, $1
-.finish
-	call DelayFrame
-	ld a, c
-	ld [hBGMapThird], a
-	call DelayFrame
-	ret
-; d839
-
-ShortHPBar_CalcPixelFrame: ; d839
-	ld a, [wCurHPAnimMaxHP]
-	ld c, a
-	ld b, 0
-	ld hl, 0
-	ld a, [wCurHPBarPixels]
-	cp 6 * 8
-	jr nc, .return_max
-	and a
-	jr z, .return_zero
-	call AddNTimes
-
-	ld b, 0
-; This routine is buggy. If [wCurHPAnimMaxHP] * [wCurHPBarPixels] is divisible
-; by 48, the loop runs one extra time. To fix, uncomment the line below.
-.loop
-	ld a, l
-	sub 6 * 8
-	ld l, a
-	ld a, h
-	sbc $0
-	ld h, a
-	; jr z, .done
-	jr c, .done
-	inc b
-	jr .loop
-
-.done
-	push bc
-	ld bc, $80
-	add hl, bc
-	pop bc
-	ld a, l
-	sub 6 * 8
-	ld l, a
-	ld a, h
-	sbc $0
-	ld h, a
-	jr c, .no_carry
-	inc b
-.no_carry
-	ld a, [wCurHPAnimLowHP]
-	cp b
-	jr nc, .finish
-	ld a, [wCurHPAnimHighHP]
-	cp b
-	jr c, .finish
-	ld a, b
-.finish
-	ld [wCurHPAnimOldHP], a
-	ret
-
-.return_zero
-	xor a
-	ld [wCurHPAnimOldHP], a
-	ret
-
-.return_max
-	ld a, [wCurHPAnimMaxHP]
-	ld [wCurHPAnimOldHP], a
-	ret
-; d88c
--- /dev/null
+++ b/engine/anims/anim_commands.asm
@@ -1,0 +1,1514 @@
+; Battle animation command interpreter.
+
+PlayBattleAnim: ; cc0d6
+
+	ld a, [rSVBK]
+	push af
+
+	ld a, 5
+	ld [rSVBK], a
+
+	call _PlayBattleAnim
+
+	pop af
+	ld [rSVBK], a
+	ret
+; cc0e4
+
+_PlayBattleAnim: ; cc0e4
+
+	ld c, 6
+.wait
+	call BattleAnimDelayFrame
+	dec c
+	jr nz, .wait
+
+	call BattleAnimAssignPals
+	call BattleAnimRequestPals
+	call BattleAnimDelayFrame
+
+	ld c, 1
+	ld a, [rKEY1]
+	bit 7, a
+	jr nz, .asm_cc0ff
+	ld c, 3
+
+.asm_cc0ff
+	ld hl, hVBlank
+	ld a, [hl]
+	push af
+
+	ld [hl], c
+	call BattleAnimRunScript
+
+	pop af
+	ld [hVBlank], a
+
+	ld a, $1
+	ld [hBGMapMode], a
+
+	call BattleAnimDelayFrame
+	call BattleAnimDelayFrame
+	call BattleAnimDelayFrame
+	call WaitSFX
+	ret
+; cc11c
+
+BattleAnimRunScript: ; cc11c
+
+	ld a, [FXAnimID + 1]
+	and a
+	jr nz, .hi_byte
+
+	farcall CheckBattleScene
+	jr c, .disabled
+
+	call BattleAnimClearHud
+	call RunBattleAnimScript
+
+	call BattleAnimAssignPals
+	call BattleAnimRequestPals
+
+	xor a
+	ld [hSCX], a
+	ld [hSCY], a
+	call BattleAnimDelayFrame
+	call BattleAnimRestoreHuds
+
+.disabled
+	ld a, [wNumHits]
+	and a
+	jr z, .done
+
+	ld l, a
+	ld h, 0
+	ld de, ANIM_MISS
+	add hl, de
+	ld a, l
+	ld [FXAnimID], a
+	ld a, h
+	ld [FXAnimID + 1], a
+
+.hi_byte
+	call WaitSFX
+	call PlayHitSound
+	call RunBattleAnimScript
+
+.done
+	call BattleAnim_RevertPals
+	ret
+; cc163
+
+RunBattleAnimScript: ; cc163
+
+	call ClearBattleAnims
+
+.playframe
+	call RunBattleAnimCommand
+	call _ExecuteBGEffects
+	call BattleAnim_UpdateOAM_All
+	call PushLYOverrides
+	call BattleAnimRequestPals
+
+; Speed up Rollout's animation.
+	ld a, [FXAnimID + 1]
+	or a
+	jr nz, .not_rollout
+
+	ld a, [FXAnimID]
+	cp ROLLOUT
+	jr nz, .not_rollout
+
+	ld a, $2e
+	ld b, 5
+	ld de, 4
+	ld hl, ActiveBGEffects
+.find
+	cp [hl]
+	jr z, .done
+	add hl, de
+	dec b
+	jr nz, .find
+
+.not_rollout
+	call BattleAnimDelayFrame
+
+.done
+	ld a, [BattleAnimFlags]
+	bit 0, a
+	jr z, .playframe
+
+	call BattleAnim_ClearCGB_OAMFlags
+	ret
+; cc1a1
+
+BattleAnimClearHud: ; cc1a1
+
+	call BattleAnimDelayFrame
+	call WaitTop
+	call ClearActorHud
+	ld a, $1
+	ld [hBGMapMode], a
+	call BattleAnimDelayFrame
+	call BattleAnimDelayFrame
+	call BattleAnimDelayFrame
+	call WaitTop
+	ret
+; cc1bb
+
+BattleAnimRestoreHuds: ; cc1bb
+
+	call BattleAnimDelayFrame
+	call WaitTop
+
+	ld a, [rSVBK]
+	push af
+	ld a, $1
+	ld [rSVBK], a
+
+	ld hl, UpdateBattleHuds
+	ld a, BANK(UpdatePlayerHUD)
+	rst FarCall ; Why not "call UpdateBattleHuds"?
+
+	pop af
+	ld [rSVBK], a
+
+	ld a, $1
+	ld [hBGMapMode], a
+	call BattleAnimDelayFrame
+	call BattleAnimDelayFrame
+	call BattleAnimDelayFrame
+	call WaitTop
+	ret
+; cc1e2
+
+BattleAnimRequestPals: ; cc1e2
+
+	ld a, [hCGB]
+	and a
+	ret z
+
+	ld a, [rBGP]
+	ld b, a
+	ld a, [wBGP]
+	cp b
+	call nz, BattleAnim_SetBGPals
+
+	ld a, [rOBP0]
+	ld b, a
+	ld a, [wOBP0]
+	cp b
+	call nz, BattleAnim_SetOBPals
+	ret
+; cc1fb
+
+BattleAnimDelayFrame: ; cc1fb
+; Like DelayFrame but wastes battery life.
+
+	ld a, 1
+	ld [VBlankOccurred], a
+.wait
+	ld a, [VBlankOccurred]
+	and a
+	jr nz, .wait
+	ret
+; cc207
+
+ClearActorHud: ; cc207
+
+	ld a, [hBattleTurn]
+	and a
+	jr z, .player
+
+	hlcoord 1, 0
+	lb bc, 4, 10
+	call ClearBox
+	ret
+
+.player
+	hlcoord 9, 7
+	lb bc, 5, 11
+	call ClearBox
+	ret
+; cc220
+
+Functioncc220: ; cc220
+; Appears to be unused.
+	xor a
+	ld [hBGMapMode], a
+	ld a, LOW(VBGMap0 tile $28)
+	ld [hBGMapAddress], a
+	ld a, HIGH(VBGMap0 tile $28)
+	ld [hBGMapAddress + 1], a
+	call WaitBGMap2
+	ld a, $60
+	ld [hWY], a
+	xor a ; LOW(VBGMap0)
+	ld [hBGMapAddress], a
+	ld a, HIGH(VBGMap0)
+	ld [hBGMapAddress + 1], a
+	call BattleAnimDelayFrame
+	ret
+; cc23d
+
+
+BattleAnim_ClearCGB_OAMFlags: ; cc23d
+
+	ld a, [BattleAnimFlags]
+	bit 3, a
+	jr z, .delete
+
+	ld hl, Sprites + 3
+	ld c, (SpritesEnd - Sprites) / 4
+.loop
+	ld a, [hl]
+	and $f0
+	ld [hli], a
+	inc hl
+	inc hl
+	inc hl
+	dec c
+	jr nz, .loop
+	ret
+
+.delete
+	ld hl, Sprites
+	ld c, SpritesEnd - Sprites
+	xor a
+.loop2
+	ld [hli], a
+	dec c
+	jr nz, .loop2
+	ret
+; cc25f
+
+RunBattleAnimCommand: ; cc25f
+	call .CheckTimer
+	ret nc
+	call .RunScript
+	ret
+; cc267
+
+.CheckTimer: ; cc267
+	ld a, [BattleAnimDuration]
+	and a
+	jr z, .done
+
+	dec a
+	ld [BattleAnimDuration], a
+	and a
+	ret
+
+.done
+	scf
+	ret
+; cc275
+
+.RunScript: ; cc275
+.loop
+	call GetBattleAnimByte
+
+	cp $ff
+	jr nz, .not_done_with_anim
+
+; Return from a subroutine.
+	ld hl, BattleAnimFlags
+	bit 1, [hl]
+	jr nz, .do_anim
+
+	set 0, [hl]
+	ret
+
+.not_done_with_anim
+	cp $d0
+	jr nc, .do_anim
+
+	ld [BattleAnimDuration], a
+	ret
+
+.do_anim
+	call .DoCommand
+
+	jr .loop
+; cc293
+
+.DoCommand: ; cc293
+; Execute battle animation command in [BattleAnimByte].
+	ld a, [BattleAnimByte]
+	sub $d0
+
+	ld e, a
+	ld d, 0
+	ld hl, BattleAnimCommands
+	add hl, de
+	add hl, de
+
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	jp hl
+; cc2a4
+
+
+BattleAnimCommands:: ; cc2a4 (33:42a4)
+; entries correspond to macros/move_anim.asm enumeration
+	dw BattleAnimCmd_Obj
+	dw BattleAnimCmd_1GFX
+	dw BattleAnimCmd_2GFX
+	dw BattleAnimCmd_3GFX
+	dw BattleAnimCmd_4GFX
+	dw BattleAnimCmd_5GFX
+	dw BattleAnimCmd_IncObj
+	dw BattleAnimCmd_SetObj
+	dw BattleAnimCmd_IncBGEffect
+	dw BattleAnimCmd_EnemyFeetObj
+	dw BattleAnimCmd_PlayerHeadObj
+	dw BattleAnimCmd_CheckPokeball
+	dw BattleAnimCmd_Transform
+	dw BattleAnimCmd_RaiseSub
+	dw BattleAnimCmd_DropSub
+	dw BattleAnimCmd_ResetObp0
+	dw BattleAnimCmd_Sound
+	dw BattleAnimCmd_Cry
+	dw BattleAnimCmd_MinimizeOpp
+	dw BattleAnimCmd_OAMOn
+	dw BattleAnimCmd_OAMOff
+	dw BattleAnimCmd_ClearObjs
+	dw BattleAnimCmd_BeatUp
+	dw BattleAnimCmd_E7
+	dw BattleAnimCmd_UpdateActorPic
+	dw BattleAnimCmd_Minimize
+	dw BattleAnimCmd_EA ; dummy
+	dw BattleAnimCmd_EB ; dummy
+	dw BattleAnimCmd_EC ; dummy
+	dw BattleAnimCmd_ED ; dummy
+	dw BattleAnimCmd_IfParamAnd
+	dw BattleAnimCmd_JumpUntil
+	dw BattleAnimCmd_BGEffect
+	dw BattleAnimCmd_BGP
+	dw BattleAnimCmd_OBP0
+	dw BattleAnimCmd_OBP1
+	dw BattleAnimCmd_ClearSprites
+	dw BattleAnimCmd_F5
+	dw BattleAnimCmd_F6
+	dw BattleAnimCmd_F7
+	dw BattleAnimCmd_IfParamEqual
+	dw BattleAnimCmd_SetVar
+	dw BattleAnimCmd_IncVar
+	dw BattleAnimCmd_IfVarEqual
+	dw BattleAnimCmd_Jump
+	dw BattleAnimCmd_Loop
+	dw BattleAnimCmd_Call
+	dw BattleAnimCmd_Ret
+
+
+BattleAnimCmd_EA:
+BattleAnimCmd_EB:
+BattleAnimCmd_EC:
+BattleAnimCmd_ED: ; cc304 (33:4304)
+	ret
+
+BattleAnimCmd_Ret: ; cc305 (33:4305)
+	ld hl, BattleAnimFlags
+	res 1, [hl]
+	ld hl, BattleAnimParent
+	ld e, [hl]
+	inc hl
+	ld d, [hl]
+	ld hl, BattleAnimAddress
+	ld [hl], e
+	inc hl
+	ld [hl], d
+	ret
+
+BattleAnimCmd_Call: ; cc317 (33:4317)
+	call GetBattleAnimByte
+	ld e, a
+	call GetBattleAnimByte
+	ld d, a
+	push de
+	ld hl, BattleAnimAddress
+	ld e, [hl]
+	inc hl
+	ld d, [hl]
+	ld hl, BattleAnimParent
+	ld [hl], e
+	inc hl
+	ld [hl], d
+	pop de
+	ld hl, BattleAnimAddress
+	ld [hl], e
+	inc hl
+	ld [hl], d
+	ld hl, BattleAnimFlags
+	set 1, [hl]
+	ret
+
+BattleAnimCmd_Jump: ; cc339 (33:4339)
+	call GetBattleAnimByte
+	ld e, a
+	call GetBattleAnimByte
+	ld d, a
+	ld hl, BattleAnimAddress
+	ld [hl], e
+	inc hl
+	ld [hl], d
+	ret
+
+BattleAnimCmd_Loop: ; cc348 (33:4348)
+	call GetBattleAnimByte
+	ld hl, BattleAnimFlags
+	bit 2, [hl]
+	jr nz, .continue_loop
+	and a
+	jr z, .perpetual
+	dec a
+	set 2, [hl]
+	ld [BattleAnimLoops], a
+.continue_loop
+	ld hl, BattleAnimLoops
+	ld a, [hl]
+	and a
+	jr z, .return_from_loop
+	dec [hl]
+.perpetual
+	call GetBattleAnimByte
+	ld e, a
+	call GetBattleAnimByte
+	ld d, a
+	ld hl, BattleAnimAddress
+	ld [hl], e
+	inc hl
+	ld [hl], d
+	ret
+
+.return_from_loop
+	ld hl, BattleAnimFlags
+	res 2, [hl]
+	ld hl, BattleAnimAddress
+	ld e, [hl]
+	inc hl
+	ld d, [hl]
+	inc de
+	inc de
+	ld [hl], d
+	dec hl
+	ld [hl], e
+	ret
+
+BattleAnimCmd_JumpUntil: ; cc383 (33:4383)
+	ld hl, wBattleAnimParam
+	ld a, [hl]
+	and a
+	jr z, .dont_jump
+
+	dec [hl]
+	call GetBattleAnimByte
+	ld e, a
+	call GetBattleAnimByte
+	ld d, a
+	ld hl, BattleAnimAddress
+	ld [hl], e
+	inc hl
+	ld [hl], d
+	ret
+
+.dont_jump
+	ld hl, BattleAnimAddress
+	ld e, [hl]
+	inc hl
+	ld d, [hl]
+	inc de
+	inc de
+	ld [hl], d
+	dec hl
+	ld [hl], e
+	ret
+
+BattleAnimCmd_SetVar: ; cc3a6 (33:43a6)
+	call GetBattleAnimByte
+	ld [BattleAnimVar], a
+	ret
+
+BattleAnimCmd_IncVar: ; cc3ad (33:43ad)
+	ld hl, BattleAnimVar
+	inc [hl]
+	ret
+
+BattleAnimCmd_IfVarEqual: ; cc3b2 (33:43b2)
+	call GetBattleAnimByte
+	ld hl, BattleAnimVar
+	cp [hl]
+	jr z, .jump
+
+	ld hl, BattleAnimAddress
+	ld e, [hl]
+	inc hl
+	ld d, [hl]
+	inc de
+	inc de
+	ld [hl], d
+	dec hl
+	ld [hl], e
+	ret
+
+.jump
+	call GetBattleAnimByte
+	ld e, a
+	call GetBattleAnimByte
+	ld d, a
+	ld hl, BattleAnimAddress
+	ld [hl], e
+	inc hl
+	ld [hl], d
+	ret
+
+BattleAnimCmd_IfParamEqual: ; cc3d6 (33:43d6)
+	call GetBattleAnimByte
+	ld hl, wBattleAnimParam
+	cp [hl]
+	jr z, .jump
+
+	ld hl, BattleAnimAddress
+	ld e, [hl]
+	inc hl
+	ld d, [hl]
+	inc de
+	inc de
+	ld [hl], d
+	dec hl
+	ld [hl], e
+	ret
+
+.jump
+	call GetBattleAnimByte
+	ld e, a
+	call GetBattleAnimByte
+	ld d, a
+	ld hl, BattleAnimAddress
+	ld [hl], e
+	inc hl
+	ld [hl], d
+	ret
+
+BattleAnimCmd_IfParamAnd: ; cc3fa (33:43fa)
+	call GetBattleAnimByte
+	ld e, a
+	ld a, [wBattleAnimParam]
+	and e
+	jr nz, .jump
+
+	ld hl, BattleAnimAddress
+	ld e, [hl]
+	inc hl
+	ld d, [hl]
+	inc de
+	inc de
+	ld [hl], d
+	dec hl
+	ld [hl], e
+	ret
+
+.jump
+	call GetBattleAnimByte
+	ld e, a
+	call GetBattleAnimByte
+	ld d, a
+	ld hl, BattleAnimAddress
+	ld [hl], e
+	inc hl
+	ld [hl], d
+	ret
+
+BattleAnimCmd_Obj: ; cc41f (33:441f)
+; index, x, y, param
+	call GetBattleAnimByte
+	ld [wBattleAnimTemp0], a
+	call GetBattleAnimByte
+	ld [wBattleAnimTemp1], a
+	call GetBattleAnimByte
+	ld [wBattleAnimTemp2], a
+	call GetBattleAnimByte
+	ld [wBattleAnimTemp3], a
+	call QueueBattleAnimation
+	ret
+
+BattleAnimCmd_BGEffect: ; cc43b (33:443b)
+	call GetBattleAnimByte
+	ld [wBattleAnimTemp0], a
+	call GetBattleAnimByte
+	ld [wBattleAnimTemp1], a
+	call GetBattleAnimByte
+	ld [wBattleAnimTemp2], a
+	call GetBattleAnimByte
+	ld [wBattleAnimTemp3], a
+	call _QueueBGEffect
+	ret
+
+BattleAnimCmd_BGP: ; cc457 (33:4457)
+	call GetBattleAnimByte
+	ld [wBGP], a
+	ret
+
+BattleAnimCmd_OBP0: ; cc45e (33:445e)
+	call GetBattleAnimByte
+	ld [wOBP0], a
+	ret
+
+BattleAnimCmd_OBP1: ; cc465 (33:4465)
+	call GetBattleAnimByte
+	ld [wOBP1], a
+	ret
+
+BattleAnimCmd_ResetObp0: ; cc46c (33:446c)
+	ld a, [hSGB]
+	and a
+	ld a, $e0
+	jr z, .not_sgb
+	ld a, $f0
+.not_sgb
+	ld [wOBP0], a
+	ret
+
+BattleAnimCmd_ClearObjs: ; cc479 (33:4479)
+	ld hl, ActiveAnimObjects
+	ld a, $a0
+.loop
+	ld [hl], $0
+	inc hl
+	dec a
+	jr nz, .loop
+	ret
+
+BattleAnimCmd_1GFX:
+BattleAnimCmd_2GFX:
+BattleAnimCmd_3GFX:
+BattleAnimCmd_4GFX:
+BattleAnimCmd_5GFX: ; cc485 (33:4485)
+	ld a, [BattleAnimByte]
+	and $f
+	ld c, a
+	ld hl, wBattleAnimTileDict
+	xor a
+	ld [wBattleAnimTemp0], a
+.loop
+	ld a, [wBattleAnimTemp0]
+	cp (VTiles1 - VTiles0) / $10 - $31
+	ret nc
+	call GetBattleAnimByte
+	ld [hli], a
+	ld a, [wBattleAnimTemp0]
+	ld [hli], a
+	push bc
+	push hl
+	ld l, a
+	ld h, $0
+rept 4
+	add hl, hl
+endr
+	ld de, VTiles0 tile $31
+	add hl, de
+	ld a, [BattleAnimByte]
+	call LoadBattleAnimObj
+	ld a, [wBattleAnimTemp0]
+	add c
+	ld [wBattleAnimTemp0], a
+	pop hl
+	pop bc
+	dec c
+	jr nz, .loop
+	ret
+
+BattleAnimCmd_IncObj: ; cc4c0 (33:44c0)
+	call GetBattleAnimByte
+	ld e, 10
+	ld bc, ActiveAnimObjects
+.loop
+	ld hl, BATTLEANIMSTRUCT_INDEX
+	add hl, bc
+	ld d, [hl]
+	ld a, [BattleAnimByte]
+	cp d
+	jr z, .found
+	ld hl, BATTLEANIMSTRUCT_LENGTH
+	add hl, bc
+	ld c, l
+	ld b, h
+	dec e
+	jr nz, .loop
+	ret
+
+.found
+	ld hl, BATTLEANIMSTRUCT_ANON_JT_INDEX
+	add hl, bc
+	inc [hl]
+	ret
+
+BattleAnimCmd_IncBGEffect: ; cc4e3 (33:44e3)
+	call GetBattleAnimByte
+	ld e, 5
+	ld bc, ActiveBGEffects
+.loop
+	ld hl, $0
+	add hl, bc
+	ld d, [hl]
+	ld a, [BattleAnimByte]
+	cp d
+	jr z, .found
+	ld hl, 4
+	add hl, bc
+	ld c, l
+	ld b, h
+	dec e
+	jr nz, .loop
+	ret
+
+.found
+	ld hl, BG_EFFECT_STRUCT_JT_INDEX
+	add hl, bc
+	inc [hl]
+	ret
+
+BattleAnimCmd_SetObj: ; cc506 (33:4506)
+	call GetBattleAnimByte
+	ld e, 10
+	ld bc, ActiveAnimObjects
+.loop
+	ld hl, BATTLEANIMSTRUCT_INDEX
+	add hl, bc
+	ld d, [hl]
+	ld a, [BattleAnimByte]
+	cp d
+	jr z, .found
+	ld hl, BATTLEANIMSTRUCT_LENGTH
+	add hl, bc
+	ld c, l
+	ld b, h
+	dec e
+	jr nz, .loop
+	ret
+
+.found
+	call GetBattleAnimByte
+	ld hl, BATTLEANIMSTRUCT_ANON_JT_INDEX
+	add hl, bc
+	ld [hl], a
+	ret
+
+BattleAnimCmd_EnemyFeetObj: ; cc52c (33:452c)
+
+	ld hl, wBattleAnimTileDict
+.loop
+	ld a, [hl]
+	and a
+	jr z, .okay
+	inc hl
+	inc hl
+	jr .loop
+
+.okay
+	ld a, $28
+	ld [hli], a
+	ld a, $42
+	ld [hli], a
+	ld a, $29
+	ld [hli], a
+	ld a, $49
+	ld [hl], a
+
+	ld hl, VTiles0 tile $73
+	ld de, VTiles2 tile $06
+	ld a, $70
+	ld [wBattleAnimTemp0], a
+	ld a, $7
+	call .LoadFootprint
+	ld de, VTiles2 tile $31
+	ld a, $60
+	ld [wBattleAnimTemp0], a
+	ld a, $6
+	call .LoadFootprint
+	ret
+
+.LoadFootprint: ; cc561 (33:4561)
+	push af
+	push hl
+	push de
+	lb bc, BANK(BattleAnimCmd_EnemyFeetObj), 1
+	call Request2bpp
+	pop de
+	ld a, [wBattleAnimTemp0]
+	ld l, a
+	ld h, 0
+	add hl, de
+	ld e, l
+	ld d, h
+	pop hl
+	ld bc, 1 tiles
+	add hl, bc
+	pop af
+	dec a
+	jr nz, .LoadFootprint
+	ret
+
+BattleAnimCmd_PlayerHeadObj: ; cc57e (33:457e)
+
+	ld hl, wBattleAnimTileDict
+.loop
+	ld a, [hl]
+	and a
+	jr z, .okay
+	inc hl
+	inc hl
+	jr .loop
+
+.okay
+	ld a, $28
+	ld [hli], a
+	ld a, $35
+	ld [hli], a
+	ld a, $29
+	ld [hli], a
+	ld a, $43
+	ld [hl], a
+
+	ld hl, VTiles0 tile $66
+	ld de, VTiles2 tile $05
+	ld a, $70
+	ld [wBattleAnimTemp0], a
+	ld a, $7
+	call .LoadHead
+	ld de, VTiles2 tile $31
+	ld a, $60
+	ld [wBattleAnimTemp0], a
+	ld a, $6
+	call .LoadHead
+	ret
+
+.LoadHead: ; cc5b3 (33:45b3)
+	push af
+	push hl
+	push de
+	lb bc, BANK(BattleAnimCmd_EnemyFeetObj), 2
+	call Request2bpp
+	pop de
+	ld a, [wBattleAnimTemp0]
+	ld l, a
+	ld h, 0
+	add hl, de
+	ld e, l
+	ld d, h
+	pop hl
+	ld bc, 2 tiles
+	add hl, bc
+	pop af
+	dec a
+	jr nz, .LoadHead
+	ret
+
+BattleAnimCmd_CheckPokeball: ; cc5d0 (33:45d0)
+	callfar GetPokeBallWobble
+	ld a, c
+	ld [BattleAnimVar], a
+	ret
+
+BattleAnimCmd_E7: ; cc5db (33:45db)
+	ret
+
+BattleAnimCmd_Transform: ; cc5dc (33:45dc)
+	ld a, [rSVBK]
+	push af
+	ld a, 1
+	ld [rSVBK], a
+	ld a, [CurPartySpecies] ; CurPartySpecies
+	push af
+
+	ld a, [hBattleTurn]
+	and a
+	jr z, .player
+
+	ld a, [TempBattleMonSpecies] ; TempBattleMonSpecies
+	ld [CurPartySpecies], a ; CurPartySpecies
+	ld hl, BattleMonDVs ; BattleMonDVs
+	predef GetUnownLetter
+	ld de, VTiles0 tile $00
+	predef GetMonFrontpic
+	jr .done
+
+.player
+	ld a, [TempEnemyMonSpecies] ; TempEnemyMonSpecies
+	ld [CurPartySpecies], a ; CurPartySpecies
+	ld hl, EnemyMonDVs ; EnemyMonDVs
+	predef GetUnownLetter
+	ld de, VTiles0 tile $00
+	predef GetMonBackpic
+
+.done
+	pop af
+	ld [CurPartySpecies], a ; CurPartySpecies
+	pop af
+	ld [rSVBK], a
+	ret
+
+BattleAnimCmd_UpdateActorPic: ; cc622 (33:4622)
+
+	ld de, VTiles0 tile $00
+	ld a, [hBattleTurn]
+	and a
+	jr z, .player
+
+	ld hl, VTiles2 tile $00
+	ld b, 0
+	ld c, $31
+	call Request2bpp
+	ret
+
+.player
+	ld hl, VTiles2 tile $31
+	ld b, 0
+	ld c, $24
+	call Request2bpp
+	ret
+
+BattleAnimCmd_RaiseSub: ; cc640 (33:4640)
+
+	ld a, [rSVBK]
+	push af
+	ld a, 1
+	ld [rSVBK], a
+	xor a
+	call GetSRAMBank
+
+GetSubstitutePic: ; cc64c
+
+	ld hl, sScratch
+	ld bc, (7 * 7) tiles
+.loop
+	xor a
+	ld [hli], a
+	dec bc
+	ld a, c
+	or b
+	jr nz, .loop
+
+	ld a, [hBattleTurn]
+	and a
+	jr z, .player
+
+	ld hl, MonsterSpriteGFX + 0 tiles
+	ld de, sScratch + (2 * 7 + 5) tiles
+	call .CopyTile
+	ld hl, MonsterSpriteGFX + 1 tiles
+	ld de, sScratch + (3 * 7 + 5) tiles
+	call .CopyTile
+	ld hl, MonsterSpriteGFX + 2 tiles
+	ld de, sScratch + (2 * 7 + 6) tiles
+	call .CopyTile
+	ld hl, MonsterSpriteGFX + 3 tiles
+	ld de, sScratch + (3 * 7 + 6) tiles
+	call .CopyTile
+
+	ld hl, VTiles2 tile $00
+	ld de, sScratch
+	lb bc, BANK(GetSubstitutePic), 7 * 7
+	call Request2bpp
+	jr .done
+
+.player
+	ld hl, MonsterSpriteGFX + 4 tiles
+	ld de, sScratch + (2 * 6 + 4) tiles
+	call .CopyTile
+	ld hl, MonsterSpriteGFX + 5 tiles
+	ld de, sScratch + (3 * 6 + 4) tiles
+	call .CopyTile
+	ld hl, MonsterSpriteGFX + 6 tiles
+	ld de, sScratch + (2 * 6 + 5) tiles
+	call .CopyTile
+	ld hl, MonsterSpriteGFX + 7 tiles
+	ld de, sScratch + (3 * 6 + 5) tiles
+	call .CopyTile
+
+	ld hl, VTiles2 tile $31
+	ld de, sScratch
+	lb bc, BANK(GetSubstitutePic), 6 * 6
+	call Request2bpp
+
+.done
+	call CloseSRAM
+	pop af
+	ld [rSVBK], a
+	ret
+
+.CopyTile: ; cc6c6 (33:46c6)
+	ld bc, 1 tiles
+	ld a, BANK(MonsterSpriteGFX)
+	call FarCopyBytes
+	ret
+
+BattleAnimCmd_MinimizeOpp: ; cc6cf (33:46cf)
+	ld a, [rSVBK]
+	push af
+	ld a, $1
+	ld [rSVBK], a
+	xor a
+	call GetSRAMBank
+	call GetMinimizePic
+	call Request2bpp
+	call CloseSRAM
+	pop af
+	ld [rSVBK], a
+	ret
+
+GetMinimizePic: ; cc6e7 (33:46e7)
+	ld hl, sScratch
+	ld bc, $31 tiles
+.loop
+	xor a
+	ld [hli], a
+	dec bc
+	ld a, c
+	or b
+	jr nz, .loop
+
+	ld a, [hBattleTurn]
+	and a
+	jr z, .player
+
+	ld de, sScratch + $1a tiles
+	call CopyMinimizePic
+	ld hl, VTiles2 tile $00
+	ld de, sScratch
+	lb bc, BANK(GetMinimizePic), $31
+	ret
+
+.player
+	ld de, sScratch + $160
+	call CopyMinimizePic
+	ld hl, VTiles2 tile $31
+	ld de, sScratch
+	lb bc, BANK(GetMinimizePic), $24
+	ret
+
+CopyMinimizePic: ; cc719 (33:4719)
+	ld hl, MinimizePic
+	ld bc, $10
+	ld a, BANK(MinimizePic)
+	call FarCopyBytes
+	ret
+; cc725 (33:4725)
+
+MinimizePic: ; cc725
+INCBIN "gfx/battle/minimize.2bpp"
+; cc735
+
+BattleAnimCmd_Minimize: ; cc735 (33:4735)
+	ld a, [rSVBK]
+	push af
+	ld a, $1
+	ld [rSVBK], a
+	xor a
+	call GetSRAMBank
+	call GetMinimizePic
+	ld hl, VTiles0 tile $00
+	call Request2bpp
+	call CloseSRAM
+	pop af
+	ld [rSVBK], a
+	ret
+
+BattleAnimCmd_DropSub: ; cc750 (33:4750)
+	ld a, [rSVBK]
+	push af
+	ld a, $1
+	ld [rSVBK], a
+
+	ld a, [CurPartySpecies] ; CurPartySpecies
+	push af
+	ld a, [hBattleTurn]
+	and a
+	jr z, .player
+
+	callfar DropEnemySub
+	jr .done
+
+.player
+	callfar DropPlayerSub
+
+.done
+	pop af
+	ld [CurPartySpecies], a ; CurPartySpecies
+	pop af
+	ld [rSVBK], a
+	ret
+
+BattleAnimCmd_BeatUp: ; cc776 (33:4776)
+	ld a, [rSVBK]
+	push af
+	ld a, $1
+	ld [rSVBK], a
+	ld a, [CurPartySpecies] ; CurPartySpecies
+	push af
+
+	ld a, [wBattleAnimParam]
+	ld [CurPartySpecies], a ; CurPartySpecies
+
+	ld a, [hBattleTurn]
+	and a
+	jr z, .player
+
+	ld hl, BattleMonDVs
+	predef GetUnownLetter
+	ld de, VTiles2 tile $00
+	predef GetMonFrontpic
+	jr .done
+
+.player
+	ld hl, EnemyMonDVs
+	predef GetUnownLetter
+	ld de, VTiles2 tile $31
+	predef GetMonBackpic
+
+.done
+	pop af
+	ld [CurPartySpecies], a ; CurPartySpecies
+	ld b, SCGB_BATTLE_COLORS
+	call GetSGBLayout
+	pop af
+	ld [rSVBK], a
+	ret
+
+BattleAnimCmd_OAMOn: ; cc7bb (33:47bb)
+	xor a
+	ld [hOAMUpdate], a
+	ret
+
+BattleAnimCmd_OAMOff: ; cc7bf (33:47bf)
+	ld a, $1
+	ld [hOAMUpdate], a
+	ret
+
+BattleAnimCmd_ClearSprites: ; cc7c4 (33:47c4)
+	ld hl, BattleAnimFlags
+	set 3, [hl]
+	ret
+
+BattleAnimCmd_F5: ; cc7ca (33:47ca)
+	ret
+
+BattleAnimCmd_F6: ; cc7cb (33:47cb)
+	ret
+
+BattleAnimCmd_F7: ; cc7cc (33:47cc)
+	ret
+
+BattleAnimCmd_Sound: ; cc7cd (33:47cd)
+	call GetBattleAnimByte
+	ld e, a
+	srl a
+	srl a
+	ld [wSFXDuration], a
+	call .GetCryTrack
+	and 3
+	ld [CryTracks], a ; CryTracks
+
+	ld e, a
+	ld d, 0
+	ld hl, .GetPanning
+	add hl, de
+	ld a, [hl]
+	ld [wStereoPanningMask], a
+
+	call GetBattleAnimByte
+	ld e, a
+	ld d, 0
+	callfar PlayStereoSFX
+
+	ret
+; cc7f8 (33:47f8)
+
+.GetPanning: ; cc7f8
+	db $f0, $0f, $f0, $0f
+; cc7fc
+
+.GetCryTrack: ; cc7fc (33:47fc)
+	ld a, [hBattleTurn]
+	and a
+	jr nz, .enemy
+
+	ld a, e
+	ret
+
+.enemy
+	ld a, e
+	xor 1
+	ret
+
+BattleAnimCmd_Cry: ; cc807 (33:4807)
+	call GetBattleAnimByte
+	and 3
+	ld e, a
+	ld d, 0
+	ld hl, .CryData
+rept 4
+	add hl, de
+endr
+
+	ld a, [rSVBK]
+	push af
+	ld a, 1
+	ld [rSVBK], a
+
+	ld a, [hBattleTurn]
+	and a
+	jr nz, .enemy
+
+	ld a, $f0
+	ld [CryTracks], a ; CryTracks
+	ld a, [BattleMonSpecies] ; BattleMonSpecies
+	jr .done_cry_tracks
+
+.enemy
+	ld a, $0f
+	ld [CryTracks], a ; CryTracks
+	ld a, [EnemyMonSpecies] ; EnemyMon
+
+.done_cry_tracks
+	push hl
+	call LoadCryHeader
+	pop hl
+	jr c, .done
+
+	ld a, [hli]
+	ld c, a
+	ld a, [hli]
+	ld b, a
+
+	push hl
+	ld hl, CryPitch
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	add hl, bc
+	ld a, l
+	ld [CryPitch], a
+	ld a, h
+	ld [CryPitch + 1], a
+	pop hl
+
+	ld a, [hli]
+	ld c, a
+	ld b, [hl]
+	ld hl, CryLength ; CryLength
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	add hl, bc
+
+	ld a, l
+	ld [CryLength], a ; CryLength
+	ld a, h
+	ld [CryLength + 1], a
+	ld a, 1
+	ld [wStereoPanningMask], a
+
+	callfar _PlayCryHeader
+
+.done
+	pop af
+	ld [rSVBK], a
+	ret
+; cc871 (33:4871)
+
+.CryData: ; cc871
+; +pitch, +length
+	dw $0000, $00c0
+	dw $0000, $0040
+	dw $0000, $0000
+	dw $0000, $0000
+; cc881
+
+
+PlayHitSound: ; cc881
+	ld a, [wNumHits]
+	cp $1
+	jr z, .okay
+	cp $4
+	ret nz
+
+.okay
+	ld a, [TypeModifier]
+	and $7f
+	ret z
+
+	cp 10
+	ld de, SFX_DAMAGE
+	jr z, .play
+
+	ld de, SFX_SUPER_EFFECTIVE
+	jr nc, .play
+
+	ld de, SFX_NOT_VERY_EFFECTIVE
+
+.play
+	call PlaySFX
+	ret
+; cc8a4
+
+BattleAnimAssignPals: ; cc8a4
+	ld a, [hCGB]
+	and a
+	jr nz, .cgb
+	ld a, [hSGB]
+	and a
+	ld a, %11100000
+	jr z, .sgb
+	ld a, %11110000
+
+.sgb
+	ld [wOBP0], a
+	ld a, %11100100
+	ld [wBGP], a
+	ld [wOBP1], a
+	ret
+
+.cgb
+	ld a, %11100100
+	ld [wBGP], a
+	ld [wOBP0], a
+	ld [wOBP1], a
+	call DmgToCgbBGPals
+	lb de, %11100100, %11100100
+	call DmgToCgbObjPals
+	ret
+; cc8d3
+
+ClearBattleAnims: ; cc8d3
+; Clear animation block
+	ld hl, LYOverrides
+	ld bc, wBattleAnimEnd - LYOverrides
+.loop
+	ld [hl], $0
+	inc hl
+	dec bc
+	ld a, c
+	or b
+	jr nz, .loop
+
+	ld hl, FXAnimID
+	ld e, [hl]
+	inc hl
+	ld d, [hl]
+	ld hl, BattleAnimations
+	add hl, de
+	add hl, de
+	call GetBattleAnimPointer
+	call BattleAnimAssignPals
+	call BattleAnimDelayFrame
+	ret
+; cc8f6
+
+BattleAnim_RevertPals: ; cc8f6
+	call WaitTop
+	ld a, %11100100
+	ld [wBGP], a
+	ld [wOBP0], a
+	ld [wOBP1], a
+	call DmgToCgbBGPals
+	lb de, %11100100, %11100100
+	call DmgToCgbObjPals
+	xor a
+	ld [hSCX], a
+	ld [hSCY], a
+	call BattleAnimDelayFrame
+	ld a, $1
+	ld [hBGMapMode], a
+	ret
+; cc91a
+
+BattleAnim_SetBGPals: ; cc91a
+	ld [rBGP], a
+	ld a, [hCGB]
+	and a
+	ret z
+	ld a, [rSVBK]
+	push af
+	ld a, $5
+	ld [rSVBK], a
+	ld hl, BGPals
+	ld de, UnknBGPals
+	ld a, [rBGP]
+	ld b, a
+	ld c, 7
+	call CopyPals
+	ld hl, OBPals
+	ld de, UnknOBPals
+	ld a, [rBGP]
+	ld b, a
+	ld c, 2
+	call CopyPals
+	pop af
+	ld [rSVBK], a
+	ld a, $1
+	ld [hCGBPalUpdate], a
+	ret
+; cc94b
+
+BattleAnim_SetOBPals: ; cc94b
+	ld [rOBP0], a
+	ld a, [hCGB]
+	and a
+	ret z
+	ld a, [rSVBK]
+	push af
+	ld a, $5
+	ld [rSVBK], a
+	ld hl, OBPals palette PAL_BATTLE_OB_GRAY
+	ld de, UnknOBPals palette PAL_BATTLE_OB_GRAY
+	ld a, [rOBP0]
+	ld b, a
+	ld c, 2
+	call CopyPals
+	pop af
+	ld [rSVBK], a
+	ld a, $1
+	ld [hCGBPalUpdate], a
+	ret
+; cc96e
+
+BattleAnim_UpdateOAM_All: ; cc96e
+	ld a, $0
+	ld [wBattleAnimOAMPointerLo], a
+	ld hl, ActiveAnimObjects
+	ld e, 10
+.loop
+	ld a, [hl]
+	and a
+	jr z, .next
+	ld c, l
+	ld b, h
+	push hl
+	push de
+	call DoBattleAnimFrame
+	call BattleAnimOAMUpdate
+	pop de
+	pop hl
+	jr c, .done
+
+.next
+	ld bc, BATTLEANIMSTRUCT_LENGTH
+	add hl, bc
+	dec e
+	jr nz, .loop
+	ld a, [wBattleAnimOAMPointerLo]
+	ld l, a
+	ld h, HIGH(Sprites)
+.loop2
+	ld a, l
+	cp LOW(SpritesEnd)
+	jr nc, .done
+	xor a
+	ld [hli], a
+	jr .loop2
+
+.done
+	ret
+; cc9a1
--- /dev/null
+++ b/engine/anims/bg_effects.asm
@@ -1,0 +1,2958 @@
+	const_def
+	const BGSQUARE_SIX
+	const BGSQUARE_FOUR
+	const BGSQUARE_TWO
+	const BGSQUARE_SEVEN
+	const BGSQUARE_FIVE
+	const BGSQUARE_THREE
+
+; BG effects for use in battle animations.
+
+ExecuteBGEffects: ; c8000 (32:4000)
+	ld hl, ActiveBGEffects
+	ld e, 5
+.loop
+	ld a, [hl]
+	and a
+	jr z, .next
+	ld c, l
+	ld b, h
+	push hl
+	push de
+	call DoBattleBGEffectFunction
+	pop de
+	pop hl
+.next
+	ld bc, 4
+	add hl, bc
+	dec e
+	jr nz, .loop
+	ret
+
+QueueBGEffect: ; c801a (32:401a)
+	ld hl, ActiveBGEffects
+	ld e, 5
+.loop
+	ld a, [hl]
+	and a
+	jr z, .load
+	ld bc, 4
+	add hl, bc
+	dec e
+	jr nz, .loop
+	scf
+	ret
+
+.load
+	ld c, l
+	ld b, h
+	ld hl, BG_EFFECT_STRUCT_FUNCTION
+	add hl, bc
+	ld a, [wBattleAnimTemp0]
+	ld [hli], a
+	ld a, [wBattleAnimTemp1]
+	ld [hli], a
+	ld a, [wBattleAnimTemp2]
+	ld [hli], a
+	ld a, [wBattleAnimTemp3]
+	ld [hl], a
+	ret
+
+EndBattleBGEffect: ; c8043 (32:4043)
+	ld hl, BG_EFFECT_STRUCT_FUNCTION
+	add hl, bc
+	ld [hl], 0
+	ret
+
+DoBattleBGEffectFunction: ; c804a (32:404a)
+	ld hl, BG_EFFECT_STRUCT_FUNCTION
+	add hl, bc
+	ld e, [hl]
+	ld d, 0
+	ld hl, BattleBGEffects
+	add hl, de
+	add hl, de
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	jp hl
+
+BattleBGEffects: ; c805a (32:405a)
+; entries correspond to ANIM_BG_* constants
+	dw BattleBGEffect_End
+	dw BattleBGEffect_FlashInverted
+	dw BattleBGEffect_FlashWhite
+	dw BattleBGEffect_WhiteHues
+	dw BattleBGEffect_BlackHues
+	dw BattleBGEffect_AlternateHues
+	dw BattleBGEffect_06
+	dw BattleBGEffect_07
+	dw BattleBGEffect_08
+	dw BattleBGEffect_HideMon
+	dw BattleBGEffect_ShowMon
+	dw BattleBGEffect_EnterMon
+	dw BattleBGEffect_ReturnMon
+	dw BattleBGEffect_Surf
+	dw BattleBGEffect_Whirlpool
+	dw BattleBGEffect_Teleport
+	dw BattleBGEffect_NightShade
+	dw BattleBGEffect_FeetFollow
+	dw BattleBGEffect_HeadFollow
+	dw BattleBGEffect_DoubleTeam
+	dw BattleBGEffect_AcidArmor
+	dw BattleBGEffect_RapidFlash
+	dw BattleBGEffect_16
+	dw BattleBGEffect_17
+	dw BattleBGEffect_18
+	dw BattleBGEffect_19
+	dw BattleBGEffect_1a
+	dw BattleBGEffect_1b
+	dw BattleBGEffect_1c
+	dw BattleBGEffect_1d
+	dw BattleBGEffect_1e
+	dw BattleBGEffect_1f
+	dw BattleBGEffect_20
+	dw BattleBGEffect_Withdraw
+	dw BattleBGEffect_BounceDown
+	dw BattleBGEffect_Dig
+	dw BattleBGEffect_Tackle
+	dw BattleBGEffect_25
+	dw BattleBGEffect_26
+	dw BattleBGEffect_27
+	dw BattleBGEffect_28
+	dw BattleBGEffect_Psychic
+	dw BattleBGEffect_2a
+	dw BattleBGEffect_2b
+	dw BattleBGEffect_2c
+	dw BattleBGEffect_2d
+	dw BattleBGEffect_2e
+	dw BattleBGEffect_2f
+	dw BattleBGEffect_30
+	dw BattleBGEffect_31
+	dw BattleBGEffect_32
+	dw BattleBGEffect_VibrateMon
+	dw BattleBGEffect_WobbleMon
+	dw BattleBGEffect_35
+
+
+BattleBGEffect_End: ; c80c6 (32:40c6)
+	call EndBattleBGEffect
+	ret
+
+BatttleBGEffects_GetNamedJumptablePointer: ; c80ca (32:40ca)
+	ld hl, BG_EFFECT_STRUCT_JT_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
+
+BattleBGEffects_AnonJumptable: ; c80d7 (32:40d7)
+	pop de
+	ld hl, BG_EFFECT_STRUCT_JT_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
+	jp hl
+
+BattleBGEffects_IncrementJumptable: ; c80e5 (32:40e5)
+	ld hl, BG_EFFECT_STRUCT_JT_INDEX
+	add hl, bc
+	inc [hl]
+	ret
+
+BattleBGEffect_FlashInverted: ; c80eb (32:40eb)
+	ld de, .inverted
+	jp BattleBGEffect_FlashContinue
+
+.inverted
+	db %11100100 ; 3210
+	db %00011011 ; 0123
+; c80f3
+
+BattleBGEffect_FlashWhite: ; c80f3 (32:40f3)
+	ld de, .white
+	jp BattleBGEffect_FlashContinue
+
+.white
+	db %11100100 ; 3210
+	db %00000000 ; 0000
+; c80fb
+
+BattleBGEffect_FlashContinue: ; c80fb (32:40fb)
+; current timer, flash duration, number of flashes
+	ld a, $1
+	ld [wBattleAnimTemp0], a
+	ld hl, BG_EFFECT_STRUCT_JT_INDEX
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr z, .init
+	dec [hl]
+	ret
+
+.init
+	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
+	add hl, bc
+	ld a, [hl]
+	ld hl, BG_EFFECT_STRUCT_JT_INDEX
+	add hl, bc
+	ld [hl], a
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr nz, .apply_pal
+	call EndBattleBGEffect
+	ret
+
+.apply_pal
+	dec a
+	ld [hl], a
+	and 1
+	ld l, a
+	ld h, 0
+	add hl, de
+	ld a, [hl]
+	ld [wBGP], a
+	ret
+
+BattleBGEffect_WhiteHues: ; c812d (32:412d)
+	ld de, .Pals
+	call BattleBGEffect_GetNthDMGPal
+	jr c, .quit
+	ld [wBGP], a
+	ret
+
+.quit
+	call EndBattleBGEffect
+	ret
+
+.Pals:
+	db %11100100
+	db %11100000
+	db %11010000
+	db -1
+; c8141
+
+BattleBGEffect_BlackHues: ; c8141 (32:4141)
+	ld de, .Pals
+	call BattleBGEffect_GetNthDMGPal
+	jr c, .quit
+	ld [wBGP], a
+	ret
+
+.quit
+	call EndBattleBGEffect
+	ret
+
+.Pals:
+	db %11100100
+	db %11110100
+	db %11111000
+	db -1
+; c8155
+
+BattleBGEffect_AlternateHues: ; c8155 (32:4155)
+	ld de, .Pals
+	call BattleBGEffect_GetNthDMGPal
+	jr c, .quit
+	ld [wBGP], a
+	ld [wOBP1], a
+	ret
+
+.quit
+	call EndBattleBGEffect
+	ret
+
+.Pals:
+	db %11100100
+	db %11111000
+	db %11111100
+	db %11111000
+	db %11100100
+	db %10010000
+	db %01000000
+	db %10010000
+	db -2
+; c8171
+
+BattleBGEffect_06: ; c8171 (32:4171)
+	call BattleBGEffects_CheckSGB
+	jr nz, .sgb
+	ld de, .PalsCGB
+	jr .okay
+
+.sgb
+	ld de, .PalsSGB
+.okay
+	call BattleBGEffect_GetNthDMGPal
+	ld [wOBP0], a
+	ret
+
+.PalsCGB:
+	db %11100100
+	db %10010000
+	db -2
+
+.PalsSGB:
+	db %11110000
+	db %11000000
+	db -2
+; c818b
+
+BattleBGEffect_07: ; c818b (32:418b)
+	call BattleBGEffects_CheckSGB
+	jr nz, .sgb
+	ld de, .PalsCGB
+	jr .okay
+
+.sgb
+	ld de, .PalsSGB
+.okay
+	call BattleBGEffect_GetNthDMGPal
+	ld [wOBP0], a
+	ret
+
+.PalsCGB:
+	db %11100100
+	db %11011000
+	db -2
+
+.PalsSGB:
+	db %11110000
+	db %11001100
+	db -2
+; c81a5
+
+BattleBGEffect_08: ; c81a5 (32:41a5)
+	ld de, .Pals
+	call BattleBGEffect_GetNthDMGPal
+	ld [wBGP], a
+	ret
+
+.Pals:
+	db %00011011
+	db %01100011
+	db %10000111
+	db -2
+; c81b3
+
+BattleBGEffect_HideMon: ; c81b3 (32:41b3)
+	call BattleBGEffects_AnonJumptable
+.anon_dw
+	dw .zero
+	dw BattleBGEffects_IncrementJumptable
+	dw BattleBGEffects_IncrementJumptable
+	dw BattleBGEffects_IncrementJumptable
+	dw .four
+
+
+.zero
+	call BattleBGEffects_IncrementJumptable
+	push bc
+	call BGEffect_CheckBattleTurn
+	jr nz, .player_side
+	hlcoord 12, 0
+	lb bc, 7, 7
+	jr .got_pointer
+
+.player_side
+	hlcoord 2, 6
+	lb bc, 6, 6
+.got_pointer
+	call ClearBox
+	pop bc
+	xor a
+	ld [hBGMapThird], a
+	ld a, $1
+	ld [hBGMapMode], a
+	ret
+
+.four
+	xor a
+	ld [hBGMapMode], a
+	call EndBattleBGEffect
+	ret
+
+BattleBGEffect_ShowMon: ; c81ea (32:41ea)
+	call BGEffect_CheckFlyDigStatus
+	jr z, .not_flying
+	call EndBattleBGEffect
+	ret
+
+.not_flying
+	call BGEffect_CheckBattleTurn
+	jr nz, .player_side
+	ld de, .EnemyData
+	jr .got_pointer
+
+.player_side
+	ld de, .PlayerData
+.got_pointer
+	ld a, e
+	ld [wBattleAnimTemp1], a
+	ld a, d
+	ld [wBattleAnimTemp2], a
+	call BattleBGEffect_RunPicResizeScript
+	ret
+
+.PlayerData:
+	db  0, $31, 0
+	db -1
+.EnemyData:
+	db  3, $00, 3
+	db -1
+; c8214
+
+BattleBGEffect_FeetFollow: ; c8214 (32:4214)
+	call BattleBGEffects_AnonJumptable
+.anon_dw
+	dw .zero
+	dw .one
+	dw BattleBGEffects_IncrementJumptable
+	dw BattleBGEffects_IncrementJumptable
+	dw BattleBGEffects_IncrementJumptable
+	dw .five
+
+
+.zero
+	call BGEffect_CheckFlyDigStatus
+	jr z, .not_flying_digging
+	ld hl, wNumActiveBattleAnims
+	inc [hl]
+	call EndBattleBGEffect
+	ret
+
+.not_flying_digging
+	call BattleBGEffects_IncrementJumptable
+	push bc
+	call BGEffect_CheckBattleTurn
+	jr nz, .player_turn
+	ld a, ANIM_OBJ_PLAYERFEETFOLLOW
+	ld [wBattleAnimTemp0], a
+	ld a, 16 * 8 + 4
+	jr .okay
+
+.player_turn
+	ld a, ANIM_OBJ_ENEMYFEETFOLLOW
+	ld [wBattleAnimTemp0], a
+	ld a, 6 * 8
+.okay
+	ld [wBattleAnimTemp1], a
+	ld a, 8 * 8
+	ld [wBattleAnimTemp2], a
+	xor a
+	ld [wBattleAnimTemp3], a
+	call _QueueBattleAnimation
+	pop bc
+	ret
+
+.one
+	call BattleBGEffects_IncrementJumptable
+	push bc
+	call BGEffect_CheckBattleTurn
+	jr nz, .player_turn_2
+	hlcoord 12, 6
+	lb bc, 1, 7
+	jr .okay2
+
+.player_turn_2
+	hlcoord 2, 6
+	lb bc, 1, 6
+.okay2
+	call ClearBox
+	ld a, $1
+	ld [hBGMapMode], a
+	pop bc
+	ret
+
+.five
+	xor a
+	ld [hBGMapMode], a
+	call EndBattleBGEffect
+	ret
+
+BattleBGEffect_HeadFollow: ; c8281 (32:4281)
+	call BattleBGEffects_AnonJumptable
+.anon_dw
+	dw .zero
+	dw .one
+	dw BattleBGEffects_IncrementJumptable
+	dw BattleBGEffects_IncrementJumptable
+	dw BattleBGEffects_IncrementJumptable
+	dw .five
+
+
+.zero
+	call BGEffect_CheckFlyDigStatus
+	jr z, .not_flying_digging
+	ld hl, wNumActiveBattleAnims
+	inc [hl]
+	call EndBattleBGEffect
+	ret
+
+.not_flying_digging
+	call BattleBGEffects_IncrementJumptable
+	push bc
+	call BGEffect_CheckBattleTurn
+	jr nz, .player_turn
+	ld a, ANIM_OBJ_BA
+	ld [wBattleAnimTemp0], a
+	ld a, 16 * 8 + 4
+	jr .okay
+
+.player_turn
+	ld a, ANIM_OBJ_BB
+	ld [wBattleAnimTemp0], a
+	ld a, 6 * 8
+.okay
+	ld [wBattleAnimTemp1], a
+	ld a, 8 * 8
+	ld [wBattleAnimTemp2], a
+	xor a
+	ld [wBattleAnimTemp3], a
+	call _QueueBattleAnimation
+	pop bc
+	ret
+
+.one
+	call BattleBGEffects_IncrementJumptable
+	push bc
+	call BGEffect_CheckBattleTurn
+	jr nz, .player_turn_2
+	hlcoord 12, 5
+	lb bc, 2, 7
+	jr .okay2
+
+.player_turn_2
+	hlcoord 2, 6
+	lb bc, 2, 6
+.okay2
+	call ClearBox
+	ld a, $1
+	ld [hBGMapMode], a
+	pop bc
+	ret
+
+.five
+	xor a
+	ld [hBGMapMode], a
+	call EndBattleBGEffect
+	ret
+
+_QueueBattleAnimation: ; c82ee (32:42ee)
+	callfar QueueBattleAnimation
+	ret
+
+BattleBGEffect_27: ; c82f5 (32:42f5)
+	call BattleBGEffects_AnonJumptable
+.anon_dw
+	dw .zero
+	dw .one
+	dw BattleBGEffects_IncrementJumptable
+	dw BattleBGEffects_IncrementJumptable
+	dw .four
+
+
+.zero
+	call BattleBGEffects_IncrementJumptable
+	call BGEffect_CheckBattleTurn
+	ld [hl], a
+	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr z, .user
+	ld a, $9
+	jr .okay
+
+.user
+	ld a, $8
+.okay
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld [hl], a
+	ret
+
+.one
+	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr z, .user_2
+	hlcoord 0, 6
+	lb de, 8, 6
+.row1
+	push de
+	push hl
+.col1
+	inc hl
+	ld a, [hld]
+	ld [hli], a
+	dec d
+	jr nz, .col1
+	pop hl
+	ld de, SCREEN_WIDTH
+	add hl, de
+	pop de
+	dec e
+	jr nz, .row1
+	jr .okay2
+
+.user_2
+	hlcoord 19, 0
+	lb de, 8, 7
+.row2
+	push de
+	push hl
+.col2
+	dec hl
+	ld a, [hli]
+	ld [hld], a
+	dec d
+	jr nz, .col2
+	pop hl
+	ld de, SCREEN_WIDTH
+	add hl, de
+	pop de
+	dec e
+	jr nz, .row2
+.okay2
+	xor a
+	ld [hBGMapThird], a
+	ld a, $1
+	ld [hBGMapMode], a
+	call BattleBGEffects_IncrementJumptable
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	dec [hl]
+	ret
+
+.four
+	xor a
+	ld [hBGMapMode], a
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr z, .done
+	ld hl, BG_EFFECT_STRUCT_JT_INDEX
+	add hl, bc
+	ld [hl], $1
+	ret
+
+.done
+	call EndBattleBGEffect
+	ret
+
+BattleBGEffect_EnterMon: ; c837b (32:437b)
+	call BGEffect_CheckBattleTurn
+	jr nz, .player_turn
+	ld de, .EnemyData
+	jr .okay
+
+.player_turn
+	ld de, .PlayerData
+.okay
+	ld a, e
+	ld [wBattleAnimTemp1], a
+	ld a, d
+	ld [wBattleAnimTemp2], a
+	call BattleBGEffect_RunPicResizeScript
+	ret
+
+.PlayerData:
+	db  2, $31, 2
+	db  1, $31, 1
+	db  0, $31, 0
+	db -1
+.EnemyData:
+	db  5, $00, 5
+	db  4, $00, 4
+	db  3, $00, 3
+	db -1
+; c83a8
+
+BattleBGEffect_ReturnMon: ; c83a8 (32:43a8)
+	call BGEffect_CheckBattleTurn
+	jr nz, .player_turn
+	ld de, .EnemyData
+	jr .okay
+
+.player_turn
+	ld de, .PlayerData
+.okay
+	ld a, e
+	ld [wBattleAnimTemp1], a
+	ld a, d
+	ld [wBattleAnimTemp2], a
+	call BattleBGEffect_RunPicResizeScript
+	ret
+
+.PlayerData:
+	db  0, $31, 0
+	db -2, $66, 0
+	db  1, $31, 1
+	db -2, $44, 1
+	db  2, $31, 2
+	db -2, $22, 2
+	db -3, $00, 0
+	db -1
+.EnemyData:
+	db  3, $00, 3
+	db -2, $77, 3
+	db  4, $00, 4
+	db -2, $55, 4
+	db  5, $00, 5
+	db -2, $33, 5
+	db -3, $00, 0
+	db -1
+; c83ed
+
+BattleBGEffect_RunPicResizeScript: ; c83ed (32:43ed)
+	call BattleBGEffects_AnonJumptable
+.anon_dw
+	dw .zero
+	dw BattleBGEffects_IncrementJumptable
+	dw BattleBGEffects_IncrementJumptable
+	dw .restart
+	dw .end
+
+
+.zero
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld e, [hl]
+	ld d, $0
+	inc [hl]
+	ld a, [wBattleAnimTemp1]
+	ld l, a
+	ld a, [wBattleAnimTemp2]
+	ld h, a
+	add hl, de
+	add hl, de
+	add hl, de
+	ld a, [hl]
+	cp -1
+	jr z, .end
+	cp -2
+	jr z, .clear
+	cp -3
+	jr z, .skip
+	call .PlaceGraphic
+.skip
+	call BattleBGEffects_IncrementJumptable
+	ld a, $1
+	ld [hBGMapMode], a
+	ret
+
+.clear
+	call .ClearBox
+	jr .zero
+
+.restart
+	xor a
+	ld [hBGMapMode], a
+	ld hl, BG_EFFECT_STRUCT_JT_INDEX
+	add hl, bc
+	ld [hl], $0
+	ret
+
+.end
+	xor a
+	ld [hBGMapMode], a
+	call EndBattleBGEffect
+	ret
+
+.ClearBox:
+; get dims
+	push bc
+	inc hl
+	ld a, [hli]
+	ld b, a
+	and $f
+	ld c, a
+	ld a, b
+	swap a
+	and $f
+	ld b, a
+; get coords
+	ld e, [hl]
+	ld d, 0
+	ld hl, .Coords
+	add hl, de
+	add hl, de
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	call ClearBox
+	pop bc
+	ret
+
+.PlaceGraphic:
+; get dims
+	push bc
+	push hl
+	ld e, [hl]
+	ld d, 0
+	ld hl, .BGSquares
+	add hl, de
+	add hl, de
+	add hl, de
+	ld a, [hli]
+	ld b, a
+	and $f
+	ld c, a
+	ld a, b
+	swap a
+	and $f
+	ld b, a
+; store pointer
+	ld e, [hl]
+	inc hl
+	ld d, [hl]
+; get byte
+	pop hl
+	inc hl
+	ld a, [hli]
+	ld [wBattleAnimTemp0], a
+; get coord
+	push de
+	ld e, [hl]
+	ld d, 0
+	ld hl, .Coords
+	add hl, de
+	add hl, de
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	pop de
+; fill box
+.row
+	push bc
+	push hl
+	ld a, [wBattleAnimTemp0]
+	ld b, a
+.col
+	ld a, [de]
+	add b
+	ld [hli], a
+	inc de
+	dec c
+	jr nz, .col
+	pop hl
+	ld bc, SCREEN_WIDTH
+	add hl, bc
+	pop bc
+	dec b
+	jr nz, .row
+	pop bc
+	ret
+
+.Coords:
+	dwcoord  2,  6
+	dwcoord  3,  8
+	dwcoord  4, 10
+	dwcoord 12,  0
+	dwcoord 13,  2
+	dwcoord 14,  4
+
+.BGSquares:
+bgsquare: MACRO
+	dn \1, \2
+	dw \3
+endm
+
+	bgsquare 6, 6, .SixBySix
+	bgsquare 4, 4, .FourByFour
+	bgsquare 2, 2, .TwoByTwo
+	bgsquare 7, 7, .SevenBySeven
+	bgsquare 5, 5, .FiveByFive
+	bgsquare 3, 3, .ThreeByThree
+
+.SixBySix:
+	db $00, $06, $0c, $12, $18, $1e
+	db $01, $07, $0d, $13, $19, $1f
+	db $02, $08, $0e, $14, $1a, $20
+	db $03, $09, $0f, $15, $1b, $21
+	db $04, $0a, $10, $16, $1c, $22
+	db $05, $0b, $11, $17, $1d, $23
+
+.FourByFour:
+	db $00, $0c, $12, $1e
+	db $02, $0e, $14, $20
+	db $03, $0f, $15, $21
+	db $05, $11, $17, $23
+
+.TwoByTwo:
+	db $00, $1e
+	db $05, $23
+
+.SevenBySeven:
+	db $00, $07, $0e, $15, $1c, $23, $2a
+	db $01, $08, $0f, $16, $1d, $24, $2b
+	db $02, $09, $10, $17, $1e, $25, $2c
+	db $03, $0a, $11, $18, $1f, $26, $2d
+	db $04, $0b, $12, $19, $20, $27, $2e
+	db $05, $0c, $13, $1a, $21, $28, $2f
+	db $06, $0d, $14, $1b, $22, $29, $30
+
+.FiveByFive:
+	db $00, $07, $15, $23, $2a
+	db $01, $08, $16, $24, $2b
+	db $03, $0a, $18, $26, $2d
+	db $05, $0c, $1a, $28, $2f
+	db $06, $0d, $1b, $29, $30
+
+.ThreeByThree:
+	db $00, $15, $2a
+	db $03, $18, $2d
+	db $06, $1b, $30
+; c8545
+
+BattleBGEffect_Surf: ; c8545 (32:4545)
+	call BattleBGEffects_AnonJumptable
+.anon_dw
+	dw .zero
+	dw .one
+	dw .two
+
+
+.zero
+	call BattleBGEffects_IncrementJumptable
+	lb de, 2, 2
+	call InitSurfWaves
+
+.one
+	ld a, [hLCDCPointer]
+	and a
+	ret z
+	push bc
+	call .RotatewSurfWaveBGEffect
+	pop bc
+	ret
+
+.two
+	call BattleAnim_ResetLCDStatCustom
+	ret
+
+.RotatewSurfWaveBGEffect:
+	ld hl, wSurfWaveBGEffect
+	ld de, wSurfWaveBGEffect + 1
+	ld c, wSurfWaveBGEffectEnd - wSurfWaveBGEffect - 1
+	ld a, [hl]
+	push af
+.loop
+	ld a, [de]
+	inc de
+	ld [hli], a
+	dec c
+	jr nz, .loop
+	pop af
+	ld [hl], a
+	ld de, LYOverridesBackup
+	ld hl, wSurfWaveBGEffect
+	ld bc, $0
+.loop2
+	ld a, [hLYOverrideStart]
+	cp e
+	jr nc, .load_zero
+	push hl
+	add hl, bc
+	ld a, [hl]
+	pop hl
+	jr .okay
+
+.load_zero
+	xor a
+.okay
+	ld [de], a
+	ld a, c
+	inc a
+	and $3f
+	ld c, a
+	inc de
+	ld a, e
+	cp $5f
+	jr c, .loop2
+	ret
+
+BattleBGEffect_Whirlpool: ; c8599 (32:4599)
+	call BattleBGEffects_AnonJumptable
+.anon_dw
+	dw .zero
+	dw .one
+	dw .two
+
+
+.zero
+	call BattleBGEffects_IncrementJumptable
+	call BattleBGEffects_ClearLYOverrides
+	ld a, rSCY - $ff00
+	ld [hLCDCPointer], a
+	xor a
+	ld [hLYOverrideStart], a
+	ld a, $5e
+	ld [hLYOverrideEnd], a
+	lb de, 2, 2
+	call Functionc8f2e
+	ret
+
+.one
+	call BattleBGEffect_WavyScreenFX
+	ret
+
+.two
+	call BattleAnim_ResetLCDStatCustom
+	ret
+
+BattleBGEffect_30: ; c85c2 (32:45c2)
+	call BattleBGEffects_ClearLYOverrides
+	ld a, rSCY - $ff00
+	call BattleBGEffect_SetLCDStatCustoms1
+	call EndBattleBGEffect
+	ret
+
+BattleBGEffect_31: ; c85ce (32:45ce)
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld a, [hl]
+	ld e, a
+	add $4
+	ld [hl], a
+	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
+	add hl, bc
+	ld a, [hl]
+	and $f0
+	swap a
+	xor $ff
+	add $4
+	ld d, a
+	ld hl, BG_EFFECT_STRUCT_JT_INDEX
+	add hl, bc
+	ld a, [hl]
+	ld [wBattleAnimTemp0], a
+	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
+	add hl, bc
+	ld a, [hl]
+	cp $20
+	jr nc, .done
+	inc [hl]
+	inc [hl]
+	call Functionc8f9a
+	ret
+
+.done
+	call BattleBGEffects_ClearLYOverrides
+	call EndBattleBGEffect
+	ret
+
+BattleBGEffect_32: ; c8603 (32:4603)
+	call BattleAnim_ResetLCDStatCustom
+	ret
+
+BattleBGEffect_Psychic: ; c8607 (32:4607)
+	call BattleBGEffects_AnonJumptable
+.anon_dw
+	dw .zero
+	dw .one
+	dw .two
+
+
+.zero
+	call BattleBGEffects_IncrementJumptable
+	call BattleBGEffects_ClearLYOverrides
+	ld a, rSCX - $ff00
+	ld [hLCDCPointer], a
+	xor a
+	ld [hLYOverrideStart], a
+	ld a, $5f
+	ld [hLYOverrideEnd], a
+	lb de, 6, 5
+	call Functionc8f2e
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld [hl], $0
+	ret
+
+.one
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld a, [hl]
+	inc [hl]
+	and $3
+	ret nz
+	call BattleBGEffect_WavyScreenFX
+	ret
+
+.two
+	call BattleAnim_ResetLCDStatCustom
+	ret
+
+BattleBGEffect_Teleport: ; c863f (32:463f)
+	call BattleBGEffects_AnonJumptable
+.anon_dw
+	dw .zero
+	dw .one
+	dw .two
+
+
+.zero
+	call BattleBGEffects_IncrementJumptable
+	call BattleBGEffects_ClearLYOverrides
+	ld a, rSCX - $ff00
+	call BattleBGEffect_SetLCDStatCustoms1
+	lb de, 6, 5
+	call Functionc8f2e
+	ret
+
+.one
+	call BattleBGEffect_WavyScreenFX
+	ret
+
+.two
+	call BattleAnim_ResetLCDStatCustom
+	ret
+
+BattleBGEffect_NightShade: ; c8662 (32:4662)
+	call BattleBGEffects_AnonJumptable
+.anon_dw
+	dw .zero
+	dw .one
+	dw .two
+
+
+.zero
+	call BattleBGEffects_IncrementJumptable
+	call BattleBGEffects_ClearLYOverrides
+	ld a, rSCY - $ff00
+	call BattleBGEffect_SetLCDStatCustoms1
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld e, [hl]
+	ld d, 2
+	call Functionc8f2e
+	ret
+
+.one
+	call BattleBGEffect_WavyScreenFX
+	ret
+
+.two
+	call BattleAnim_ResetLCDStatCustom
+	ret
+
+BattleBGEffect_DoubleTeam: ; c8689 (32:4689)
+	call BattleBGEffects_AnonJumptable
+.anon_dw
+	dw .zero
+	dw .one
+	dw .two
+	dw .three
+	dw .four
+	dw .five
+
+
+.zero
+	call BattleBGEffects_IncrementJumptable
+	call BattleBGEffects_ClearLYOverrides
+	ld a, rSCX - $ff00
+	call BattleBGEffect_SetLCDStatCustoms1
+	ld a, [hLYOverrideEnd]
+	inc a
+	ld [hLYOverrideEnd], a
+	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
+	add hl, bc
+	ld [hl], $0
+	ret
+
+.one
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld a, [hl]
+	cp $10
+	jr nc, .next
+	inc [hl]
+	call .UpdateLYOverrides
+	ret
+
+.three
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld a, [hl]
+	cp $ff
+	jr z, .next
+	dec [hl]
+	call .UpdateLYOverrides
+	ret
+
+.next
+	call BattleBGEffects_IncrementJumptable
+	ret
+
+.two
+	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
+	add hl, bc
+	ld a, [hl]
+	ld d, $2
+	call BattleBGEffects_Sine
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	add [hl]
+	call .UpdateLYOverrides
+	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
+	add hl, bc
+	ld a, [hl]
+	add $4
+	ld [hl], a
+
+.four
+	ret
+
+.UpdateLYOverrides:
+	ld e, a
+	xor $ff
+	inc a
+	ld d, a
+	ld h, HIGH(LYOverridesBackup)
+	ld a, [hLYOverrideStart]
+	ld l, a
+	ld a, [hLYOverrideEnd]
+	sub l
+	srl a
+	push af
+.loop
+	ld [hl], e
+	inc hl
+	ld [hl], d
+	inc hl
+	dec a
+	jr nz, .loop
+	pop af
+	ret nc
+	ld [hl], e
+	ret
+
+.five
+	call BattleAnim_ResetLCDStatCustom
+	ret
+
+BattleBGEffect_AcidArmor: ; c8709 (32:4709)
+	call BattleBGEffects_AnonJumptable
+.anon_dw
+	dw .zero
+	dw .one
+	dw .two
+
+
+.zero
+	call BattleBGEffects_IncrementJumptable
+	call BattleBGEffects_ClearLYOverrides
+	ld a, rSCY - $ff00
+	call BattleBGEffect_SetLCDStatCustoms1
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld e, [hl]
+	ld d, 2
+	call Functionc8f2e
+	ld h, HIGH(LYOverridesBackup)
+	ld a, [hLYOverrideEnd]
+	ld l, a
+	ld [hl], $0
+	dec l
+	ld [hl], $0
+	ret
+
+.one
+	ld a, [hLYOverrideEnd]
+	ld l, a
+	ld h, HIGH(LYOverridesBackup)
+	ld e, l
+	ld d, h
+	dec de
+.loop
+	ld a, [de]
+	dec de
+	ld [hld], a
+	ld a, [hLYOverrideStart]
+	cp l
+	jr nz, .loop
+	ld [hl], $90
+	ld a, [hLYOverrideEnd]
+	ld l, a
+	ld a, [hl]
+	cp $1
+	jr c, .okay
+	cp $90
+	jr z, .okay
+	ld [hl], $0
+.okay
+	dec l
+	ld a, [hl]
+	cp $2
+	ret c
+	cp $90
+	ret z
+	ld [hl], $0
+	ret
+
+.two
+	call BattleAnim_ResetLCDStatCustom
+	ret
+
+BattleBGEffect_Withdraw: ; c8761 (32:4761)
+	call BattleBGEffects_AnonJumptable
+.anon_dw
+	dw .zero
+	dw .one
+	dw .two
+
+
+.zero
+	call BattleBGEffects_IncrementJumptable
+	call BattleBGEffects_ClearLYOverrides
+	ld a, rSCY - $ff00
+	call BattleBGEffect_SetLCDStatCustoms1
+	ld a, [hLYOverrideEnd]
+	inc a
+	ld [hLYOverrideEnd], a
+	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
+	add hl, bc
+	ld [hl], $1
+	ret
+
+.one
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld a, [hl]
+	and $3f
+	ld d, a
+	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
+	add hl, bc
+	ld a, [hl]
+	cp d
+	ret nc
+	call BGEffect_DisplaceLYOverridesBackup
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld a, [hl]
+	rlca
+	rlca
+	and $3
+	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
+	add hl, bc
+	add [hl]
+	ld [hl], a
+	ret
+
+.two
+	call BattleAnim_ResetLCDStatCustom
+	ret
+
+BattleBGEffect_Dig: ; c87a7 (32:47a7)
+	call BattleBGEffects_AnonJumptable
+.anon_dw
+	dw .zero
+	dw .one
+	dw .two
+	dw .three
+
+
+.zero
+	call BattleBGEffects_IncrementJumptable
+	call BattleBGEffects_ClearLYOverrides
+	ld a, rSCY - $ff00
+	call BattleBGEffect_SetLCDStatCustoms1
+	ld a, [hLYOverrideEnd]
+	inc a
+	ld [hLYOverrideEnd], a
+	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
+	add hl, bc
+	ld [hl], $2
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld [hl], $0
+	ret
+
+.one
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr z, .next
+	dec [hl]
+	ret
+
+.next
+	ld [hl], $10
+	call BattleBGEffects_IncrementJumptable
+.two
+	ld a, [hLYOverrideStart]
+	ld l, a
+	ld a, [hLYOverrideEnd]
+	sub l
+	dec a
+	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
+	add hl, bc
+	cp [hl]
+	ret c
+	ld a, [hl]
+	push af
+	and $7
+	jr nz, .skip
+	ld hl, BG_EFFECT_STRUCT_JT_INDEX
+	add hl, bc
+	dec [hl]
+.skip
+	pop af
+	call BGEffect_DisplaceLYOverridesBackup
+	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
+	add hl, bc
+	inc [hl]
+	inc [hl]
+	ret
+
+.three
+	call BattleAnim_ResetLCDStatCustom
+	ret
+
+BattleBGEffect_Tackle: ; c8805 (32:4805)
+	call BattleBGEffects_AnonJumptable
+.anon_dw
+	dw .zero
+	dw Tackle_BGEffect25_2d_one
+	dw Tackle_BGEffect25_2d_two
+	dw .three
+
+
+.zero
+	call BattleBGEffects_IncrementJumptable
+	call BattleBGEffects_ClearLYOverrides
+	ld a, rSCX - $ff00
+	call BattleBGEffect_SetLCDStatCustoms1
+	ld a, [hLYOverrideEnd]
+	inc a
+	ld [hLYOverrideEnd], a
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld [hl], $0
+	call BGEffect_CheckBattleTurn
+	jr nz, .player_side
+	ld a, 2
+	jr .okay
+
+.player_side
+	ld a, -2
+.okay
+	ld [hl], a
+	ret
+
+.three
+	call BattleAnim_ResetLCDStatCustom
+	ret
+
+BattleBGEffect_25: ; c8837 (32:4837)
+	call BattleBGEffects_AnonJumptable
+.anon_dw
+	dw .zero
+	dw Tackle_BGEffect25_2d_one
+	dw Tackle_BGEffect25_2d_two
+	dw .three
+
+
+.zero
+	call BattleBGEffects_IncrementJumptable
+	call BattleBGEffects_ClearLYOverrides
+	ld a, rSCX - $ff00
+	call BattleBGEffect_SetLCDStatCustoms2
+	ld a, [hLYOverrideEnd]
+	inc a
+	ld [hLYOverrideEnd], a
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld [hl], $0
+	call BGEffect_CheckBattleTurn
+	jr nz, .player_side
+	ld a,  2
+	jr .okay
+
+.player_side
+	ld a, -2
+.okay
+	ld [hl], a
+	ret
+
+.three
+	call BattleAnim_ResetLCDStatCustom
+	ret
+
+Tackle_BGEffect25_2d_one:
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld a, [hl]
+	cp -8
+	jr z, .reached_limit
+	cp  8
+	jr nz, .finish
+.reached_limit
+	call BattleBGEffects_IncrementJumptable
+.finish
+	call Functionc88a5
+	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
+	add hl, bc
+	ld a, [hl]
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	add [hl]
+	ld [hl], a
+	ret
+
+Tackle_BGEffect25_2d_two:
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr nz, .asm_c8893
+	call BattleBGEffects_IncrementJumptable
+.asm_c8893
+	call Functionc88a5
+	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
+	add hl, bc
+	ld a, [hl]
+	xor $ff
+	inc a
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	add [hl]
+	ld [hl], a
+	ret
+
+Functionc88a5: ; c88a5 (32:48a5)
+	push af
+	ld a, [FXAnimID + 1] ; FXAnimID + 1
+	or a
+	jr nz, .not_rollout
+	ld a, [FXAnimID] ; FXAnimID
+	cp ROLLOUT
+	jr z, .rollout
+.not_rollout
+	pop af
+	jp BGEffect_FillLYOverridesBackup
+
+.rollout
+	ld a, [hLYOverrideStart]
+	ld d, a
+	ld a, [hLYOverrideEnd]
+	sub d
+	ld d, a
+	ld h, HIGH(LYOverridesBackup)
+	ld a, [hSCY]
+	or a
+	jr nz, .skip1
+	ld a, [hLYOverrideStart]
+	or a
+	jr z, .skip2
+	dec a
+	ld l, a
+	ld [hl], $0
+	jr .skip2
+
+.skip1
+	ld a, [hLYOverrideEnd]
+	dec a
+	ld l, a
+	ld [hl], $0
+.skip2
+	ld a, [hSCY]
+	ld l, a
+	ld a, [hLYOverrideStart]
+	sub l
+	jr nc, .skip3
+	xor a
+	dec d
+.skip3
+	ld l, a
+	pop af
+.loop
+	ld [hli], a
+	dec d
+	jr nz, .loop
+	ret
+
+BattleBGEffect_2d: ; c88e7 (32:48e7)
+	call BattleBGEffects_AnonJumptable
+.anon_dw
+	dw BGEffect2d_2f_zero
+	dw Tackle_BGEffect25_2d_one
+	dw Tackle_BGEffect25_2d_two
+	dw .three
+
+
+.three
+	call BattleAnim_ResetLCDStatCustom
+	ret
+
+BGEffect2d_2f_zero:
+	call BattleBGEffects_IncrementJumptable
+	call BattleBGEffects_ClearLYOverrides
+	ld a, rSCX - $ff00
+	call BattleBGEffect_SetLCDStatCustoms1
+	ld a, [hLYOverrideEnd]
+	inc a
+	ld [hLYOverrideEnd], a
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld [hl], $0
+	call BGEffect_CheckBattleTurn
+	jr nz, .player_turn
+	ld a, -2
+	jr .okay
+
+.player_turn
+	ld a, 2
+.okay
+	ld [hl], a
+	ret
+
+BattleBGEffect_2f: ; c8919 (32:4919)
+	call BattleBGEffects_AnonJumptable
+.anon_dw
+	dw BGEffect2d_2f_zero
+	dw Tackle_BGEffect25_2d_one
+	dw .two
+	dw Tackle_BGEffect25_2d_two
+	dw .four
+
+.four
+	call BattleAnim_ResetLCDStatCustom
+.two
+	ret
+
+BattleBGEffect_26: ; c892a (32:492a)
+	call BattleBGEffects_AnonJumptable
+.anon_dw
+	dw .zero
+	dw .one
+	dw .two
+
+
+.zero
+	call BattleBGEffects_IncrementJumptable
+	call BattleBGEffects_ClearLYOverrides
+	ld a, rSCX - $ff00
+	call BattleBGEffect_SetLCDStatCustoms1
+	ld a, [hLYOverrideEnd]
+	inc a
+	ld [hLYOverrideEnd], a
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld [hl], $0
+	ret
+
+.one
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld a, [hl]
+	ld d, $8
+	call BattleBGEffects_Sine
+	call BGEffect_FillLYOverridesBackup
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld a, [hl]
+	add $4
+	ld [hl], a
+	ret
+
+.two
+	call BattleAnim_ResetLCDStatCustom
+	ret
+
+BattleBGEffect_2c: ; c8964 (32:4964)
+	call BattleBGEffects_AnonJumptable
+.anon_dw
+	dw .zero
+	dw .one
+	dw .two
+
+
+.zero
+	call BattleBGEffects_IncrementJumptable
+	call BattleBGEffects_ClearLYOverrides
+	ld a, rSCX - $ff00
+	call BattleBGEffect_SetLCDStatCustoms1
+	ld a, [hLYOverrideEnd]
+	inc a
+	ld [hLYOverrideEnd], a
+	xor a
+	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
+	add hl, bc
+	ld [hli], a
+	ld [hl], a
+	ret
+
+.one
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld a, [hl]
+	ld d, $6
+	call BattleBGEffects_Sine
+	push af
+	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
+	add hl, bc
+	ld a, [hl]
+	ld d, $2
+	call BattleBGEffects_Sine
+	ld e, a
+	pop af
+	add e
+	call BGEffect_FillLYOverridesBackup
+	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
+	add hl, bc
+	ld a, [hl]
+	add $8
+	ld [hl], a
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld a, [hl]
+	add $2
+	ld [hl], a
+	ret
+
+.two
+	call BattleAnim_ResetLCDStatCustom
+	ret
+
+BattleBGEffect_28: ; c89b5 (32:49b5)
+	call BattleBGEffects_AnonJumptable
+.anon_dw
+	dw .zero
+	dw .one
+	dw .two
+
+
+.zero
+	call BattleBGEffects_IncrementJumptable
+	call BattleBGEffects_ClearLYOverrides
+	ld a, rSCX - $ff00
+	call BattleBGEffect_SetLCDStatCustoms1
+	ret
+
+.one
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld a, [hl]
+	cp $20
+	ret nc
+	inc [hl]
+	ld d, a
+	ld e, 4
+	call Functionc8f2e
+	ret
+
+.two
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr z, .reset
+	dec [hl]
+	ld d, a
+	ld e, 4
+	call Functionc8f2e
+	ret
+
+.reset
+	call BattleAnim_ResetLCDStatCustom
+	ret
+
+BattleBGEffect_BounceDown: ; c89ee (32:49ee)
+	call BattleBGEffects_AnonJumptable
+.anon_dw
+	dw .zero
+	dw .one
+	dw .two
+
+
+.zero
+	call BattleBGEffects_IncrementJumptable
+	call BattleBGEffects_ClearLYOverrides
+	ld a, rSCY - $ff00
+	call BattleBGEffect_SetLCDStatCustoms2
+	ld a, [hLYOverrideEnd]
+	inc a
+	ld [hLYOverrideEnd], a
+	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
+	add hl, bc
+	ld [hl], $1
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld [hl], $20
+	ret
+
+.one
+	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
+	add hl, bc
+	ld a, [hl]
+	cp $38
+	ret nc
+	push af
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld a, [hl]
+	ld d, $10
+	call BattleBGEffects_Cosine
+	add $10
+	ld d, a
+	pop af
+	add d
+	call BGEffect_DisplaceLYOverridesBackup
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	inc [hl]
+	inc [hl]
+	ret
+
+.two
+	call BattleAnim_ResetLCDStatCustom
+	ret
+
+BattleBGEffect_2a: ; c8a3a (32:4a3a)
+	call BattleBGEffects_AnonJumptable
+.anon_dw
+	dw .zero
+	dw .one
+	dw .two
+	dw .three
+	dw .four
+	dw .five
+
+.zero
+	call BattleBGEffects_IncrementJumptable
+	ld a, $e4
+	call BattleBGEffects_SetLYOverrides
+	ld a, $47
+	call BattleBGEffect_SetLCDStatCustoms1
+	ld a, [hLYOverrideEnd]
+	inc a
+	ld [hLYOverrideEnd], a
+	ld a, [hLYOverrideStart]
+	ld l, a
+	ld h, HIGH(LYOverridesBackup)
+.loop
+	ld a, [hLYOverrideEnd]
+	cp l
+	jr z, .done
+	xor a
+	ld [hli], a
+	jr .loop
+
+.done
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld [hl], $0
+.one
+.four
+	ret
+
+.two
+	call .GetLYOverride
+	jr nc, .next
+	call .SetLYOverridesBackup
+	ret
+
+.next
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld [hl], $0
+	ld a, [hLYOverrideStart]
+	inc a
+	ld [hLYOverrideStart], a
+	call BattleBGEffects_IncrementJumptable
+	ret
+
+.three
+	call .GetLYOverride
+	jr nc, .finish
+	call .SetLYOverridesBackup
+	ld a, [hLYOverrideEnd]
+	dec a
+	ld l, a
+	ld [hl], e
+	ret
+
+.finish
+	call BattleBGEffects_IncrementJumptable
+	ret
+
+.SetLYOverridesBackup:
+	ld e, a
+	ld a, [hLYOverrideStart]
+	ld l, a
+	ld a, [hLYOverrideEnd]
+	sub l
+	srl a
+	ld h, HIGH(LYOverridesBackup)
+.loop2
+	ld [hl], e
+	inc hl
+	inc hl
+	dec a
+	jr nz, .loop2
+	ret
+
+.five
+	call BattleBGEffects_ResetVideoHRAM
+	ret
+
+.GetLYOverride:
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld a, [hl]
+	inc [hl]
+	srl a
+	srl a
+	srl a
+	ld e, a
+	ld d, 0
+	ld hl, .data
+	add hl, de
+	ld a, [hl]
+	cp $ff
+	ret
+
+.data
+	db $00, $40, $90, $e4
+	db -1
+; c8acc
+
+BattleBGEffect_2b: ; c8acc (32:4acc)
+	call BattleBGEffects_AnonJumptable
+.anon_dw
+	dw .zero
+	dw .one
+
+
+.zero
+	call BattleBGEffects_IncrementJumptable
+	call BattleBGEffects_ClearLYOverrides
+	ld a, rSCX - $ff00
+	call BattleBGEffect_SetLCDStatCustoms1
+	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
+	add hl, bc
+	ld [hl], $40
+	ret
+
+.one
+	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr z, .done
+	dec [hl]
+	srl a
+	srl a
+	srl a
+	and $f
+	ld d, a
+	ld e, a
+	call Functionc8f2e
+	ret
+
+.done
+	call BattleAnim_ResetLCDStatCustom
+	ret
+
+BattleBGEffect_1c: ; c8b00 (32:4b00)
+	ld a, [hCGB]
+	and a
+	jr nz, .cgb
+	call BattleBGEffects_AnonJumptable
+.anon_dw
+	dw .zero
+	dw .one
+	dw .two
+
+
+.zero
+	call BattleBGEffects_IncrementJumptable
+	ld a, $e4
+	call BattleBGEffects_SetLYOverrides
+	ld a, rBGP - $ff00
+	ld [hLCDCPointer], a
+	xor a
+	ld [hLYOverrideStart], a
+	ld a, $60
+	ld [hLYOverrideEnd], a
+	ret
+
+.one
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld a, [hl]
+	inc [hl]
+	ld e, a
+	and $7
+	ret nz
+	ld a, e
+	and $18
+	sla a
+	swap a
+	sla a
+	ld e, a
+	ld d, $0
+	push bc
+	call BGEffect_CheckBattleTurn
+	jr nz, .player
+	ld hl, .CGB_DMGEnemyData
+	add hl, de
+	ld a, [hli]
+	ld [wOBP1], a
+	ld d, a
+	ld e, [hl]
+	lb bc, $2f, $30
+	jr .okay
+
+.player
+	ld hl, .DMG_PlayerData
+	add hl, de
+	ld d, [hl]
+	inc hl
+	ld a, [hl]
+	ld [wOBP1], a
+	ld e, a
+	lb bc, $37, $28
+.okay
+	call .DMG_LYOverrideLoads
+	pop bc
+	ret
+
+.two
+	call BattleBGEffects_ResetVideoHRAM
+	ld a, $e4
+	ld [wBGP], a
+	ld [wOBP1], a
+	ret
+
+.DMG_LYOverrideLoads:
+	ld hl, LYOverridesBackup
+.loop1
+	ld [hl], d
+	inc hl
+	dec b
+	jr nz, .loop1
+.loop2
+	ld [hl], e
+	inc hl
+	dec c
+	jr nz, .loop2
+	ret
+
+.cgb
+	ld de, .Jumptable
+	call BatttleBGEffects_GetNamedJumptablePointer
+	jp hl
+
+.Jumptable:
+	dw .cgb_zero
+	dw .cgb_one
+	dw .cgb_two
+.cgb_zero
+	call BattleBGEffects_IncrementJumptable
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld [hl], $0
+	ret
+
+.cgb_one
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld a, [hl]
+	inc [hl]
+	ld e, a
+	and $7
+	ret nz
+	ld a, e
+	and $18
+	sla a
+	swap a
+	sla a
+	ld e, a
+	ld d, 0
+	call BGEffect_CheckBattleTurn
+	jr nz, .player_2
+	ld hl, .CGB_DMGEnemyData
+	add hl, de
+	ld a, [hli]
+	push hl
+	call BGEffects_LoadBGPal1_OBPal0
+	pop hl
+	ld a, [hl]
+	call BGEffects_LoadBGPal0_OBPal1
+	ret
+
+.player_2
+	ld hl, .CGB_DMGEnemyData
+	add hl, de
+	ld a, [hli]
+	push hl
+	call BGEffects_LoadBGPal0_OBPal1
+	pop hl
+	ld a, [hl]
+	call BGEffects_LoadBGPal1_OBPal0
+	ret
+
+.cgb_two
+	ld a, $e4
+	call BGEffects_LoadBGPal0_OBPal1
+	ld a, $e4
+	call BGEffects_LoadBGPal1_OBPal0
+	call EndBattleBGEffect
+	ret
+
+.CGB_DMGEnemyData:
+	db $e4, $e4
+	db $f8, $90
+	db $fc, $40
+	db $f8, $90
+.DMG_PlayerData:
+	db $e4, $e4
+	db $90, $f8
+	db $40, $fc
+	db $90, $f8
+; c8be8
+
+BattleBGEffect_RapidFlash: ; c8be8 (32:4be8)
+	ld de, .FlashPals
+	call BGEffect_RapidCyclePals
+	ret
+
+.FlashPals:
+	db $e4, $6c, $fe
+; c8bf2
+
+BattleBGEffect_16: ; c8bf2 (32:4bf2)
+	ld de, .Pals
+	call BGEffect_RapidCyclePals
+	ret
+
+.Pals:
+	db $e4, $90, $40, $ff
+; c8bfd
+
+BattleBGEffect_17: ; c8bfd (32:4bfd)
+	ld de, .Pals
+	call BGEffect_RapidCyclePals
+	ret
+
+.Pals:
+	db $e4, $f8, $fc, $ff
+; c8c08
+
+BattleBGEffect_18: ; c8c08 (32:4c08)
+	ld de, .Pals
+	call BGEffect_RapidCyclePals
+	ret
+
+.Pals:
+	db $e4, $90, $40, $90, $fe
+; c8c14
+
+BattleBGEffect_19: ; c8c14 (32:4c14)
+	ld de, .Pals
+	call BGEffect_RapidCyclePals
+	ret
+
+.Pals:
+	db $e4, $f8, $fc, $f8, $fe
+; c8c20
+
+BattleBGEffect_1a: ; c8c20 (32:4c20)
+	ld de, .Pals
+	call BGEffect_RapidCyclePals
+	ret
+
+.Pals:
+	db $e4, $f8, $fc, $f8, $e4, $90, $40, $90, $fe
+; c8c30
+
+BattleBGEffect_1b: ; c8c30 (32:4c30)
+	ld de, .Pals
+	call BGEffect_RapidCyclePals
+	ret
+
+.Pals:
+	db $e4, $fc, $e4, $00, $fe
+; c8c3c
+
+BattleBGEffect_1d: ; c8c3c (32:4c3c)
+	ld de, .Pals
+	call BGEffect_RapidCyclePals
+	ret
+
+.Pals:
+	db $e4, $90, $40, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $40, $90, $e4, $ff
+; c8c55
+
+BattleBGEffect_1e: ; c8c55 (32:4c55)
+	ld de, .Pals
+	call BGEffect_RapidCyclePals
+	ret
+
+.Pals:
+	db $00, $40, $90, $e4, $ff
+; c8c61
+
+BattleBGEffect_VibrateMon: ; c8c61 (32:4c61)
+	call BattleBGEffects_AnonJumptable
+.anon_dw
+	dw .zero
+	dw .one
+
+
+.zero ; c8c68 (32:4c68)
+	call BattleBGEffects_IncrementJumptable
+	call BattleBGEffects_ClearLYOverrides
+	ld a, rSCX - $ff00
+	call BattleBGEffect_SetLCDStatCustoms1
+	ld a, [hLYOverrideEnd]
+	inc a
+	ld [hLYOverrideEnd], a
+	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
+	add hl, bc
+	ld [hl], $1
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld [hl], $20
+	ret
+
+.one ; c8c85 (32:4c85)
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr z, .finish
+	dec [hl]
+	and $1
+	ret nz
+	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
+	add hl, bc
+	ld a, [hl]
+	xor $ff
+	inc a
+	ld [hl], a
+	call BGEffect_FillLYOverridesBackup
+	ret
+
+.finish
+	call BattleAnim_ResetLCDStatCustom
+	ret
+
+BattleBGEffect_WobbleMon: ; c8ca2 (32:4ca2)
+	call BattleBGEffects_AnonJumptable
+.anon_dw
+	dw .zero
+	dw .one
+	dw .two
+
+
+.zero ; c8cab (32:4cab)
+	call BattleBGEffects_IncrementJumptable
+	call BattleBGEffects_ClearLYOverrides
+	ld a, rSCX - $ff00
+	ld [hLCDCPointer], a
+	xor a
+	ld [hLYOverrideStart], a
+	ld a, $37
+	ld [hLYOverrideEnd], a
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld [hl], $0
+	ret
+
+.one ; c8cc3 (32:4cc3)
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld a, [hl]
+	cp $40
+	jr nc, .two
+	ld d, $6
+	call BattleBGEffects_Sine
+	call BGEffect_FillLYOverridesBackup
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld a, [hl]
+	add $2
+	ld [hl], a
+	ret
+
+.two ; c8cdd (32:4cdd)
+	call BattleAnim_ResetLCDStatCustom
+	ret
+
+BattleBGEffect_2e: ; c8ce1 (32:4ce1)
+	call Functionc8d0b
+	jr c, .xor_a
+	bit 7, a
+	jr z, .okay
+.xor_a
+	xor a
+.okay
+	push af
+	call DelayFrame
+	pop af
+	ld [hSCY], a
+	xor $ff
+	inc a
+	ld [AnimObject01_YOffset], a
+	ret
+
+BattleBGEffect_1f: ; c8cf9 (32:4cf9)
+	call Functionc8d0b
+	jr nc, .skip
+	xor a
+.skip
+	ld [hSCX], a
+	ret
+
+BattleBGEffect_20: ; c8d02 (32:4d02)
+	call Functionc8d0b
+	jr nc, .skip
+	xor a
+.skip
+	ld [hSCY], a
+	ret
+
+Functionc8d0b: ; c8d0b (32:4d0b)
+	ld hl, BG_EFFECT_STRUCT_JT_INDEX
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr nz, .okay
+	call EndBattleBGEffect
+	scf
+	ret
+
+.okay
+	dec [hl]
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld a, [hl]
+	and $f
+	jr z, .every_16_frames
+	dec [hl]
+	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
+	add hl, bc
+	ld a, [hl]
+	and a
+	ret
+
+.every_16_frames
+	ld a, [hl]
+	swap a
+	or [hl]
+	ld [hl], a
+	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
+	add hl, bc
+	ld a, [hl]
+	xor $ff
+	inc a
+	ld [hl], a
+	and a
+	ret
+
+BattleBGEffect_35: ; c8d3a (32:4d3a)
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld a, [hl]
+	cp $40
+	jr nc, .finish
+	ld d, $6
+	call BattleBGEffects_Sine
+	ld [hSCX], a
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld a, [hl]
+	add $2
+	ld [hl], a
+	ret
+
+.finish
+	xor a
+	ld [hSCX], a
+	ret
+
+BattleBGEffect_GetNthDMGPal: ; c8d57 (32:4d57)
+	ld hl, BG_EFFECT_STRUCT_JT_INDEX
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr z, .zero
+	dec [hl]
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld a, [hl]
+	call BattleBGEffect_GetNextDMGPal
+	ret
+
+.zero
+	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
+	add hl, bc
+	ld a, [hl]
+	ld hl, BG_EFFECT_STRUCT_JT_INDEX
+	add hl, bc
+	ld [hl], a
+	call BattleBGEffect_GetFirstDMGPal
+	ret
+
+BGEffect_RapidCyclePals: ; c8d77 (32:4d77)
+	ld a, [hCGB]
+	and a
+	jr nz, .cgb
+	push de
+	ld de, .Jumptable_DMG
+	call BatttleBGEffects_GetNamedJumptablePointer
+	pop de
+	jp hl
+
+.Jumptable_DMG:
+	dw .zero_dmg
+	dw .one_dmg
+	dw .two_dmg
+
+
+.zero_dmg ; c8d8b (32:4d8b)
+	call BattleBGEffects_IncrementJumptable
+	ld a, $e4
+	call BattleBGEffects_SetLYOverrides
+	ld a, $47
+	call BattleBGEffect_SetLCDStatCustoms1
+	ld a, [hLYOverrideEnd]
+	inc a
+	ld [hLYOverrideEnd], a
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld a, [hl]
+	ld [hl], $0
+	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
+	add hl, bc
+	ld [hl], a
+	ret
+
+.one_dmg ; c8daa (32:4daa)
+	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
+	add hl, bc
+	ld a, [hl]
+	and $f
+	jr z, .okay_1_dmg
+	dec [hl]
+	ret
+
+.okay_1_dmg
+	ld a, [hl]
+	swap a
+	or [hl]
+	ld [hl], a
+	call BattleBGEffect_GetFirstDMGPal
+	jr c, .okay_2_dmg
+	call BGEffect_FillLYOverridesBackup
+	ret
+
+.okay_2_dmg
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	dec [hl]
+	ret
+
+.two_dmg ; c8dc9 (32:4dc9)
+	call BattleBGEffects_ResetVideoHRAM
+	ld a, %11100100
+	ld [rBGP], a
+	call EndBattleBGEffect
+	ret
+
+.cgb
+	push de
+	ld de, .Jumptable_CGB
+	call BatttleBGEffects_GetNamedJumptablePointer
+	pop de
+	jp hl
+
+.Jumptable_CGB: ; c8ddd (32:4ddd)
+	dw .zero_cgb
+	dw .one_cgb
+	dw .two_cgb
+	dw .three_cgb
+	dw .four_cgb
+
+
+.zero_cgb ; c8de7 (32:4de7)
+	call BGEffect_CheckBattleTurn
+	jr nz, .player_turn_cgb
+	call BattleBGEffects_IncrementJumptable
+	call BattleBGEffects_IncrementJumptable
+.player_turn_cgb
+	call BattleBGEffects_IncrementJumptable
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld a, [hl]
+	ld [hl], $0
+	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
+	add hl, bc
+	ld [hl], a
+	ret
+
+.one_cgb ; c8e02 (32:4e02)
+	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
+	add hl, bc
+	ld a, [hl]
+	and $f
+	jr z, .okay_1_cgb
+	dec [hl]
+	ret
+
+.okay_1_cgb
+	ld a, [hl]
+	swap a
+	or [hl]
+	ld [hl], a
+	call BattleBGEffect_GetFirstDMGPal
+	jr c, .okay_2_cgb
+	call BGEffects_LoadBGPal0_OBPal1
+	ret
+
+.okay_2_cgb
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	dec [hl]
+	ret
+
+.two_cgb ; c8e21 (32:4e21)
+	ld a, $e4
+	call BGEffects_LoadBGPal0_OBPal1
+	call EndBattleBGEffect
+	ret
+
+.three_cgb ; c8e2a (32:4e2a)
+	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
+	add hl, bc
+	ld a, [hl]
+	and $f
+	jr z, .okay_3_cgb
+	dec [hl]
+	ret
+
+.okay_3_cgb
+	ld a, [hl]
+	swap a
+	or [hl]
+	ld [hl], a
+	call BattleBGEffect_GetFirstDMGPal
+	jr c, .okay_4_cgb
+	call BGEffects_LoadBGPal1_OBPal0
+	ret
+
+.okay_4_cgb
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	dec [hl]
+	ret
+
+.four_cgb ; c8e49 (32:4e49)
+	ld a, $e4
+	call BGEffects_LoadBGPal1_OBPal0
+	call EndBattleBGEffect
+	ret
+
+BGEffects_LoadBGPal0_OBPal1: ; c8e52 (32:4e52)
+	ld h, a
+	ld a, [rSVBK]
+	push af
+	ld a, $5
+	ld [rSVBK], a
+	ld a, h
+	push bc
+	push af
+	ld hl, BGPals
+	ld de, UnknBGPals
+	ld b, a
+	ld c, $1
+	call CopyPals
+	ld hl, OBPals + 8
+	ld de, UnknOBPals + 8
+	pop af
+	ld b, a
+	ld c, $1
+	call CopyPals
+	pop bc
+	pop af
+	ld [rSVBK], a
+	ld a, $1
+	ld [hCGBPalUpdate], a
+	ret
+
+BGEffects_LoadBGPal1_OBPal0: ; c8e7f (32:4e7f)
+	ld h, a
+	ld a, [rSVBK]
+	push af
+	ld a, $5
+	ld [rSVBK], a
+	ld a, h
+	push bc
+	push af
+	ld hl, BGPals + 8
+	ld de, UnknBGPals + 8
+	ld b, a
+	ld c, $1
+	call CopyPals
+	ld hl, OBPals ; OBPals
+	ld de, UnknOBPals ; wd040
+	pop af
+	ld b, a
+	ld c, $1
+	call CopyPals
+	pop bc
+	pop af
+	ld [rSVBK], a
+	ld a, $1
+	ld [hCGBPalUpdate], a
+	ret
+
+BattleBGEffect_GetFirstDMGPal: ; c8eac (32:4eac)
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld a, [hl]
+	inc [hl]
+BattleBGEffect_GetNextDMGPal: ; c8eb2 (32:4eb2)
+	ld l, a
+	ld h, $0
+	add hl, de
+	ld a, [hl]
+	cp -1
+	jr z, .quit
+	cp -2
+	jr nz, .repeat
+	ld a, [de]
+	ld hl, BG_EFFECT_STRUCT_03
+	add hl, bc
+	ld [hl], $0
+.repeat
+	and a
+	ret
+
+.quit
+	scf
+	ret
+
+BattleBGEffects_ClearLYOverrides: ; c8eca (32:4eca)
+	xor a
+BattleBGEffects_SetLYOverrides: ; c8ecb (32:4ecb)
+	ld hl, LYOverrides ; wListPointer
+	ld e, $99
+.loop1
+	ld [hli], a
+	dec e
+	jr nz, .loop1
+	ld hl, LYOverridesBackup
+	ld e, $91
+.loop2
+	ld [hli], a
+	dec e
+	jr nz, .loop2
+	ret
+
+BattleBGEffect_SetLCDStatCustoms1: ; c8ede (32:4ede)
+	ld [hLCDCPointer], a
+	call BGEffect_CheckBattleTurn
+	jr nz, .player_turn
+	lb de, $00, $36
+	jr .okay
+
+.player_turn
+	lb de, $2f, $5e
+.okay
+	ld a, d
+	ld [hLYOverrideStart], a
+	ld a, e
+	ld [hLYOverrideEnd], a
+	ret
+
+BattleBGEffect_SetLCDStatCustoms2: ; c8ef4 (32:4ef4)
+	ld [hLCDCPointer], a
+	call BGEffect_CheckBattleTurn
+	jr nz, .player_turn
+	lb de, $00, $36
+	jr .okay
+
+.player_turn
+	lb de, $2d, $5e
+.okay
+	ld a, d
+	ld [hLYOverrideStart], a
+	ld a, e
+	ld [hLYOverrideEnd], a
+	ret
+
+BattleAnim_ResetLCDStatCustom: ; c8f0a (32:4f0a)
+	xor a
+	ld [hLYOverrideStart], a
+	ld [hLYOverrideEnd], a
+	call BattleBGEffects_ClearLYOverrides
+	xor a
+	ld [hLCDCPointer], a
+	call EndBattleBGEffect
+	ret
+
+BattleBGEffects_ResetVideoHRAM: ; c8f19 (32:4f19)
+	xor a
+	ld [hLCDCPointer], a
+	ld a, %11100100
+	ld [rBGP], a
+	ld [wBGP], a
+	ld [wOBP1], a
+	ld [hLYOverrideStart], a
+	ld [hLYOverrideEnd], a
+	call BattleBGEffects_ClearLYOverrides
+	ret
+
+Functionc8f2e: ; c8f2e (32:4f2e)
+	push bc
+	xor a
+	ld [wBattleAnimTemp0], a
+	ld a, e
+	ld [wBattleAnimTemp1], a
+	ld a, d
+	ld [wBattleAnimTemp2], a
+	ld a, $80
+	ld [wBattleAnimTemp3], a
+	ld bc, LYOverridesBackup
+.loop
+	ld a, [hLYOverrideStart]
+	cp c
+	jr nc, .next
+	ld a, [hLYOverrideEnd]
+	cp c
+	jr c, .next
+	ld a, [wBattleAnimTemp2]
+	ld d, a
+	ld a, [wBattleAnimTemp0]
+	call BattleBGEffects_Sine
+	ld [bc], a
+.next
+	inc bc
+	ld a, [wBattleAnimTemp1]
+	ld hl, wBattleAnimTemp0
+	add [hl]
+	ld [hl], a
+	ld hl, wBattleAnimTemp3
+	dec [hl]
+	jr nz, .loop
+	pop bc
+	ret
+
+InitSurfWaves: ; c8f69 (32:4f69)
+	push bc
+	xor a
+	ld [wBattleAnimTemp0], a
+	ld a, e
+	ld [wBattleAnimTemp1], a
+	ld a, d
+	ld [wBattleAnimTemp2], a
+	ld a, $40
+	ld [wBattleAnimTemp3], a
+	ld bc, wSurfWaveBGEffect
+.loop
+	ld a, [wBattleAnimTemp2]
+	ld d, a
+	ld a, [wBattleAnimTemp0]
+	call BattleBGEffects_Sine
+	ld [bc], a
+	inc bc
+	ld a, [wBattleAnimTemp1]
+	ld hl, wBattleAnimTemp0
+	add [hl]
+	ld [hl], a
+	ld hl, wBattleAnimTemp3
+	dec [hl]
+	jr nz, .loop
+	pop bc
+	ret
+
+Functionc8f9a: ; c8f9a (32:4f9a)
+	push bc
+	ld [wBattleAnimTemp3], a
+	ld a, e
+	ld [wBattleAnimTemp1], a
+	ld a, d
+	ld [wBattleAnimTemp2], a
+	call .GetLYOverrideBackupAddrOffset
+	ld hl, LYOverridesBackup
+	add hl, de
+	ld c, l
+	ld b, h
+.loop
+	ld a, [wBattleAnimTemp3]
+	and a
+	jr z, .done
+	dec a
+	ld [wBattleAnimTemp3], a
+	push af
+	ld a, [wBattleAnimTemp2]
+	ld d, a
+	ld a, [wBattleAnimTemp1]
+	push hl
+	call BattleBGEffects_Sine
+	ld e, a
+	pop hl
+	ld a, [hLYOverrideEnd]
+	cp c
+	jr c, .skip1
+	ld a, e
+	ld [bc], a
+	inc bc
+.skip1
+	ld a, [hLYOverrideStart]
+	cp l
+	jr nc, .skip2
+	ld [hl], e
+	dec hl
+.skip2
+	ld a, [wBattleAnimTemp1]
+	add $4
+	ld [wBattleAnimTemp1], a
+	pop af
+	jr .loop
+
+.done
+	pop bc
+	and a
+	ret
+
+.GetLYOverrideBackupAddrOffset:
+	ld a, [hLYOverrideStart]
+	ld e, a
+	ld a, [wBattleAnimTemp0]
+	add e
+	ld e, a
+	ld d, $0
+	ret
+
+BattleBGEffect_WavyScreenFX: ; c8fef (32:4fef)
+	push bc
+	ld a, [hLYOverrideStart]
+	ld l, a
+	inc a
+	ld e, a
+	ld h, HIGH(LYOverridesBackup)
+	ld d, h
+	ld a, [hLYOverrideEnd]
+	sub l
+	and a
+	jr z, .done
+	ld c, a
+	ld a, [hl]
+	push af
+.loop
+	ld a, [de]
+	inc de
+	ld [hli], a
+	dec c
+	jr nz, .loop
+	pop af
+	ld [hl], a
+.done
+	pop bc
+	ret
+
+BGEffect_FillLYOverridesBackup: ; c900b (32:500b)
+	push af
+	ld h, HIGH(LYOverridesBackup)
+	ld a, [hLYOverrideStart]
+	ld l, a
+	ld a, [hLYOverrideEnd]
+	sub l
+	ld d, a
+	pop af
+.loop
+	ld [hli], a
+	dec d
+	jr nz, .loop
+	ret
+
+BGEffect_DisplaceLYOverridesBackup: ; c901b (32:501b)
+	; e = a; d = [hLYOverrideEnd] - [hLYOverrideStart] - a
+	push af
+	ld e, a
+	ld a, [hLYOverrideStart]
+	ld l, a
+	ld a, [hLYOverrideEnd]
+	sub l
+	sub e
+	ld d, a
+	ld h, HIGH(LYOverridesBackup)
+	ld a, [hLYOverrideStart]
+	ld l, a
+	ld a, $90
+.loop
+	ld [hli], a
+	dec e
+	jr nz, .loop
+	pop af
+	xor $ff
+.loop2
+	ld [hli], a
+	dec d
+	jr nz, .loop2
+	ret
+
+BGEffect_CheckBattleTurn: ; c9038 (32:5038)
+	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
+	add hl, bc
+	ld a, [hBattleTurn]
+	and $1
+	xor [hl]
+	ret
+
+BGEffect_CheckFlyDigStatus: ; c9042 (32:5042)
+	ld hl, BG_EFFECT_STRUCT_BATTLE_TURN
+	add hl, bc
+	ld a, [hBattleTurn]
+	and $1
+	xor [hl]
+	jr nz, .player
+	ld a, [EnemySubStatus3] ; EnemySubStatus3
+	and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
+	ret
+
+.player
+	ld a, [PlayerSubStatus3] ; PlayerSubStatus3
+	and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
+	ret
+
+BattleBGEffects_CheckSGB: ; c9059 (32:5059)
+	ld a, [hSGB]
+	and a
+	ret
+
+BattleBGEffects_Sine: ; c905d (32:505d)
+	ld e, a
+	callfar BattleAnim_Sine_e
+	ld a, e
+	ret
+
+BattleBGEffects_Cosine: ; c9066 (32:5066)
+	ld e, a
+	callfar BattleAnim_Cosine_e
+	ld a, e
+	ret
+
+; c906f (32:506f)
--- /dev/null
+++ b/engine/anims/engine.asm
@@ -1,0 +1,314 @@
+QueueBattleAnimation: ; cc9a1 (33:49a1)
+	ld hl, ActiveAnimObjects
+	ld e, 10
+.loop
+	ld a, [hl]
+	and a
+	jr z, .done
+	ld bc, BATTLEANIMSTRUCT_LENGTH
+	add hl, bc
+	dec e
+	jr nz, .loop
+	scf
+	ret
+
+.done
+	ld c, l
+	ld b, h
+	ld hl, wNumActiveBattleAnims
+	inc [hl]
+	call InitBattleAnimation
+	ret
+
+DeinitBattleAnimation: ; cc9bd
+	ld hl, BATTLEANIMSTRUCT_INDEX
+	add hl, bc
+	ld [hl], $0
+	ret
+
+; cc9c4
+
+InitBattleAnimation: ; cc9c4 (33:49c4)
+	ld a, [wBattleAnimTemp0]
+	ld e, a
+	ld d, 0
+	ld hl, BattleAnimObjects
+rept 6
+	add hl, de
+endr
+	ld e, l
+	ld d, h
+	ld hl, BATTLEANIMSTRUCT_INDEX
+	add hl, bc
+	ld a, [wNumActiveBattleAnims]
+	ld [hli], a ; Index
+	ld a, [de]
+	inc de
+	ld [hli], a ; 01
+	ld a, [de]
+	inc de
+	ld [hli], a ; 02
+	ld a, [de]
+	inc de
+	ld [hli], a ; Frameset ID
+	ld a, [de]
+	inc de
+	ld [hli], a ; Function
+	ld a, [de]
+	inc de
+	ld [hli], a ; 05
+	ld a, [de]
+	call GetBattleAnimTileOffset
+	ld [hli], a ; Tile ID
+	ld a, [wBattleAnimTemp1]
+	ld [hli], a ; X Coord
+	ld a, [wBattleAnimTemp2]
+	ld [hli], a ; Y Coord
+	xor a
+	ld [hli], a ; X Offset
+	ld [hli], a ; Y Offset
+	ld a, [wBattleAnimTemp3]
+	ld [hli], a ; 0b
+	xor a
+	ld [hli], a ; 0c
+	dec a
+	ld [hli], a ; 0d
+	xor a
+	ld [hli], a ; 0e
+	ld [hli], a ; 0f
+	ld [hl], a  ; 10
+	ret
+
+BattleAnimOAMUpdate: ; cca09
+	call InitBattleAnimBuffer
+	call GetBattleAnimFrame
+	cp -3
+	jp z, .done
+	cp -4
+	jp z, .delete
+	push af
+	ld hl, wBattleAnimTempOAMFlags
+	ld a, [wBattleAnimTemp7]
+	xor [hl]
+	and $e0
+	ld [hl], a
+	pop af
+	push bc
+	call GetBattleAnimOAMPointer
+	ld a, [wBattleAnimTempTileID]
+	add [hl]
+	ld [wBattleAnimTempTileID], a
+	inc hl
+	ld a, [hli]
+	ld c, a
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	ld a, [wBattleAnimOAMPointerLo]
+	ld e, a
+	ld d, HIGH(Sprites)
+.loop
+	ld a, [wBattleAnimTempYCoord]
+	ld b, a
+	ld a, [wBattleAnimTempYOffset]
+	add b
+	ld b, a
+	push hl
+	ld a, [hl]
+	ld hl, wBattleAnimTempOAMFlags
+	bit 6, [hl]
+	jr z, .no_yflip
+	add $8
+	xor $ff
+	inc a
+
+.no_yflip
+	pop hl
+	add b
+	ld [de], a
+	inc hl
+	inc de
+	ld a, [wBattleAnimTempXCoord]
+	ld b, a
+	ld a, [wBattleAnimTempXOffset]
+	add b
+	ld b, a
+	push hl
+	ld a, [hl]
+	ld hl, wBattleAnimTempOAMFlags
+	bit 5, [hl]
+	jr z, .no_xflip
+	add $8
+	xor $ff
+	inc a
+
+.no_xflip
+	pop hl
+	add b
+	ld [de], a
+	inc hl
+	inc de
+	ld a, [wBattleAnimTempTileID]
+	add $31
+	add [hl]
+	ld [de], a
+	inc hl
+	inc de
+	ld a, [wBattleAnimTempOAMFlags]
+	ld b, a
+	ld a, [hl]
+	xor b
+	and $e0
+	ld b, a
+	ld a, [hl]
+	and $10
+	or b
+	ld b, a
+	ld a, [wBattleAnimTempPalette]
+	and $f
+	or b
+	ld [de], a
+	inc hl
+	inc de
+	ld a, e
+	ld [wBattleAnimOAMPointerLo], a
+	cp $a0
+	jr nc, .exit_set_carry
+	dec c
+	jr nz, .loop
+	pop bc
+	jr .done
+
+.delete
+	call DeinitBattleAnimation
+
+.done
+	and a
+	ret
+
+.exit_set_carry
+	pop bc
+	scf
+	ret
+
+; ccaaa
+
+InitBattleAnimBuffer: ; ccaaa
+	ld hl, BATTLEANIMSTRUCT_01
+	add hl, bc
+	ld a, [hl]
+	and %10000000
+	ld [wBattleAnimTempOAMFlags], a
+	xor a
+	ld [wBattleAnimTemp7], a
+	ld hl, BATTLEANIMSTRUCT_PALETTE
+	add hl, bc
+	ld a, [hl]
+	ld [wBattleAnimTempPalette], a
+	ld hl, BATTLEANIMSTRUCT_02
+	add hl, bc
+	ld a, [hl]
+	ld [wBattleAnimTemp1], a
+	ld hl, BATTLEANIMSTRUCT_TILEID
+	add hl, bc
+	ld a, [hli]
+	ld [wBattleAnimTempTileID], a
+	ld a, [hli]
+	ld [wBattleAnimTempXCoord], a
+	ld a, [hli]
+	ld [wBattleAnimTempYCoord], a
+	ld a, [hli]
+	ld [wBattleAnimTempXOffset], a
+	ld a, [hli]
+	ld [wBattleAnimTempYOffset], a
+	ld a, [hBattleTurn]
+	and a
+	ret z
+	ld hl, BATTLEANIMSTRUCT_01
+	add hl, bc
+	ld a, [hl]
+	ld [wBattleAnimTempOAMFlags], a
+	bit 0, [hl]
+	ret z
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld a, [hli]
+	ld d, a
+	ld a, (-10 * 8) + 4
+	sub d
+	ld [wBattleAnimTempXCoord], a
+	ld a, [hli]
+	ld d, a
+	ld a, [wBattleAnimTemp1]
+	cp $ff
+	jr nz, .check_kinesis_softboiled_milkdrink
+	ld a, 5 * 8
+	add d
+	jr .done
+
+.check_kinesis_softboiled_milkdrink
+	sub d
+	push af
+	ld a, [FXAnimID + 1]
+	or a
+	jr nz, .no_sub
+	ld a, [FXAnimID]
+	cp KINESIS
+	jr z, .kinesis
+	cp SOFTBOILED
+	jr z, .softboiled
+	cp MILK_DRINK
+	jr nz, .no_sub
+.kinesis
+.softboiled
+.milk_drink
+	pop af
+	sub 1 * 8
+	jr .done
+
+.no_sub
+	pop af
+.done
+	ld [wBattleAnimTempYCoord], a
+	ld a, [hli]
+	xor $ff
+	inc a
+	ld [wBattleAnimTempXOffset], a
+	ret
+
+; ccb31
+
+GetBattleAnimTileOffset: ; ccb31 (33:4b31)
+	push hl
+	push bc
+	ld hl, wBattleAnimTileDict
+	ld b, a
+	ld c, 10 / 2
+.loop
+	ld a, [hli]
+	cp b
+	jr z, .load
+	inc hl
+	dec c
+	jr nz, .loop
+	xor a
+	jr .done
+
+.load
+	ld a, [hl]
+.done
+	pop bc
+	pop hl
+	ret
+
+_ExecuteBGEffects: ; ccb48
+	callfar ExecuteBGEffects
+	ret
+
+; ccb4f
+
+_QueueBGEffect: ; ccb4f (33:4b4f)
+	callfar QueueBGEffect
+	ret
+
+; ccb56 (33:4b56)
--- /dev/null
+++ b/engine/anims/functions.asm
@@ -1,0 +1,4157 @@
+DoBattleAnimFrame: ; ccfbe
+	ld hl, BATTLEANIMSTRUCT_FUNCTION
+	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
+; ccfce
+
+.Jumptable:
+; entries correspond to BATTLEANIMFUNC_* constants
+	dw BattleAnimFunction_Null ; 00
+	dw BattleAnimFunction_01 ; 01
+	dw BattleAnimFunction_02 ; 02
+	dw BattleAnimFunction_03 ; 03
+	dw BattleAnimFunction_04 ; 04
+	dw BattleAnimFunction_ThrowFromPlayerToEnemy ; 05
+	dw BattleAnimFunction_ThrowFromPlayerToEnemyAndDisappear ; 06
+	dw BattleAnimFunction_07 ; 07
+	dw BattleAnimFunction_08 ; 08
+	dw BattleAnimFunction_09 ; 09
+	dw BattleAnimFunction_0A ; 0a
+	dw BattleAnimFunction_RazorLeaf ; 0b
+	dw BattleAnimFunction_0C ; 0c
+	dw BattleAnimFunction_0D ; 0d
+	dw BattleAnimFunction_0E ; 0e
+	dw BattleAnimFunction_0F ; 0f
+	dw BattleAnimFunction_10 ; 10
+	dw BattleAnimFunction_11 ; 11
+	dw BattleAnimFunction_PokeBall ; 12
+	dw BattleAnimFunction_PokeBallBlocked ; 13
+	dw BattleAnimFunction_14 ; 14
+	dw BattleAnimFunction_15 ; 15
+	dw BattleAnimFunction_16 ; 16
+	dw BattleAnimFunction_17 ; 17
+	dw BattleAnimFunction_18 ; 18
+	dw BattleAnimFunction_19 ; 19
+	dw BattleAnimFunction_1A ; 1a
+	dw BattleAnimFunction_1B ; 1b
+	dw BattleAnimFunction_1C ; 1c
+	dw BattleAnimFunction_1D ; 1d
+	dw BattleAnimFunction_1E ; 1e
+	dw BattleAnimFunction_1F ; 1f
+	dw BattleAnimFunction_LeechSeed ; 20
+	dw BattleAnimFunction_21 ; 21
+	dw BattleAnimFunction_22 ; 22
+	dw BattleAnimFunction_23 ; 23
+	dw BattleAnimFunction_24 ; 24
+	dw BattleAnimFunction_25 ; 25
+	dw BattleAnimFunction_26 ; 26
+	dw BattleAnimFunction_27 ; 27
+	dw BattleAnimFunction_28 ; 28
+	dw BattleAnimFunction_SpiralDescent ; 29
+	dw BattleAnimFunction_PoisonGas ; 2a
+	dw BattleAnimFunction_Horn ; 2b
+	dw BattleAnimFunction_2C ; 2c
+	dw BattleAnimFunction_2D ; 2d
+	dw BattleAnimFunction_2E ; 2e
+	dw BattleAnimFunction_2F ; 2f
+	dw BattleAnimFunction_30 ; 30
+	dw BattleAnimFunction_31 ; 31
+	dw BattleAnimFunction_32 ; 32
+	dw BattleAnimFunction_33 ; 33
+	dw BattleAnimFunction_34 ; 34
+	dw BattleAnimFunction_35 ; 35
+	dw BattleAnimFunction_36 ; 36
+	dw BattleAnimFunction_37 ; 37
+	dw BattleAnimFunction_38 ; 38
+	dw BattleAnimFunction_39 ; 39
+	dw BattleAnimFunction_3A ; 3a
+	dw BattleAnimFunction_3B ; 3b
+	dw BattleAnimFunction_3C ; 3c
+	dw BattleAnimFunction_3D ; 3d
+	dw BattleAnimFunction_3E ; 3e
+	dw BattleAnimFunction_3F ; 3f
+	dw BattleAnimFunction_40 ; 40
+	dw BattleAnimFunction_41 ; 41
+	dw BattleAnimFunction_42 ; 42
+	dw BattleAnimFunction_43 ; 43
+	dw BattleAnimFunction_44 ; 44
+	dw BattleAnimFunction_45 ; 45
+	dw BattleAnimFunction_46 ; 46
+	dw BattleAnimFunction_47 ; 47
+	dw BattleAnimFunction_48 ; 48
+	dw BattleAnimFunction_49 ; 49
+	dw BattleAnimFunction_4A ; 4a
+	dw BattleAnimFunction_4B ; 4b
+	dw BattleAnimFunction_4C ; 4c
+	dw BattleAnimFunction_4D ; 4d
+	dw BattleAnimFunction_4E ; 4e
+	dw BattleAnimFunction_4F ; 4f
+
+BattleAnimFunction_Null: ; cd06e (33:506e)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw .zero
+	dw .one
+.one
+	call DeinitBattleAnimation
+.zero
+	ret
+
+BattleAnimFunction_ThrowFromPlayerToEnemyAndDisappear: ; cd079 (33:5079)
+	call BattleAnimFunction_ThrowFromPlayerToEnemy
+	ret c
+	call DeinitBattleAnimation
+	ret
+
+BattleAnimFunction_ThrowFromPlayerToEnemy: ; cd081 (33:5081)
+	; If x coord at $88 or beyond, abort.
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld a, [hl]
+	cp $88
+	ret nc
+	; Move right 2 pixels
+	add $2
+	ld [hl], a
+	; Move down 1 pixel
+	ld hl, BATTLEANIMSTRUCT_YCOORD
+	add hl, bc
+	dec [hl]
+	; Decrease ??? and hold onto its previous value (argument of the sine function)
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	dec [hl]
+	; Get ???, which is the amplitude of the sine function
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld d, [hl]
+	call BattleAnim_Sine
+	; Store the result in the Y offset
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	; Carry flag denotes success
+	scf
+	ret
+
+BattleAnimFunction_04: ; cd0a6 (33:50a6)
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld a, [hl]
+	cp $88
+	jr c, .asm_cd0b3
+	call DeinitBattleAnimation
+	ret
+
+.asm_cd0b3
+	add $2
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_YCOORD
+	add hl, bc
+	dec [hl]
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	inc [hl]
+	inc [hl]
+	inc [hl]
+	inc [hl]
+	ld d, $10
+	push af
+	push de
+	call BattleAnim_Sine
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	pop de
+	pop af
+	call BattleAnim_Cosine
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	sra a
+	sra a
+	sra a
+	sra a
+	ld [hl], a
+	ret
+
+BattleAnimFunction_03: ; cd0e3 (33:50e3)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw .zero
+	dw .one
+.zero
+	call BattleAnim_IncAnonJumptableIndex
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	bit 7, [hl]
+	ld a, $0
+	jr z, .asm_cd0f9
+	ld a, $20
+.asm_cd0f9
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	and $7f
+	ld [hl], a
+.one
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld d, [hl]
+	push af
+	push de
+	call BattleAnim_Sine
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	pop de
+	pop af
+	call BattleAnim_Cosine
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	inc [hl]
+	ret
+
+BattleAnimFunction_01: ; cd12a (33:512a)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw .zero
+	dw .one
+.one
+	call DeinitBattleAnimation
+	ret
+
+.zero
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld a, [hl]
+	cp $84
+	ret nc
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	call Functionce70a
+	ret
+
+BattleAnimFunction_02: ; cd146 (33:5146)
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld a, [hl]
+	cp $84
+	jr nc, .asm_cd158
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	call Functionce70a
+	ret
+
+.asm_cd158
+	call DeinitBattleAnimation
+	ret
+
+BattleAnimFunction_PokeBall: ; cd15c (33:515c)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw .zero
+	dw .one
+	dw .two
+	dw .three
+	dw .four
+	dw .five
+	dw .six
+	dw .seven
+	dw .eight
+	dw .nine
+	dw .ten
+	dw .eleven
+.zero ; init
+	call GetBallAnimPal
+	call BattleAnim_IncAnonJumptableIndex
+	ret
+
+.one
+	call BattleAnimFunction_ThrowFromPlayerToEnemy
+	ret c
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld a, [hl]
+	ld hl, BATTLEANIMSTRUCT_YCOORD
+	add hl, bc
+	add [hl]
+	ld [hl], a
+	ld a, BATTLEANIMFRAMESET_0B
+	call ReinitBattleAnimFrameset
+	call BattleAnim_IncAnonJumptableIndex
+	ret
+
+.three
+	call BattleAnim_IncAnonJumptableIndex
+	ld a, BATTLEANIMFRAMESET_09
+	call ReinitBattleAnimFrameset
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], $0
+	inc hl
+	ld [hl], $10
+.four
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hli]
+	ld d, [hl]
+	call BattleAnim_Sine
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	dec a
+	ld [hl], a
+	and $1f
+	ret nz
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld a, [hl]
+	sub $4
+	ld [hl], a
+	ret nz
+	ld a, BATTLEANIMFRAMESET_0C
+	call ReinitBattleAnimFrameset
+	call BattleAnim_IncAnonJumptableIndex
+	ret
+
+.six
+	ld a, BATTLEANIMFRAMESET_0D
+	call ReinitBattleAnimFrameset
+	ld hl, BATTLEANIMSTRUCT_ANON_JT_INDEX
+	add hl, bc
+	dec [hl]
+.two
+.five
+.nine
+	ret
+
+.seven
+	call GetBallAnimPal
+	ld a, BATTLEANIMFRAMESET_0A
+	call ReinitBattleAnimFrameset
+	call BattleAnim_IncAnonJumptableIndex
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld [hl], $20
+.eight
+.ten
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hli]
+	ld d, [hl]
+	call BattleAnim_Sine
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	dec a
+	ld [hl], a
+	and $1f
+	jr z, .eleven
+	and $f
+	ret nz
+	call BattleAnim_IncAnonJumptableIndex
+	ret
+
+.eleven
+	call DeinitBattleAnimation
+	ret
+
+BattleAnimFunction_PokeBallBlocked: ; cd212 (33:5212)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw .zero
+	dw .one
+	dw .two
+.zero
+	call GetBallAnimPal
+	call BattleAnim_IncAnonJumptableIndex
+	ret
+
+.one
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld a, [hl]
+	cp $70
+	jr nc, .next
+	call BattleAnimFunction_ThrowFromPlayerToEnemy
+	ret
+
+.next
+	call BattleAnim_IncAnonJumptableIndex
+.two
+	ld hl, BATTLEANIMSTRUCT_YCOORD
+	add hl, bc
+	ld a, [hl]
+	cp $80
+	jr nc, .done
+	add $4
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	dec [hl]
+	dec [hl]
+	ret
+
+.done
+	call DeinitBattleAnimation
+	ret
+
+GetBallAnimPal: ; cd249 (33:5249)
+	ld hl, BallColors
+	ld a, [rSVBK]
+	push af
+	ld a, $1
+	ld [rSVBK], a
+	ld a, [CurItem] ; CurItem
+	ld e, a
+	pop af
+	ld [rSVBK], a
+.IsInArray:
+	ld a, [hli]
+	cp -1
+	jr z, .load
+	cp e
+	jr z, .load
+	inc hl
+	jr .IsInArray
+
+.load
+	ld a, [hl]
+	ld hl, BATTLEANIMSTRUCT_PALETTE
+	add hl, bc
+	ld [hl], a
+	ret
+; cd26c (33:526c)
+
+INCLUDE "data/anims/ball_colors.asm"
+
+BattleAnimFunction_10: ; cd284 (33:5284)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw .zero
+	dw .one
+	dw .two
+	dw .three
+	dw .four
+.zero
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	swap a
+	and $f
+	ld hl, BATTLEANIMSTRUCT_ANON_JT_INDEX
+	add hl, bc
+	ld [hl], a
+	ret
+
+.one
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld a, [hl]
+	cp $88
+	ret nc
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	call Functionce70a
+	ret
+
+.two
+	call DeinitBattleAnimation
+	ret
+
+.three
+	call BattleAnim_IncAnonJumptableIndex
+	ld a, BATTLEANIMFRAMESET_0F
+	call ReinitBattleAnimFrameset
+.four
+	ret
+
+BattleAnimFunction_07: ; cd2be (33:52be)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw .zero
+	dw .one
+.zero
+	call BattleAnim_IncAnonJumptableIndex
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], $30
+	inc hl
+	ld [hl], $48
+.one
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hli]
+	ld d, [hl]
+	call BattleAnim_Sine
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	inc [hl]
+	ld a, [hl]
+	and $3f
+	ret nz
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], $20
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld a, [hl]
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	sub [hl]
+	jr z, .done
+	jr c, .done
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld [hl], a
+	ret
+
+.done
+	call DeinitBattleAnimation
+	ret
+
+BattleAnimFunction_08: ; cd306 (33:5306)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw .zero
+	dw .one
+	dw .two
+	dw .three
+.zero
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld a, [hl]
+	cp $80
+	jr nc, .next
+	call .SetCoords
+	ret
+
+.next
+	call BattleAnim_IncAnonJumptableIndex
+.one
+	call BattleAnim_IncAnonJumptableIndex
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], $0
+.two
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	cp $40
+	jr nc, .loop_back
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	ld d, $18
+	call BattleAnim_Cosine
+	sub $18
+	sra a
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	ld d, $18
+	call BattleAnim_Sine
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	and $f
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	add [hl]
+	ld [hl], a
+	ret
+
+.loop_back
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	and $f0
+	jr z, .finish
+	sub $10
+	ld d, a
+	ld a, [hl]
+	and $f
+	or d
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_ANON_JT_INDEX
+	add hl, bc
+	dec [hl]
+	ret
+
+.finish
+	call BattleAnim_IncAnonJumptableIndex
+.three
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld a, [hl]
+	cp $b0
+	jr c, .retain
+	call DeinitBattleAnimation
+	ret
+
+.retain
+	call .SetCoords
+	ret
+
+.SetCoords:
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	and $f
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	add [hl]
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	and $f
+	ld e, a
+	srl e
+	ld hl, BATTLEANIMSTRUCT_YCOORD
+	add hl, bc
+.loop
+	dec [hl]
+	dec e
+	jr nz, .loop
+	ret
+
+BattleAnimFunction_09: ; cd3ae (33:53ae)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw .zero
+	dw .one
+	dw .two
+.zero
+	call BattleAnim_IncAnonJumptableIndex
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], $0
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	and $f
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld [hl], a
+.one
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr z, .done_one
+	dec [hl]
+	ret
+
+.done_one
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	swap a
+	and $f
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld a, [hl]
+	xor $ff
+	inc a
+	ld [hl], a
+	ret
+
+.two
+	call DeinitBattleAnimation
+	ret
+
+BattleAnimFunction_0A: ; cd3f2 (33:53f2)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw .zero
+	dw .one
+	dw .two
+	dw .three
+	dw .four
+	dw .five
+	dw .six
+	dw .seven
+	dw .eight
+	dw .nine
+.zero
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	ld hl, BATTLEANIMSTRUCT_ANON_JT_INDEX
+	add hl, bc
+	ld [hl], a
+	cp $7
+	jr z, .seven
+	ld a, BATTLEANIMFRAMESET_11
+	call ReinitBattleAnimFrameset
+	ret
+
+.seven
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld a, [hl]
+	cp $88
+	jr nc, .set_up_eight
+	add $2
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_YCOORD
+	add hl, bc
+	dec [hl]
+	ret
+
+.set_up_eight
+	call BattleAnim_IncAnonJumptableIndex
+	ld a, BATTLEANIMFRAMESET_10
+	call ReinitBattleAnimFrameset
+.eight
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	ld d, $10
+	push af
+	push de
+	call BattleAnim_Sine
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	pop de
+	pop af
+	call BattleAnim_Cosine
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	inc [hl]
+	ret
+
+.nine
+	call DeinitBattleAnimation
+	ret
+
+.one
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	dec [hl]
+	ret
+
+.four
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	inc [hl]
+.two
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	dec [hl]
+	ret
+
+.five
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	inc [hl]
+.three
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	inc [hl]
+.six
+	ret
+
+BattleAnimFunction_RazorLeaf: ; cd478 (33:5478)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw .zero
+	dw .one
+	dw .two
+	dw .three
+	dw .four
+	dw .five
+	dw .six
+	dw .seven
+	dw .eight
+.zero
+	call BattleAnim_IncAnonJumptableIndex
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], $40
+.one
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	cp $30
+	jr nc, .sine_cosine
+	call BattleAnim_IncAnonJumptableIndex
+	xor a
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hli], a
+	ld [hl], a
+	ld a, BATTLEANIMFRAMESET_17
+	call ReinitBattleAnimFrameset
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	bit 6, [hl]
+	ret z
+	ld hl, BATTLEANIMSTRUCT_FRAME
+	add hl, bc
+	ld [hl], $5
+	ret
+
+.sine_cosine
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	and $3f
+	ld d, a
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	dec [hl]
+	call BattleAnim_Sine
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	call Functioncd557
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld a, [hl]
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld h, [hl]
+	ld l, a
+	add hl, de
+	ld e, l
+	ld d, h
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld [hl], d
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld [hl], e
+	ret
+
+.two
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld a, [hl]
+	cp $20
+	jr nz, .sine_cosine_2
+	call DeinitBattleAnimation
+	ret
+
+.sine_cosine_2
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	ld d, $10
+	call BattleAnim_Sine
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	bit 6, [hl]
+	jr nz, .decrease
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	inc [hl]
+	jr .finish
+
+.decrease
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	dec [hl]
+.finish
+	ld de, $80
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld a, [hl]
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld h, [hl]
+	ld l, a
+	add hl, de
+	ld e, l
+	ld d, h
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], d
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld [hl], e
+	ret
+
+.three
+	ld a, BATTLEANIMFRAMESET_16
+	call ReinitBattleAnimFrameset
+	ld hl, BATTLEANIMSTRUCT_01
+	add hl, bc
+	res 5, [hl]
+.four
+.five
+.six
+.seven
+	call BattleAnim_IncAnonJumptableIndex
+	ret
+
+.eight
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld a, [hl]
+	cp $c0
+	ret nc
+	ld a, $8
+	call Functionce70a
+	ret
+
+Functioncd557: ; cd557 (33:5557)
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	bit 7, a
+	jr nz, .negative
+	cp $20
+	jr nc, .plus_256
+	cp $18
+	jr nc, .plus_384
+	ld de, $200
+	ret
+
+.plus_384
+	ld de, $180
+	ret
+
+.plus_256
+	ld de, $100
+	ret
+
+.negative
+	and $3f
+	cp $20
+	jr nc, .minus_256
+	cp $18
+	jr nc, .minus_384
+	ld de, -$200
+	ret
+
+.minus_384
+	ld de, -$180
+	ret
+
+.minus_256
+	ld de, -$100
+	ret
+
+BattleAnimFunction_4E: ; cd58a (33:558a)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw .zero
+	dw .one
+.zero
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	and $40
+	rlca
+	rlca
+	add $19
+	ld hl, BATTLEANIMSTRUCT_FRAMESET_ID
+	add hl, bc
+	ld [hl], a
+	call BattleAnim_IncAnonJumptableIndex
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], $40
+.one
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	cp $30
+	jr nc, .sine_cosine
+	call DeinitBattleAnimation
+	ret
+
+.sine_cosine
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	and $3f
+	ld d, a
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	dec [hl]
+	call BattleAnim_Sine
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	call Functioncd557
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld a, [hl]
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld h, [hl]
+	ld l, a
+	add hl, de
+	ld e, l
+	ld d, h
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld [hl], d
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld [hl], e
+	ret
+
+BattleAnimFunction_0C: ; cd5e9 (33:55e9)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw .zero
+	dw .one
+	dw .two
+.zero
+	call BattleAnim_IncAnonJumptableIndex
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], $c
+.one
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr z, .next
+	dec [hl]
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	call Functionce70a
+	ret
+
+.next
+	call BattleAnim_IncAnonJumptableIndex
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], $0
+	ld a, BATTLEANIMFRAMESET_22
+	call ReinitBattleAnimFrameset
+.two
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld a, [hl]
+	cp $98
+	jr nc, .okay
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld h, [hl]
+	ld l, a
+	ld de, $60
+	add hl, de
+	ld e, l
+	ld d, h
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], e
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld [hl], d
+.okay
+	ld hl, BATTLEANIMSTRUCT_YCOORD
+	add hl, bc
+	ld a, [hl]
+	cp $20
+	ret c
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	and $f0
+	ld e, a
+	ld d, $ff
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld a, [hl]
+	ld hl, BATTLEANIMSTRUCT_YCOORD
+	add hl, bc
+	ld h, [hl]
+	ld l, a
+	add hl, de
+	ld e, l
+	ld d, h
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld [hl], e
+	ld hl, BATTLEANIMSTRUCT_YCOORD
+	add hl, bc
+	ld [hl], d
+	ret
+
+BattleAnimFunction_0D: ; cd66a (33:566a)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw .zero
+	dw .one
+	dw .two
+	dw .three
+	dw .four
+.zero
+	call BattleAnim_IncAnonJumptableIndex
+	ld a, rSCY - $ff00
+	ld [hLCDCPointer], a
+	ld a, $58
+	ld [hLYOverrideStart], a
+	ld a, $5e
+	ld [hLYOverrideEnd], a
+	ret
+
+.one
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld e, [hl]
+	ld hl, BATTLEANIMSTRUCT_YCOORD
+	add hl, bc
+	ld a, [hl]
+	cp e
+	jr nc, .asm_cd69b
+	call BattleAnim_IncAnonJumptableIndex
+	xor a
+	ld [hLYOverrideStart], a
+	ret
+
+.asm_cd69b
+	dec a
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	ld d, $10
+	call BattleAnim_Sine
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_YCOORD
+	add hl, bc
+	add [hl]
+	sub $10
+	ret c
+	ld [hLYOverrideStart], a
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld a, [hl]
+	inc a
+	and $7
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	inc [hl]
+	inc [hl]
+.two
+	ret
+
+.three
+	ld hl, BATTLEANIMSTRUCT_YCOORD
+	add hl, bc
+	ld a, [hl]
+	cp $70
+	jr c, asm_cd6da
+	xor a
+	ld [hLCDCPointer], a
+	ld [hLYOverrideStart], a
+	ld [hLYOverrideEnd], a
+.four
+	call DeinitBattleAnimation
+	ret
+
+asm_cd6da: ; cd6da (33:56da)
+	inc a
+	inc a
+	ld [hl], a
+	sub $10
+	ret c
+	ld [hLYOverrideStart], a
+	ret
+
+BattleAnimFunction_0E: ; cd6e3 (33:56e3)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw Functioncd6ea
+	dw Functioncd6f7
+Functioncd6ea: ; cd6ea (33:56ea)
+	call BattleAnim_IncAnonJumptableIndex
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, BATTLEANIMFRAMESET_24
+	add [hl] ; offset
+	call ReinitBattleAnimFrameset
+Functioncd6f7: ; cd6f7 (33:56f7)
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld a, [hl]
+	cp $b8
+	jr c, .asm_cd704
+	call DeinitBattleAnimation
+	ret
+
+.asm_cd704
+	ld a, $2
+	call Functionce70a
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	dec [hl]
+	ld d, $8
+	call BattleAnim_Sine
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	ret
+
+BattleAnimFunction_0F: ; cd71a (33:571a)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw Functioncd725
+	dw Functioncd728
+	dw Functioncd763
+	dw Functioncd776
+Functioncd725: ; cd725 (33:5725)
+	call BattleAnim_IncAnonJumptableIndex
+Functioncd728: ; cd728 (33:5728)
+	ld hl, BATTLEANIMSTRUCT_YCOORD
+	add hl, bc
+	ld a, [hl]
+	cp $30
+	jr c, .asm_cd747
+	ld a, $2
+	call Functionce70a
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	dec [hl]
+	ld d, $8
+	call BattleAnim_Sine
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	ret
+
+.asm_cd747
+	call BattleAnim_IncAnonJumptableIndex
+	ld a, BATTLEANIMFRAMESET_28
+	call ReinitBattleAnimFrameset
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], $0
+	ld hl, BATTLEANIMSTRUCT_YCOORD
+	add hl, bc
+	ld [hl], $30
+	ld hl, BATTLEANIMSTRUCT_01
+	add hl, bc
+	ld a, [hl]
+	and $1
+	ld [hl], a
+Functioncd763: ; cd763 (33:5763)
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld a, [hl]
+	cp $18
+	jr nc, .asm_cd76e
+	inc [hl]
+	ret
+
+.asm_cd76e
+	call BattleAnim_IncAnonJumptableIndex
+	ld a, BATTLEANIMFRAMESET_29
+	call ReinitBattleAnimFrameset
+Functioncd776: ; cd776 (33:5776)
+	ret
+
+BattleAnimFunction_11: ; cd777 (33:5777)
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld a, [hl]
+	cp $38
+	jr c, .asm_cd784
+	call DeinitBattleAnimation
+	ret
+
+.asm_cd784
+	ld a, [hl]
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld l, [hl]
+	ld h, a
+	ld de, $80
+	add hl, de
+	ld e, l
+	ld d, h
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], e
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], d
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld a, [hl]
+	xor $10
+	ld [hl], a
+	ret
+
+BattleAnimFunction_14: ; cd7a4 (33:57a4)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw Functioncd7ab
+	dw Functioncd7d2
+Functioncd7ab: ; cd7ab (33:57ab)
+	call BattleAnim_IncAnonJumptableIndex
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	and $f0
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	and $f
+	sla a
+	sla a
+	sla a
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld [hl], $1
+Functioncd7d2: ; cd7d2 (33:57d2)
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr nz, .asm_cd7de
+	call DeinitBattleAnimation
+	ret
+
+.asm_cd7de
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	inc [hl]
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld d, [hl]
+	push af
+	push de
+	call BattleAnim_Sine
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	pop de
+	pop af
+	call BattleAnim_Cosine
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	xor $1
+	ld [hl], a
+	ret z
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	dec [hl]
+	ret
+
+BattleAnimFunction_15: ; cd80c (33:580c)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw Functioncd81f
+	dw Functioncd817
+	dw Functioncd81f
+	dw Functioncd820
+Functioncd817: ; cd817 (33:5817)
+	call BattleAnim_IncAnonJumptableIndex
+	ld a, BATTLEANIMFRAMESET_35
+	call ReinitBattleAnimFrameset
+Functioncd81f: ; cd81f (33:581f)
+	ret
+
+Functioncd820: ; cd820 (33:5820)
+	call DeinitBattleAnimation
+	ret
+
+BattleAnimFunction_16: ; cd824 (33:5824)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw Functioncd835
+	dw Functioncd860
+	dw Functioncd88f
+	dw Functioncd88f
+	dw Functioncd88f
+	dw Functioncd88f
+	dw Functioncd893
+Functioncd835: ; cd835 (33:5835)
+	call BattleAnim_IncAnonJumptableIndex
+	ld hl, BATTLEANIMSTRUCT_FRAMESET_ID
+	add hl, bc
+	ld a, [hl]
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	bit 7, [hl]
+	jr nz, .asm_cd852
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], $10
+	jr .asm_cd858
+
+.asm_cd852
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], $30
+.asm_cd858
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	and $7f
+	ld [hl], a
+Functioncd860: ; cd860 (33:5860)
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld d, [hl]
+	call BattleAnim_Sine
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld [hl], a
+	bit 7, a
+	jr nz, .load_no_inc
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld a, [hl]
+	inc a
+	jr .reinit
+
+.load_no_inc
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld a, [hl]
+.reinit
+	call ReinitBattleAnimFrameset
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	inc [hl]
+	ld a, [hl]
+	and $1f
+	ret nz
+Functioncd88f: ; cd88f (33:588f)
+	call BattleAnim_IncAnonJumptableIndex
+	ret
+
+Functioncd893: ; cd893 (33:5893)
+	ld hl, BATTLEANIMSTRUCT_ANON_JT_INDEX
+	add hl, bc
+	ld [hl], $1
+	ret
+
+BattleAnimFunction_17: ; cd89a (33:589a)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw Functioncd8ab
+	dw Functioncd8cc
+	dw Functioncd8f5
+	dw Functioncd8f5
+	dw Functioncd8f5
+	dw Functioncd8f5
+	dw Functioncd8f9
+Functioncd8ab: ; cd8ab (33:58ab)
+	call BattleAnim_IncAnonJumptableIndex
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	bit 7, [hl]
+	jr nz, .asm_cd8be
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], $10
+	jr .asm_cd8c4
+
+.asm_cd8be
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], $30
+.asm_cd8c4
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	and $7f
+	ld [hl], a
+Functioncd8cc: ; cd8cc (33:58cc)
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld d, [hl]
+	call BattleAnim_Sine
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	bit 7, a
+	jr nz, .asm_cd8e6
+	ld a, $3d
+	jr .asm_cd8e8
+
+.asm_cd8e6
+	ld a, $3c
+.asm_cd8e8
+	call ReinitBattleAnimFrameset
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	inc [hl]
+	inc [hl]
+	ld a, [hl]
+	and $1f
+	ret nz
+Functioncd8f5: ; cd8f5 (33:58f5)
+	call BattleAnim_IncAnonJumptableIndex
+	ret
+
+Functioncd8f9: ; cd8f9 (33:58f9)
+	ld hl, BATTLEANIMSTRUCT_ANON_JT_INDEX
+	add hl, bc
+	ld [hl], $1
+	ret
+
+BattleAnimFunction_18: ; cd900 (33:5900)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw Functioncd907
+	dw Functioncd913
+Functioncd907: ; cd907 (33:5907)
+	call BattleAnim_IncAnonJumptableIndex
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], $28
+	inc hl
+	ld [hl], $0
+Functioncd913: ; cd913 (33:5913)
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld d, [hl]
+	push af
+	push de
+	call BattleAnim_Sine
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	pop de
+	pop af
+	call BattleAnim_Cosine
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr z, .asm_cd950
+	ld d, a
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld e, [hl]
+	ld hl, hPushOAM ; $ff80
+	add hl, de
+	ld e, l
+	ld d, h
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld [hl], e
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], d
+	ret
+
+.asm_cd950
+	call DeinitBattleAnimation
+	ret
+
+BattleAnimFunction_19: ; cd954 (33:5954)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw Functioncd961
+	dw Functioncd96a
+	dw Functioncd96e
+	dw Functioncd96a
+	dw Functioncd97b
+Functioncd961: ; cd961 (33:5961)
+	call BattleAnim_IncAnonJumptableIndex
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld [hl], $0
+Functioncd96a: ; cd96a (33:596a)
+	call Functioncd99a
+	ret
+
+Functioncd96e: ; cd96e (33:596e)
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld a, [hl]
+	cp $88
+	jr c, asm_cd988
+	call BattleAnim_IncAnonJumptableIndex
+	ret
+
+Functioncd97b: ; cd97b (33:597b)
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld a, [hl]
+	cp $b8
+	jr c, asm_cd988
+	call DeinitBattleAnimation
+	ret
+
+asm_cd988: ; cd988 (33:5988)
+	call Functioncd99a
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	inc [hl]
+	ld a, [hl]
+	and $1
+	ret nz
+	ld hl, BATTLEANIMSTRUCT_YCOORD
+	add hl, bc
+	dec [hl]
+	ret
+
+Functioncd99a: ; cd99a (33:599a)
+	call Functioncd9f4
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	push af
+	push de
+	call BattleAnim_Sine
+	sra a
+	sra a
+	sra a
+	sra a
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	add [hl]
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	pop de
+	pop af
+	call BattleAnim_Cosine
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	sub $8
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr z, .asm_cd9d7
+	cp $c2
+	jr c, .asm_cd9e2
+.asm_cd9d7
+	dec a
+	ld [hl], a
+	and $7
+	ret nz
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	inc [hl]
+	ret
+
+.asm_cd9e2
+	xor a
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld [hli], a
+	ld [hl], a
+	ret
+
+Functioncd9f4: ; cd9f4 (33:59f4)
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld e, [hl]
+	ld d, 0
+	ld hl, Unknown_cda01
+	add hl, de
+	ld d, [hl]
+	ret
+
+; cda01 (33:5a01)
+Unknown_cda01: ; cda01
+	db 8, 6, 5, 4, 5, 6, 8, 12, 16
+; cda0a
+BattleAnimFunction_1C: ; cda0a (33:5a0a)
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld a, [hl]
+	cp $30
+	jr nc, .asm_cda17
+	call DeinitBattleAnimation
+	ret
+
+.asm_cda17
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	and $f
+	ld e, a
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld a, [hl]
+	sub e
+	ld [hl], a
+	srl e
+	ld hl, BATTLEANIMSTRUCT_YCOORD
+	add hl, bc
+.asm_cda2c
+	inc [hl]
+	dec e
+	jr nz, .asm_cda2c
+	ret
+
+BattleAnimFunction_1F: ; cda31 (33:5a31)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw Functioncda4c
+	dw Functioncda3a
+	dw Functioncda4c
+Functioncda3a: ; cda3a (33:5a3a)
+	ld hl, BATTLEANIMSTRUCT_FRAMESET_ID
+	add hl, bc
+	ld a, [hl]
+	inc a
+	call ReinitBattleAnimFrameset
+	call BattleAnim_IncAnonJumptableIndex
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], $8
+Functioncda4c: ; cda4c (33:5a4c)
+	ret
+
+BattleAnimFunction_LeechSeed: ; cda4d (33:5a4d)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw .zero
+	dw .one
+	dw .two
+	dw .three
+.zero: ; cda58 (33:5a58)
+	call BattleAnim_IncAnonJumptableIndex
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld [hl], $40
+	ret
+
+.one: ; cda62 (33:5a62)
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld a, [hl]
+	cp $20
+	jr c, .sprout
+	call Functioncda8d
+	ret
+
+.sprout
+	ld [hl], $40
+	ld a, BATTLEANIMFRAMESET_57
+	call ReinitBattleAnimFrameset
+	call BattleAnim_IncAnonJumptableIndex
+	ret
+
+.two: ; cda7a (33:5a7a)
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr z, .flutter
+	dec [hl]
+	ret
+
+.flutter
+	call BattleAnim_IncAnonJumptableIndex
+	ld a, BATTLEANIMFRAMESET_58
+	call ReinitBattleAnimFrameset
+.three: ; cda8c (33:5a8c)
+	ret
+
+Functioncda8d: ; cda8d (33:5a8d)
+	dec [hl]
+	ld d, $20
+	call BattleAnim_Sine
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_02
+	add hl, bc
+	ld a, [hl]
+	add $2
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld e, [hl]
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld d, [hl]
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld h, [hl]
+	ld a, h
+	and $f
+	swap a
+	ld l, a
+	ld a, h
+	and $f0
+	swap a
+	ld h, a
+	add hl, de
+	ld e, l
+	ld d, h
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], e
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld [hl], d
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld a, [hl]
+	and $1
+	ret nz
+	ld hl, BATTLEANIMSTRUCT_YCOORD
+	add hl, bc
+	dec [hl]
+	ret
+
+BattleAnimFunction_3F: ; cdad6 (33:5ad6)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw Functioncdadf
+	dw Functioncdae9
+	dw Functioncdaf9
+Functioncdadf: ; cdadf (33:5adf)
+	call BattleAnim_IncAnonJumptableIndex
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld [hl], $40
+	ret
+
+Functioncdae9: ; cdae9 (33:5ae9)
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld a, [hl]
+	cp $20
+	jr c, .asm_cdaf6
+	call Functioncda8d
+	ret
+
+.asm_cdaf6
+	call BattleAnim_IncAnonJumptableIndex
+Functioncdaf9: ; cdaf9 (33:5af9)
+	ret
+
+BattleAnimFunction_1A: ; cdafa (33:5afa)
+	call BattleAnimFunction_03
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	add $f
+	ld [hl], a
+	ret
+
+BattleAnimFunction_1B: ; cdb06 (33:5b06)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw Functioncdb13
+	dw Functioncdb14
+	dw Functioncdb28
+	dw Functioncdb50
+	dw Functioncdb65
+Functioncdb13: ; cdb13 (33:5b13)
+	ret
+
+Functioncdb14: ; cdb14 (33:5b14)
+	ld hl, BATTLEANIMSTRUCT_YCOORD
+	add hl, bc
+	ld a, [hl]
+	cp $30
+	jr c, .asm_cdb24
+	ld hl, BATTLEANIMSTRUCT_ANON_JT_INDEX
+	add hl, bc
+	ld [hl], $0
+	ret
+
+.asm_cdb24
+	add $4
+	ld [hl], a
+	ret
+
+Functioncdb28: ; cdb28 (33:5b28)
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld a, [hl]
+	cp $98
+	ret nc
+	inc [hl]
+	inc [hl]
+	ld hl, BATTLEANIMSTRUCT_01
+	add hl, bc
+	set 0, [hl]
+	ld hl, BATTLEANIMSTRUCT_02
+	add hl, bc
+	ld [hl], $90
+	ld hl, BATTLEANIMSTRUCT_FRAME
+	add hl, bc
+	ld [hl], $0
+	ld hl, BATTLEANIMSTRUCT_DURATION
+	add hl, bc
+	ld [hl], $2
+	ld hl, BATTLEANIMSTRUCT_YCOORD
+	add hl, bc
+	dec [hl]
+	ret
+
+Functioncdb50: ; cdb50 (33:5b50)
+	call BattleAnim_IncAnonJumptableIndex
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], $2c
+	ld hl, BATTLEANIMSTRUCT_FRAME
+	add hl, bc
+	ld [hl], $0
+	ld hl, BATTLEANIMSTRUCT_DURATION
+	add hl, bc
+	ld [hl], $80
+Functioncdb65: ; cdb65 (33:5b65)
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld a, [hl]
+	cp $98
+	ret nc
+	inc [hl]
+	inc [hl]
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	inc [hl]
+	ld d, $8
+	call BattleAnim_Sine
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	ret
+
+BattleAnimFunction_1D: ; cdb80 (33:5b80)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw Functioncdb9f
+	dw Functioncdbb3
+	dw Functioncdbcf
+	dw Functioncdbeb
+	dw Functioncdc74
+	dw Functioncdc1a
+	dw Functioncdbc1
+	dw Functioncdc1e
+	dw Functioncdc27
+	dw Functioncdc39
+	dw Functioncdc74
+	dw Functioncdc48
+	dw Functioncdc57
+	dw Functioncdc74
+Functioncdb9f: ; cdb9f (33:5b9f)
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], $28
+	inc hl
+	ld [hl], $10
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	ld hl, BATTLEANIMSTRUCT_ANON_JT_INDEX
+	add hl, bc
+	ld [hl], a
+	ret
+
+Functioncdbb3: ; cdbb3 (33:5bb3)
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld a, [hl]
+	cp $40
+	jr nc, .asm_cdbbd
+	inc [hl]
+.asm_cdbbd
+	call Functioncdc75
+	ret
+
+Functioncdbc1: ; cdbc1 (33:5bc1)
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld a, [hl]
+	cp $4b
+	jr nc, .asm_cdbcb
+	inc [hl]
+.asm_cdbcb
+	call Functioncdc75
+	ret
+
+Functioncdbcf: ; cdbcf (33:5bcf)
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld a, [hl]
+	cp $88
+	jr nc, .asm_cdbe6
+	and $f
+	jr nz, asm_cdbfa
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld [hl], $10
+	call BattleAnim_IncAnonJumptableIndex
+	ret
+
+.asm_cdbe6
+	call BattleAnim_IncAnonJumptableIndex
+	inc [hl]
+	ret
+
+Functioncdbeb: ; cdbeb (33:5beb)
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr z, .asm_cdbf5
+	dec [hl]
+	ret
+
+.asm_cdbf5
+	ld hl, BATTLEANIMSTRUCT_ANON_JT_INDEX
+	add hl, bc
+	dec [hl]
+asm_cdbfa: ; cdbfa (33:5bfa)
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	inc [hl]
+	ld hl, BATTLEANIMSTRUCT_YCOORD
+	add hl, bc
+	ld d, [hl]
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld e, [hl]
+	ld hl, hPushOAM ; $ff80
+	add hl, de
+	ld e, l
+	ld d, h
+	ld hl, BATTLEANIMSTRUCT_YCOORD
+	add hl, bc
+	ld [hl], d
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], e
+	ret
+
+Functioncdc1a: ; cdc1a (33:5c1a)
+	call DeinitBattleAnimation
+	ret
+
+Functioncdc1e: ; cdc1e (33:5c1e)
+	ld a, BATTLEANIMFRAMESET_4E
+	call ReinitBattleAnimFrameset
+	call BattleAnim_IncAnonJumptableIndex
+	ret
+
+Functioncdc27: ; cdc27 (33:5c27)
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	inc [hl]
+	inc [hl]
+	ld d, $2
+	call BattleAnim_Sine
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld [hl], a
+	ret
+
+Functioncdc39: ; cdc39 (33:5c39)
+	ld a, BATTLEANIMFRAMESET_50
+	call ReinitBattleAnimFrameset
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], $4
+	call BattleAnim_IncAnonJumptableIndex
+	ret
+
+Functioncdc48: ; cdc48 (33:5c48)
+	ld a, BATTLEANIMFRAMESET_4F
+	call ReinitBattleAnimFrameset
+	call BattleAnim_IncAnonJumptableIndex
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], $40
+	ret
+
+Functioncdc57: ; cdc57 (33:5c57)
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	ld d, $20
+	call BattleAnim_Sine
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	cp $30
+	jr c, .asm_cdc71
+	dec [hl]
+	ret
+
+.asm_cdc71
+	call BattleAnim_IncAnonJumptableIndex
+Functioncdc74: ; cdc74 (33:5c74)
+	ret
+
+Functioncdc75: ; cdc75 (33:5c75)
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hli]
+	ld d, [hl]
+	call BattleAnim_Sine
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	inc [hl]
+	ld a, [hl]
+	and $3f
+	ret nz
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], $20
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld a, [hl]
+	sub $8
+	ld [hl], a
+	ret nz
+	xor a
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hli], a
+	ld [hl], a
+	call BattleAnim_IncAnonJumptableIndex
+	ret
+
+BattleAnimFunction_1E: ; cdca6 (33:5ca6)
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr z, .asm_cdcb6
+	cp $d8
+	jr nc, .asm_cdcb6
+	call DeinitBattleAnimation
+	ret
+
+.asm_cdcb6
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld d, [hl]
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld a, [hl]
+	sub d
+	ld [hl], a
+	ret
+
+BattleAnimFunction_21: ; cdcc3 (33:5cc3)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw Functioncdcca
+	dw Functioncdced
+Functioncdcca: ; cdcca (33:5cca)
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_cdcd9
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	xor $ff
+	add $3
+	ld [hl], a
+.asm_cdcd9
+	call BattleAnim_IncAnonJumptableIndex
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], $8
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, BATTLEANIMFRAMESET_59
+	add [hl]
+	call ReinitBattleAnimFrameset
+	ret
+
+Functioncdced: ; cdced (33:5ced)
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr z, .asm_cdcfa
+	dec [hl]
+	call Functioncdcfe
+	ret
+
+.asm_cdcfa
+	call DeinitBattleAnimation
+	ret
+
+Functioncdcfe: ; cdcfe (33:5cfe)
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld a, [hl]
+	inc [hl]
+	inc [hl]
+	ld d, $10
+	call BattleAnim_Sine
+	ld d, a
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr z, .asm_cdd20
+	dec a
+	ret z
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], d
+	ret
+
+.asm_cdd20
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld a, d
+	xor $ff
+	inc a
+	ld [hl], a
+	ret
+
+BattleAnimFunction_22: ; cdd2a (33:5d2a)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw Functioncdd31
+	dw Functioncdd4f
+Functioncdd31: ; cdd31 (33:5d31)
+	call BattleAnim_IncAnonJumptableIndex
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	and $3f
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	and $80
+	rlca
+	ld [hl], a
+	add BATTLEANIMFRAMESET_5D
+	call ReinitBattleAnimFrameset
+	ret
+
+Functioncdd4f: ; cdd4f (33:5d4f)
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	swap a
+	ld d, a
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld a, [hl]
+	inc [hl]
+	push af
+	push de
+	call BattleAnim_Sine
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	pop de
+	pop af
+	call BattleAnim_Cosine
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld a, [hl]
+	cp $80
+	ret nc
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld a, [hl]
+	and $3
+	jr nz, .asm_cdd87
+	ld hl, BATTLEANIMSTRUCT_YCOORD
+	add hl, bc
+	dec [hl]
+.asm_cdd87
+	and $1
+	ret nz
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	inc [hl]
+	ret
+
+BattleAnimFunction_23: ; cdd90 (33:5d90)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw Functioncdd97
+	dw Functioncddbc
+Functioncdd97: ; cdd97 (33:5d97)
+	call BattleAnim_IncAnonJumptableIndex
+	ld hl, BATTLEANIMSTRUCT_FRAMESET_ID
+	add hl, bc
+	ld a, [hl]
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	and $80
+	rlca
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	add [hl]
+	call ReinitBattleAnimFrameset
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	and $7f
+	ld [hl], a
+Functioncddbc: ; cddbc (33:5dbc)
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	ld d, $10
+	push af
+	push de
+	call BattleAnim_Sine
+	sra a
+	sra a
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	pop de
+	pop af
+	call BattleAnim_Cosine
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	inc [hl]
+	and $3f
+	jr z, .asm_cddf0
+	and $1f
+	ret nz
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	inc a
+	jr .asm_cddf5
+
+.asm_cddf0
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+.asm_cddf5
+	call ReinitBattleAnimFrameset
+	ret
+
+BattleAnimFunction_24: ; cddf9 (33:5df9)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw Functioncde02
+	dw Functioncde20
+	dw Functioncde21
+Functioncde02: ; cde02 (33:5e02)
+	call BattleAnim_IncAnonJumptableIndex
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	add BATTLEANIMFRAMESET_63
+	call ReinitBattleAnimFrameset
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld e, [hl]
+	ld d, 0
+	ld hl, Unknown_cde25
+	add hl, de
+	ld a, [hl]
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+Functioncde20: ; cde20 (33:5e20)
+	ret
+
+Functioncde21: ; cde21 (33:5e21)
+	call DeinitBattleAnimation
+	ret
+
+; cde25 (33:5e25)
+Unknown_cde25: ; cde25
+	db $ec, $f8, $00
+; cde28
+BattleAnimFunction_25: ; cde28 (33:5e28)
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	inc [hl]
+	inc [hl]
+	ld d, $4
+	call BattleAnim_Sine
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld d, [hl]
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld e, [hl]
+	ld hl, $ffa0
+	add hl, de
+	ld e, l
+	ld d, h
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], d
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld [hl], e
+	ret
+
+BattleAnimFunction_26: ; cde54 (33:5e54)
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	dec [hl]
+	dec [hl]
+	ld d, $10
+	call BattleAnim_Sine
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	inc [hl]
+	ret
+
+BattleAnimFunction_27: ; cde6b (33:5e6b)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw Functioncde72
+	dw Functioncde88
+Functioncde72: ; cde72 (33:5e72)
+	call BattleAnim_IncAnonJumptableIndex
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr nz, .asm_cde83
+	ld hl, BATTLEANIMSTRUCT_01
+	add hl, bc
+	set 6, [hl]
+.asm_cde83
+	add BATTLEANIMFRAMESET_6A
+	call ReinitBattleAnimFrameset
+Functioncde88: ; cde88 (33:5e88)
+	ret
+
+BattleAnimFunction_28: ; cde89 (33:5e89)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw Functioncde90
+	dw Functioncdebf
+Functioncde90: ; cde90 (33:5e90)
+	call BattleAnim_IncAnonJumptableIndex
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], $0
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld e, [hl]
+	ld a, e
+	and $70
+	swap a
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld a, e
+	and $80
+	jr nz, .asm_cdeb2
+	ld a, e
+	and $f
+	ld [hl], a
+	ret
+
+.asm_cdeb2
+	ld a, e
+	and $f
+	xor $ff
+	inc a
+	ld [hl], a
+	ld a, BATTLEANIMFRAMESET_6E
+	call ReinitBattleAnimFrameset
+	ret
+
+Functioncdebf: ; cdebf (33:5ebf)
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr z, .asm_cdec9
+	dec [hl]
+	ret
+
+.asm_cdec9
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld a, [hl]
+	xor $ff
+	inc a
+	ld [hl], a
+	ret
+
+BattleAnimFunction_SpiralDescent: ; cdedd (33:5edd)
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	ld d, $18
+	push af
+	push de
+	call BattleAnim_Sine
+	sra a
+	sra a
+	sra a
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	add [hl]
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	pop de
+	pop af
+	call BattleAnim_Cosine
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	inc [hl]
+	ld a, [hl]
+	and $7
+	ret nz
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld a, [hl]
+	cp $28
+	jr nc, .delete
+	inc [hl]
+	ret
+
+.delete
+	call DeinitBattleAnimation
+	ret
+
+BattleAnimFunction_2D: ; cdf1b (33:5f1b)
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	ld d, $18
+	push af
+	push de
+	call BattleAnim_Sine
+	sra a
+	sra a
+	sra a
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	add [hl]
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	pop de
+	pop af
+	call BattleAnim_Cosine
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	inc [hl]
+	ld a, [hl]
+	and $3
+	ret nz
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld a, [hl]
+	cp $28
+	jr nc, .asm_cdf55
+	inc [hl]
+	ret
+
+.asm_cdf55
+	call DeinitBattleAnimation
+	ret
+
+BattleAnimFunction_PoisonGas: ; cdf59 (33:5f59)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw Functioncdf60
+	dw BattleAnimFunction_SpiralDescent
+Functioncdf60: ; cdf60 (33:5f60)
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld a, [hl]
+	cp $84
+	jr nc, .next
+	inc [hl]
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	inc [hl]
+	ld d, $18
+	call BattleAnim_Cosine
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld a, [hl]
+	and $1
+	ret nz
+	ld hl, BATTLEANIMSTRUCT_YCOORD
+	add hl, bc
+	dec [hl]
+	ret
+
+.next
+	call BattleAnim_IncAnonJumptableIndex
+	ret
+
+BattleAnimFunction_34: ; cdf8c (33:5f8c)
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	ld d, $18
+	push af
+	push de
+	call BattleAnim_Sine
+	sra a
+	sra a
+	sra a
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	add [hl]
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	pop de
+	pop af
+	call BattleAnim_Cosine
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	inc [hl]
+	inc [hl]
+	ld a, [hl]
+	and $7
+	ret nz
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld a, [hl]
+	cp $e8
+	jr z, .asm_cdfc7
+	dec [hl]
+	ret
+
+.asm_cdfc7
+	call DeinitBattleAnimation
+	ret
+
+BattleAnimFunction_3C: ; cdfcb (33:5fcb)
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	ld d, $18
+	push af
+	push de
+	call BattleAnim_Sine
+	sra a
+	sra a
+	sra a
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	add [hl]
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	pop de
+	pop af
+	call BattleAnim_Cosine
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	inc [hl]
+	inc [hl]
+	ld a, [hl]
+	and $3
+	ret nz
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld a, [hl]
+	cp $d0
+	jr z, .asm_ce007
+	dec [hl]
+	dec [hl]
+	ret
+
+.asm_ce007
+	call DeinitBattleAnimation
+	ret
+
+BattleAnimFunction_35: ; ce00b (33:600b)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw Functionce014
+	dw Functionce023
+	dw Functionce05f
+Functionce014: ; ce014 (33:6014)
+	call BattleAnim_IncAnonJumptableIndex
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], $34
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld [hl], $10
+Functionce023: ; ce023 (33:6023)
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld a, [hl]
+	cp $6c
+	jr c, .asm_ce02d
+	ret
+
+.asm_ce02d
+	ld a, $2
+	call Functionce70a
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld d, [hl]
+	call BattleAnim_Sine
+	bit 7, a
+	jr nz, .asm_ce046
+	xor $ff
+	inc a
+.asm_ce046
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	sub $4
+	ld [hl], a
+	and $1f
+	cp $20
+	ret nz
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	srl [hl]
+	ret
+
+Functionce05f: ; ce05f (33:605f)
+	call DeinitBattleAnimation
+	ret
+
+BattleAnimFunction_Horn: ; ce063 (33:6063)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw .zero
+	dw .one
+	dw .two
+	dw Functionce09e
+.zero: ; ce06e (33:606e)
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	ld hl, BATTLEANIMSTRUCT_ANON_JT_INDEX
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_YCOORD
+	add hl, bc
+	ld a, [hl]
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], a
+	ret
+
+.one: ; ce083 (33:6083)
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld a, [hl]
+	cp $58
+	ret nc
+	ld a, $2
+	call Functionce70a
+	ret
+
+.two: ; ce091 (33:6091)
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld a, [hl]
+	cp $20
+	jr c, Functionce09e
+	call DeinitBattleAnimation
+	ret
+
+Functionce09e: ; ce09e (33:609e)
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld a, [hl]
+	ld d, $8
+	call BattleAnim_Sine
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld [hl], a
+	sra a
+	xor $ff
+	inc a
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	add [hl]
+	ld hl, BATTLEANIMSTRUCT_YCOORD
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld a, [hl]
+	add $8
+	ld [hl], a
+	ret
+
+BattleAnimFunction_2C: ; ce0c5 (33:60c5)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw Functionce0ce
+	dw Functionce0f8
+	dw Functionce0dd
+Functionce0ce: ; ce0ce (33:60ce)
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	and $f0
+	swap a
+	ld hl, BATTLEANIMSTRUCT_ANON_JT_INDEX
+	add hl, bc
+	ld [hl], a
+	ret
+
+Functionce0dd: ; ce0dd (33:60dd)
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	ld d, $10
+	call BattleAnim_Sine
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	bit 7, a
+	jr z, .asm_ce0f0
+	ld [hl], a
+.asm_ce0f0
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	sub $4
+	ld [hl], a
+Functionce0f8: ; ce0f8 (33:60f8)
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld a, [hl]
+	cp $84
+	jr c, .asm_ce105
+	call DeinitBattleAnimation
+	ret
+
+.asm_ce105
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	call Functionce70a
+	ret
+
+BattleAnimFunction_2E: ; ce10e (33:610e)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw Functionce115
+	dw Functionce12a
+Functionce115: ; ce115 (33:6115)
+	call BattleAnim_IncAnonJumptableIndex
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], $28
+	ld hl, BATTLEANIMSTRUCT_YCOORD
+	add hl, bc
+	ld a, [hl]
+	sub $28
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld [hl], a
+Functionce12a: ; ce12a (33:612a)
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hli]
+	ld d, [hl]
+	call BattleAnim_Sine
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	and [hl]
+	jr nz, .asm_ce149
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	dec [hl]
+.asm_ce149
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	inc [hl]
+	ld a, [hl]
+	and $3f
+	ret nz
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], $20
+	inc hl
+	srl [hl]
+	ret
+
+BattleAnimFunction_2F: ; ce15c (33:615c)
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld d, [hl]
+	push af
+	push de
+	call BattleAnim_Sine
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	pop de
+	pop af
+	call BattleAnim_Cosine
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	inc [hl]
+	ld a, [hl]
+	and $1
+	jr nz, .asm_ce189
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	dec [hl]
+.asm_ce189
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	and $3
+	jr nz, .asm_ce197
+	ld hl, BATTLEANIMSTRUCT_YCOORD
+	add hl, bc
+	inc [hl]
+.asm_ce197
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld a, [hl]
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	cp $5a
+	jr nc, .asm_ce1aa
+	ld a, [hl]
+	and a
+	jr z, .asm_ce1ac
+	dec [hl]
+	ret
+
+.asm_ce1aa
+	inc [hl]
+	ret
+
+.asm_ce1ac
+	call DeinitBattleAnimation
+	ret
+
+BattleAnimFunction_42: ; ce1b0 (33:61b0)
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	inc [hl]
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld d, [hl]
+	push af
+	push de
+	call BattleAnim_Sine
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	pop de
+	pop af
+	call BattleAnim_Cosine
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld a, [hl]
+	inc [hl]
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	cp $40
+	jr nc, .asm_ce1df
+	inc [hl]
+	ret
+
+.asm_ce1df
+	ld a, [hl]
+	dec [hl]
+	and a
+	ret nz
+	call DeinitBattleAnimation
+	ret
+
+BattleAnimFunction_30: ; ce1e7 (33:61e7)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw Functionce1ee
+	dw Functionce1fb
+Functionce1ee: ; ce1ee (33:61ee)
+	call BattleAnim_IncAnonJumptableIndex
+	ld hl, BATTLEANIMSTRUCT_YCOORD
+	add hl, bc
+	ld a, [hl]
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld [hl], a
+Functionce1fb: ; ce1fb (33:61fb)
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	ld d, $30
+	call BattleAnim_Sine
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	add [hl]
+	ld hl, BATTLEANIMSTRUCT_YCOORD
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	add $8
+	ld d, $30
+	call BattleAnim_Cosine
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	inc [hl]
+	ret
+
+BattleAnimFunction_31: ; ce226 (33:6226)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw Functionce22d
+	dw Functionce254
+Functionce22d: ; ce22d (33:622d)
+	call BattleAnim_IncAnonJumptableIndex
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	ld d, $10
+	call BattleAnim_Sine
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	ld d, $10
+	call BattleAnim_Cosine
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld [hl], $f
+Functionce254: ; ce254 (33:6254)
+	ret
+
+BattleAnimFunction_32: ; ce255 (33:6255)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw Functionce260
+	dw Functionce274
+	dw Functionce278
+	dw Functionce289
+Functionce260: ; ce260 (33:6260)
+	call BattleAnim_IncAnonJumptableIndex
+	ld a, [hBattleTurn]
+	and a
+	jr nz, .asm_ce26c
+	ld a, $f0
+	jr .asm_ce26e
+
+.asm_ce26c
+	ld a, $cc
+.asm_ce26e
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], a
+	ret
+
+Functionce274: ; ce274 (33:6274)
+	call Functionce29f
+	ret
+
+Functionce278: ; ce278 (33:6278)
+	call Functionce29f
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld a, [hl]
+	cp $84
+	ret nc
+	ld a, $4
+	call Functionce70a
+	ret
+
+Functionce289: ; ce289 (33:6289)
+	call Functionce29f
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld a, [hl]
+	cp $d0
+	jr nc, .asm_ce29b
+	ld a, $4
+	call Functionce70a
+	ret
+
+.asm_ce29b
+	call DeinitBattleAnimation
+	ret
+
+Functionce29f: ; ce29f (33:629f)
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld a, [hl]
+	and $7
+	inc [hl]
+	srl a
+	ld e, a
+	ld d, $0
+	ld a, [hSGB]
+	and a
+	jr nz, .asm_ce2b6
+	ld hl, Unknown_ce2c4
+	jr .asm_ce2b9
+
+.asm_ce2b6
+	ld hl, Unknown_ce2c8
+.asm_ce2b9
+	add hl, de
+	ld a, [hl]
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	and [hl]
+	ld [wOBP0], a
+	ret
+
+; ce2c4 (33:62c4)
+Unknown_ce2c4: ; ce2c4
+	db $ff, $aa, $55, $aa
+Unknown_ce2c8: ; ce2c8
+	db $ff, $ff, $00, $00
+; ce2cc
+BattleAnimFunction_33: ; ce2cc (33:62cc)
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	ld d, $18
+	call BattleAnim_Sine
+	sra a
+	sra a
+	sra a
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	add [hl]
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	inc [hl]
+	ld d, $18
+	call BattleAnim_Cosine
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	dec [hl]
+	dec [hl]
+	ret
+
+BattleAnimFunction_36: ; ce2fd (33:62fd)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw Functionce306
+	dw Functionce330
+	dw Functionce34c
+Functionce306: ; ce306 (33:6306)
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld a, [hl]
+	cp $e0
+	jr nz, .asm_ce319
+	call BattleAnim_IncAnonJumptableIndex
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], $2
+	ret
+
+.asm_ce319
+	ld d, a
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld e, [hl]
+	ld hl, hPushOAM ; $ff80
+	add hl, de
+	ld e, l
+	ld d, h
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], d
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], e
+	ret
+
+Functionce330: ; ce330 (33:6330)
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr z, .asm_ce33a
+	dec [hl]
+	ret
+
+.asm_ce33a
+	ld [hl], $4
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	xor $ff
+	inc a
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	add [hl]
+	ld [hl], a
+	ret
+
+Functionce34c: ; ce34c (33:634c)
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld a, [hl]
+	cp $84
+	jr nc, .asm_ce35b
+	ld a, $4
+	call Functionce70a
+	ret
+
+.asm_ce35b
+	call DeinitBattleAnimation
+	ret
+
+BattleAnimFunction_37: ; ce35f (33:635f)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw Functionce366
+	dw Functionce375
+Functionce366: ; ce366 (33:6366)
+	call BattleAnim_IncAnonJumptableIndex
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	and $7f
+	add BATTLEANIMFRAMESET_81
+	call ReinitBattleAnimFrameset
+Functionce375: ; ce375 (33:6375)
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	bit 7, [hl]
+	jr nz, .asm_ce383
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	inc [hl]
+	ret
+
+.asm_ce383
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	dec [hl]
+	ret
+
+BattleAnimFunction_38: ; ce389 (33:6389)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw Functionce392
+	dw Functionce39c
+	dw Functionce3ae
+Functionce392: ; ce392 (33:6392)
+	call BattleAnim_IncAnonJumptableIndex
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], $c
+	ret
+
+Functionce39c: ; ce39c (33:639c)
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr z, .asm_ce3a6
+	dec [hl]
+	ret
+
+.asm_ce3a6
+	call BattleAnim_IncAnonJumptableIndex
+	ld a, BATTLEANIMFRAMESET_20
+	call ReinitBattleAnimFrameset
+Functionce3ae: ; ce3ae (33:63ae)
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	dec [hl]
+	ret
+
+BattleAnimFunction_39: ; ce3b4 (33:63b4)
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	inc [hl]
+	inc [hl]
+	push af
+	ld d, $2
+	call BattleAnim_Sine
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	pop af
+	ld d, $8
+	call BattleAnim_Cosine
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld [hl], a
+	ret
+
+BattleAnimFunction_3A: ; ce3d2 (33:63d2)
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld a, [hl]
+	cp $20
+	jr c, .asm_ce3df
+	call DeinitBattleAnimation
+	ret
+
+.asm_ce3df
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	ld d, $8
+	call BattleAnim_Cosine
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	add $2
+	ld [hl], a
+	and $7
+	ret nz
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	inc [hl]
+	ret
+
+BattleAnimFunction_3B: ; ce3ff (33:63ff)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw Functionce406
+	dw Functionce412
+Functionce406: ; ce406 (33:6406)
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	add [hl]
+	ld [hl], a
+	ret
+
+Functionce412: ; ce412 (33:6412)
+	call DeinitBattleAnimation
+	ret
+
+BattleAnimFunction_3D: ; ce416 (33:6416)
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	ld d, $18
+	push af
+	push de
+	call BattleAnim_Sine
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	pop de
+	pop af
+	call BattleAnim_Cosine
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	sra a
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	inc [hl]
+	ret
+
+BattleAnimFunction_3E: ; ce43a (33:643a)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw Functionce443
+	dw Functionce465
+	dw Functionce490
+Functionce443: ; ce443 (33:6443)
+	call BattleAnim_IncAnonJumptableIndex
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], $28
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	and $f
+	ld hl, BATTLEANIMSTRUCT_FRAMESET_ID
+	add hl, bc
+	add [hl]
+	call ReinitBattleAnimFrameset
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	and $f0
+	or $8
+	ld [hl], a
+Functionce465: ; ce465 (33:6465)
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr z, .asm_ce48b
+	dec [hl]
+	add $8
+	ld d, a
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	push af
+	push de
+	call BattleAnim_Sine
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	pop de
+	pop af
+	call BattleAnim_Cosine
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld [hl], a
+	ret
+
+.asm_ce48b
+	ld [hl], $10
+	call BattleAnim_IncAnonJumptableIndex
+Functionce490: ; ce490 (33:6490)
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	dec [hl]
+	and a
+	ret nz
+	call DeinitBattleAnimation
+	ret
+
+BattleAnimFunction_40: ; ce49c (33:649c)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw Functionce4a3
+	dw Functionce4b0
+Functionce4a3: ; ce4a3 (33:64a3)
+	call BattleAnim_IncAnonJumptableIndex
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, BATTLEANIMFRAMESET_24
+	add [hl]
+	call ReinitBattleAnimFrameset
+Functionce4b0: ; ce4b0 (33:64b0)
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld a, [hl]
+	cp $38
+	jr nc, .asm_ce4d8
+	inc [hl]
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	inc [hl]
+	ld d, $18
+	call BattleAnim_Cosine
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_YCOORD
+	add hl, bc
+	ld a, [hl]
+	and $1
+	ret nz
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	dec [hl]
+	ret
+
+.asm_ce4d8
+	call DeinitBattleAnimation
+	ret
+
+BattleAnimFunction_41: ; ce4dc (33:64dc)
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	and a
+	ret z
+	ld d, a
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	inc [hl]
+	call BattleAnim_Sine
+	bit 7, a
+	jr nz, .asm_ce4f4
+	xor $ff
+	inc a
+.asm_ce4f4
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	and $1f
+	ret nz
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	srl [hl]
+	ret
+
+BattleAnimFunction_43: ; ce508 (33:6508)
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	cp $10
+	jr nc, .asm_ce52e
+	inc [hl]
+	inc [hl]
+	ld d, a
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	push af
+	push de
+	call BattleAnim_Sine
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	pop de
+	pop af
+	call BattleAnim_Cosine
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld [hl], a
+	ret
+
+.asm_ce52e
+	call DeinitBattleAnimation
+	ret
+
+BattleAnimFunction_44: ; ce532 (33:6532)
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld e, [hl]
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld d, [hl]
+	ld a, e
+	and $c0
+	rlca
+	rlca
+	add [hl]
+	ld [hl], a
+	ld a, e
+	and $3f
+	push af
+	push de
+	call BattleAnim_Sine
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	pop de
+	pop af
+	call BattleAnim_Cosine
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld [hl], a
+	ret
+
+BattleAnimFunction_45: ; ce55b (33:655b)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw Functionce564
+	dw Functionce56e
+	dw Functionce577
+Functionce564: ; ce564 (33:6564)
+	ld d, $18
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	inc [hl]
+	jr asm_ce58f
+
+Functionce56e: ; ce56e (33:656e)
+	call BattleAnim_IncAnonJumptableIndex
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], $18
+Functionce577: ; ce577 (33:6577)
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	cp $80
+	jr nc, .asm_ce58b
+	ld d, a
+	add $8
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	jr asm_ce58f
+
+.asm_ce58b
+	call DeinitBattleAnimation
+	ret
+
+asm_ce58f: ; ce58f (33:658f)
+	call Functionce6f1
+	ret
+
+BattleAnimFunction_46: ; ce593 (33:6593)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw Functionce5b3
+	dw Functionce59a
+Functionce59a: ; ce59a (33:659a)
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld a, [hl]
+	cp $30
+	jr c, .asm_ce5b0
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	dec [hl]
+	dec [hl]
+	ld hl, BATTLEANIMSTRUCT_YCOORD
+	add hl, bc
+	inc [hl]
+	inc [hl]
+	ret
+
+.asm_ce5b0
+	call DeinitBattleAnimation
+Functionce5b3: ; ce5b3 (33:65b3)
+	ret
+
+BattleAnimFunction_47: ; ce5b4 (33:65b4)
+	ld d, $50
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	inc [hl]
+	inc [hl]
+	push af
+	push de
+	call BattleAnim_Sine
+	sra a
+	sra a
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	add [hl]
+	inc [hl]
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	pop de
+	pop af
+	call BattleAnim_Cosine
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld [hl], a
+	ret
+
+BattleAnimFunction_48: ; ce5dc (33:65dc)
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld a, [hl]
+	cp $d0
+	jr z, .disappear
+	dec [hl]
+	dec [hl]
+	dec [hl]
+	dec [hl]
+	ret
+
+.disappear
+	call DeinitBattleAnimation
+	ret
+
+BattleAnimFunction_49: ; ce5ee (33:65ee)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw Functionce5f9
+	dw Functionce60a
+	dw Functionce622
+	dw Functionce618
+Functionce5f9: ; ce5f9 (33:65f9)
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr nz, asm_ce61c
+	call BattleAnim_IncAnonJumptableIndex
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], $ec
+Functionce60a: ; ce60a (33:660a)
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld a, [hl]
+	cp $4
+	jr z, Functionce618
+	inc [hl]
+	inc [hl]
+	inc [hl]
+	inc [hl]
+	ret
+
+Functionce618: ; ce618 (33:6618)
+	call DeinitBattleAnimation
+	ret
+
+asm_ce61c: ; ce61c (33:661c)
+	call BattleAnim_IncAnonJumptableIndex
+	call BattleAnim_IncAnonJumptableIndex
+Functionce622: ; ce622 (33:6622)
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld a, [hl]
+	cp $d8
+	ret z
+	dec [hl]
+	dec [hl]
+	dec [hl]
+	dec [hl]
+	ret
+
+BattleAnimFunction_4A: ; ce62f (33:662f)
+	call BattleAnim_AnonJumptable
+.anon_dw
+	dw Functionce63a
+	dw Functionce648
+	dw Functionce65c
+	dw Functionce672
+Functionce63a: ; ce63a (33:663a)
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	ld hl, BATTLEANIMSTRUCT_ANON_JT_INDEX
+	add hl, bc
+	ld [hl], a
+	call BattleAnim_IncAnonJumptableIndex
+	ret
+
+Functionce648: ; ce648 (33:6648)
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld a, [hl]
+	add $4
+	cp $70
+	jr c, .asm_ce654
+	xor a
+.asm_ce654
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	inc [hl]
+	inc [hl]
+	ret
+
+Functionce65c: ; ce65c (33:665c)
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld a, [hl]
+	add $4
+	cp $70
+	jr c, .asm_ce668
+	xor a
+.asm_ce668
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld a, [hl]
+	add $8
+	ld [hl], a
+	ret
+
+Functionce672: ; ce672 (33:6672)
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld a, [hl]
+	add $4
+	cp $70
+	jr c, .asm_ce67e
+	xor a
+.asm_ce67e
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld a, [hl]
+	add $4
+	ld [hl], a
+	ret
+
+BattleAnimFunction_4B: ; ce688 (33:6688)
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld d, [hl]
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld e, [hl]
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	ld l, a
+	and $f0
+	ld h, a
+	swap a
+	or h
+	ld h, a
+	ld a, l
+	and $f
+	swap a
+	ld l, a
+	add hl, de
+	ld e, l
+	ld d, h
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	ld [hl], d
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld [hl], e
+	ret
+
+BattleAnimFunction_4C: ; ce6b3 (33:66b3)
+	ld d, $18
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld a, [hl]
+	inc [hl]
+	call Functionce6f1
+	ret
+
+BattleAnimFunction_4F: ; ce6bf (33:66bf)
+	ld d, $18
+	ld hl, BATTLEANIMSTRUCT_10
+	add hl, bc
+	ld a, [hl]
+	inc [hl]
+	srl a
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	add [hl]
+	call Functionce6f1
+	ret
+
+BattleAnimFunction_4D: ; ce6d2 (33:66d2)
+	ld hl, BATTLEANIMSTRUCT_0F
+	add hl, bc
+	ld a, [hl]
+	cp $20
+	jr nc, .asm_ce6ed
+	inc [hl]
+	ld hl, BATTLEANIMSTRUCT_0B
+	add hl, bc
+	ld d, [hl]
+	call BattleAnim_Sine
+	xor $ff
+	inc a
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	ret
+
+.asm_ce6ed
+	call DeinitBattleAnimation
+	ret
+
+Functionce6f1: ; ce6f1 (33:66f1)
+	push af
+	push de
+	call BattleAnim_Sine
+	sra a
+	sra a
+	ld hl, BATTLEANIMSTRUCT_YOFFSET
+	add hl, bc
+	ld [hl], a
+	pop de
+	pop af
+	call BattleAnim_Cosine
+	ld hl, BATTLEANIMSTRUCT_XOFFSET
+	add hl, bc
+	ld [hl], a
+	ret
+
+Functionce70a: ; ce70a (33:670a)
+	and $f
+	ld e, a
+	ld hl, BATTLEANIMSTRUCT_XCOORD
+	add hl, bc
+	add [hl]
+	ld [hl], a
+	srl e
+	ld hl, BATTLEANIMSTRUCT_YCOORD
+	add hl, bc
+.asm_ce719
+	dec [hl]
+	dec e
+	jr nz, .asm_ce719
+	ret
+
+BattleAnim_AnonJumptable: ; ce71e (33:671e)
+	pop de
+	ld hl, BATTLEANIMSTRUCT_ANON_JT_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
+	jp hl
+
+BattleAnim_IncAnonJumptableIndex: ; ce72c (33:672c)
+	ld hl, BATTLEANIMSTRUCT_ANON_JT_INDEX
+	add hl, bc
+	inc [hl]
+	ret
+
+BattleAnim_Cosine: ; ce732 (33:6732)
+	add $10
+BattleAnim_Sine: ; ce734 (33:6734)
+; a = d sin a
+	and $3f
+	cp $20
+	jr nc, .negative
+	call .ApplySineWave
+	ld a, h
+	ret
+
+.negative
+	and $1f
+	call .ApplySineWave
+	ld a, h
+	xor $ff
+	inc a
+	ret
+
+.ApplySineWave:
+	ld e, a
+	ld a, d
+	ld d, 0
+	ld hl, BattleAnimSineWave
+	add hl, de
+	add hl, de
+	ld e, [hl]
+	inc hl
+	ld d, [hl]
+	ld hl, $0
+.multiply
+	srl a
+	jr nc, .even
+	add hl, de
+.even
+	sla e
+	rl d
+	and a
+	jr nz, .multiply
+	ret
+
+BattleAnim_Sine_e: ; ce765 (33:6765)
+	ld a, e
+	call BattleAnim_Sine
+	ld e, a
+	ret
+
+BattleAnim_Cosine_e: ; ce76b (33:676b)
+	ld a, e
+	call BattleAnim_Cosine
+	ld e, a
+	ret
+
+; ce771 (33:6771)
+BattleAnim_AbsSinePrecise: ; ce771
+	ld a, e
+	call BattleAnim_Sine
+	ld e, l
+	ld d, h
+	ret
+
+; ce778
+BattleAnim_AbsCosinePrecise: ; ce778
+	ld a, e
+	call BattleAnim_Cosine
+	ld e, l
+	ld d, h
+	ret
+
+; ce77f
+BattleAnimSineWave: ; ce77f
+	sine_wave $100
+; ce7bf
--- /dev/null
+++ b/engine/anims/helpers.asm
@@ -1,0 +1,130 @@
+ReinitBattleAnimFrameset: ; ce7bf (33:67bf)
+	ld hl, BATTLEANIMSTRUCT_FRAMESET_ID
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_DURATION
+	add hl, bc
+	ld [hl], 0
+	ld hl, BATTLEANIMSTRUCT_FRAME
+	add hl, bc
+	ld [hl], -1
+	ret
+
+GetBattleAnimFrame: ; ce7d1
+.loop
+	ld hl, BATTLEANIMSTRUCT_DURATION
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr z, .next_frame
+	dec [hl]
+	call .GetPointer
+	ld a, [hli]
+	push af
+	jr .okay
+
+.next_frame
+	ld hl, BATTLEANIMSTRUCT_FRAME
+	add hl, bc
+	inc [hl]
+	call .GetPointer
+	ld a, [hli]
+	cp -2
+	jr z, .restart
+	cp -1
+	jr z, .repeat_last
+	push af
+	ld a, [hl]
+	push hl
+	and $3f
+	ld hl, BATTLEANIMSTRUCT_DURATION
+	add hl, bc
+	ld [hl], a
+	pop hl
+
+.okay
+	ld a, [hl]
+	and $c0
+	srl a
+	ld [wBattleAnimTemp7], a
+	pop af
+	ret
+
+.repeat_last
+	xor a
+	ld hl, BATTLEANIMSTRUCT_DURATION
+	add hl, bc
+	ld [hl], a
+	ld hl, BATTLEANIMSTRUCT_FRAME
+	add hl, bc
+	dec [hl]
+	dec [hl]
+	jr .loop
+
+.restart
+	xor a
+	ld hl, BATTLEANIMSTRUCT_DURATION
+	add hl, bc
+	ld [hl], a
+	dec a
+	ld hl, BATTLEANIMSTRUCT_FRAME
+	add hl, bc
+	ld [hl], a
+	jr .loop
+
+; ce823
+
+.GetPointer: ; ce823
+	ld hl, BATTLEANIMSTRUCT_FRAMESET_ID
+	add hl, bc
+	ld e, [hl]
+	ld d, 0
+	ld hl, BattleAnimFrameData
+	add hl, de
+	add hl, de
+	ld e, [hl]
+	inc hl
+	ld d, [hl]
+	ld hl, BATTLEANIMSTRUCT_FRAME
+	add hl, bc
+	ld l, [hl]
+	ld h, $0
+	add hl, hl
+	add hl, de
+	ret
+
+; ce83c
+
+GetBattleAnimOAMPointer: ; ce83c
+	ld l, a
+	ld h, 0
+	ld de, BattleAnimOAMData
+	add hl, hl
+	add hl, hl
+	add hl, de
+	ret
+
+; ce846
+
+LoadBattleAnimObj: ; ce846 (33:6846)
+	push hl
+	ld l, a
+	ld h, 0
+	add hl, hl
+	add hl, hl
+	ld de, AnimObjGFX
+	add hl, de
+	ld c, [hl]
+	inc hl
+	ld b, [hl]
+	inc hl
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	pop de
+	push bc
+	call DecompressRequest2bpp
+	pop bc
+	ret
+
+; ce85e (33:685e)
--- /dev/null
+++ b/engine/battle/ai/items.asm
@@ -1,0 +1,882 @@
+AI_SwitchOrTryItem: ; 38000
+	and a
+
+	ld a, [wBattleMode]
+	dec a
+	ret z
+
+	ld a, [wLinkMode]
+	and a
+	ret nz
+
+	farcall CheckEnemyLockedIn
+	ret nz
+
+	ld a, [PlayerSubStatus5]
+	bit SUBSTATUS_CANT_RUN, a
+	jr nz, DontSwitch
+
+	ld a, [wEnemyWrapCount]
+	and a
+	jr nz, DontSwitch
+
+	ld hl, TrainerClassAttributes + TRNATTR_AI_ITEM_SWITCH
+	ld a, [InBattleTowerBattle] ; Load always the first TrainerClass for BattleTower-Trainers
+	and a
+	jr nz, .ok
+
+	ld a, [TrainerClass]
+	dec a
+	ld bc, NUM_TRAINER_ATTRIBUTES
+	call AddNTimes
+.ok
+	bit SWITCH_OFTEN_F, [hl]
+	jp nz, SwitchOften
+	bit SWITCH_RARELY_F, [hl]
+	jp nz, SwitchRarely
+	bit SWITCH_SOMETIMES_F, [hl]
+	jp nz, SwitchSometimes
+	; fallthrough
+
+DontSwitch: ; 38041
+	call AI_TryItem
+	ret
+; 38045
+
+SwitchOften: ; 38045
+	callfar CheckAbleToSwitch
+	ld a, [wEnemySwitchMonParam]
+	and $f0
+	jp z, DontSwitch
+
+	cp $10
+	jr nz, .not_10
+	call Random
+	cp 1 + 50 percent
+	jr c, .switch
+	jp DontSwitch
+.not_10
+
+	cp $20
+	jr nz, .not_20
+	call Random
+	cp -1 + 79 percent
+	jr c, .switch
+	jp DontSwitch
+.not_20
+
+	; $30
+	call Random
+	cp 4 percent
+	jp c, DontSwitch
+
+.switch
+	ld a, [wEnemySwitchMonParam]
+	and $f
+	inc a
+	; In register 'a' is the number (1-6) of the Pkmn to switch to
+	ld [wEnemySwitchMonIndex], a
+	jp AI_TrySwitch
+; 38083
+
+SwitchRarely: ; 38083
+	callfar CheckAbleToSwitch
+	ld a, [wEnemySwitchMonParam]
+	and $f0
+	jp z, DontSwitch
+
+	cp $10
+	jr nz, .not_10
+	call Random
+	cp 8 percent
+	jr c, .switch
+	jp DontSwitch
+.not_10
+
+	cp $20
+	jr nz, .not_20
+	call Random
+	cp 12 percent
+	jr c, .switch
+	jp DontSwitch
+.not_20
+
+	; $30
+	call Random
+	cp -1 + 79 percent
+	jp c, DontSwitch
+
+.switch
+	ld a, [wEnemySwitchMonParam]
+	and $f
+	inc a
+	ld [wEnemySwitchMonIndex], a
+	jp AI_TrySwitch
+; 380c1
+
+SwitchSometimes: ; 380c1
+	callfar CheckAbleToSwitch
+	ld a, [wEnemySwitchMonParam]
+	and $f0
+	jp z, DontSwitch
+
+	cp $10
+	jr nz, .not_10
+	call Random
+	cp -1 + 20 percent
+	jr c, .switch
+	jp DontSwitch
+.not_10
+
+	cp $20
+	jr nz, .not_20
+	call Random
+	cp 1 + 50 percent
+	jr c, .switch
+	jp DontSwitch
+.not_20
+
+	; $30
+	call Random
+	cp -1 + 20 percent
+	jp c, DontSwitch
+
+.switch
+	ld a, [wEnemySwitchMonParam]
+	and $f
+	inc a
+	ld [wEnemySwitchMonIndex], a
+	jp AI_TrySwitch
+; 380ff
+
+
+CheckSubstatusCantRun: ; 380ff
+	ld a, [EnemySubStatus5]
+	bit SUBSTATUS_CANT_RUN, a
+	ret
+; 38105
+
+
+AI_TryItem: ; 38105
+	; items are not allowed in the BattleTower
+	ld a, [InBattleTowerBattle]
+	and a
+	ret nz
+
+	ld a, [wEnemyTrainerItem1]
+	ld b, a
+	ld a, [wEnemyTrainerItem2]
+	or b
+	ret z
+
+	call .IsHighestLevel
+	ret nc
+
+	ld a, [TrainerClass]
+	dec a
+	ld hl, TrainerClassAttributes + TRNATTR_AI_ITEM_SWITCH
+	ld bc, NUM_TRAINER_ATTRIBUTES
+	call AddNTimes
+	ld b, h
+	ld c, l
+	ld hl, AI_Items
+	ld de, wEnemyTrainerItem1
+.loop
+	ld a, [hl]
+	and a
+	inc a
+	ret z
+
+	ld a, [de]
+	cp [hl]
+	jr z, .has_item
+	inc de
+	ld a, [de]
+	cp [hl]
+	jr z, .has_item
+
+	dec de
+	inc hl
+	inc hl
+	inc hl
+	jr .loop
+
+.has_item
+	inc hl
+
+	push hl
+	push de
+	ld de, .callback
+	push de
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	jp hl
+.callback
+	pop de
+	pop hl
+
+	inc hl
+	inc hl
+	jr c, .loop
+
+.used_item
+	xor a
+	ld [de], a
+	inc a
+	ld [wEnemyGoesFirst], a
+
+	ld hl, EnemySubStatus3
+	res SUBSTATUS_BIDE, [hl]
+
+	xor a
+	ld [EnemyFuryCutterCount], a
+	ld [EnemyProtectCount], a
+	ld [wEnemyRageCounter], a
+
+	ld hl, EnemySubStatus4
+	res SUBSTATUS_RAGE, [hl]
+
+	xor a
+	ld [LastEnemyCounterMove], a
+
+	scf
+	ret
+
+
+.IsHighestLevel: ; 38170
+	ld a, [OTPartyCount]
+	ld d, a
+	ld e, 0
+	ld hl, OTPartyMon1Level
+	ld bc, PARTYMON_STRUCT_LENGTH
+.next
+	ld a, [hl]
+	cp e
+	jr c, .ok
+	ld e, a
+.ok
+	add hl, bc
+	dec d
+	jr nz, .next
+
+	ld a, [CurOTMon]
+	ld hl, OTPartyMon1Level
+	call AddNTimes
+	ld a, [hl]
+	cp e
+	jr nc, .yes
+
+.no
+	and a
+	ret
+
+.yes
+	scf
+	ret
+; 38196
+
+
+AI_Items: ; 39196
+	dbw FULL_RESTORE, .FullRestore
+	dbw MAX_POTION,   .MaxPotion
+	dbw HYPER_POTION, .HyperPotion
+	dbw SUPER_POTION, .SuperPotion
+	dbw POTION,       .Potion
+	dbw X_ACCURACY,   .XAccuracy
+	dbw FULL_HEAL,    .FullHeal
+	dbw GUARD_SPEC,   .GuardSpec
+	dbw DIRE_HIT,     .DireHit
+	dbw X_ATTACK,     .XAttack
+	dbw X_DEFEND,     .XDefend
+	dbw X_SPEED,      .XSpeed
+	dbw X_SPECIAL,    .XSpecial
+	db $ff
+; 381be
+
+.FullHeal: ; 381be
+	call .Status
+	jp c, .DontUse
+	call EnemyUsedFullHeal
+	jp .Use
+; 381ca
+
+.Status: ; 381ca (e:41ca)
+	ld a, [EnemyMonStatus]
+	and a
+	jp z, .DontUse
+
+	ld a, [bc]
+	bit CONTEXT_USE_F, a
+	jr nz, .StatusCheckContext
+	ld a, [bc]
+	bit ALWAYS_USE_F, a
+	jp nz, .Use
+	call Random
+	cp -1 + 20 percent
+	jp c, .Use
+	jp .DontUse
+
+.StatusCheckContext:
+	ld a, [EnemySubStatus5]
+	bit SUBSTATUS_TOXIC, a
+	jr z, .FailToxicCheck
+	ld a, [EnemyToxicCount]
+	cp 4
+	jr c, .FailToxicCheck
+	call Random
+	cp 1 + 50 percent
+	jp c, .Use
+.FailToxicCheck:
+	ld a, [EnemyMonStatus]
+	and 1 << FRZ | SLP
+	jp z, .DontUse
+	jp .Use
+; 38208
+
+.FullRestore: ; 38208
+	call .HealItem
+	jp nc, .UseFullRestore
+	ld a, [bc]
+	bit CONTEXT_USE_F, a
+	jp z, .DontUse
+	call .Status
+	jp c, .DontUse
+
+.UseFullRestore:
+	call EnemyUsedFullRestore
+	jp .Use
+; 38220
+
+.MaxPotion: ; 38220
+	call .HealItem
+	jp c, .DontUse
+	call EnemyUsedMaxPotion
+	jp .Use
+
+.HealItem: ; 3822c (e:422c)
+	ld a, [bc]
+	bit CONTEXT_USE_F, a
+	jr nz, .CheckHalfOrQuarterHP
+	callfar AICheckEnemyHalfHP
+	jp c, .DontUse
+	ld a, [bc]
+	bit UNKNOWN_USE_F, a
+	jp nz, .CheckQuarterHP
+	callfar AICheckEnemyQuarterHP
+	jp nc, .UseHealItem
+	call Random
+	cp 1 + 50 percent
+	jp c, .UseHealItem
+	jp .DontUse
+
+.CheckQuarterHP: ; 38254 (e:4254)
+	callfar AICheckEnemyQuarterHP
+	jp c, .DontUse
+	call Random
+	cp -1 + 20 percent
+	jp c, .DontUse
+	jr .UseHealItem
+
+.CheckHalfOrQuarterHP: ; 38267 (e:4267)
+	callfar AICheckEnemyHalfHP
+	jp c, .DontUse
+	callfar AICheckEnemyQuarterHP
+	jp nc, .UseHealItem
+	call Random
+	cp -1 + 20 percent
+	jp nc, .DontUse
+
+.UseHealItem: ; 38281 (e:4281)
+	jp .Use
+; 38284
+
+.HyperPotion: ; 38284
+	call .HealItem
+	jp c, .DontUse
+	ld b, 200
+	call EnemyUsedHyperPotion
+	jp .Use
+; 38292 (e:4292)
+
+.SuperPotion: ; 38292
+	call .HealItem
+	jp c, .DontUse
+	ld b, 50
+	call EnemyUsedSuperPotion
+	jp .Use
+; 382a0
+
+.Potion: ; 382a0
+	call .HealItem
+	jp c, .DontUse
+	ld b, 20
+	call EnemyUsedPotion
+	jp .Use
+; 382ae
+
+.asm_382ae ; This appears to be unused
+	callfar AICheckEnemyMaxHP
+	jr c, .dont_use
+	push bc
+	ld de, EnemyMonMaxHP + 1
+	ld hl, EnemyMonHP + 1
+	ld a, [de]
+	sub [hl]
+	jr z, .check_40_percent
+	dec hl
+	dec de
+	ld c, a
+	sbc [hl]
+	and a
+	jr nz, .check_40_percent
+	ld a, c
+	cp b
+	jp c, .check_50_percent
+	callfar AICheckEnemyQuarterHP
+	jr c, .check_40_percent
+
+.check_50_percent
+	pop bc
+	ld a, [bc]
+	bit UNKNOWN_USE_F, a
+	jp z, .Use
+	call Random
+	cp 1 + 50 percent
+	jp c, .Use
+
+.dont_use
+	jp .DontUse
+
+.check_40_percent
+	pop bc
+	ld a, [bc]
+	bit UNKNOWN_USE_F, a
+	jp z, .DontUse
+	call Random
+	cp 1 + 39 percent
+	jp c, .Use
+	jp .DontUse
+; 382f9
+
+.XAccuracy: ; 382f9
+	call .XItem
+	jp c, .DontUse
+	call EnemyUsedXAccuracy
+	jp .Use
+; 38305
+
+.GuardSpec: ; 38305
+	call .XItem
+	jp c, .DontUse
+	call EnemyUsedGuardSpec
+	jp .Use
+; 38311
+
+.DireHit: ; 38311
+	call .XItem
+	jp c, .DontUse
+	call EnemyUsedDireHit
+	jp .Use
+; 3831d (e:431d)
+
+.XAttack: ; 3831d
+	call .XItem
+	jp c, .DontUse
+	call EnemyUsedXAttack
+	jp .Use
+; 38329
+
+.XDefend: ; 38329
+	call .XItem
+	jp c, .DontUse
+	call EnemyUsedXDefend
+	jp .Use
+; 38335
+
+.XSpeed: ; 38335
+	call .XItem
+	jp c, .DontUse
+	call EnemyUsedXSpeed
+	jp .Use
+; 38341
+
+.XSpecial: ; 38341
+	call .XItem
+	jp c, .DontUse
+	call EnemyUsedXSpecial
+	jp .Use
+; 3834d
+
+.XItem: ; 3834d (e:434d)
+	ld a, [EnemyTurnsTaken]
+	and a
+	jr nz, .notfirstturnout
+	ld a, [bc]
+	bit ALWAYS_USE_F, a
+	jp nz, .Use
+	call Random
+	cp 1 + 50 percent
+	jp c, .DontUse
+	ld a, [bc]
+	bit CONTEXT_USE_F, a
+	jp nz, .Use
+	call Random
+	cp 1 + 50 percent
+	jp c, .DontUse
+	jp .Use
+.notfirstturnout
+	ld a, [bc]
+	bit ALWAYS_USE_F, a
+	jp z, .DontUse
+	call Random
+	cp -1 + 20 percent
+	jp nc, .DontUse
+	jp .Use
+
+.DontUse:
+	scf
+	ret
+
+.Use:
+	and a
+	ret
+
+
+AIUpdateHUD: ; 38387
+	call UpdateEnemyMonInParty
+	farcall UpdateEnemyHUD
+	ld a, $1
+	ld [hBGMapMode], a
+	ld hl, wEnemyItemState
+	dec [hl]
+	scf
+	ret
+; 3839a
+
+AIUsedItemSound: ; 3839a
+	push de
+	ld de, SFX_FULL_HEAL
+	call PlaySFX
+	pop de
+	ret
+; 383a3
+
+
+EnemyUsedFullHeal: ; 383a3 (e:43a3)
+	call AIUsedItemSound
+	call AI_HealStatus
+	ld a, FULL_HEAL
+	jp PrintText_UsedItemOn_AND_AIUpdateHUD
+
+EnemyUsedMaxPotion: ; 383ae (e:43ae)
+	ld a, MAX_POTION
+	ld [CurEnemyItem], a
+	jr FullRestoreContinue
+
+EnemyUsedFullRestore: ; 383b5 (e:43b5)
+	call AI_HealStatus
+	ld a, FULL_RESTORE
+	ld [CurEnemyItem], a
+	ld hl, EnemySubStatus3
+	res SUBSTATUS_CONFUSED, [hl]
+	xor a
+	ld [EnemyConfuseCount], a
+
+FullRestoreContinue: ; 383c6
+	ld de, wCurHPAnimOldHP
+	ld hl, EnemyMonHP + 1
+	ld a, [hld]
+	ld [de], a
+	inc de
+	ld a, [hl]
+	ld [de], a
+	inc de
+	ld hl, EnemyMonMaxHP + 1
+	ld a, [hld]
+	ld [de], a
+	inc de
+	ld [wCurHPAnimMaxHP], a
+	ld [EnemyMonHP + 1], a
+	ld a, [hl]
+	ld [de], a
+	ld [wCurHPAnimMaxHP + 1], a
+	ld [EnemyMonHP], a
+	jr EnemyPotionFinish
+; 383e8 (e:43e8)
+
+EnemyUsedPotion: ; 383e8
+	ld a, POTION
+	ld b, 20
+	jr EnemyPotionContinue
+
+EnemyUsedSuperPotion: ; 383ee
+	ld a, SUPER_POTION
+	ld b, 50
+	jr EnemyPotionContinue
+
+EnemyUsedHyperPotion: ; 383f4 (e:43f4)
+	ld a, HYPER_POTION
+	ld b, 200
+
+EnemyPotionContinue: ; 383f8
+	ld [CurEnemyItem], a
+	ld hl, EnemyMonHP + 1
+	ld a, [hl]
+	ld [wCurHPAnimOldHP], a
+	add b
+	ld [hld], a
+	ld [wCurHPAnimNewHP], a
+	ld a, [hl]
+	ld [wCurHPAnimOldHP + 1], a
+	ld [wCurHPAnimNewHP + 1], a
+	jr nc, .ok
+	inc a
+	ld [hl], a
+	ld [wCurHPAnimNewHP + 1], a
+.ok
+	inc hl
+	ld a, [hld]
+	ld b, a
+	ld de, EnemyMonMaxHP + 1
+	ld a, [de]
+	dec de
+	ld [wCurHPAnimMaxHP], a
+	sub b
+	ld a, [hli]
+	ld b, a
+	ld a, [de]
+	ld [wCurHPAnimMaxHP + 1], a
+	sbc b
+	jr nc, EnemyPotionFinish
+	inc de
+	ld a, [de]
+	dec de
+	ld [hld], a
+	ld [wCurHPAnimNewHP], a
+	ld a, [de]
+	ld [hl], a
+	ld [wCurHPAnimNewHP + 1], a
+
+EnemyPotionFinish: ; 38436
+	call PrintText_UsedItemOn
+	hlcoord 2, 2
+	xor a
+	ld [wWhichHPBar], a
+	call AIUsedItemSound
+	predef AnimateHPBar
+	jp AIUpdateHUD
+
+
+AI_TrySwitch: ; 3844b
+; Determine whether the AI can switch based on how many Pokemon are still alive.
+; If it can switch, it will.
+	ld a, [OTPartyCount]
+	ld c, a
+	ld hl, OTPartyMon1HP
+	ld d, 0
+.SwitchLoop:
+	ld a, [hli]
+	ld b, a
+	ld a, [hld]
+	or b
+	jr z, .fainted
+	inc d
+.fainted
+	push bc
+	ld bc, PARTYMON_STRUCT_LENGTH
+	add hl, bc
+	pop bc
+	dec c
+	jr nz, .SwitchLoop
+
+	ld a, d
+	cp 2
+	jp nc, AI_Switch
+	and a
+	ret
+; 3846c
+
+AI_Switch: ; 3846c
+	ld a, $1
+	ld [wEnemyIsSwitching], a
+	ld [wEnemyGoesFirst], a
+	ld hl, EnemySubStatus4
+	res SUBSTATUS_RAGE, [hl]
+	xor a
+	ld [hBattleTurn], a
+	callfar PursuitSwitch
+
+	push af
+	ld a, [CurOTMon]
+	ld hl, OTPartyMon1Status
+	ld bc, PARTYMON_STRUCT_LENGTH
+	call AddNTimes
+	ld d, h
+	ld e, l
+	ld hl, EnemyMonStatus
+	ld bc, MON_MAXHP - MON_STATUS
+	call CopyBytes
+	pop af
+
+	jr c, .skiptext
+	ld hl, TextJump_EnemyWithdrew
+	call PrintText
+
+.skiptext
+	ld a, 1
+	ld [wBattleHasJustStarted], a
+	callfar NewEnemyMonStatus
+	callfar ResetEnemyStatLevels
+	ld hl, PlayerSubStatus1
+	res SUBSTATUS_IN_LOVE, [hl]
+	farcall EnemySwitch
+	farcall ResetBattleParticipants
+	xor a
+	ld [wBattleHasJustStarted], a
+	ld a, [wLinkMode]
+	and a
+	ret nz
+	scf
+	ret
+; 384d0
+
+TextJump_EnemyWithdrew: ; 384d0
+	text_jump Text_EnemyWithdrew
+	db "@"
+; 384d5
+
+Function384d5: ; This appears to be unused
+	call AIUsedItemSound
+	call AI_HealStatus
+	ld a, FULL_HEAL_RED ; X_SPEED
+	jp PrintText_UsedItemOn_AND_AIUpdateHUD
+; 384e0
+
+AI_HealStatus: ; 384e0
+	ld a, [CurOTMon]
+	ld hl, OTPartyMon1Status
+	ld bc, PARTYMON_STRUCT_LENGTH
+	call AddNTimes
+	xor a
+	ld [hl], a
+	ld [EnemyMonStatus], a
+	; Bug: this should reset SUBSTATUS_NIGHTMARE too
+	; Uncomment the lines below to fix
+	; ld hl, EnemySubStatus1
+	; res SUBSTATUS_NIGHTMARE, [hl]
+	ld hl, EnemySubStatus5
+	res SUBSTATUS_TOXIC, [hl]
+	ret
+; 384f7
+
+EnemyUsedXAccuracy: ; 384f7
+	call AIUsedItemSound
+	ld hl, EnemySubStatus4
+	set SUBSTATUS_X_ACCURACY, [hl]
+	ld a, X_ACCURACY
+	jp PrintText_UsedItemOn_AND_AIUpdateHUD
+; 38504
+
+EnemyUsedGuardSpec: ; 38504
+	call AIUsedItemSound
+	ld hl, EnemySubStatus4
+	set SUBSTATUS_MIST, [hl]
+	ld a, GUARD_SPEC
+	jp PrintText_UsedItemOn_AND_AIUpdateHUD
+; 38511
+
+EnemyUsedDireHit: ; 38511
+	call AIUsedItemSound
+	ld hl, EnemySubStatus4
+	set SUBSTATUS_FOCUS_ENERGY, [hl]
+	ld a, DIRE_HIT
+	jp PrintText_UsedItemOn_AND_AIUpdateHUD
+; 3851e
+
+Function3851e: ; This appears to be unused
+	ld [hDivisor], a
+	ld hl, EnemyMonMaxHP
+	ld a, [hli]
+	ld [hDividend], a
+	ld a, [hl]
+	ld [hDividend + 1], a
+	ld b, 2
+	call Divide
+	ld a, [hQuotient + 2]
+	ld c, a
+	ld a, [hQuotient + 1]
+	ld b, a
+	ld hl, EnemyMonHP + 1
+	ld a, [hld]
+	ld e, a
+	ld a, [hl]
+	ld d, a
+	ld a, d
+	sub b
+	ret nz
+	ld a, e
+	sub c
+	ret
+; 38541
+
+EnemyUsedXAttack: ; 38541
+	ld b, ATTACK
+	ld a, X_ATTACK
+	jr EnemyUsedXItem
+; 38547
+
+EnemyUsedXDefend: ; 38547
+	ld b, DEFENSE
+	ld a, X_DEFEND
+	jr EnemyUsedXItem
+; 3854d
+
+EnemyUsedXSpeed: ; 3854d
+	ld b, SPEED
+	ld a, X_SPEED
+	jr EnemyUsedXItem
+; 38553
+
+EnemyUsedXSpecial: ; 38553
+	ld b, SP_ATTACK
+	ld a, X_SPECIAL
+
+
+; Parameter
+; a = ITEM_CONSTANT
+; b = BATTLE_CONSTANT (ATTACK, DEFENSE, SPEED, SP_ATTACK, SP_DEFENSE, ACCURACY, EVASION)
+EnemyUsedXItem:
+	ld [CurEnemyItem], a
+	push bc
+	call PrintText_UsedItemOn
+	pop bc
+	farcall CheckIfStatCanBeRaised
+	jp AIUpdateHUD
+; 38568
+
+
+; Parameter
+; a = ITEM_CONSTANT
+PrintText_UsedItemOn_AND_AIUpdateHUD: ; 38568
+	ld [CurEnemyItem], a
+	call PrintText_UsedItemOn
+	jp AIUpdateHUD
+; 38571
+
+PrintText_UsedItemOn: ; 38571
+	ld a, [CurEnemyItem]
+	ld [wd265], a
+	call GetItemName
+	ld hl, StringBuffer1
+	ld de, wMonOrItemNameBuffer
+	ld bc, ITEM_NAME_LENGTH
+	call CopyBytes
+	ld hl, TextJump_EnemyUsedOn
+	jp PrintText
+; 3858c
+
+TextJump_EnemyUsedOn: ; 3858c
+	text_jump Text_EnemyUsedOn
+	db "@"
+; 38591
--- /dev/null
+++ b/engine/battle/ai/move.asm
@@ -1,0 +1,221 @@
+AIChooseMove: ; 440ce
+; Score each move in EnemyMonMoves starting from Buffer1. Lower is better.
+; Pick the move with the lowest score.
+
+; Wildmons attack at random.
+	ld a, [wBattleMode]
+	dec a
+	ret z
+
+	ld a, [wLinkMode]
+	and a
+	ret nz
+
+; No use picking a move if there's no choice.
+	farcall CheckEnemyLockedIn
+	ret nz
+
+
+; The default score is 20. Unusable moves are given a score of 80.
+	ld a, 20
+	ld hl, Buffer1
+	ld [hli], a
+	ld [hli], a
+	ld [hli], a
+	ld [hl], a
+
+; Don't pick disabled moves.
+	ld a, [EnemyDisabledMove]
+	and a
+	jr z, .CheckPP
+
+	ld hl, EnemyMonMoves
+	ld c, 0
+.CheckDisabledMove:
+	cp [hl]
+	jr z, .ScoreDisabledMove
+	inc c
+	inc hl
+	jr .CheckDisabledMove
+.ScoreDisabledMove:
+	ld hl, Buffer1
+	ld b, 0
+	add hl, bc
+	ld [hl], 80
+
+; Don't pick moves with 0 PP.
+.CheckPP:
+	ld hl, Buffer1 - 1
+	ld de, EnemyMonPP
+	ld b, 0
+.CheckMovePP:
+	inc b
+	ld a, b
+	cp EnemyMonMovesEnd - EnemyMonMoves + 1
+	jr z, .ApplyLayers
+	inc hl
+	ld a, [de]
+	inc de
+	and $3f
+	jr nz, .CheckMovePP
+	ld [hl], 80
+	jr .CheckMovePP
+
+
+; Apply AI scoring layers depending on the trainer class.
+.ApplyLayers:
+	ld hl, TrainerClassAttributes + TRNATTR_AI_MOVE_WEIGHTS
+
+	; If we have a battle in BattleTower just load the Attributes of the first TrainerClass (Falkner)
+	; so we have always the same AI, regardless of the loaded class of trainer
+	ld a, [InBattleTowerBattle]
+	bit 0, a
+	jr nz, .battle_tower_skip
+
+	ld a, [TrainerClass]
+	dec a
+	ld bc, 7 ; Trainer2AI - Trainer1AI
+	call AddNTimes
+
+.battle_tower_skip
+	lb bc, CHECK_FLAG, 0
+	push bc
+	push hl
+
+.CheckLayer:
+	pop hl
+	pop bc
+
+	ld a, c
+	cp 16 ; up to 16 scoring layers
+	jr z, .DecrementScores
+
+	push bc
+	ld d, BANK(TrainerClassAttributes)
+	predef FlagPredef
+	ld d, c
+	pop bc
+
+	inc c
+	push bc
+	push hl
+
+	ld a, d
+	and a
+	jr z, .CheckLayer
+
+	ld hl, AIScoringPointers
+	dec c
+	ld b, 0
+	add hl, bc
+	add hl, bc
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	ld a, BANK(AIScoring)
+	call FarCall_hl
+
+	jr .CheckLayer
+
+; Decrement the scores of all moves one by one until one reaches 0.
+.DecrementScores:
+	ld hl, Buffer1
+	ld de, EnemyMonMoves
+	ld c, EnemyMonMovesEnd - EnemyMonMoves
+
+.DecrementNextScore:
+	; If the enemy has no moves, this will infinite.
+	ld a, [de]
+	inc de
+	and a
+	jr z, .DecrementScores
+
+	; We are done whenever a score reaches 0
+	dec [hl]
+	jr z, .PickLowestScoreMoves
+
+	; If we just decremented the fourth move's score, go back to the first move
+	inc hl
+	dec c
+	jr z, .DecrementScores
+
+	jr .DecrementNextScore
+
+; In order to avoid bias towards the moves located first in memory, increment the scores
+; that were decremented one more time than the rest (in case there was a tie).
+; This means that the minimum score will be 1.
+.PickLowestScoreMoves:
+	ld a, c
+
+.move_loop
+	inc [hl]
+	dec hl
+	inc a
+	cp NUM_MOVES + 1
+	jr nz, .move_loop
+
+	ld hl, Buffer1
+	ld de, EnemyMonMoves
+	ld c, NUM_MOVES
+
+; Give a score of 0 to a blank move
+.loop2
+	ld a, [de]
+	and a
+	jr nz, .skip_load
+	ld [hl], a
+
+; Disregard the move if its score is not 1
+.skip_load
+	ld a, [hl]
+	dec a
+	jr z, .keep
+	xor a
+	ld [hli], a
+	jr .after_toss
+
+.keep
+	ld a, [de]
+	ld [hli], a
+.after_toss
+	inc de
+	dec c
+	jr nz, .loop2
+
+; Randomly choose one of the moves with a score of 1
+.ChooseMove:
+	ld hl, Buffer1
+	call Random
+	and 3
+	ld c, a
+	ld b, 0
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr z, .ChooseMove
+
+	ld [CurEnemyMove], a
+	ld a, c
+	ld [CurEnemyMoveNum], a
+	ret
+; 441af
+
+
+AIScoringPointers: ; 441af
+	dw AI_Basic
+	dw AI_Setup
+	dw AI_Types
+	dw AI_Offensive
+	dw AI_Smart
+	dw AI_Opportunist
+	dw AI_Aggressive
+	dw AI_Cautious
+	dw AI_Status
+	dw AI_Risky
+	dw AI_None
+	dw AI_None
+	dw AI_None
+	dw AI_None
+	dw AI_None
+	dw AI_None
+; 441cf
--- /dev/null
+++ b/engine/battle/ai/redundant.asm
@@ -1,0 +1,198 @@
+AI_Redundant: ; 2c41a
+; Check if move effect c will fail because it's already been used.
+; Return z if the move is a good choice.
+; Return nz if the move is a bad choice.
+	ld a, c
+	ld de, 3
+	ld hl, .Moves
+	call IsInArray
+	jp nc, .NotRedundant
+	inc hl
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	jp hl
+
+.Moves: ; 2c42c
+	dbw EFFECT_DREAM_EATER,  .DreamEater
+	dbw EFFECT_HEAL,         .Heal
+	dbw EFFECT_LIGHT_SCREEN, .LightScreen
+	dbw EFFECT_MIST,         .Mist
+	dbw EFFECT_FOCUS_ENERGY, .FocusEnergy
+	dbw EFFECT_CONFUSE,      .Confuse
+	dbw EFFECT_TRANSFORM,    .Transform
+	dbw EFFECT_REFLECT,      .Reflect
+	dbw EFFECT_SUBSTITUTE,   .Substitute
+	dbw EFFECT_LEECH_SEED,   .LeechSeed
+	dbw EFFECT_DISABLE,      .Disable
+	dbw EFFECT_ENCORE,       .Encore
+	dbw EFFECT_SNORE,        .Snore
+	dbw EFFECT_SLEEP_TALK,   .SleepTalk
+	dbw EFFECT_MEAN_LOOK,    .MeanLook
+	dbw EFFECT_NIGHTMARE,    .Nightmare
+	dbw EFFECT_SPIKES,       .Spikes
+	dbw EFFECT_FORESIGHT,    .Foresight
+	dbw EFFECT_PERISH_SONG,  .PerishSong
+	dbw EFFECT_SANDSTORM,    .Sandstorm
+	dbw EFFECT_ATTRACT,      .Attract
+	dbw EFFECT_SAFEGUARD,    .Safeguard
+	dbw EFFECT_RAIN_DANCE,   .RainDance
+	dbw EFFECT_SUNNY_DAY,    .SunnyDay
+	dbw EFFECT_TELEPORT,     .Teleport
+	dbw EFFECT_MORNING_SUN,  .MorningSun
+	dbw EFFECT_SYNTHESIS,    .Synthesis
+	dbw EFFECT_MOONLIGHT,    .Moonlight
+	dbw EFFECT_SWAGGER,      .Swagger
+	dbw EFFECT_FUTURE_SIGHT, .FutureSight
+	db -1
+
+.LightScreen: ; 2c487
+	ld a, [EnemyScreens]
+	bit SCREENS_LIGHT_SCREEN, a
+	ret
+
+.Mist: ; 2c48d
+	ld a, [EnemySubStatus4]
+	bit SUBSTATUS_MIST, a
+	ret
+
+.FocusEnergy: ; 2c493
+	ld a, [EnemySubStatus4]
+	bit SUBSTATUS_FOCUS_ENERGY, a
+	ret
+
+.Confuse: ; 2c499
+	ld a, [PlayerSubStatus3]
+	bit SUBSTATUS_CONFUSED, a
+	ret nz
+	ld a, [PlayerScreens]
+	bit SCREENS_SAFEGUARD, a
+	ret
+
+.Transform: ; 2c4a5
+	ld a, [EnemySubStatus5]
+	bit SUBSTATUS_TRANSFORMED, a
+	ret
+
+.Reflect: ; 2c4ab
+	ld a, [EnemyScreens]
+	bit SCREENS_REFLECT, a
+	ret
+
+.Substitute: ; 2c4b1
+	ld a, [EnemySubStatus4]
+	bit SUBSTATUS_SUBSTITUTE, a
+	ret
+
+.LeechSeed: ; 2c4b7
+	ld a, [PlayerSubStatus4]
+	bit SUBSTATUS_LEECH_SEED, a
+	ret
+
+.Disable: ; 2c4bd
+	ld a, [PlayerDisableCount]
+	and a
+	ret
+
+.Encore: ; 2c4c2
+	ld a, [PlayerSubStatus5]
+	bit SUBSTATUS_ENCORED, a
+	ret
+
+.Snore:
+.SleepTalk: ; 2c4c8
+	ld a, [EnemyMonStatus]
+	and SLP
+	jr z, .Redundant
+	jr .NotRedundant
+
+.MeanLook: ; 2c4d1
+	ld a, [EnemySubStatus5]
+	bit SUBSTATUS_CANT_RUN, a
+	ret
+
+.Nightmare: ; 2c4d7
+	ld a, [BattleMonStatus]
+	and a
+	jr z, .Redundant
+	ld a, [PlayerSubStatus1]
+	bit SUBSTATUS_NIGHTMARE, a
+	ret
+
+.Spikes: ; 2c4e3
+	ld a, [PlayerScreens]
+	bit SCREENS_SPIKES, a
+	ret
+
+.Foresight: ; 2c4e9
+	ld a, [PlayerSubStatus1]
+	bit SUBSTATUS_IDENTIFIED, a
+	ret
+
+.PerishSong: ; 2c4ef
+	ld a, [PlayerSubStatus1]
+	bit SUBSTATUS_PERISH, a
+	ret
+
+.Sandstorm: ; 2c4f5
+	ld a, [Weather]
+	cp WEATHER_SANDSTORM
+	jr z, .Redundant
+	jr .NotRedundant
+
+.Attract: ; 2c4fe
+	farcall CheckOppositeGender
+	jr c, .Redundant
+	ld a, [PlayerSubStatus1]
+	bit SUBSTATUS_IN_LOVE, a
+	ret
+
+.Safeguard: ; 2c50c
+	ld a, [EnemyScreens]
+	bit SCREENS_SAFEGUARD, a
+	ret
+
+.RainDance: ; 2c512
+	ld a, [Weather]
+	cp WEATHER_RAIN
+	jr z, .Redundant
+	jr .NotRedundant
+
+.SunnyDay: ; 2c51b
+	ld a, [Weather]
+	cp WEATHER_SUN
+	jr z, .Redundant
+	jr .NotRedundant
+
+.DreamEater: ; 2c524
+	ld a, [BattleMonStatus]
+	and SLP
+	jr z, .Redundant
+	jr .NotRedundant
+
+.Swagger: ; 2c52d
+	ld a, [PlayerSubStatus3]
+	bit SUBSTATUS_CONFUSED, a
+	ret
+
+.FutureSight: ; 2c533
+	ld a, [EnemyScreens]
+	bit 5, a
+	ret
+
+.Heal:
+.MorningSun:
+.Synthesis:
+.Moonlight: ; 2c539
+	farcall AICheckEnemyMaxHP
+	jr nc, .NotRedundant
+
+.Teleport:
+.Redundant: ; 2c541
+	ld a, 1
+	and a
+	ret
+
+.NotRedundant: ; 2c545
+	xor a
+	ret
--- /dev/null
+++ b/engine/battle/ai/scoring.asm
@@ -1,0 +1,3598 @@
+AIScoring: ; 38591
+
+AI_Basic: ; 38591
+; Don't do anything redundant:
+;  -Using status-only moves if the player can't be statused
+;  -Using moves that fail if they've already been used
+
+	ld hl, Buffer1 - 1
+	ld de, EnemyMonMoves
+	ld b, EnemyMonMovesEnd - EnemyMonMoves + 1
+.checkmove
+	dec b
+	ret z
+
+	inc hl
+	ld a, [de]
+	and a
+	ret z
+
+	inc de
+	call AIGetEnemyMove
+
+	ld a, [wEnemyMoveStruct + MOVE_EFFECT]
+	ld c, a
+
+; Dismiss moves with special effects if they are
+; useless or not a good choice right now.
+; For example, healing moves, weather moves, Dream Eater...
+	push hl
+	push de
+	push bc
+	farcall AI_Redundant
+	pop bc
+	pop de
+	pop hl
+	jr nz, .discourage
+
+; Dismiss status-only moves if the player can't be statused.
+	ld a, [wEnemyMoveStruct + MOVE_EFFECT]
+	push hl
+	push de
+	push bc
+	ld hl, .statusonlyeffects
+	ld de, 1
+	call IsInArray
+
+	pop bc
+	pop de
+	pop hl
+	jr nc, .checkmove
+
+	ld a, [BattleMonStatus]
+	and a
+	jr nz, .discourage
+
+; Dismiss Safeguard if it's already active.
+	ld a, [PlayerScreens]
+	bit SCREENS_SAFEGUARD, a
+	jr z, .checkmove
+
+.discourage
+	call AIDiscourageMove
+	jr .checkmove
+; 385db
+
+.statusonlyeffects
+	db EFFECT_SLEEP
+	db EFFECT_TOXIC
+	db EFFECT_POISON
+	db EFFECT_PARALYZE
+	db $ff
+; 385e0
+
+
+
+AI_Setup: ; 385e0
+; Use stat-modifying moves on turn 1.
+
+; 50% chance to greatly encourage stat-up moves during the first turn of enemy's Pokemon.
+; 50% chance to greatly encourage stat-down moves during the first turn of player's Pokemon.
+; Almost 90% chance to greatly discourage stat-modifying moves otherwise.
+
+	ld hl, Buffer1 - 1
+	ld de, EnemyMonMoves
+	ld b, EnemyMonMovesEnd - EnemyMonMoves + 1
+.checkmove
+	dec b
+	ret z
+
+	inc hl
+	ld a, [de]
+	and a
+	ret z
+
+	inc de
+	call AIGetEnemyMove
+
+	ld a, [wEnemyMoveStruct + MOVE_EFFECT]
+
+	cp EFFECT_ATTACK_UP
+	jr c, .checkmove
+	cp EFFECT_EVASION_UP + 1
+	jr c, .statup
+
+;	cp EFFECT_ATTACK_DOWN - 1
+	jr z, .checkmove
+	cp EFFECT_EVASION_DOWN + 1
+	jr c, .statdown
+
+	cp EFFECT_ATTACK_UP_2
+	jr c, .checkmove
+	cp EFFECT_EVASION_UP_2 + 1
+	jr c, .statup
+
+;	cp EFFECT_ATTACK_DOWN_2 - 1
+	jr z, .checkmove
+	cp EFFECT_EVASION_DOWN_2 + 1
+	jr c, .statdown
+
+	jr .checkmove
+
+.statup
+	ld a, [EnemyTurnsTaken]
+	and a
+	jr nz, .discourage
+
+	jr .encourage
+
+.statdown
+	ld a, [PlayerTurnsTaken]
+	and a
+	jr nz, .discourage
+
+.encourage
+	call AI_50_50
+	jr c, .checkmove
+
+	dec [hl]
+	dec [hl]
+	jr .checkmove
+
+.discourage
+	call Random
+	cp 12 percent
+	jr c, .checkmove
+	inc [hl]
+	inc [hl]
+	jr .checkmove
+; 38635
+
+
+
+AI_Types: ; 38635
+; Dismiss any move that the player is immune to.
+; Encourage super-effective moves.
+; Discourage not very effective moves unless
+; all damaging moves are of the same type.
+
+	ld hl, Buffer1 - 1
+	ld de, EnemyMonMoves
+	ld b, EnemyMonMovesEnd - EnemyMonMoves + 1
+.checkmove
+	dec b
+	ret z
+
+	inc hl
+	ld a, [de]
+	and a
+	ret z
+
+	inc de
+	call AIGetEnemyMove
+
+	push hl
+	push bc
+	push de
+	ld a, 1
+	ld [hBattleTurn], a
+	callfar BattleCheckTypeMatchup
+	pop de
+	pop bc
+	pop hl
+
+	ld a, [wd265]
+	and a
+	jr z, .immune
+	cp 10 ; 1.0
+	jr z, .checkmove
+	jr c, .noteffective
+
+; effective
+	ld a, [wEnemyMoveStruct + MOVE_POWER]
+	and a
+	jr z, .checkmove
+	dec [hl]
+	jr .checkmove
+
+.noteffective
+; Discourage this move if there are any moves
+; that do damage of a different type.
+	push hl
+	push de
+	push bc
+	ld a, [wEnemyMoveStruct + MOVE_TYPE]
+	ld d, a
+	ld hl, EnemyMonMoves
+	ld b, EnemyMonMovesEnd - EnemyMonMoves + 1
+	ld c, 0
+.checkmove2
+	dec b
+	jr z, .asm_38693
+
+	ld a, [hli]
+	and a
+	jr z, .asm_38693
+
+	call AIGetEnemyMove
+	ld a, [wEnemyMoveStruct + MOVE_TYPE]
+	cp d
+	jr z, .checkmove2
+	ld a, [wEnemyMoveStruct + MOVE_POWER]
+	and a
+	jr nz, .asm_38692
+	jr .checkmove2
+
+.asm_38692
+	ld c, a
+.asm_38693
+	ld a, c
+	pop bc
+	pop de
+	pop hl
+	and a
+	jr z, .checkmove
+	inc [hl]
+	jr .checkmove
+
+.immune
+	call AIDiscourageMove
+	jr .checkmove
+; 386a2
+
+
+
+AI_Offensive: ; 386a2
+; Greatly discourage non-damaging moves.
+
+	ld hl, Buffer1 - 1
+	ld de, EnemyMonMoves
+	ld b, EnemyMonMovesEnd - EnemyMonMoves + 1
+.checkmove
+	dec b
+	ret z
+
+	inc hl
+	ld a, [de]
+	and a
+	ret z
+
+	inc de
+	call AIGetEnemyMove
+
+	ld a, [wEnemyMoveStruct + MOVE_POWER]
+	and a
+	jr nz, .checkmove
+
+	inc [hl]
+	inc [hl]
+	jr .checkmove
+; 386be
+
+
+
+AI_Smart: ; 386be
+; Context-specific scoring.
+
+	ld hl, Buffer1
+	ld de, EnemyMonMoves
+	ld b, EnemyMonMovesEnd - EnemyMonMoves + 1
+.checkmove
+	dec b
+	ret z
+
+	ld a, [de]
+	inc de
+	and a
+	ret z
+
+	push de
+	push bc
+	push hl
+	call AIGetEnemyMove
+
+	ld a, [wEnemyMoveStruct + MOVE_EFFECT]
+	ld hl, .table_386f2
+	ld de, 3
+	call IsInArray
+
+	inc hl
+	jr nc, .nextmove
+
+	ld a, [hli]
+	ld e, a
+	ld d, [hl]
+
+	pop hl
+	push hl
+
+	ld bc, .nextmove
+	push bc
+
+	push de
+	ret
+
+.nextmove
+	pop hl
+	pop bc
+	pop de
+	inc hl
+	jr .checkmove
+
+.table_386f2
+	dbw EFFECT_SLEEP,            AI_Smart_Sleep
+	dbw EFFECT_LEECH_HIT,        AI_Smart_LeechHit
+	dbw EFFECT_SELFDESTRUCT,     AI_Smart_Selfdestruct
+	dbw EFFECT_DREAM_EATER,      AI_Smart_DreamEater
+	dbw EFFECT_MIRROR_MOVE,      AI_Smart_MirrorMove
+	dbw EFFECT_EVASION_UP,       AI_Smart_EvasionUp
+	dbw EFFECT_ALWAYS_HIT,       AI_Smart_AlwaysHit
+	dbw EFFECT_ACCURACY_DOWN,    AI_Smart_AccuracyDown
+	dbw EFFECT_RESET_STATS,      AI_Smart_ResetStats
+	dbw EFFECT_BIDE,             AI_Smart_Bide
+	dbw EFFECT_FORCE_SWITCH,     AI_Smart_ForceSwitch
+	dbw EFFECT_HEAL,             AI_Smart_Heal
+	dbw EFFECT_TOXIC,            AI_Smart_Toxic
+	dbw EFFECT_LIGHT_SCREEN,     AI_Smart_LightScreen
+	dbw EFFECT_OHKO,             AI_Smart_Ohko
+	dbw EFFECT_RAZOR_WIND,       AI_Smart_RazorWind
+	dbw EFFECT_SUPER_FANG,       AI_Smart_SuperFang
+	dbw EFFECT_TRAP_TARGET,      AI_Smart_TrapTarget
+	dbw EFFECT_UNUSED_2B,        AI_Smart_Unused2B
+	dbw EFFECT_CONFUSE,          AI_Smart_Confuse
+	dbw EFFECT_SP_DEF_UP_2,      AI_Smart_SpDefenseUp2
+	dbw EFFECT_REFLECT,          AI_Smart_Reflect
+	dbw EFFECT_PARALYZE,         AI_Smart_Paralyze
+	dbw EFFECT_SPEED_DOWN_HIT,   AI_Smart_SpeedDownHit
+	dbw EFFECT_SUBSTITUTE,       AI_Smart_Substitute
+	dbw EFFECT_HYPER_BEAM,       AI_Smart_HyperBeam
+	dbw EFFECT_RAGE,             AI_Smart_Rage
+	dbw EFFECT_MIMIC,            AI_Smart_Mimic
+	dbw EFFECT_LEECH_SEED,       AI_Smart_LeechSeed
+	dbw EFFECT_DISABLE,          AI_Smart_Disable
+	dbw EFFECT_COUNTER,          AI_Smart_Counter
+	dbw EFFECT_ENCORE,           AI_Smart_Encore
+	dbw EFFECT_PAIN_SPLIT,       AI_Smart_PainSplit
+	dbw EFFECT_SNORE,            AI_Smart_Snore
+	dbw EFFECT_CONVERSION2,      AI_Smart_Conversion2
+	dbw EFFECT_LOCK_ON,          AI_Smart_LockOn
+	dbw EFFECT_DEFROST_OPPONENT, AI_Smart_DefrostOpponent
+	dbw EFFECT_SLEEP_TALK,       AI_Smart_SleepTalk
+	dbw EFFECT_DESTINY_BOND,     AI_Smart_DestinyBond
+	dbw EFFECT_REVERSAL,         AI_Smart_Reversal
+	dbw EFFECT_SPITE,            AI_Smart_Spite
+	dbw EFFECT_HEAL_BELL,        AI_Smart_HealBell
+	dbw EFFECT_PRIORITY_HIT,     AI_Smart_PriorityHit
+	dbw EFFECT_THIEF,            AI_Smart_Thief
+	dbw EFFECT_MEAN_LOOK,        AI_Smart_MeanLook
+	dbw EFFECT_NIGHTMARE,        AI_Smart_Nightmare
+	dbw EFFECT_FLAME_WHEEL,      AI_Smart_FlameWheel
+	dbw EFFECT_CURSE,            AI_Smart_Curse
+	dbw EFFECT_PROTECT,          AI_Smart_Protect
+	dbw EFFECT_FORESIGHT,        AI_Smart_Foresight
+	dbw EFFECT_PERISH_SONG,      AI_Smart_PerishSong
+	dbw EFFECT_SANDSTORM,        AI_Smart_Sandstorm
+	dbw EFFECT_ENDURE,           AI_Smart_Endure
+	dbw EFFECT_ROLLOUT,          AI_Smart_Rollout
+	dbw EFFECT_SWAGGER,          AI_Smart_Swagger
+	dbw EFFECT_FURY_CUTTER,      AI_Smart_FuryCutter
+	dbw EFFECT_ATTRACT,          AI_Smart_Attract
+	dbw EFFECT_SAFEGUARD,        AI_Smart_Safeguard
+	dbw EFFECT_MAGNITUDE,        AI_Smart_Magnitude
+	dbw EFFECT_BATON_PASS,       AI_Smart_BatonPass
+	dbw EFFECT_PURSUIT,          AI_Smart_Pursuit
+	dbw EFFECT_RAPID_SPIN,       AI_Smart_RapidSpin
+	dbw EFFECT_MORNING_SUN,      AI_Smart_MorningSun
+	dbw EFFECT_SYNTHESIS,        AI_Smart_Synthesis
+	dbw EFFECT_MOONLIGHT,        AI_Smart_Moonlight
+	dbw EFFECT_HIDDEN_POWER,     AI_Smart_HiddenPower
+	dbw EFFECT_RAIN_DANCE,       AI_Smart_RainDance
+	dbw EFFECT_SUNNY_DAY,        AI_Smart_SunnyDay
+	dbw EFFECT_BELLY_DRUM,       AI_Smart_BellyDrum
+	dbw EFFECT_PSYCH_UP,         AI_Smart_PsychUp
+	dbw EFFECT_MIRROR_COAT,      AI_Smart_MirrorCoat
+	dbw EFFECT_SKULL_BASH,       AI_Smart_SkullBash
+	dbw EFFECT_TWISTER,          AI_Smart_Twister
+	dbw EFFECT_EARTHQUAKE,       AI_Smart_Earthquake
+	dbw EFFECT_FUTURE_SIGHT,     AI_Smart_FutureSight
+	dbw EFFECT_GUST,             AI_Smart_Gust
+	dbw EFFECT_STOMP,            AI_Smart_Stomp
+	dbw EFFECT_SOLARBEAM,        AI_Smart_Solarbeam
+	dbw EFFECT_THUNDER,          AI_Smart_Thunder
+	dbw EFFECT_FLY,              AI_Smart_Fly
+	db $ff
+; 387e3
+
+
+AI_Smart_Sleep: ; 387e3
+; Greatly encourage sleep inducing moves if the enemy has either Dream Eater or Nightmare.
+; 50% chance to greatly encourage sleep inducing moves otherwise.
+
+	ld b, EFFECT_DREAM_EATER
+	call AIHasMoveEffect
+	jr c, .asm_387f0
+
+	ld b, EFFECT_NIGHTMARE
+	call AIHasMoveEffect
+	ret nc
+
+.asm_387f0
+	call AI_50_50
+	ret c
+	dec [hl]
+	dec [hl]
+	ret
+; 387f7
+
+
+AI_Smart_LeechHit: ; 387f7
+	push hl
+	ld a, 1
+	ld [hBattleTurn], a
+	callfar BattleCheckTypeMatchup
+	pop hl
+
+; 60% chance to discourage this move if not very effective.
+	ld a, [wd265]
+	cp 10 ; 1.0
+	jr c, .asm_38815
+
+; Do nothing if effectiveness is neutral.
+	ret z
+
+; Do nothing if enemy's HP is full.
+	call AICheckEnemyMaxHP
+	ret c
+
+; 80% chance to encourage this move otherwise.
+	call AI_80_20
+	ret c
+
+	dec [hl]
+	ret
+
+.asm_38815
+	call Random
+	cp 39 percent + 1
+	ret c
+
+	inc [hl]
+	ret
+; 3881d
+
+
+AI_Smart_LockOn: ; 3881d
+	ld a, [PlayerSubStatus5]
+	bit SUBSTATUS_LOCK_ON, a
+	jr nz, .asm_38882
+
+	push hl
+	call AICheckEnemyQuarterHP
+	jr nc, .asm_38877
+
+	call AICheckEnemyHalfHP
+	jr c, .asm_38834
+
+	call AICompareSpeed
+	jr nc, .asm_38877
+
+.asm_38834
+	ld a, [PlayerEvaLevel]
+	cp $a
+	jr nc, .asm_3887a
+	cp $8
+	jr nc, .asm_38875
+
+	ld a, [EnemyAccLevel]
+	cp $5
+	jr c, .asm_3887a
+	cp $7
+	jr c, .asm_38875
+
+	ld hl, EnemyMonMoves
+	ld c, EnemyMonMovesEnd - EnemyMonMoves + 1
+.asm_3884f
+	dec c
+	jr z, .asm_38877
+
+	ld a, [hli]
+	and a
+	jr z, .asm_38877
+
+	call AIGetEnemyMove
+
+	ld a, [wEnemyMoveStruct + MOVE_ACC]
+	cp 180
+	jr nc, .asm_3884f
+
+	ld a, $1
+	ld [hBattleTurn], a
+
+	push hl
+	push bc
+	farcall BattleCheckTypeMatchup
+	ld a, [wd265]
+	cp $a
+	pop bc
+	pop hl
+	jr c, .asm_3884f
+
+.asm_38875
+	pop hl
+	ret
+
+.asm_38877
+	pop hl
+	inc [hl]
+	ret
+
+.asm_3887a
+	pop hl
+	call AI_50_50
+	ret c
+
+	dec [hl]
+	dec [hl]
+	ret
+
+.asm_38882
+	push hl
+	ld hl, Buffer1 - 1
+	ld de, EnemyMonMoves
+	ld c, EnemyMonMovesEnd - EnemyMonMoves + 1
+
+.asm_3888b
+	inc hl
+	dec c
+	jr z, .asm_388a2
+
+	ld a, [de]
+	and a
+	jr z, .asm_388a2
+
+	inc de
+	call AIGetEnemyMove
+
+	ld a, [wEnemyMoveStruct + MOVE_ACC]
+	cp 180
+	jr nc, .asm_3888b
+
+	dec [hl]
+	dec [hl]
+	jr .asm_3888b
+
+.asm_388a2
+	pop hl
+	jp AIDiscourageMove
+; 388a6
+
+
+AI_Smart_Selfdestruct: ; 388a6
+; Selfdestruct, Explosion
+
+; Unless this is the enemy's last Pokemon...
+	push hl
+	farcall FindAliveEnemyMons
+	pop hl
+	jr nc, .asm_388b7
+
+; ...greatly discourage this move unless this is the player's last Pokemon too.
+	push hl
+	call AICheckLastPlayerMon
+	pop hl
+	jr nz, .asm_388c6
+
+.asm_388b7
+; Greatly discourage this move if enemy's HP is above 50%.
+	call AICheckEnemyHalfHP
+	jr c, .asm_388c6
+
+; Do nothing if enemy's HP is below 25%.
+	call AICheckEnemyQuarterHP
+	ret nc
+
+; If enemy's HP is between 25% and 50%,
+; over 90% chance to greatly discourage this move.
+	call Random
+	cp 9 percent - 2
+	ret c
+
+.asm_388c6
+	inc [hl]
+	inc [hl]
+	inc [hl]
+	ret
+; 388ca
+
+
+AI_Smart_DreamEater: ; 388ca
+; 90% chance to greatly encourage this move.
+; The AI_Basic layer will make sure that
+; Dream Eater is only used against sleeping targets.
+	call Random
+	cp 10 percent
+	ret c
+	dec [hl]
+	dec [hl]
+	dec [hl]
+	ret
+; 388d4
+
+
+AI_Smart_EvasionUp: ; 388d4
+
+; Dismiss this move if enemy's evasion can't raise anymore.
+	ld a, [EnemyEvaLevel]
+	cp $d
+	jp nc, AIDiscourageMove
+
+; If enemy's HP is full...
+	call AICheckEnemyMaxHP
+	jr nc, .asm_388f2
+
+; ...greatly encourage this move if player is badly poisoned.
+	ld a, [PlayerSubStatus5]
+	bit SUBSTATUS_TOXIC, a
+	jr nz, .asm_388ef
+
+; ...70% chance to greatly encourage this move if player is not badly poisoned.
+	call Random
+	cp 70 percent
+	jr nc, .asm_38911
+
+.asm_388ef
+	dec [hl]
+	dec [hl]
+	ret
+
+.asm_388f2
+
+; Greatly discourage this move if enemy's HP is below 25%.
+	call AICheckEnemyQuarterHP
+	jr nc, .asm_3890f
+
+; If enemy's HP is above 25% but not full, 4% chance to greatly encourage this move.
+	call Random
+	cp 4 percent
+	jr c, .asm_388ef
+
+; If enemy's HP is between 25% and 50%,...
+	call AICheckEnemyHalfHP
+	jr nc, .asm_3890a
+
+; If enemy's HP is above 50% but not full, 20% chance to greatly encourage this move.
+	call AI_80_20
+	jr c, .asm_388ef
+	jr .asm_38911
+
+.asm_3890a
+; ...50% chance to greatly discourage this move.
+	call AI_50_50
+	jr c, .asm_38911
+
+.asm_3890f
+	inc [hl]
+	inc [hl]
+
+; 30% chance to end up here if enemy's HP is full and player is not badly poisoned.
+; 77% chance to end up here if enemy's HP is above 50% but not full.
+; 96% chance to end up here if enemy's HP is between 25% and 50%.
+; 100% chance to end up here if enemy's HP is below 25%.
+; In other words, we only end up here if the move has not been encouraged or dismissed.
+.asm_38911
+	ld a, [PlayerSubStatus5]
+	bit SUBSTATUS_TOXIC, a
+	jr nz, .asm_38938
+
+	ld a, [PlayerSubStatus4]
+	bit SUBSTATUS_LEECH_SEED, a
+	jr nz, .asm_38941
+
+; Discourage this move if enemy's evasion level is higher than player's accuracy level.
+	ld a, [EnemyEvaLevel]
+	ld b, a
+	ld a, [PlayerAccLevel]
+	cp b
+	jr c, .asm_38936
+
+; Greatly encourage this move if the player is in the middle of Fury Cutter or Rollout.
+	ld a, [PlayerFuryCutterCount]
+	and a
+	jr nz, .asm_388ef
+
+	ld a, [PlayerSubStatus1]
+	bit SUBSTATUS_ROLLOUT, a
+	jr nz, .asm_388ef
+
+
+.asm_38936
+	inc [hl]
+	ret
+
+; Player is badly poisoned.
+; 70% chance to greatly encourage this move.
+; This would counter any previous discouragement.
+.asm_38938
+	call Random
+	cp 31 percent + 1
+	ret c
+	dec [hl]
+	dec [hl]
+	ret
+
+; Player is seeded.
+; 50% chance to encourage this move.
+; This would partly counter any previous discouragement.
+.asm_38941
+	call AI_50_50
+	ret c
+
+	dec [hl]
+	ret
+; 38947
+
+
+AI_Smart_AlwaysHit: ; 38947
+; 80% chance to greatly encourage this move if either...
+
+; ...enemy's accuracy level has been lowered three or more stages
+	ld a, [EnemyAccLevel]
+	cp $5
+	jr c, .asm_38954
+
+; ...or player's evasion level has been raised three or more stages.
+	ld a, [PlayerEvaLevel]
+	cp $a
+	ret c
+
+.asm_38954
+	call AI_80_20
+	ret c
+
+	dec [hl]
+	dec [hl]
+	ret
+; 3895b
+
+
+AI_Smart_MirrorMove: ; 3895b
+
+; If the player did not use any move last turn...
+	ld a, [LastPlayerCounterMove]
+	and a
+	jr nz, .asm_38968
+
+; ...do nothing if enemy is slower than player
+	call AICompareSpeed
+	ret nc
+
+; ...or dismiss this move if enemy is faster than player.
+	jp AIDiscourageMove
+
+; If the player did use a move last turn...
+.asm_38968
+	push hl
+	ld hl, UsefulMoves
+	ld de, 1
+	call IsInArray
+	pop hl
+
+; ...do nothing if he didn't use a useful move.
+	ret nc
+
+; If he did, 50% chance to encourage this move...
+	call AI_50_50
+	ret c
+
+	dec [hl]
+
+; ...and 90% chance to encourage this move again if the enemy is faster.
+	call AICompareSpeed
+	ret nc
+
+	call Random
+	cp 10 percent
+	ret c
+
+	dec [hl]
+	ret
+; 38985
+
+
+AI_Smart_AccuracyDown: ; 38985
+
+; If player's HP is full...
+	call AICheckPlayerMaxHP
+	jr nc, .asm_389a0
+
+; ...and enemy's HP is above 50%...
+	call AICheckEnemyHalfHP
+	jr nc, .asm_389a0
+
+; ...greatly encourage this move if player is badly poisoned.
+	ld a, [PlayerSubStatus5]
+	bit SUBSTATUS_TOXIC, a
+	jr nz, .asm_3899d
+
+; ...70% chance to greatly encourage this move if player is not badly poisoned.
+	call Random
+	cp 70 percent
+	jr nc, .asm_389bf
+
+.asm_3899d
+	dec [hl]
+	dec [hl]
+	ret
+
+.asm_389a0
+
+; Greatly discourage this move if player's HP is below 25%.
+	call AICheckPlayerQuarterHP
+	jr nc, .asm_389bd
+
+; If player's HP is above 25% but not full, 4% chance to greatly encourage this move.
+	call Random
+	cp 4 percent
+	jr c, .asm_3899d
+
+; If player's HP is between 25% and 50%,...
+	call AICheckPlayerHalfHP
+	jr nc, .asm_389b8
+
+; If player's HP is above 50% but not full, 20% chance to greatly encourage this move.
+	call AI_80_20
+	jr c, .asm_3899d
+	jr .asm_389bf
+
+; ...50% chance to greatly discourage this move.
+.asm_389b8
+	call AI_50_50
+	jr c, .asm_389bf
+
+.asm_389bd
+	inc [hl]
+	inc [hl]
+
+; We only end up here if the move has not been already encouraged.
+.asm_389bf
+	ld a, [PlayerSubStatus5]
+	bit SUBSTATUS_TOXIC, a
+	jr nz, .asm_389e6
+
+	ld a, [PlayerSubStatus4]
+	bit SUBSTATUS_LEECH_SEED, a
+	jr nz, .asm_389ef
+
+; Discourage this move if enemy's evasion level is higher than player's accuracy level.
+	ld a, [EnemyEvaLevel]
+	ld b, a
+	ld a, [PlayerAccLevel]
+	cp b
+	jr c, .asm_389e4
+
+; Greatly encourage this move if the player is in the middle of Fury Cutter or Rollout.
+	ld a, [PlayerFuryCutterCount]
+	and a
+	jr nz, .asm_3899d
+
+	ld a, [PlayerSubStatus1]
+	bit SUBSTATUS_ROLLOUT, a
+	jr nz, .asm_3899d
+
+.asm_389e4
+	inc [hl]
+	ret
+
+; Player is badly poisoned.
+; 70% chance to greatly encourage this move.
+; This would counter any previous discouragement.
+.asm_389e6
+	call Random
+	cp 31 percent + 1
+	ret c
+	dec [hl]
+	dec [hl]
+	ret
+
+; Player is seeded.
+; 50% chance to encourage this move.
+; This would partly counter any previous discouragement.
+.asm_389ef
+	call AI_50_50
+	ret c
+
+	dec [hl]
+	ret
+; 389f5
+
+
+AI_Smart_ResetStats: ; 389f5
+
+; 85% chance to encourage this move if any of enemy's stat levels is lower than -2.
+	push hl
+	ld hl, EnemyAtkLevel
+	ld c, $8
+.asm_389fb
+	dec c
+	jr z, .asm_38a05
+	ld a, [hli]
+	cp $5
+	jr c, .asm_38a12
+	jr .asm_389fb
+
+; 85% chance to encourage this move if any of player's stat levels is higher than +2.
+.asm_38a05
+	ld hl, PlayerAtkLevel
+	ld c, $8
+.asm_38a0a
+	dec c
+	jr z, .asm_38a1b
+	ld a, [hli]
+	cp $a
+	jr c, .asm_38a0a
+
+.asm_38a12
+	pop hl
+	call Random
+	cp 16 percent
+	ret c
+	dec [hl]
+	ret
+
+; Discourage this move if neither:
+; Any of enemy's stat levels is	lower than -2.
+; Any of player's stat levels is higher than +2.
+.asm_38a1b
+	pop hl
+	inc [hl]
+	ret
+; 38a1e
+
+
+AI_Smart_Bide: ; 38a1e
+; 90% chance to discourage this move unless enemy's HP is full.
+
+	call AICheckEnemyMaxHP
+	ret c
+	call Random
+	cp 10 percent
+	ret c
+	inc [hl]
+	ret
+; 38a2a
+
+
+AI_Smart_ForceSwitch: ; 38a2a
+; Whirlwind, Roar.
+
+; Discourage this move if the player has not shown
+; a super-effective move against the enemy.
+; Consider player's type(s) if its moves are unknown.
+
+	push hl
+	callfar CheckPlayerMoveTypeMatchups
+	ld a, [wEnemyAISwitchScore]
+	cp 10 ; neutral
+	pop hl
+	ret c
+	inc [hl]
+	ret
+; 38a3a
+
+
+AI_Smart_Heal:
+AI_Smart_MorningSun:
+AI_Smart_Synthesis:
+AI_Smart_Moonlight: ; 38a3a
+; 90% chance to greatly encourage this move if enemy's HP is below 25%.
+; Discourage this move if enemy's HP is higher than 50%.
+; Do nothing otherwise.
+
+	call AICheckEnemyQuarterHP
+	jr nc, .asm_38a45
+	call AICheckEnemyHalfHP
+	ret nc
+	inc [hl]
+	ret
+
+.asm_38a45
+	call Random
+	cp 10 percent
+	ret c
+	dec [hl]
+	dec [hl]
+	ret
+; 38a4e
+
+
+AI_Smart_Toxic:
+AI_Smart_LeechSeed: ; 38a4e
+; Discourage this move if player's HP is below 50%.
+
+	call AICheckPlayerHalfHP
+	ret c
+	inc [hl]
+	ret
+; 38a54
+
+
+AI_Smart_LightScreen:
+AI_Smart_Reflect: ; 38a54
+; Over 90% chance to discourage this move unless enemy's HP is full.
+
+	call AICheckEnemyMaxHP
+	ret c
+	call Random
+	cp 8 percent
+	ret c
+	inc [hl]
+	ret
+; 38a60
+
+
+AI_Smart_Ohko: ; 38a60
+; Dismiss this move if player's level is higher than enemy's level.
+; Else, discourage this move is player's HP is below 50%.
+
+	ld a, [BattleMonLevel]
+	ld b, a
+	ld a, [EnemyMonLevel]
+	cp b
+	jp c, AIDiscourageMove
+	call AICheckPlayerHalfHP
+	ret c
+	inc [hl]
+	ret
+; 38a71
+
+
+AI_Smart_TrapTarget: ; 38a71
+; Bind, Wrap, Fire Spin, Clamp
+
+; 50% chance to discourage this move if the player is already trapped.
+	ld a, [wPlayerWrapCount]
+	and a
+	jr nz, .asm_38a8b
+
+; 50% chance to greatly encourage this move if player is either
+; badly poisoned, in love, identified, stuck in Rollout, or has a Nightmare.
+	ld a, [PlayerSubStatus5]
+	bit SUBSTATUS_TOXIC, a
+	jr nz, .asm_38a91
+
+	ld a, [PlayerSubStatus1]
+	and 1<<SUBSTATUS_IN_LOVE | 1<<SUBSTATUS_ROLLOUT | 1<<SUBSTATUS_IDENTIFIED | 1<<SUBSTATUS_NIGHTMARE
+	jr nz, .asm_38a91
+
+; Else, 50% chance to greatly encourage this move if it's the player's Pokemon first turn.
+	ld a, [PlayerTurnsTaken]
+	and a
+	jr z, .asm_38a91
+
+; 50% chance to discourage this move otherwise.
+.asm_38a8b
+	call AI_50_50
+	ret c
+	inc [hl]
+	ret
+
+.asm_38a91
+	call AICheckEnemyQuarterHP
+	ret nc
+	call AI_50_50
+	ret c
+	dec [hl]
+	dec [hl]
+	ret
+; 38a9c
+
+
+AI_Smart_RazorWind:
+AI_Smart_Unused2B: ; 38a9c
+	ld a, [EnemySubStatus1]
+	bit SUBSTATUS_PERISH, a
+	jr z, .asm_38aaa
+
+	ld a, [EnemyPerishCount]
+	cp 3
+	jr c, .asm_38ad3
+
+.asm_38aaa
+	push hl
+	ld hl, PlayerUsedMoves
+	ld c, 4
+
+.asm_38ab0
+	ld a, [hli]
+	and a
+	jr z, .asm_38ac1
+
+	call AIGetEnemyMove
+
+	ld a, [wEnemyMoveStruct + MOVE_EFFECT]
+	cp EFFECT_PROTECT
+	jr z, .asm_38ad5
+	dec c
+	jr nz, .asm_38ab0
+
+.asm_38ac1
+	pop hl
+	ld a, [EnemySubStatus3]
+	bit SUBSTATUS_CONFUSED, a
+	jr nz, .asm_38acd
+
+	call AICheckEnemyHalfHP
+	ret c
+
+.asm_38acd
+	call Random
+	cp 79 percent - 1
+	ret c
+
+.asm_38ad3
+	inc [hl]
+	ret
+
+.asm_38ad5
+	pop hl
+	ld a, [hl]
+	add 6
+	ld [hl], a
+	ret
+; 38adb
+
+
+AI_Smart_Confuse: ; 38adb
+
+; 90% chance to discourage this move if player's HP is between 25% and 50%.
+	call AICheckPlayerHalfHP
+	ret c
+	call Random
+	cp 10 percent
+	jr c, .asm_38ae7
+	inc [hl]
+
+.asm_38ae7
+; Discourage again if player's HP is below 25%.
+	call AICheckPlayerQuarterHP
+	ret c
+	inc [hl]
+	ret
+; 38aed
+
+
+AI_Smart_SpDefenseUp2: ; 38aed
+
+; Discourage this move if enemy's HP is lower than 50%.
+	call AICheckEnemyHalfHP
+	jr nc, .asm_38b10
+
+; Discourage this move if enemy's special defense level is higher than +3.
+	ld a, [EnemySDefLevel]
+	cp $b
+	jr nc, .asm_38b10
+
+; 80% chance to greatly encourage this move if
+; enemy's Special Defense level is lower than +2, and the player is of a special type.
+	cp $9
+	ret nc
+
+	ld a, [BattleMonType1]
+	cp SPECIAL
+	jr nc, .asm_38b09
+	ld a, [BattleMonType2]
+	cp SPECIAL
+	ret c
+
+.asm_38b09
+	call AI_80_20
+	ret c
+	dec [hl]
+	dec [hl]
+	ret
+
+.asm_38b10
+	inc [hl]
+	ret
+; 38b12
+
+
+AI_Smart_Fly: ; 38b12
+; Fly, Dig
+
+; Greatly encourage this move if the player is
+; flying or underground, and slower than the enemy.
+
+	ld a, [PlayerSubStatus3]
+	and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
+	ret z
+
+	call AICompareSpeed
+	ret nc
+
+	dec [hl]
+	dec [hl]
+	dec [hl]
+	ret
+; 38b20
+
+
+AI_Smart_SuperFang: ; 38b20
+; Discourage this move if player's HP is below 25%.
+
+	call AICheckPlayerQuarterHP
+	ret c
+	inc [hl]
+	ret
+; 38b26
+
+
+AI_Smart_Paralyze: ; 38b26
+
+; 50% chance to discourage this move if player's HP is below 25%.
+	call AICheckPlayerQuarterHP
+	jr nc, .asm_38b3a
+
+; 80% chance to greatly encourage this move
+; if enemy is slower than player and its HP is above 25%.
+	call AICompareSpeed
+	ret c
+	call AICheckEnemyQuarterHP
+	ret nc
+	call AI_80_20
+	ret c
+	dec [hl]
+	dec [hl]
+	ret
+
+.asm_38b3a
+	call AI_50_50
+	ret c
+	inc [hl]
+	ret
+; 38b40
+
+
+AI_Smart_SpeedDownHit: ; 38b40
+; Icy Wind
+
+; Almost 90% chance to greatly encourage this move if the following conditions all meet:
+; Enemy's HP is higher than 25%.
+; It's the first turn of player's Pokemon.
+; Player is faster than enemy.
+
+	ld a, [wEnemyMoveStruct + MOVE_ANIM]
+	cp ICY_WIND
+	ret nz
+	call AICheckEnemyQuarterHP
+	ret nc
+	ld a, [PlayerTurnsTaken]
+	and a
+	ret nz
+	call AICompareSpeed
+	ret c
+	call Random
+	cp 12 percent
+	ret c
+	dec [hl]
+	dec [hl]
+	ret
+; 38b5c
+
+
+AI_Smart_Substitute: ; 38b5c
+; Dismiss this move if enemy's HP is below 50%.
+
+	call AICheckEnemyHalfHP
+	ret c
+	jp AIDiscourageMove
+; 38b63
+
+
+AI_Smart_HyperBeam: ; 38b63
+	call AICheckEnemyHalfHP
+	jr c, .asm_38b72
+
+; 50% chance to encourage this move if enemy's HP is below 25%.
+	call AICheckEnemyQuarterHP
+	ret c
+	call AI_50_50
+	ret c
+	dec [hl]
+	ret
+
+.asm_38b72
+; If enemy's HP is above 50%, discourage this move at random
+	call Random
+	cp 16 percent
+	ret c
+	inc [hl]
+	call AI_50_50
+	ret c
+	inc [hl]
+	ret
+; 38b7f
+
+
+AI_Smart_Rage: ; 38b7f
+	ld a, [EnemySubStatus4]
+	bit SUBSTATUS_RAGE, a
+	jr z, .asm_38b9b
+
+; If enemy's Rage is building, 50% chance to encourage this move.
+	call AI_50_50
+	jr c, .asm_38b8c
+
+	dec [hl]
+
+; Encourage this move based on Rage's counter.
+.asm_38b8c
+	ld a, [wEnemyRageCounter]
+	cp $2
+	ret c
+	dec [hl]
+	ld a, [wEnemyRageCounter]
+	cp $3
+	ret c
+	dec [hl]
+	ret
+
+.asm_38b9b
+; If enemy's Rage is not building, discourage this move if enemy's HP is below 50%.
+	call AICheckEnemyHalfHP
+	jr nc, .asm_38ba6
+
+; 50% chance to encourage this move otherwise.
+	call AI_80_20
+	ret nc
+	dec [hl]
+	ret
+
+.asm_38ba6
+	inc [hl]
+	ret
+; 38ba8
+
+
+AI_Smart_Mimic: ; 38ba8
+	ld a, [LastPlayerCounterMove]
+	and a
+	jr z, .asm_38be9
+
+	call AICheckEnemyHalfHP
+	jr nc, .asm_38bef
+
+	push hl
+	ld a, [LastPlayerCounterMove]
+	call AIGetEnemyMove
+
+	ld a, $1
+	ld [hBattleTurn], a
+	callfar BattleCheckTypeMatchup
+
+	ld a, [wd265]
+	cp $a
+	pop hl
+	jr c, .asm_38bef
+	jr z, .asm_38bd4
+
+	call AI_50_50
+	jr c, .asm_38bd4
+
+	dec [hl]
+
+.asm_38bd4
+	ld a, [LastPlayerCounterMove]
+	push hl
+	ld hl, UsefulMoves
+	ld de, 1
+	call IsInArray
+
+	pop hl
+	ret nc
+	call AI_50_50
+	ret c
+	dec [hl]
+	ret
+
+.asm_38be9
+	call AICompareSpeed
+	jp c, AIDiscourageMove
+
+.asm_38bef
+	inc [hl]
+	ret
+; 38bf1
+
+
+AI_Smart_Counter: ; 38bf1
+	push hl
+	ld hl, PlayerUsedMoves
+	ld c, 4
+	ld b, 0
+
+.asm_38bf9
+	ld a, [hli]
+	and a
+	jr z, .asm_38c0e
+
+	call AIGetEnemyMove
+
+	ld a, [wEnemyMoveStruct + MOVE_POWER]
+	and a
+	jr z, .asm_38c0e
+
+	ld a, [wEnemyMoveStruct + MOVE_TYPE]
+	cp SPECIAL
+	jr nc, .asm_38c0e
+
+	inc b
+
+.asm_38c0e
+	dec c
+	jr nz, .asm_38bf9
+
+	pop hl
+	ld a, b
+	and a
+	jr z, .asm_38c39
+
+	cp $3
+	jr nc, .asm_38c30
+
+	ld a, [LastPlayerCounterMove]
+	and a
+	jr z, .asm_38c38
+
+	call AIGetEnemyMove
+
+	ld a, [wEnemyMoveStruct + MOVE_POWER]
+	and a
+	jr z, .asm_38c38
+
+	ld a, [wEnemyMoveStruct + MOVE_TYPE]
+	cp SPECIAL
+	jr nc, .asm_38c38
+
+
+.asm_38c30
+	call Random
+	cp 39 percent + 1
+	jr c, .asm_38c38
+
+	dec [hl]
+
+.asm_38c38
+	ret
+
+.asm_38c39
+	inc [hl]
+	ret
+; 38c3b
+
+
+AI_Smart_Encore: ; 38c3b
+	call AICompareSpeed
+	jr nc, .asm_38c81
+
+	ld a, [LastPlayerMove]
+	and a
+	jp z, AIDiscourageMove
+
+	call AIGetEnemyMove
+
+	ld a, [wEnemyMoveStruct + MOVE_POWER]
+	and a
+	jr z, .asm_38c68
+
+	push hl
+	ld a, [wEnemyMoveStruct + MOVE_TYPE]
+	ld hl, EnemyMonType1
+	predef CheckTypeMatchup
+
+	pop hl
+	ld a, [wd265]
+	cp $a
+	jr nc, .asm_38c68
+
+	and a
+	ret nz
+	jr .asm_38c78
+
+.asm_38c68
+	push hl
+	ld a, [LastPlayerCounterMove]
+	ld hl, .EncoreMoves
+	ld de, 1
+	call IsInArray
+	pop hl
+	jr nc, .asm_38c81
+
+.asm_38c78
+	call Random
+	cp 28 percent - 1
+	ret c
+	dec [hl]
+	dec [hl]
+	ret
+
+.asm_38c81
+	inc [hl]
+	inc [hl]
+	inc [hl]
+	ret
+
+.EncoreMoves:
+	db SWORDS_DANCE
+	db WHIRLWIND
+	db LEER
+	db ROAR
+	db DISABLE
+	db MIST
+	db LEECH_SEED
+	db GROWTH
+	db POISONPOWDER
+	db STRING_SHOT
+	db MEDITATE
+	db AGILITY
+	db TELEPORT
+	db SCREECH
+	db HAZE
+	db FOCUS_ENERGY
+	db DREAM_EATER
+	db POISON_GAS
+	db SPLASH
+	db SHARPEN
+	db CONVERSION
+	db SUPER_FANG
+	db SUBSTITUTE
+	db TRIPLE_KICK
+	db SPIDER_WEB
+	db MIND_READER
+	db FLAME_WHEEL
+	db AEROBLAST
+	db COTTON_SPORE
+	db POWDER_SNOW
+	db $ff
+; 38ca4
+
+
+AI_Smart_PainSplit: ; 38ca4
+; Discourage this move if [enemy's current HP * 2 > player's current HP].
+
+	push hl
+	ld hl, EnemyMonHP
+	ld b, [hl]
+	inc hl
+	ld c, [hl]
+	sla c
+	rl b
+	ld hl, BattleMonHP + 1
+	ld a, [hld]
+	cp c
+	ld a, [hl]
+	sbc b
+	pop hl
+	ret nc
+	inc [hl]
+	ret
+; 38cba
+
+
+AI_Smart_Snore:
+AI_Smart_SleepTalk: ; 38cba
+; Greatly encourage this move if enemy is fast asleep.
+; Greatly discourage this move otherwise.
+
+	ld a, [EnemyMonStatus]
+	and $7
+	cp $1
+	jr z, .asm_38cc7
+
+	dec [hl]
+	dec [hl]
+	dec [hl]
+	ret
+
+.asm_38cc7
+	inc [hl]
+	inc [hl]
+	inc [hl]
+	ret
+; 38ccb
+
+
+AI_Smart_DefrostOpponent: ; 38ccb
+; Greatly encourage this move if enemy is frozen.
+; No move has EFFECT_DEFROST_OPPONENT, so this layer is unused.
+
+	ld a, [EnemyMonStatus]
+	and $20
+	ret z
+	dec [hl]
+	dec [hl]
+	dec [hl]
+	ret
+; 38cd5
+
+
+AI_Smart_Spite: ; 38cd5
+	ld a, [LastPlayerCounterMove]
+	and a
+	jr nz, .asm_38ce7
+
+	call AICompareSpeed
+	jp c, AIDiscourageMove
+
+	call AI_50_50
+	ret c
+	inc [hl]
+	ret
+
+.asm_38ce7
+	push hl
+	ld b, a
+	ld c, 4
+	ld hl, BattleMonMoves
+	ld de, BattleMonPP
+
+.asm_38cf1
+	ld a, [hli]
+	cp b
+	jr z, .asm_38cfb
+
+	inc de
+	dec c
+	jr nz, .asm_38cf1
+
+	pop hl
+	ret
+
+.asm_38cfb
+	pop hl
+	ld a, [de]
+	cp $6
+	jr c, .asm_38d0d
+	cp $f
+	jr nc, .asm_38d0b
+
+	call Random
+	cp 39 percent + 1
+	ret nc
+
+.asm_38d0b
+	inc [hl]
+	ret
+
+.asm_38d0d
+	call Random
+	cp 39 percent + 1
+	ret c
+	dec [hl]
+	dec [hl]
+	ret
+; 38d16
+
+
+Function_0x38d16; 38d16
+	jp AIDiscourageMove
+; 38d19
+
+
+AI_Smart_DestinyBond:
+AI_Smart_Reversal:
+AI_Smart_SkullBash: ; 38d19
+; Discourage this move if enemy's HP is above 25%.
+
+	call AICheckEnemyQuarterHP
+	ret nc
+	inc [hl]
+	ret
+; 38d1f
+
+
+AI_Smart_HealBell: ; 38d1f
+; Dismiss this move if none of the opponent's Pokemon is statused.
+; Encourage this move if the enemy is statused.
+; 50% chance to greatly encourage this move if the enemy is fast asleep or frozen.
+
+	push hl
+	ld a, [OTPartyCount]
+	ld b, a
+	ld c, 0
+	ld hl, OTPartyMon1HP
+	ld de, PARTYMON_STRUCT_LENGTH
+
+.loop
+	push hl
+	ld a, [hli]
+	or [hl]
+	jr z, .next
+
+	; status
+	dec hl
+	dec hl
+	dec hl
+	ld a, [hl]
+	or c
+	ld c, a
+
+.next
+	pop hl
+	add hl, de
+	dec b
+	jr nz, .loop
+
+	pop hl
+	ld a, c
+	and a
+	jr z, .no_status
+
+	ld a, [EnemyMonStatus]
+	and a
+	jr z, .ok
+	dec [hl]
+.ok
+	and 1 << FRZ | SLP
+	ret z
+	call AI_50_50
+	ret c
+	dec [hl]
+	dec [hl]
+	ret
+
+.no_status
+	ld a, [EnemyMonStatus]
+	and a
+	ret nz
+	jp AIDiscourageMove
+
+; 38d5a
+
+
+AI_Smart_PriorityHit: ; 38d5a
+	call AICompareSpeed
+	ret c
+
+; Dismiss this move if the player is flying or underground.
+	ld a, [PlayerSubStatus3]
+	and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
+	jp nz, AIDiscourageMove
+
+; Greatly encourage this move if it will KO the player.
+	ld a, $1
+	ld [hBattleTurn], a
+	push hl
+	callfar EnemyAttackDamage
+	callfar BattleCommand_DamageCalc
+	callfar BattleCommand_Stab
+	pop hl
+	ld a, [CurDamage + 1]
+	ld c, a
+	ld a, [CurDamage]
+	ld b, a
+	ld a, [BattleMonHP + 1]
+	cp c
+	ld a, [BattleMonHP]
+	sbc b
+	ret nc
+	dec [hl]
+	dec [hl]
+	dec [hl]
+	ret
+; 38d93
+
+
+AI_Smart_Thief: ; 38d93
+; Don't use Thief unless it's the only move available.
+
+	ld a, [hl]
+	add $1e
+	ld [hl], a
+	ret
+; 38d98
+
+
+AI_Smart_Conversion2: ; 38d98
+	ld a, [LastPlayerMove]
+	and a
+	jr nz, .asm_38dc9
+
+	push hl
+	dec a
+	ld hl, Moves + MOVE_TYPE
+	ld bc, MOVE_LENGTH
+	call AddNTimes
+
+	ld a, BANK(Moves)
+	call GetFarByte
+	ld [wPlayerMoveStruct + MOVE_TYPE], a
+
+	xor a
+	ld [hBattleTurn], a
+
+	callfar BattleCheckTypeMatchup
+
+	ld a, [wd265]
+	cp $a
+	pop hl
+	jr c, .asm_38dc9
+	ret z
+
+	call AI_50_50
+	ret c
+
+	dec [hl]
+	ret
+
+.asm_38dc9
+	call Random
+	cp 10 percent
+	ret c
+	inc [hl]
+	ret
+; 38dd1
+
+
+AI_Smart_Disable: ; 38dd1
+	call AICompareSpeed
+	jr nc, .asm_38df3
+
+	push hl
+	ld a, [LastPlayerCounterMove]
+	ld hl, UsefulMoves
+	ld de, 1
+	call IsInArray
+
+	pop hl
+	jr nc, .asm_38dee
+
+	call Random
+	cp 39 percent + 1
+	ret c
+	dec [hl]
+	ret
+
+.asm_38dee
+	ld a, [wEnemyMoveStruct + MOVE_POWER]
+	and a
+	ret nz
+
+.asm_38df3
+	call Random
+	cp 8 percent
+	ret c
+	inc [hl]
+	ret
+; 38dfb
+
+
+AI_Smart_MeanLook: ; 38dfb
+	call AICheckEnemyHalfHP
+	jr nc, .asm_38e24
+
+	push hl
+	call AICheckLastPlayerMon
+	pop hl
+	jp z, AIDiscourageMove
+
+; 80% chance to greatly encourage this move if the enemy is badly poisoned (buggy).
+; Should check PlayerSubStatus5 instead.
+	ld a, [EnemySubStatus5]
+	bit SUBSTATUS_TOXIC, a
+	jr nz, .asm_38e26
+
+; 80% chance to greatly encourage this move if the player is either
+; in love, identified, stuck in Rollout, or has a Nightmare.
+	ld a, [PlayerSubStatus1]
+	and 1<<SUBSTATUS_IN_LOVE | 1<<SUBSTATUS_ROLLOUT | 1<<SUBSTATUS_IDENTIFIED | 1<<SUBSTATUS_NIGHTMARE
+	jr nz, .asm_38e26
+
+; Otherwise, discourage this move unless the player only has not very effective moves against the enemy.
+	push hl
+	callfar CheckPlayerMoveTypeMatchups
+	ld a, [wEnemyAISwitchScore]
+	cp $b ; not very effective
+	pop hl
+	ret nc
+
+.asm_38e24
+	inc [hl]
+	ret
+
+.asm_38e26
+	call AI_80_20
+	ret c
+	dec [hl]
+	dec [hl]
+	dec [hl]
+	ret
+; 38e2e
+
+
+AICheckLastPlayerMon: ; 38e2e
+	ld a, [PartyCount]
+	ld b, a
+	ld c, 0
+	ld hl, PartyMon1HP
+	ld de, PARTYMON_STRUCT_LENGTH
+
+.loop
+	ld a, [CurBattleMon]
+	cp c
+	jr z, .asm_38e44
+
+	ld a, [hli]
+	or [hl]
+	ret nz
+	dec hl
+
+.asm_38e44
+	add hl, de
+	inc c
+	dec b
+	jr nz, .loop
+
+	ret
+; 38e4a
+
+
+AI_Smart_Nightmare: ; 38e4a
+; 50% chance to encourage this move.
+; The AI_Basic layer will make sure that
+; Dream Eater is only used against sleeping targets.
+
+	call AI_50_50
+	ret c
+	dec [hl]
+	ret
+; 38e50
+
+
+AI_Smart_FlameWheel: ; 38e50
+; Use this move if the enemy is frozen.
+
+	ld a, [EnemyMonStatus]
+	bit FRZ, a
+	ret z
+rept 5
+	dec [hl]
+endr
+	ret
+; 38e5c
+
+
+AI_Smart_Curse: ; 38e5c
+	ld a, [EnemyMonType1]
+	cp GHOST
+	jr z, .ghostcurse
+	ld a, [EnemyMonType2]
+	cp GHOST
+	jr z, .ghostcurse
+
+	call AICheckEnemyHalfHP
+	jr nc, .asm_38e93
+
+	ld a, [EnemyAtkLevel]
+	cp $b
+	jr nc, .asm_38e93
+	cp $9
+	ret nc
+
+	ld a, [BattleMonType1]
+	cp GHOST
+	jr z, .asm_38e92
+	cp SPECIAL
+	ret nc
+	ld a, [BattleMonType2]
+	cp SPECIAL
+	ret nc
+	call AI_80_20
+	ret c
+	dec [hl]
+	dec [hl]
+	ret
+
+.asm_38e90
+	inc [hl]
+	inc [hl]
+.asm_38e92
+	inc [hl]
+.asm_38e93
+	inc [hl]
+	ret
+
+.ghostcurse
+	ld a, [PlayerSubStatus1]
+	bit SUBSTATUS_CURSE, a
+	jp nz, AIDiscourageMove
+
+	push hl
+	farcall FindAliveEnemyMons
+	pop hl
+	jr nc, .asm_38eb0
+
+	push hl
+	call AICheckLastPlayerMon
+	pop hl
+	jr nz, .asm_38e90
+
+	jr .asm_38eb7
+
+
+.asm_38eb0
+	push hl
+	call AICheckLastPlayerMon
+	pop hl
+	jr z, .asm_38ecb
+
+
+.asm_38eb7
+	call AICheckEnemyQuarterHP
+	jp nc, .asm_38e90
+
+	call AICheckEnemyHalfHP
+	jr nc, .asm_38e92
+
+	call AICheckEnemyMaxHP
+	ret nc
+
+	ld a, [PlayerTurnsTaken]
+	and a
+	ret nz
+
+.asm_38ecb
+	call AI_50_50
+	ret c
+
+	dec [hl]
+	dec [hl]
+	ret
+; 38ed2
+
+
+AI_Smart_Protect: ; 38ed2
+	ld a, [EnemyProtectCount]
+	and a
+	jr nz, .asm_38f13
+
+	ld a, [PlayerSubStatus5]
+	bit SUBSTATUS_LOCK_ON, a
+	jr nz, .asm_38f14
+
+	ld a, [PlayerFuryCutterCount]
+	cp 3
+	jr nc, .asm_38f0d
+
+	ld a, [PlayerSubStatus3]
+	bit SUBSTATUS_CHARGED, a
+	jr nz, .asm_38f0d
+
+	ld a, [PlayerSubStatus5]
+	bit SUBSTATUS_TOXIC, a
+	jr nz, .asm_38f0d
+	ld a, [PlayerSubStatus4]
+	bit SUBSTATUS_LEECH_SEED, a
+	jr nz, .asm_38f0d
+	ld a, [PlayerSubStatus1]
+	bit SUBSTATUS_CURSE, a
+	jr nz, .asm_38f0d
+
+	bit SUBSTATUS_ROLLOUT, a
+	jr z, .asm_38f14
+
+	ld a, [PlayerRolloutCount]
+	cp 3
+	jr c, .asm_38f14
+
+.asm_38f0d
+	call AI_80_20
+	ret c
+	dec [hl]
+	ret
+
+.asm_38f13
+	inc [hl]
+
+.asm_38f14
+	call Random
+	cp 8 percent
+	ret c
+	inc [hl]
+	inc [hl]
+	ret
+; 38f1d
+
+
+AI_Smart_Foresight: ; 38f1d
+	ld a, [EnemyAccLevel]
+	cp $5
+	jr c, .asm_38f41
+	ld a, [PlayerEvaLevel]
+	cp $a
+	jr nc, .asm_38f41
+
+	ld a, [BattleMonType1]
+	cp GHOST
+	jr z, .asm_38f41
+	ld a, [BattleMonType2]
+	cp GHOST
+	jr z, .asm_38f41
+
+	call Random
+	cp 8 percent
+	ret c
+	inc [hl]
+	ret
+
+.asm_38f41
+	call Random
+	cp 39 percent + 1
+	ret c
+	dec [hl]
+	dec [hl]
+	ret
+; 38f4a
+
+
+AI_Smart_PerishSong: ; 38f4a
+	push hl
+	callfar FindAliveEnemyMons
+	pop hl
+	jr c, .no
+
+	ld a, [PlayerSubStatus5]
+	bit SUBSTATUS_CANT_RUN, a
+	jr nz, .yes
+
+	push hl
+	callfar CheckPlayerMoveTypeMatchups
+	ld a, [wEnemyAISwitchScore]
+	cp 10 ; 1.0
+	pop hl
+	ret c
+
+	call AI_50_50
+	ret c
+
+	inc [hl]
+	ret
+
+.yes
+	call AI_50_50
+	ret c
+
+	dec [hl]
+	ret
+
+.no
+	ld a, [hl]
+	add 5
+	ld [hl], a
+	ret
+; 38f7a
+
+
+AI_Smart_Sandstorm: ; 38f7a
+
+; Greatly discourage this move if the player is immune to Sandstorm damage.
+	ld a, [BattleMonType1]
+	push hl
+	ld hl, .SandstormImmuneTypes
+	ld de, 1
+	call IsInArray
+	pop hl
+	jr c, .asm_38fa5
+
+	ld a, [BattleMonType2]
+	push hl
+	ld hl, .SandstormImmuneTypes
+	ld de, 1
+	call IsInArray
+	pop hl
+	jr c, .asm_38fa5
+
+; Discourage this move if player's HP is below 50%.
+	call AICheckPlayerHalfHP
+	jr nc, .asm_38fa6
+
+; 50% chance to encourage this move otherwise.
+	call AI_50_50
+	ret c
+
+	dec [hl]
+	ret
+
+.asm_38fa5
+	inc [hl]
+
+.asm_38fa6
+	inc [hl]
+	ret
+
+.SandstormImmuneTypes:
+	db ROCK
+	db GROUND
+	db STEEL
+	db $ff
+; 38fac
+
+
+AI_Smart_Endure: ; 38fac
+	ld a, [EnemyProtectCount]
+	and a
+	jr nz, .asm_38fd8
+
+	call AICheckEnemyMaxHP
+	jr c, .asm_38fd8
+
+	call AICheckEnemyQuarterHP
+	jr c, .asm_38fd9
+
+	ld b, EFFECT_REVERSAL
+	call AIHasMoveEffect
+	jr nc, .asm_38fcb
+
+	call AI_80_20
+	ret c
+
+	dec [hl]
+	dec [hl]
+	dec [hl]
+	ret
+
+.asm_38fcb
+	ld a, [EnemySubStatus5]
+	bit SUBSTATUS_LOCK_ON, a
+	ret z
+
+	call AI_50_50
+	ret c
+
+	dec [hl]
+	dec [hl]
+	ret
+
+.asm_38fd8
+	inc [hl]
+
+.asm_38fd9
+	inc [hl]
+	ret
+; 38fdb
+
+
+AI_Smart_FuryCutter: ; 38fdb
+; Encourage this move based on Fury Cutter's count.
+
+	ld a, [EnemyFuryCutterCount]
+	and a
+	jr z, .end
+	dec [hl]
+
+	cp 2
+	jr c, .end
+	dec [hl]
+	dec [hl]
+
+	cp 3
+	jr c, .end
+	dec [hl]
+	dec [hl]
+	dec [hl]
+
+.end
+
+	; fallthrough
+; 38fef
+
+
+AI_Smart_Rollout: ; 38fef
+; Rollout, Fury Cutter
+
+; 80% chance to discourage this move if the enemy is in love, confused, or paralyzed.
+	ld a, [EnemySubStatus1]
+	bit SUBSTATUS_IN_LOVE, a
+	jr nz, .asm_39020
+
+	ld a, [EnemySubStatus3]
+	bit SUBSTATUS_CONFUSED, a
+	jr nz, .asm_39020
+
+	ld a, [EnemyMonStatus]
+	bit PAR, a
+	jr nz, .asm_39020
+
+; 80% chance to discourage this move if the enemy's HP is below 25%,
+; or if accuracy or evasion modifiers favour the player.
+	call AICheckEnemyQuarterHP
+	jr nc, .asm_39020
+
+	ld a, [EnemyAccLevel]
+	cp 7
+	jr c, .asm_39020
+	ld a, [PlayerEvaLevel]
+	cp 8
+	jr nc, .asm_39020
+
+; Otherwise, 80% chance to greatly encourage this move.
+	call Random
+	cp 79 percent - 1
+	ret nc
+	dec [hl]
+	dec [hl]
+	ret
+
+.asm_39020
+	call AI_80_20
+	ret c
+	inc [hl]
+	ret
+; 39026
+
+
+AI_Smart_Swagger:
+AI_Smart_Attract: ; 39026
+; 80% chance to encourage this move during the first turn of player's Pokemon.
+; 80% chance to discourage this move otherwise.
+
+	ld a, [PlayerTurnsTaken]
+	and a
+	jr z, .first_turn
+
+	call AI_80_20
+	ret c
+	inc [hl]
+	ret
+
+.first_turn
+	call Random
+	cp 79 percent - 1
+	ret nc
+	dec [hl]
+	ret
+; 3903a
+
+
+AI_Smart_Safeguard: ; 3903a
+; 80% chance to discourage this move if player's HP is below 50%.
+
+	call AICheckPlayerHalfHP
+	ret c
+	call AI_80_20
+	ret c
+	inc [hl]
+	ret
+; 39044
+
+
+AI_Smart_Magnitude:
+AI_Smart_Earthquake: ; 39044
+
+; Greatly encourage this move if the player is underground and the enemy is faster.
+	ld a, [LastPlayerCounterMove]
+	cp DIG
+	ret nz
+
+	ld a, [PlayerSubStatus3]
+	bit SUBSTATUS_UNDERGROUND, a
+	jr z, .could_dig
+
+	call AICompareSpeed
+	ret nc
+	dec [hl]
+	dec [hl]
+	ret
+
+.could_dig
+	; Try to predict if the player will use Dig this turn.
+
+	; 50% chance to encourage this move if the enemy is slower than the player.
+	call AICompareSpeed
+	ret c
+
+	call AI_50_50
+	ret c
+
+	dec [hl]
+	ret
+; 39062
+
+
+AI_Smart_BatonPass: ; 39062
+; Discourage this move if the player hasn't shown super-effective moves against the enemy.
+; Consider player's type(s) if its moves are unknown.
+
+	push hl
+	callfar CheckPlayerMoveTypeMatchups
+	ld a, [wEnemyAISwitchScore]
+	cp 10 ; neutral
+	pop hl
+	ret c
+	inc [hl]
+	ret
+; 39072
+
+
+AI_Smart_Pursuit: ; 39072
+; 50% chance to greatly encourage this move if player's HP is below 25%.
+; 80% chance to discourage this move otherwise.
+
+	call AICheckPlayerQuarterHP
+	jr nc, .asm_3907d
+	call AI_80_20
+	ret c
+	inc [hl]
+	ret
+
+.asm_3907d
+	call AI_50_50
+	ret c
+	dec [hl]
+	dec [hl]
+	ret
+; 39084
+
+
+AI_Smart_RapidSpin: ; 39084
+; 80% chance to greatly encourage this move if the enemy is
+; trapped (Bind effect), seeded, or scattered with spikes.
+
+	ld a, [wEnemyWrapCount]
+	and a
+	jr nz, .asm_39097
+
+	ld a, [EnemySubStatus4]
+	bit SUBSTATUS_LEECH_SEED, a
+	jr nz, .asm_39097
+
+	ld a, [EnemyScreens]
+	bit SCREENS_SPIKES, a
+	ret z
+
+.asm_39097
+	call AI_80_20
+	ret c
+
+	dec [hl]
+	dec [hl]
+	ret
+; 3909e
+
+
+AI_Smart_HiddenPower: ; 3909e
+	push hl
+	ld a, 1
+	ld [hBattleTurn], a
+
+; Calculate Hidden Power's type and base power based on enemy's DVs.
+	callfar HiddenPowerDamage
+	callfar BattleCheckTypeMatchup
+	pop hl
+
+; Discourage Hidden Power if not very effective.
+	ld a, [wd265]
+	cp 10
+	jr c, .bad
+
+; Discourage Hidden Power if its base power	is lower than 50.
+	ld a, d
+	cp 50
+	jr c, .bad
+
+; Encourage Hidden Power if super-effective.
+	ld a, [wd265]
+	cp 11
+	jr nc, .good
+
+; Encourage Hidden Power if its base power is 70.
+	ld a, d
+	cp 70
+	ret c
+
+.good
+	dec [hl]
+	ret
+
+.bad
+	inc [hl]
+	ret
+; 390cb
+
+
+AI_Smart_RainDance: ; 390cb
+
+; Greatly discourage this move if it would favour the player type-wise.
+; Particularly, if the player is a Water-type.
+	ld a, [BattleMonType1]
+	cp WATER
+	jr z, AIBadWeatherType
+	cp FIRE
+	jr z, AIGoodWeatherType
+
+	ld a, [BattleMonType2]
+	cp WATER
+	jr z, AIBadWeatherType
+	cp FIRE
+	jr z, AIGoodWeatherType
+
+	push hl
+	ld hl, RainDanceMoves
+	jr AI_Smart_WeatherMove
+; 390e7
+
+RainDanceMoves: ; 390e7
+	db WATER_GUN
+	db HYDRO_PUMP
+	db SURF
+	db BUBBLEBEAM
+	db THUNDER
+	db WATERFALL
+	db CLAMP
+	db BUBBLE
+	db CRABHAMMER
+	db OCTAZOOKA
+	db WHIRLPOOL
+	db $ff
+; 390f3
+
+
+AI_Smart_SunnyDay: ; 390f3
+
+; Greatly discourage this move if it would favour the player type-wise.
+; Particularly, if the player is a Fire-type.
+	ld a, [BattleMonType1]
+	cp FIRE
+	jr z, AIBadWeatherType
+	cp WATER
+	jr z, AIGoodWeatherType
+
+	ld a, [BattleMonType2]
+	cp FIRE
+	jr z, AIBadWeatherType
+	cp WATER
+	jr z, AIGoodWeatherType
+
+	push hl
+	ld hl, SunnyDayMoves
+
+	; fallthrough
+; 3910d
+
+
+AI_Smart_WeatherMove: ; 3910d
+; Rain Dance, Sunny Day
+
+; Greatly discourage this move if the enemy doesn't have
+; one of the useful Rain Dance or Sunny Day moves.
+	call AIHasMoveInArray
+	pop hl
+	jr nc, AIBadWeatherType
+
+; Greatly discourage this move if player's HP is below 50%.
+	call AICheckPlayerHalfHP
+	jr nc, AIBadWeatherType
+
+; 50% chance to encourage this move otherwise.
+	call AI_50_50
+	ret c
+
+	dec [hl]
+	ret
+; 3911e
+
+AIBadWeatherType: ; 3911e
+	inc [hl]
+	inc [hl]
+	inc [hl]
+	ret
+; 39122
+
+AIGoodWeatherType: ; 39122
+; Rain Dance, Sunny Day
+
+; Greatly encourage this move if it would disfavour the player type-wise and player's HP is above 50%...
+	call AICheckPlayerHalfHP
+	ret nc
+
+; ...as long as one of the following conditions meet:
+; It's the first turn of the player's Pokemon.
+	ld a, [PlayerTurnsTaken]
+	and a
+	jr z, .good
+
+; Or it's the first turn of the enemy's Pokemon.
+	ld a, [EnemyTurnsTaken]
+	and a
+	ret nz
+
+.good
+	dec [hl]
+	dec [hl]
+	ret
+; 39134
+
+
+SunnyDayMoves: ; 39134
+	db FIRE_PUNCH
+	db EMBER
+	db FLAMETHROWER
+	db FIRE_SPIN
+	db FIRE_BLAST
+	db SACRED_FIRE
+	db MORNING_SUN
+	db SYNTHESIS
+	db $ff
+; 3913d
+
+
+AI_Smart_BellyDrum: ; 3913d
+; Dismiss this move if enemy's attack is higher than +2 or if enemy's HP is below 50%.
+; Else, discourage this move if enemy's HP is not full.
+
+	ld a, [EnemyAtkLevel]
+	cp $a
+	jr nc, .asm_3914d
+
+	call AICheckEnemyMaxHP
+	ret c
+
+	inc [hl]
+
+	call AICheckEnemyHalfHP
+	ret c
+
+.asm_3914d
+	ld a, [hl]
+	add $5
+	ld [hl], a
+	ret
+; 39152
+
+
+AI_Smart_PsychUp: ; 39152
+	push hl
+	ld hl, EnemyAtkLevel
+	ld b, $8
+	ld c, 100
+
+; Calculate the sum of all enemy's stat level modifiers. Add 100 first to prevent underflow.
+; Put the result in c. c will range between 58 and 142.
+.asm_3915a
+	ld a, [hli]
+	sub $7
+	add c
+	ld c, a
+	dec b
+	jr nz, .asm_3915a
+
+; Calculate the sum of all player's stat level modifiers. Add 100 first to prevent underflow.
+; Put the result in d. d will range between 58 and 142.
+	ld hl, PlayerAtkLevel
+	ld b, $8
+	ld d, 100
+
+.asm_39169
+	ld a, [hli]
+	sub $7
+	add d
+	ld d, a
+	dec b
+	jr nz, .asm_39169
+
+; Greatly discourage this move if enemy's stat levels are higher than player's (if c>=d).
+	ld a, c
+	sub d
+	pop hl
+	jr nc, .asm_39188
+
+; Else, 80% chance to encourage this move unless player's accuracy level is lower than -1...
+	ld a, [PlayerAccLevel]
+	cp $6
+	ret c
+
+; ...or enemy's evasion level is higher than +0.
+	ld a, [EnemyEvaLevel]
+	cp $8
+	ret nc
+
+	call AI_80_20
+	ret c
+
+	dec [hl]
+	ret
+
+.asm_39188
+	inc [hl]
+	inc [hl]
+	ret
+; 3918b
+
+
+AI_Smart_MirrorCoat: ; 3918b
+	push hl
+	ld hl, PlayerUsedMoves
+	ld c, $4
+	ld b, $0
+
+.asm_39193
+	ld a, [hli]
+	and a
+	jr z, .asm_391a8
+
+	call AIGetEnemyMove
+
+	ld a, [wEnemyMoveStruct + MOVE_POWER]
+	and a
+	jr z, .asm_391a8
+
+	ld a, [wEnemyMoveStruct + MOVE_TYPE]
+	cp SPECIAL
+	jr c, .asm_391a8
+
+	inc b
+
+.asm_391a8
+	dec c
+	jr nz, .asm_39193
+
+	pop hl
+	ld a, b
+	and a
+	jr z, .asm_391d3
+
+	cp $3
+	jr nc, .asm_391ca
+
+	ld a, [LastPlayerCounterMove]
+	and a
+	jr z, .asm_391d2
+
+	call AIGetEnemyMove
+
+	ld a, [wEnemyMoveStruct + MOVE_POWER]
+	and a
+	jr z, .asm_391d2
+
+	ld a, [wEnemyMoveStruct + MOVE_TYPE]
+	cp SPECIAL
+	jr c, .asm_391d2
+
+
+.asm_391ca
+	call Random
+	cp 100
+	jr c, .asm_391d2
+	dec [hl]
+
+.asm_391d2
+	ret
+
+.asm_391d3
+	inc [hl]
+	ret
+; 391d5
+
+
+AI_Smart_Twister:
+AI_Smart_Gust: ; 391d5
+
+; Greatly encourage this move if the player is flying and the enemy is faster.
+	ld a, [LastPlayerCounterMove]
+	cp FLY
+	ret nz
+
+	ld a, [PlayerSubStatus3]
+	bit SUBSTATUS_FLYING, a
+	jr z, .couldFly
+
+	call AICompareSpeed
+	ret nc
+
+	dec [hl]
+	dec [hl]
+	ret
+
+; Try to predict if the player will use Fly this turn.
+.couldFly
+
+; 50% chance to encourage this move if the enemy is slower than the player.
+	call AICompareSpeed
+	ret c
+	call AI_50_50
+	ret c
+	dec [hl]
+	ret
+; 391f3
+
+
+AI_Smart_FutureSight: ; 391f3
+; Greatly encourage this move if the player is
+; flying or underground, and slower than the enemy.
+
+	call AICompareSpeed
+	ret nc
+
+	ld a, [PlayerSubStatus3]
+	and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
+	ret z
+
+	dec [hl]
+	dec [hl]
+	ret
+; 39200
+
+
+AI_Smart_Stomp: ; 39200
+; 80% chance to encourage this move if the player has used Minimize.
+
+	ld a, [wPlayerMinimized]
+	and a
+	ret z
+
+	call AI_80_20
+	ret c
+
+	dec [hl]
+	ret
+; 3920b
+
+
+AI_Smart_Solarbeam: ; 3920b
+; 80% chance to encourage this move when it's sunny.
+; 90% chance to discourage this move when it's raining.
+
+	ld a, [Weather]
+	cp WEATHER_SUN
+	jr z, .asm_3921e
+
+	cp WEATHER_RAIN
+	ret nz
+
+	call Random
+	cp 10 percent
+	ret c
+
+	inc [hl]
+	inc [hl]
+	ret
+
+.asm_3921e
+	call AI_80_20
+	ret c
+
+	dec [hl]
+	dec [hl]
+	ret
+; 39225
+
+
+AI_Smart_Thunder: ; 39225
+; 90% chance to discourage this move when it's sunny.
+
+	ld a, [Weather]
+	cp WEATHER_SUN
+	ret nz
+
+	call Random
+	cp 10 percent
+	ret c
+
+	inc [hl]
+	ret
+; 39233
+
+
+AICompareSpeed: ; 39233
+; Return carry if enemy is faster than player.
+
+	push bc
+	ld a, [EnemyMonSpeed + 1]
+	ld b, a
+	ld a, [BattleMonSpeed + 1]
+	cp b
+	ld a, [EnemyMonSpeed]
+	ld b, a
+	ld a, [BattleMonSpeed]
+	sbc b
+	pop bc
+	ret
+; 39246
+
+
+AICheckPlayerMaxHP: ; 39246
+	push hl
+	push de
+	push bc
+	ld de, BattleMonHP
+	ld hl, BattleMonMaxHP
+	jr AICheckMaxHP
+; 39251
+
+
+AICheckEnemyMaxHP: ; 39251
+	push hl
+	push de
+	push bc
+	ld de, EnemyMonHP
+	ld hl, EnemyMonMaxHP
+	; fallthrough
+; 3925a
+
+
+AICheckMaxHP: ; 3925a
+; Return carry if hp at de matches max hp at hl.
+
+	ld a, [de]
+	inc de
+	cp [hl]
+	jr nz, .asm_39269
+
+	inc hl
+	ld a, [de]
+	cp [hl]
+	jr nz, .asm_39269
+
+	pop bc
+	pop de
+	pop hl
+	scf
+	ret
+
+.asm_39269
+	pop bc
+	pop de
+	pop hl
+	and a
+	ret
+; 3926e
+
+
+AICheckPlayerHalfHP: ; 3926e
+	push hl
+	ld hl, BattleMonHP
+	ld b, [hl]
+	inc hl
+	ld c, [hl]
+	sla c
+	rl b
+	inc hl
+	inc hl
+	ld a, [hld]
+	cp c
+	ld a, [hl]
+	sbc b
+	pop hl
+	ret
+; 39281
+
+
+AICheckEnemyHalfHP: ; 39281
+	push hl
+	push de
+	push bc
+	ld hl, EnemyMonHP
+	ld b, [hl]
+	inc hl
+	ld c, [hl]
+	sla c
+	rl b
+	inc hl
+	inc hl
+	ld a, [hld]
+	cp c
+	ld a, [hl]
+	sbc b
+	pop bc
+	pop de
+	pop hl
+	ret
+; 39298
+
+
+AICheckEnemyQuarterHP: ; 39298
+	push hl
+	push de
+	push bc
+	ld hl, EnemyMonHP
+	ld b, [hl]
+	inc hl
+	ld c, [hl]
+	sla c
+	rl b
+	sla c
+	rl b
+	inc hl
+	inc hl
+	ld a, [hld]
+	cp c
+	ld a, [hl]
+	sbc b
+	pop bc
+	pop de
+	pop hl
+	ret
+; 392b3
+
+
+AICheckPlayerQuarterHP: ; 392b3
+	push hl
+	ld hl, BattleMonHP
+	ld b, [hl]
+	inc hl
+	ld c, [hl]
+	sla c
+	rl b
+	sla c
+	rl b
+	inc hl
+	inc hl
+	ld a, [hld]
+	cp c
+	ld a, [hl]
+	sbc b
+	pop hl
+	ret
+; 392ca
+
+
+AIHasMoveEffect: ; 392ca
+; Return carry if the enemy has move b.
+
+	push hl
+	ld hl, EnemyMonMoves
+	ld c, EnemyMonMovesEnd - EnemyMonMoves
+
+.checkmove
+	ld a, [hli]
+	and a
+	jr z, .no
+
+	call AIGetEnemyMove
+
+	ld a, [wEnemyMoveStruct + MOVE_EFFECT]
+	cp b
+	jr z, .yes
+
+	dec c
+	jr nz, .checkmove
+
+.no
+	pop hl
+	and a
+	ret
+
+.yes
+	pop hl
+	scf
+	ret
+; 392e6
+
+
+AIHasMoveInArray: ; 392e6
+; Return carry if the enemy has a move in array hl.
+
+	push hl
+	push de
+	push bc
+
+.next
+	ld a, [hli]
+	cp $ff
+	jr z, .done
+
+	ld b, a
+	ld c, EnemyMonMovesEnd - EnemyMonMoves + 1
+	ld de, EnemyMonMoves
+
+.check
+	dec c
+	jr z, .next
+
+	ld a, [de]
+	inc de
+	cp b
+	jr nz, .check
+
+	scf
+
+.done
+	pop bc
+	pop de
+	pop hl
+	ret
+; 39301
+
+
+UsefulMoves: ; 39301
+; Moves that are usable all-around.
+	db DOUBLE_EDGE
+	db SING
+	db FLAMETHROWER
+	db HYDRO_PUMP
+	db SURF
+	db ICE_BEAM
+	db BLIZZARD
+	db HYPER_BEAM
+	db SLEEP_POWDER
+	db THUNDERBOLT
+	db THUNDER
+	db EARTHQUAKE
+	db TOXIC
+	db PSYCHIC_M
+	db HYPNOSIS
+	db RECOVER
+	db FIRE_BLAST
+	db SOFTBOILED
+	db SUPER_FANG
+	db $ff
+; 39315
+
+
+AI_Opportunist: ; 39315
+; Discourage stall moves when the enemy's HP is low.
+
+; Do nothing if enemy's HP is above 50%.
+	call AICheckEnemyHalfHP
+	ret c
+
+; Discourage stall moves if enemy's HP is below 25%.
+	call AICheckEnemyQuarterHP
+	jr nc, .asm_39322
+
+; 50% chance to discourage stall moves if enemy's HP is between 25% and 50%.
+	call AI_50_50
+	ret c
+
+.asm_39322
+	ld hl, Buffer1 - 1
+	ld de, EnemyMonMoves
+	ld c, EnemyMonMovesEnd - EnemyMonMoves + 1
+.checkmove
+	inc hl
+	dec c
+	jr z, .asm_39347
+
+	ld a, [de]
+	inc de
+	and a
+	jr z, .asm_39347
+
+	push hl
+	push de
+	push bc
+	ld hl, .stallmoves
+	ld de, 1
+	call IsInArray
+
+	pop bc
+	pop de
+	pop hl
+	jr nc, .checkmove
+
+	inc [hl]
+	jr .checkmove
+
+.asm_39347
+	ret
+
+.stallmoves
+	db SWORDS_DANCE
+	db TAIL_WHIP
+	db LEER
+	db GROWL
+	db DISABLE
+	db MIST
+	db COUNTER
+	db LEECH_SEED
+	db GROWTH
+	db STRING_SHOT
+	db MEDITATE
+	db AGILITY
+	db RAGE
+	db MIMIC
+	db SCREECH
+	db HARDEN
+	db WITHDRAW
+	db DEFENSE_CURL
+	db BARRIER
+	db LIGHT_SCREEN
+	db HAZE
+	db REFLECT
+	db FOCUS_ENERGY
+	db BIDE
+	db AMNESIA
+	db TRANSFORM
+	db SPLASH
+	db ACID_ARMOR
+	db SHARPEN
+	db CONVERSION
+	db SUBSTITUTE
+	db FLAME_WHEEL
+	db $ff
+; 39369
+
+
+
+AI_Aggressive: ; 39369
+; Use whatever does the most damage.
+
+; Discourage all damaging moves but the one that does the most damage.
+; If no damaging move deals damage to the player (immune),
+; no move will be discouraged
+
+; Figure out which attack does the most damage and put it in c.
+	ld hl, EnemyMonMoves
+	ld bc, 0
+	ld de, 0
+.checkmove
+	inc b
+	ld a, b
+	cp EnemyMonMovesEnd - EnemyMonMoves + 1
+	jr z, .gotstrongestmove
+
+	ld a, [hli]
+	and a
+	jr z, .gotstrongestmove
+
+	push hl
+	push de
+	push bc
+	call AIGetEnemyMove
+	ld a, [wEnemyMoveStruct + MOVE_POWER]
+	and a
+	jr z, .nodamage
+	call AIDamageCalc
+	pop bc
+	pop de
+	pop hl
+
+; Update current move if damage is highest so far
+	ld a, [CurDamage + 1]
+	cp e
+	ld a, [CurDamage]
+	sbc d
+	jr c, .checkmove
+
+	ld a, [CurDamage + 1]
+	ld e, a
+	ld a, [CurDamage]
+	ld d, a
+	ld c, b
+	jr .checkmove
+
+.nodamage
+	pop bc
+	pop de
+	pop hl
+	jr .checkmove
+
+.gotstrongestmove
+; Nothing we can do if no attacks did damage.
+	ld a, c
+	and a
+	jr z, .done
+
+; Discourage moves that do less damage unless they're reckless too.
+	ld hl, Buffer1 - 1
+	ld de, EnemyMonMoves
+	ld b, 0
+.checkmove2
+	inc b
+	ld a, b
+	cp EnemyMonMovesEnd - EnemyMonMoves + 1
+	jr z, .done
+
+; Ignore this move if it is the highest damaging one.
+	cp c
+	ld a, [de]
+	inc de
+	inc hl
+	jr z, .checkmove2
+
+	call AIGetEnemyMove
+
+; Ignore this move if its power is 0 or 1.
+; Moves such as Seismic Toss, Hidden Power,
+; Counter and Fissure have a base power of 1.
+	ld a, [wEnemyMoveStruct + MOVE_POWER]
+	cp 2
+	jr c, .checkmove2
+
+; Ignore this move if it is reckless.
+	push hl
+	push de
+	push bc
+	ld a, [wEnemyMoveStruct + MOVE_EFFECT]
+	ld hl, .RecklessMoves
+	ld de, 1
+	call IsInArray
+	pop bc
+	pop de
+	pop hl
+	jr c, .checkmove2
+
+; If we made it this far, discourage this move.
+	inc [hl]
+	jr .checkmove2
+
+.done
+	ret
+
+.RecklessMoves:
+	db EFFECT_SELFDESTRUCT
+	db EFFECT_RAMPAGE
+	db EFFECT_MULTI_HIT
+	db EFFECT_DOUBLE_HIT
+	db $ff
+; 393e7
+
+
+AIDamageCalc: ; 393e7
+	ld a, 1
+	ld [hBattleTurn], a
+	ld a, [wEnemyMoveStruct + MOVE_EFFECT]
+	ld de, 1
+	ld hl, .ConstantDamageEffects
+	call IsInArray
+	jr nc, .asm_39400
+	callfar BattleCommand_ConstantDamage
+	ret
+
+.asm_39400
+	callfar EnemyAttackDamage
+	callfar BattleCommand_DamageCalc
+	callfar BattleCommand_Stab
+	ret
+
+.ConstantDamageEffects:
+	db EFFECT_SUPER_FANG
+	db EFFECT_STATIC_DAMAGE
+	db EFFECT_LEVEL_DAMAGE
+	db EFFECT_PSYWAVE
+	db $ff
+; 39418
+
+
+AI_Cautious: ; 39418
+; 90% chance to discourage moves with residual effects after the first turn.
+
+	ld a, [EnemyTurnsTaken]
+	and a
+	ret z
+
+	ld hl, Buffer1 - 1
+	ld de, EnemyMonMoves
+	ld c, EnemyMonMovesEnd - EnemyMonMoves + 1
+.asm_39425
+	inc hl
+	dec c
+	ret z
+
+	ld a, [de]
+	inc de
+	and a
+	ret z
+
+	push hl
+	push de
+	push bc
+	ld hl, .residualmoves
+	ld de, 1
+	call IsInArray
+
+	pop bc
+	pop de
+	pop hl
+	jr nc, .asm_39425
+
+	call Random
+	cp 90 percent + 1
+	ret nc
+
+	inc [hl]
+	jr .asm_39425
+
+.residualmoves
+	db MIST
+	db LEECH_SEED
+	db POISONPOWDER
+	db STUN_SPORE
+	db THUNDER_WAVE
+	db FOCUS_ENERGY
+	db BIDE
+	db POISON_GAS
+	db TRANSFORM
+	db CONVERSION
+	db SUBSTITUTE
+	db SPIKES
+	db $ff
+; 39453
+
+
+
+AI_Status: ; 39453
+; Dismiss status moves that don't affect the player.
+
+	ld hl, Buffer1 - 1
+	ld de, EnemyMonMoves
+	ld b, EnemyMonMovesEnd - EnemyMonMoves + 1
+.checkmove
+	dec b
+	ret z
+
+	inc hl
+	ld a, [de]
+	and a
+	ret z
+
+	inc de
+	call AIGetEnemyMove
+
+	ld a, [wEnemyMoveStruct + MOVE_EFFECT]
+	cp EFFECT_TOXIC
+	jr z, .poisonimmunity
+	cp EFFECT_POISON
+	jr z, .poisonimmunity
+	cp EFFECT_SLEEP
+	jr z, .typeimmunity
+	cp EFFECT_PARALYZE
+	jr z, .typeimmunity
+
+	ld a, [wEnemyMoveStruct + MOVE_POWER]
+	and a
+	jr z, .checkmove
+
+	jr .typeimmunity
+
+.poisonimmunity
+	ld a, [BattleMonType1]
+	cp POISON
+	jr z, .immune
+	ld a, [BattleMonType2]
+	cp POISON
+	jr z, .immune
+
+.typeimmunity
+	push hl
+	push bc
+	push de
+	ld a, 1
+	ld [hBattleTurn], a
+	callfar BattleCheckTypeMatchup
+	pop de
+	pop bc
+	pop hl
+
+	ld a, [wd265]
+	and a
+	jr nz, .checkmove
+
+.immune
+	call AIDiscourageMove
+	jr .checkmove
+; 394a9
+
+
+
+AI_Risky: ; 394a9
+; Use any move that will KO the target.
+; Risky moves will often be an exception (see below).
+
+	ld hl, Buffer1 - 1
+	ld de, EnemyMonMoves
+	ld c, EnemyMonMovesEnd - EnemyMonMoves + 1
+.checkmove
+	inc hl
+	dec c
+	ret z
+
+	ld a, [de]
+	inc de
+	and a
+	ret z
+
+	push de
+	push bc
+	push hl
+	call AIGetEnemyMove
+
+	ld a, [wEnemyMoveStruct + MOVE_POWER]
+	and a
+	jr z, .nextmove
+
+; Don't use risky moves at max hp.
+	ld a, [wEnemyMoveStruct + MOVE_EFFECT]
+	ld de, 1
+	ld hl, .RiskyMoves
+	call IsInArray
+	jr nc, .checkko
+
+	call AICheckEnemyMaxHP
+	jr c, .nextmove
+
+; Else, 80% chance to exclude them.
+	call Random
+	cp 79 percent - 1
+	jr c, .nextmove
+
+.checkko
+	call AIDamageCalc
+
+	ld a, [CurDamage + 1]
+	ld e, a
+	ld a, [CurDamage]
+	ld d, a
+	ld a, [BattleMonHP + 1]
+	cp e
+	ld a, [BattleMonHP]
+	sbc d
+	jr nc, .nextmove
+
+	pop hl
+rept 5
+	dec [hl]
+endr
+	push hl
+
+.nextmove
+	pop hl
+	pop bc
+	pop de
+	jr .checkmove
+
+.RiskyMoves:
+	db EFFECT_SELFDESTRUCT
+	db EFFECT_OHKO
+	db $ff
+; 39502
+
+
+
+AI_None: ; 39502
+	ret
+; 39503
+
+
+AIDiscourageMove: ; 39503
+	ld a, [hl]
+	add 10
+	ld [hl], a
+	ret
+; 39508
+
+
+AIGetEnemyMove: ; 39508
+; Load attributes of move a into ram
+
+	push hl
+	push de
+	push bc
+	dec a
+	ld hl, Moves
+	ld bc, MOVE_LENGTH
+	call AddNTimes
+
+	ld de, wEnemyMoveStruct
+	ld a, BANK(Moves)
+	call FarCopyBytes
+
+	pop bc
+	pop de
+	pop hl
+	ret
+; 39521
+
+
+AI_80_20: ; 39521
+	call Random
+	cp 20 percent - 1
+	ret
+; 39527
+
+
+AI_50_50: ; 39527
+	call Random
+	cp 50 percent + 1
+	ret
+; 3952d
--- /dev/null
+++ b/engine/battle/ai/switch.asm
@@ -1,0 +1,672 @@
+CheckPlayerMoveTypeMatchups: ; 3484e
+; Check how well the moves you've already used
+; fare against the enemy's Pokemon.  Used to
+; score a potential switch.
+	push hl
+	push de
+	push bc
+	ld a, 10
+	ld [wEnemyAISwitchScore], a
+	ld hl, PlayerUsedMoves
+	ld a, [hl]
+	and a
+	jr z, .unknown_moves
+
+	ld d, NUM_MOVES
+	ld e, 0
+.loop
+	ld a, [hli]
+	and a
+	jr z, .exit
+	push hl
+	dec a
+	ld hl, Moves + MOVE_POWER
+	call GetMoveAttr
+	and a
+	jr z, .next
+
+	inc hl
+	call GetMoveByte
+	ld hl, EnemyMonType
+	call CheckTypeMatchup
+	ld a, [wTypeMatchup]
+	cp 10 + 1 ; 1.0 + 0.1
+	jr nc, .super_effective
+	and a
+	jr z, .next
+	cp 10 ; 1.0
+	jr nc, .neutral
+
+.not_very_effective
+	ld a, e
+	cp 1 ; 0.1
+	jr nc, .next
+	ld e, 1
+	jr .next
+
+.neutral
+	ld e, 2
+	jr .next
+
+.super_effective
+	call .DecreaseScore
+	pop hl
+	jr .done
+
+.next
+	pop hl
+	dec d
+	jr nz, .loop
+
+.exit
+	ld a, e
+	cp 2
+	jr z, .done
+	call .IncreaseScore
+	ld a, e
+	and a
+	jr nz, .done
+	call .IncreaseScore
+	jr .done
+
+.unknown_moves
+	ld a, [BattleMonType1]
+	ld b, a
+	ld hl, EnemyMonType1
+	call CheckTypeMatchup
+	ld a, [wTypeMatchup]
+	cp 10 + 1 ; 1.0 + 0.1
+	jr c, .ok
+	call .DecreaseScore
+.ok
+	ld a, [BattleMonType2]
+	cp b
+	jr z, .ok2
+	call CheckTypeMatchup
+	ld a, [wTypeMatchup]
+	cp 10 + 1 ; 1.0 + 0.1
+	jr c, .ok2
+	call .DecreaseScore
+.ok2
+
+.done
+	call .CheckEnemyMoveMatchups
+	pop bc
+	pop de
+	pop hl
+	ret
+; 348de
+
+
+.CheckEnemyMoveMatchups: ; 348de
+	ld de, EnemyMonMoves
+	ld b, NUM_MOVES + 1
+	ld c, 0
+
+	ld a, [wTypeMatchup]
+	push af
+.loop2
+	dec b
+	jr z, .exit2
+
+	ld a, [de]
+	and a
+	jr z, .exit2
+
+	inc de
+	dec a
+	ld hl, Moves + MOVE_POWER
+	call GetMoveAttr
+	and a
+	jr z, .loop2
+
+	inc hl
+	call GetMoveByte
+	ld hl, BattleMonType1
+	call CheckTypeMatchup
+
+	ld a, [wTypeMatchup]
+	; immune
+	and a
+	jr z, .loop2
+
+	; not very effective
+	inc c
+	cp 10
+	jr c, .loop2
+
+	; neutral
+	inc c
+	inc c
+	inc c
+	inc c
+	inc c
+	cp 10
+	jr z, .loop2
+
+	; super effective
+	ld c, 100
+	jr .loop2
+
+.exit2
+	pop af
+	ld [wTypeMatchup], a
+
+	ld a, c
+	and a
+	jr z, .doubledown ; double down
+	cp 5
+	jr c, .DecreaseScore ; down
+	cp 100
+	ret c
+	jr .IncreaseScore ; up
+
+.doubledown
+	call .DecreaseScore
+.DecreaseScore: ; 34931
+	ld a, [wEnemyAISwitchScore]
+	dec a
+	ld [wEnemyAISwitchScore], a
+	ret
+; 34939
+
+.IncreaseScore: ; 34939
+	ld a, [wEnemyAISwitchScore]
+	inc a
+	ld [wEnemyAISwitchScore], a
+	ret
+; 34941
+
+CheckAbleToSwitch: ; 34941
+	xor a
+	ld [wEnemySwitchMonParam], a
+	call FindAliveEnemyMons
+	ret c
+
+	ld a, [EnemySubStatus1]
+	bit SUBSTATUS_PERISH, a
+	jr z, .no_perish
+
+	ld a, [EnemyPerishCount]
+	cp 1
+	jr nz, .no_perish
+
+	; Perish count is 1
+
+	call FindAliveEnemyMons
+	call FindEnemyMonsWithAtLeastQuarterMaxHP
+	call FindEnemyMonsThatResistPlayer
+	call FindAliveEnemyMonsWithASuperEffectiveMove
+
+	ld a, e
+	cp 2
+	jr nz, .not_2
+
+	ld a, [wEnemyAISwitchScore]
+	add $30 ; maximum chance
+	ld [wEnemySwitchMonParam], a
+	ret
+
+.not_2
+	call FindAliveEnemyMons
+	sla c
+	sla c
+	ld b, $ff
+
+.loop1
+	inc b
+	sla c
+	jr nc, .loop1
+
+	ld a, b
+	add $30 ; maximum chance
+	ld [wEnemySwitchMonParam], a
+	ret
+
+.no_perish
+	call CheckPlayerMoveTypeMatchups
+	ld a, [wEnemyAISwitchScore]
+	cp 11
+	ret nc
+
+	ld a, [LastPlayerCounterMove]
+	and a
+	jr z, .no_last_counter_move
+
+	call FindEnemyMonsImmuneToLastCounterMove
+	ld a, [wEnemyAISwitchScore]
+	and a
+	jr z, .no_last_counter_move
+
+	ld c, a
+	call FindEnemyMonsWithASuperEffectiveMove
+	ld a, [wEnemyAISwitchScore]
+	cp $ff
+	ret z
+
+	ld b, a
+	ld a, e
+	cp 2
+	jr z, .not_2_again
+
+	call CheckPlayerMoveTypeMatchups
+	ld a, [wEnemyAISwitchScore]
+	cp 10
+	ret nc
+
+	ld a, b
+	add $10
+	ld [wEnemySwitchMonParam], a
+	ret
+
+.not_2_again
+	ld c, $10
+	call CheckPlayerMoveTypeMatchups
+	ld a, [wEnemyAISwitchScore]
+	cp 10
+	jr nc, .okay
+	ld c, $20
+
+.okay
+	ld a, b
+	add c
+	ld [wEnemySwitchMonParam], a
+	ret
+
+.no_last_counter_move
+	call CheckPlayerMoveTypeMatchups
+	ld a, [wEnemyAISwitchScore]
+	cp 10
+	ret nc
+
+	call FindAliveEnemyMons
+	call FindEnemyMonsWithAtLeastQuarterMaxHP
+	call FindEnemyMonsThatResistPlayer
+	call FindAliveEnemyMonsWithASuperEffectiveMove
+
+	ld a, e
+	cp $2
+	ret nz
+
+	ld a, [wEnemyAISwitchScore]
+	add $10
+	ld [wEnemySwitchMonParam], a
+	ret
+; 349f4
+
+
+FindAliveEnemyMons: ; 349f4
+	ld a, [OTPartyCount]
+	cp 2
+	jr c, .only_one
+
+	ld d, a
+	ld e, 0
+	ld b, 1 << (PARTY_LENGTH - 1)
+	ld c, 0
+	ld hl, OTPartyMon1HP
+
+.loop
+	ld a, [CurOTMon]
+	cp e
+	jr z, .next
+
+	push bc
+	ld b, [hl]
+	inc hl
+	ld a, [hld]
+	or b
+	pop bc
+	jr z, .next
+
+	ld a, c
+	or b
+	ld c, a
+
+.next
+	srl b
+	push bc
+	ld bc, PARTYMON_STRUCT_LENGTH
+	add hl, bc
+	pop bc
+	inc e
+	dec d
+	jr nz, .loop
+
+	ld a, c
+	and a
+	jr nz, .more_than_one
+
+.only_one
+	scf
+	ret
+
+.more_than_one
+	and a
+	ret
+; 34a2a
+
+
+FindEnemyMonsImmuneToLastCounterMove: ; 34a2a
+	ld hl, OTPartyMon1
+	ld a, [OTPartyCount]
+	ld b, a
+	ld c, 1 << (PARTY_LENGTH - 1)
+	ld d, 0
+	xor a
+	ld [wEnemyAISwitchScore], a
+
+.loop
+	ld a, [CurOTMon]
+	cp d
+	push hl
+	jr z, .next
+
+	push hl
+	push bc
+
+	; If the Pokemon has at least 1 HP...
+	ld bc, MON_HP
+	add hl, bc
+	pop bc
+	ld a, [hli]
+	or [hl]
+	pop hl
+	jr z, .next
+
+	ld a, [hl]
+	ld [CurSpecies], a
+	call GetBaseData
+
+	; the player's last move is damaging...
+	ld a, [LastPlayerCounterMove]
+	dec a
+	ld hl, Moves + MOVE_POWER
+	call GetMoveAttr
+	and a
+	jr z, .next
+
+	; and the Pokemon is immune to it...
+	inc hl
+	call GetMoveByte
+	ld hl, BaseType
+	call CheckTypeMatchup
+	ld a, [wTypeMatchup]
+	and a
+	jr nz, .next
+
+	; ... encourage that Pokemon.
+	ld a, [wEnemyAISwitchScore]
+	or c
+	ld [wEnemyAISwitchScore], a
+.next
+	pop hl
+	dec b
+	ret z
+
+	push bc
+	ld bc, PARTYMON_STRUCT_LENGTH
+	add hl, bc
+	pop bc
+
+	inc d
+	srl c
+	jr .loop
+; 34a85
+
+
+FindAliveEnemyMonsWithASuperEffectiveMove: ; 34a85
+	push bc
+	ld a, [OTPartyCount]
+	ld e, a
+	ld hl, OTPartyMon1HP
+	ld b, 1 << (PARTY_LENGTH - 1)
+	ld c, 0
+.loop
+	ld a, [hli]
+	or [hl]
+	jr z, .next
+
+	ld a, b
+	or c
+	ld c, a
+
+.next
+	srl b
+	push bc
+	ld bc, PartyMon2HP - (PartyMon1HP + 1)
+	add hl, bc
+	pop bc
+	dec e
+	jr nz, .loop
+
+	ld a, c
+	pop bc
+
+	and c
+	ld c, a
+FindEnemyMonsWithASuperEffectiveMove: ; 34aa7
+
+	ld a, -1
+	ld [wEnemyAISwitchScore], a
+	ld hl, OTPartyMon1Moves
+	ld b, 1 << (PARTY_LENGTH - 1)
+	ld d, 0
+	ld e, 0
+.loop
+	ld a, b
+	and c
+	jr z, .next
+
+	push hl
+	push bc
+	; for move on mon:
+	ld b, NUM_MOVES
+	ld c, 0
+.loop3
+	; if move is None: break
+	ld a, [hli]
+	and a
+	push hl
+	jr z, .break3
+
+	; if move has no power: continue
+	dec a
+	ld hl, Moves + MOVE_POWER
+	call GetMoveAttr
+	and a
+	jr z, .nope
+
+	; check type matchups
+	inc hl
+	call GetMoveByte
+	ld hl, BattleMonType1
+	call CheckTypeMatchup
+
+	; if immune or not very effective: continue
+	ld a, [wTypeMatchup]
+	cp 10
+	jr c, .nope
+
+	; if neutral: load 1 and continue
+	ld e, 1
+	cp 10 + 1
+	jr c, .nope
+
+	; if super-effective: load 2 and break
+	ld e, 2
+	jr .break3
+
+.nope
+	pop hl
+	dec b
+	jr nz, .loop3
+
+	jr .done
+
+.break3
+	pop hl
+.done
+	ld a, e
+	pop bc
+	pop hl
+	cp 2
+	jr z, .done2 ; at least one move is super-effective
+	cp 1
+	jr nz, .next ; no move does more than half damage
+
+	; encourage this pokemon
+	ld a, d
+	or b
+	ld d, a
+	jr .next ; such a long jump
+
+.next
+	; next pokemon?
+	push bc
+	ld bc, PARTYMON_STRUCT_LENGTH
+	add hl, bc
+	pop bc
+	srl b
+	jr nc, .loop
+
+	; if no pokemon has a super-effective move: return
+	ld a, d
+	ld b, a
+	and a
+	ret z
+
+.done2
+	; convert the bit flag to an int and return
+	push bc
+	sla b
+	sla b
+	ld c, $ff
+.loop2
+	inc c
+	sla b
+	jr nc, .loop2
+
+	ld a, c
+	ld [wEnemyAISwitchScore], a
+	pop bc
+	ret
+; 34b20
+
+
+FindEnemyMonsThatResistPlayer: ; 34b20
+	push bc
+	ld hl, OTPartySpecies
+	ld b, 1 << (PARTY_LENGTH - 1)
+	ld c, 0
+
+.loop
+	ld a, [hli]
+	cp $ff
+	jr z, .done
+
+	push hl
+	ld [CurSpecies], a
+	call GetBaseData
+	ld a, [LastPlayerCounterMove]
+	and a
+	jr z, .skip_move
+
+	dec a
+	ld hl, Moves + MOVE_POWER
+	call GetMoveAttr
+	and a
+	jr z, .skip_move
+
+	inc hl
+	call GetMoveByte
+	jr .check_type
+
+.skip_move
+	ld a, [BattleMonType1]
+	ld hl, BaseType
+	call CheckTypeMatchup
+	ld a, [wTypeMatchup]
+	cp 10 + 1
+	jr nc, .dont_choose_mon
+	ld a, [BattleMonType2]
+
+.check_type
+	ld hl, BaseType
+	call CheckTypeMatchup
+	ld a, [wTypeMatchup]
+	cp 10 + 1
+	jr nc, .dont_choose_mon
+
+	ld a, b
+	or c
+	ld c, a
+
+.dont_choose_mon
+	srl b
+	pop hl
+	jr .loop
+
+.done
+	ld a, c
+	pop bc
+	and c
+	ld c, a
+	ret
+; 34b77
+
+
+FindEnemyMonsWithAtLeastQuarterMaxHP: ; 34b77
+	push bc
+	ld de, OTPartySpecies
+	ld b, 1 << (PARTY_LENGTH - 1)
+	ld c, 0
+	ld hl, OTPartyMon1HP
+
+.loop
+	ld a, [de]
+	inc de
+	cp $ff
+	jr z, .done
+
+	push hl
+	push bc
+	ld b, [hl]
+	inc hl
+	ld c, [hl]
+	inc hl
+	inc hl
+; hl = MaxHP + 1
+; bc = [CurHP] * 4
+	srl c
+	rl b
+	srl c
+	rl b
+; if bc >= [hl], encourage
+	ld a, [hld]
+	cp c
+	ld a, [hl]
+	sbc b
+	pop bc
+	jr nc, .next
+
+	ld a, b
+	or c
+	ld c, a
+
+.next
+	srl b
+	pop hl
+	push bc
+	ld bc, PARTYMON_STRUCT_LENGTH
+	add hl, bc
+	pop bc
+	jr .loop
+
+.done
+	ld a, c
+	pop bc
+	and c
+	ld c, a
+	ret
+; 34bb1
--- /dev/null
+++ b/engine/battle/anim_hp_bar.asm
@@ -1,0 +1,435 @@
+_AnimateHPBar: ; d627
+	call .IsMaximumMoreThan48Pixels
+	jr c, .MoreThan48Pixels
+	call .ComputePixels
+.ShortAnimLoop:
+	push bc
+	push hl
+	call ShortAnim_UpdateVariables
+	pop hl
+	pop bc
+	push af
+	push bc
+	push hl
+	call ShortHPBarAnim_UpdateTiles
+	call HPBarAnim_BGMapUpdate
+	pop hl
+	pop bc
+	pop af
+	jr nc, .ShortAnimLoop
+	ret
+
+.MoreThan48Pixels:
+	call .ComputePixels
+.LongAnimLoop:
+	push bc
+	push hl
+	call LongAnim_UpdateVariables
+	pop hl
+	pop bc
+	ret c
+	push af
+	push bc
+	push hl
+	call LongHPBarAnim_UpdateTiles
+	call HPBarAnim_BGMapUpdate
+	pop hl
+	pop bc
+	pop af
+	jr nc, .LongAnimLoop
+	ret
+; d65f
+
+.IsMaximumMoreThan48Pixels: ; d65f
+	ld a, [wCurHPAnimMaxHP + 1]
+	and a
+	jr nz, .player
+	ld a, [wCurHPAnimMaxHP]
+	cp 6 * 8
+	jr nc, .player
+	and a
+	ret
+
+.player
+	scf
+	ret
+; d670
+
+.ComputePixels: ; d670
+	push hl
+	ld hl, wCurHPAnimMaxHP
+	ld a, [hli]
+	ld e, a
+	ld a, [hli]
+	ld d, a
+	ld a, [hli]
+	ld c, a
+	ld a, [hli]
+	ld b, a
+	pop hl
+	call ComputeHPBarPixels
+	ld a, e
+	ld [wCurHPBarPixels], a
+
+	ld a, [wCurHPAnimNewHP]
+	ld c, a
+	ld a, [wCurHPAnimNewHP + 1]
+	ld b, a
+	ld a, [wCurHPAnimMaxHP]
+	ld e, a
+	ld a, [wCurHPAnimMaxHP + 1]
+	ld d, a
+	call ComputeHPBarPixels
+	ld a, e
+	ld [wNewHPBarPixels], a
+
+	push hl
+	ld hl, wCurHPAnimOldHP
+	ld a, [hli]
+	ld c, a
+	ld a, [hli]
+	ld b, a
+	ld a, [hli]
+	ld e, a
+	ld a, [hli]
+	ld d, a
+	pop hl
+	ld a, e
+	sub c
+	ld e, a
+	ld a, d
+	sbc b
+	ld d, a
+	jr c, .negative
+	ld a, [wCurHPAnimOldHP]
+	ld [wCurHPAnimLowHP], a
+	ld a, [wCurHPAnimNewHP]
+	ld [wCurHPAnimHighHP], a
+	ld bc, 1
+	jr .got_direction
+
+.negative
+	ld a, [wCurHPAnimOldHP]
+	ld [wCurHPAnimHighHP], a
+	ld a, [wCurHPAnimNewHP]
+	ld [wCurHPAnimLowHP], a
+	ld a, e
+	xor $ff
+	inc a
+	ld e, a
+	ld a, d
+	xor $ff
+	ld d, a
+	ld bc, -1
+.got_direction
+	ld a, d
+	ld [wCurHPAnimDeltaHP], a
+	ld a, e
+	ld [wCurHPAnimDeltaHP + 1], a
+	ret
+; d6e2
+
+ShortAnim_UpdateVariables: ; d6e2
+	ld hl, wCurHPBarPixels
+	ld a, [wNewHPBarPixels]
+	cp [hl]
+	jr nz, .not_finished
+	scf
+	ret
+
+.not_finished
+	ld a, c
+	add [hl]
+	ld [hl], a
+	call ShortHPBar_CalcPixelFrame
+	and a
+	ret
+; d6f5
+
+LongAnim_UpdateVariables: ; d6f5
+.loop
+	ld hl, wCurHPAnimOldHP
+	ld a, [hli]
+	ld e, a
+	ld a, [hli]
+	ld d, a
+	ld a, e
+	cp [hl]
+	jr nz, .next
+	inc hl
+	ld a, d
+	cp [hl]
+	jr nz, .next
+	scf
+	ret
+
+.next
+	ld l, e
+	ld h, d
+	add hl, bc
+	ld a, l
+	ld [wCurHPAnimOldHP], a
+	ld a, h
+	ld [wCurHPAnimOldHP + 1], a
+	push hl
+	push de
+	push bc
+	ld hl, wCurHPAnimMaxHP
+	ld a, [hli]
+	ld e, a
+	ld a, [hli]
+	ld d, a
+	ld a, [hli]
+	ld c, a
+	ld a, [hli]
+	ld b, a
+	; This routine is buggy. The result from ComputeHPBarPixels is stored
+	; in e. However, the pop de opcode deletes this result before it is even
+	; used. The game then proceeds as though it never deleted that output.
+	; To fix, uncomment the line below.
+	call ComputeHPBarPixels
+	; ld a, e
+	pop bc
+	pop de
+	pop hl
+	ld a, e ; Comment or delete this line to fix the above bug.
+	ld hl, wCurHPBarPixels
+	cp [hl]
+	jr z, .loop
+	ld [hl], a
+	and a
+	ret
+; d730
+
+ShortHPBarAnim_UpdateTiles: ; d730
+	call HPBarAnim_UpdateHPRemaining
+	ld d, $6
+	ld a, [wWhichHPBar]
+	and $1
+	ld b, a
+	ld a, [wCurHPBarPixels]
+	ld e, a
+	ld c, a
+	push de
+	call HPBarAnim_RedrawHPBar
+	pop de
+	call HPBarAnim_PaletteUpdate
+	ret
+; d749
+
+LongHPBarAnim_UpdateTiles: ; d749
+	call HPBarAnim_UpdateHPRemaining
+	ld a, [wCurHPAnimOldHP]
+	ld c, a
+	ld a, [wCurHPAnimOldHP + 1]
+	ld b, a
+	ld a, [wCurHPAnimMaxHP]
+	ld e, a
+	ld a, [wCurHPAnimMaxHP + 1]
+	ld d, a
+	call ComputeHPBarPixels
+	ld c, e
+	ld d, $6
+	ld a, [wWhichHPBar]
+	and $1
+	ld b, a
+	push de
+	call HPBarAnim_RedrawHPBar
+	pop de
+	call HPBarAnim_PaletteUpdate
+	ret
+; d771
+
+HPBarAnim_RedrawHPBar: ; d771
+	ld a, [wWhichHPBar]
+	cp $2
+	jr nz, .skip
+	ld a, 2 * SCREEN_WIDTH
+	add l
+	ld l, a
+	ld a, 0
+	adc h
+	ld h, a
+.skip
+	call DrawBattleHPBar
+	ret
+; d784
+
+HPBarAnim_UpdateHPRemaining: ; d784
+	ld a, [wWhichHPBar]
+	and a
+	ret z
+	cp $1
+	jr z, .load_15
+	ld de, SCREEN_WIDTH + 2
+	jr .loaded_de
+
+.load_15
+	ld de, SCREEN_WIDTH + 1
+.loaded_de
+	push hl
+	add hl, de
+	ld a, " "
+	ld [hli], a
+	ld [hli], a
+	ld [hld], a
+	dec hl
+	ld a, [wCurHPAnimOldHP]
+	ld [StringBuffer2 + 1], a
+	ld a, [wCurHPAnimOldHP + 1]
+	ld [StringBuffer2], a
+	ld de, StringBuffer2
+	lb bc, 2, 3
+	call PrintNum
+	pop hl
+	ret
+; d7b4
+
+HPBarAnim_PaletteUpdate: ; d7b4
+	ld a, [hCGB]
+	and a
+	ret z
+	ld hl, wCurHPAnimPal
+	call SetHPPal
+	ld a, [wCurHPAnimPal]
+	ld c, a
+	farcall ApplyHPBarPals
+	ret
+; d7c9
+
+HPBarAnim_BGMapUpdate: ; d7c9
+	ld a, [hCGB]
+	and a
+	jr nz, .cgb
+	call DelayFrame
+	call DelayFrame
+	ret
+
+.cgb
+	ld a, [wWhichHPBar]
+	and a
+	jr z, .load_0
+	cp $1
+	jr z, .load_1
+	ld a, [CurPartyMon]
+	cp $3
+	jr nc, .bottom_half_of_screen
+	ld c, $0
+	jr .got_third
+
+.bottom_half_of_screen
+	ld c, $1
+.got_third
+	push af
+	cp $2
+	jr z, .skip_delay
+	cp $5
+	jr z, .skip_delay
+	ld a, $2
+	ld [hBGMapMode], a
+	ld a, c
+	ld [hBGMapThird], a
+	call DelayFrame
+.skip_delay
+	ld a, $1
+	ld [hBGMapMode], a
+	ld a, c
+	ld [hBGMapThird], a
+	call DelayFrame
+	pop af
+	cp $2
+	jr z, .two_frames
+	cp $5
+	jr z, .two_frames
+	ret
+
+.two_frames
+	inc c
+	ld a, $2
+	ld [hBGMapMode], a
+	ld a, c
+	ld [hBGMapThird], a
+	call DelayFrame
+	ld a, $1
+	ld [hBGMapMode], a
+	ld a, c
+	ld [hBGMapThird], a
+	call DelayFrame
+	ret
+
+.load_0
+	ld c, $0
+	jr .finish
+
+.load_1
+	ld c, $1
+.finish
+	call DelayFrame
+	ld a, c
+	ld [hBGMapThird], a
+	call DelayFrame
+	ret
+; d839
+
+ShortHPBar_CalcPixelFrame: ; d839
+	ld a, [wCurHPAnimMaxHP]
+	ld c, a
+	ld b, 0
+	ld hl, 0
+	ld a, [wCurHPBarPixels]
+	cp 6 * 8
+	jr nc, .return_max
+	and a
+	jr z, .return_zero
+	call AddNTimes
+
+	ld b, 0
+; This routine is buggy. If [wCurHPAnimMaxHP] * [wCurHPBarPixels] is divisible
+; by 48, the loop runs one extra time. To fix, uncomment the line below.
+.loop
+	ld a, l
+	sub 6 * 8
+	ld l, a
+	ld a, h
+	sbc $0
+	ld h, a
+	; jr z, .done
+	jr c, .done
+	inc b
+	jr .loop
+
+.done
+	push bc
+	ld bc, $80
+	add hl, bc
+	pop bc
+	ld a, l
+	sub 6 * 8
+	ld l, a
+	ld a, h
+	sbc $0
+	ld h, a
+	jr c, .no_carry
+	inc b
+.no_carry
+	ld a, [wCurHPAnimLowHP]
+	cp b
+	jr nc, .finish
+	ld a, [wCurHPAnimHighHP]
+	cp b
+	jr c, .finish
+	ld a, b
+.finish
+	ld [wCurHPAnimOldHP], a
+	ret
+
+.return_zero
+	xor a
+	ld [wCurHPAnimOldHP], a
+	ret
+
+.return_max
+	ld a, [wCurHPAnimMaxHP]
+	ld [wCurHPAnimOldHP], a
+	ret
+; d88c
--- /dev/null
+++ b/engine/battle/battle_transition.asm
@@ -1,0 +1,873 @@
+Predef_StartBattle: ; 8c20f
+	call .InitGFX
+	ld a, [rBGP]
+	ld [wBGP], a
+	ld a, [rOBP0]
+	ld [wOBP0], a
+	ld 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
+	jr nz, .done
+	call FlashyTransitionToBattle
+	call DelayFrame
+	jr .loop
+
+.done
+	ld a, [rSVBK]
+	push af
+	ld a, $5
+	ld [rSVBK], a
+
+	ld hl, UnknBGPals
+	ld bc, 8 palettes
+	xor a
+	call ByteFill
+
+	pop af
+	ld [rSVBK], a
+
+	ld a, %11111111
+	ld [wBGP], a
+	call DmgToCgbBGPals
+	call DelayFrame
+	xor a
+	ld [hLCDCPointer], a
+	ld [hLYOverrideStart], a
+	ld [hLYOverrideEnd], a
+	ld [hSCY], a
+
+	ld a, $1
+	ld [rSVBK], a
+	pop af
+	ld [hVBlank], a
+	call DelayFrame
+	ret
+; 8c26d
+
+.InitGFX: ; 8c26d
+	ld a, [wLinkMode]
+	cp LINK_MOBILE
+	jr z, .mobile
+	farcall ReanchorBGMap_NoOAMUpdate
+	call UpdateSprites
+	call DelayFrame
+	call .NonMobile_LoadPokeballTiles
+	call BattleStart_CopyTilemapAtOnce
+	jr .resume
+
+.mobile
+	call LoadTrainerBattlePokeballTiles
+
+.resume
+	ld a, SCREEN_HEIGHT_PX
+	ld [hWY], a
+	call DelayFrame
+	xor a
+	ld [hBGMapMode], a
+	ld hl, wJumptableIndex
+	xor a
+	ld [hli], a
+	ld [hli], a
+	ld [hl], a
+	call WipeLYOverrides
+	ret
+; 8c2a0
+
+.NonMobile_LoadPokeballTiles: ; 8c2a0
+	call LoadTrainerBattlePokeballTiles
+	hlbgcoord 0, 0
+	call ConvertTrainerBattlePokeballTilesTo2bpp
+	ret
+; 8c2aa
+
+LoadTrainerBattlePokeballTiles:
+; Load the tiles used in the Pokeball Graphic that fills the screen
+; at the start of every Trainer battle.
+	ld de, TrainerBattlePokeballTiles
+	ld hl, VTiles1 tile $7e
+	ld b, BANK(TrainerBattlePokeballTiles)
+	ld c, 2
+	call Request2bpp
+
+	ld a, [rVBK]
+	push af
+	ld a, $1
+	ld [rVBK], a
+
+	ld de, TrainerBattlePokeballTiles
+	ld hl, VTiles4 tile $7e
+	ld b, BANK(TrainerBattlePokeballTiles)
+	ld c, 2
+	call Request2bpp
+
+	pop af
+	ld [rVBK], a
+	ret
+; 8c2cf
+
+ConvertTrainerBattlePokeballTilesTo2bpp: ; 8c2cf
+	ld a, [rSVBK]
+	push af
+	ld a, $6
+	ld [rSVBK], a
+	push hl
+	ld hl, wDecompressScratch
+	ld bc, $28 tiles
+
+.loop
+	ld [hl], -1
+	inc hl
+	dec bc
+	ld a, c
+	or b
+	jr nz, .loop
+
+	pop hl
+	ld de, wDecompressScratch
+	ld b, BANK(ConvertTrainerBattlePokeballTilesTo2bpp) ; BANK(@)
+	ld c, $28
+	call Request2bpp
+	pop af
+	ld [rSVBK], a
+	ret
+; 8c2f4
+
+TrainerBattlePokeballTiles: ; 8c2f4
+INCBIN "gfx/overworld/trainer_battle_pokeball_tiles.2bpp"
+
+
+FlashyTransitionToBattle: ; 8c314
+	jumptable .dw, wJumptableIndex
+; 8c323
+
+.dw ; 8c323 (23:4323)
+	dw StartTrainerBattle_DetermineWhichAnimation ; 00
+
+	; Animation 1: 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
+
+	; Animation 2: 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
+
+	; Animation 3: 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
+
+	; Animation 4: 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
+
+	; All animations jump to here.
+	dw StartTrainerBattle_Finish ; 20
+
+
+StartTrainerBattle_DetermineWhichAnimation: ; 8c365 (23:4365)
+; The screen flashes a different number of times depending on the level of
+; your lead Pokemon relative to the opponent's.
+; BUG: BattleMonLevel and EnemyMonLevel are not set at this point, so whatever
+; values happen to be there will determine the animation.
+	ld de, 0
+	ld a, [BattleMonLevel]
+	add 3
+	ld hl, EnemyMonLevel
+	cp [hl]
+	jr nc, .okay
+	set 0, e
+.okay
+	ld a, [wEnvironment]
+	cp CAVE
+	jr z, .okay2
+	cp ENVIRONMENT_5
+	jr z, .okay2
+	cp DUNGEON
+	jr z, .okay2
+	set 1, e
+.okay2
+	ld hl, .StartingPoints
+	add hl, de
+	ld a, [hl]
+	ld [wJumptableIndex], a
+	ret
+; 8c38f (23:438f)
+
+.StartingPoints: ; 8c38f
+	db 1,  9
+	db 16, 24
+; 8c393
+
+StartTrainerBattle_Finish: ; 8c393 (23:4393)
+	call ClearSprites
+	ld a, $80
+	ld [wJumptableIndex], a
+	ret
+
+StartTrainerBattle_NextScene: ; 8c39c (23:439c)
+	ld hl, wJumptableIndex
+	inc [hl]
+	ret
+
+StartTrainerBattle_SetUpBGMap: ; 8c3a1 (23:43a1)
+	call StartTrainerBattle_NextScene
+	xor a
+	ld [wcf64], a
+	ld [hBGMapMode], a
+	ret
+
+StartTrainerBattle_Flash: ; 8c3ab (23:43ab)
+	call .DoFlashAnimation
+	ret nc
+	call StartTrainerBattle_NextScene
+	ret
+
+.DoFlashAnimation: ; 8c3b3 (23:43b3)
+	ld a, [wTimeOfDayPalset]
+	cp %11111111 ; dark cave
+	jr z, .done
+	ld hl, wcf64
+	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 [wcf64], a
+	scf
+	ret
+; 8c3db (23:43db)
+
+.pals ; 8c3db
+	db %11111001 ; 3321
+	db %11111110 ; 3332
+	db %11111111 ; 3333
+	db %11111110 ; 3332
+	db %11111001 ; 3321
+	db %11100100 ; 3210
+	db %10010000 ; 2100
+	db %01000000 ; 1000
+	db %00000000 ; 0000
+	db %01000000 ; 1000
+	db %10010000 ; 2100
+	db %11100100 ; 3210
+	db %00000001 ; 0001
+; 8c3e8
+
+StartTrainerBattle_SetUpForWavyOutro: ; 8c3e8 (23:43e8)
+	farcall Function5602
+	ld a, $5 ; BANK(LYOverrides)
+	ld [rSVBK], a
+
+	call StartTrainerBattle_NextScene
+
+	ld a, rSCX - $ff00
+	ld [hLCDCPointer], a
+	xor a
+	ld [hLYOverrideStart], a
+	ld a, $90
+	ld [hLYOverrideEnd], a
+	xor a
+	ld [wcf64], a
+	ld [wcf65], a
+	ret
+
+StartTrainerBattle_SineWave: ; 8c408 (23:4408)
+	ld a, [wcf64]
+	cp $60
+	jr nc, .end
+	call .DoSineWave
+	ret
+
+.end
+	ld a, $20
+	ld [wJumptableIndex], a
+	ret
+
+.DoSineWave: ; 8c419 (23:4419)
+	ld hl, wcf65
+	ld a, [hl]
+	inc [hl]
+	ld hl, wcf64
+	ld d, [hl]
+	add [hl]
+	ld [hl], a
+	ld a, LYOverridesEnd - LYOverrides
+	ld bc, LYOverrides
+	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: ; 8c43d (23:443d)
+	farcall Function5602
+	ld a, $5 ; BANK(LYOverrides)
+	ld [rSVBK], a
+	call StartTrainerBattle_NextScene
+	xor a
+	ld [wcf64], a
+	ret
+
+StartTrainerBattle_SpinToBlack: ; 8c44f (23:444f)
+	xor a
+	ld [hBGMapMode], a
+	ld a, [wcf64]
+	ld e, a
+	ld d, 0
+	ld hl, .spintable
+rept 5
+	add hl, de
+endr
+	ld a, [hli]
+	cp -1
+	jr z, .end
+	ld [wcf65], a
+	call .load
+	ld a, $1
+	ld [hBGMapMode], a
+	call DelayFrame
+	call DelayFrame
+	ld hl, wcf64
+	inc [hl]
+	ret
+
+.end
+	ld a, $1
+	ld [hBGMapMode], a
+	call DelayFrame
+	call DelayFrame
+	call DelayFrame
+	xor a
+	ld [hBGMapMode], a
+	ld a, $20
+	ld [wJumptableIndex], a
+	ret
+; 8c490 (23:4490)
+
+; quadrants
+	const_def
+	const UPPER_LEFT
+	const UPPER_RIGHT
+	const LOWER_LEFT
+	const LOWER_RIGHT
+
+.spintable ; 8c490
+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
+; 8c4f5
+
+.load ; 8c4f5 (23:44f5)
+	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], $ff
+	ld a, [wcf65]
+	bit 0, a
+	jr z, .leftside
+	inc hl
+	jr .okay1
+.leftside
+	dec hl
+.okay1
+	dec c
+	jr nz, .loop1
+	pop hl
+	ld a, [wcf65]
+	bit 1, 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, [wcf65]
+	bit 0, a
+	jr z, .leftside2
+	dec hl
+	jr .okay2
+.leftside2
+	inc hl
+.okay2
+	dec c
+	jr nz, .loop2
+	jr .loop
+; 8c538 (23:4538)
+
+.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
+; 8c578
+
+StartTrainerBattle_SetUpForRandomScatterOutro: ; 8c578 (23:4578)
+	farcall Function5602
+	ld a, $5 ; BANK(LYOverrides)
+	ld [rSVBK], a
+	call StartTrainerBattle_NextScene
+	ld a, $10
+	ld [wcf64], a
+	ld a, $1
+	ld [hBGMapMode], a
+	ret
+
+StartTrainerBattle_SpeckleToBlack: ; 8c58f (23:458f)
+	ld hl, wcf64
+	ld a, [hl]
+	and a
+	jr z, .done
+	dec [hl]
+	ld c, $c
+.loop
+	push bc
+	call .BlackOutRandomTile
+	pop bc
+	dec c
+	jr nz, .loop
+	ret
+
+.done
+	ld a, $1
+	ld [hBGMapMode], a
+	call DelayFrame
+	call DelayFrame
+	call DelayFrame
+	xor a
+	ld [hBGMapMode], a
+	ld a, $20
+	ld [wJumptableIndex], a
+	ret
+
+.BlackOutRandomTile: ; 8c5b8 (23:45b8)
+.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 $ff
+	jr z, .y_loop
+	ld [hl], $ff
+	ret
+
+StartTrainerBattle_LoadPokeBallGraphics: ; 8c5dc (23:45dc)
+	ld a, [OtherTrainerClass]
+	and a
+	jp z, .nextscene ; don't need to be here if wild
+
+	xor a
+	ld [hBGMapMode], a
+	hlcoord 0, 0, AttrMap
+	ld bc, SCREEN_HEIGHT * SCREEN_WIDTH
+	inc b
+	inc c
+	jr .enter_loop_midway
+
+.loop
+; set all pals to 7
+	ld a, [hl]
+	or %00000111
+	ld [hli], a
+.enter_loop_midway
+	dec c
+	jr nz, .loop
+	dec b
+	jr nz, .loop
+
+	call .loadpokeballgfx ; ld a, [OtherTrainerClass] \ ld de, PokeBallTransition \ ret
+	hlcoord 2, 1
+
+	ld b, SCREEN_WIDTH - 4
+.loop2
+	push hl
+	ld c, 2
+.loop3
+	push hl
+	ld a, [de]
+	inc de
+.loop4
+; Loading is done bit by bit
+	and a
+	jr z, .done
+	sla a
+	jr nc, .no_load
+	ld [hl], $fe
+.no_load
+	inc hl
+	jr .loop4
+
+.done
+	pop hl
+	push bc
+	ld bc, (SCREEN_WIDTH - 4) / 2
+	add hl, bc
+	pop bc
+	dec c
+	jr nz, .loop3
+
+	pop hl
+	push bc
+	ld bc, SCREEN_WIDTH
+	add hl, bc
+	pop bc
+	dec b
+	jr nz, .loop2
+
+	ld a, [hCGB]
+	and a
+	jr nz, .cgb
+	ld a, $1
+	ld [hBGMapMode], a
+	call DelayFrame
+	call DelayFrame
+	jr .nextscene
+
+.cgb
+	ld hl, .daypals
+	ld a, [TimeOfDayPal]
+	and (1 << 2) - 1
+	cp 3
+	jr nz, .daytime
+	ld hl, .nightpals
+.daytime
+	ld a, [rSVBK]
+	push af
+	ld a, $5 ; WRAM5 = palettes
+	ld [rSVBK], a
+	call .copypals
+	push hl
+	ld de, UnknBGPals palette PAL_BG_TEXT
+	ld bc, 1 palettes
+	call CopyBytes
+	pop hl
+	ld de, BGPals palette PAL_BG_TEXT
+	ld bc, 1 palettes
+	call CopyBytes
+	pop af
+	ld [rSVBK], a
+	ld a, $1
+	ld [hCGBPalUpdate], a
+	call DelayFrame
+	call BattleStart_CopyTilemapAtOnce
+
+.nextscene ; 8c673 (23:4673)
+	call StartTrainerBattle_NextScene
+	ret
+
+.copypals ; 8c677 (23:4677)
+	ld de, UnknBGPals palette PAL_BG_TEXT
+	call .copy
+	ld de, BGPals palette PAL_BG_TEXT
+	call .copy
+	ld de, UnknOBPals palette PAL_OW_TREE
+	call .copy
+	ld de, OBPals palette PAL_OW_TREE
+	call .copy
+	ld de, UnknOBPals palette PAL_OW_ROCK
+	call .copy
+	ld de, OBPals palette PAL_OW_ROCK
+
+.copy ; 8c698 (23:4698)
+	push hl
+	ld bc, 1 palettes
+	call CopyBytes
+	pop hl
+	ret
+; 8c6a1 (23:46a1)
+
+.daypals ; 8c6a1
+	RGB 31, 18, 29
+	RGB 31, 11, 15
+	RGB 31, 05, 05
+	RGB 07, 07, 07
+; 8c6a9
+
+.nightpals ; 8c6a9
+	RGB 31, 18, 29
+	RGB 31, 05, 05
+	RGB 31, 05, 05
+	RGB 31, 05, 05
+
+.loadpokeballgfx
+	ld a, [OtherTrainerClass]
+	ld de, PokeBallTransition
+	ret
+
+PokeBallTransition:
+	db %00000011, %11000000
+	db %00001111, %11110000
+	db %00111100, %00111100
+	db %00110000, %00001100
+	db %01100000, %00000110
+	db %01100011, %11000110
+	db %11000110, %01100011
+	db %11111100, %00111111
+	db %11111100, %00111111
+	db %11000110, %01100011
+	db %01100011, %11000110
+	db %01100000, %00000110
+	db %00110000, %00001100
+	db %00111100, %00111100
+	db %00001111, %11110000
+	db %00000011, %11000000
+
+WipeLYOverrides: ; 8c6d8
+	ld a, [rSVBK]
+	push af
+	ld a, $5
+	ld [rSVBK], a
+
+	ld hl, LYOverrides
+	call .wipe
+	ld hl, LYOverridesBackup
+	call .wipe
+
+	pop af
+	ld [rSVBK], a
+	ret
+; 8c6ef
+
+.wipe ; 8c6ef
+	xor a
+	ld c, SCREEN_HEIGHT_PX
+.loop
+	ld [hli], a
+	dec c
+	jr nz, .loop
+	ret
+; 8c6f7
+
+
+StartTrainerBattle_DrawSineWave: ; 8c6f7 (23:46f7)
+	and (1 << 6) - 1
+	cp 1 << 5
+	jr nc, .okay
+	call .DoSineWave
+	ld a, h
+	ret
+
+.okay
+	and (1 << 5) - 1
+	call .DoSineWave
+	ld a, h
+	xor -1 ; cpl
+	inc a
+	ret
+
+.DoSineWave: ; 8c70c (23:470c)
+	ld e, a
+	ld a, d
+	ld d, 0
+	ld hl, .sinewave
+	add hl, de
+	add hl, de
+	ld e, [hl]
+	inc hl
+	ld d, [hl]
+	ld hl, 0
+.loop
+	srl a
+	jr nc, .skip
+	add hl, de
+.skip
+	sla e
+	rl d
+	and a
+	jr nz, .loop
+	ret
+; 8c728 (23:4728)
+
+.sinewave ; 8c728
+	sine_wave $100
+; 8c768
+
+StartTrainerBattle_ZoomToBlack: ; 8c768 (23:4768)
+	farcall Function5602
+	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
+	ld [hBGMapMode], a
+	call .Copy
+	call WaitBGMap
+	jr .loop
+
+.done
+	ld a, $20
+	ld [wJumptableIndex], a
+	ret
+; 8c792 (23:4792)
+
+.boxes ; 8c792
+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
+; 8c7b7
+
+.Copy: ; 8c7b7 (23:47b7)
+	ld a, $ff
+.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
+; 8c7c9 (23:47c9)
+
+Function8c7c9:
+; XXX
+	ld a, $1
+	ld [hBGMapMode], a
+	call WaitBGMap
+	xor a
+	ld [hBGMapMode], a
+	ret
--- /dev/null
+++ b/engine/battle/core.asm
@@ -1,0 +1,9511 @@
+; Core components of the battle engine.
+BattleCore:
+DoBattle: ; 3c000
+	xor a
+	ld [wBattleParticipantsNotFainted], a
+	ld [wBattleParticipantsIncludingFainted], a
+	ld [wPlayerAction], a
+	ld [BattleEnded], a
+	inc a
+	ld [wBattleHasJustStarted], a
+	ld hl, OTPartyMon1HP
+	ld bc, PARTYMON_STRUCT_LENGTH - 1
+	ld d, BATTLEACTION_SWITCH1 - 1
+.loop
+	inc d
+	ld a, [hli]
+	or [hl]
+	jr nz, .alive
+	add hl, bc
+	jr .loop
+
+.alive
+	ld a, d
+	ld [wBattleAction], a
+	ld a, [wLinkMode]
+	and a
+	jr z, .not_linked
+
+	ld a, [hLinkPlayerNumber]
+	cp $2
+	jr z, .player_2
+
+.not_linked
+	ld a, [wBattleMode]
+	dec a
+	jr z, .wild
+	xor a
+	ld [wEnemySwitchMonIndex], a
+	call NewEnemyMonStatus
+	call ResetEnemyStatLevels
+	call BreakAttraction
+	call EnemySwitch
+
+.wild
+	ld c, 40
+	call DelayFrames
+
+.player_2
+	call LoadTileMapToTempTileMap
+	call CheckPlayerPartyForFitPkmn
+	ld a, d
+	and a
+	jp z, LostBattle
+	call Call_LoadTempTileMapToTileMap
+	ld a, [BattleType]
+	cp BATTLETYPE_DEBUG
+	jp z, .tutorial_debug
+	cp BATTLETYPE_TUTORIAL
+	jp z, .tutorial_debug
+	xor a
+	ld [CurPartyMon], a
+.loop2
+	call CheckIfCurPartyMonIsFitToFight
+	jr nz, .alive2
+	ld hl, CurPartyMon
+	inc [hl]
+	jr .loop2
+
+.alive2
+	ld a, [CurBattleMon]
+	ld [LastPlayerMon], a
+	ld a, [CurPartyMon]
+	ld [CurBattleMon], a
+	inc a
+	ld hl, PartySpecies - 1
+	ld c, a
+	ld b, 0
+	add hl, bc
+	ld a, [hl]
+	ld [CurPartySpecies], a
+	ld [TempBattleMonSpecies], a
+	hlcoord 1, 5
+	ld a, 9
+	call SlideBattlePicOut
+	call LoadTileMapToTempTileMap
+	call ResetBattleParticipants
+	call InitBattleMon
+	call ResetPlayerStatLevels
+	call SendOutPkmnText
+	call NewBattleMonStatus
+	call BreakAttraction
+	call SendOutPlayerMon
+	call EmptyBattleTextBox
+	call LoadTileMapToTempTileMap
+	call SetPlayerTurn
+	call SpikesDamage
+	ld a, [wLinkMode]
+	and a
+	jr z, .not_linked_2
+	ld a, [hLinkPlayerNumber]
+	cp $2
+	jr nz, .not_linked_2
+	xor a
+	ld [wEnemySwitchMonIndex], a
+	call NewEnemyMonStatus
+	call ResetEnemyStatLevels
+	call BreakAttraction
+	call EnemySwitch
+	call SetEnemyTurn
+	call SpikesDamage
+
+.not_linked_2
+	jp BattleTurn
+
+.tutorial_debug
+	jp BattleMenu
+; 3c0e5
+
+WildFled_EnemyFled_LinkBattleCanceled: ; 3c0e5
+	call Call_LoadTempTileMapToTileMap
+	ld a, [wBattleResult]
+	and $c0
+	add $2
+	ld [wBattleResult], a
+	ld a, [wLinkMode]
+	and a
+	ld hl, BattleText_WildFled
+	jr z, .print_text
+
+	ld a, [wBattleResult]
+	and $c0
+	ld [wBattleResult], a
+	ld hl, BattleText_EnemyFled
+	call CheckMobileBattleError
+	jr nc, .print_text
+
+	ld hl, wcd2a
+	bit 4, [hl]
+	jr nz, .skip_text
+
+	ld hl, BattleText_LinkErrorBattleCanceled
+
+.print_text
+	call StdBattleTextBox
+
+.skip_text
+	call StopDangerSound
+	call CheckMobileBattleError
+	jr c, .skip_sfx
+
+	ld de, SFX_RUN
+	call PlaySFX
+
+.skip_sfx
+	call SetPlayerTurn
+	ld a, 1
+	ld [BattleEnded], a
+	ret
+; 3c12f
+
+BattleTurn: ; 3c12f
+.loop
+	call MobileFn_3c1bf
+	call CheckContestBattleOver
+	jp c, .quit
+
+	xor a
+	ld [wPlayerIsSwitching], a
+	ld [wEnemyIsSwitching], a
+	ld [wBattleHasJustStarted], a
+	ld [wPlayerJustGotFrozen], a
+	ld [wEnemyJustGotFrozen], a
+	ld [CurDamage], a
+	ld [CurDamage + 1], a
+
+	call HandleBerserkGene
+	call UpdateBattleMonInParty
+	farcall AIChooseMove
+
+	call IsMobileBattle
+	jr nz, .not_disconnected
+	farcall Function100da5
+	farcall StartMobileInactivityTimer
+	farcall Function100dd8
+	jp c, .quit
+.not_disconnected
+
+	call CheckPlayerLockedIn
+	jr c, .skip_iteration
+.loop1
+	call BattleMenu
+	jr c, .quit
+	ld a, [BattleEnded]
+	and a
+	jr nz, .quit
+	ld a, [wForcedSwitch] ; roared/whirlwinded/teleported
+	and a
+	jr nz, .quit
+.skip_iteration
+	call ParsePlayerAction
+	jr nz, .loop1
+
+	call EnemyTriesToFlee
+	jr c, .quit
+
+	call DetermineMoveOrder
+	jr c, .false
+	call Battle_EnemyFirst
+	jr .proceed
+.false
+	call Battle_PlayerFirst
+.proceed
+	call CheckMobileBattleError
+	jr c, .quit
+
+	ld a, [wForcedSwitch]
+	and a
+	jr nz, .quit
+
+	ld a, [BattleEnded]
+	and a
+	jr nz, .quit
+
+	call HandleBetweenTurnEffects
+	ld a, [BattleEnded]
+	and a
+	jr nz, .quit
+	jp .loop
+
+.quit
+	ret
+; 3c1bf
+
+MobileFn_3c1bf: mobile
+	ld a, $5
+	call GetSRAMBank
+	ld hl, $a89b ; s5_a89b
+	inc [hl]
+	jr nz, .finish
+	dec hl
+	inc [hl]
+	jr nz, .finish
+	dec [hl]
+	inc hl
+	dec [hl]
+
+.finish
+	call CloseSRAM
+	ret
+; 3c1d6
+
+HandleBetweenTurnEffects: ; 3c1d6
+	ld a, [hLinkPlayerNumber]
+	cp $1
+	jr z, .CheckEnemyFirst
+	call CheckFaint_PlayerThenEnemy
+	ret c
+	call HandleFutureSight
+	call CheckFaint_PlayerThenEnemy
+	ret c
+	call HandleWeather
+	call CheckFaint_PlayerThenEnemy
+	ret c
+	call HandleWrap
+	call CheckFaint_PlayerThenEnemy
+	ret c
+	call HandlePerishSong
+	call CheckFaint_PlayerThenEnemy
+	ret c
+	jr .NoMoreFaintingConditions
+
+.CheckEnemyFirst:
+	call CheckFaint_EnemyThenPlayer
+	ret c
+	call HandleFutureSight
+	call CheckFaint_EnemyThenPlayer
+	ret c
+	call HandleWeather
+	call CheckFaint_EnemyThenPlayer
+	ret c
+	call HandleWrap
+	call CheckFaint_EnemyThenPlayer
+	ret c
+	call HandlePerishSong
+	call CheckFaint_EnemyThenPlayer
+	ret c
+
+.NoMoreFaintingConditions:
+	call HandleLeftovers
+	call HandleMysteryberry
+	call HanleDefrost
+	call HandleSafeguard
+	call HandleScreens
+	call HandleStatBoostingHeldItems
+	call HandleHealingItems
+	call UpdateBattleMonInParty
+	call LoadTileMapToTempTileMap
+	jp HandleEncore
+; 3c23c
+
+CheckFaint_PlayerThenEnemy: ; 3c23c
+	call HasPlayerFainted
+	jr nz, .PlayerNotFainted
+	call HandlePlayerMonFaint
+	ld a, [BattleEnded]
+	and a
+	jr nz, .BattleIsOver
+
+.PlayerNotFainted:
+	call HasEnemyFainted
+	jr nz, .BattleContinues
+	call HandleEnemyMonFaint
+	ld a, [BattleEnded]
+	and a
+	jr nz, .BattleIsOver
+
+.BattleContinues:
+	and a
+	ret
+
+.BattleIsOver:
+	scf
+	ret
+; 3c25c
+
+CheckFaint_EnemyThenPlayer: ; 3c25c
+	call HasEnemyFainted
+	jr nz, .EnemyNotFainted
+	call HandleEnemyMonFaint
+	ld a, [BattleEnded]
+	and a
+	jr nz, .BattleIsOver
+
+.EnemyNotFainted:
+	call HasPlayerFainted
+	jr nz, .BattleContinues
+	call HandlePlayerMonFaint
+	ld a, [BattleEnded]
+	and a
+	jr nz, .BattleIsOver
+
+.BattleContinues:
+	and a
+	ret
+
+.BattleIsOver:
+	scf
+	ret
+; 3c27c
+
+HandleBerserkGene: ; 3c27c
+	ld a, [hLinkPlayerNumber]
+	cp $1
+	jr z, .reverse
+
+	call .player
+	jr .enemy
+
+.reverse
+	call .enemy
+;	jr .player
+
+.player
+	call SetPlayerTurn
+	ld de, PartyMon1Item
+	ld a, [CurBattleMon]
+	ld b, a
+	jr .go
+
+.enemy
+	call SetEnemyTurn
+	ld de, OTPartyMon1Item
+	ld a, [CurOTMon]
+	ld b, a
+;	jr .go
+
+.go
+	push de
+	push bc
+	callfar GetUserItem
+	ld a, [hl]
+	ld [wd265], a
+	sub BERSERK_GENE
+	pop bc
+	pop de
+	ret nz
+
+	ld [hl], a
+
+	ld h, d
+	ld l, e
+	ld a, b
+	call GetPartyLocation
+	xor a
+	ld [hl], a
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVarAddr
+	push af
+	set SUBSTATUS_CONFUSED, [hl]
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call GetBattleVarAddr
+	push hl
+	push af
+	xor a
+	ld [hl], a
+	ld [AttackMissed], a
+	ld [EffectFailed], a
+	farcall BattleCommand_AttackUp2
+	pop af
+	pop hl
+	ld [hl], a
+	call GetItemName
+	ld hl, BattleText_UsersStringBuffer1Activated
+	call StdBattleTextBox
+	callfar BattleCommand_StatUpMessage
+	pop af
+	bit SUBSTATUS_CONFUSED, a
+	ret nz
+	xor a
+	ld [wNumHits], a
+	ld de, ANIM_CONFUSED
+	call Call_PlayBattleAnim_OnlyIfVisible
+	call SwitchTurnCore
+	ld hl, BecameConfusedText
+	jp StdBattleTextBox
+; 3c300
+
+EnemyTriesToFlee: ; 3c300
+	ld a, [wLinkMode]
+	and a
+	jr z, .not_linked
+	ld a, [wBattleAction]
+	cp BATTLEACTION_FORFEIT
+	jr z, .forfeit
+
+.not_linked
+	and a
+	ret
+
+.forfeit
+	call WildFled_EnemyFled_LinkBattleCanceled
+	scf
+	ret
+; 3c314
+
+DetermineMoveOrder: ; 3c314
+	ld a, [wLinkMode]
+	and a
+	jr z, .use_move
+	ld a, [wBattleAction]
+	cp BATTLEACTION_E
+	jr z, .use_move
+	cp BATTLEACTION_D
+	jr z, .use_move
+	sub BATTLEACTION_SWITCH1
+	jr c, .use_move
+	ld a, [wPlayerAction]
+	cp $2
+	jr nz, .switch
+	ld a, [hLinkPlayerNumber]
+	cp $2
+	jr z, .player_2
+
+	call BattleRandom
+	cp 1 + (50 percent)
+	jp c, .player_first
+	jp .enemy_first
+
+.player_2
+	call BattleRandom
+	cp 1 + (50 percent)
+	jp c, .enemy_first
+	jp .player_first
+
+.switch
+	callfar AI_Switch
+	call SetEnemyTurn
+	call SpikesDamage
+	jp .enemy_first
+
+.use_move
+	ld a, [wPlayerAction]
+	and a
+	jp nz, .player_first
+	call CompareMovePriority
+	jr z, .equal_priority
+	jp c, .player_first ; player goes first
+	jp .enemy_first
+
+.equal_priority
+	call SetPlayerTurn
+	callfar GetUserItem
+	push bc
+	callfar GetOpponentItem
+	pop de
+	ld a, d
+	cp HELD_QUICK_CLAW
+	jr nz, .player_no_quick_claw
+	ld a, b
+	cp HELD_QUICK_CLAW
+	jr z, .both_have_quick_claw
+	call BattleRandom
+	cp e
+	jr nc, .speed_check
+	jp .player_first
+
+.player_no_quick_claw
+	ld a, b
+	cp HELD_QUICK_CLAW
+	jr nz, .speed_check
+	call BattleRandom
+	cp c
+	jr nc, .speed_check
+	jp .enemy_first
+
+.both_have_quick_claw
+	ld a, [hLinkPlayerNumber]
+	cp $2
+	jr z, .player_2b
+	call BattleRandom
+	cp c
+	jp c, .enemy_first
+	call BattleRandom
+	cp e
+	jp c, .player_first
+	jr .speed_check
+
+.player_2b
+	call BattleRandom
+	cp e
+	jp c, .player_first
+	call BattleRandom
+	cp c
+	jp c, .enemy_first
+	jr .speed_check
+
+.speed_check
+	ld de, BattleMonSpeed
+	ld hl, EnemyMonSpeed
+	ld c, 2
+	call StringCmp
+	jr z, .speed_tie
+	jp nc, .player_first
+	jp .enemy_first
+
+.speed_tie
+	ld a, [hLinkPlayerNumber]
+	cp $2
+	jr z, .player_2c
+	call BattleRandom
+	cp 1 + (50 percent)
+	jp c, .player_first
+	jp .enemy_first
+
+.player_2c
+	call BattleRandom
+	cp 1 + (50 percent)
+	jp c, .enemy_first
+.player_first
+	scf
+	ret
+; 3c3f3
+
+.enemy_first ; 3c3f3
+	and a
+	ret
+; 3c3f5
+
+CheckContestBattleOver: ; 3c3f5
+	ld a, [BattleType]
+	cp BATTLETYPE_CONTEST
+	jr nz, .contest_not_over
+	ld a, [wParkBallsRemaining]
+	and a
+	jr nz, .contest_not_over
+	ld a, [wBattleResult]
+	and $c0
+	add $2
+	ld [wBattleResult], a
+	scf
+	ret
+
+.contest_not_over
+	and a
+	ret
+; 3c410
+
+CheckPlayerLockedIn: ; 3c410
+	ld a, [PlayerSubStatus4]
+	and 1 << SUBSTATUS_RECHARGE
+	jp nz, .quit
+
+	ld hl, EnemySubStatus3
+	res SUBSTATUS_FLINCHED, [hl]
+	ld hl, PlayerSubStatus3
+	res SUBSTATUS_FLINCHED, [hl]
+
+	ld a, [hl]
+	and 1 << SUBSTATUS_CHARGED | 1 << SUBSTATUS_RAMPAGE
+	jp nz, .quit
+
+	ld hl, PlayerSubStatus1
+	bit SUBSTATUS_ROLLOUT, [hl]
+	jp nz, .quit
+
+	and a
+	ret
+
+.quit
+	scf
+	ret
+; 3c434
+
+ParsePlayerAction: ; 3c434
+	call CheckPlayerLockedIn
+	jp c, .locked_in
+	ld hl, PlayerSubStatus5
+	bit SUBSTATUS_ENCORED, [hl]
+	jr z, .not_encored
+	ld a, [LastPlayerMove]
+	ld [CurPlayerMove], a
+	jr .encored
+
+.not_encored
+	ld a, [wPlayerAction]
+	cp $2
+	jr z, .reset_rage
+	and a
+	jr nz, .reset_bide
+	ld a, [PlayerSubStatus3]
+	and 1 << SUBSTATUS_BIDE
+	jr nz, .locked_in
+	xor a
+	ld [wMoveSelectionMenuType], a
+	inc a ; POUND
+	ld [FXAnimID], a
+	call MoveSelectionScreen
+	push af
+	call Call_LoadTempTileMapToTileMap
+	call UpdateBattleHuds
+	ld a, [CurPlayerMove]
+	cp STRUGGLE
+	jr z, .struggle
+	call PlayClickSFX
+
+.struggle
+	ld a, $1
+	ld [hBGMapMode], a
+	pop af
+	ret nz
+
+.encored
+	call SetPlayerTurn
+	callfar UpdateMoveData
+	xor a
+	ld [wPlayerCharging], a
+	ld a, [wPlayerMoveStruct + MOVE_EFFECT]
+	cp EFFECT_FURY_CUTTER
+	jr z, .continue_fury_cutter
+	xor a
+	ld [PlayerFuryCutterCount], a
+
+.continue_fury_cutter
+	ld a, [wPlayerMoveStruct + MOVE_EFFECT]
+	cp EFFECT_RAGE
+	jr z, .continue_rage
+	ld hl, PlayerSubStatus4
+	res SUBSTATUS_RAGE, [hl]
+	xor a
+	ld [wPlayerRageCounter], a
+
+.continue_rage
+	ld a, [wPlayerMoveStruct + MOVE_EFFECT]
+	cp EFFECT_PROTECT
+	jr z, .continue_protect
+	cp EFFECT_ENDURE
+	jr z, .continue_protect
+	xor a
+	ld [PlayerProtectCount], a
+	jr .continue_protect
+
+.reset_bide
+	ld hl, PlayerSubStatus3
+	res SUBSTATUS_BIDE, [hl]
+
+.locked_in
+	xor a
+	ld [PlayerFuryCutterCount], a
+	ld [PlayerProtectCount], a
+	ld [wPlayerRageCounter], a
+	ld hl, PlayerSubStatus4
+	res SUBSTATUS_RAGE, [hl]
+
+.continue_protect
+	call ParseEnemyAction
+	xor a
+	ret
+
+.reset_rage
+	xor a
+	ld [PlayerFuryCutterCount], a
+	ld [PlayerProtectCount], a
+	ld [wPlayerRageCounter], a
+	ld hl, PlayerSubStatus4
+	res SUBSTATUS_RAGE, [hl]
+	xor a
+	ret
+; 3c4df
+
+HandleEncore: ; 3c4df
+	ld a, [hLinkPlayerNumber]
+	cp $1
+	jr z, .player_1
+	call .do_player
+	jr .do_enemy
+
+.player_1
+	call .do_enemy
+.do_player
+	ld hl, PlayerSubStatus5
+	bit SUBSTATUS_ENCORED, [hl]
+	ret z
+	ld a, [PlayerEncoreCount]
+	dec a
+	ld [PlayerEncoreCount], a
+	jr z, .end_player_encore
+	ld hl, BattleMonPP
+	ld a, [CurMoveNum]
+	ld c, a
+	ld b, 0
+	add hl, bc
+	ld a, [hl]
+	and $3f
+	ret nz
+
+.end_player_encore
+	ld hl, PlayerSubStatus5
+	res SUBSTATUS_ENCORED, [hl]
+	call SetEnemyTurn
+	ld hl, BattleText_TargetsEncoreEnded
+	jp StdBattleTextBox
+
+.do_enemy
+	ld hl, EnemySubStatus5
+	bit SUBSTATUS_ENCORED, [hl]
+	ret z
+	ld a, [EnemyEncoreCount]
+	dec a
+	ld [EnemyEncoreCount], a
+	jr z, .end_enemy_encore
+	ld hl, EnemyMonPP
+	ld a, [CurEnemyMoveNum]
+	ld c, a
+	ld b, 0
+	add hl, bc
+	ld a, [hl]
+	and $3f
+	ret nz
+
+.end_enemy_encore
+	ld hl, EnemySubStatus5
+	res SUBSTATUS_ENCORED, [hl]
+	call SetPlayerTurn
+	ld hl, BattleText_TargetsEncoreEnded
+	jp StdBattleTextBox
+; 3c543
+
+TryEnemyFlee: ; 3c543
+	ld a, [wBattleMode]
+	dec a
+	jr nz, .Stay
+
+	ld a, [PlayerSubStatus5]
+	bit SUBSTATUS_CANT_RUN, a
+	jr nz, .Stay
+
+	ld a, [wEnemyWrapCount]
+	and a
+	jr nz, .Stay
+
+	ld a, [EnemyMonStatus]
+	and 1 << FRZ | SLP
+	jr nz, .Stay
+
+	ld a, [TempEnemyMonSpecies]
+	ld de, 1
+	ld hl, AlwaysFleeMons
+	call IsInArray
+	jr c, .Flee
+
+	call BattleRandom
+	ld b, a
+	cp 1 + (50 percent)
+	jr nc, .Stay
+
+	push bc
+	ld a, [TempEnemyMonSpecies]
+	ld de, 1
+	ld hl, OftenFleeMons
+	call IsInArray
+	pop bc
+	jr c, .Flee
+
+	ld a, b
+	cp 1 + (10 percent)
+	jr nc, .Stay
+
+	ld a, [TempEnemyMonSpecies]
+	ld de, 1
+	ld hl, SometimesFleeMons
+	call IsInArray
+	jr c, .Flee
+
+.Stay:
+	and a
+	ret
+
+.Flee:
+	scf
+	ret
+; 3c59a
+
+INCLUDE "data/wild/flee_mons.asm"
+
+CompareMovePriority: ; 3c5b4
+; Compare the priority of the player and enemy's moves.
+; Return carry if the player goes first, or z if they match.
+
+	ld a, [CurPlayerMove]
+	call GetMovePriority
+	ld b, a
+	push bc
+	ld a, [CurEnemyMove]
+	call GetMovePriority
+	pop bc
+	cp b
+	ret
+; 3c5c5
+
+GetMovePriority: ; 3c5c5
+; Return the priority (0-3) of move a.
+
+	ld b, a
+
+	; Vital Throw goes last.
+	cp VITAL_THROW
+	ld a, 0
+	ret z
+
+	call GetMoveEffect
+	ld hl, MoveEffectPriorities
+.loop
+	ld a, [hli]
+	cp b
+	jr z, .done
+	inc hl
+	cp -1
+	jr nz, .loop
+
+	ld a, 1
+	ret
+
+.done
+	ld a, [hl]
+	ret
+; 3c5df
+
+MoveEffectPriorities: ; 3c5df
+	db EFFECT_PROTECT,      3
+	db EFFECT_ENDURE,       3
+	db EFFECT_PRIORITY_HIT, 2
+	db EFFECT_FORCE_SWITCH, 0
+	db EFFECT_COUNTER,      0
+	db EFFECT_MIRROR_COAT,  0
+	db -1
+; 3c5ec
+
+GetMoveEffect: ; 3c5ec
+	ld a, b
+	dec a
+	ld hl, Moves + MOVE_EFFECT
+	ld bc, MOVE_LENGTH
+	call AddNTimes
+	ld a, BANK(Moves)
+	call GetFarByte
+	ld b, a
+	ret
+; 3c5fe
+
+Battle_EnemyFirst: ; 3c5fe
+	call LoadTileMapToTempTileMap
+	call TryEnemyFlee
+	jp c, WildFled_EnemyFled_LinkBattleCanceled
+	call SetEnemyTurn
+	ld a, $1
+	ld [wEnemyGoesFirst], a
+	callfar AI_SwitchOrTryItem
+	jr c, .switch_item
+	call EnemyTurn_EndOpponentProtectEndureDestinyBond
+	call CheckMobileBattleError
+	ret c
+	ld a, [wForcedSwitch]
+	and a
+	ret nz
+	call HasPlayerFainted
+	jp z, HandlePlayerMonFaint
+	call HasEnemyFainted
+	jp z, HandleEnemyMonFaint
+
+.switch_item
+	call SetEnemyTurn
+	call ResidualDamage
+	jp z, HandleEnemyMonFaint
+	call RefreshBattleHuds
+	call PlayerTurn_EndOpponentProtectEndureDestinyBond
+	call CheckMobileBattleError
+	ret c
+	ld a, [wForcedSwitch]
+	and a
+	ret nz
+	call HasEnemyFainted
+	jp z, HandleEnemyMonFaint
+	call HasPlayerFainted
+	jp z, HandlePlayerMonFaint
+	call SetPlayerTurn
+	call ResidualDamage
+	jp z, HandlePlayerMonFaint
+	call RefreshBattleHuds
+	xor a
+	ld [wPlayerAction], a
+	ret
+; 3c664
+
+Battle_PlayerFirst: ; 3c664
+	xor a
+	ld [wEnemyGoesFirst], a
+	call SetEnemyTurn
+	callfar AI_SwitchOrTryItem
+	push af
+	call PlayerTurn_EndOpponentProtectEndureDestinyBond
+	pop bc
+	ld a, [wForcedSwitch]
+	and a
+	ret nz
+	call CheckMobileBattleError
+	ret c
+	call HasEnemyFainted
+	jp z, HandleEnemyMonFaint
+	call HasPlayerFainted
+	jp z, HandlePlayerMonFaint
+	push bc
+	call SetPlayerTurn
+	call ResidualDamage
+	pop bc
+	jp z, HandlePlayerMonFaint
+	push bc
+	call RefreshBattleHuds
+	pop af
+	jr c, .switched_or_used_item
+	call LoadTileMapToTempTileMap
+	call TryEnemyFlee
+	jp c, WildFled_EnemyFled_LinkBattleCanceled
+	call EnemyTurn_EndOpponentProtectEndureDestinyBond
+	call CheckMobileBattleError
+	ret c
+	ld a, [wForcedSwitch]
+	and a
+	ret nz
+	call HasPlayerFainted
+	jp z, HandlePlayerMonFaint
+	call HasEnemyFainted
+	jp z, HandleEnemyMonFaint
+
+.switched_or_used_item
+	call SetEnemyTurn
+	call ResidualDamage
+	jp z, HandleEnemyMonFaint
+	call RefreshBattleHuds
+	xor a
+	ld [wPlayerAction], a
+	ret
+; 3c6cf
+
+PlayerTurn_EndOpponentProtectEndureDestinyBond: ; 3c6cf
+	call SetPlayerTurn
+	call EndUserDestinyBond
+	callfar DoPlayerTurn
+	jp EndOpponentProtectEndureDestinyBond
+; 3c6de
+
+EnemyTurn_EndOpponentProtectEndureDestinyBond: ; 3c6de
+	call SetEnemyTurn
+	call EndUserDestinyBond
+	callfar DoEnemyTurn
+	jp EndOpponentProtectEndureDestinyBond
+; 3c6ed
+
+EndOpponentProtectEndureDestinyBond: ; 3c6ed
+	ld a, BATTLE_VARS_SUBSTATUS1_OPP
+	call GetBattleVarAddr
+	res SUBSTATUS_PROTECT, [hl]
+	res SUBSTATUS_ENDURE, [hl]
+	ld a, BATTLE_VARS_SUBSTATUS5_OPP
+	call GetBattleVarAddr
+	res SUBSTATUS_DESTINY_BOND, [hl]
+	ret
+; 3c6fe
+
+EndUserDestinyBond: ; 3c6fe
+	ld a, BATTLE_VARS_SUBSTATUS5
+	call GetBattleVarAddr
+	res SUBSTATUS_DESTINY_BOND, [hl]
+	ret
+; 3c706
+
+HasUserFainted: ; 3c706
+	ld a, [hBattleTurn]
+	and a
+	jr z, HasPlayerFainted
+HasEnemyFainted: ; 3c70b
+	ld hl, EnemyMonHP
+	jr CheckIfHPIsZero
+
+HasPlayerFainted: ; 3c710
+	ld hl, BattleMonHP
+
+CheckIfHPIsZero: ; 3c713
+	ld a, [hli]
+	or [hl]
+	ret
+; 3c716
+
+ResidualDamage: ; 3c716
+; Return z if the user fainted before
+; or as a result of residual damage.
+; For Sandstorm damage, see HandleWeather.
+
+	call HasUserFainted
+	ret z
+
+	ld a, BATTLE_VARS_STATUS
+	call GetBattleVar
+	and 1 << PSN | 1 << BRN
+	jr z, .did_psn_brn
+
+	ld hl, HurtByPoisonText
+	ld de, ANIM_PSN
+	and 1 << BRN
+	jr z, .got_anim
+	ld hl, HurtByBurnText
+	ld de, ANIM_BRN
+.got_anim
+
+	push de
+	call StdBattleTextBox
+	pop de
+
+	xor a
+	ld [wNumHits], a
+	call Call_PlayBattleAnim_OnlyIfVisible
+	call GetEighthMaxHP
+	ld de, PlayerToxicCount
+	ld a, [hBattleTurn]
+	and a
+	jr z, .check_toxic
+	ld de, EnemyToxicCount
+.check_toxic
+
+	ld a, BATTLE_VARS_SUBSTATUS5
+	call GetBattleVar
+	bit SUBSTATUS_TOXIC, a
+	jr z, .did_toxic
+	call GetSixteenthMaxHP
+	ld a, [de]
+	inc a
+	ld [de], a
+	ld hl, 0
+.add
+	add hl, bc
+	dec a
+	jr nz, .add
+	ld b, h
+	ld c, l
+.did_toxic
+
+	call SubtractHPFromUser
+.did_psn_brn
+
+	call HasUserFainted
+	jp z, .fainted
+
+	ld a, BATTLE_VARS_SUBSTATUS4
+	call GetBattleVarAddr
+	bit SUBSTATUS_LEECH_SEED, [hl]
+	jr z, .not_seeded
+
+	call SwitchTurnCore
+	xor a
+	ld [wNumHits], a
+	ld de, ANIM_SAP
+	ld a, BATTLE_VARS_SUBSTATUS3_OPP
+	call GetBattleVar
+	and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
+	call z, Call_PlayBattleAnim_OnlyIfVisible
+	call SwitchTurnCore
+
+	call GetEighthMaxHP
+	call SubtractHPFromUser
+	ld a, $1
+	ld [hBGMapMode], a
+	call RestoreHP
+	ld hl, LeechSeedSapsText
+	call StdBattleTextBox
+.not_seeded
+
+	call HasUserFainted
+	jr z, .fainted
+
+	ld a, BATTLE_VARS_SUBSTATUS1
+	call GetBattleVarAddr
+	bit SUBSTATUS_NIGHTMARE, [hl]
+	jr z, .not_nightmare
+	xor a
+	ld [wNumHits], a
+	ld de, ANIM_IN_NIGHTMARE
+	call Call_PlayBattleAnim_OnlyIfVisible
+	call GetQuarterMaxHP
+	call SubtractHPFromUser
+	ld hl, HasANightmareText
+	call StdBattleTextBox
+.not_nightmare
+
+	call HasUserFainted
+	jr z, .fainted
+
+	ld a, BATTLE_VARS_SUBSTATUS1
+	call GetBattleVarAddr
+	bit SUBSTATUS_CURSE, [hl]
+	jr z, .not_cursed
+
+	xor a
+	ld [wNumHits], a
+	ld de, ANIM_IN_NIGHTMARE
+	call Call_PlayBattleAnim_OnlyIfVisible
+	call GetQuarterMaxHP
+	call SubtractHPFromUser
+	ld hl, HurtByCurseText
+	call StdBattleTextBox
+
+.not_cursed
+	ld hl, BattleMonHP
+	ld a, [hBattleTurn]
+	and a
+	jr z, .check_fainted
+	ld hl, EnemyMonHP
+
+.check_fainted
+	ld a, [hli]
+	or [hl]
+	ret nz
+
+.fainted
+	call RefreshBattleHuds
+	ld c, 20
+	call DelayFrames
+	xor a
+	ret
+; 3c801
+
+HandlePerishSong: ; 3c801
+	ld a, [hLinkPlayerNumber]
+	cp $1
+	jr z, .EnemyFirst
+	call SetPlayerTurn
+	call .do_it
+	call SetEnemyTurn
+	jp .do_it
+
+.EnemyFirst:
+	call SetEnemyTurn
+	call .do_it
+	call SetPlayerTurn
+
+.do_it
+	ld hl, PlayerPerishCount
+	ld a, [hBattleTurn]
+	and a
+	jr z, .got_count
+	ld hl, EnemyPerishCount
+
+.got_count
+	ld a, BATTLE_VARS_SUBSTATUS1
+	call GetBattleVar
+	bit SUBSTATUS_PERISH, a
+	ret z
+	dec [hl]
+	ld a, [hl]
+	ld [wd265], a
+	push af
+	ld hl, PerishCountText
+	call StdBattleTextBox
+	pop af
+	ret nz
+	ld a, BATTLE_VARS_SUBSTATUS1
+	call GetBattleVarAddr
+	res SUBSTATUS_PERISH, [hl]
+	ld a, [hBattleTurn]
+	and a
+	jr nz, .kill_enemy
+	ld hl, BattleMonHP
+	xor a
+	ld [hli], a
+	ld [hl], a
+	ld hl, PartyMon1HP
+	ld a, [CurBattleMon]
+	call GetPartyLocation
+	xor a
+	ld [hli], a
+	ld [hl], a
+	ret
+
+.kill_enemy
+	ld hl, EnemyMonHP
+	xor a
+	ld [hli], a
+	ld [hl], a
+	ld a, [wBattleMode]
+	dec a
+	ret z
+	ld hl, OTPartyMon1HP
+	ld a, [CurOTMon]
+	call GetPartyLocation
+	xor a
+	ld [hli], a
+	ld [hl], a
+	ret
+; 3c874
+
+HandleWrap: ; 3c874
+	ld a, [hLinkPlayerNumber]
+	cp $1
+	jr z, .EnemyFirst
+	call SetPlayerTurn
+	call .do_it
+	call SetEnemyTurn
+	jp .do_it
+
+.EnemyFirst:
+	call SetEnemyTurn
+	call .do_it
+	call SetPlayerTurn
+
+.do_it
+	ld hl, wPlayerWrapCount
+	ld de, wPlayerTrappingMove
+	ld a, [hBattleTurn]
+	and a
+	jr z, .got_addrs
+	ld hl, wEnemyWrapCount
+	ld de, wEnemyTrappingMove
+
+.got_addrs
+	ld a, [hl]
+	and a
+	ret z
+
+	ld a, BATTLE_VARS_SUBSTATUS4
+	call GetBattleVar
+	bit SUBSTATUS_SUBSTITUTE, a
+	ret nz
+
+	ld a, [de]
+	ld [wd265], a
+	ld [FXAnimID], a
+	call GetMoveName
+	dec [hl]
+	jr z, .release_from_bounds
+
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVar
+	and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
+	jr nz, .skip_anim
+
+	call SwitchTurnCore
+	xor a
+	ld [wNumHits], a
+	ld [FXAnimID + 1], a
+	predef PlayBattleAnim
+	call SwitchTurnCore
+
+.skip_anim
+	call GetSixteenthMaxHP
+	call SubtractHPFromUser
+	ld hl, BattleText_UsersHurtByStringBuffer1
+	jr .print_text
+
+.release_from_bounds
+	ld hl, BattleText_UserWasReleasedFromStringBuffer1
+
+.print_text
+	jp StdBattleTextBox
+; 3c8e4
+
+SwitchTurnCore: ; 3c8e4
+	ld a, [hBattleTurn]
+	xor 1
+	ld [hBattleTurn], a
+	ret
+; 3c8eb
+
+HandleLeftovers: ; 3c8eb
+	ld a, [hLinkPlayerNumber]
+	cp $1
+	jr z, .DoEnemyFirst
+	call SetPlayerTurn
+	call .do_it
+	call SetEnemyTurn
+	jp .do_it
+
+.DoEnemyFirst:
+	call SetEnemyTurn
+	call .do_it
+	call SetPlayerTurn
+.do_it
+
+	callfar GetUserItem
+	ld a, [hl]
+	ld [wd265], a
+	call GetItemName
+	ld a, b
+	cp HELD_LEFTOVERS
+	ret nz
+
+	ld hl, BattleMonHP
+	ld a, [hBattleTurn]
+	and a
+	jr z, .got_hp
+	ld hl, EnemyMonHP
+
+.got_hp
+; Don't restore if we're already at max HP
+	ld a, [hli]
+	ld b, a
+	ld a, [hli]
+	ld c, a
+	ld a, [hli]
+	cp b
+	jr nz, .restore
+	ld a, [hl]
+	cp c
+	ret z
+
+.restore
+	call GetSixteenthMaxHP
+	call SwitchTurnCore
+	call RestoreHP
+	ld hl, BattleText_TargetRecoveredWithItem
+	jp StdBattleTextBox
+; 3c93c
+
+HandleMysteryberry: ; 3c93c
+	ld a, [hLinkPlayerNumber]
+	cp $1
+	jr z, .DoEnemyFirst
+	call SetPlayerTurn
+	call .do_it
+	call SetEnemyTurn
+	jp .do_it
+
+.DoEnemyFirst:
+	call SetEnemyTurn
+	call .do_it
+	call SetPlayerTurn
+
+.do_it
+	callfar GetUserItem
+	ld a, b
+	cp HELD_RESTORE_PP
+	jr nz, .quit
+	ld hl, PartyMon1PP
+	ld a, [CurBattleMon]
+	call GetPartyLocation
+	ld d, h
+	ld e, l
+	ld hl, PartyMon1Moves
+	ld a, [CurBattleMon]
+	call GetPartyLocation
+	ld a, [hBattleTurn]
+	and a
+	jr z, .wild
+	ld de, wWildMonPP
+	ld hl, wWildMonMoves
+	ld a, [wBattleMode]
+	dec a
+	jr z, .wild
+	ld hl, OTPartyMon1PP
+	ld a, [CurOTMon]
+	call GetPartyLocation
+	ld d, h
+	ld e, l
+	ld hl, OTPartyMon1Moves
+	ld a, [CurOTMon]
+	call GetPartyLocation
+
+.wild
+	ld c, $0
+.loop
+	ld a, [hl]
+	and a
+	jr z, .quit
+	ld a, [de]
+	and $3f
+	jr z, .restore
+	inc hl
+	inc de
+	inc c
+	ld a, c
+	cp NUM_MOVES
+	jr nz, .loop
+
+.quit
+	ret
+
+.restore
+	; lousy hack
+	ld a, [hl]
+	cp SKETCH
+	ld b, 1
+	jr z, .sketch
+	ld b, 5
+.sketch
+	ld a, [de]
+	add b
+	ld [de], a
+	push bc
+	push bc
+	ld a, [hl]
+	ld [wd265], a
+	ld de, BattleMonMoves - 1
+	ld hl, BattleMonPP
+	ld a, [hBattleTurn]
+	and a
+	jr z, .player_pp
+	ld de, EnemyMonMoves - 1
+	ld hl, EnemyMonPP
+.player_pp
+	inc de
+	pop bc
+	ld b, 0
+	add hl, bc
+	push hl
+	ld h, d
+	ld l, e
+	add hl, bc
+	pop de
+	pop bc
+
+	ld a, [wd265]
+	cp [hl]
+	jr nz, .skip_checks
+	ld a, [hBattleTurn]
+	and a
+	ld a, [PlayerSubStatus5]
+	jr z, .check_transform
+	ld a, [EnemySubStatus5]
+.check_transform
+	bit SUBSTATUS_TRANSFORMED, a
+	jr nz, .skip_checks
+	ld a, [de]
+	add b
+	ld [de], a
+.skip_checks
+	callfar GetUserItem
+	ld a, [hl]
+	ld [wd265], a
+	xor a
+	ld [hl], a
+	call GetPartymonItem
+	ld a, [hBattleTurn]
+	and a
+	jr z, .consume_item
+	ld a, [wBattleMode]
+	dec a
+	jr z, .skip_consumption
+	call GetOTPartymonItem
+
+.consume_item
+	xor a
+	ld [hl], a
+
+.skip_consumption
+	call GetItemName
+	call SwitchTurnCore
+	call ItemRecoveryAnim
+	call SwitchTurnCore
+	ld hl, BattleText_UserRecoveredPPUsing
+	jp StdBattleTextBox
+; 3ca26
+
+HandleFutureSight: ; 3ca26
+	ld a, [hLinkPlayerNumber]
+	cp $1
+	jr z, .enemy_first
+	call SetPlayerTurn
+	call .do_it
+	call SetEnemyTurn
+	jp .do_it
+
+.enemy_first
+	call SetEnemyTurn
+	call .do_it
+	call SetPlayerTurn
+
+.do_it
+	ld hl, wPlayerFutureSightCount
+	ld a, [hBattleTurn]
+	and a
+	jr z, .okay
+	ld hl, wEnemyFutureSightCount
+
+.okay
+	ld a, [hl]
+	and a
+	ret z
+	dec a
+	ld [hl], a
+	cp $1
+	ret nz
+
+	ld hl, BattleText_TargetWasHitByFutureSight
+	call StdBattleTextBox
+
+	ld a, BATTLE_VARS_MOVE
+	call GetBattleVarAddr
+	push af
+	ld a, FUTURE_SIGHT
+	ld [hl], a
+
+	callfar UpdateMoveData
+	xor a
+	ld [AttackMissed], a
+	ld [AlreadyDisobeyed], a
+	ld a, 10
+	ld [TypeModifier], a
+	callfar DoMove
+	xor a
+	ld [CurDamage], a
+	ld [CurDamage + 1], a
+
+	ld a, BATTLE_VARS_MOVE
+	call GetBattleVarAddr
+	pop af
+	ld [hl], a
+
+	call UpdateBattleMonInParty
+	jp UpdateEnemyMonInParty
+; 3ca8f
+
+HanleDefrost: ; 3ca8f
+	ld a, [hLinkPlayerNumber]
+	cp $1
+	jr z, .enemy_first
+	call .do_player_turn
+	jr .do_enemy_turn
+
+.enemy_first
+	call .do_enemy_turn
+.do_player_turn
+	ld a, [BattleMonStatus]
+	bit FRZ, a
+	ret z
+
+	ld a, [wPlayerJustGotFrozen]
+	and a
+	ret nz
+
+	call BattleRandom
+	cp 10 percent
+	ret nc
+	xor a
+	ld [BattleMonStatus], a
+	ld a, [CurBattleMon]
+	ld hl, PartyMon1Status
+	call GetPartyLocation
+	ld [hl], 0
+	call UpdateBattleHuds
+	call SetEnemyTurn
+	ld hl, DefrostedOpponentText
+	jp StdBattleTextBox
+
+.do_enemy_turn
+	ld a, [EnemyMonStatus]
+	bit FRZ, a
+	ret z
+	ld a, [wEnemyJustGotFrozen]
+	and a
+	ret nz
+	call BattleRandom
+	cp 10 percent
+	ret nc
+	xor a
+	ld [EnemyMonStatus], a
+
+	ld a, [wBattleMode]
+	dec a
+	jr z, .wild
+	ld a, [CurOTMon]
+	ld hl, OTPartyMon1Status
+	call GetPartyLocation
+	ld [hl], 0
+.wild
+
+	call UpdateBattleHuds
+	call SetPlayerTurn
+	ld hl, DefrostedOpponentText
+	jp StdBattleTextBox
+; 3cafb
+
+HandleSafeguard: ; 3cafb
+	ld a, [hLinkPlayerNumber]
+	cp $1
+	jr z, .player1
+	call .CheckPlayer
+	jr .CheckEnemy
+
+.player1
+	call .CheckEnemy
+.CheckPlayer:
+	ld a, [PlayerScreens]
+	bit SCREENS_SAFEGUARD, a
+	ret z
+	ld hl, PlayerSafeguardCount
+	dec [hl]
+	ret nz
+	res SCREENS_SAFEGUARD, a
+	ld [PlayerScreens], a
+	xor a
+	jr .print
+
+.CheckEnemy:
+	ld a, [EnemyScreens]
+	bit SCREENS_SAFEGUARD, a
+	ret z
+	ld hl, EnemySafeguardCount
+	dec [hl]
+	ret nz
+	res SCREENS_SAFEGUARD, a
+	ld [EnemyScreens], a
+	ld a, $1
+
+.print
+	ld [hBattleTurn], a
+	ld hl, BattleText_SafeguardFaded
+	jp StdBattleTextBox
+
+HandleScreens: ; 3cb36
+	ld a, [hLinkPlayerNumber]
+	cp 1
+	jr z, .Both
+	call .CheckPlayer
+	jr .CheckEnemy
+
+.Both:
+	call .CheckEnemy
+
+.CheckPlayer:
+	call SetPlayerTurn
+	ld de, .Your
+	call .Copy
+	ld hl, PlayerScreens
+	ld de, PlayerLightScreenCount
+	jr .TickScreens
+
+.CheckEnemy:
+	call SetEnemyTurn
+	ld de, .Enemy
+	call .Copy
+	ld hl, EnemyScreens
+	ld de, EnemyLightScreenCount
+
+.TickScreens:
+	bit SCREENS_LIGHT_SCREEN, [hl]
+	call nz, .LightScreenTick
+	bit SCREENS_REFLECT, [hl]
+	call nz, .ReflectTick
+	ret
+
+.Copy:
+	ld hl, StringBuffer1
+	jp CopyName2
+; 3cb75
+
+.Your:
+	db "Your@"
+.Enemy:
+	db "Enemy@"
+; 3cb80
+
+.LightScreenTick: ; 3cb80
+	ld a, [de]
+	dec a
+	ld [de], a
+	ret nz
+	res SCREENS_LIGHT_SCREEN, [hl]
+	push hl
+	push de
+	ld hl, BattleText_PkmnLightScreenFell
+	call StdBattleTextBox
+	pop de
+	pop hl
+	ret
+; 3cb91
+
+.ReflectTick: ; 3cb91
+	inc de
+	ld a, [de]
+	dec a
+	ld [de], a
+	ret nz
+	res SCREENS_REFLECT, [hl]
+	ld hl, BattleText_PkmnReflectFaded
+	jp StdBattleTextBox
+; 3cb9e
+
+HandleWeather: ; 3cb9e
+	ld a, [Weather]
+	cp WEATHER_NONE
+	ret z
+
+	ld hl, WeatherCount
+	dec [hl]
+	jr z, .ended
+
+	ld hl, .WeatherMessages
+	call .PrintWeatherMessage
+
+	ld a, [Weather]
+	cp WEATHER_SANDSTORM
+	ret nz
+
+	ld a, [hLinkPlayerNumber]
+	cp 1
+	jr z, .enemy_first
+
+.player_first
+	call SetPlayerTurn
+	call .SandstormDamage
+	call SetEnemyTurn
+	jr .SandstormDamage
+
+.enemy_first
+	call SetEnemyTurn
+	call .SandstormDamage
+	call SetPlayerTurn
+
+.SandstormDamage:
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVar
+	bit SUBSTATUS_UNDERGROUND, a
+	ret nz
+
+	ld hl, BattleMonType1
+	ld a, [hBattleTurn]
+	and a
+	jr z, .ok
+	ld hl, EnemyMonType1
+.ok
+	ld a, [hli]
+	cp ROCK
+	ret z
+	cp GROUND
+	ret z
+	cp STEEL
+	ret z
+
+	ld a, [hl]
+	cp ROCK
+	ret z
+	cp GROUND
+	ret z
+	cp STEEL
+	ret z
+
+	call SwitchTurnCore
+	xor a
+	ld [wNumHits], a
+	ld de, ANIM_IN_SANDSTORM
+	call Call_PlayBattleAnim
+	call SwitchTurnCore
+	call GetEighthMaxHP
+	call SubtractHPFromUser
+
+	ld hl, SandstormHitsText
+	jp StdBattleTextBox
+
+.ended
+	ld hl, .WeatherEndedMessages
+	call .PrintWeatherMessage
+	xor a
+	ld [Weather], a
+	ret
+
+.PrintWeatherMessage:
+	ld a, [Weather]
+	dec a
+	ld c, a
+	ld b, 0
+	add hl, bc
+	add hl, bc
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	jp StdBattleTextBox
+; 3cc2d
+
+.WeatherMessages:
+	dw BattleText_RainContinuesToFall
+	dw BattleText_TheSunlightIsStrong
+	dw BattleText_TheSandstormRages
+.WeatherEndedMessages:
+	dw BattleText_TheRainStopped
+	dw BattleText_TheSunlightFaded
+	dw BattleText_TheSandstormSubsided
+; 3cc39
+
+SubtractHPFromTarget: ; 3cc39
+	call SubtractHP
+	jp UpdateHPBar
+; 3cc3f
+
+SubtractHPFromUser: ; 3cc3f
+; Subtract HP from Pkmn
+	call SubtractHP
+	jp UpdateHPBarBattleHuds
+; 3cc45
+
+SubtractHP: ; 3cc45
+	ld hl, BattleMonHP
+	ld a, [hBattleTurn]
+	and a
+	jr z, .ok
+	ld hl, EnemyMonHP
+.ok
+	inc hl
+	ld a, [hl]
+	ld [Buffer3], a
+	sub c
+	ld [hld], a
+	ld [Buffer5], a
+	ld a, [hl]
+	ld [Buffer4], a
+	sbc b
+	ld [hl], a
+	ld [Buffer6], a
+	ret nc
+
+	ld a, [Buffer3]
+	ld c, a
+	ld a, [Buffer4]
+	ld b, a
+	xor a
+	ld [hli], a
+	ld [hl], a
+	ld [Buffer5], a
+	ld [Buffer6], a
+	ret
+; 3cc76
+
+GetSixteenthMaxHP: ; 3cc76
+	call GetQuarterMaxHP
+	; quarter result
+	srl c
+	srl c
+	; round up
+	ld a, c
+	and a
+	jr nz, .ok
+	inc c
+.ok
+	ret
+; 3cc83
+
+GetEighthMaxHP: ; 3cc83
+; output: bc
+	call GetQuarterMaxHP
+; assumes nothing can have 1024 or more hp
+; halve result
+	srl c
+; round up
+	ld a, c
+	and a
+	jr nz, .end
+	inc c
+.end
+	ret
+; 3cc8e
+
+GetQuarterMaxHP: ; 3cc8e
+; output: bc
+	call GetMaxHP
+
+; quarter result
+	srl b
+	rr c
+	srl b
+	rr c
+
+; assumes nothing can have 1024 or more hp
+; round up
+	ld a, c
+	and a
+	jr nz, .end
+	inc c
+.end
+	ret
+; 3cc9f
+
+GetHalfMaxHP: ; 3cc9f
+; output: bc
+	call GetMaxHP
+
+; halve result
+	srl b
+	rr c
+
+; floor = 1
+	ld a, c
+	or b
+	jr nz, .end
+	inc c
+.end
+	ret
+; 3ccac
+
+GetMaxHP: ; 3ccac
+; output: bc, Buffer1-2
+
+	ld hl, BattleMonMaxHP
+	ld a, [hBattleTurn]
+	and a
+	jr z, .ok
+	ld hl, EnemyMonMaxHP
+.ok
+	ld a, [hli]
+	ld [Buffer2], a
+	ld b, a
+
+	ld a, [hl]
+	ld [Buffer1], a
+	ld c, a
+	ret
+; 3ccc2
+
+GetHalfHP: ; 3ccc2
+; unreferenced
+	ld hl, BattleMonHP
+	ld a, [hBattleTurn]
+	and a
+	jr z, .ok
+	ld hl, EnemyMonHP
+.ok
+	ld a, [hli]
+	ld b, a
+	ld a, [hli]
+	ld c, a
+	srl b
+	rr c
+	ld a, [hli]
+	ld [Buffer2], a
+	ld a, [hl]
+	ld [Buffer1], a
+	ret
+; 3ccde
+
+CheckUserHasEnoughHP: ; 3ccde
+	ld hl, BattleMonHP + 1
+	ld a, [hBattleTurn]
+	and a
+	jr z, .ok
+	ld hl, EnemyMonHP + 1
+.ok
+	ld a, c
+	sub [hl]
+	dec hl
+	ld a, b
+	sbc [hl]
+	ret
+; 3ccef
+
+RestoreHP ; 3ccef
+	ld hl, EnemyMonMaxHP
+	ld a, [hBattleTurn]
+	and a
+	jr z, .ok
+	ld hl, BattleMonMaxHP
+.ok
+	ld a, [hli]
+	ld [Buffer2], a
+	ld a, [hld]
+	ld [Buffer1], a
+	dec hl
+	ld a, [hl]
+	ld [Buffer3], a
+	add c
+	ld [hld], a
+	ld [Buffer5], a
+	ld a, [hl]
+	ld [Buffer4], a
+	adc b
+	ld [hli], a
+	ld [Buffer6], a
+
+	ld a, [Buffer1]
+	ld c, a
+	ld a, [hld]
+	sub c
+	ld a, [Buffer2]
+	ld b, a
+	ld a, [hl]
+	sbc b
+	jr c, .asm_3cd2d
+	ld a, b
+	ld [hli], a
+	ld [Buffer6], a
+	ld a, c
+	ld [hl], a
+	ld [Buffer5], a
+.asm_3cd2d
+
+	call SwitchTurnCore
+	call UpdateHPBarBattleHuds
+	jp SwitchTurnCore
+; 3cd36
+
+UpdateHPBarBattleHuds: ; 3cd36
+	call UpdateHPBar
+	jp UpdateBattleHuds
+; 3cd3c
+
+UpdateHPBar: ; 3cd3c
+	hlcoord 10, 9
+	ld a, [hBattleTurn]
+	and a
+	ld a, 1
+	jr z, .ok
+	hlcoord 2, 2
+	xor a
+.ok
+	push bc
+	ld [wWhichHPBar], a
+	predef AnimateHPBar
+	pop bc
+	ret
+; 3cd55
+
+HandleEnemyMonFaint: ; 3cd55
+	call FaintEnemyPokemon
+	ld hl, BattleMonHP
+	ld a, [hli]
+	or [hl]
+	call z, FaintYourPokemon
+	xor a
+	ld [wWhichMonFaintedFirst], a
+	call UpdateBattleStateAndExperienceAfterEnemyFaint
+	call CheckPlayerPartyForFitPkmn
+	ld a, d
+	and a
+	jp z, LostBattle
+
+	ld hl, BattleMonHP
+	ld a, [hli]
+	or [hl]
+	call nz, UpdatePlayerHUD
+
+	ld a, $1
+	ld [hBGMapMode], a
+	ld c, 60
+	call DelayFrames
+
+	ld a, [wBattleMode]
+	dec a
+	jr nz, .trainer
+
+	ld a, 1
+	ld [BattleEnded], a
+	ret
+
+.trainer
+	call CheckEnemyTrainerDefeated
+	jp z, WinTrainerBattle
+
+	ld hl, BattleMonHP
+	ld a, [hli]
+	or [hl]
+	jr nz, .player_mon_not_fainted
+
+	call AskUseNextPokemon
+	jr nc, .dont_flee
+
+	ld a, 1
+	ld [BattleEnded], a
+	ret
+
+.dont_flee
+	call ForcePlayerMonChoice
+	call CheckMobileBattleError
+	jp c, WildFled_EnemyFled_LinkBattleCanceled
+
+	ld a, $1
+	ld [wPlayerAction], a
+	call HandleEnemySwitch
+	jp z, WildFled_EnemyFled_LinkBattleCanceled
+	jr DoubleSwitch
+
+.player_mon_not_fainted
+	ld a, $1
+	ld [wPlayerAction], a
+	call HandleEnemySwitch
+	jp z, WildFled_EnemyFled_LinkBattleCanceled
+	xor a
+	ld [wPlayerAction], a
+	ret
+; 3cdca
+
+DoubleSwitch: ; 3cdca
+	ld a, [hLinkPlayerNumber]
+	cp $1
+	jr z, .player_1
+	call ClearSprites
+	hlcoord 1, 0
+	lb bc, 4, 10
+	call ClearBox
+	call PlayerPartyMonEntrance
+	ld a, $1
+	call EnemyPartyMonEntrance
+	jr .done
+
+.player_1
+	ld a, [CurPartyMon]
+	push af
+	ld a, $1
+	call EnemyPartyMonEntrance
+	call ClearSprites
+	call LoadTileMapToTempTileMap
+	pop af
+	ld [CurPartyMon], a
+	call PlayerPartyMonEntrance
+
+.done
+	xor a
+	ld [wPlayerAction], a
+	ret
+; 3ce01
+
+UpdateBattleStateAndExperienceAfterEnemyFaint: ; 3ce01
+	call UpdateBattleMonInParty
+	ld a, [wBattleMode]
+	dec a
+	jr z, .wild
+	ld a, [CurOTMon]
+	ld hl, OTPartyMon1HP
+	call GetPartyLocation
+	xor a
+	ld [hli], a
+	ld [hl], a
+
+.wild
+	ld hl, PlayerSubStatus3
+	res SUBSTATUS_IN_LOOP, [hl]
+	xor a
+	ld hl, EnemyDamageTaken
+	ld [hli], a
+	ld [hl], a
+	call NewEnemyMonStatus
+	call BreakAttraction
+	ld a, [wBattleMode]
+	dec a
+	jr z, .wild2
+	jr .trainer
+
+.wild2
+	call StopDangerSound
+	ld a, $1
+	ld [wDanger], a
+
+.trainer
+	ld hl, BattleMonHP
+	ld a, [hli]
+	or [hl]
+	jr nz, .player_mon_did_not_faint
+	ld a, [wWhichMonFaintedFirst]
+	and a
+	jr nz, .player_mon_did_not_faint
+	call PlayerMonFaintHappinessMod
+
+.player_mon_did_not_faint
+	call CheckPlayerPartyForFitPkmn
+	ld a, d
+	and a
+	ret z
+	ld a, [wBattleMode]
+	dec a
+	call z, PlayVictoryMusic
+	call EmptyBattleTextBox
+	call LoadTileMapToTempTileMap
+	ld a, [wBattleResult]
+	and $c0
+	ld [wBattleResult], a
+	call IsAnyMonHoldingExpShare
+	jr z, .skip_exp
+	ld hl, EnemyMonBaseStats
+	ld b, EnemyMonEnd - EnemyMonBaseStats
+.loop
+	srl [hl]
+	inc hl
+	dec b
+	jr nz, .loop
+
+.skip_exp
+	ld hl, EnemyMonBaseStats
+	ld de, wBackupEnemyMonBaseStats
+	ld bc, EnemyMonEnd - EnemyMonBaseStats
+	call CopyBytes
+	xor a
+	ld [wGivingExperienceToExpShareHolders], a
+	call GiveExperiencePoints
+	call IsAnyMonHoldingExpShare
+	ret z
+
+	ld a, [wBattleParticipantsNotFainted]
+	push af
+	ld a, d
+	ld [wBattleParticipantsNotFainted], a
+	ld hl, wBackupEnemyMonBaseStats
+	ld de, EnemyMonBaseStats
+	ld bc, EnemyMonEnd - EnemyMonBaseStats
+	call CopyBytes
+	ld a, $1
+	ld [wGivingExperienceToExpShareHolders], a
+	call GiveExperiencePoints
+	pop af
+	ld [wBattleParticipantsNotFainted], a
+	ret
+; 3ceaa
+
+IsAnyMonHoldingExpShare: ; 3ceaa
+	ld a, [PartyCount]
+	ld b, a
+	ld hl, PartyMon1
+	ld c, 1
+	ld d, 0
+.loop
+	push hl
+	push bc
+	ld bc, MON_HP
+	add hl, bc
+	ld a, [hli]
+	or [hl]
+	pop bc
+	pop hl
+	jr z, .next
+
+	push hl
+	push bc
+	ld bc, MON_ITEM
+	add hl, bc
+	pop bc
+	ld a, [hl]
+	pop hl
+
+	cp EXP_SHARE
+	jr nz, .next
+	ld a, d
+	or c
+	ld d, a
+
+.next
+	sla c
+	push de
+	ld de, PARTYMON_STRUCT_LENGTH
+	add hl, de
+	pop de
+	dec b
+	jr nz, .loop
+
+	ld a, d
+	ld e, 0
+	ld b, PARTY_LENGTH
+.loop2
+	srl a
+	jr nc, .okay
+	inc e
+
+.okay
+	dec b
+	jr nz, .loop2
+	ld a, e
+	and a
+	ret
+; 3ceec
+
+StopDangerSound: ; 3ceec
+	xor a
+	ld [Danger], a
+	ret
+; 3cef1
+
+FaintYourPokemon: ; 3cef1
+	call StopDangerSound
+	call WaitSFX
+	ld a, $f0
+	ld [CryTracks], a
+	ld a, [BattleMonSpecies]
+	call PlayStereoCry
+	call PlayerMonFaintedAnimation
+	hlcoord 9, 7
+	lb bc, 5, 11
+	call ClearBox
+	ld hl, BattleText_PkmnFainted
+	jp StdBattleTextBox
+; 3cf14
+
+FaintEnemyPokemon: ; 3cf14
+	call WaitSFX
+	ld de, SFX_KINESIS
+	call PlaySFX
+	call EnemyMonFaintedAnimation
+	ld de, SFX_FAINT
+	call PlaySFX
+	hlcoord 1, 0
+	lb bc, 4, 10
+	call ClearBox
+	ld hl, BattleText_EnemyPkmnFainted
+	jp StdBattleTextBox
+; 3cf35
+
+CheckEnemyTrainerDefeated: ; 3cf35
+	ld a, [OTPartyCount]
+	ld b, a
+	xor a
+	ld hl, OTPartyMon1HP
+	ld de, PARTYMON_STRUCT_LENGTH
+
+.loop
+	or [hl]
+	inc hl
+	or [hl]
+	dec hl
+	add hl, de
+	dec b
+	jr nz, .loop
+
+	and a
+	ret
+; 3cf4a
+
+HandleEnemySwitch: ; 3cf4a
+	ld hl, EnemyHPPal
+	ld e, HP_BAR_LENGTH_PX
+	call UpdateHPPal
+	call WaitBGMap
+	farcall EnemySwitch_TrainerHud
+	ld a, [wLinkMode]
+	and a
+	jr z, .not_linked
+
+	call LinkBattleSendReceiveAction
+	ld a, [wBattleAction]
+	cp BATTLEACTION_FORFEIT
+	ret z
+
+	call Call_LoadTempTileMapToTileMap
+
+.not_linked
+	ld hl, BattleMonHP
+	ld a, [hli]
+	or [hl]
+	ld a, $0
+	jr nz, EnemyPartyMonEntrance
+	inc a
+	ret
+; 3cf78
+
+EnemyPartyMonEntrance: ; 3cf78
+	push af
+	xor a
+	ld [wEnemySwitchMonIndex], a
+	call NewEnemyMonStatus
+	call ResetEnemyStatLevels
+	call BreakAttraction
+	pop af
+	and a
+	jr nz, .set
+	call EnemySwitch
+	jr .done_switch
+
+.set
+	call EnemySwitch_SetMode
+.done_switch
+	call ResetBattleParticipants
+	call SetEnemyTurn
+	call SpikesDamage
+	xor a
+	ld [wEnemyMoveStruct + MOVE_ANIM], a
+	ld [wPlayerAction], a
+	inc a
+	ret
+; 3cfa4
+
+WinTrainerBattle: ; 3cfa4
+; Player won the battle
+	call StopDangerSound
+	ld a, $1
+	ld [wDanger], a
+	ld [BattleEnded], a
+	ld a, [wLinkMode]
+	and a
+	ld a, b
+	call z, PlayVictoryMusic
+	callfar Battle_GetTrainerName
+	ld hl, BattleText_EnemyWasDefeated
+	call StdBattleTextBox
+
+	call IsMobileBattle
+	jr z, .mobile
+	ld a, [wLinkMode]
+	and a
+	ret nz
+
+	ld a, [InBattleTowerBattle]
+	bit 0, a
+	jr nz, .battle_tower
+
+	call BattleWinSlideInEnemyTrainerFrontpic
+	ld c, 40
+	call DelayFrames
+	ld a, [BattleType]
+	cp BATTLETYPE_CANLOSE
+	jr nz, .skip_heal
+	predef HealParty
+.skip_heal
+	ld a, [wMonStatusFlags]
+	bit 0, a
+	jr nz, .skip_win_loss_text
+	call PrintWinLossText
+
+.skip_win_loss_text
+	jp .GiveMoney
+
+.mobile
+	call BattleWinSlideInEnemyTrainerFrontpic
+	ld c, 40
+	call DelayFrames
+	ld c, $4 ; win
+	farcall Mobile_PrintOpponentBattleMessage
+	ret
+
+.battle_tower
+	call BattleWinSlideInEnemyTrainerFrontpic
+	ld c, 40
+	call DelayFrames
+	call EmptyBattleTextBox
+	ld c, $3
+	farcall BattleTowerText
+	call WaitPressAorB_BlinkCursor
+	ld hl, wPayDayMoney
+	ld a, [hli]
+	or [hl]
+	inc hl
+	or [hl]
+	ret nz
+	call ClearTileMap
+	call ClearBGPalettes
+	ret
+
+.GiveMoney:
+	ld a, [wAmuletCoin]
+	and a
+	call nz, .DoubleReward
+	call .CheckMaxedOutMomMoney
+	push af
+	ld a, $0
+	jr nc, .okay
+	ld a, [wMomSavingMoney]
+	and $7
+	cp $3
+	jr nz, .okay
+	inc a
+
+.okay
+	ld b, a
+	ld c, $4
+.loop
+	ld a, b
+	and a
+	jr z, .loop2
+	call .SendMoneyToMom
+	dec c
+	dec b
+	jr .loop
+
+.loop2
+	ld a, c
+	and a
+	jr z, .done
+	call .AddMoneyToWallet
+	dec c
+	jr .loop2
+
+.done
+	call .DoubleReward
+	call .DoubleReward
+	pop af
+	jr nc, .KeepItAll
+	ld a, [wMomSavingMoney]
+	and $7
+	jr z, .KeepItAll
+	ld hl, .SentToMomTexts
+	dec a
+	ld c, a
+	ld b, 0
+	add hl, bc
+	add hl, bc
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	jp StdBattleTextBox
+
+.KeepItAll:
+	ld hl, GotMoneyForWinningText
+	jp StdBattleTextBox
+; 3d081
+
+.SendMoneyToMom: ; 3d081
+	push bc
+	ld hl, wBattleReward + 2
+	ld de, wMomsMoney + 2
+	call AddBattleMoneyToAccount
+	pop bc
+	ret
+; 3d08d
+
+.AddMoneyToWallet: ; 3d08d
+	push bc
+	ld hl, wBattleReward + 2
+	ld de, Money + 2
+	call AddBattleMoneyToAccount
+	pop bc
+	ret
+; 3d099
+
+.DoubleReward: ; 3d099
+	ld hl, wBattleReward + 2
+	sla [hl]
+	dec hl
+	rl [hl]
+	dec hl
+	rl [hl]
+	ret nc
+	ld a, $ff
+	ld [hli], a
+	ld [hli], a
+	ld [hl], a
+	ret
+; 3d0ab
+
+.SentToMomTexts: ; 3d0ab
+	dw SentSomeToMomText
+	dw SentHalfToMomText
+	dw SentAllToMomText
+; 3d0b1
+
+.CheckMaxedOutMomMoney: ; 3d0b1
+	ld hl, wMomsMoney + 2
+	ld a, [hld]
+	cp LOW(MAX_MONEY)
+	ld a, [hld]
+	sbc HIGH(MAX_MONEY) ; mid
+	ld a, [hl]
+	sbc HIGH(MAX_MONEY >> 8)
+	ret
+; 3d0be
+
+AddBattleMoneyToAccount: ; 3d0be
+	ld c, $3
+	and a
+	push de
+	push hl
+	push bc
+	ld b, h
+	ld c, l
+	farcall TrainerRankings_AddToBattlePayouts
+	pop bc
+	pop hl
+.loop
+	ld a, [de]
+	adc [hl]
+	ld [de], a
+	dec de
+	dec hl
+	dec c
+	jr nz, .loop
+	pop hl
+	ld a, [hld]
+	cp LOW(MAX_MONEY)
+	ld a, [hld]
+	sbc HIGH(MAX_MONEY) ; mid
+	ld a, [hl]
+	sbc HIGH(MAX_MONEY >> 8)
+	ret c
+	ld [hl], HIGH(MAX_MONEY >> 8)
+	inc hl
+	ld [hl], HIGH(MAX_MONEY) ; mid
+	inc hl
+	ld [hl], LOW(MAX_MONEY)
+	ret
+; 3d0ea
+
+PlayVictoryMusic: ; 3d0ea
+	push de
+	ld de, MUSIC_NONE
+	call PlayMusic
+	call DelayFrame
+	ld de, MUSIC_WILD_VICTORY
+	ld a, [wBattleMode]
+	dec a
+	jr nz, .trainer_victory
+	push de
+	call IsAnyMonHoldingExpShare
+	pop de
+	jr nz, .play_music
+	ld hl, wPayDayMoney
+	ld a, [hli]
+	or [hl]
+	jr nz, .play_music
+	ld a, [wBattleParticipantsNotFainted]
+	and a
+	jr z, .lost
+	jr .play_music
+
+.trainer_victory
+	ld de, MUSIC_GYM_VICTORY
+	call IsJohtoGymLeader
+	jr c, .play_music
+	ld de, MUSIC_TRAINER_VICTORY
+
+.play_music
+	call PlayMusic
+
+.lost
+	pop de
+	ret
+; 3d123
+
+; These functions check if the current opponent is a gym leader or one of a
+; few other special trainers.
+
+; Note: KantoGymLeaders is a subset of JohtoGymLeaders. If you wish to
+; differentiate between the two, call IsKantoGymLeader first.
+
+; The Lance and Red entries are unused for music checks; those trainers are
+; accounted for elsewhere.
+
+IsKantoGymLeader: ; 0x3d123
+	ld hl, KantoGymLeaders
+	jr IsGymLeaderCommon
+
+IsJohtoGymLeader: ; 0x3d128
+	ld hl, JohtoGymLeaders
+IsGymLeaderCommon:
+	push de
+	ld a, [OtherTrainerClass]
+	ld de, $0001
+	call IsInArray
+	pop de
+	ret
+; 0x3d137
+
+JohtoGymLeaders:
+	db FALKNER
+	db WHITNEY
+	db BUGSY
+	db MORTY
+	db PRYCE
+	db JASMINE
+	db CHUCK
+	db CLAIR
+	db WILL
+	db BRUNO
+	db KAREN
+	db KOGA
+; fallthrough
+; these two entries are unused
+	db CHAMPION
+	db RED
+; fallthrough
+KantoGymLeaders:
+	db BROCK
+	db MISTY
+	db LT_SURGE
+	db ERIKA
+	db JANINE
+	db SABRINA
+	db BLAINE
+	db BLUE
+	db -1
+
+HandlePlayerMonFaint: ; 3d14e
+	call FaintYourPokemon
+	ld hl, EnemyMonHP
+	ld a, [hli]
+	or [hl]
+	call z, FaintEnemyPokemon
+	ld a, $1
+	ld [wWhichMonFaintedFirst], a
+	call PlayerMonFaintHappinessMod
+	call CheckPlayerPartyForFitPkmn
+	ld a, d
+	and a
+	jp z, LostBattle
+	ld hl, EnemyMonHP
+	ld a, [hli]
+	or [hl]
+	jr nz, .notfainted
+	call UpdateBattleStateAndExperienceAfterEnemyFaint
+	ld a, [wBattleMode]
+	dec a
+	jr nz, .trainer
+	ld a, $1
+	ld [BattleEnded], a
+	ret
+
+.trainer
+	call CheckEnemyTrainerDefeated
+	jp z, WinTrainerBattle
+
+.notfainted
+	call AskUseNextPokemon
+	jr nc, .switch
+	ld a, $1
+	ld [BattleEnded], a
+	ret
+
+.switch
+	call ForcePlayerMonChoice
+	call CheckMobileBattleError
+	jp c, WildFled_EnemyFled_LinkBattleCanceled
+	ld a, c
+	and a
+	ret nz
+	ld a, $1
+	ld [wPlayerAction], a
+	call HandleEnemySwitch
+	jp z, WildFled_EnemyFled_LinkBattleCanceled
+	jp DoubleSwitch
+; 3d1aa
+
+PlayerMonFaintHappinessMod: ; 3d1aa
+	ld a, [CurBattleMon]
+	ld c, a
+	ld hl, wBattleParticipantsNotFainted
+	ld b, RESET_FLAG
+	predef FlagPredef
+	ld hl, EnemySubStatus3
+	res SUBSTATUS_IN_LOOP, [hl]
+	xor a
+	ld [Danger], a
+	ld hl, PlayerDamageTaken
+	ld [hli], a
+	ld [hl], a
+	ld [BattleMonStatus], a
+	call UpdateBattleMonInParty
+	ld c, HAPPINESS_FAINTED
+	; If TheirLevel > (YourLevel + 30), use a different parameter
+	ld a, [BattleMonLevel]
+	add 30
+	ld b, a
+	ld a, [EnemyMonLevel]
+	cp b
+	jr c, .got_param
+	ld c, HAPPINESS_BEATENBYSTRONGFOE
+
+.got_param
+	ld a, [CurBattleMon]
+	ld [CurPartyMon], a
+	callfar ChangeHappiness
+	ld a, [wBattleResult]
+	and %11000000
+	add $1
+	ld [wBattleResult], a
+	ld a, [wWhichMonFaintedFirst]
+	and a
+	ret z
+	ret ; ??????????
+; 3d1f8
+
+AskUseNextPokemon: ; 3d1f8
+	call EmptyBattleTextBox
+	call LoadTileMapToTempTileMap
+; We don't need to be here if we're in a Trainer battle,
+; as that decision is made for us.
+	ld a, [wBattleMode]
+	and a
+	dec a
+	ret nz
+
+	ld hl, BattleText_UseNextMon
+	call StdBattleTextBox
+.loop
+	lb bc, 1, 7
+	call PlaceYesNoBox
+	ld a, [wMenuCursorY]
+	jr c, .pressed_b
+	and a
+	ret
+
+.pressed_b
+	ld a, [wMenuCursorY]
+	cp $1 ; YES
+	jr z, .loop
+	ld hl, PartyMon1Speed
+	ld de, EnemyMonSpeed
+	jp TryToRunAwayFromBattle
+; 3d227
+
+ForcePlayerMonChoice: ; 3d227
+	call EmptyBattleTextBox
+	call LoadStandardMenuDataHeader
+	call SetUpBattlePartyMenu_NoLoop
+	call ForcePickPartyMonInBattle
+	ld a, [wLinkMode]
+	and a
+	jr z, .skip_link
+	ld a, $1
+	ld [wPlayerAction], a
+	call LinkBattleSendReceiveAction
+
+.skip_link
+	xor a
+	ld [wPlayerAction], a
+	call CheckMobileBattleError
+	jr c, .enemy_fainted_mobile_error
+	ld hl, EnemyMonHP
+	ld a, [hli]
+	or [hl]
+	jr nz, .send_out_pokemon
+
+.enemy_fainted_mobile_error
+	call ClearSprites
+	call ClearBGPalettes
+	call _LoadHPBar
+	call ExitMenu
+	call LoadTileMapToTempTileMap
+	call WaitBGMap
+	call GetMemSGBLayout
+	call SetPalettes
+	xor a
+	ld c, a
+	ret
+
+.send_out_pokemon
+	call ClearSprites
+	ld a, [CurBattleMon]
+	ld [LastPlayerMon], a
+	ld a, [CurPartyMon]
+	ld [CurBattleMon], a
+	call AddBattleParticipant
+	call InitBattleMon
+	call ResetPlayerStatLevels
+	call ClearPalettes
+	call DelayFrame
+	call _LoadHPBar
+	call CloseWindow
+	call GetMemSGBLayout
+	call SetPalettes
+	call SendOutPkmnText
+	call NewBattleMonStatus
+	call BreakAttraction
+	call SendOutPlayerMon
+	call EmptyBattleTextBox
+	call LoadTileMapToTempTileMap
+	call SetPlayerTurn
+	call SpikesDamage
+	ld a, $1
+	and a
+	ld c, a
+	ret
+; 3d2b3
+
+PlayerPartyMonEntrance: ; 3d2b3
+	ld a, [CurBattleMon]
+	ld [LastPlayerMon], a
+	ld a, [CurPartyMon]
+	ld [CurBattleMon], a
+	call AddBattleParticipant
+	call InitBattleMon
+	call ResetPlayerStatLevels
+	call SendOutPkmnText
+	call NewBattleMonStatus
+	call BreakAttraction
+	call SendOutPlayerMon
+	call EmptyBattleTextBox
+	call LoadTileMapToTempTileMap
+	call SetPlayerTurn
+	jp SpikesDamage
+; 3d2e0
+
+CheckMobileBattleError: ; 3d2e0
+	ld a, [wLinkMode]
+	cp LINK_MOBILE
+	jr nz, .not_mobile ; It's not a mobile battle
+
+	ld a, [wcd2b]
+	and a
+	jr z, .not_mobile
+
+; We have a mobile battle and something else happened
+	scf
+	ret
+
+.not_mobile
+	xor a
+	ret
+; 3d2f1
+
+IsMobileBattle: ; 3d2f1
+	ld a, [wLinkMode]
+	cp LINK_MOBILE
+	ret
+; 3d2f7
+
+SetUpBattlePartyMenu_NoLoop: ; 3d2f7
+	call ClearBGPalettes
+SetUpBattlePartyMenu: ; switch to fullscreen menu?
+	farcall LoadPartyMenuGFX
+	farcall InitPartyMenuWithCancel
+	farcall InitPartyMenuBGPal7
+	farcall InitPartyMenuGFX
+	ret
+; 3d313
+
+JumpToPartyMenuAndPrintText: ; 3d313
+	farcall WritePartyMenuTilemap
+	farcall PrintPartyMenuText
+	call WaitBGMap
+	call SetPalettes
+	call DelayFrame
+	ret
+; 3d329
+
+SelectBattleMon: ; 3d329
+	call IsMobileBattle
+	jr z, .mobile
+	farcall PartyMenuSelect
+	ret
+
+.mobile
+	farcall Mobile_PartyMenuSelect
+	ret
+; 3d33c
+
+PickPartyMonInBattle: ; 3d33c
+.loop
+	ld a, PARTYMENUACTION_SWITCH ; Which PKMN?
+	ld [PartyMenuActionText], a
+	call JumpToPartyMenuAndPrintText
+	call SelectBattleMon
+	ret c
+	call CheckIfCurPartyMonIsFitToFight
+	jr z, .loop
+	xor a
+	ret
+; 3d34f
+
+SwitchMonAlreadyOut: ; 3d34f
+	ld hl, CurBattleMon
+	ld a, [CurPartyMon]
+	cp [hl]
+	jr nz, .notout
+
+	ld hl, BattleText_PkmnIsAlreadyOut
+	call StdBattleTextBox
+	scf
+	ret
+
+.notout
+	xor a
+	ret
+; 3d362
+
+ForcePickPartyMonInBattle: ; 3d362
+; Can't back out.
+
+.pick
+	call PickPartyMonInBattle
+	ret nc
+	call CheckMobileBattleError
+	ret c
+
+	ld de, SFX_WRONG
+	call PlaySFX
+	call WaitSFX
+	jr .pick
+; 3d375
+
+PickSwitchMonInBattle: ; 3d375
+.pick
+	call PickPartyMonInBattle
+	ret c
+	call SwitchMonAlreadyOut
+	jr c, .pick
+	xor a
+	ret
+; 3d380
+
+ForcePickSwitchMonInBattle: ; 3d380
+; Can't back out.
+
+.pick
+	call ForcePickPartyMonInBattle
+	call CheckMobileBattleError
+	ret c
+	call SwitchMonAlreadyOut
+	jr c, .pick
+
+	xor a
+	ret
+; 3d38e
+
+LostBattle: ; 3d38e
+	ld a, 1
+	ld [BattleEnded], a
+
+	ld a, [InBattleTowerBattle]
+	bit 0, a
+	jr nz, .battle_tower
+
+	ld a, [BattleType]
+	cp BATTLETYPE_CANLOSE
+	jr nz, .not_canlose
+
+; Remove the enemy from the screen.
+	hlcoord 0, 0
+	lb bc, 8, 21
+	call ClearBox
+	call BattleWinSlideInEnemyTrainerFrontpic
+
+	ld c, 40
+	call DelayFrames
+
+	ld a, [wMonStatusFlags]
+	bit 0, a
+	jr nz, .skip_win_loss_text
+	call PrintWinLossText
+.skip_win_loss_text
+	ret
+
+.battle_tower
+; Remove the enemy from the screen.
+	hlcoord 0, 0
+	lb bc, 8, 21
+	call ClearBox
+	call BattleWinSlideInEnemyTrainerFrontpic
+
+	ld c, 40
+	call DelayFrames
+
+	call EmptyBattleTextBox
+	ld c, 2
+	farcall BattleTowerText
+	call WaitPressAorB_BlinkCursor
+	call ClearTileMap
+	call ClearBGPalettes
+	ret
+
+.not_canlose
+	ld a, [wLinkMode]
+	and a
+	jr nz, .LostLinkBattle
+
+; Greyscale
+	ld b, SCGB_BATTLE_GRAYSCALE
+	call GetSGBLayout
+	call SetPalettes
+	jr .end
+
+.LostLinkBattle:
+	call UpdateEnemyMonInParty
+	call CheckEnemyTrainerDefeated
+	jr nz, .not_tied
+	ld hl, TiedAgainstText
+	ld a, [wBattleResult]
+	and $c0
+	add 2
+	ld [wBattleResult], a
+	jr .text
+
+.not_tied
+	ld hl, LostAgainstText
+	call IsMobileBattle
+	jr z, .mobile
+
+.text
+	call StdBattleTextBox
+
+.end
+	scf
+	ret
+
+.mobile
+; Remove the enemy from the screen.
+	hlcoord 0, 0
+	lb bc, 8, 21
+	call ClearBox
+	call BattleWinSlideInEnemyTrainerFrontpic
+
+	ld c, 40
+	call DelayFrames
+
+	ld c, $3 ; lost
+	farcall Mobile_PrintOpponentBattleMessage
+	scf
+	ret
+; 3d432
+
+EnemyMonFaintedAnimation: ; 3d432
+	hlcoord 12, 5
+	decoord 12, 6
+	jp MonFaintedAnimation
+; 3d43b
+
+PlayerMonFaintedAnimation: ; 3d43b
+	hlcoord 1, 10
+	decoord 1, 11
+	jp MonFaintedAnimation
+; 3d444
+
+MonFaintedAnimation: ; 3d444
+	ld a, [wcfbe]
+	push af
+	set 6, a
+	ld [wcfbe], a
+	ld b, 7
+
+.OuterLoop:
+	push bc
+	push de
+	push hl
+	ld b, 6
+
+.InnerLoop:
+	push bc
+	push hl
+	push de
+	ld bc, 7
+	call CopyBytes
+	pop de
+	pop hl
+	ld bc, -SCREEN_WIDTH
+	add hl, bc
+	push hl
+	ld h, d
+	ld l, e
+	add hl, bc
+	ld d, h
+	ld e, l
+	pop hl
+	pop bc
+	dec b
+	jr nz, .InnerLoop
+
+	ld bc, 20
+	add hl, bc
+	ld de, .Spaces
+	call PlaceString
+	ld c, 2
+	call DelayFrames
+	pop hl
+	pop de
+	pop bc
+	dec b
+	jr nz, .OuterLoop
+
+	pop af
+	ld [wcfbe], a
+	ret
+; 3d488
+
+.Spaces:
+	db "       @"
+; 3d490
+
+SlideBattlePicOut: ; 3d490
+	ld [hMapObjectIndexBuffer], a
+	ld c, a
+.loop
+	push bc
+	push hl
+	ld b, $7
+.loop2
+	push hl
+	call .DoFrame
+	pop hl
+	ld de, SCREEN_WIDTH
+	add hl, de
+	dec b
+	jr nz, .loop2
+	ld c, 2
+	call DelayFrames
+	pop hl
+	pop bc
+	dec c
+	jr nz, .loop
+	ret
+; 3d4ae
+
+.DoFrame: ; 3d4ae
+	ld a, [hMapObjectIndexBuffer]
+	ld c, a
+	cp $8
+	jr nz, .back
+.forward
+	ld a, [hli]
+	ld [hld], a
+	dec hl
+	dec c
+	jr nz, .forward
+	ret
+
+.back
+	ld a, [hld]
+	ld [hli], a
+	inc hl
+	dec c
+	jr nz, .back
+	ret
+; 3d4c3
+
+ForceEnemySwitch: ; 3d4c3
+	call ResetEnemyBattleVars
+	ld a, [wEnemySwitchMonIndex]
+	dec a
+	ld b, a
+	call LoadEnemyPkmnToSwitchTo
+	call ClearEnemyMonBox
+	call NewEnemyMonStatus
+	call ResetEnemyStatLevels
+	call Function_SetEnemyPkmnAndSendOutAnimation
+	call BreakAttraction
+	call ResetBattleParticipants
+	ret
+; 3d4e1
+
+EnemySwitch: ; 3d4e1
+	call CheckWhetherToAskSwitch
+	jr nc, EnemySwitch_SetMode
+	; Shift Mode
+	call ResetEnemyBattleVars
+	call CheckWhetherSwitchmonIsPredetermined
+	jr c, .skip
+	call FindPkmnInOTPartyToSwitchIntoBattle
+.skip
+	; 'b' contains the PartyNr of the Pkmn the AI will switch to
+	call LoadEnemyPkmnToSwitchTo
+	call OfferSwitch
+	push af
+	call ClearEnemyMonBox
+	call Function_BattleTextEnemySentOut
+	call Function_SetEnemyPkmnAndSendOutAnimation
+	pop af
+	ret c
+	; If we're here, then we're switching too
+	xor a
+	ld [wBattleParticipantsNotFainted], a
+	ld [wBattleParticipantsIncludingFainted], a
+	ld [wPlayerAction], a
+	inc a
+	ld [wEnemyIsSwitching], a
+	call LoadTileMapToTempTileMap
+	jp PlayerSwitch
+; 3d517
+
+EnemySwitch_SetMode: ; 3d517
+	call ResetEnemyBattleVars
+	call CheckWhetherSwitchmonIsPredetermined
+	jr c, .skip
+	call FindPkmnInOTPartyToSwitchIntoBattle
+.skip
+	; 'b' contains the PartyNr of the Pkmn the AI will switch to
+	call LoadEnemyPkmnToSwitchTo
+	ld a, 1
+	ld [wEnemyIsSwitching], a
+	call ClearEnemyMonBox
+	call Function_BattleTextEnemySentOut
+	jp Function_SetEnemyPkmnAndSendOutAnimation
+; 3d533
+
+CheckWhetherSwitchmonIsPredetermined: ; 3d533
+; returns carry if: ???
+	ld a, [wLinkMode]
+	and a
+	jr z, .not_linked
+
+	ld a, [wBattleAction]
+	sub BATTLEACTION_SWITCH1
+	ld b, a
+	jr .return_carry
+
+.not_linked
+	ld a, [wEnemySwitchMonIndex]
+	and a
+	jr z, .check_wBattleHasJustStarted
+
+	dec a
+	ld b, a
+	jr .return_carry
+
+.check_wBattleHasJustStarted
+	ld a, [wBattleHasJustStarted]
+	and a
+	ld b, $0
+	jr nz, .return_carry
+
+	and a
+	ret
+
+.return_carry
+	scf
+	ret
+; 3d557
+
+ResetEnemyBattleVars: ; 3d557
+; and draw empty TextBox
+	xor a
+	ld [LastPlayerCounterMove], a
+	ld [LastEnemyCounterMove], a
+	ld [LastEnemyMove], a
+	ld [CurEnemyMove], a
+	dec a
+	ld [wEnemyItemState], a
+	xor a
+	ld [wPlayerWrapCount], a
+	hlcoord 18, 0
+	ld a, 8
+	call SlideBattlePicOut
+	call EmptyBattleTextBox
+	jp LoadStandardMenuDataHeader
+; 3d57a
+
+ResetBattleParticipants: ; 3d57a
+	xor a
+	ld [wBattleParticipantsNotFainted], a
+	ld [wBattleParticipantsIncludingFainted], a
+AddBattleParticipant: ; 3d581
+	ld a, [CurBattleMon]
+	ld c, a
+	ld hl, wBattleParticipantsNotFainted
+	ld b, SET_FLAG
+	push bc
+	predef FlagPredef
+	pop bc
+	ld hl, wBattleParticipantsIncludingFainted
+	predef_jump FlagPredef
+; 3d599
+
+FindPkmnInOTPartyToSwitchIntoBattle: ; 3d599
+	ld b, $ff
+	ld a, $1
+	ld [Buffer1], a
+	ld [Buffer2], a
+.loop
+	ld hl, Buffer1
+	sla [hl]
+	inc hl
+	sla [hl]
+	inc b
+	ld a, [OTPartyCount]
+	cp b
+	jp z, ScoreMonTypeMatchups
+	ld a, [CurOTMon]
+	cp b
+	jr z, .discourage
+	ld hl, OTPartyMon1HP
+	push bc
+	ld a, b
+	call GetPartyLocation
+	ld a, [hli]
+	ld c, a
+	ld a, [hl]
+	or c
+	pop bc
+	jr z, .discourage
+	call LookUpTheEffectivenessOfEveryMove
+	call IsThePlayerPkmnTypesEffectiveAgainstOTPkmn
+	jr .loop
+
+.discourage
+	ld hl, Buffer2
+	set 0, [hl]
+	jr .loop
+; 3d5d7
+
+LookUpTheEffectivenessOfEveryMove: ; 3d5d7
+	push bc
+	ld hl, OTPartyMon1Moves
+	ld a, b
+	call GetPartyLocation
+	pop bc
+	ld e, NUM_MOVES + 1
+.loop
+	dec e
+	jr z, .done
+	ld a, [hli]
+	and a
+	jr z, .done
+	push hl
+	push de
+	push bc
+	dec a
+	ld hl, Moves
+	ld bc, MOVE_LENGTH
+	call AddNTimes
+	ld de, wEnemyMoveStruct
+	ld a, BANK(Moves)
+	call FarCopyBytes
+	call SetEnemyTurn
+	callfar BattleCheckTypeMatchup
+	pop bc
+	pop de
+	pop hl
+	ld a, [wd265] ; Get The Effectiveness Modifier
+	cp 10 + 1 ; 1.0 + 0.1
+	jr c, .loop
+	ld hl, Buffer1
+	set 0, [hl]
+	ret
+.done
+	ret
+; 3d618
+
+IsThePlayerPkmnTypesEffectiveAgainstOTPkmn: ; 3d618
+; Calculates the effectiveness of the types of the PlayerPkmn
+; against the OTPkmn
+	push bc
+	ld hl, OTPartyCount
+	ld a, b
+	inc a
+	ld c, a
+	ld b, 0
+	add hl, bc
+	ld a, [hl]
+	dec a
+	ld hl, BaseData + BASE_TYPES
+	ld bc, BASE_DATA_SIZE
+	call AddNTimes
+	ld de, EnemyMonType
+	ld bc, BASE_CATCH_RATE - BASE_TYPES
+	ld a, BANK(BaseData)
+	call FarCopyBytes
+	ld a, [BattleMonType1]
+	ld [wPlayerMoveStruct + MOVE_TYPE], a
+	call SetPlayerTurn
+	callfar BattleCheckTypeMatchup
+	ld a, [wd265]
+	cp 10 + 1 ; 1.0 + 0.1
+	jr nc, .super_effective
+	ld a, [BattleMonType2]
+	ld [wPlayerMoveStruct + MOVE_TYPE], a
+	callfar BattleCheckTypeMatchup
+	ld a, [wd265]
+	cp 10 + 1 ; 1.0 + 0.1
+	jr nc, .super_effective
+	pop bc
+	ret
+
+.super_effective
+	pop bc
+	ld hl, Buffer1
+	bit 0, [hl]
+	jr nz, .reset
+	inc hl
+	set 0, [hl]
+	ret
+
+.reset
+	res 0, [hl]
+	ret
+; 3d672
+
+ScoreMonTypeMatchups: ; 3d672
+.loop1
+	ld hl, Buffer1
+	sla [hl]
+	inc hl
+	sla [hl]
+	jr nc, .loop1
+	ld a, [OTPartyCount]
+	ld b, a
+	ld c, [hl]
+.loop2
+	sla c
+	jr nc, .okay
+	dec b
+	jr z, .loop5
+	jr .loop2
+
+.okay
+	ld a, [Buffer1]
+	and a
+	jr z, .okay2
+	ld b, $ff
+	ld c, a
+.loop3
+	inc b
+	sla c
+	jr nc, .loop3
+	jr .quit
+
+.okay2
+	ld b, $ff
+	ld a, [Buffer2]
+	ld c, a
+.loop4
+	inc b
+	sla c
+	jr c, .loop4
+	jr .quit
+
+.loop5
+	ld a, [OTPartyCount]
+	ld b, a
+	call BattleRandom
+	and $7
+	cp b
+	jr nc, .loop5
+	ld b, a
+	ld a, [CurOTMon]
+	cp b
+	jr z, .loop5
+	ld hl, OTPartyMon1HP
+	push bc
+	ld a, b
+	call GetPartyLocation
+	pop bc
+	ld a, [hli]
+	ld c, a
+	ld a, [hl]
+	or c
+	jr z, .loop5
+
+.quit
+	ret
+; 3d6ca
+
+LoadEnemyPkmnToSwitchTo: ; 3d6ca
+	; 'b' contains the PartyNr of the Pkmn the AI will switch to
+	ld a, b
+	ld [CurPartyMon], a
+	ld hl, OTPartyMon1Level
+	call GetPartyLocation
+	ld a, [hl]
+	ld [CurPartyLevel], a
+	ld a, [CurPartyMon]
+	inc a
+	ld hl, OTPartyCount
+	ld c, a
+	ld b, 0
+	add hl, bc
+	ld a, [hl]
+	ld [TempEnemyMonSpecies], a
+	ld [CurPartySpecies], a
+	call LoadEnemyMon
+
+	ld a, [CurPartySpecies]
+	cp UNOWN
+	jr nz, .skip_unown
+	ld a, [wFirstUnownSeen]
+	and a
+	jr nz, .skip_unown
+	ld hl, EnemyMonDVs
+	predef GetUnownLetter
+	ld a, [UnownLetter]
+	ld [wFirstUnownSeen], a
+.skip_unown
+
+	ld hl, EnemyMonHP
+	ld a, [hli]
+	ld [wEnemyHPAtTimeOfPlayerSwitch], a
+	ld a, [hl]
+	ld [wEnemyHPAtTimeOfPlayerSwitch + 1], a
+	ret
+; 3d714
+
+CheckWhetherToAskSwitch: ; 3d714
+	ld a, [wBattleHasJustStarted]
+	dec a
+	jp z, .return_nc
+	ld a, [PartyCount]
+	dec a
+	jp z, .return_nc
+	ld a, [wLinkMode]
+	and a
+	jp nz, .return_nc
+	ld a, [Options]
+	bit BATTLE_SHIFT, a
+	jr nz, .return_nc
+	ld a, [CurPartyMon]
+	push af
+	ld a, [CurBattleMon]
+	ld [CurPartyMon], a
+	farcall CheckCurPartyMonFainted
+	pop bc
+	ld a, b
+	ld [CurPartyMon], a
+	jr c, .return_nc
+	scf
+	ret
+
+.return_nc
+	and a
+	ret
+; 3d74b
+
+OfferSwitch: ; 3d74b
+	ld a, [CurPartyMon]
+	push af
+	callfar Battle_GetTrainerName
+	ld hl, BattleText_EnemyIsAboutToUseWillPlayerChangePkmn
+	call StdBattleTextBox
+	lb bc, 1, 7
+	call PlaceYesNoBox
+	ld a, [wMenuCursorY]
+	dec a
+	jr nz, .said_no
+	call SetUpBattlePartyMenu_NoLoop
+	call PickSwitchMonInBattle
+	jr c, .canceled_switch
+	ld a, [CurBattleMon]
+	ld [LastPlayerMon], a
+	ld a, [CurPartyMon]
+	ld [CurBattleMon], a
+	call ClearPalettes
+	call DelayFrame
+	call _LoadHPBar
+	pop af
+	ld [CurPartyMon], a
+	xor a
+	ld [CurEnemyMove], a
+	ld [CurPlayerMove], a
+	and a
+	ret
+
+.canceled_switch
+	call ClearPalettes
+	call DelayFrame
+	call _LoadHPBar
+
+.said_no
+	pop af
+	ld [CurPartyMon], a
+	scf
+	ret
+; 3d7a0
+
+ClearEnemyMonBox: ; 3d7a0
+	xor a
+	ld [hBGMapMode], a
+	call ExitMenu
+	call ClearSprites
+	hlcoord 1, 0
+	lb bc, 4, 10
+	call ClearBox
+	call WaitBGMap
+	jp FinishBattleAnim
+; 3d7b8
+
+Function_BattleTextEnemySentOut: ; 3d7b8
+	callfar Battle_GetTrainerName
+	ld hl, BattleText_EnemySentOut
+	call StdBattleTextBox
+	jp WaitBGMap
+; 3d7c7
+
+Function_SetEnemyPkmnAndSendOutAnimation: ; 3d7c7
+	ld a, [TempEnemyMonSpecies]
+	ld [CurPartySpecies], a
+	ld [CurSpecies], a
+	call GetBaseData
+	ld a, OTPARTYMON
+	ld [MonType], a
+	predef CopyPkmnToTempMon
+	call GetEnemyMonFrontpic
+
+	xor a
+	ld [wNumHits], a
+	ld [wBattleAnimParam], a
+	call SetEnemyTurn
+	ld de, ANIM_SEND_OUT_MON
+	call Call_PlayBattleAnim
+
+	call BattleCheckEnemyShininess
+	jr nc, .not_shiny
+	ld a, 1 ; shiny anim
+	ld [wBattleAnimParam], a
+	ld de, ANIM_SEND_OUT_MON
+	call Call_PlayBattleAnim
+.not_shiny
+
+	ld bc, TempMonSpecies
+	farcall CheckFaintedFrzSlp
+	jr c, .skip_cry
+	farcall CheckBattleScene
+	jr c, .cry_no_anim
+	hlcoord 12, 0
+	ld d, $0
+	ld e, ANIM_MON_SLOW
+	predef AnimateFrontpic
+	jr .skip_cry
+
+.cry_no_anim
+	ld a, $f
+	ld [CryTracks], a
+	ld a, [TempEnemyMonSpecies]
+	call PlayStereoCry
+
+.skip_cry
+	call UpdateEnemyHUD
+	ld a, $1
+	ld [hBGMapMode], a
+	ret
+; 3d834
+
+NewEnemyMonStatus: ; 3d834
+	xor a
+	ld [LastPlayerCounterMove], a
+	ld [LastEnemyCounterMove], a
+	ld [LastEnemyMove], a
+	ld hl, EnemySubStatus1
+rept 4
+	ld [hli], a
+endr
+	ld [hl], a
+	ld [EnemyDisableCount], a
+	ld [EnemyFuryCutterCount], a
+	ld [EnemyProtectCount], a
+	ld [wEnemyRageCounter], a
+	ld [EnemyDisabledMove], a
+	ld [wEnemyMinimized], a
+	ld [wPlayerWrapCount], a
+	ld [wEnemyWrapCount], a
+	ld [EnemyTurnsTaken], a
+	ld hl, PlayerSubStatus5
+	res SUBSTATUS_CANT_RUN, [hl]
+	ret
+; 3d867
+
+ResetEnemyStatLevels: ; 3d867
+	ld a, BASE_STAT_LEVEL
+	ld b, NUM_LEVEL_STATS
+	ld hl, EnemyStatLevels
+.loop
+	ld [hli], a
+	dec b
+	jr nz, .loop
+	ret
+; 3d873
+
+CheckPlayerPartyForFitPkmn: ; 3d873
+; Has the player any Pkmn in his Party that can fight?
+	ld a, [PartyCount]
+	ld e, a
+	xor a
+	ld hl, PartyMon1HP
+	ld bc, PartyMon2 - (PartyMon1 + 1)
+.loop
+	or [hl]
+	inc hl
+	or [hl]
+	add hl, bc
+	dec e
+	jr nz, .loop
+	ld d, a
+	ret
+; 3d887
+
+CheckIfCurPartyMonIsFitToFight: ; 3d887
+	ld a, [CurPartyMon]
+	ld hl, PartyMon1HP
+	call GetPartyLocation
+	ld a, [hli]
+	or [hl]
+	ret nz
+
+	ld a, [wBattleHasJustStarted]
+	and a
+	jr nz, .finish_fail
+	ld hl, PartySpecies
+	ld a, [CurPartyMon]
+	ld c, a
+	ld b, 0
+	add hl, bc
+	ld a, [hl]
+	cp EGG
+	ld hl, BattleText_AnEGGCantBattle
+	jr z, .print_textbox
+
+	ld hl, BattleText_TheresNoWillToBattle
+
+.print_textbox
+	call StdBattleTextBox
+
+.finish_fail
+	xor a
+	ret
+; 3d8b3
+
+TryToRunAwayFromBattle: ; 3d8b3
+; Run away from battle, with or without item
+	ld a, [BattleType]
+	cp BATTLETYPE_DEBUG
+	jp z, .can_escape
+	cp BATTLETYPE_CONTEST
+	jp z, .can_escape
+	cp BATTLETYPE_TRAP
+	jp z, .cant_escape
+	cp BATTLETYPE_CELEBI
+	jp z, .cant_escape
+	cp BATTLETYPE_SHINY
+	jp z, .cant_escape
+	cp BATTLETYPE_SUICUNE
+	jp z, .cant_escape
+
+	ld a, [wLinkMode]
+	and a
+	jp nz, .can_escape
+
+	ld a, [wBattleMode]
+	dec a
+	jp nz, .cant_run_from_trainer
+
+	ld a, [EnemySubStatus5]
+	bit SUBSTATUS_CANT_RUN, a
+	jp nz, .cant_escape
+
+	ld a, [wPlayerWrapCount]
+	and a
+	jp nz, .cant_escape
+
+	push hl
+	push de
+	ld a, [BattleMonItem]
+	ld [wd265], a
+	ld b, a
+	callfar GetItemHeldEffect
+	ld a, b
+	cp HELD_ESCAPE
+	pop de
+	pop hl
+	jr nz, .no_flee_item
+
+	call SetPlayerTurn
+	call GetItemName
+	ld hl, BattleText_UserFledUsingAStringBuffer1
+	call StdBattleTextBox
+	jp .can_escape
+
+.no_flee_item
+	ld a, [wNumFleeAttempts]
+	inc a
+	ld [wNumFleeAttempts], a
+	ld a, [hli]
+	ld [hStringCmpString2 + 0], a
+	ld a, [hl]
+	ld [hStringCmpString2 + 1], a
+	ld a, [de]
+	inc de
+	ld [hStringCmpString1 + 0], a
+	ld a, [de]
+	ld [hStringCmpString1 + 1], a
+	call Call_LoadTempTileMapToTileMap
+	ld de, hStringCmpString2
+	ld hl, hStringCmpString1
+	ld c, $2
+	call StringCmp
+	jr nc, .can_escape
+
+	xor a
+	ld [hMultiplicand], a
+	ld a, $20
+	ld [hMultiplier], a
+	call Multiply
+	ld a, [hProduct + 2]
+	ld [hDividend + 0], a
+	ld a, [hProduct + 3]
+	ld [hDividend + 1], a
+	ld a, [hStringCmpString1 + 0]
+	ld b, a
+	ld a, [hStringCmpString1 + 1]
+	srl b
+	rr a
+	srl b
+	rr a
+	and a
+	jr z, .can_escape
+	ld [hDivisor], a
+	ld b, 2
+	call Divide
+	ld a, [hQuotient + 1]
+	and a
+	jr nz, .can_escape
+	ld a, [wNumFleeAttempts]
+	ld c, a
+.loop
+	dec c
+	jr z, .cant_escape_2
+	ld b, 30
+	ld a, [hQuotient + 2]
+	add b
+	ld [hQuotient + 2], a
+	jr c, .can_escape
+	jr .loop
+
+.cant_escape_2
+	call BattleRandom
+	ld b, a
+	ld a, [hQuotient + 2]
+	cp b
+	jr nc, .can_escape
+	ld a, $1
+	ld [wPlayerAction], a
+	ld hl, BattleText_CantEscape2
+	jr .print_inescapable_text
+
+.cant_escape
+	ld hl, BattleText_CantEscape
+	jr .print_inescapable_text
+
+.cant_run_from_trainer
+	ld hl, BattleText_TheresNoEscapeFromTrainerBattle
+
+.print_inescapable_text
+	call StdBattleTextBox
+	ld a, $1
+	ld [wFailedToFlee], a
+	call LoadTileMapToTempTileMap
+	and a
+	ret
+
+.can_escape
+	ld a, [wLinkMode]
+	and a
+	ld a, DRAW
+	jr z, .fled
+	call LoadTileMapToTempTileMap
+	xor a
+	ld [wPlayerAction], a
+	ld a, $f
+	ld [CurMoveNum], a
+	xor a
+	ld [CurPlayerMove], a
+	call LinkBattleSendReceiveAction
+	call Call_LoadTempTileMapToTileMap
+	call CheckMobileBattleError
+	jr c, .mobile
+
+	; Got away safely
+	ld a, [wBattleAction]
+	cp BATTLEACTION_FORFEIT
+	ld a, DRAW
+	jr z, .fled
+	dec a
+.fled
+	ld b, a
+	ld a, [wBattleResult]
+	and $c0
+	add b
+	ld [wBattleResult], a
+	call StopDangerSound
+	push de
+	ld de, SFX_RUN
+	call WaitPlaySFX
+	pop de
+	call WaitSFX
+	ld hl, BattleText_GotAwaySafely
+	call StdBattleTextBox
+	call WaitSFX
+	call LoadTileMapToTempTileMap
+	scf
+	ret
+
+.mobile
+	call StopDangerSound
+	ld hl, wcd2a
+	bit 4, [hl]
+	jr nz, .skip_link_error
+	ld hl, BattleText_LinkErrorBattleCanceled
+	call StdBattleTextBox
+
+.skip_link_error
+	call WaitSFX
+	call LoadTileMapToTempTileMap
+	scf
+	ret
+; 3da0d
+
+InitBattleMon: ; 3da0d
+	ld a, MON_SPECIES
+	call GetPartyParamLocation
+	ld de, BattleMonSpecies
+	ld bc, MON_ID
+	call CopyBytes
+	ld bc, MON_DVS - MON_ID
+	add hl, bc
+	ld de, BattleMonDVs
+	ld bc, MON_PKRUS - MON_DVS
+	call CopyBytes
+	inc hl
+	inc hl
+	inc hl
+	ld de, BattleMonLevel
+	ld bc, PARTYMON_STRUCT_LENGTH - MON_LEVEL
+	call CopyBytes
+	ld a, [BattleMonSpecies]
+	ld [TempBattleMonSpecies], a
+	ld [CurPartySpecies], a
+	ld [CurSpecies], a
+	call GetBaseData
+	ld a, [BaseType1]
+	ld [BattleMonType1], a
+	ld a, [BaseType2]
+	ld [BattleMonType2], a
+	ld hl, PartyMonNicknames
+	ld a, [CurBattleMon]
+	call SkipNames
+	ld de, BattleMonNick
+	ld bc, PKMN_NAME_LENGTH
+	call CopyBytes
+	ld hl, BattleMonAttack
+	ld de, PlayerStats
+	ld bc, PARTYMON_STRUCT_LENGTH - MON_ATK
+	call CopyBytes
+	call ApplyStatusEffectOnPlayerStats
+	call BadgeStatBoosts
+	ret
+; 3da74
+
+BattleCheckPlayerShininess: ; 3da74
+	call GetPartyMonDVs
+	jr BattleCheckShininess
+
+BattleCheckEnemyShininess: ; 3da79
+	call GetEnemyMonDVs
+
+BattleCheckShininess: ; 3da7c
+	ld b, h
+	ld c, l
+	callfar CheckShininess
+	ret
+; 3da85
+
+GetPartyMonDVs: ; 3da85
+	ld hl, BattleMonDVs
+	ld a, [PlayerSubStatus5]
+	bit SUBSTATUS_TRANSFORMED, a
+	ret z
+	ld hl, PartyMon1DVs
+	ld a, [CurBattleMon]
+	jp GetPartyLocation
+; 3da97
+
+GetEnemyMonDVs: ; 3da97
+	ld hl, EnemyMonDVs
+	ld a, [EnemySubStatus5]
+	bit SUBSTATUS_TRANSFORMED, a
+	ret z
+	ld hl, wEnemyBackupDVs
+	ld a, [wBattleMode]
+	dec a
+	ret z
+	ld hl, OTPartyMon1DVs
+	ld a, [CurOTMon]
+	jp GetPartyLocation
+; 3dab1
+
+ResetPlayerStatLevels: ; 3dab1
+	ld a, BASE_STAT_LEVEL
+	ld b, NUM_LEVEL_STATS
+	ld hl, PlayerStatLevels
+.loop
+	ld [hli], a
+	dec b
+	jr nz, .loop
+	ret
+; 3dabd
+
+InitEnemyMon: ; 3dabd
+	ld a, [CurPartyMon]
+	ld hl, OTPartyMon1Species
+	call GetPartyLocation
+	ld de, EnemyMonSpecies
+	ld bc, MON_ID
+	call CopyBytes
+	ld bc, MON_DVS - MON_ID
+	add hl, bc
+	ld de, EnemyMonDVs
+	ld bc, MON_PKRUS - MON_DVS
+	call CopyBytes
+	inc hl
+	inc hl
+	inc hl
+	ld de, EnemyMonLevel
+	ld bc, PARTYMON_STRUCT_LENGTH - MON_LEVEL
+	call CopyBytes
+	ld a, [EnemyMonSpecies]
+	ld [CurSpecies], a
+	call GetBaseData
+	ld hl, OTPartyMonNicknames
+	ld a, [CurPartyMon]
+	call SkipNames
+	ld de, EnemyMonNick
+	ld bc, PKMN_NAME_LENGTH
+	call CopyBytes
+	ld hl, EnemyMonAttack
+	ld de, EnemyStats
+	ld bc, PARTYMON_STRUCT_LENGTH - MON_ATK
+	call CopyBytes
+	call ApplyStatusEffectOnEnemyStats
+	ld hl, BaseType1
+	ld de, EnemyMonType1
+	ld a, [hli]
+	ld [de], a
+	inc de
+	ld a, [hl]
+	ld [de], a
+	ld hl, BaseStats
+	ld de, EnemyMonBaseStats
+	ld b, 5
+.loop
+	ld a, [hli]
+	ld [de], a
+	inc de
+	dec b
+	jr nz, .loop
+	ld a, [CurPartyMon]
+	ld [CurOTMon], a
+	ret
+; 3db32
+
+SwitchPlayerMon: ; 3db32
+	call ClearSprites
+	ld a, [CurBattleMon]
+	ld [LastPlayerMon], a
+	ld a, [CurPartyMon]
+	ld [CurBattleMon], a
+	call AddBattleParticipant
+	call InitBattleMon
+	call ResetPlayerStatLevels
+	call NewBattleMonStatus
+	call BreakAttraction
+	call SendOutPlayerMon
+	call EmptyBattleTextBox
+	call LoadTileMapToTempTileMap
+	ld hl, EnemyMonHP
+	ld a, [hli]
+	or [hl]
+	ret
+; 3db5f
+
+SendOutPlayerMon: ; 3db5f
+	ld hl, BattleMonDVs
+	predef GetUnownLetter
+	hlcoord 1, 5
+	ld b, 7
+	ld c, 8
+	call ClearBox
+	call WaitBGMap
+	xor a
+	ld [hBGMapMode], a
+	call GetBattleMonBackpic
+	xor a
+	ld [hGraphicStartTile], a
+	ld [wBattleMenuCursorBuffer], a
+	ld [CurMoveNum], a
+	ld [TypeModifier], a
+	ld [wPlayerMoveStruct + MOVE_ANIM], a
+	ld [LastPlayerCounterMove], a
+	ld [LastEnemyCounterMove], a
+	ld [LastPlayerMove], a
+	call CheckAmuletCoin
+	call FinishBattleAnim
+	xor a
+	ld [wEnemyWrapCount], a
+	call SetPlayerTurn
+	xor a
+	ld [wNumHits], a
+	ld [wBattleAnimParam], a
+	ld de, ANIM_SEND_OUT_MON
+	call Call_PlayBattleAnim
+	call BattleCheckPlayerShininess
+	jr nc, .not_shiny
+	ld a, 1
+	ld [wBattleAnimParam], a
+	ld de, ANIM_SEND_OUT_MON
+	call Call_PlayBattleAnim
+
+.not_shiny
+	ld a, MON_SPECIES
+	call GetPartyParamLocation
+	ld b, h
+	ld c, l
+	farcall CheckFaintedFrzSlp
+	jr c, .statused
+	ld a, $f0
+	ld [CryTracks], a
+	ld a, [CurPartySpecies]
+	call PlayStereoCry
+
+.statused
+	call UpdatePlayerHUD
+	ld a, $1
+	ld [hBGMapMode], a
+	ret
+; 3dbde
+
+NewBattleMonStatus: ; 3dbde
+	xor a
+	ld [LastPlayerCounterMove], a
+	ld [LastEnemyCounterMove], a
+	ld [LastPlayerMove], a
+	ld hl, PlayerSubStatus1
+rept 4
+	ld [hli], a
+endr
+	ld [hl], a
+	ld hl, PlayerUsedMoves
+	ld [hli], a
+	ld [hli], a
+	ld [hli], a
+	ld [hl], a
+	ld [PlayerDisableCount], a
+	ld [PlayerFuryCutterCount], a
+	ld [PlayerProtectCount], a
+	ld [wPlayerRageCounter], a
+	ld [DisabledMove], a
+	ld [wPlayerMinimized], a
+	ld [wEnemyWrapCount], a
+	ld [wPlayerWrapCount], a
+	ld [PlayerTurnsTaken], a
+	ld hl, EnemySubStatus5
+	res SUBSTATUS_CANT_RUN, [hl]
+	ret
+; 3dc18
+
+BreakAttraction: ; 3dc18
+	ld hl, PlayerSubStatus1
+	res SUBSTATUS_IN_LOVE, [hl]
+	ld hl, EnemySubStatus1
+	res SUBSTATUS_IN_LOVE, [hl]
+	ret
+; 3dc23
+
+SpikesDamage: ; 3dc23
+	ld hl, PlayerScreens
+	ld de, BattleMonType
+	ld bc, UpdatePlayerHUD
+	ld a, [hBattleTurn]
+	and a
+	jr z, .ok
+	ld hl, EnemyScreens
+	ld de, EnemyMonType
+	ld bc, UpdateEnemyHUD
+.ok
+
+	bit SCREENS_SPIKES, [hl]
+	ret z
+
+	; Flying-types aren't affected by Spikes.
+	ld a, [de]
+	cp FLYING
+	ret z
+	inc de
+	ld a, [de]
+	cp FLYING
+	ret z
+
+	push bc
+
+	ld hl, BattleText_UserHurtBySpikes ; "hurt by SPIKES!"
+	call StdBattleTextBox
+
+	call GetEighthMaxHP
+	call SubtractHPFromTarget
+
+	pop hl
+	call .hl
+
+	jp WaitBGMap
+
+.hl
+	jp hl
+; 3dc5b
+
+PursuitSwitch: ; 3dc5b
+	ld a, BATTLE_VARS_MOVE
+	call GetBattleVar
+	ld b, a
+	call GetMoveEffect
+	ld a, b
+	cp EFFECT_PURSUIT
+	jr nz, .done
+
+	ld a, [CurBattleMon]
+	push af
+
+	ld hl, DoPlayerTurn
+	ld a, [hBattleTurn]
+	and a
+	jr z, .do_turn
+	ld hl, DoEnemyTurn
+	ld a, [LastPlayerMon]
+	ld [CurBattleMon], a
+.do_turn
+	ld a, BANK(DoPlayerTurn)
+	rst FarCall
+
+	ld a, BATTLE_VARS_MOVE
+	call GetBattleVarAddr
+	ld a, $ff
+	ld [hl], a
+
+	pop af
+	ld [CurBattleMon], a
+
+	ld a, [hBattleTurn]
+	and a
+	jr z, .check_enemy_fainted
+
+	ld a, [LastPlayerMon]
+	call UpdateBattleMon
+	ld hl, BattleMonHP
+	ld a, [hli]
+	or [hl]
+	jr nz, .done
+
+	ld a, $f0
+	ld [CryTracks], a
+	ld a, [BattleMonSpecies]
+	call PlayStereoCry
+	ld a, [LastPlayerMon]
+	ld c, a
+	ld hl, wBattleParticipantsNotFainted
+	ld b, RESET_FLAG
+	predef FlagPredef
+	call PlayerMonFaintedAnimation
+	ld hl, BattleText_PkmnFainted
+	jr .done_fainted
+
+.check_enemy_fainted
+	ld hl, EnemyMonHP
+	ld a, [hli]
+	or [hl]
+	jr nz, .done
+
+	ld de, SFX_KINESIS
+	call PlaySFX
+	call WaitSFX
+	ld de, SFX_FAINT
+	call PlaySFX
+	call WaitSFX
+	call EnemyMonFaintedAnimation
+	ld hl, BattleText_EnemyPkmnFainted
+
+.done_fainted
+	call StdBattleTextBox
+	scf
+	ret
+
+.done
+	and a
+	ret
+; 3dce6
+
+RecallPlayerMon: ; 3dce6
+	ld a, [hBattleTurn]
+	push af
+	xor a
+	ld [hBattleTurn], a
+	ld [wNumHits], a
+	ld de, ANIM_RETURN_MON
+	call Call_PlayBattleAnim
+	pop af
+	ld [hBattleTurn], a
+	ret
+; 3dcf9
+
+HandleHealingItems: ; 3dcf9
+	ld a, [hLinkPlayerNumber]
+	cp $1
+	jr z, .player_1
+	call SetPlayerTurn
+	call HandleHPHealingItem
+	call UseHeldStatusHealingItem
+	call UseConfusionHealingItem
+	call SetEnemyTurn
+	call HandleHPHealingItem
+	call UseHeldStatusHealingItem
+	jp UseConfusionHealingItem
+
+.player_1
+	call SetEnemyTurn
+	call HandleHPHealingItem
+	call UseHeldStatusHealingItem
+	call UseConfusionHealingItem
+	call SetPlayerTurn
+	call HandleHPHealingItem
+	call UseHeldStatusHealingItem
+	jp UseConfusionHealingItem
+; 3dd2f
+
+HandleHPHealingItem: ; 3dd2f
+	callfar GetOpponentItem
+	ld a, b
+	cp HELD_BERRY
+	ret nz
+	ld de, EnemyMonHP + 1
+	ld hl, EnemyMonMaxHP
+	ld a, [hBattleTurn]
+	and a
+	jr z, .go
+	ld de, BattleMonHP + 1
+	ld hl, BattleMonMaxHP
+
+.go
+; If, and only if, Pokemon's HP is less than half max, use the item.
+; Store current HP in Buffer 3/4
+	push bc
+	ld a, [de]
+	ld [Buffer3], a
+	add a
+	ld c, a
+	dec de
+	ld a, [de]
+	inc de
+	ld [Buffer4], a
+	adc a
+	ld b, a
+	ld a, b
+	cp [hl]
+	ld a, c
+	pop bc
+	jr z, .equal
+	jr c, .less
+	ret
+
+.equal
+	inc hl
+	cp [hl]
+	dec hl
+	ret nc
+
+.less
+	call ItemRecoveryAnim
+	; store max HP in Buffer1/2
+	ld a, [hli]
+	ld [Buffer2], a
+	ld a, [hl]
+	ld [Buffer1], a
+	ld a, [de]
+	add c
+	ld [Buffer5], a
+	ld c, a
+	dec de
+	ld a, [de]
+	adc $0
+	ld [Buffer6], a
+	ld b, a
+	ld a, [hld]
+	cp c
+	ld a, [hl]
+	sbc b
+	jr nc, .okay
+	ld a, [hli]
+	ld [Buffer6], a
+	ld a, [hl]
+	ld [Buffer5], a
+
+.okay
+	ld a, [Buffer6]
+	ld [de], a
+	inc de
+	ld a, [Buffer5]
+	ld [de], a
+	ld a, [hBattleTurn]
+	ld [wWhichHPBar], a
+	and a
+	hlcoord 2, 2
+	jr z, .got_hp_bar_coords
+	hlcoord 10, 9
+
+.got_hp_bar_coords
+	ld [wWhichHPBar], a
+	predef AnimateHPBar
+UseOpponentItem:
+	call RefreshBattleHuds
+	callfar GetOpponentItem
+	ld a, [hl]
+	ld [wNamedObjectIndexBuffer], a
+	call GetItemName
+	callfar ConsumeHeldItem
+	ld hl, RecoveredUsingText
+	jp StdBattleTextBox
+; 3ddc8
+
+ItemRecoveryAnim: ; 3ddc8
+	push hl
+	push de
+	push bc
+	call EmptyBattleTextBox
+	ld a, RECOVER
+	ld [FXAnimID], a
+	call SwitchTurnCore
+	xor a
+	ld [wNumHits], a
+	ld [FXAnimID + 1], a
+	predef PlayBattleAnim
+	call SwitchTurnCore
+	pop bc
+	pop de
+	pop hl
+	ret
+; 3dde9
+
+UseHeldStatusHealingItem: ; 3dde9
+	callfar GetOpponentItem
+	ld hl, .Statuses
+.loop
+	ld a, [hli]
+	cp $ff
+	ret z
+	inc hl
+	cp b
+	jr nz, .loop
+	dec hl
+	ld b, [hl]
+	ld a, BATTLE_VARS_STATUS_OPP
+	call GetBattleVarAddr
+	and b
+	ret z
+	xor a
+	ld [hl], a
+	push bc
+	call UpdateOpponentInParty
+	pop bc
+	ld a, BATTLE_VARS_SUBSTATUS5_OPP
+	call GetBattleVarAddr
+	and [hl]
+	res SUBSTATUS_TOXIC, [hl]
+	ld a, BATTLE_VARS_SUBSTATUS1_OPP
+	call GetBattleVarAddr
+	and [hl]
+	res SUBSTATUS_NIGHTMARE, [hl]
+	ld a, b
+	cp ALL_STATUS
+	jr nz, .skip_confuse
+	ld a, BATTLE_VARS_SUBSTATUS3_OPP
+	call GetBattleVarAddr
+	res SUBSTATUS_CONFUSED, [hl]
+
+.skip_confuse
+	ld hl, CalcEnemyStats
+	ld a, [hBattleTurn]
+	and a
+	jr z, .got_pointer
+	ld hl, CalcPlayerStats
+
+.got_pointer
+	call SwitchTurnCore
+	ld a, BANK(CalcEnemyStats)
+	rst FarCall
+	call SwitchTurnCore
+	call ItemRecoveryAnim
+	call UseOpponentItem
+	ld a, $1
+	and a
+	ret
+; 3de44
+
+.Statuses: ; 3de44
+	db HELD_HEAL_POISON, 1 << PSN
+	db HELD_HEAL_FREEZE, 1 << FRZ
+	db HELD_HEAL_BURN, 1 << BRN
+	db HELD_HEAL_SLEEP, SLP
+	db HELD_HEAL_PARALYZE, 1 << PAR
+	db HELD_HEAL_STATUS, ALL_STATUS
+	db $ff
+; 3de51
+
+UseConfusionHealingItem: ; 3de51
+	ld a, BATTLE_VARS_SUBSTATUS3_OPP
+	call GetBattleVar
+	bit SUBSTATUS_CONFUSED, a
+	ret z
+	callfar GetOpponentItem
+	ld a, b
+	cp HELD_HEAL_CONFUSION
+	jr z, .heal_status
+	cp HELD_HEAL_STATUS
+	ret nz
+
+.heal_status
+	ld a, [hl]
+	ld [wd265], a
+	ld a, BATTLE_VARS_SUBSTATUS3_OPP
+	call GetBattleVarAddr
+	res SUBSTATUS_CONFUSED, [hl]
+	call GetItemName
+	call ItemRecoveryAnim
+	ld hl, BattleText_ItemHealedConfusion
+	call StdBattleTextBox
+	ld a, [hBattleTurn]
+	and a
+	jr nz, .do_partymon
+	call GetOTPartymonItem
+	xor a
+	ld [bc], a
+	ld a, [wBattleMode]
+	dec a
+	ret z
+	ld [hl], $0
+	ret
+
+.do_partymon
+	call GetPartymonItem
+	xor a
+	ld [bc], a
+	ld [hl], a
+	ret
+; 3de97
+
+HandleStatBoostingHeldItems: ; 3de97
+; The effects handled here are not used in-game.
+	ld a, [hLinkPlayerNumber]
+	cp $1
+	jr z, .player_1
+	call .DoPlayer
+	jp .DoEnemy
+
+.player_1
+	call .DoEnemy
+	jp .DoPlayer
+; 3dea9
+
+.DoPlayer: ; 3dea9
+	call GetPartymonItem
+	ld a, $0
+	jp .HandleItem
+; 3deb1
+
+.DoEnemy: ; 3deb1
+	call GetOTPartymonItem
+	ld a, $1
+.HandleItem: ; 3deb6
+	ld [hBattleTurn], a
+	ld d, h
+	ld e, l
+	push de
+	push bc
+	ld a, [bc]
+	ld b, a
+	callfar GetItemHeldEffect
+	ld hl, .StatUpItems
+.loop
+	ld a, [hli]
+	cp $ff
+	jr z, .finish
+	inc hl
+	inc hl
+	cp b
+	jr nz, .loop
+	pop bc
+	ld a, [bc]
+	ld [wd265], a
+	push bc
+	dec hl
+	dec hl
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	ld a, BANK(BattleCommand_AttackUp)
+	rst FarCall
+	pop bc
+	pop de
+	ld a, [FailedMessage]
+	and a
+	ret nz
+	xor a
+	ld [bc], a
+	ld [de], a
+	call GetItemName
+	ld hl, BattleText_UsersStringBuffer1Activated
+	call StdBattleTextBox
+	callfar BattleCommand_StatUpMessage
+	ret
+
+.finish
+	pop bc
+	pop de
+	ret
+; 3defc
+
+.StatUpItems:
+	dbw HELD_ATTACK_UP,     BattleCommand_AttackUp
+	dbw HELD_DEFENSE_UP,    BattleCommand_DefenseUp
+	dbw HELD_SPEED_UP,      BattleCommand_SpeedUp
+	dbw HELD_SP_ATTACK_UP,  BattleCommand_SpecialAttackUp
+	dbw HELD_SP_DEFENSE_UP, BattleCommand_SpecialDefenseUp
+	dbw HELD_ACCURACY_UP,   BattleCommand_AccuracyUp
+	dbw HELD_EVASION_UP,    BattleCommand_EvasionUp
+	db $ff
+; 3df12
+
+GetPartymonItem: ; 3df12
+	ld hl, PartyMon1Item
+	ld a, [CurBattleMon]
+	call GetPartyLocation
+	ld bc, BattleMonItem
+	ret
+; 3df1f
+
+GetOTPartymonItem: ; 3df1f
+	ld hl, OTPartyMon1Item
+	ld a, [CurOTMon]
+	call GetPartyLocation
+	ld bc, EnemyMonItem
+	ret
+; 3df2c
+
+UpdateBattleHUDs: ; 3df2c
+	push hl
+	push de
+	push bc
+	call DrawPlayerHUD
+	ld hl, PlayerHPPal
+	call SetHPPal
+	call CheckDanger
+	call DrawEnemyHUD
+	ld hl, EnemyHPPal
+	call SetHPPal
+	pop bc
+	pop de
+	pop hl
+	ret
+; 3df48
+
+UpdatePlayerHUD:: ; 3df48
+	push hl
+	push de
+	push bc
+	call DrawPlayerHUD
+	call UpdatePlayerHPPal
+	call CheckDanger
+	pop bc
+	pop de
+	pop hl
+	ret
+; 3df58
+
+DrawPlayerHUD: ; 3df58
+	xor a
+	ld [hBGMapMode], a
+
+	; Clear the area
+	hlcoord 9, 7
+	lb bc, 5, 11
+	call ClearBox
+
+	farcall DrawPlayerHUDBorder
+
+	hlcoord 18, 9
+	ld [hl], $73 ; vertical bar
+	call PrintPlayerHUD
+
+	; HP bar
+	hlcoord 10, 9
+	ld b, 1
+	xor a ; PARTYMON
+	ld [MonType], a
+	predef DrawPlayerHP
+
+	; Exp bar
+	push de
+	ld a, [CurBattleMon]
+	ld hl, PartyMon1Exp + 2
+	call GetPartyLocation
+	ld d, h
+	ld e, l
+
+	hlcoord 10, 11
+	ld a, [TempMonLevel]
+	ld b, a
+	call FillInExpBar
+	pop de
+	ret
+; 3df98
+
+UpdatePlayerHPPal: ; 3df98
+	ld hl, PlayerHPPal
+	jp UpdateHPPal
+; 3df9e
+
+CheckDanger: ; 3df9e
+	ld hl, BattleMonHP
+	ld a, [hli]
+	or [hl]
+	jr z, .no_danger
+	ld a, [wDanger]
+	and a
+	jr nz, .done
+	ld a, [PlayerHPPal]
+	cp HP_RED
+	jr z, .danger
+
+.no_danger
+	ld hl, Danger
+	res DANGER_ON_F, [hl]
+	jr .done
+
+.danger
+	ld hl, Danger
+	set DANGER_ON_F, [hl]
+
+.done
+	ret
+; 3dfbf
+
+PrintPlayerHUD: ; 3dfbf
+	ld de, BattleMonNick
+	hlcoord 10, 7
+	call ret_3e138
+	call PlaceString
+
+	push bc
+
+	ld a, [CurBattleMon]
+	ld hl, PartyMon1DVs
+	call GetPartyLocation
+	ld de, TempMonDVs
+	ld a, [hli]
+	ld [de], a
+	inc de
+	ld a, [hl]
+	ld [de], a
+	ld hl, BattleMonLevel
+	ld de, TempMonLevel
+	ld bc, $0011
+	call CopyBytes
+	ld a, [CurBattleMon]
+	ld hl, PartyMon1Species
+	call GetPartyLocation
+	ld a, [hl]
+	ld [CurPartySpecies], a
+	ld [CurSpecies], a
+	call GetBaseData
+
+	pop hl
+	dec hl
+
+	ld a, TEMPMON
+	ld [MonType], a
+	callfar GetGender
+	ld a, " "
+	jr c, .got_gender_char
+	ld a, "♂"
+	jr nz, .got_gender_char
+	ld a, "♀"
+
+.got_gender_char
+	hlcoord 17, 8
+	ld [hl], a
+	hlcoord 14, 8
+	push af ; back up gender
+	push hl
+	ld de, BattleMonStatus
+	predef PlaceNonFaintStatus
+	pop hl
+	pop bc
+	ret nz
+	ld a, b
+	cp " "
+	jr nz, .copy_level ; male or female
+	dec hl ; genderless
+
+.copy_level
+	ld a, [BattleMonLevel]
+	ld [TempMonLevel], a
+	jp PrintLevel
+; 3e036
+
+UpdateEnemyHUD:: ; 3e036
+	push hl
+	push de
+	push bc
+	call DrawEnemyHUD
+	call UpdateEnemyHPPal
+	pop bc
+	pop de
+	pop hl
+	ret
+; 3e043
+
+DrawEnemyHUD: ; 3e043
+	xor a
+	ld [hBGMapMode], a
+
+	hlcoord 1, 0
+	lb bc, 4, 11
+	call ClearBox
+
+	farcall DrawEnemyHUDBorder
+
+	ld a, [TempEnemyMonSpecies]
+	ld [CurSpecies], a
+	ld [CurPartySpecies], a
+	call GetBaseData
+	ld de, EnemyMonNick
+	hlcoord 1, 0
+	call ret_3e138
+	call PlaceString
+	ld h, b
+	ld l, c
+	dec hl
+
+	ld hl, EnemyMonDVs
+	ld de, TempMonDVs
+	ld a, [EnemySubStatus5]
+	bit SUBSTATUS_TRANSFORMED, a
+	jr z, .ok
+	ld hl, wEnemyBackupDVs
+.ok
+	ld a, [hli]
+	ld [de], a
+	inc de
+	ld a, [hl]
+	ld [de], a
+
+	ld a, TEMPMON
+	ld [MonType], a
+	callfar GetGender
+	ld a, " "
+	jr c, .got_gender
+	ld a, "♂"
+	jr nz, .got_gender
+	ld a, "♀"
+
+.got_gender
+	hlcoord 9, 1
+	ld [hl], a
+
+	hlcoord 6, 1
+	push af
+	push hl
+	ld de, EnemyMonStatus
+	predef PlaceNonFaintStatus
+	pop hl
+	pop bc
+	jr nz, .skip_level
+	ld a, b
+	cp " "
+	jr nz, .print_level
+	dec hl
+.print_level
+	ld a, [EnemyMonLevel]
+	ld [TempMonLevel], a
+	call PrintLevel
+.skip_level
+
+	ld hl, EnemyMonHP
+	ld a, [hli]
+	ld [hMultiplicand + 1], a
+	ld a, [hld]
+	ld [hMultiplicand + 2], a
+	or [hl]
+	jr nz, .not_fainted
+
+	ld c, a
+	ld e, a
+	ld d, HP_BAR_LENGTH
+	jp .draw_bar
+
+.not_fainted
+	xor a
+	ld [hMultiplicand], a
+	ld a, HP_BAR_LENGTH_PX
+	ld [hMultiplier], a
+	call Multiply
+	ld hl, EnemyMonMaxHP
+	ld a, [hli]
+	ld b, a
+	ld a, [hl]
+	ld [hMultiplier], a
+	ld a, b
+	and a
+	jr z, .less_than_256_max
+	ld a, [hMultiplier]
+	srl b
+	rr a
+	srl b
+	rr a
+	ld [hDivisor], a
+	ld a, [hProduct + 2]
+	ld b, a
+	srl b
+	ld a, [hProduct + 3]
+	rr a
+	srl b
+	rr a
+	ld [hProduct + 3], a
+	ld a, b
+	ld [hProduct + 2], a
+
+.less_than_256_max
+	ld a, [hProduct + 2]
+	ld [hDividend + 0], a
+	ld a, [hProduct + 3]
+	ld [hDividend + 1], a
+	ld a, 2
+	ld b, a
+	call Divide
+	ld a, [hQuotient + 2]
+	ld e, a
+	ld a, HP_BAR_LENGTH
+	ld d, a
+	ld c, a
+
+.draw_bar
+	xor a
+	ld [wWhichHPBar], a
+	hlcoord 2, 2
+	ld b, 0
+	call DrawBattleHPBar
+	ret
+; 3e127
+
+UpdateEnemyHPPal: ; 3e127
+	ld hl, EnemyHPPal
+	call UpdateHPPal
+	ret
+; 3e12e
+
+UpdateHPPal: ; 3e12e
+	ld b, [hl]
+	call SetHPPal
+	ld a, [hl]
+	cp b
+	ret z
+	jp FinishBattleAnim
+; 3e138
+
+ret_3e138: ; 3e138
+	ret
+; 3e139
+
+BattleMenu: ; 3e139
+	xor a
+	ld [hBGMapMode], a
+	call LoadTempTileMapToTileMap
+
+	ld a, [BattleType]
+	cp BATTLETYPE_DEBUG
+	jr z, .ok
+	cp BATTLETYPE_TUTORIAL
+	jr z, .ok
+	call EmptyBattleTextBox
+	call UpdateBattleHuds
+	call EmptyBattleTextBox
+	call LoadTileMapToTempTileMap
+.ok
+
+.loop
+	ld a, [BattleType]
+	cp BATTLETYPE_CONTEST
+	jr nz, .not_contest
+	farcall ContestBattleMenu
+	jr .next
+.not_contest
+
+	; Auto input: choose "ITEM"
+	ld a, [InputType]
+	or a
+	jr z, .skip_dude_pack_select
+	farcall _DudeAutoInput_DownA
+.skip_dude_pack_select
+	call LoadBattleMenu2
+	ret c
+
+.next
+	ld a, $1
+	ld [hBGMapMode], a
+	ld a, [wBattleMenuCursorBuffer]
+	cp $1
+	jp z, BattleMenu_Fight
+	cp $3
+	jp z, BattleMenu_Pack
+	cp $2
+	jp z, BattleMenu_PKMN
+	cp $4
+	jp z, BattleMenu_Run
+	jr .loop
+; 3e192
+
+BattleMenu_Fight: ; 3e192
+	xor a
+	ld [wNumFleeAttempts], a
+	call Call_LoadTempTileMapToTileMap
+	and a
+	ret
+; 3e19b
+
+LoadBattleMenu2: ; 3e19b
+	call IsMobileBattle
+	jr z, .mobile
+
+	farcall LoadBattleMenu
+	and a
+	ret
+
+.mobile
+	farcall Function100b12
+	ld a, [wcd2b]
+	and a
+	ret z
+
+	ld hl, wcd2a
+	bit 4, [hl]
+	jr nz, .error
+	ld hl, BattleText_LinkErrorBattleCanceled
+	call StdBattleTextBox
+	ld c, 60
+	call DelayFrames
+.error
+	scf
+	ret
+; 3e1c7
+
+BattleMenu_Pack: ; 3e1c7
+	ld a, [wLinkMode]
+	and a
+	jp nz, .ItemsCantBeUsed
+
+	ld a, [InBattleTowerBattle]
+	and a
+	jp nz, .ItemsCantBeUsed
+
+	call LoadStandardMenuDataHeader
+
+	ld a, [BattleType]
+	cp BATTLETYPE_TUTORIAL
+	jr z, .tutorial
+	cp BATTLETYPE_CONTEST
+	jr z, .contest
+
+	farcall BattlePack
+	ld a, [wPlayerAction]
+	and a
+	jr z, .didnt_use_item
+	jr .got_item
+
+.tutorial
+	farcall TutorialPack
+	ld a, POKE_BALL
+	ld [CurItem], a
+	call DoItemEffect
+	jr .got_item
+
+.contest
+	ld a, PARK_BALL
+	ld [CurItem], a
+	call DoItemEffect
+
+.got_item
+	call .UseItem
+	ret
+
+.didnt_use_item
+	call ClearPalettes
+	call DelayFrame
+	call _LoadBattleFontsHPBar
+	call GetBattleMonBackpic
+	call GetEnemyMonFrontpic
+	call ExitMenu
+	call WaitBGMap
+	call FinishBattleAnim
+	call LoadTileMapToTempTileMap
+	jp BattleMenu
+; 3e22b
+
+.ItemsCantBeUsed: ; 3e22b
+	ld hl, BattleText_ItemsCantBeUsedHere
+	call StdBattleTextBox
+	jp BattleMenu
+; 3e234
+
+.UseItem: ; 3e234
+	ld a, [wWildMon]
+	and a
+	jr nz, .run
+	callfar CheckItemPocket
+	ld a, [wItemAttributeParamBuffer]
+	cp BALL
+	jr z, .ball
+	call ClearBGPalettes
+
+.ball
+	xor a
+	ld [hBGMapMode], a
+	call _LoadBattleFontsHPBar
+	call ClearSprites
+	ld a, [BattleType]
+	cp BATTLETYPE_TUTORIAL
+	jr z, .tutorial2
+	call GetBattleMonBackpic
+
+.tutorial2
+	call GetEnemyMonFrontpic
+	ld a, $1
+	ld [wMenuCursorY], a
+	call ExitMenu
+	call UpdateBattleHUDs
+	call WaitBGMap
+	call LoadTileMapToTempTileMap
+	call ClearWindowData
+	call FinishBattleAnim
+	and a
+	ret
+
+.run
+	xor a
+	ld [wWildMon], a
+	ld a, [wBattleResult]
+	and $c0
+	ld [wBattleResult], a
+	call ClearWindowData
+	call SetPalettes
+	scf
+	ret
+; 3e28d
+
+BattleMenu_PKMN: ; 3e28d
+	call LoadStandardMenuDataHeader
+BattleMenuPKMN_ReturnFromStats:
+	call ExitMenu
+	call LoadStandardMenuDataHeader
+	call ClearBGPalettes
+BattleMenuPKMN_Loop:
+	call SetUpBattlePartyMenu
+	xor a
+	ld [PartyMenuActionText], a
+	call JumpToPartyMenuAndPrintText
+	call SelectBattleMon
+	jr c, .Cancel
+.loop
+	farcall FreezeMonIcons
+	call .GetMenu
+	jr c, .PressedB
+	call PlaceHollowCursor
+	ld a, [wMenuCursorY]
+	cp $1 ; SWITCH
+	jp z, TryPlayerSwitch
+	cp $2 ; STATS
+	jr z, .Stats
+	cp $3 ; CANCEL
+	jr z, .Cancel
+	jr .loop
+
+.PressedB:
+	call CheckMobileBattleError
+	jr c, .Cancel
+	jr BattleMenuPKMN_Loop
+
+.Stats:
+	call Battle_StatsScreen
+	call CheckMobileBattleError
+	jr c, .Cancel
+	jp BattleMenuPKMN_ReturnFromStats
+
+.Cancel:
+	call ClearSprites
+	call ClearPalettes
+	call DelayFrame
+	call _LoadHPBar
+	call CloseWindow
+	call LoadTileMapToTempTileMap
+	call GetMemSGBLayout
+	call SetPalettes
+	jp BattleMenu
+; 3e2f5
+
+.GetMenu: ; 3e2f5
+	call IsMobileBattle
+	jr z, .mobile
+	farcall BattleMonMenu
+	ret
+
+.mobile
+	farcall MobileBattleMonMenu
+	ret
+; 3e308
+
+Battle_StatsScreen: ; 3e308
+	call DisableLCD
+
+	ld hl, VTiles2 tile $31
+	ld de, VTiles0
+	ld bc, $11 tiles
+	call CopyBytes
+
+	ld hl, VTiles2
+	ld de, VTiles0 tile $11
+	ld bc, $31 tiles
+	call CopyBytes
+
+	call EnableLCD
+
+	call ClearSprites
+	call LowVolume
+	xor a ; PARTYMON
+	ld [MonType], a
+	farcall BattleStatsScreenInit
+	call MaxVolume
+
+	call DisableLCD
+
+	ld hl, VTiles0
+	ld de, VTiles2 tile $31
+	ld bc, $11 tiles
+	call CopyBytes
+
+	ld hl, VTiles0 tile $11
+	ld de, VTiles2
+	ld bc, $31 tiles
+	call CopyBytes
+
+	call EnableLCD
+	ret
+; 3e358
+
+TryPlayerSwitch: ; 3e358
+	ld a, [CurBattleMon]
+	ld d, a
+	ld a, [CurPartyMon]
+	cp d
+	jr nz, .check_trapped
+	ld hl, BattleText_PkmnIsAlreadyOut
+	call StdBattleTextBox
+	jp BattleMenuPKMN_Loop
+
+.check_trapped
+	ld a, [wPlayerWrapCount]
+	and a
+	jr nz, .trapped
+	ld a, [EnemySubStatus5]
+	bit SUBSTATUS_CANT_RUN, a
+	jr z, .try_switch
+
+.trapped
+	ld hl, BattleText_PkmnCantBeRecalled
+	call StdBattleTextBox
+	jp BattleMenuPKMN_Loop
+
+.try_switch
+	call CheckIfCurPartyMonIsFitToFight
+	jp z, BattleMenuPKMN_Loop
+	ld a, [CurBattleMon]
+	ld [LastPlayerMon], a
+	ld a, $2
+	ld [wPlayerAction], a
+	call ClearPalettes
+	call DelayFrame
+	call ClearSprites
+	call _LoadHPBar
+	call CloseWindow
+	call GetMemSGBLayout
+	call SetPalettes
+	ld a, [CurPartyMon]
+	ld [CurBattleMon], a
+PlayerSwitch: ; 3e3ad
+	ld a, 1
+	ld [wPlayerIsSwitching], a
+	ld a, [wLinkMode]
+	and a
+	jr z, .not_linked
+	call LoadStandardMenuDataHeader
+	call LinkBattleSendReceiveAction
+	call CloseWindow
+
+.not_linked
+	call ParseEnemyAction
+	ld a, [wLinkMode]
+	and a
+	jr nz, .linked
+
+.switch
+	call BattleMonEntrance
+	and a
+	ret
+
+.linked
+	ld a, [wBattleAction]
+	cp BATTLEACTION_E
+	jp z, .switch
+	cp BATTLEACTION_D
+	jp z, .switch
+	cp BATTLEACTION_SWITCH1
+	jp c, .switch
+	cp BATTLEACTION_FORFEIT
+	jr nz, .dont_run
+	call WildFled_EnemyFled_LinkBattleCanceled
+	ret
+
+.dont_run
+	ld a, [hLinkPlayerNumber]
+	cp $1
+	jr z, .player_1
+	call BattleMonEntrance
+	call EnemyMonEntrance
+	and a
+	ret
+
+.player_1
+	call EnemyMonEntrance
+	call BattleMonEntrance
+	and a
+	ret
+; 3e3ff
+
+EnemyMonEntrance: ; 3e3ff
+	callfar AI_Switch
+	call SetEnemyTurn
+	jp SpikesDamage
+; 3e40b
+
+BattleMonEntrance: ; 3e40b
+	call WithdrawPkmnText
+
+	ld c, 50
+	call DelayFrames
+
+	ld hl, PlayerSubStatus4
+	res SUBSTATUS_RAGE, [hl]
+
+	call SetEnemyTurn
+	call PursuitSwitch
+	jr c, .ok
+	call RecallPlayerMon
+.ok
+
+	hlcoord 9, 7
+	lb bc, 5, 11
+	call ClearBox
+
+	ld a, [CurBattleMon]
+	ld [CurPartyMon], a
+	call AddBattleParticipant
+	call InitBattleMon
+	call ResetPlayerStatLevels
+	call SendOutPkmnText
+	call NewBattleMonStatus
+	call BreakAttraction
+	call SendOutPlayerMon
+	call EmptyBattleTextBox
+	call LoadTileMapToTempTileMap
+	call SetPlayerTurn
+	call SpikesDamage
+	ld a, $2
+	ld [wMenuCursorY], a
+	ret
+; 3e459
+
+PassedBattleMonEntrance: ; 3e459
+	ld c, 50
+	call DelayFrames
+
+	hlcoord 9, 7
+	lb bc, 5, 11
+	call ClearBox
+
+	ld a, [CurPartyMon]
+	ld [CurBattleMon], a
+	call AddBattleParticipant
+	call InitBattleMon
+	xor a
+	ld [wd265], a
+	call ApplyStatLevelMultiplierOnAllStats
+	call SendOutPlayerMon
+	call EmptyBattleTextBox
+	call LoadTileMapToTempTileMap
+	call SetPlayerTurn
+	jp SpikesDamage
+; 3e489
+
+BattleMenu_Run: ; 3e489
+	call Call_LoadTempTileMapToTileMap
+	ld a, $3
+	ld [wMenuCursorY], a
+	ld hl, BattleMonSpeed
+	ld de, EnemyMonSpeed
+	call TryToRunAwayFromBattle
+	ld a, $0
+	ld [wFailedToFlee], a
+	ret c
+	ld a, [wPlayerAction]
+	and a
+	ret nz
+	jp BattleMenu
+; 3e4a8
+
+CheckAmuletCoin: ; 3e4a8
+	ld a, [BattleMonItem]
+	ld b, a
+	callfar GetItemHeldEffect
+	ld a, b
+	cp HELD_AMULET_COIN
+	ret nz
+	ld a, 1
+	ld [wAmuletCoin], a
+	ret
+; 3e4bc
+
+MoveSelectionScreen: ; 3e4bc
+	call IsMobileBattle
+	jr nz, .not_mobile
+	farcall MobileMoveSelectionScreen
+	ret
+
+.not_mobile
+	ld hl, EnemyMonMoves
+	ld a, [wMoveSelectionMenuType]
+	dec a
+	jr z, .got_menu_type
+	dec a
+	jr z, .ether_elixer_menu
+	call CheckPlayerHasUsableMoves
+	ret z ; use Struggle
+	ld hl, BattleMonMoves
+	jr .got_menu_type
+
+.ether_elixer_menu
+	ld a, MON_MOVES
+	call GetPartyParamLocation
+
+.got_menu_type
+	ld de, wListMoves_MoveIndicesBuffer
+	ld bc, NUM_MOVES
+	call CopyBytes
+	xor a
+	ld [hBGMapMode], a
+
+	hlcoord 4, 17 - NUM_MOVES - 1
+	ld b, 4
+	ld c, 14
+	ld a, [wMoveSelectionMenuType]
+	cp $2
+	jr nz, .got_dims
+	hlcoord 4, 17 - NUM_MOVES - 1 - 4
+	ld b, 4
+	ld c, 14
+.got_dims
+	call TextBox
+
+	hlcoord 6, 17 - NUM_MOVES
+	ld a, [wMoveSelectionMenuType]
+	cp $2
+	jr nz, .got_start_coord
+	hlcoord 6, 17 - NUM_MOVES - 4
+.got_start_coord
+	ld a, SCREEN_WIDTH
+	ld [Buffer1], a
+	predef ListMoves
+
+	ld b, 5
+	ld a, [wMoveSelectionMenuType]
+	cp $2
+	ld a, 17 - NUM_MOVES
+	jr nz, .got_default_coord
+	ld b, 5
+	ld a, 17 - NUM_MOVES - 4
+
+.got_default_coord
+	ld [w2DMenuCursorInitY], a
+	ld a, b
+	ld [w2DMenuCursorInitX], a
+	ld a, [wMoveSelectionMenuType]
+	cp $1
+	jr z, .skip_inc
+	ld a, [CurMoveNum]
+	inc a
+
+.skip_inc
+	ld [wMenuCursorY], a
+	ld a, $1
+	ld [wMenuCursorX], a
+	ld a, [wNumMoves]
+	inc a
+	ld [w2DMenuNumRows], a
+	ld a, $1
+	ld [w2DMenuNumCols], a
+	ld c, $2c
+	ld a, [wMoveSelectionMenuType]
+	dec a
+	ld b, D_DOWN | D_UP | A_BUTTON
+	jr z, .okay
+	dec a
+	ld b, D_DOWN | D_UP | A_BUTTON | B_BUTTON
+	jr z, .okay
+	ld a, [wLinkMode]
+	and a
+	jr nz, .okay
+	ld b, D_DOWN | D_UP | A_BUTTON | B_BUTTON | SELECT
+
+.okay
+	ld a, b
+	ld [wMenuJoypadFilter], a
+	ld a, c
+	ld [w2DMenuFlags1], a
+	xor a
+	ld [w2DMenuFlags2], a
+	ld a, $10
+	ld [w2DMenuCursorOffsets], a
+.menu_loop
+	ld a, [wMoveSelectionMenuType]
+	and a
+	jr z, .battle_player_moves
+	dec a
+	jr nz, .interpret_joypad
+	hlcoord 11, 14
+	ld de, .string_3e61c
+	call PlaceString
+	jr .interpret_joypad
+
+.battle_player_moves
+	call MoveInfoBox
+	ld a, [wMoveSwapBuffer]
+	and a
+	jr z, .interpret_joypad
+	hlcoord 5, 13
+	ld bc, SCREEN_WIDTH
+	dec a
+	call AddNTimes
+	ld [hl], "▷"
+
+.interpret_joypad
+	ld a, $1
+	ld [hBGMapMode], a
+	call ScrollingMenuJoypad
+	bit D_UP_F, a
+	jp nz, .pressed_up
+	bit D_DOWN_F, a
+	jp nz, .pressed_down
+	bit SELECT_F, a
+	jp nz, .pressed_select
+	bit B_BUTTON_F, a
+	; A button
+	push af
+
+	xor a
+	ld [wMoveSwapBuffer], a
+	ld a, [wMenuCursorY]
+	dec a
+	ld [wMenuCursorY], a
+	ld b, a
+	ld a, [wMoveSelectionMenuType]
+	dec a
+	jr nz, .not_enemy_moves_process_b
+
+	pop af
+	ret
+
+.not_enemy_moves_process_b
+	dec a
+	ld a, b
+	ld [CurMoveNum], a
+	jr nz, .use_move
+
+	pop af
+	ret
+
+.use_move
+	pop af
+	ret nz
+
+	ld hl, BattleMonPP
+	ld a, [wMenuCursorY]
+	ld c, a
+	ld b, 0
+	add hl, bc
+	ld a, [hl]
+	and $3f
+	jr z, .no_pp_left
+	ld a, [PlayerDisableCount]
+	swap a
+	and $f
+	dec a
+	cp c
+	jr z, .move_disabled
+	ld a, [wUnusedPlayerLockedMove]
+	and a
+	jr nz, .skip2
+	ld a, [wMenuCursorY]
+	ld hl, BattleMonMoves
+	ld c, a
+	ld b, 0
+	add hl, bc
+	ld a, [hl]
+
+.skip2
+	ld [CurPlayerMove], a
+	xor a
+	ret
+
+.move_disabled
+	ld hl, BattleText_TheMoveIsDisabled
+	jr .place_textbox_start_over
+
+.no_pp_left
+	ld hl, BattleText_TheresNoPPLeftForThisMove
+
+.place_textbox_start_over
+	call StdBattleTextBox
+	call Call_LoadTempTileMapToTileMap
+	jp MoveSelectionScreen
+; 3e61c
+
+.string_3e61c ; 3e61c
+	db "@"
+; 3e61d
+
+.pressed_up
+	ld a, [wMenuCursorY]
+	and a
+	jp nz, .menu_loop
+	ld a, [wNumMoves]
+	inc a
+	ld [wMenuCursorY], a
+	jp .menu_loop
+; 3e62e
+
+.pressed_down ; 3e62e
+	ld a, [wMenuCursorY]
+	ld b, a
+	ld a, [wNumMoves]
+	inc a
+	inc a
+	cp b
+	jp nz, .menu_loop
+	ld a, $1
+	ld [wMenuCursorY], a
+	jp .menu_loop
+; 3e643
+
+.pressed_select ; 3e643
+	ld a, [wMoveSwapBuffer]
+	and a
+	jr z, .start_swap
+	ld hl, BattleMonMoves
+	call .swap_bytes
+	ld hl, BattleMonPP
+	call .swap_bytes
+	ld hl, PlayerDisableCount
+	ld a, [hl]
+	swap a
+	and $f
+	ld b, a
+	ld a, [wMenuCursorY]
+	cp b
+	jr nz, .not_swapping_disabled_move
+	ld a, [hl]
+	and $f
+	ld b, a
+	ld a, [wMoveSwapBuffer]
+	swap a
+	add b
+	ld [hl], a
+	jr .swap_moves_in_party_struct
+
+.not_swapping_disabled_move
+	ld a, [wMoveSwapBuffer]
+	cp b
+	jr nz, .swap_moves_in_party_struct
+	ld a, [hl]
+	and $f
+	ld b, a
+	ld a, [wMenuCursorY]
+	swap a
+	add b
+	ld [hl], a
+
+.swap_moves_in_party_struct
+; Fixes the COOLTRAINER glitch
+	ld a, [PlayerSubStatus5]
+	bit SUBSTATUS_TRANSFORMED, a
+	jr nz, .transformed
+	ld hl, PartyMon1Moves
+	ld a, [CurBattleMon]
+	call GetPartyLocation
+	push hl
+	call .swap_bytes
+	pop hl
+	ld bc, MON_PP - MON_MOVES
+	add hl, bc
+	call .swap_bytes
+
+.transformed
+	xor a
+	ld [wMoveSwapBuffer], a
+	jp MoveSelectionScreen
+
+.swap_bytes
+	push hl
+	ld a, [wMoveSwapBuffer]
+	dec a
+	ld c, a
+	ld b, 0
+	add hl, bc
+	ld d, h
+	ld e, l
+	pop hl
+	ld a, [wMenuCursorY]
+	dec a
+	ld c, a
+	ld b, 0
+	add hl, bc
+	ld a, [de]
+	ld b, [hl]
+	ld [hl], a
+	ld a, b
+	ld [de], a
+	ret
+
+.start_swap
+	ld a, [wMenuCursorY]
+	ld [wMoveSwapBuffer], a
+	jp MoveSelectionScreen
+; 3e6c8
+
+MoveInfoBox: ; 3e6c8
+	xor a
+	ld [hBGMapMode], a
+
+	hlcoord 0, 8
+	ld b, 3
+	ld c, 9
+	call TextBox
+	call MobileTextBorder
+
+	ld a, [PlayerDisableCount]
+	and a
+	jr z, .not_disabled
+
+	swap a
+	and $f
+	ld b, a
+	ld a, [wMenuCursorY]
+	cp b
+	jr nz, .not_disabled
+
+	hlcoord 1, 10
+	ld de, .Disabled
+	call PlaceString
+	jr .done
+
+.not_disabled
+	ld hl, wMenuCursorY
+	dec [hl]
+	call SetPlayerTurn
+	ld hl, BattleMonMoves
+	ld a, [wMenuCursorY]
+	ld c, a
+	ld b, 0
+	add hl, bc
+	ld a, [hl]
+	ld [CurPlayerMove], a
+
+	ld a, [CurBattleMon]
+	ld [CurPartyMon], a
+	ld a, WILDMON
+	ld [MonType], a
+	callfar GetMaxPPOfMove
+
+	ld hl, wMenuCursorY
+	ld c, [hl]
+	inc [hl]
+	ld b, 0
+	ld hl, BattleMonPP
+	add hl, bc
+	ld a, [hl]
+	and $3f
+	ld [StringBuffer1], a
+	call .PrintPP
+
+	hlcoord 1, 9
+	ld de, .Type
+	call PlaceString
+
+	hlcoord 7, 11
+	ld [hl], "/"
+
+	callfar UpdateMoveData
+	ld a, [wPlayerMoveStruct + MOVE_ANIM]
+	ld b, a
+	hlcoord 2, 10
+	predef PrintMoveType
+
+.done
+	ret
+; 3e74f
+
+.Disabled:
+	db "Disabled!@"
+.Type:
+	db "TYPE/@"
+; 3e75f
+
+.PrintPP: ; 3e75f
+	hlcoord 5, 11
+	ld a, [wLinkMode] ; What's the point of this check?
+	cp LINK_MOBILE
+	jr c, .ok
+	hlcoord 5, 11
+.ok
+	push hl
+	ld de, StringBuffer1
+	lb bc, 1, 2
+	call PrintNum
+	pop hl
+	inc hl
+	inc hl
+	ld [hl], "/"
+	inc hl
+	ld de, wNamedObjectIndexBuffer
+	lb bc, 1, 2
+	call PrintNum
+	ret
+; 3e786
+
+CheckPlayerHasUsableMoves: ; 3e786
+	ld a, STRUGGLE
+	ld [CurPlayerMove], a
+	ld a, [PlayerDisableCount]
+	and a
+	ld hl, BattleMonPP
+	jr nz, .disabled
+
+	ld a, [hli]
+	or [hl]
+	inc hl
+	or [hl]
+	inc hl
+	or [hl]
+	and $3f
+	ret nz
+	jr .force_struggle
+
+.disabled
+	swap a
+	and $f
+	ld b, a
+	ld d, NUM_MOVES + 1
+	xor a
+.loop
+	dec d
+	jr z, .done
+	ld c, [hl]
+	inc hl
+	dec b
+	jr z, .loop
+	or c
+	jr .loop
+
+.done
+	; Bug: this will result in a move with PP Up confusing the game.
+	; Replace with "and $3f" to fix.
+	and a
+	ret nz
+
+.force_struggle
+	ld hl, BattleText_PkmnHasNoMovesLeft
+	call StdBattleTextBox
+	ld c, 60
+	call DelayFrames
+	xor a
+	ret
+; 3e7c1
+
+ParseEnemyAction: ; 3e7c1
+	ld a, [wEnemyIsSwitching]
+	and a
+	ret nz
+	ld a, [wLinkMode]
+	and a
+	jr z, .not_linked
+	call EmptyBattleTextBox
+	call LoadTileMapToTempTileMap
+	ld a, [wPlayerAction]
+	and a
+	call z, LinkBattleSendReceiveAction
+	call Call_LoadTempTileMapToTileMap
+	ld a, [wBattleAction]
+	cp BATTLEACTION_E
+	jp z, .struggle
+	cp BATTLEACTION_D
+	jp z, .battle_action_d
+	cp BATTLEACTION_SWITCH1
+	jp nc, ResetVarsForSubstatusRage
+	ld [CurEnemyMoveNum], a
+	ld c, a
+	ld a, [EnemySubStatus1]
+	bit SUBSTATUS_ROLLOUT, a
+	jp nz, .skip_load
+	ld a, [EnemySubStatus3]
+	and 1 << SUBSTATUS_CHARGED | 1 << SUBSTATUS_RAMPAGE | 1 << SUBSTATUS_BIDE
+	jp nz, .skip_load
+
+	ld hl, EnemySubStatus5
+	bit SUBSTATUS_ENCORED, [hl]
+	ld a, [LastEnemyMove]
+	jp nz, .finish
+	ld hl, EnemyMonMoves
+	ld b, 0
+	add hl, bc
+	ld a, [hl]
+	jp .finish
+
+.not_linked
+	ld hl, EnemySubStatus5
+	bit SUBSTATUS_ENCORED, [hl]
+	jr z, .skip_encore
+	ld a, [LastEnemyMove]
+	jp .finish
+
+.skip_encore
+	call CheckEnemyLockedIn
+	jp nz, ResetVarsForSubstatusRage
+	jr .continue
+
+.battle_action_d
+	ld a, $ff
+	jr .finish
+
+.continue
+	ld hl, EnemyMonMoves
+	ld de, EnemyMonPP
+	ld b, NUM_MOVES
+.loop
+	ld a, [hl]
+	and a
+	jp z, .struggle
+	ld a, [EnemyDisabledMove]
+	cp [hl]
+	jr z, .disabled
+	ld a, [de]
+	and $3f
+	jr nz, .enough_pp
+
+.disabled
+	inc hl
+	inc de
+	dec b
+	jr nz, .loop
+	jr .struggle
+
+.enough_pp
+	ld a, [wBattleMode]
+	dec a
+	jr nz, .skip_load
+; wild
+.loop2
+	ld hl, EnemyMonMoves
+	call BattleRandom
+	and 3 ; TODO factor in NUM_MOVES
+	ld c, a
+	ld b, 0
+	add hl, bc
+	ld a, [EnemyDisableCount]
+	swap a
+	and $f
+	dec a
+	cp c
+	jr z, .loop2
+	ld a, [hl]
+	and a
+	jr z, .loop2
+	ld hl, EnemyMonPP
+	add hl, bc
+	ld b, a
+	ld a, [hl]
+	and $3f
+	jr z, .loop2
+	ld a, c
+	ld [CurEnemyMoveNum], a
+	ld a, b
+
+.finish
+	ld [CurEnemyMove], a
+
+.skip_load
+	call SetEnemyTurn
+	callfar UpdateMoveData
+	call CheckEnemyLockedIn
+	jr nz, .raging
+	xor a
+	ld [wEnemyCharging], a
+
+.raging
+	ld a, [wEnemyMoveStruct + MOVE_EFFECT]
+	cp EFFECT_FURY_CUTTER
+	jr z, .fury_cutter
+	xor a
+	ld [EnemyFuryCutterCount], a
+
+.fury_cutter
+	ld a, [wEnemyMoveStruct + MOVE_EFFECT]
+	cp EFFECT_RAGE
+	jr z, .no_rage
+	ld hl, EnemySubStatus4
+	res SUBSTATUS_RAGE, [hl]
+	xor a
+	ld [wEnemyRageCounter], a
+
+.no_rage
+	ld a, [wEnemyMoveStruct + MOVE_EFFECT]
+	cp EFFECT_PROTECT
+	ret z
+	cp EFFECT_ENDURE
+	ret z
+	xor a
+	ld [EnemyProtectCount], a
+	ret
+
+.struggle
+	ld a, STRUGGLE
+	jr .finish
+; 3e8c1
+
+ResetVarsForSubstatusRage: ; 3e8c1
+	xor a
+	ld [EnemyFuryCutterCount], a
+	ld [EnemyProtectCount], a
+	ld [wEnemyRageCounter], a
+	ld hl, EnemySubStatus4
+	res SUBSTATUS_RAGE, [hl]
+	ret
+; 3e8d1
+
+CheckEnemyLockedIn: ; 3e8d1
+	ld a, [EnemySubStatus4]
+	and 1 << SUBSTATUS_RECHARGE
+	ret nz
+
+	ld hl, EnemySubStatus3
+	ld a, [hl]
+	and 1 << SUBSTATUS_CHARGED | 1 << SUBSTATUS_RAMPAGE | 1 << SUBSTATUS_BIDE
+	ret nz
+
+	ld hl, EnemySubStatus1
+	bit SUBSTATUS_ROLLOUT, [hl]
+	ret
+; 3e8e4
+
+LinkBattleSendReceiveAction: ; 3e8e4
+	farcall _LinkBattleSendReceiveAction
+	ret
+; 3e8eb
+
+LoadEnemyMon: ; 3e8eb
+; Initialize enemy monster parameters
+; To do this we pull the species from TempEnemyMonSpecies
+
+; Notes:
+;   BattleRandom is used to ensure sync between Game Boys
+
+; Clear the whole EnemyMon struct
+	xor a
+	ld hl, EnemyMonSpecies
+	ld bc, EnemyMonEnd - EnemyMon
+	call ByteFill
+
+; We don't need to be here if we're in a link battle
+	ld a, [wLinkMode]
+	and a
+	jp nz, InitEnemyMon
+
+; and also not in a BattleTower-Battle
+	ld a, [InBattleTowerBattle] ; ????
+	bit 0, a
+	jp nz, InitEnemyMon
+
+; Make sure everything knows what species we're working with
+	ld a, [TempEnemyMonSpecies]
+	ld [EnemyMonSpecies], a
+	ld [CurSpecies], a
+	ld [CurPartySpecies], a
+
+; Grab the BaseData for this species
+	call GetBaseData
+
+; Let's get the item:
+
+; Is the item predetermined?
+	ld a, [wBattleMode]
+	dec a
+	jr z, .WildItem
+
+; If we're in a trainer battle, the item is in the party struct
+	ld a, [CurPartyMon]
+	ld hl, OTPartyMon1Item
+	call GetPartyLocation ; bc = PartyMon[CurPartyMon] - PartyMons
+	ld a, [hl]
+	jr .UpdateItem
+
+.WildItem:
+; In a wild battle, we pull from the item slots in BaseData
+
+; Force Item1
+; Used for Ho-Oh, Lugia and Snorlax encounters
+	ld a, [BattleType]
+	cp BATTLETYPE_FORCEITEM
+	ld a, [BaseItems]
+	jr z, .UpdateItem
+
+; Failing that, it's all up to chance
+;  Effective chances:
+;    75% None
+;    23% Item1
+;     2% Item2
+
+; 25% chance of getting an item
+	call BattleRandom
+	cp 1 + (75 percent)
+	ld a, NO_ITEM
+	jr c, .UpdateItem
+
+; From there, an 8% chance for Item2
+	call BattleRandom
+	cp 8 percent ; 8% of 25% = 2% Item2
+	ld a, [BaseItems]
+	jr nc, .UpdateItem
+	ld a, [BaseItems+1]
+
+.UpdateItem:
+	ld [EnemyMonItem], a
+
+; Initialize DVs
+
+; If we're in a trainer battle, DVs are predetermined
+	ld a, [wBattleMode]
+	and a
+	jr z, .InitDVs
+
+	ld a, [EnemySubStatus5]
+	bit SUBSTATUS_TRANSFORMED, a
+	jr z, .InitDVs
+
+; Unknown
+	ld hl, wEnemyBackupDVs
+	ld de, EnemyMonDVs
+	ld a, [hli]
+	ld [de], a
+	inc de
+	ld a, [hl]
+	ld [de], a
+	jp .Happiness
+
+.InitDVs:
+
+; Trainer DVs
+
+; All trainers have preset DVs, determined by class
+; See GetTrainerDVs for more on that
+	farcall GetTrainerDVs
+; These are the DVs we'll use if we're actually in a trainer battle
+	ld a, [wBattleMode]
+	dec a
+	jr nz, .UpdateDVs
+
+; Wild DVs
+; Here's where the fun starts
+
+; Roaming monsters (Entei, Raikou) work differently
+; They have their own structs, which are shorter than normal
+	ld a, [BattleType]
+	cp BATTLETYPE_ROAMING
+	jr nz, .NotRoaming
+
+; Grab HP
+	call GetRoamMonHP
+	ld a, [hl]
+; Check if the HP has been initialized
+	and a
+; We'll do something with the result in a minute
+	push af
+
+; Grab DVs
+	call GetRoamMonDVs
+	inc hl
+	ld a, [hld]
+	ld c, a
+	ld b, [hl]
+
+; Get back the result of our check
+	pop af
+; If the RoamMon struct has already been initialized, we're done
+	jr nz, .UpdateDVs
+
+; If it hasn't, we need to initialize the DVs
+; (HP is initialized at the end of the battle)
+	call GetRoamMonDVs
+	inc hl
+	call BattleRandom
+	ld [hld], a
+	ld c, a
+	call BattleRandom
+	ld [hl], a
+	ld b, a
+; We're done with DVs
+	jr .UpdateDVs
+
+.NotRoaming:
+; Register a contains BattleType
+
+; Forced shiny battle type
+; Used by Red Gyarados at Lake of Rage
+	cp BATTLETYPE_SHINY
+	jr nz, .GenerateDVs
+
+	ld b, ATKDEFDV_SHINY ; $ea
+	ld c, SPDSPCDV_SHINY ; $aa
+	jr .UpdateDVs
+
+.GenerateDVs:
+; Generate new random DVs
+	call BattleRandom
+	ld b, a
+	call BattleRandom
+	ld c, a
+
+.UpdateDVs:
+; Input DVs in register bc
+	ld hl, EnemyMonDVs
+	ld a, b
+	ld [hli], a
+	ld [hl], c
+
+; We've still got more to do if we're dealing with a wild monster
+	ld a, [wBattleMode]
+	dec a
+	jr nz, .Happiness
+
+; Species-specfic:
+
+; Unown
+	ld a, [TempEnemyMonSpecies]
+	cp UNOWN
+	jr nz, .Magikarp
+
+; Get letter based on DVs
+	ld hl, EnemyMonDVs
+	predef GetUnownLetter
+; Can't use any letters that haven't been unlocked
+; If combined with forced shiny battletype, causes an infinite loop
+	call CheckUnownLetter
+	jr c, .GenerateDVs ; try again
+
+.Magikarp:
+; Skimming this part recommended
+
+	ld a, [TempEnemyMonSpecies]
+	cp MAGIKARP
+	jr nz, .Happiness
+
+; Get Magikarp's length
+	ld de, EnemyMonDVs
+	ld bc, PlayerID
+	callfar CalcMagikarpLength
+
+; We're clear if the length is < 1536
+	ld a, [wMagikarpLength]
+	cp HIGH(1536)
+	jr nz, .CheckMagikarpArea
+
+; 5% chance of skipping both size checks
+	call Random
+	cp 5 percent
+	jr c, .CheckMagikarpArea
+; Try again if > 1614
+	ld a, [wMagikarpLength + 1]
+	cp LOW(1614) + 2
+	jr nc, .GenerateDVs
+
+; 20% chance of skipping this check
+	call Random
+	cp 20 percent - 1
+	jr c, .CheckMagikarpArea
+; Try again if > 1598
+	ld a, [wMagikarpLength + 1]
+	cp LOW(1598) + 2
+	jr nc, .GenerateDVs
+
+.CheckMagikarpArea:
+; The z checks are supposed to be nz
+; Instead, all maps in GROUP_LAKE_OF_RAGE (mahogany area)
+; and routes 20 and 44 are treated as Lake of Rage
+
+; This also means Lake of Rage Magikarp can be smaller than ones
+; caught elsewhere rather than the other way around
+
+; Intended behavior enforces a minimum size at Lake of Rage
+; The real behavior prevents size flooring in the Lake of Rage area
+	ld a, [MapGroup]
+	cp GROUP_LAKE_OF_RAGE
+	jr z, .Happiness
+	ld a, [MapNumber]
+	cp MAP_LAKE_OF_RAGE
+	jr z, .Happiness
+; 40% chance of not flooring
+	call Random
+	cp 40 percent - 2
+	jr c, .Happiness
+; Floor at length 1024
+	ld a, [wMagikarpLength]
+	cp HIGH(1024)
+	jr c, .GenerateDVs ; try again
+
+; Finally done with DVs
+
+.Happiness:
+; Set happiness
+	ld a, BASE_HAPPINESS
+	ld [EnemyMonHappiness], a
+; Set level
+	ld a, [CurPartyLevel]
+	ld [EnemyMonLevel], a
+; Fill stats
+	ld de, EnemyMonMaxHP
+	ld b, FALSE
+	ld hl, EnemyMonDVs - (MON_DVS - MON_STAT_EXP + 1) ; LinkBattleRNs + 7 ; ?
+	predef CalcPkmnStats
+
+; If we're in a trainer battle,
+; get the rest of the parameters from the party struct
+	ld a, [wBattleMode]
+	cp TRAINER_BATTLE
+	jr z, .OpponentParty
+
+; If we're in a wild battle, check wild-specific stuff
+	and a
+	jr z, .TreeMon
+
+	ld a, [EnemySubStatus5]
+	bit SUBSTATUS_TRANSFORMED, a
+	jp nz, .Moves
+
+.TreeMon:
+; If we're headbutting trees, some monsters enter battle asleep
+	call CheckSleepingTreeMon
+	ld a, TREEMON_SLEEP_TURNS
+	jr c, .UpdateStatus
+; Otherwise, no status
+	xor a
+
+.UpdateStatus:
+	ld hl, EnemyMonStatus
+	ld [hli], a
+
+; Unused byte
+	xor a
+	ld [hli], a
+
+; Full HP..
+	ld a, [EnemyMonMaxHP]
+	ld [hli], a
+	ld a, [EnemyMonMaxHP + 1]
+	ld [hl], a
+
+; ..unless it's a RoamMon
+	ld a, [BattleType]
+	cp BATTLETYPE_ROAMING
+	jr nz, .Moves
+
+; Grab HP
+	call GetRoamMonHP
+	ld a, [hl]
+; Check if it's been initialized again
+	and a
+	jr z, .InitRoamHP
+; Update from the struct if it has
+	ld a, [hl]
+	ld [EnemyMonHP + 1], a
+	jr .Moves
+
+.InitRoamHP:
+; HP only uses the lo byte in the RoamMon struct since
+; Raikou/Entei/Suicune will have < 256 hp at level 40
+	ld a, [EnemyMonHP + 1]
+	ld [hl], a
+	jr .Moves
+
+.OpponentParty:
+; Get HP from the party struct
+	ld hl, (OTPartyMon1HP + 1)
+	ld a, [CurPartyMon]
+	call GetPartyLocation
+	ld a, [hld]
+	ld [EnemyMonHP + 1], a
+	ld a, [hld]
+	ld [EnemyMonHP], a
+
+; Make sure everything knows which monster the opponent is using
+	ld a, [CurPartyMon]
+	ld [CurOTMon], a
+
+; Get status from the party struct
+	dec hl
+	ld a, [hl] ; OTPartyMonStatus
+	ld [EnemyMonStatus], a
+
+.Moves:
+	ld hl, BaseType1
+	ld de, EnemyMonType1
+	ld a, [hli]
+	ld [de], a
+	inc de
+	ld a, [hl]
+	ld [de], a
+
+; Get moves
+	ld de, EnemyMonMoves
+; Are we in a trainer battle?
+	ld a, [wBattleMode]
+	cp TRAINER_BATTLE
+	jr nz, .WildMoves
+; Then copy moves from the party struct
+	ld hl, OTPartyMon1Moves
+	ld a, [CurPartyMon]
+	call GetPartyLocation
+	ld bc, NUM_MOVES
+	call CopyBytes
+	jr .PP
+
+.WildMoves:
+; Clear EnemyMonMoves
+	xor a
+	ld h, d
+	ld l, e
+	ld [hli], a
+	ld [hli], a
+	ld [hli], a
+	ld [hl], a
+; Make sure the predef knows this isn't a partymon
+	ld [wEvolutionOldSpecies], a
+; Fill moves based on level
+	predef FillMoves
+
+.PP:
+; Trainer battle?
+	ld a, [wBattleMode]
+	cp TRAINER_BATTLE
+	jr z, .TrainerPP
+
+; Fill wild PP
+	ld hl, EnemyMonMoves
+	ld de, EnemyMonPP
+	predef FillPP
+	jr .Finish
+
+.TrainerPP:
+; Copy PP from the party struct
+	ld hl, OTPartyMon1PP
+	ld a, [CurPartyMon]
+	call GetPartyLocation
+	ld de, EnemyMonPP
+	ld bc, NUM_MOVES
+	call CopyBytes
+
+.Finish:
+; Only the first five base stats are copied..
+	ld hl, BaseStats
+	ld de, EnemyMonBaseStats
+	ld b, BaseSpecialDefense - BaseStats
+.loop
+	ld a, [hli]
+	ld [de], a
+	inc de
+	dec b
+	jr nz, .loop
+
+	ld a, [BaseCatchRate]
+	ld [de], a
+	inc de
+
+	ld a, [BaseExp]
+	ld [de], a
+
+	ld a, [TempEnemyMonSpecies]
+	ld [wd265], a
+
+	call GetPokemonName
+
+; Did we catch it?
+	ld a, [wBattleMode]
+	and a
+	ret z
+
+; Update enemy nick
+	ld hl, StringBuffer1
+	ld de, EnemyMonNick
+	ld bc, PKMN_NAME_LENGTH
+	call CopyBytes
+
+; Saw this mon
+	ld a, [TempEnemyMonSpecies]
+	dec a
+	ld c, a
+	ld b, SET_FLAG
+	ld hl, PokedexSeen
+	predef FlagPredef
+
+	ld hl, EnemyMonStats
+	ld de, EnemyStats
+	ld bc, EnemyMonStatsEnd - EnemyMonStats
+	call CopyBytes
+
+	ret
+; 3eb38
+
+CheckSleepingTreeMon: ; 3eb38
+; Return carry if species is in the list
+; for the current time of day
+
+; Don't do anything if this isn't a tree encounter
+	ld a, [BattleType]
+	cp BATTLETYPE_TREE
+	jr nz, .NotSleeping
+
+; Get list for the time of day
+	ld hl, .Morn
+	ld a, [TimeOfDay]
+	cp DAY_F
+	jr c, .Check
+	ld hl, .Day
+	jr z, .Check
+	ld hl, .Nite
+
+.Check:
+	ld a, [TempEnemyMonSpecies]
+	ld de, 1 ; length of species id
+	call IsInArray
+; If it's a match, the opponent is asleep
+	ret c
+
+.NotSleeping:
+	and a
+	ret
+
+.Nite:
+	db CATERPIE
+	db METAPOD
+	db BUTTERFREE
+	db WEEDLE
+	db KAKUNA
+	db BEEDRILL
+	db SPEAROW
+	db EKANS
+	db EXEGGCUTE
+	db LEDYBA
+	db AIPOM
+	db -1 ; end
+
+.Day:
+	db VENONAT
+	db HOOTHOOT
+	db NOCTOWL
+	db SPINARAK
+	db HERACROSS
+	db -1 ; end
+
+.Morn:
+	db VENONAT
+	db HOOTHOOT
+	db NOCTOWL
+	db SPINARAK
+	db HERACROSS
+	db -1 ; end
+; 3eb75
+
+CheckUnownLetter: ; 3eb75
+; Return carry if the Unown letter hasn't been unlocked yet
+
+	ld a, [UnlockedUnowns]
+	ld c, a
+	ld de, 0
+
+.loop
+
+; Don't check this set unless it's been unlocked
+	srl c
+	jr nc, .next
+
+; Is our letter in the set?
+	ld hl, .LetterSets
+	add hl, de
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+
+	push de
+	ld a, [UnownLetter]
+	ld de, 1
+	push bc
+	call IsInArray
+	pop bc
+	pop de
+
+	jr c, .match
+
+.next
+; Make sure we haven't gone past the end of the table
+	inc e
+	inc e
+	ld a, e
+	cp .Set1 - .LetterSets
+	jr c, .loop
+
+; Hasn't been unlocked, or the letter is invalid
+	scf
+	ret
+
+.match
+; Valid letter
+	and a
+	ret
+
+.LetterSets:
+	dw .Set1
+	dw .Set2
+	dw .Set3
+	dw .Set4
+
+.Set1:
+	;  A   B   C   D   E   F   G   H   I   J   K
+	db 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, $ff
+.Set2:
+	;  L   M   N   O   P   Q   R
+	db 12, 13, 14, 15, 16, 17, 18, $ff
+.Set3:
+	;  S   T   U   V   W
+	db 19, 20, 21, 22, 23, $ff
+.Set4:
+	;  X   Y   Z
+	db 24, 25, 26, $ff
+
+; 3ebc7
+
+SwapBattlerLevels: ; 3ebc7
+; unreferenced
+	push bc
+	ld a, [BattleMonLevel]
+	ld b, a
+	ld a, [EnemyMonLevel]
+	ld [BattleMonLevel], a
+	ld a, b
+	ld [EnemyMonLevel], a
+	pop bc
+	ret
+; 3ebd8
+
+BattleWinSlideInEnemyTrainerFrontpic: ; 3ebd8
+	xor a
+	ld [TempEnemyMonSpecies], a
+	call FinishBattleAnim
+	ld a, [OtherTrainerClass]
+	ld [TrainerClass], a
+	ld de, VTiles2
+	callfar GetTrainerPic
+	hlcoord 19, 0
+	ld c, 0
+
+.outer_loop
+	inc c
+	ld a, c
+	cp 7
+	ret z
+	xor a
+	ld [hBGMapMode], a
+	ld [hBGMapThird], a
+	ld d, $0
+	push bc
+	push hl
+
+.inner_loop
+	call .CopyColumn
+	inc hl
+	ld a, 7
+	add d
+	ld d, a
+	dec c
+	jr nz, .inner_loop
+
+	ld a, $1
+	ld [hBGMapMode], a
+	ld c, 4
+	call DelayFrames
+	pop hl
+	pop bc
+	dec hl
+	jr .outer_loop
+; 3ec1a
+
+.CopyColumn: ; 3ec1a
+	push hl
+	push de
+	push bc
+	ld e, 7
+
+.loop
+	ld [hl], d
+	ld bc, SCREEN_WIDTH
+	add hl, bc
+	inc d
+	dec e
+	jr nz, .loop
+
+	pop bc
+	pop de
+	pop hl
+	ret
+; 3ec2c
+
+ApplyStatusEffectOnPlayerStats: ; 3ec2c
+	ld a, 1
+	jr ApplyStatusEffectOnStats
+; 3ec30
+
+ApplyStatusEffectOnEnemyStats: ; 3ec30
+	xor a
+; 3ec31
+
+ApplyStatusEffectOnStats: ; 3ec31
+	ld [hBattleTurn], a
+	call ApplyPrzEffectOnSpeed
+	jp ApplyBrnEffectOnAttack
+; 3ec39
+
+ApplyPrzEffectOnSpeed: ; 3ec39
+	ld a, [hBattleTurn]
+	and a
+	jr z, .enemy
+	ld a, [BattleMonStatus]
+	and 1 << PAR
+	ret z
+	ld hl, BattleMonSpeed + 1
+	ld a, [hld]
+	ld b, a
+	ld a, [hl]
+	srl a
+	rr b
+	srl a
+	rr b
+	ld [hli], a
+	or b
+	jr nz, .player_ok
+	ld b, $1 ; min speed
+
+.player_ok
+	ld [hl], b
+	ret
+
+.enemy
+	ld a, [EnemyMonStatus]
+	and 1 << PAR
+	ret z
+	ld hl, EnemyMonSpeed + 1
+	ld a, [hld]
+	ld b, a
+	ld a, [hl]
+	srl a
+	rr b
+	srl a
+	rr b
+	ld [hli], a
+	or b
+	jr nz, .enemy_ok
+	ld b, $1 ; min speed
+
+.enemy_ok
+	ld [hl], b
+	ret
+; 3ec76
+
+ApplyBrnEffectOnAttack: ; 3ec76
+	ld a, [hBattleTurn]
+	and a
+	jr z, .enemy
+	ld a, [BattleMonStatus]
+	and 1 << BRN
+	ret z
+	ld hl, BattleMonAttack + 1
+	ld a, [hld]
+	ld b, a
+	ld a, [hl]
+	srl a
+	rr b
+	ld [hli], a
+	or b
+	jr nz, .player_ok
+	ld b, $1 ; min attack
+
+.player_ok
+	ld [hl], b
+	ret
+
+.enemy
+	ld a, [EnemyMonStatus]
+	and 1 << BRN
+	ret z
+	ld hl, EnemyMonAttack + 1
+	ld a, [hld]
+	ld b, a
+	ld a, [hl]
+	srl a
+	rr b
+	ld [hli], a
+	or b
+	jr nz, .enemy_ok
+	ld b, $1 ; min attack
+
+.enemy_ok
+	ld [hl], b
+	ret
+; 3ecab
+
+ApplyStatLevelMultiplierOnAllStats: ; 3ecab
+; Apply StatLevelMultipliers on all 5 Stats
+	ld c, 0
+.stat_loop
+	call ApplyStatLevelMultiplier
+	inc c
+	ld a, c
+	cp 5
+	jr nz, .stat_loop
+	ret
+; 3ecb7
+
+ApplyStatLevelMultiplier: ; 3ecb7
+	push bc
+	push bc
+	ld a, [wd265]
+	and a
+	ld a, c
+	ld hl, BattleMonAttack
+	ld de, PlayerStats
+	ld bc, PlayerAtkLevel
+	jr z, .got_pointers
+	ld hl, EnemyMonAttack
+	ld de, EnemyStats
+	ld bc, EnemyAtkLevel
+
+.got_pointers
+	add c
+	ld c, a
+	jr nc, .okay
+	inc b
+.okay
+	ld a, [bc]
+	pop bc
+	ld b, a
+	push bc
+	sla c
+	ld b, 0
+	add hl, bc
+	ld a, c
+	add e
+	ld e, a
+	jr nc, .okay2
+	inc d
+.okay2
+	pop bc
+	push hl
+	ld hl, .StatLevelMultipliers
+	dec b
+	sla b
+	ld c, b
+	ld b, 0
+	add hl, bc
+	xor a
+	ld [hMultiplicand + 0], a
+	ld a, [de]
+	ld [hMultiplicand + 1], a
+	inc de
+	ld a, [de]
+	ld [hMultiplicand + 2], a
+	ld a, [hli]
+	ld [hMultiplier], a
+	call Multiply
+	ld a, [hl]
+	ld [hDivisor], a
+	ld b, $4
+	call Divide
+	pop hl
+
+; Cap at 999.
+	ld a, [hQuotient + 2]
+	sub LOW(MAX_STAT_VALUE)
+	ld a, [hQuotient + 1]
+	sbc HIGH(MAX_STAT_VALUE)
+	jp c, .okay3
+
+	ld a, HIGH(MAX_STAT_VALUE)
+	ld [hQuotient + 1], a
+	ld a, LOW(MAX_STAT_VALUE)
+	ld [hQuotient + 2], a
+
+.okay3
+	ld a, [hQuotient + 1]
+	ld [hli], a
+	ld b, a
+	ld a, [hQuotient + 2]
+	ld [hl], a
+	or b
+	jr nz, .okay4
+	inc [hl]
+
+.okay4
+	pop bc
+	ret
+; 3ed2b
+
+.StatLevelMultipliers:
+;	      /
+	db 25, 100 ; 25%
+	db 28, 100 ; 28%
+	db 33, 100 ; 33%
+	db 40, 100 ; 40%
+	db 50, 100 ; 50%
+	db 66, 100 ; 66%
+
+	db  1,  1 ; 100%
+
+	db 15, 10 ; 150%
+	db  2,  1 ; 200%
+	db 25, 10 ; 250%
+	db  3,  1 ; 300%
+	db 35, 10 ; 350%
+	db  4,  1 ; 400%
+; 3ed45
+
+BadgeStatBoosts: ; 3ed45
+; Raise BattleMon stats depending on which badges have been obtained.
+
+; Every other badge boosts a stat, starting from the first.
+
+; 	ZephyrBadge:  Attack
+; 	PlainBadge:   Speed
+; 	MineralBadge: Defense
+; 	GlacierBadge: Special Attack
+; 	RisingBadge:  Special Defense
+
+; The boosted stats are in order, except PlainBadge and MineralBadge's boosts are swapped.
+
+	ld a, [wLinkMode]
+	and a
+	ret nz
+
+	ld a, [InBattleTowerBattle]
+	and a
+	ret nz
+
+	ld a, [JohtoBadges]
+
+; Swap badges 3 (PlainBadge) and 5 (MineralBadge).
+	ld d, a
+	and (1 << PLAINBADGE)
+	add a
+	add a
+	ld b, a
+	ld a, d
+	and (1 << MINERALBADGE)
+	rrca
+	rrca
+	ld c, a
+	ld a, d
+	and ((1 << ZEPHYRBADGE) | (1 << HIVEBADGE) | (1 << FOGBADGE) | (1 << STORMBADGE) | (1 << GLACIERBADGE) | (1 << RISINGBADGE))
+	or b
+	or c
+	ld b, a
+
+	ld hl, BattleMonAttack
+	ld c, 4
+.CheckBadge:
+	ld a, b
+	srl b
+	call c, BoostStat
+	inc hl
+	inc hl
+; Check every other badge.
+	srl b
+	dec c
+	jr nz, .CheckBadge
+; And the last one (RisingBadge) too.
+	srl a
+	call c, BoostStat
+	ret
+; 3ed7c
+
+BoostStat: ; 3ed7c
+; Raise stat at hl by 1/8.
+
+	ld a, [hli]
+	ld d, a
+	ld e, [hl]
+	srl d
+	rr e
+	srl d
+	rr e
+	srl d
+	rr e
+	ld a, [hl]
+	add e
+	ld [hld], a
+	ld a, [hl]
+	adc d
+	ld [hli], a
+
+; Cap at 999.
+	ld a, [hld]
+	sub LOW(MAX_STAT_VALUE)
+	ld a, [hl]
+	sbc HIGH(MAX_STAT_VALUE)
+	ret c
+	ld a, HIGH(MAX_STAT_VALUE)
+	ld [hli], a
+	ld a, LOW(MAX_STAT_VALUE)
+	ld [hld], a
+	ret
+; 3ed9f
+
+_LoadBattleFontsHPBar: ; 3ed9f
+	callfar LoadBattleFontsHPBar
+	ret
+; 3eda6
+
+_LoadHPBar: ; 3eda6
+	callfar LoadHPBar
+	ret
+; 3edad
+
+LoadHPExpBarGFX: ; unreferenced
+	ld de, EnemyHPBarBorderGFX
+	ld hl, VTiles2 tile $6c
+	lb bc, BANK(EnemyHPBarBorderGFX), 4
+	call Get1bpp
+	ld de, HPExpBarBorderGFX
+	ld hl, VTiles2 tile $73
+	lb bc, BANK(HPExpBarBorderGFX), 6
+	call Get1bpp
+	ld de, ExpBarGFX
+	ld hl, VTiles2 tile $55
+	lb bc, BANK(ExpBarGFX), 8
+	jp Get2bpp
+; 3edd1
+
+EmptyBattleTextBox: ; 3edd1
+	ld hl, .empty
+	jp BattleTextBox
+.empty
+	db "@"
+; 3edd8
+
+_BattleRandom:: ; 3edd8
+; If the normal RNG is used in a link battle it'll desync.
+; To circumvent this a shared PRNG is used instead.
+
+; But if we're in a non-link battle we're safe to use it
+	ld a, [wLinkMode]
+	and a
+	jp z, Random
+
+; The PRNG operates in streams of 10 values.
+
+; Which value are we trying to pull?
+	push hl
+	push bc
+	ld a, [LinkBattleRNCount]
+	ld c, a
+	ld b, 0
+	ld hl, LinkBattleRNs
+	add hl, bc
+	inc a
+	ld [LinkBattleRNCount], a
+
+; If we haven't hit the end yet, we're good
+	cp 10 - 1 ; Exclude last value. See the closing comment
+	ld a, [hl]
+	pop bc
+	pop hl
+	ret c
+
+; If we have, we have to generate new pseudorandom data
+; Instead of having multiple PRNGs, ten seeds are used
+	push hl
+	push bc
+	push af
+
+; Reset count to 0
+	xor a
+	ld [LinkBattleRNCount], a
+	ld hl, LinkBattleRNs
+	ld b, 10 ; number of seeds
+
+; Generate next number in the sequence for each seed
+; a[n+1] = (a[n] * 5 + 1) % 256
+.loop
+	; get last #
+	ld a, [hl]
+
+	; a * 5 + 1
+	ld c, a
+	add a
+	add a
+	add c
+	inc a
+
+	; update #
+	ld [hli], a
+	dec b
+	jr nz, .loop
+
+; This has the side effect of pulling the last value first,
+; then wrapping around. As a result, when we check to see if
+; we've reached the end, we check the one before it.
+
+	pop af
+	pop bc
+	pop hl
+	ret
+; 3ee0f
+
+Call_PlayBattleAnim_OnlyIfVisible: ; 3ee0f
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVar
+	and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
+	ret nz
+; 3ee17
+
+Call_PlayBattleAnim: ; 3ee17
+	ld a, e
+	ld [FXAnimID], a
+	ld a, d
+	ld [FXAnimID + 1], a
+	call WaitBGMap
+	predef_jump PlayBattleAnim
+; 3ee27
+
+FinishBattleAnim: ; 3ee27
+	push af
+	push bc
+	push de
+	push hl
+	ld b, SCGB_BATTLE_COLORS
+	call GetSGBLayout
+	call SetPalettes
+	call DelayFrame
+	pop hl
+	pop de
+	pop bc
+	pop af
+	ret
+; 3ee3b
+
+GiveExperiencePoints: ; 3ee3b
+; Give experience.
+; Don't give experience if linked or in the Battle Tower.
+	ld a, [wLinkMode]
+	and a
+	ret nz
+
+	ld a, [InBattleTowerBattle]
+	bit 0, a
+	ret nz
+
+	call .EvenlyDivideExpAmongParticipants
+	xor a
+	ld [CurPartyMon], a
+	ld bc, PartyMon1Species
+
+.loop
+	ld hl, MON_HP
+	add hl, bc
+	ld a, [hli]
+	or [hl]
+	jp z, .skip_stats ; fainted
+
+	push bc
+	ld hl, wBattleParticipantsNotFainted
+	ld a, [CurPartyMon]
+	ld c, a
+	ld b, CHECK_FLAG
+	ld d, $0
+	predef FlagPredef
+	ld a, c
+	and a
+	pop bc
+	jp z, .skip_stats
+
+; give stat exp
+	ld hl, MON_STAT_EXP + 1
+	add hl, bc
+	ld d, h
+	ld e, l
+	ld hl, EnemyMonBaseStats - 1
+	push bc
+	ld c, $5
+.loop1
+	inc hl
+	ld a, [de]
+	add [hl]
+	ld [de], a
+	jr nc, .okay1
+	dec de
+	ld a, [de]
+	inc a
+	jr z, .next
+	ld [de], a
+	inc de
+
+.okay1
+	push hl
+	push bc
+	ld a, MON_PKRUS
+	call GetPartyParamLocation
+	ld a, [hl]
+	and a
+	pop bc
+	pop hl
+	jr z, .skip
+	ld a, [de]
+	add [hl]
+	ld [de], a
+	jr nc, .skip
+	dec de
+	ld a, [de]
+	inc a
+	jr z, .next
+	ld [de], a
+	inc de
+	jr .skip
+
+.next
+	ld a, $ff
+	ld [de], a
+	inc de
+	ld [de], a
+
+.skip
+	inc de
+	inc de
+	dec c
+	jr nz, .loop1
+	xor a
+	ld [hMultiplicand + 0], a
+	ld [hMultiplicand + 1], a
+	ld a, [EnemyMonBaseExp]
+	ld [hMultiplicand + 2], a
+	ld a, [EnemyMonLevel]
+	ld [hMultiplier], a
+	call Multiply
+	ld a, 7
+	ld [hDivisor], a
+	ld b, 4
+	call Divide
+; Boost Experience for traded Pokemon
+	pop bc
+	ld hl, MON_ID
+	add hl, bc
+	ld a, [PlayerID]
+	cp [hl]
+	jr nz, .boosted
+	inc hl
+	ld a, [PlayerID + 1]
+	cp [hl]
+	ld a, $0
+	jr z, .no_boost
+
+.boosted
+	call BoostExp
+	ld a, $1
+
+.no_boost
+; Boost experience for a Trainer Battle
+	ld [StringBuffer2 + 2], a
+	ld a, [wBattleMode]
+	dec a
+	call nz, BoostExp
+; Boost experience for Lucky Egg
+	push bc
+	ld a, MON_ITEM
+	call GetPartyParamLocation
+	ld a, [hl]
+	cp LUCKY_EGG
+	call z, BoostExp
+	ld a, [hQuotient + 2]
+	ld [StringBuffer2 + 1], a
+	ld a, [hQuotient + 1]
+	ld [StringBuffer2], a
+	ld a, [CurPartyMon]
+	ld hl, PartyMonNicknames
+	call GetNick
+	ld hl, Text_PkmnGainedExpPoint
+	call BattleTextBox
+	ld a, [StringBuffer2 + 1]
+	ld [hQuotient + 2], a
+	ld a, [StringBuffer2]
+	ld [hQuotient + 1], a
+	pop bc
+	call AnimateExpBar
+	push bc
+	call LoadTileMapToTempTileMap
+	pop bc
+	ld hl, MON_STAT_EXP - 1
+	add hl, bc
+	ld d, [hl]
+	ld a, [hQuotient + 2]
+	add d
+	ld [hld], a
+	ld d, [hl]
+	ld a, [hQuotient + 1]
+	adc d
+	ld [hl], a
+	jr nc, .skip2
+	dec hl
+	inc [hl]
+	jr nz, .skip2
+	ld a, $ff
+	ld [hli], a
+	ld [hli], a
+	ld [hl], a
+
+.skip2
+	ld a, [CurPartyMon]
+	ld e, a
+	ld d, $0
+	ld hl, PartySpecies
+	add hl, de
+	ld a, [hl]
+	ld [CurSpecies], a
+	call GetBaseData
+	push bc
+	ld d, MAX_LEVEL
+	callfar CalcExpAtLevel
+	pop bc
+	ld hl, MON_STAT_EXP - 1
+	add hl, bc
+	push bc
+	ld a, [hQuotient]
+	ld b, a
+	ld a, [hQuotient + 1]
+	ld c, a
+	ld a, [hQuotient + 2]
+	ld d, a
+	ld a, [hld]
+	sub d
+	ld a, [hld]
+	sbc c
+	ld a, [hl]
+	sbc b
+	jr c, .not_max_exp
+	ld a, b
+	ld [hli], a
+	ld a, c
+	ld [hli], a
+	ld a, d
+	ld [hld], a
+
+.not_max_exp
+	xor a ; PARTYMON
+	ld [MonType], a
+	predef CopyPkmnToTempMon
+	callfar CalcLevel
+	pop bc
+	ld hl, MON_LEVEL
+	add hl, bc
+	ld a, [hl]
+	cp MAX_LEVEL
+	jp nc, .skip_stats
+	cp d
+	jp z, .skip_stats
+; <NICKNAME> grew to level ##!
+	ld [wTempLevel], a
+	ld a, [CurPartyLevel]
+	push af
+	ld a, d
+	ld [CurPartyLevel], a
+	ld [hl], a
+	ld hl, MON_SPECIES
+	add hl, bc
+	ld a, [hl]
+	ld [CurSpecies], a
+	ld [wd265], a
+	call GetBaseData
+	ld hl, MON_MAXHP + 1
+	add hl, bc
+	ld a, [hld]
+	ld e, a
+	ld d, [hl]
+	push de
+	ld hl, MON_MAXHP
+	add hl, bc
+	ld d, h
+	ld e, l
+	ld hl, MON_STAT_EXP - 1
+	add hl, bc
+	push bc
+	ld b, TRUE
+	predef CalcPkmnStats
+	pop bc
+	pop de
+	ld hl, MON_MAXHP + 1
+	add hl, bc
+	ld a, [hld]
+	sub e
+	ld e, a
+	ld a, [hl]
+	sbc d
+	ld d, a
+	dec hl
+	ld a, [hl]
+	add e
+	ld [hld], a
+	ld a, [hl]
+	adc d
+	ld [hl], a
+	ld a, [CurBattleMon]
+	ld d, a
+	ld a, [CurPartyMon]
+	cp d
+	jr nz, .skip_animation
+	ld de, BattleMonHP
+	ld a, [hli]
+	ld [de], a
+	inc de
+	ld a, [hli]
+	ld [de], a
+	ld de, BattleMonMaxHP
+	push bc
+	ld bc, PARTYMON_STRUCT_LENGTH - MON_MAXHP
+	call CopyBytes
+	pop bc
+	ld hl, MON_LEVEL
+	add hl, bc
+	ld a, [hl]
+	ld [BattleMonLevel], a
+	ld a, [PlayerSubStatus5]
+	bit SUBSTATUS_TRANSFORMED, a
+	jr nz, .transformed
+	ld hl, MON_ATK
+	add hl, bc
+	ld de, PlayerStats
+	ld bc, PARTYMON_STRUCT_LENGTH - MON_ATK
+	call CopyBytes
+
+.transformed
+	xor a
+	ld [wd265], a
+	call ApplyStatLevelMultiplierOnAllStats
+	callfar ApplyStatusEffectOnPlayerStats
+	callfar BadgeStatBoosts
+	callfar UpdatePlayerHUD
+	call EmptyBattleTextBox
+	call LoadTileMapToTempTileMap
+	ld a, $1
+	ld [hBGMapMode], a
+
+.skip_animation
+	farcall LevelUpHappinessMod
+	ld a, [CurBattleMon]
+	ld b, a
+	ld a, [CurPartyMon]
+	cp b
+	jr z, .skip_animation2
+	ld de, SFX_HIT_END_OF_EXP_BAR
+	call PlaySFX
+	call WaitSFX
+	ld hl, BattleText_StringBuffer1GrewToLevel
+	call StdBattleTextBox
+	call LoadTileMapToTempTileMap
+
+.skip_animation2
+	xor a ; PARTYMON
+	ld [MonType], a
+	predef CopyPkmnToTempMon
+	hlcoord 9, 0
+	ld b, $a
+	ld c, $9
+	call TextBox
+	hlcoord 11, 1
+	ld bc, 4
+	predef PrintTempMonStats
+	ld c, $1e
+	call DelayFrames
+	call WaitPressAorB_BlinkCursor
+	call Call_LoadTempTileMapToTileMap
+	xor a ; PARTYMON
+	ld [MonType], a
+	ld a, [CurSpecies]
+	ld [wd265], a
+	ld a, [CurPartyLevel]
+	push af
+	ld c, a
+	ld a, [wTempLevel]
+	ld b, a
+
+.level_loop
+	inc b
+	ld a, b
+	ld [CurPartyLevel], a
+	push bc
+	predef LearnLevelMoves
+	pop bc
+	ld a, b
+	cp c
+	jr nz, .level_loop
+	pop af
+	ld [CurPartyLevel], a
+	ld hl, EvolvableFlags
+	ld a, [CurPartyMon]
+	ld c, a
+	ld b, SET_FLAG
+	predef FlagPredef
+	pop af
+	ld [CurPartyLevel], a
+
+.skip_stats
+	ld a, [PartyCount]
+	ld b, a
+	ld a, [CurPartyMon]
+	inc a
+	cp b
+	jr z, .done
+	ld [CurPartyMon], a
+	ld a, MON_SPECIES
+	call GetPartyParamLocation
+	ld b, h
+	ld c, l
+	jp .loop
+
+.done
+	jp ResetBattleParticipants
+; 3f0d4
+
+.EvenlyDivideExpAmongParticipants:
+; count number of battle participants
+	ld a, [wBattleParticipantsNotFainted]
+	ld b, a
+	ld c, PARTY_LENGTH
+	ld d, 0
+.count_loop
+	xor a
+	srl b
+	adc d
+	ld d, a
+	dec c
+	jr nz, .count_loop
+	cp 2
+	ret c
+
+	ld [wd265], a
+	ld hl, EnemyMonBaseStats
+	ld c, EnemyMonEnd - EnemyMonBaseStats
+.count_loop2
+	xor a
+	ld [hDividend + 0], a
+	ld a, [hl]
+	ld [hDividend + 1], a
+	ld a, [wd265]
+	ld [hDivisor], a
+	ld b, 2
+	call Divide
+	ld a, [hQuotient + 2]
+	ld [hli], a
+	dec c
+	jr nz, .count_loop2
+	ret
+; 3f106
+
+BoostExp: ; 3f106
+; Multiply experience by 1.5x
+	push bc
+; load experience value
+	ld a, [hProduct + 2]
+	ld b, a
+	ld a, [hProduct + 3]
+	ld c, a
+; halve it
+	srl b
+	rr c
+; add it back to the whole exp value
+	add c
+	ld [hProduct + 3], a
+	ld a, [hProduct + 2]
+	adc b
+	ld [hProduct + 2], a
+	pop bc
+	ret
+; 3f11b
+
+Text_PkmnGainedExpPoint: ; 3f11b
+	text_jump Text_Gained
+	start_asm
+	ld hl, TextJump_StringBuffer2ExpPoints
+	ld a, [StringBuffer2 + 2] ; IsTradedMon
+	and a
+	ret z
+
+	ld hl, TextJump_ABoostedStringBuffer2ExpPoints
+	ret
+; 3f12c
+
+TextJump_ABoostedStringBuffer2ExpPoints: ; 3f12c
+	text_jump Text_ABoostedStringBuffer2ExpPoints
+	db "@"
+; 3f131
+
+TextJump_StringBuffer2ExpPoints: ; 3f131
+	text_jump Text_StringBuffer2ExpPoints
+	db "@"
+; 3f136
+
+AnimateExpBar: ; 3f136
+	push bc
+
+	ld hl, CurPartyMon
+	ld a, [CurBattleMon]
+	cp [hl]
+	jp nz, .finish
+
+	ld a, [BattleMonLevel]
+	cp MAX_LEVEL
+	jp nc, .finish
+
+	ld a, [hProduct + 3]
+	ld [wd004], a
+	push af
+	ld a, [hProduct + 2]
+	ld [wd003], a
+	push af
+	xor a
+	ld [wd002], a
+	xor a ; PARTYMON
+	ld [MonType], a
+	predef CopyPkmnToTempMon
+	ld a, [TempMonLevel]
+	ld b, a
+	ld e, a
+	push de
+	ld de, TempMonExp + 2
+	call CalcExpBar
+	push bc
+	ld hl, TempMonExp + 2
+	ld a, [wd004]
+	add [hl]
+	ld [hld], a
+	ld a, [wd003]
+	adc [hl]
+	ld [hld], a
+	jr nc, .NoOverflow
+	inc [hl]
+	jr nz, .NoOverflow
+	ld a, $ff
+	ld [hli], a
+	ld [hli], a
+	ld [hl], a
+
+.NoOverflow:
+	ld d, MAX_LEVEL
+	callfar CalcExpAtLevel
+	ld a, [hProduct + 1]
+	ld b, a
+	ld a, [hProduct + 2]
+	ld c, a
+	ld a, [hProduct + 3]
+	ld d, a
+	ld hl, TempMonExp + 2
+	ld a, [hld]
+	sub d
+	ld a, [hld]
+	sbc c
+	ld a, [hl]
+	sbc b
+	jr c, .AlreadyAtMaxExp
+	ld a, b
+	ld [hli], a
+	ld a, c
+	ld [hli], a
+	ld a, d
+	ld [hld], a
+
+.AlreadyAtMaxExp:
+	callfar CalcLevel
+	ld a, d
+	pop bc
+	pop de
+	ld d, a
+	cp e
+	jr nc, .LoopLevels
+	ld a, e
+	ld d, a
+
+.LoopLevels:
+	ld a, e
+	cp MAX_LEVEL
+	jr nc, .FinishExpBar
+	cp d
+	jr z, .FinishExpBar
+	inc a
+	ld [TempMonLevel], a
+	ld [CurPartyLevel], a
+	ld [BattleMonLevel], a
+	push de
+	call .PlayExpBarSound
+	ld c, $40
+	call .LoopBarAnimation
+	call PrintPlayerHUD
+	ld hl, BattleMonNick
+	ld de, StringBuffer1
+	ld bc, PKMN_NAME_LENGTH
+	call CopyBytes
+	call TerminateExpBarSound
+	ld de, SFX_HIT_END_OF_EXP_BAR
+	call PlaySFX
+	farcall AnimateEndOfExpBar
+	call WaitSFX
+	ld hl, BattleText_StringBuffer1GrewToLevel
+	call StdBattleTextBox
+	pop de
+	inc e
+	ld b, $0
+	jr .LoopLevels
+
+.FinishExpBar:
+	push bc
+	ld b, d
+	ld de, TempMonExp + 2
+	call CalcExpBar
+	ld a, b
+	pop bc
+	ld c, a
+	call .PlayExpBarSound
+	call .LoopBarAnimation
+	call TerminateExpBarSound
+	pop af
+	ld [hProduct + 2], a
+	pop af
+	ld [hProduct + 3], a
+
+.finish
+	pop bc
+	ret
+
+.PlayExpBarSound:
+	push bc
+	call WaitSFX
+	ld de, SFX_EXP_BAR
+	call PlaySFX
+	ld c, 10
+	call DelayFrames
+	pop bc
+	ret
+
+.LoopBarAnimation:
+	ld d, 3
+	dec b
+.anim_loop
+	inc b
+	push bc
+	push de
+	hlcoord 17, 11
+	call PlaceExpBar
+	pop de
+	ld a, $1
+	ld [hBGMapMode], a
+	ld c, d
+	call DelayFrames
+	xor a
+	ld [hBGMapMode], a
+	pop bc
+	ld a, c
+	cp b
+	jr z, .end_animation
+	inc b
+	push bc
+	push de
+	hlcoord 17, 11
+	call PlaceExpBar
+	pop de
+	ld a, $1
+	ld [hBGMapMode], a
+	ld c, d
+	call DelayFrames
+	xor a
+	ld [hBGMapMode], a
+	dec d
+	jr nz, .min_number_of_frames
+	ld d, 1
+.min_number_of_frames
+	pop bc
+	ld a, c
+	cp b
+	jr nz, .anim_loop
+.end_animation
+	ld a, $1
+	ld [hBGMapMode], a
+	ret
+
+SendOutPkmnText: ; 3f26d
+	ld a, [wLinkMode]
+	and a
+	jr z, .not_linked
+
+	ld hl, JumpText_GoPkmn ; If we're in a LinkBattle print just "Go <PlayerMon>"
+
+	ld a, [wBattleHasJustStarted] ; unless this (unidentified) variable is set
+	and a
+	jr nz, .skip_to_textbox
+
+.not_linked
+; Depending on the HP of the enemy Pkmn, the game prints a different text
+	ld hl, EnemyMonHP
+	ld a, [hli]
+	or [hl]
+	ld hl, JumpText_GoPkmn
+	jr z, .skip_to_textbox
+
+	; compute enemy helth remaining as a percentage
+	xor a
+	ld [hMultiplicand + 0], a
+	ld hl, EnemyMonHP
+	ld a, [hli]
+	ld [wEnemyHPAtTimeOfPlayerSwitch], a
+	ld [hMultiplicand + 1], a
+	ld a, [hl]
+	ld [wEnemyHPAtTimeOfPlayerSwitch + 1], a
+	ld [hMultiplicand + 2], a
+	ld a, 25
+	ld [hMultiplier], a
+	call Multiply
+	ld hl, EnemyMonMaxHP
+	ld a, [hli]
+	ld b, [hl]
+	srl a
+	rr b
+	srl a
+	rr b
+	ld a, b
+	ld b, 4
+	ld [hDivisor], a
+	call Divide
+
+	ld a, [hQuotient + 2]
+	ld hl, JumpText_GoPkmn
+	cp 70
+	jr nc, .skip_to_textbox
+
+	ld hl, JumpText_DoItPkmn
+	cp 40
+	jr nc, .skip_to_textbox
+
+	ld hl, JumpText_GoForItPkmn
+	cp 10
+	jr nc, .skip_to_textbox
+
+	ld hl, JumpText_YourFoesWeakGetmPkmn
+.skip_to_textbox
+	jp BattleTextBox
+; 3f2d1
+
+JumpText_GoPkmn: ; 3f2d1
+	text_jump Text_GoPkmn
+	start_asm
+	jr Function_TextJump_BattleMonNick01
+; 3f2d6
+
+JumpText_DoItPkmn: ; 3f2d8
+	text_jump Text_DoItPkmn
+	start_asm
+	jr Function_TextJump_BattleMonNick01
+; 3f2dd
+
+JumpText_GoForItPkmn: ; 3f2df
+	text_jump Text_GoForItPkmn
+	start_asm
+	jr Function_TextJump_BattleMonNick01
+; 3f2e4
+
+JumpText_YourFoesWeakGetmPkmn: ; 3f2e6
+	text_jump Text_YourFoesWeakGetmPkmn
+	start_asm
+Function_TextJump_BattleMonNick01: ; 3f2eb
+	ld hl, TextJump_BattleMonNick01
+	ret
+; 3f2ef
+
+TextJump_BattleMonNick01: ; 3f2ef
+	text_jump Text_BattleMonNick01
+	db "@"
+; 3f2f4
+
+WithdrawPkmnText: ; 3f2f4
+	ld hl, .WithdrawPkmnText
+	jp BattleTextBox
+
+.WithdrawPkmnText:
+	text_jump Text_BattleMonNickComma
+	start_asm
+; Print text to withdraw Pkmn
+; depending on HP the message is different
+	push de
+	push bc
+	ld hl, EnemyMonHP + 1
+	ld de, wEnemyHPAtTimeOfPlayerSwitch + 1
+	ld b, [hl]
+	dec hl
+	ld a, [de]
+	sub b
+	ld [hMultiplicand + 2], a
+	dec de
+	ld b, [hl]
+	ld a, [de]
+	sbc b
+	ld [hMultiplicand + 1], a
+	ld a, 25
+	ld [hMultiplier], a
+	call Multiply
+	ld hl, EnemyMonMaxHP
+	ld a, [hli]
+	ld b, [hl]
+	srl a
+	rr b
+	srl a
+	rr b
+	ld a, b
+	ld b, 4
+	ld [hDivisor], a
+	call Divide
+	pop bc
+	pop de
+	ld a, [hQuotient + 2]
+	ld hl, TextJump_ThatsEnoughComeBack
+	and a
+	ret z
+
+	ld hl, TextJump_ComeBack
+	cp 30
+	ret c
+
+	ld hl, TextJump_OKComeBack
+	cp 70
+	ret c
+
+	ld hl, TextJump_GoodComeBack
+	ret
+; 3f348
+
+TextJump_ThatsEnoughComeBack: ; 3f348
+	text_jump Text_ThatsEnoughComeBack
+	db "@"
+; 3f34d
+
+TextJump_OKComeBack: ; 3f34d
+	text_jump Text_OKComeBack
+	db "@"
+; 3f352
+
+TextJump_GoodComeBack: ; 3f352
+	text_jump Text_GoodComeBack
+	db "@"
+; 3f357
+
+UnusedFunction_TextJump_ComeBack: ; 3f357
+; this function doesn't seem to be used
+	ld hl, TextJump_ComeBack
+	ret
+; 3f35b
+
+TextJump_ComeBack: ; 3f35b
+	text_jump Text_ComeBack
+	db "@"
+; 3f360
+
+HandleSafariAngerEatingStatus: ; unreferenced
+	ld hl, wSafariMonEating
+	ld a, [hl]
+	and a
+	jr z, .angry
+	dec [hl]
+	ld hl, BattleText_WildPkmnIsEating
+	jr .finish
+
+.angry
+	dec hl ; wSafariMonAngerCount
+	ld a, [hl]
+	and a
+	ret z
+	dec [hl]
+	ld hl, BattleText_WildPkmnIsAngry
+	jr nz, .finish
+	push hl
+	ld a, [EnemyMonSpecies]
+	ld [CurSpecies], a
+	call GetBaseData
+	ld a, [BaseCatchRate]
+	ld [EnemyMonCatchRate], a
+	pop hl
+
+.finish
+	push hl
+	call Call_LoadTempTileMapToTileMap
+	pop hl
+	jp StdBattleTextBox
+; 3f390
+
+FillInExpBar: ; 3f390
+	push hl
+	call CalcExpBar
+	pop hl
+	ld de, 7
+	add hl, de
+	jp PlaceExpBar
+; 3f39c
+
+CalcExpBar: ; 3f39c
+; Calculate the percent exp between this level and the next
+; Level in b
+	push de
+	ld d, b
+	push de
+	callfar CalcExpAtLevel
+	pop de
+; exp at current level gets pushed to the stack
+	ld hl, hMultiplicand
+	ld a, [hli]
+	push af
+	ld a, [hli]
+	push af
+	ld a, [hl]
+	push af
+; next level
+	inc d
+	callfar CalcExpAtLevel
+; back up the next level exp, and subtract the two levels
+	ld hl, hMultiplicand + 2
+	ld a, [hl]
+	ld [hMathBuffer + 2], a
+	pop bc
+	sub b
+	ld [hld], a
+	ld a, [hl]
+	ld [hMathBuffer + 1], a
+	pop bc
+	sbc b
+	ld [hld], a
+	ld a, [hl]
+	ld [hMathBuffer], a
+	pop bc
+	sbc b
+	ld [hl], a
+	pop de
+
+	ld hl, hMultiplicand + 1
+	ld a, [hli]
+	push af
+	ld a, [hl]
+	push af
+
+; get the amount of exp remaining to the next level
+	ld a, [de]
+	dec de
+	ld c, a
+	ld a, [hMathBuffer + 2]
+	sub c
+	ld [hld], a
+	ld a, [de]
+	dec de
+	ld b, a
+	ld a, [hMathBuffer + 1]
+	sbc b
+	ld [hld], a
+	ld a, [de]
+	ld c, a
+	ld a, [hMathBuffer]
+	sbc c
+	ld [hld], a
+	xor a
+	ld [hl], a
+; multiply by 64
+	ld a, $40
+	ld [hMultiplier], a
+	call Multiply
+	pop af
+	ld c, a
+	pop af
+	ld b, a
+.loop
+	ld a, b
+	and a
+	jr z, .done
+	srl b
+	rr c
+	ld hl, hProduct
+	srl [hl]
+	inc hl
+	rr [hl]
+	inc hl
+	rr [hl]
+	inc hl
+	rr [hl]
+	jr .loop
+
+.done
+	ld a, c
+	ld [hDivisor], a
+	ld b, 4
+	call Divide
+	ld a, [hQuotient + 2]
+	ld b, a
+	ld a, $40
+	sub b
+	ld b, a
+	ret
+; 3f41c
+
+PlaceExpBar: ; 3f41c
+	ld c, $8 ; number of tiles
+.loop1
+	ld a, b
+	sub $8
+	jr c, .next
+	ld b, a
+	ld a, $6a ; full bar
+	ld [hld], a
+	dec c
+	jr z, .finish
+	jr .loop1
+
+.next
+	add $8
+	jr z, .loop2
+	add $54 ; tile to the left of small exp bar tile
+	jr .skip
+
+.loop2
+	ld a, $62 ; empty bar
+
+.skip
+	ld [hld], a
+	ld a, $62 ; empty bar
+	dec c
+	jr nz, .loop2
+
+.finish
+	ret
+; 3f43d
+
+GetBattleMonBackpic: ; 3f43d
+	ld a, [PlayerSubStatus4]
+	bit SUBSTATUS_SUBSTITUTE, a
+	ld hl, BattleAnimCmd_RaiseSub
+	jr nz, GetBattleMonBackpic_DoAnim ; substitute
+
+DropPlayerSub: ; 3f447
+	ld a, [wPlayerMinimized]
+	and a
+	ld hl, BattleAnimCmd_MinimizeOpp
+	jr nz, GetBattleMonBackpic_DoAnim
+	ld a, [CurPartySpecies]
+	push af
+	ld a, [BattleMonSpecies]
+	ld [CurPartySpecies], a
+	ld hl, BattleMonDVs
+	predef GetUnownLetter
+	ld de, VTiles2 tile $31
+	predef GetMonBackpic
+	pop af
+	ld [CurPartySpecies], a
+	ret
+; 3f46f
+
+GetBattleMonBackpic_DoAnim: ; 3f46f
+	ld a, [hBattleTurn]
+	push af
+	xor a
+	ld [hBattleTurn], a
+	ld a, BANK(BattleAnimCommands)
+	rst FarCall
+	pop af
+	ld [hBattleTurn], a
+	ret
+; 3f47c
+
+GetEnemyMonFrontpic: ; 3f47c
+	ld a, [EnemySubStatus4]
+	bit SUBSTATUS_SUBSTITUTE, a
+	ld hl, BattleAnimCmd_RaiseSub
+	jr nz, GetEnemyMonFrontpic_DoAnim
+
+DropEnemySub: ; 3f486
+	ld a, [wEnemyMinimized]
+	and a
+	ld hl, BattleAnimCmd_MinimizeOpp
+	jr nz, GetEnemyMonFrontpic_DoAnim
+
+	ld a, [CurPartySpecies]
+	push af
+	ld a, [EnemyMonSpecies]
+	ld [CurSpecies], a
+	ld [CurPartySpecies], a
+	call GetBaseData
+	ld hl, EnemyMonDVs
+	predef GetUnownLetter
+	ld de, VTiles2
+	predef GetAnimatedFrontpicPredef
+	pop af
+	ld [CurPartySpecies], a
+	ret
+; 3f4b4
+
+GetEnemyMonFrontpic_DoAnim: ; 3f4b4
+	ld a, [hBattleTurn]
+	push af
+	call SetEnemyTurn
+	ld a, BANK(BattleAnimCommands)
+	rst FarCall
+	pop af
+	ld [hBattleTurn], a
+	ret
+; 3f4c1
+
+StartBattle: ; 3f4c1
+; This check prevents you from entering a battle without any Pokemon.
+; Those using walk-through-walls to bypass getting a Pokemon experience
+; the effects of this check.
+	ld a, [PartyCount]
+	and a
+	ret z
+
+	ld a, [TimeOfDayPal]
+	push af
+	call BattleIntro
+	call DoBattle
+	call ExitBattle
+	pop af
+	ld [TimeOfDayPal], a
+	scf
+	ret
+; 3f4d9
+
+_DoBattle: ; 3f4d9
+; unreferenced
+	call DoBattle
+	ret
+; 3f4dd
+
+BattleIntro: ; 3f4dd
+	farcall TrainerRankings_Battles ; mobile
+	call LoadTrainerOrWildMonPic
+	xor a
+	ld [TempBattleMonSpecies], a
+	ld [wBattleMenuCursorBuffer], a
+	xor a
+	ld [hMapAnims], a
+	farcall PlayBattleMusic
+	farcall ShowLinkBattleParticipants
+	farcall FindFirstAliveMonAndStartBattle
+	call DisableSpriteUpdates
+	farcall ClearBattleRAM
+	call InitEnemy
+	call BackUpVBGMap2
+	ld b, SCGB_BATTLE_GRAYSCALE
+	call GetSGBLayout
+	ld hl, rLCDC
+	res 6, [hl]
+	call InitBattleDisplay
+	call BattleStartMessage
+	ld hl, rLCDC
+	set 6, [hl]
+	xor a
+	ld [hBGMapMode], a
+	call EmptyBattleTextBox
+	hlcoord 9, 7
+	lb bc, 5, 11
+	call ClearBox
+	hlcoord 1, 0
+	lb bc, 4, 10
+	call ClearBox
+	call ClearSprites
+	ld a, [wBattleMode]
+	cp WILD_BATTLE
+	call z, UpdateEnemyHUD
+	ld a, $1
+	ld [hBGMapMode], a
+	ret
+; 3f54e
+
+LoadTrainerOrWildMonPic: ; 3f54e
+	ld a, [OtherTrainerClass]
+	and a
+	jr nz, .Trainer
+	ld a, [TempWildMonSpecies]
+	ld [CurPartySpecies], a
+
+.Trainer:
+	ld [TempEnemyMonSpecies], a
+	ret
+; 3f55e
+
+InitEnemy: ; 3f55e
+	ld a, [OtherTrainerClass]
+	and a
+	jp nz, InitEnemyTrainer ; trainer
+	jp InitEnemyWildmon ; wild
+; 3f568
+
+BackUpVBGMap2: ; 3f568
+	ld a, [rSVBK]
+	push af
+	ld a, $6 ; BANK(wDecompressScratch)
+	ld [rSVBK], a
+	ld hl, wDecompressScratch
+	ld bc, $40 tiles ; VBGMap3 - VBGMap2
+	ld a, $2
+	call ByteFill
+	ld a, [rVBK]
+	push af
+	ld a, $1
+	ld [rVBK], a
+	ld de, wDecompressScratch
+	hlbgcoord 0, 0 ; VBGMap2
+	lb bc, BANK(BackUpVBGMap2), $40
+	call Request2bpp
+	pop af
+	ld [rVBK], a
+	pop af
+	ld [rSVBK], a
+	ret
+; 3f594
+
+InitEnemyTrainer: ; 3f594
+	ld [TrainerClass], a
+	farcall TrainerRankings_TrainerBattles
+	xor a
+	ld [TempEnemyMonSpecies], a
+	callfar GetTrainerAttributes
+	callfar ReadTrainerParty
+
+	ld a, [TrainerClass]
+	cp RIVAL1
+	jr nz, .ok
+	xor a
+	ld [OTPartyMon1Item], a
+.ok
+
+	ld de, VTiles2
+	callfar GetTrainerPic
+	xor a
+	ld [hGraphicStartTile], a
+	dec a
+	ld [wEnemyItemState], a
+	hlcoord 12, 0
+	lb bc, 7, 7
+	predef PlaceGraphic
+	ld a, -1
+	ld [CurOTMon], a
+	ld a, TRAINER_BATTLE
+	ld [wBattleMode], a
+
+	call IsJohtoGymLeader
+	jr nc, .done
+	xor a
+	ld [CurPartyMon], a
+	ld a, [PartyCount]
+	ld b, a
+.partyloop
+	push bc
+	ld a, MON_HP
+	call GetPartyParamLocation
+	ld a, [hli]
+	or [hl]
+	jr z, .skipfaintedmon
+	ld c, HAPPINESS_GYMBATTLE
+	callfar ChangeHappiness
+.skipfaintedmon
+	pop bc
+	dec b
+	jr z, .done
+	ld hl, CurPartyMon
+	inc [hl]
+	jr .partyloop
+.done
+	ret
+; 3f607
+
+InitEnemyWildmon: ; 3f607
+	ld a, WILD_BATTLE
+	ld [wBattleMode], a
+	farcall TrainerRankings_WildBattles
+	call LoadEnemyMon
+	ld hl, EnemyMonMoves
+	ld de, wWildMonMoves
+	ld bc, NUM_MOVES
+	call CopyBytes
+	ld hl, EnemyMonPP
+	ld de, wWildMonPP
+	ld bc, NUM_MOVES
+	call CopyBytes
+	ld hl, EnemyMonDVs
+	predef GetUnownLetter
+	ld a, [CurPartySpecies]
+	cp UNOWN
+	jr nz, .skip_unown
+	ld a, [wFirstUnownSeen]
+	and a
+	jr nz, .skip_unown
+	ld a, [UnownLetter]
+	ld [wFirstUnownSeen], a
+.skip_unown
+	ld de, VTiles2
+	predef GetAnimatedFrontpicPredef
+	xor a
+	ld [TrainerClass], a
+	ld [hGraphicStartTile], a
+	hlcoord 12, 0
+	lb bc, 7, 7
+	predef PlaceGraphic
+	ret
+; 3f662
+
+Function3f662: ; 3f662
+; XXX
+	ld hl, EnemyMonMoves
+	ld de, wListMoves_MoveIndicesBuffer
+	ld b, NUM_MOVES
+.loop
+	ld a, [de]
+	inc de
+	ld [hli], a
+	and a
+	jr z, .clearpp
+
+	push bc
+	push hl
+
+	push hl
+	dec a
+	ld hl, Moves + MOVE_PP
+	ld bc, MOVE_LENGTH
+	call AddNTimes
+	ld a, BANK(Moves)
+	call GetFarByte
+	pop hl
+
+	ld bc, EnemyMonPP - (EnemyMonMoves + 1)
+	add hl, bc
+	ld [hl], a
+
+	pop hl
+	pop bc
+
+	dec b
+	jr nz, .loop
+	ret
+
+.clear
+	xor a
+	ld [hli], a
+
+.clearpp
+	push bc
+	push hl
+	ld bc, EnemyMonPP - (EnemyMonMoves + 1)
+	add hl, bc
+	xor a
+	ld [hl], a
+	pop hl
+	pop bc
+	dec b
+	jr nz, .clear
+	ret
+; 3f69e
+
+ExitBattle: ; 3f69e
+	call .HandleEndOfBattle
+	call CleanUpBattleRAM
+	ret
+; 3f6a5
+
+.HandleEndOfBattle: ; 3f6a5
+	ld a, [wLinkMode]
+	and a
+	jr z, .not_linked
+	call ShowLinkBattleParticipantsAfterEnd
+	ld c, 150
+	call DelayFrames
+	call DisplayLinkBattleResult
+	ret
+
+.not_linked
+	ld a, [wBattleResult]
+	and $f
+	ret nz
+	call CheckPayDay
+	xor a
+	ld [wForceEvolution], a
+	predef EvolveAfterBattle
+	farcall GivePokerusAndConvertBerries
+	ret
+; 3f6d0
+
+CleanUpBattleRAM: ; 3f6d0
+	call BattleEnd_HandleRoamMons
+	xor a
+	ld [Danger], a
+	ld [wBattleMode], a
+	ld [BattleType], a
+	ld [AttackMissed], a
+	ld [TempWildMonSpecies], a
+	ld [OtherTrainerClass], a
+	ld [wFailedToFlee], a
+	ld [wNumFleeAttempts], a
+	ld [wForcedSwitch], a
+	ld [wPartyMenuCursor], a
+	ld [wKeyItemsPocketCursor], a
+	ld [wItemsPocketCursor], a
+	ld [wBattleMenuCursorBuffer], a
+	ld [CurMoveNum], a
+	ld [wBallsPocketCursor], a
+	ld [wLastPocket], a
+	ld [wMenuScrollPosition], a
+	ld [wKeyItemsPocketScrollPosition], a
+	ld [wItemsPocketScrollPosition], a
+	ld [wBallsPocketScrollPosition], a
+	ld hl, PlayerSubStatus1
+	ld b, EnemyFuryCutterCount - PlayerSubStatus1
+.loop
+	ld [hli], a
+	dec b
+	jr nz, .loop
+	call WaitSFX
+	ret
+; 3f71d
+
+CheckPayDay: ; 3f71d
+	ld hl, wPayDayMoney
+	ld a, [hli]
+	or [hl]
+	inc hl
+	or [hl]
+	ret z
+	ld a, [wAmuletCoin]
+	and a
+	jr z, .okay
+	ld hl, wPayDayMoney + 2
+	sla [hl]
+	dec hl
+	rl [hl]
+	dec hl
+	rl [hl]
+	jr nc, .okay
+	ld a, $ff
+	ld [hli], a
+	ld [hli], a
+	ld [hl], a
+
+.okay
+	ld hl, wPayDayMoney + 2
+	ld de, Money + 2
+	call AddBattleMoneyToAccount
+	ld hl, BattleText_PlayerPickedUpPayDayMoney
+	call StdBattleTextBox
+	ld a, [InBattleTowerBattle]
+	bit 0, a
+	ret z
+	call ClearTileMap
+	call ClearBGPalettes
+	ret
+; 3f759
+
+ShowLinkBattleParticipantsAfterEnd: ; 3f759
+	farcall TrainerRankings_LinkBattles
+	farcall BackupMobileEventIndex
+	ld a, [CurOTMon]
+	ld hl, OTPartyMon1Status
+	call GetPartyLocation
+	ld a, [EnemyMonStatus]
+	ld [hl], a
+	call ClearTileMap
+	farcall _ShowLinkBattleParticipants
+	ret
+; 3f77c
+
+DisplayLinkBattleResult: ; 3f77c
+	farcall CheckMobileBattleError
+	jp c, .Mobile_InvalidBattle
+	call IsMobileBattle2
+	jr nz, .proceed
+
+	ld hl, wcd2a
+	bit 4, [hl]
+	jr z, .proceed
+
+	farcall DetermineLinkBattleResult
+
+.proceed
+	ld a, [wBattleResult]
+	and $f
+	cp $1
+	jr c, .victory
+	jr z, .loss
+	farcall TrainerRankings_ColosseumDraws
+	ld de, .Draw
+	jr .store_result
+
+.victory
+	farcall TrainerRankings_ColosseumWins
+	ld de, .Win
+	jr .store_result
+
+.loss
+	farcall TrainerRankings_ColosseumLosses
+	ld de, .Lose
+	jr .store_result
+
+.store_result
+	hlcoord 6, 8
+	call PlaceString
+	farcall BackupMobileEventIndex
+	ld c, 200
+	call DelayFrames
+
+	ld a, BANK(sLinkBattleStats)
+	call GetSRAMBank
+
+	call AddLastMobileBattleToLinkRecord
+	call ReadAndPrintLinkBattleRecord
+
+	call CloseSRAM
+
+	call IsMobileBattle2
+	jr z, .mobile
+	call WaitPressAorB_BlinkCursor
+	call ClearTileMap
+	ret
+
+.mobile
+	ld c, 200
+	call DelayFrames
+	call ClearTileMap
+	ret
+; 3f7f7
+
+.Win:
+	db "YOU WIN@"
+.Lose:
+	db "YOU LOSE@"
+.Draw:
+	db "  DRAW@"
+; 3f80f
+
+.Mobile_InvalidBattle: ; 3f80f
+	hlcoord 6, 8
+	ld de, .Invalid
+	call PlaceString
+	ld c, 200
+	call DelayFrames
+	call ClearTileMap
+	ret
+; 3f821
+
+.Invalid:
+	db "INVALID BATTLE@"
+; 3f830
+
+IsMobileBattle2: ; 3f830
+	ld a, [wLinkMode]
+	cp LINK_MOBILE
+	ret
+; 3f836
+
+DisplayLinkRecord: ; 3f836
+	ld a, BANK(sLinkBattleStats)
+	call GetSRAMBank
+
+	call ReadAndPrintLinkBattleRecord
+
+	call CloseSRAM
+	hlcoord 0, 0, AttrMap
+	xor a
+	ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
+	call ByteFill
+	call WaitBGMap2
+	ld b, SCGB_DIPLOMA
+	call GetSGBLayout
+	call SetPalettes
+	ld c, 8
+	call DelayFrames
+	call WaitPressAorB_BlinkCursor
+	ret
+; 3f85f
+
+ReadAndPrintLinkBattleRecord: ; 3f85f
+	call ClearTileMap
+	call ClearSprites
+	call .PrintBattleRecord
+	hlcoord 0, 8
+	ld b, 5
+	ld de, sLinkBattleRecord + 2
+.loop
+	push bc
+	push hl
+	push de
+	ld a, [de]
+	and a
+	jr z, .PrintFormatString
+	ld a, [wSavedAtLeastOnce]
+	and a
+	jr z, .PrintFormatString
+	push hl
+	push hl
+	ld h, d
+	ld l, e
+	ld de, wd002
+	ld bc, 10
+	call CopyBytes
+	ld a, "@"
+	ld [de], a
+	inc de
+	ld bc, 6
+	call CopyBytes
+	ld de, wd002
+	pop hl
+	call PlaceString
+	pop hl
+	ld de, 26
+	add hl, de
+	push hl
+	ld de, wd00d
+	lb bc, 2, 4
+	call PrintNum
+	pop hl
+	ld de, 5
+	add hl, de
+	push hl
+	ld de, wd00f
+	lb bc, 2, 4
+	call PrintNum
+	pop hl
+	ld de, 5
+	add hl, de
+	ld de, wd011
+	lb bc, 2, 4
+	call PrintNum
+	jr .next
+
+.PrintFormatString:
+	ld de, .Format
+	call PlaceString
+.next
+	pop hl
+	ld bc, 18
+	add hl, bc
+	ld d, h
+	ld e, l
+	pop hl
+	ld bc, 2 * SCREEN_WIDTH
+	add hl, bc
+	pop bc
+	dec b
+	jr nz, .loop
+	ret
+
+.PrintBattleRecord:
+	hlcoord 1, 0
+	ld de, .Record
+	call PlaceString
+
+	hlcoord 0, 6
+	ld de, .Result
+	call PlaceString
+
+	hlcoord 0, 2
+	ld de, .Total
+	call PlaceString
+
+	hlcoord 6, 4
+	ld de, sLinkBattleWins
+	call .PrintZerosIfNoSaveFileExists
+	jr c, .quit
+
+	lb bc, 2, 4
+	call PrintNum
+
+	hlcoord 11, 4
+	ld de, sLinkBattleLosses
+	call .PrintZerosIfNoSaveFileExists
+
+	lb bc, 2, 4
+	call PrintNum
+
+	hlcoord 16, 4
+	ld de, sLinkBattleDraws
+	call .PrintZerosIfNoSaveFileExists
+
+	lb bc, 2, 4
+	call PrintNum
+
+.quit
+	ret
+
+.PrintZerosIfNoSaveFileExists:
+	ld a, [wSavedAtLeastOnce]
+	and a
+	ret nz
+	ld de, .Scores
+	call PlaceString
+	scf
+	ret
+; 3f938
+
+.Scores:
+	db "   0    0    0@"
+; 3f947
+
+.Format: ; 3f947
+	db "  ---  <LNBRK>"
+	db "         -    -    -@"
+.Record: ; 3f964
+	db "<PLAYER>'s RECORD@"
+.Result: ; 3f96e
+	db "RESULT WIN LOSE DRAW@"
+.Total: ; 3f983
+	db "TOTAL  WIN LOSE DRAW@"
+; 3f998
+
+BattleEnd_HandleRoamMons: ; 3f998
+	ld a, [BattleType]
+	cp BATTLETYPE_ROAMING
+	jr nz, .not_roaming
+	ld a, [wBattleResult]
+	and $f
+	jr z, .caught_or_defeated_roam_mon
+	call GetRoamMonHP
+	ld a, [EnemyMonHP + 1]
+	ld [hl], a
+	jr .update_roam_mons
+
+.caught_or_defeated_roam_mon
+	call GetRoamMonHP
+	ld [hl], $0
+	call GetRoamMonMapGroup
+	ld [hl], $ff
+	call GetRoamMonMapNumber
+	ld [hl], $ff
+	call GetRoamMonSpecies
+	ld [hl], $0
+	ret
+
+.not_roaming
+	call BattleRandom
+	and $f
+	ret nz
+
+.update_roam_mons
+	callfar UpdateRoamMons
+	ret
+; 3f9d1
+
+GetRoamMonMapGroup: ; 3f9d1
+	ld a, [TempEnemyMonSpecies]
+	ld b, a
+	ld a, [wRoamMon1Species]
+	cp b
+	ld hl, wRoamMon1MapGroup
+	ret z
+	ld a, [wRoamMon2Species]
+	cp b
+	ld hl, wRoamMon2MapGroup
+	ret z
+	ld hl, wRoamMon3MapGroup
+	ret
+; 3f9e9
+
+GetRoamMonMapNumber: ; 3f9e9
+	ld a, [TempEnemyMonSpecies]
+	ld b, a
+	ld a, [wRoamMon1Species]
+	cp b
+	ld hl, wRoamMon1MapNumber
+	ret z
+	ld a, [wRoamMon2Species]
+	cp b
+	ld hl, wRoamMon2MapNumber
+	ret z
+	ld hl, wRoamMon3MapNumber
+	ret
+; 3fa01
+
+GetRoamMonHP: ; 3fa01
+; output: hl = wRoamMonHP
+	ld a, [TempEnemyMonSpecies]
+	ld b, a
+	ld a, [wRoamMon1Species]
+	cp b
+	ld hl, wRoamMon1HP
+	ret z
+	ld a, [wRoamMon2Species]
+	cp b
+	ld hl, wRoamMon2HP
+	ret z
+	ld hl, wRoamMon3HP
+	ret
+; 3fa19
+
+GetRoamMonDVs: ; 3fa19
+; output: hl = wRoamMonDVs
+	ld a, [TempEnemyMonSpecies]
+	ld b, a
+	ld a, [wRoamMon1Species]
+	cp b
+	ld hl, wRoamMon1DVs
+	ret z
+	ld a, [wRoamMon2Species]
+	cp b
+	ld hl, wRoamMon2DVs
+	ret z
+	ld hl, wRoamMon3DVs
+	ret
+; 3fa31
+
+GetRoamMonSpecies: ; 3fa31
+	ld a, [TempEnemyMonSpecies]
+	ld hl, wRoamMon1Species
+	cp [hl]
+	ret z
+	ld hl, wRoamMon2Species
+	cp [hl]
+	ret z
+	ld hl, wRoamMon3Species
+	ret
+; 3fa42
+
+AddLastMobileBattleToLinkRecord: ; 3fa42
+	ld hl, OTPlayerID
+	ld de, StringBuffer1
+	ld bc, 2
+	call CopyBytes
+	ld hl, OTPlayerName
+	ld bc, NAME_LENGTH - 1
+	call CopyBytes
+	ld hl, sLinkBattleResults
+	call .StoreResult
+	ld hl, sLinkBattleRecord
+	ld d, 5
+.loop
+	push hl
+	inc hl
+	inc hl
+	ld a, [hl]
+	dec hl
+	dec hl
+	and a
+	jr z, .copy
+	push de
+	ld bc, 12
+	ld de, StringBuffer1
+	call CompareLong
+	pop de
+	pop hl
+	jr c, .done
+	ld bc, 18
+	add hl, bc
+	dec d
+	jr nz, .loop
+	ld bc, -18
+	add hl, bc
+	push hl
+
+.copy
+	ld d, h
+	ld e, l
+	ld hl, StringBuffer1
+	ld bc, 12
+	call CopyBytes
+	ld b, 6
+	xor a
+.loop2
+	ld [de], a
+	inc de
+	dec b
+	jr nz, .loop2
+	pop hl
+
+.done
+	call .StoreResult
+	call .FindOpponentAndAppendRecord
+	ret
+; 3faa0
+.StoreResult: ; 3faa0
+	ld a, [wBattleResult]
+	and $f
+	cp $1
+	ld bc, sLinkBattleWins + 1 - sLinkBattleResults
+	jr c, .okay
+	ld bc, sLinkBattleLosses + 1 - sLinkBattleResults
+	jr z, .okay
+	ld bc, sLinkBattleDraws + 1 - sLinkBattleResults
+.okay
+	add hl, bc
+	call .CheckOverflow
+	ret nc
+	inc [hl]
+	ret nz
+	dec hl
+	inc [hl]
+	ret
+; 3fabe
+
+.CheckOverflow: ; 3fabe
+	dec hl
+	ld a, [hl]
+	inc hl
+	cp HIGH(MAX_LINK_RECORD)
+	ret c
+	ld a, [hl]
+	cp LOW(MAX_LINK_RECORD)
+	ret
+; 3fac8
+
+.FindOpponentAndAppendRecord: ; 3fac8
+	ld b, 5
+	ld hl, sLinkBattleRecord + 17
+	ld de, wd002
+.loop3
+	push bc
+	push de
+	push hl
+	call .LoadPointer
+	pop hl
+	ld a, e
+	pop de
+	ld [de], a
+	inc de
+	ld a, b
+	ld [de], a
+	inc de
+	ld a, c
+	ld [de], a
+	inc de
+	ld bc, 18
+	add hl, bc
+	pop bc
+	dec b
+	jr nz, .loop3
+	ld b, $0
+	ld c, $1
+.loop4
+	ld a, b
+	add b
+	add b
+	ld e, a
+	ld d, $0
+	ld hl, wd002
+	add hl, de
+	push hl
+	ld a, c
+	add c
+	add c
+	ld e, a
+	ld d, $0
+	ld hl, wd002
+	add hl, de
+	ld d, h
+	ld e, l
+	pop hl
+	push bc
+	ld c, 3
+	call StringCmp
+	pop bc
+	jr z, .equal
+	jr nc, .done2
+
+.equal
+	inc c
+	ld a, c
+	cp $5
+	jr nz, .loop4
+	inc b
+	ld c, b
+	inc c
+	ld a, b
+	cp $4
+	jr nz, .loop4
+	ret
+
+.done2
+	push bc
+	ld a, b
+	ld bc, 18
+	ld hl, sLinkBattleRecord
+	call AddNTimes
+	push hl
+	ld de, wd002
+	ld bc, 18
+	call CopyBytes
+	pop hl
+	pop bc
+	push hl
+	ld a, c
+	ld bc, 18
+	ld hl, sLinkBattleRecord
+	call AddNTimes
+	pop de
+	push hl
+	ld bc, 18
+	call CopyBytes
+	ld hl, wd002
+	ld bc, 18
+	pop de
+	call CopyBytes
+	ret
+; 3fb54
+
+.LoadPointer: ; 3fb54
+	ld e, $0
+	ld a, [hld]
+	ld c, a
+	ld a, [hld]
+	ld b, a
+	ld a, [hld]
+	add c
+	ld c, a
+	ld a, [hld]
+	adc b
+	ld b, a
+	jr nc, .okay2
+	inc e
+
+.okay2
+	ld a, [hld]
+	add c
+	ld c, a
+	ld a, [hl]
+	adc b
+	ld b, a
+	ret nc
+	inc e
+	ret
+; 3fb6c
+
+InitBattleDisplay: ; 3fb6c
+	call .InitBackPic
+	hlcoord 0, 12
+	ld b, 4
+	ld c, 18
+	call TextBox
+	farcall MobileTextBorder
+	hlcoord 1, 5
+	lb bc, 3, 7
+	call ClearBox
+	call LoadStandardFont
+	call _LoadBattleFontsHPBar
+	call .BlankBGMap
+	xor a
+	ld [hMapAnims], a
+	ld [hSCY], a
+	ld a, $90
+	ld [hWY], a
+	ld [rWY], a
+	call WaitBGMap
+	xor a
+	ld [hBGMapMode], a
+	farcall BattleIntroSlidingPics
+	ld a, $1
+	ld [hBGMapMode], a
+	ld a, $31
+	ld [hGraphicStartTile], a
+	hlcoord 2, 6
+	lb bc, 6, 6
+	predef PlaceGraphic
+	xor a
+	ld [hWY], a
+	ld [rWY], a
+	call WaitBGMap
+	call HideSprites
+	ld b, SCGB_BATTLE_COLORS
+	call GetSGBLayout
+	call SetPalettes
+	ld a, $90
+	ld [hWY], a
+	xor a
+	ld [hSCX], a
+	ret
+; 3fbd6
+
+.BlankBGMap: ; 3fbd6
+	ld a, [rSVBK]
+	push af
+	ld a, $6
+	ld [rSVBK], a
+
+	ld hl, wDecompressScratch
+	ld bc, wScratchAttrMap - wDecompressScratch
+	ld a, " "
+	call ByteFill
+
+	ld de, wDecompressScratch
+	hlbgcoord 0, 0
+	lb bc, BANK(.BlankBGMap), $40
+	call Request2bpp
+
+	pop af
+	ld [rSVBK], a
+	ret
+; 3fbf8
+
+.InitBackPic: ; 3fbf8
+	call GetTrainerBackpic
+	call CopyBackpic
+	ret
+; 3fbff
+
+GetTrainerBackpic: ; 3fbff
+; Load the player character's backpic (6x6) into VRAM starting from VTiles2 tile $31.
+
+; Special exception for Dude.
+	ld b, BANK(DudeBackpic)
+	ld hl, DudeBackpic
+	ld a, [BattleType]
+	cp BATTLETYPE_TUTORIAL
+	jr z, .Decompress
+
+; What gender are we?
+	ld a, [wPlayerSpriteSetupFlags]
+	bit 2, a ; transformed to male
+	jr nz, .Chris
+	ld a, [PlayerGender]
+	bit 0, a
+	jr z, .Chris
+
+; It's a girl.
+	farcall GetKrisBackpic
+	ret
+
+.Chris:
+; It's a boy.
+	ld b, BANK(ChrisBackpic)
+	ld hl, ChrisBackpic
+
+.Decompress:
+	ld de, VTiles2 tile $31
+	ld c, $31
+	predef DecompressPredef
+	ret
+; 3fc30
+
+CopyBackpic: ; 3fc30
+	ld a, [rSVBK]
+	push af
+	ld a, $6
+	ld [rSVBK], a
+	ld hl, VTiles0
+	ld de, VTiles2 tile $31
+	ld a, [hROMBank]
+	ld b, a
+	ld c, $31
+	call Get2bpp
+	pop af
+	ld [rSVBK], a
+	call .LoadTrainerBackpicAsOAM
+	ld a, $31
+	ld [hGraphicStartTile], a
+	hlcoord 2, 6
+	lb bc, 6, 6
+	predef PlaceGraphic
+	ret
+; 3fc5b
+
+.LoadTrainerBackpicAsOAM: ; 3fc5b
+	ld hl, Sprites
+	xor a
+	ld [hMapObjectIndexBuffer], a
+	ld b, $6
+	ld e, 21 * 8
+.outer_loop
+	ld c, $3
+	ld d, 8 * 8
+.inner_loop
+	ld [hl], d
+	inc hl
+	ld [hl], e
+	inc hl
+	ld a, [hMapObjectIndexBuffer]
+	ld [hli], a
+	inc a
+	ld [hMapObjectIndexBuffer], a
+	ld a, $1
+	ld [hli], a
+	ld a, d
+	add $8
+	ld d, a
+	dec c
+	jr nz, .inner_loop
+	ld a, [hMapObjectIndexBuffer]
+	add $3
+	ld [hMapObjectIndexBuffer], a
+	ld a, e
+	add $8
+	ld e, a
+	dec b
+	jr nz, .outer_loop
+	ret
+; 3fc8b
+
+BattleStartMessage: ; 3fc8b
+	ld a, [wBattleMode]
+	dec a
+	jr z, .wild
+
+	ld de, SFX_SHINE
+	call PlaySFX
+	call WaitSFX
+
+	ld c, 20
+	call DelayFrames
+
+	farcall Battle_GetTrainerName
+
+	ld hl, WantsToBattleText
+	jr .PlaceBattleStartText
+
+.wild
+	call BattleCheckEnemyShininess
+	jr nc, .not_shiny
+
+	xor a
+	ld [wNumHits], a
+	ld a, 1
+	ld [hBattleTurn], a
+	ld a, 1
+	ld [wBattleAnimParam], a
+	ld de, ANIM_SEND_OUT_MON
+	call Call_PlayBattleAnim
+
+.not_shiny
+	farcall CheckSleepingTreeMon
+	jr c, .skip_cry
+
+	farcall CheckBattleScene
+	jr c, .cry_no_anim
+
+	hlcoord 12, 0
+	ld d, $0
+	ld e, ANIM_MON_NORMAL
+	predef AnimateFrontpic
+	jr .skip_cry ; cry is played during the animation
+
+.cry_no_anim
+	ld a, $0f
+	ld [CryTracks], a
+	ld a, [TempEnemyMonSpecies]
+	call PlayStereoCry
+
+.skip_cry
+	ld a, [BattleType]
+	cp BATTLETYPE_FISH
+	jr nz, .NotFishing
+
+	farcall TrainerRankings_HookedEncounters
+
+	ld hl, HookedPokemonAttackedText
+	jr .PlaceBattleStartText
+
+.NotFishing:
+	ld hl, PokemonFellFromTreeText
+	cp BATTLETYPE_TREE
+	jr z, .PlaceBattleStartText
+	ld hl, WildCelebiAppearedText
+	cp BATTLETYPE_CELEBI
+	jr z, .PlaceBattleStartText
+	ld hl, WildPokemonAppearedText
+
+.PlaceBattleStartText:
+	push hl
+	farcall BattleStart_TrainerHuds
+	pop hl
+	call StdBattleTextBox
+
+	call IsMobileBattle2
+	ret nz
+
+	ld c, $2 ; start
+	farcall Mobile_PrintOpponentBattleMessage
+
+	ret
+; 3fd26
--- /dev/null
+++ b/engine/battle/effect_commands.asm
@@ -1,0 +1,10066 @@
+DoPlayerTurn: ; 34000
+	call SetPlayerTurn
+
+	ld a, [wPlayerAction]
+	and a
+	ret nz
+
+	jr DoTurn
+
+; 3400a
+
+
+DoEnemyTurn: ; 3400a
+	call SetEnemyTurn
+
+	ld a, [wLinkMode]
+	and a
+	jr z, DoTurn
+
+	ld a, [wBattleAction]
+	cp BATTLEACTION_E
+	jr z, DoTurn
+	cp BATTLEACTION_SWITCH1
+	ret nc
+
+	; fallthrough
+; 3401d
+
+
+DoTurn: ; 3401d
+; Read in and execute the user's move effects for this turn.
+
+	xor a
+	ld [wTurnEnded], a
+
+	; Effect command checkturn is called for every move.
+	call CheckTurn
+
+	ld a, [wTurnEnded]
+	and a
+	ret nz
+
+	call UpdateMoveData
+; 3402c
+
+
+DoMove: ; 3402c
+; Get the user's move effect.
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call GetBattleVar
+	ld c, a
+	ld b, 0
+	ld hl, MoveEffectsPointers
+	add hl, bc
+	add hl, bc
+	ld a, BANK(MoveEffectsPointers)
+	call GetFarHalfword
+
+	ld de, BattleScriptBuffer
+
+.GetMoveEffect:
+	ld a, BANK(MoveEffects)
+	call GetFarByte
+	inc hl
+	ld [de], a
+	inc de
+	cp $ff
+	jr nz, .GetMoveEffect
+
+; Start at the first command.
+	ld hl, BattleScriptBuffer
+	ld a, l
+	ld [BattleScriptBufferAddress], a
+	ld a, h
+	ld [BattleScriptBufferAddress + 1], a
+
+.ReadMoveEffectCommand:
+
+; ld a, [BattleScriptBufferAddress++]
+	ld a, [BattleScriptBufferAddress]
+	ld l, a
+	ld a, [BattleScriptBufferAddress + 1]
+	ld h, a
+
+	ld a, [hli]
+
+	push af
+	ld a, l
+	ld [BattleScriptBufferAddress], a
+	ld a, h
+	ld [BattleScriptBufferAddress + 1], a
+	pop af
+
+; endturn_command (-2) is used to terminate branches without ending the read cycle.
+	cp endturn_command
+	ret nc
+
+; The rest of the commands (01-af) are read from BattleCommandPointers.
+	push bc
+	dec a
+	ld c, a
+	ld b, 0
+	ld hl, BattleCommandPointers
+	add hl, bc
+	add hl, bc
+	pop bc
+
+	ld a, BANK(BattleCommandPointers)
+	call GetFarHalfword
+
+	call .DoMoveEffectCommand
+
+	jr .ReadMoveEffectCommand
+
+.DoMoveEffectCommand:
+	jp hl
+
+; 34084
+
+
+CheckTurn:
+BattleCommand_CheckTurn: ; 34084
+; checkturn
+
+; Repurposed as hardcoded turn handling. Useless as a command.
+
+; Move $ff immediately ends the turn.
+	ld a, BATTLE_VARS_MOVE
+	call GetBattleVar
+	inc a
+	jp z, EndTurn
+
+	xor a
+	ld [AttackMissed], a
+	ld [EffectFailed], a
+	ld [wKickCounter], a
+	ld [AlreadyDisobeyed], a
+	ld [AlreadyFailed], a
+	ld [wSomeoneIsRampaging], a
+
+	ld a, 10 ; 1.0
+	ld [TypeModifier], a
+
+	ld a, [hBattleTurn]
+	and a
+	jp nz, CheckEnemyTurn
+
+
+CheckPlayerTurn:
+
+	ld hl, PlayerSubStatus4
+	bit SUBSTATUS_RECHARGE, [hl]
+	jr z, .no_recharge
+
+	res SUBSTATUS_RECHARGE, [hl]
+	ld hl, MustRechargeText
+	call StdBattleTextBox
+	call CantMove
+	jp EndTurn
+
+.no_recharge
+
+
+	ld hl, BattleMonStatus
+	ld a, [hl]
+	and SLP
+	jr z, .not_asleep
+
+	dec a
+	ld [BattleMonStatus], a
+	and SLP
+	jr z, .woke_up
+
+	xor a
+	ld [wNumHits], a
+	ld de, ANIM_SLP
+	call FarPlayBattleAnimation
+	jr .fast_asleep
+
+.woke_up
+	ld hl, WokeUpText
+	call StdBattleTextBox
+	call CantMove
+	call UpdateBattleMonInParty
+	ld hl, UpdatePlayerHUD
+	call CallBattleCore
+	ld a, $1
+	ld [hBGMapMode], a
+	ld hl, PlayerSubStatus1
+	res SUBSTATUS_NIGHTMARE, [hl]
+	jr .not_asleep
+
+.fast_asleep
+	ld hl, FastAsleepText
+	call StdBattleTextBox
+
+	; Snore and Sleep Talk bypass sleep.
+	ld a, [CurPlayerMove]
+	cp SNORE
+	jr z, .not_asleep
+	cp SLEEP_TALK
+	jr z, .not_asleep
+
+	call CantMove
+	jp EndTurn
+
+.not_asleep
+
+
+	ld hl, BattleMonStatus
+	bit FRZ, [hl]
+	jr z, .not_frozen
+
+	; Flame Wheel and Sacred Fire thaw the user.
+	ld a, [CurPlayerMove]
+	cp FLAME_WHEEL
+	jr z, .not_frozen
+	cp SACRED_FIRE
+	jr z, .not_frozen
+
+	ld hl, FrozenSolidText
+	call StdBattleTextBox
+
+	call CantMove
+	jp EndTurn
+
+.not_frozen
+
+
+	ld hl, PlayerSubStatus3
+	bit SUBSTATUS_FLINCHED, [hl]
+	jr z, .not_flinched
+
+	res SUBSTATUS_FLINCHED, [hl]
+	ld hl, FlinchedText
+	call StdBattleTextBox
+
+	call CantMove
+	jp EndTurn
+
+.not_flinched
+
+
+	ld hl, PlayerDisableCount
+	ld a, [hl]
+	and a
+	jr z, .not_disabled
+
+	dec a
+	ld [hl], a
+	and $f
+	jr nz, .not_disabled
+
+	ld [hl], a
+	ld [DisabledMove], a
+	ld hl, DisabledNoMoreText
+	call StdBattleTextBox
+
+.not_disabled
+
+
+	ld a, [PlayerSubStatus3]
+	add a
+	jr nc, .not_confused
+	ld hl, PlayerConfuseCount
+	dec [hl]
+	jr nz, .confused
+
+	ld hl, PlayerSubStatus3
+	res SUBSTATUS_CONFUSED, [hl]
+	ld hl, ConfusedNoMoreText
+	call StdBattleTextBox
+	jr .not_confused
+
+.confused
+	ld hl, IsConfusedText
+	call StdBattleTextBox
+	xor a
+	ld [wNumHits], a
+	ld de, ANIM_CONFUSED
+	call FarPlayBattleAnimation
+
+	; 50% chance of hitting itself
+	call BattleRandom
+	cp $80
+	jr nc, .not_confused
+
+	; clear confusion-dependent substatus
+	ld hl, PlayerSubStatus3
+	ld a, [hl]
+	and 1 << SUBSTATUS_CONFUSED
+	ld [hl], a
+
+	call HitConfusion
+	call CantMove
+	jp EndTurn
+
+.not_confused
+
+
+	ld a, [PlayerSubStatus1]
+	add a ; bit SUBSTATUS_ATTRACT
+	jr nc, .not_infatuated
+
+	ld hl, InLoveWithText
+	call StdBattleTextBox
+	xor a
+	ld [wNumHits], a
+	ld de, ANIM_IN_LOVE
+	call FarPlayBattleAnimation
+
+	; 50% chance of infatuation
+	call BattleRandom
+	cp $80
+	jr c, .not_infatuated
+
+	ld hl, InfatuationText
+	call StdBattleTextBox
+	call CantMove
+	jp EndTurn
+
+.not_infatuated
+
+
+	; We can't disable a move that doesn't exist.
+	ld a, [DisabledMove]
+	and a
+	jr z, .no_disabled_move
+
+	; Are we using the disabled move?
+	ld hl, CurPlayerMove
+	cp [hl]
+	jr nz, .no_disabled_move
+
+	call MoveDisabled
+	call CantMove
+	jp EndTurn
+
+.no_disabled_move
+
+
+	ld hl, BattleMonStatus
+	bit PAR, [hl]
+	ret z
+
+	; 25% chance to be fully paralyzed
+	call BattleRandom
+	cp $3f
+	ret nc
+
+	ld hl, FullyParalyzedText
+	call StdBattleTextBox
+	call CantMove
+	jp EndTurn
+
+; 341f0
+
+
+CantMove: ; 341f0
+	ld a, BATTLE_VARS_SUBSTATUS1
+	call GetBattleVarAddr
+	res SUBSTATUS_ROLLOUT, [hl]
+
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVarAddr
+	ld a, [hl]
+	and $ff ^ (1<<SUBSTATUS_BIDE + 1<<SUBSTATUS_RAMPAGE + 1<<SUBSTATUS_CHARGED)
+	ld [hl], a
+
+	call ResetFuryCutterCount
+
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call GetBattleVar
+	cp FLY
+	jr z, .fly_dig
+
+	cp DIG
+	ret nz
+
+.fly_dig
+	res SUBSTATUS_UNDERGROUND, [hl]
+	res SUBSTATUS_FLYING, [hl]
+	jp AppearUserRaiseSub
+
+; 34216
+
+
+
+OpponentCantMove: ; 34216
+	call BattleCommand_SwitchTurn
+	call CantMove
+	jp BattleCommand_SwitchTurn
+
+; 3421f
+
+
+
+CheckEnemyTurn: ; 3421f
+
+	ld hl, EnemySubStatus4
+	bit SUBSTATUS_RECHARGE, [hl]
+	jr z, .no_recharge
+
+	res SUBSTATUS_RECHARGE, [hl]
+	ld hl, MustRechargeText
+	call StdBattleTextBox
+	call CantMove
+	jp EndTurn
+
+.no_recharge
+
+
+	ld hl, EnemyMonStatus
+	ld a, [hl]
+	and SLP
+	jr z, .not_asleep
+
+	dec a
+	ld [EnemyMonStatus], a
+	and a
+	jr z, .woke_up
+
+	ld hl, FastAsleepText
+	call StdBattleTextBox
+	xor a
+	ld [wNumHits], a
+	ld de, ANIM_SLP
+	call FarPlayBattleAnimation
+	jr .fast_asleep
+
+.woke_up
+	ld hl, WokeUpText
+	call StdBattleTextBox
+	call CantMove
+	call UpdateEnemyMonInParty
+	ld hl, UpdateEnemyHUD
+	call CallBattleCore
+	ld a, $1
+	ld [hBGMapMode], a
+	ld hl, EnemySubStatus1
+	res SUBSTATUS_NIGHTMARE, [hl]
+	jr .not_asleep
+
+.fast_asleep
+	; Snore and Sleep Talk bypass sleep.
+	ld a, [CurEnemyMove]
+	cp SNORE
+	jr z, .not_asleep
+	cp SLEEP_TALK
+	jr z, .not_asleep
+	call CantMove
+	jp EndTurn
+
+.not_asleep
+
+
+	ld hl, EnemyMonStatus
+	bit FRZ, [hl]
+	jr z, .not_frozen
+	ld a, [CurEnemyMove]
+	cp FLAME_WHEEL
+	jr z, .not_frozen
+	cp SACRED_FIRE
+	jr z, .not_frozen
+
+	ld hl, FrozenSolidText
+	call StdBattleTextBox
+	call CantMove
+	jp EndTurn
+
+.not_frozen
+
+
+	ld hl, EnemySubStatus3
+	bit SUBSTATUS_FLINCHED, [hl]
+	jr z, .not_flinched
+
+	res SUBSTATUS_FLINCHED, [hl]
+	ld hl, FlinchedText
+	call StdBattleTextBox
+
+	call CantMove
+	jp EndTurn
+
+.not_flinched
+
+
+	ld hl, EnemyDisableCount
+	ld a, [hl]
+	and a
+	jr z, .not_disabled
+
+	dec a
+	ld [hl], a
+	and $f
+	jr nz, .not_disabled
+
+	ld [hl], a
+	ld [EnemyDisabledMove], a
+
+	ld hl, DisabledNoMoreText
+	call StdBattleTextBox
+
+.not_disabled
+
+
+	ld a, [EnemySubStatus3]
+	add a ; bit SUBSTATUS_CONFUSED
+	jr nc, .not_confused
+
+	ld hl, EnemyConfuseCount
+	dec [hl]
+	jr nz, .confused
+
+	ld hl, EnemySubStatus3
+	res SUBSTATUS_CONFUSED, [hl]
+	ld hl, ConfusedNoMoreText
+	call StdBattleTextBox
+	jr .not_confused
+
+
+.confused
+	ld hl, IsConfusedText
+	call StdBattleTextBox
+
+	xor a
+	ld [wNumHits], a
+	ld de, ANIM_CONFUSED
+	call FarPlayBattleAnimation
+
+	; 50% chance of hitting itself
+	call BattleRandom
+	cp 1 + 50 percent
+	jr nc, .not_confused
+
+	; clear confusion-dependent substatus
+	ld hl, EnemySubStatus3
+	ld a, [hl]
+	and 1 << SUBSTATUS_CONFUSED
+	ld [hl], a
+
+	ld hl, HurtItselfText
+	call StdBattleTextBox
+	call HitSelfInConfusion
+	call BattleCommand_DamageCalc
+	call BattleCommand_LowerSub
+	xor a
+	ld [wNumHits], a
+
+	; Flicker the monster pic unless flying or underground.
+	ld de, ANIM_HIT_CONFUSION
+	ld a, BATTLE_VARS_SUBSTATUS3_OPP
+	call GetBattleVar
+	and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
+	call z, PlayFXAnimID
+
+	ld c, $1
+	call EnemyHurtItself
+	call BattleCommand_RaiseSub
+	call CantMove
+	jp EndTurn
+
+.not_confused
+
+
+	ld a, [EnemySubStatus1]
+	add a ; bit SUBSTATUS_ATTRACT
+	jr nc, .not_infatuated
+
+	ld hl, InLoveWithText
+	call StdBattleTextBox
+	xor a
+	ld [wNumHits], a
+	ld de, ANIM_IN_LOVE
+	call FarPlayBattleAnimation
+
+	; 50% chance of infatuation
+	call BattleRandom
+	cp 1 + 50 percent
+	jr c, .not_infatuated
+
+	ld hl, InfatuationText
+	call StdBattleTextBox
+	call CantMove
+	jp EndTurn
+
+.not_infatuated
+
+
+	; We can't disable a move that doesn't exist.
+	ld a, [EnemyDisabledMove]
+	and a
+	jr z, .no_disabled_move
+
+	; Are we using the disabled move?
+	ld hl, CurEnemyMove
+	cp [hl]
+	jr nz, .no_disabled_move
+
+	call MoveDisabled
+
+	call CantMove
+	jp EndTurn
+
+.no_disabled_move
+
+
+	ld hl, EnemyMonStatus
+	bit PAR, [hl]
+	ret z
+
+	; 25% chance to be fully paralyzed
+	call BattleRandom
+	cp $3f
+	ret nc
+
+	ld hl, FullyParalyzedText
+	call StdBattleTextBox
+	call CantMove
+
+	; fallthrough
+; 34385
+
+
+EndTurn: ; 34385
+	ld a, $1
+	ld [wTurnEnded], a
+	jp ResetDamage
+
+; 3438d
+
+
+MoveDisabled: ; 3438d
+
+	; Make sure any charged moves fail
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVarAddr
+	res SUBSTATUS_CHARGED, [hl]
+
+	ld a, BATTLE_VARS_MOVE
+	call GetBattleVar
+	ld [wNamedObjectIndexBuffer], a
+	call GetMoveName
+
+	ld hl, DisabledMoveText
+	jp StdBattleTextBox
+
+; 343a5
+
+
+HitConfusion: ; 343a5
+
+	ld hl, HurtItselfText
+	call StdBattleTextBox
+
+	xor a
+	ld [CriticalHit], a
+
+	call HitSelfInConfusion
+	call BattleCommand_DamageCalc
+	call BattleCommand_LowerSub
+
+	xor a
+	ld [wNumHits], a
+
+	; Flicker the monster pic unless flying or underground.
+	ld de, ANIM_HIT_CONFUSION
+	ld a, BATTLE_VARS_SUBSTATUS3_OPP
+	call GetBattleVar
+	and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
+	call z, PlayFXAnimID
+
+	ld hl, UpdatePlayerHUD
+	call CallBattleCore
+	ld a, $1
+	ld [hBGMapMode], a
+	ld c, $1
+	call PlayerHurtItself
+	jp BattleCommand_RaiseSub
+
+; 343db
+
+
+BattleCommand_CheckObedience: ; 343db
+; checkobedience
+
+	; Enemy can't disobey
+	ld a, [hBattleTurn]
+	and a
+	ret nz
+
+	call CheckUserIsCharging
+	ret nz
+
+	; If we've already checked this turn
+	ld a, [AlreadyDisobeyed]
+	and a
+	ret nz
+
+	xor a
+	ld [AlreadyDisobeyed], a
+
+	; No obedience in link battles
+	; (since no handling exists for enemy)
+	ld a, [wLinkMode]
+	and a
+	ret nz
+
+	ld a, [InBattleTowerBattle]
+	and a
+	ret nz
+
+	; If the monster's id doesn't match the player's,
+	; some conditions need to be met.
+	ld a, MON_ID
+	call BattlePartyAttr
+
+	ld a, [PlayerID]
+	cp [hl]
+	jr nz, .obeylevel
+	inc hl
+	ld a, [PlayerID + 1]
+	cp [hl]
+	ret z
+
+
+.obeylevel
+	; The maximum obedience level is constrained by owned badges:
+	ld hl, JohtoBadges
+
+	; risingbadge
+	bit RISINGBADGE, [hl]
+	ld a, MAX_LEVEL + 1
+	jr nz, .getlevel
+
+	; stormbadge
+	bit STORMBADGE, [hl]
+	ld a, 70
+	jr nz, .getlevel
+
+	; fogbadge
+	bit FOGBADGE, [hl]
+	ld a, 50
+	jr nz, .getlevel
+
+	; hivebadge
+	bit HIVEBADGE, [hl]
+	ld a, 30
+	jr nz, .getlevel
+
+	; no badges
+	ld a, 10
+
+
+.getlevel
+; c = obedience level
+; d = monster level
+; b = c + d
+
+	ld b, a
+	ld c, a
+
+	ld a, [BattleMonLevel]
+	ld d, a
+
+	add b
+	ld b, a
+
+; No overflow (this should never happen)
+	jr nc, .checklevel
+	ld b, $ff
+
+
+.checklevel
+; If the monster's level is lower than the obedience level, it will obey.
+	ld a, c
+	cp d
+	ret nc
+
+
+; Random number from 0 to obedience level + monster level
+.rand1
+	call BattleRandom
+	swap a
+	cp b
+	jr nc, .rand1
+
+; The higher above the obedience level the monster is,
+; the more likely it is to disobey.
+	cp c
+	ret c
+
+; Sleep-only moves have separate handling, and a higher chance of
+; being ignored. Lazy monsters like their sleep.
+	call IgnoreSleepOnly
+	ret c
+
+
+; Another random number from 0 to obedience level + monster level
+.rand2
+	call BattleRandom
+	cp b
+	jr nc, .rand2
+
+; A second chance.
+	cp c
+	jr c, .UseInstead
+
+
+; No hope of using a move now.
+
+; b = number of levels the monster is above the obedience level
+	ld a, d
+	sub c
+	ld b, a
+
+; The chance of napping is the difference out of 256.
+	call BattleRandom
+	swap a
+	sub b
+	jr c, .Nap
+
+; The chance of not hitting itself is the same.
+	cp b
+	jr nc, .DoNothing
+
+	ld hl, WontObeyText
+	call StdBattleTextBox
+	call HitConfusion
+	jp .EndDisobedience
+
+
+.Nap:
+	call BattleRandom
+	add a
+	swap a
+	and SLP
+	jr z, .Nap
+
+	ld [BattleMonStatus], a
+
+	ld hl, BeganToNapText
+	jr .Print
+
+
+.DoNothing:
+	call BattleRandom
+	and 3
+
+	ld hl, LoafingAroundText
+	and a
+	jr z, .Print
+
+	ld hl, WontObeyText
+	dec a
+	jr z, .Print
+
+	ld hl, TurnedAwayText
+	dec a
+	jr z, .Print
+
+	ld hl, IgnoredOrdersText
+
+.Print:
+	call StdBattleTextBox
+	jp .EndDisobedience
+
+
+.UseInstead:
+
+; Can't use another move if the monster only has one!
+	ld a, [BattleMonMoves + 1]
+	and a
+	jr z, .DoNothing
+
+; Don't bother trying to handle Disable.
+	ld a, [DisabledMove]
+	and a
+	jr nz, .DoNothing
+
+
+	ld hl, BattleMonPP
+	ld de, BattleMonMoves
+	ld b, 0
+	ld c, NUM_MOVES
+
+.GetTotalPP:
+	ld a, [hli]
+	and $3f ; exclude pp up
+	add b
+	ld b, a
+
+	dec c
+	jr z, .CheckMovePP
+
+; Stop at undefined moves.
+	inc de
+	ld a, [de]
+	and a
+	jr nz, .GetTotalPP
+
+
+.CheckMovePP:
+	ld hl, BattleMonPP
+	ld a, [CurMoveNum]
+	ld e, a
+	ld d, 0
+	add hl, de
+
+; Can't use another move if only one move has PP.
+	ld a, [hl]
+	and $3f
+	cp b
+	jr z, .DoNothing
+
+
+; Make sure we can actually use the move once we get there.
+	ld a, 1
+	ld [AlreadyDisobeyed], a
+
+	ld a, [w2DMenuNumRows]
+	ld b, a
+
+; Save the move we originally picked for afterward.
+	ld a, [CurMoveNum]
+	ld c, a
+	push af
+
+
+.RandomMove:
+	call BattleRandom
+	and 3 ; TODO NUM_MOVES
+
+	cp b
+	jr nc, .RandomMove
+
+; Not the move we were trying to use.
+	cp c
+	jr z, .RandomMove
+
+; Make sure it has PP.
+	ld [CurMoveNum], a
+	ld hl, BattleMonPP
+	ld e, a
+	ld d, 0
+	add hl, de
+	ld a, [hl]
+	and $3f
+	jr z, .RandomMove
+
+
+; Use it.
+	ld a, [CurMoveNum]
+	ld c, a
+	ld b, 0
+	ld hl, BattleMonMoves
+	add hl, bc
+	ld a, [hl]
+	ld [CurPlayerMove], a
+
+	call SetPlayerTurn
+	call UpdateMoveData
+	call DoMove
+
+
+; Restore original move choice.
+	pop af
+	ld [CurMoveNum], a
+
+
+.EndDisobedience:
+	xor a
+	ld [LastPlayerMove], a
+	ld [LastPlayerCounterMove], a
+
+	; Break Encore too.
+	ld hl, PlayerSubStatus5
+	res SUBSTATUS_ENCORED, [hl]
+	xor a
+	ld [PlayerEncoreCount], a
+
+	jp EndMoveEffect
+
+; 3451f
+
+
+IgnoreSleepOnly: ; 3451f
+
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call GetBattleVar
+
+	cp SNORE
+	jr z, .CheckSleep
+	cp SLEEP_TALK
+	jr z, .CheckSleep
+	and a
+	ret
+
+.CheckSleep:
+	ld a, BATTLE_VARS_STATUS
+	call GetBattleVar
+	and SLP
+	ret z
+
+; 'ignored orders…sleeping!'
+	ld hl, IgnoredSleepingText
+	call StdBattleTextBox
+
+	call EndMoveEffect
+
+	scf
+	ret
+
+; 34541
+
+
+BattleCommand_UsedMoveText: ; 34541
+; usedmovetext
+	farcall DisplayUsedMoveText
+	ret
+
+; 34548
+
+
+CheckUserIsCharging: ; 34548
+
+	ld a, [hBattleTurn]
+	and a
+	ld a, [wPlayerCharging] ; player
+	jr z, .end
+	ld a, [wEnemyCharging] ; enemy
+.end
+	and a
+	ret
+
+; 34555
+
+
+BattleCommand_DoTurn: ; 34555
+	call CheckUserIsCharging
+	ret nz
+
+	ld hl, BattleMonPP
+	ld de, PlayerSubStatus3
+	ld bc, PlayerTurnsTaken
+
+	ld a, [hBattleTurn]
+	and a
+	jr z, .proceed
+
+	ld hl, EnemyMonPP
+	ld de, EnemySubStatus3
+	ld bc, EnemyTurnsTaken
+
+.proceed
+
+; If we've gotten this far, this counts as a turn.
+	ld a, [bc]
+	inc a
+	ld [bc], a
+
+	ld a, BATTLE_VARS_MOVE
+	call GetBattleVar
+	cp STRUGGLE
+	ret z
+
+	ld a, [de]
+	and 1 << SUBSTATUS_IN_LOOP | 1 << SUBSTATUS_RAMPAGE | 1 << SUBSTATUS_BIDE
+	ret nz
+
+	call .consume_pp
+	ld a, b
+	and a
+	jp nz, EndMoveEffect
+
+	; SubStatus5
+	inc de
+	inc de
+
+	ld a, [de]
+	bit SUBSTATUS_TRANSFORMED, a
+	ret nz
+
+	ld a, [hBattleTurn]
+	and a
+
+	ld hl, PartyMon1PP
+	ld a, [CurBattleMon]
+	jr z, .player
+
+; mimic this part entirely if wildbattle
+	ld a, [wBattleMode]
+	dec a
+	jr z, .wild
+
+	ld hl, OTPartyMon1PP
+	ld a, [CurOTMon]
+
+.player
+	call GetPartyLocation
+	push hl
+	call CheckMimicUsed
+	pop hl
+	ret c
+
+.consume_pp
+	ld a, [hBattleTurn]
+	and a
+	ld a, [CurMoveNum]
+	jr z, .okay
+	ld a, [CurEnemyMoveNum]
+
+.okay
+	ld c, a
+	ld b, 0
+	add hl, bc
+	ld a, [hl]
+	and $3f
+	jr z, .out_of_pp
+	dec [hl]
+	ld b, 0
+	ret
+
+.wild
+	ld hl, EnemyMonMoves
+	ld a, [CurEnemyMoveNum]
+	ld c, a
+	ld b, 0
+	add hl, bc
+	ld a, [hl]
+	cp MIMIC
+	jr z, .mimic
+	ld hl, wWildMonMoves
+	add hl, bc
+	ld a, [hl]
+	cp MIMIC
+	ret z
+
+.mimic
+	ld hl, wWildMonPP
+	call .consume_pp
+	ret
+
+.out_of_pp
+	call BattleCommand_MoveDelay
+; get move effect
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call GetBattleVar
+; continuous?
+	ld hl, .continuousmoves
+	ld de, 1
+	call IsInArray
+
+; 'has no pp left for [move]'
+	ld hl, HasNoPPLeftText
+	jr c, .print
+; 'but no pp is left for the move'
+	ld hl, NoPPLeftText
+.print
+	call StdBattleTextBox
+	ld b, 1
+	ret
+
+; 34602
+
+.continuousmoves ; 34602
+	db EFFECT_RAZOR_WIND
+	db EFFECT_SKY_ATTACK
+	db EFFECT_SKULL_BASH
+	db EFFECT_SOLARBEAM
+	db EFFECT_FLY
+	db EFFECT_ROLLOUT
+	db EFFECT_BIDE
+	db EFFECT_RAMPAGE
+	db $ff
+; 3460b
+
+CheckMimicUsed: ; 3460b
+	ld a, [hBattleTurn]
+	and a
+	ld a, [CurMoveNum]
+	jr z, .player
+	ld a, [CurEnemyMoveNum]
+
+.player
+	ld c, a
+	ld a, MON_MOVES
+	call UserPartyAttr
+
+	ld a, BATTLE_VARS_MOVE
+	call GetBattleVar
+	cp MIMIC
+	jr z, .mimic
+;
+	ld b, 0
+	add hl, bc
+	ld a, [hl]
+	cp MIMIC
+	jr nz, .mimic
+
+	scf
+	ret
+
+.mimic
+	and a
+	ret
+
+; 34631
+
+
+BattleCommand_Critical: ; 34631
+; critical
+
+; Determine whether this attack's hit will be critical.
+
+	xor a
+	ld [CriticalHit], a
+
+	ld a, BATTLE_VARS_MOVE_POWER
+	call GetBattleVar
+	and a
+	ret z
+
+	ld a, [hBattleTurn]
+	and a
+	ld hl, EnemyMonItem
+	ld a, [EnemyMonSpecies]
+	jr nz, .Item
+	ld hl, BattleMonItem
+	ld a, [BattleMonSpecies]
+
+.Item:
+	ld c, 0
+
+	cp CHANSEY
+	jr nz, .Farfetchd
+	ld a, [hl]
+	cp LUCKY_PUNCH
+	jr nz, .FocusEnergy
+
+; +2 critical level
+	ld c, 2
+	jr .Tally
+
+.Farfetchd:
+	cp FARFETCH_D
+	jr nz, .FocusEnergy
+	ld a, [hl]
+	cp STICK
+	jr nz, .FocusEnergy
+
+; +2 critical level
+	ld c, 2
+	jr .Tally
+
+.FocusEnergy:
+	ld a, BATTLE_VARS_SUBSTATUS4
+	call GetBattleVar
+	bit SUBSTATUS_FOCUS_ENERGY, a
+	jr z, .CheckCritical
+
+; +1 critical level
+	inc c
+
+.CheckCritical:
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call GetBattleVar
+	ld de, 1
+	ld hl, .Criticals
+	push bc
+	call IsInArray
+	pop bc
+	jr nc, .ScopeLens
+
+; +2 critical level
+	inc c
+	inc c
+
+.ScopeLens:
+	push bc
+	call GetUserItem
+	ld a, b
+	cp HELD_CRITICAL_UP ; Increased critical chance. Only Scope Lens has this.
+	pop bc
+	jr nz, .Tally
+
+; +1 critical level
+	inc c
+
+.Tally:
+	ld hl, .Chances
+	ld b, 0
+	add hl, bc
+	call BattleRandom
+	cp [hl]
+	ret nc
+	ld a, 1
+	ld [CriticalHit], a
+	ret
+
+.Criticals:
+	db KARATE_CHOP, RAZOR_WIND, RAZOR_LEAF, CRABHAMMER, SLASH, AEROBLAST, CROSS_CHOP, $ff
+.Chances:
+	; 6.25% 12.1% 24.6% 33.2% 49.6% 49.6% 49.6%
+	db $11,  $20,  $40,  $55,  $80,  $80,  $80
+	;   0     1     2     3     4     5     6
+; 346b2
+
+
+BattleCommand_TripleKick: ; 346b2
+; triplekick
+
+	ld a, [wKickCounter]
+	ld b, a
+	inc b
+	ld hl, CurDamage + 1
+	ld a, [hld]
+	ld e, a
+	ld a, [hli]
+	ld d, a
+.next_kick
+	dec b
+	ret z
+	ld a, [hl]
+	add e
+	ld [hld], a
+	ld a, [hl]
+	adc d
+	ld [hli], a
+
+; No overflow.
+	jr nc, .next_kick
+	ld a, $ff
+	ld [hld], a
+	ld [hl], a
+	ret
+
+; 346cd
+
+
+BattleCommand_KickCounter: ; 346cd
+; kickcounter
+
+	ld hl, wKickCounter
+	inc [hl]
+	ret
+
+; 346d2
+
+
+BattleCommand_Stab: ; 346d2
+; STAB = Same Type Attack Bonus
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call GetBattleVar
+	cp STRUGGLE
+	ret z
+
+	ld hl, BattleMonType1
+	ld a, [hli]
+	ld b, a
+	ld c, [hl]
+	ld hl, EnemyMonType1
+	ld a, [hli]
+	ld d, a
+	ld e, [hl]
+
+	ld a, [hBattleTurn]
+	and a
+	jr z, .go ; Who Attacks and who Defends
+
+	ld hl, EnemyMonType1
+	ld a, [hli]
+	ld b, a
+	ld c, [hl]
+	ld hl, BattleMonType1
+	ld a, [hli]
+	ld d, a
+	ld e, [hl]
+
+.go
+	ld a, BATTLE_VARS_MOVE_TYPE
+	call GetBattleVarAddr
+	ld [wTypeMatchup], a
+
+	push hl
+	push de
+	push bc
+	farcall DoWeatherModifiers
+	pop bc
+	pop de
+	pop hl
+
+	push de
+	push bc
+	farcall DoBadgeTypeBoosts
+	pop bc
+	pop de
+
+	ld a, [wTypeMatchup]
+	cp b
+	jr z, .stab
+	cp c
+	jr z, .stab
+
+	jr .SkipStab
+
+.stab
+	ld hl, CurDamage + 1
+	ld a, [hld]
+	ld h, [hl]
+	ld l, a
+
+	ld b, h
+	ld c, l
+	srl b
+	rr c
+	add hl, bc
+
+	ld a, h
+	ld [CurDamage], a
+	ld a, l
+	ld [CurDamage + 1], a
+
+	ld hl, TypeModifier
+	set 7, [hl]
+
+.SkipStab:
+	ld a, BATTLE_VARS_MOVE_TYPE
+	call GetBattleVar
+	ld b, a
+	ld hl, TypeMatchups
+
+.TypesLoop:
+	ld a, [hli]
+
+	cp $ff
+	jr z, .end
+
+	; foresight
+	cp $fe
+	jr nz, .SkipForesightCheck
+	ld a, BATTLE_VARS_SUBSTATUS1_OPP
+	call GetBattleVar
+	bit SUBSTATUS_IDENTIFIED, a
+	jr nz, .end
+
+	jr .TypesLoop
+
+.SkipForesightCheck:
+	cp b
+	jr nz, .SkipType
+	ld a, [hl]
+	cp d
+	jr z, .GotMatchup
+	cp e
+	jr z, .GotMatchup
+	jr .SkipType
+
+.GotMatchup:
+	push hl
+	push bc
+	inc hl
+	ld a, [TypeModifier]
+	and %10000000
+	ld b, a
+; If the target is immune to the move, treat it as a miss and calculate the damage as 0
+	ld a, [hl]
+	and a
+	jr nz, .NotImmune
+	inc a
+	ld [AttackMissed], a
+	xor a
+.NotImmune:
+	ld [hMultiplier], a
+	add b
+	ld [TypeModifier], a
+
+	xor a
+	ld [hMultiplicand + 0], a
+
+	ld hl, CurDamage
+	ld a, [hli]
+	ld [hMultiplicand + 1], a
+	ld a, [hld]
+	ld [hMultiplicand + 2], a
+
+	call Multiply
+
+	ld a, [hProduct + 1]
+	ld b, a
+	ld a, [hProduct + 2]
+	or b
+	ld b, a
+	ld a, [hProduct + 3]
+	or b
+	jr z, .ok ; This is a very convoluted way to get back that we've essentially dealt no damage.
+
+; Take the product and divide it by 10.
+	ld a, 10
+	ld [hDivisor], a
+	ld b, 4
+	call Divide
+	ld a, [hQuotient + 1]
+	ld b, a
+	ld a, [hQuotient + 2]
+	or b
+	jr nz, .ok
+
+	ld a, 1
+	ld [hMultiplicand + 2], a
+
+.ok
+	ld a, [hMultiplicand + 1]
+	ld [hli], a
+	ld a, [hMultiplicand + 2]
+	ld [hl], a
+	pop bc
+	pop hl
+
+.SkipType:
+	inc hl
+	inc hl
+	jr .TypesLoop
+
+.end
+	call BattleCheckTypeMatchup
+	ld a, [wTypeMatchup]
+	ld b, a
+	ld a, [TypeModifier]
+	and %10000000
+	or b
+	ld [TypeModifier], a
+	ret
+
+; 347c8
+
+
+BattleCheckTypeMatchup: ; 347c8
+	ld hl, EnemyMonType1
+	ld a, [hBattleTurn]
+	and a
+	jr z, CheckTypeMatchup
+	ld hl, BattleMonType1
+CheckTypeMatchup: ; 347d3
+; There is an incorrect assumption about this function made in the AI related code: when
+; the AI calls CheckTypeMatchup (not BattleCheckTypeMatchup), it assumes that placing the
+; offensive type in a will make this function do the right thing. Since a is overwritten,
+; this assumption is incorrect. A simple fix would be to load the move type for the
+; current move into a in BattleCheckTypeMatchup, before falling through, which is
+; consistent with how the rest of the code assumes this code works like.
+	push hl
+	push de
+	push bc
+	ld a, BATTLE_VARS_MOVE_TYPE
+	call GetBattleVar
+	ld d, a
+	ld b, [hl]
+	inc hl
+	ld c, [hl]
+	ld a, 10 ; 1.0
+	ld [wTypeMatchup], a
+	ld hl, TypeMatchups
+.TypesLoop:
+	ld a, [hli]
+	cp $ff
+	jr z, .End
+	cp $fe
+	jr nz, .Next
+	ld a, BATTLE_VARS_SUBSTATUS1_OPP
+	call GetBattleVar
+	bit SUBSTATUS_IDENTIFIED, a
+	jr nz, .End
+	jr .TypesLoop
+
+.Next:
+	cp d
+	jr nz, .Nope
+	ld a, [hli]
+	cp b
+	jr z, .Yup
+	cp c
+	jr z, .Yup
+	jr .Nope2
+
+.Nope:
+	inc hl
+.Nope2:
+	inc hl
+	jr .TypesLoop
+
+.Yup:
+	xor a
+	ld [hDividend + 0], a
+	ld [hMultiplicand + 0], a
+	ld [hMultiplicand + 1], a
+	ld a, [hli]
+	ld [hMultiplicand + 2], a
+	ld a, [wTypeMatchup]
+	ld [hMultiplier], a
+	call Multiply
+	ld a, 10
+	ld [hDivisor], a
+	push bc
+	ld b, 4
+	call Divide
+	pop bc
+	ld a, [hQuotient + 2]
+	ld [wTypeMatchup], a
+	jr .TypesLoop
+
+.End:
+	pop bc
+	pop de
+	pop hl
+	ret
+
+; 34833
+
+
+BattleCommand_ResetTypeMatchup: ; 34833
+; Reset the type matchup multiplier to 1.0, if the type matchup is not 0.
+; If there is immunity in play, the move automatically misses.
+	call BattleCheckTypeMatchup
+	ld a, [wTypeMatchup]
+	and a
+	ld a, 10 ; 1.0
+	jr nz, .reset
+	call ResetDamage
+	xor a
+	ld [TypeModifier], a
+	inc a
+	ld [AttackMissed], a
+	ret
+
+.reset
+	ld [wTypeMatchup], a
+	ret
+
+; 3484e
+
+INCLUDE "engine/battle/ai/switch.asm"
+
+INCLUDE "data/type_matchups.asm"
+
+BattleCommand_DamageVariation: ; 34cfd
+; damagevariation
+
+; Modify the damage spread between 85% and 100%.
+
+; Because of the method of division the probability distribution
+; is not consistent. This makes the highest damage multipliers
+; rarer than normal.
+
+
+; No point in reducing 1 or 0 damage.
+	ld hl, CurDamage
+	ld a, [hli]
+	and a
+	jr nz, .go
+	ld a, [hl]
+	cp 2
+	ret c
+
+.go
+; Start with the maximum damage.
+	xor a
+	ld [hMultiplicand + 0], a
+	dec hl
+	ld a, [hli]
+	ld [hMultiplicand + 1], a
+	ld a, [hl]
+	ld [hMultiplicand + 2], a
+
+; Multiply by 85-100%...
+.loop
+	call BattleRandom
+	rrca
+	cp $d9 ; 85%
+	jr c, .loop
+
+	ld [hMultiplier], a
+	call Multiply
+
+; ...divide by 100%...
+	ld a, $ff ; 100%
+	ld [hDivisor], a
+	ld b, $4
+	call Divide
+
+; ...to get .85-1.00x damage.
+	ld a, [hQuotient + 1]
+	ld hl, CurDamage
+	ld [hli], a
+	ld a, [hQuotient + 2]
+	ld [hl], a
+	ret
+
+; 34d32
+
+
+BattleCommand_CheckHit: ; 34d32
+; checkhit
+
+	call .DreamEater
+	jp z, .Miss
+
+	call .Protect
+	jp nz, .Miss
+
+	call .DrainSub
+	jp z, .Miss
+
+	call .LockOn
+	ret nz
+
+	call .FlyDigMoves
+	jp nz, .Miss
+
+	call .ThunderRain
+	ret z
+
+	call .XAccuracy
+	ret nz
+
+	; Perfect-accuracy moves
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call GetBattleVar
+	cp EFFECT_ALWAYS_HIT
+	ret z
+
+	call .StatModifiers
+
+	ld a, [wPlayerMoveStruct + MOVE_ACC]
+	ld b, a
+	ld a, [hBattleTurn]
+	and a
+	jr z, .BrightPowder
+	ld a, [wEnemyMoveStruct + MOVE_ACC]
+	ld b, a
+
+.BrightPowder:
+	push bc
+	call GetOpponentItem
+	ld a, b
+	cp HELD_BRIGHTPOWDER
+	ld a, c ; % miss
+	pop bc
+	jr nz, .skip_brightpowder
+
+	ld c, a
+	ld a, b
+	sub c
+	ld b, a
+	jr nc, .skip_brightpowder
+	ld b, 0
+
+.skip_brightpowder
+	ld a, b
+	cp $ff
+	jr z, .Hit
+
+	call BattleRandom
+	cp b
+	jr nc, .Miss
+
+.Hit:
+	ret
+
+
+.Miss:
+; Keep the damage value intact if we're using (Hi) Jump Kick.
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call GetBattleVar
+	cp EFFECT_JUMP_KICK
+	jr z, .Missed
+	call ResetDamage
+
+.Missed:
+	ld a, 1
+	ld [AttackMissed], a
+	ret
+
+
+.DreamEater:
+; Return z if we're trying to eat the dream of
+; a monster that isn't sleeping.
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call GetBattleVar
+	cp EFFECT_DREAM_EATER
+	ret nz
+
+	ld a, BATTLE_VARS_STATUS_OPP
+	call GetBattleVar
+	and SLP
+	ret
+
+
+.Protect:
+; Return nz if the opponent is protected.
+	ld a, BATTLE_VARS_SUBSTATUS1_OPP
+	call GetBattleVar
+	bit SUBSTATUS_PROTECT, a
+	ret z
+
+	ld c, 40
+	call DelayFrames
+
+; 'protecting itself!'
+	ld hl, ProtectingItselfText
+	call StdBattleTextBox
+
+	ld c, 40
+	call DelayFrames
+
+	ld a, 1
+	and a
+	ret
+
+
+.LockOn:
+; Return nz if we are locked-on and aren't trying to use Earthquake,
+; Fissure or Magnitude on a monster that is flying.
+	ld a, BATTLE_VARS_SUBSTATUS5_OPP
+	call GetBattleVarAddr
+	bit SUBSTATUS_LOCK_ON, [hl]
+	res SUBSTATUS_LOCK_ON, [hl]
+	ret z
+
+	ld a, BATTLE_VARS_SUBSTATUS3_OPP
+	call GetBattleVar
+	bit SUBSTATUS_FLYING, a
+	jr z, .LockedOn
+
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call GetBattleVar
+
+	cp EARTHQUAKE
+	ret z
+	cp FISSURE
+	ret z
+	cp MAGNITUDE
+	ret z
+
+.LockedOn:
+	ld a, 1
+	and a
+	ret
+
+
+.DrainSub:
+; Return z if using an HP drain move on a substitute.
+	call CheckSubstituteOpp
+	jr z, .not_draining_sub
+
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call GetBattleVar
+
+	cp EFFECT_LEECH_HIT
+	ret z
+	cp EFFECT_DREAM_EATER
+	ret z
+
+.not_draining_sub
+	ld a, 1
+	and a
+	ret
+
+
+.FlyDigMoves:
+; Check for moves that can hit underground/flying opponents.
+; Return z if the current move can hit the opponent.
+
+	ld a, BATTLE_VARS_SUBSTATUS3_OPP
+	call GetBattleVar
+	and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
+	ret z
+
+	bit SUBSTATUS_FLYING, a
+	jr z, .DigMoves
+
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call GetBattleVar
+
+	cp GUST
+	ret z
+	cp WHIRLWIND
+	ret z
+	cp THUNDER
+	ret z
+	cp TWISTER
+	ret
+
+.DigMoves:
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call GetBattleVar
+
+	cp EARTHQUAKE
+	ret z
+	cp FISSURE
+	ret z
+	cp MAGNITUDE
+	ret
+
+
+.ThunderRain:
+; Return z if the current move always hits in rain, and it is raining.
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call GetBattleVar
+	cp EFFECT_THUNDER
+	ret nz
+
+	ld a, [Weather]
+	cp WEATHER_RAIN
+	ret
+
+
+.XAccuracy:
+	ld a, BATTLE_VARS_SUBSTATUS4
+	call GetBattleVar
+	bit SUBSTATUS_X_ACCURACY, a
+	ret
+
+
+.StatModifiers:
+
+	ld a, [hBattleTurn]
+	and a
+
+	; load the user's accuracy into b and the opponent's evasion into c.
+	ld hl, wPlayerMoveStruct + MOVE_ACC
+	ld a, [PlayerAccLevel]
+	ld b, a
+	ld a, [EnemyEvaLevel]
+	ld c, a
+
+	jr z, .got_acc_eva
+
+	ld hl, wEnemyMoveStruct + MOVE_ACC
+	ld a, [EnemyAccLevel]
+	ld b, a
+	ld a, [PlayerEvaLevel]
+	ld c, a
+
+.got_acc_eva
+	cp b
+	jr c, .skip_foresight_check
+
+	; if the target's evasion is greater than the user's accuracy,
+	; check the target's foresight status
+	ld a, BATTLE_VARS_SUBSTATUS1_OPP
+	call GetBattleVar
+	bit SUBSTATUS_IDENTIFIED, a
+	ret nz
+
+.skip_foresight_check
+	; subtract evasion from 14
+	ld a, 14
+	sub c
+	ld c, a
+	; store the base move accuracy for math ops
+	xor a
+	ld [hMultiplicand + 0], a
+	ld [hMultiplicand + 1], a
+	ld a, [hl]
+	ld [hMultiplicand + 2], a
+	push hl
+	ld d, 2 ; do this twice, once for the user's accuracy and once for the target's evasion
+
+.accuracy_loop
+	; look up the multiplier from the table
+	push bc
+	ld hl, .AccProb
+	dec b
+	sla b
+	ld c, b
+	ld b, 0
+	add hl, bc
+	pop bc
+	; multiply by the first byte in that row...
+	ld a, [hli]
+	ld [hMultiplier], a
+	call Multiply
+	; ... and divide by the second byte
+	ld a, [hl]
+	ld [hDivisor], a
+	ld b, 4
+	call Divide
+	; minimum accuracy is $0001
+	ld a, [hQuotient + 2]
+	ld b, a
+	ld a, [hQuotient + 1]
+	or b
+	jr nz, .min_accuracy
+	ld [hQuotient + 1], a
+	ld a, 1
+	ld [hQuotient + 2], a
+
+.min_accuracy
+	; do the same thing to the target's evasion
+	ld b, c
+	dec d
+	jr nz, .accuracy_loop
+
+	; if the result is more than 2 bytes, max out at 100%
+	ld a, [hQuotient + 1]
+	and a
+	ld a, [hQuotient + 2]
+	jr z, .finish_accuracy
+	ld a, $ff
+
+.finish_accuracy
+	pop hl
+	ld [hl], a
+	ret
+
+.AccProb:
+	db  33, 100 ;  33% -6
+	db  36, 100 ;  36% -5
+	db  43, 100 ;  43% -4
+	db  50, 100 ;  50% -3
+	db  60, 100 ;  60% -2
+	db  75, 100 ;  75% -1
+	db   1,   1 ; 100%  0
+	db 133, 100 ; 133% +1
+	db 166, 100 ; 166% +2
+	db   2,   1 ; 200% +3
+	db 233, 100 ; 233% +4
+	db 133,  50 ; 266% +5
+	db   3,   1 ; 300% +6
+
+; 34ecc
+
+
+BattleCommand_EffectChance: ; 34ecc
+; effectchance
+
+	xor a
+	ld [EffectFailed], a
+	call CheckSubstituteOpp
+	jr nz, .failed
+
+	push hl
+	ld hl, wPlayerMoveStruct + MOVE_CHANCE
+	ld a, [hBattleTurn]
+	and a
+	jr z, .got_move_chance
+	ld hl, wEnemyMoveStruct + MOVE_CHANCE
+.got_move_chance
+
+	call BattleRandom
+	cp [hl]
+	pop hl
+	ret c
+
+.failed
+	ld a, 1
+	ld [EffectFailed], a
+	and a
+	ret
+
+; 34eee
+
+
+BattleCommand_LowerSub: ; 34eee
+; lowersub
+
+	ld a, BATTLE_VARS_SUBSTATUS4
+	call GetBattleVar
+	bit SUBSTATUS_SUBSTITUTE, a
+	ret z
+
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVar
+	bit SUBSTATUS_CHARGED, a
+	jr nz, .already_charged
+
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call GetBattleVar
+	cp EFFECT_RAZOR_WIND
+	jr z, .charge_turn
+	cp EFFECT_SKY_ATTACK
+	jr z, .charge_turn
+	cp EFFECT_SKULL_BASH
+	jr z, .charge_turn
+	cp EFFECT_SOLARBEAM
+	jr z, .charge_turn
+	cp EFFECT_FLY
+	jr z, .charge_turn
+
+.already_charged
+	call .Rampage
+	jr z, .charge_turn
+
+	call CheckUserIsCharging
+	ret nz
+
+.charge_turn
+	call _CheckBattleScene
+	jr c, .mimic_anims
+
+	xor a
+	ld [wNumHits], a
+	ld [FXAnimID + 1], a
+	inc a
+	ld [wKickCounter], a
+	ld a, SUBSTITUTE
+	jp LoadAnim
+
+.mimic_anims
+	call BattleCommand_LowerSubNoAnim
+	jp BattleCommand_MoveDelay
+
+.Rampage:
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call GetBattleVar
+	cp EFFECT_ROLLOUT
+	jr z, .rollout_rampage
+	cp EFFECT_RAMPAGE
+	jr z, .rollout_rampage
+
+	ld a, 1
+	and a
+	ret
+
+.rollout_rampage
+	ld a, [wSomeoneIsRampaging]
+	and a
+	ld a, 0
+	ld [wSomeoneIsRampaging], a
+	ret
+
+; 34f57
+
+
+BattleCommand_HitTarget: ; 34f57
+; hittarget
+	call BattleCommand_LowerSub
+	call BattleCommand_HitTargetNoSub
+	jp BattleCommand_RaiseSub
+
+; 34f60
+
+
+BattleCommand_HitTargetNoSub: ; 34f60
+	ld a, [AttackMissed]
+	and a
+	jp nz, BattleCommand_MoveDelay
+
+	ld a, [hBattleTurn]
+	and a
+	ld de, PlayerRolloutCount
+	ld a, BATTLEANIM_ENEMY_DAMAGE
+	jr z, .got_rollout_count
+	ld de, EnemyRolloutCount
+	ld a, BATTLEANIM_PLAYER_DAMAGE
+
+.got_rollout_count
+	ld [wNumHits], a
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call GetBattleVar
+	cp EFFECT_MULTI_HIT
+	jr z, .multihit
+	cp EFFECT_CONVERSION
+	jr z, .conversion
+	cp EFFECT_DOUBLE_HIT
+	jr z, .doublehit
+	cp EFFECT_POISON_MULTI_HIT
+	jr z, .twineedle
+	cp EFFECT_TRIPLE_KICK
+	jr z, .triplekick
+	xor a
+	ld [wKickCounter], a
+
+.triplekick
+
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call GetBattleVar
+	ld e, a
+	ld d, 0
+	call PlayFXAnimID
+
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call GetBattleVar
+	cp FLY
+	jr z, .fly_dig
+	cp DIG
+	ret nz
+
+.fly_dig
+; clear sprite
+	jp AppearUserLowerSub
+
+.multihit
+.conversion
+.doublehit
+.twineedle
+	ld a, [wKickCounter]
+	and 1
+	xor 1
+	ld [wKickCounter], a
+	ld a, [de]
+	cp $1
+	push af
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call GetBattleVar
+	ld e, a
+	ld d, 0
+	pop af
+	jp z, PlayFXAnimID
+	xor a
+	ld [wNumHits], a
+	jp PlayFXAnimID
+
+; 34fd1
+
+
+BattleCommand_StatUpAnim: ; 34fd1
+	ld a, [AttackMissed]
+	and a
+	jp nz, BattleCommand_MoveDelay
+
+	xor a
+	jr BattleCommand_StatUpDownAnim
+
+; 34fdb
+
+
+BattleCommand_StatDownAnim: ; 34fdb
+	ld a, [AttackMissed]
+	and a
+	jp nz, BattleCommand_MoveDelay
+
+	ld a, [hBattleTurn]
+	and a
+	ld a, BATTLEANIM_ENEMY_STAT_DOWN
+	jr z, BattleCommand_StatUpDownAnim
+	ld a, BATTLEANIM_WOBBLE
+
+	; fallthrough
+; 34feb
+
+
+BattleCommand_StatUpDownAnim: ; 34feb
+	ld [wNumHits], a
+	xor a
+	ld [wKickCounter], a
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call GetBattleVar
+	ld e, a
+	ld d, 0
+	jp PlayFXAnimID
+
+; 34ffd
+
+
+BattleCommand_SwitchTurn: ; 34ffd
+; switchturn
+
+	ld a, [hBattleTurn]
+	xor 1
+	ld [hBattleTurn], a
+	ret
+
+; 35004
+
+
+BattleCommand_RaiseSub: ; 35004
+; raisesub
+
+	ld a, BATTLE_VARS_SUBSTATUS4
+	call GetBattleVar
+	bit SUBSTATUS_SUBSTITUTE, a
+	ret z
+
+	call _CheckBattleScene
+	jp c, BattleCommand_RaiseSubNoAnim
+
+	xor a
+	ld [wNumHits], a
+	ld [FXAnimID + 1], a
+	ld a, $2
+	ld [wKickCounter], a
+	ld a, SUBSTITUTE
+	jp LoadAnim
+
+; 35023
+
+
+BattleCommand_FailureText: ; 35023
+; failuretext
+; If the move missed or failed, load the appropriate
+; text, and end the effects of multi-turn or multi-
+; hit moves.
+	ld a, [AttackMissed]
+	and a
+	ret z
+
+	call GetFailureResultText
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call GetBattleVarAddr
+
+	cp FLY
+	jr z, .fly_dig
+	cp DIG
+	jr z, .fly_dig
+
+; Move effect:
+	inc hl
+	ld a, [hl]
+
+	cp EFFECT_MULTI_HIT
+	jr z, .multihit
+	cp EFFECT_DOUBLE_HIT
+	jr z, .multihit
+	cp EFFECT_POISON_MULTI_HIT
+	jr z, .multihit
+	jp EndMoveEffect
+
+.multihit
+	call BattleCommand_RaiseSub
+	jp EndMoveEffect
+
+.fly_dig
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVarAddr
+	res SUBSTATUS_UNDERGROUND, [hl]
+	res SUBSTATUS_FLYING, [hl]
+	call AppearUserRaiseSub
+	jp EndMoveEffect
+
+; 3505e
+
+
+BattleCommand_CheckFaint: ; 3505e
+; checkfaint
+
+	ld a, BATTLE_VARS_SUBSTATUS1_OPP
+	call GetBattleVar
+	bit SUBSTATUS_ENDURE, a
+	jr z, .not_enduring
+	call BattleCommand_FalseSwipe
+	ld b, $0
+	jr nc, .okay
+	ld b, $1
+	jr .okay
+
+.not_enduring
+	call GetOpponentItem
+	ld a, b
+	cp HELD_FOCUS_BAND
+	ld b, $0
+	jr nz, .okay
+	call BattleRandom
+	cp c
+	jr nc, .okay
+	call BattleCommand_FalseSwipe
+	ld b, $0
+	jr nc, .okay
+	ld b, $2
+.okay
+	push bc
+	call .check_sub
+	ld c, $0
+	ld a, [hBattleTurn]
+	and a
+	jr nz, .damage_player
+	call EnemyHurtItself
+	jr .done_damage
+
+.damage_player
+	call PlayerHurtItself
+
+.done_damage
+	pop bc
+	ld a, b
+	and a
+	ret z
+	dec a
+	jr nz, .not_enduring2
+	ld hl, EnduredText
+	jp StdBattleTextBox
+
+.not_enduring2
+	call GetOpponentItem
+	ld a, [hl]
+	ld [wNamedObjectIndexBuffer], a
+	call GetItemName
+
+	ld hl, HungOnText
+	jp StdBattleTextBox
+
+.check_sub
+	ld a, BATTLE_VARS_SUBSTATUS4_OPP
+	call GetBattleVar
+	bit SUBSTATUS_SUBSTITUTE, a
+	ret nz
+
+	ld de, PlayerDamageTaken + 1
+	ld a, [hBattleTurn]
+	and a
+	jr nz, .damage_taken
+	ld de, EnemyDamageTaken + 1
+
+.damage_taken
+	ld a, [CurDamage + 1]
+	ld b, a
+	ld a, [de]
+	add b
+	ld [de], a
+	dec de
+	ld a, [CurDamage]
+	ld b, a
+	ld a, [de]
+	adc b
+	ld [de], a
+	ret nc
+	ld a, $ff
+	ld [de], a
+	inc de
+	ld [de], a
+	ret
+
+; 350e4
+
+
+GetFailureResultText: ; 350e4
+	ld hl, DoesntAffectText
+	ld de, DoesntAffectText
+	ld a, [TypeModifier]
+	and $7f
+	jr z, .got_text
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call GetBattleVar
+	cp EFFECT_FUTURE_SIGHT
+	ld hl, ButItFailedText
+	ld de, ItFailedText
+	jr z, .got_text
+	ld hl, AttackMissedText
+	ld de, AttackMissed2Text
+	ld a, [CriticalHit]
+	cp $ff
+	jr nz, .got_text
+	ld hl, UnaffectedText
+.got_text
+	call FailText_CheckOpponentProtect
+	xor a
+	ld [CriticalHit], a
+
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call GetBattleVar
+	cp EFFECT_JUMP_KICK
+	ret nz
+
+	ld a, [TypeModifier]
+	and $7f
+	ret z
+
+	ld hl, CurDamage
+	ld a, [hli]
+	ld b, [hl]
+	rept 3
+	srl a
+	rr b
+	endr
+	ld [hl], b
+	dec hl
+	ld [hli], a
+	or b
+	jr nz, .do_at_least_1_damage
+	inc a
+	ld [hl], a
+.do_at_least_1_damage
+	ld hl, CrashedText
+	call StdBattleTextBox
+	ld a, $1
+	ld [wKickCounter], a
+	call LoadMoveAnim
+	ld c, $1
+	ld a, [hBattleTurn]
+	and a
+	jp nz, EnemyHurtItself
+	jp PlayerHurtItself
+
+FailText_CheckOpponentProtect: ; 35157
+	ld a, BATTLE_VARS_SUBSTATUS1_OPP
+	call GetBattleVar
+	bit SUBSTATUS_PROTECT, a
+	jr z, .not_protected
+	ld h, d
+	ld l, e
+.not_protected
+	jp StdBattleTextBox
+
+; 35165
+
+
+BattleCommanda5: ; 35165
+	ld a, [AttackMissed]
+	and a
+	ret z
+
+	ld a, [TypeModifier]
+	and $7f
+	jp z, PrintDoesntAffect
+	jp PrintButItFailed
+
+; 35175
+
+
+BattleCommand_CriticalText: ; 35175
+; criticaltext
+; Prints the message for critical hits or one-hit KOs.
+
+; If there is no message to be printed, wait 20 frames.
+	ld a, [CriticalHit]
+	and a
+	jr z, .wait
+
+	dec a
+	add a
+	ld hl, .texts
+	ld b, 0
+	ld c, a
+	add hl, bc
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	call StdBattleTextBox
+
+	xor a
+	ld [CriticalHit], a
+
+.wait
+	ld c, 20
+	jp DelayFrames
+
+.texts
+	dw CriticalHitText
+	dw OneHitKOText
+; 35197
+
+
+BattleCommand_StartLoop: ; 35197
+; startloop
+
+	ld hl, PlayerRolloutCount
+	ld a, [hBattleTurn]
+	and a
+	jr z, .ok
+	ld hl, EnemyRolloutCount
+.ok
+	xor a
+	ld [hl], a
+	ret
+
+; 351a5
+
+
+BattleCommand_SuperEffectiveLoopText: ; 351a5
+; supereffectivelooptext
+
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVarAddr
+	bit SUBSTATUS_IN_LOOP, a
+	ret nz
+
+	; fallthrough
+; 351ad
+
+
+BattleCommand_SuperEffectiveText: ; 351ad
+; supereffectivetext
+
+	ld a, [TypeModifier]
+	and $7f
+	cp 10 ; 1.0
+	ret z
+	ld hl, SuperEffectiveText
+	jr nc, .print
+	ld hl, NotVeryEffectiveText
+.print
+	jp StdBattleTextBox
+
+; 351c0
+
+
+BattleCommand_CheckDestinyBond: ; 351c0
+; checkdestinybond
+
+; Faint the user if it fainted an opponent using Destiny Bond.
+
+	ld hl, EnemyMonHP
+	ld a, [hBattleTurn]
+	and a
+	jr z, .got_hp
+	ld hl, BattleMonHP
+
+.got_hp
+	ld a, [hli]
+	or [hl]
+	ret nz
+
+	ld a, BATTLE_VARS_SUBSTATUS5_OPP
+	call GetBattleVar
+	bit SUBSTATUS_DESTINY_BOND, a
+	jr z, .no_dbond
+
+	ld hl, TookDownWithItText
+	call StdBattleTextBox
+
+	ld a, [hBattleTurn]
+	and a
+	ld hl, EnemyMonMaxHP + 1
+	bccoord 2, 2 ; hp bar
+	ld a, 0
+	jr nz, .got_max_hp
+	ld hl, BattleMonMaxHP + 1
+	bccoord 10, 9 ; hp bar
+	ld a, 1
+
+.got_max_hp
+	ld [wWhichHPBar], a
+	ld a, [hld]
+	ld [Buffer1], a
+	ld a, [hld]
+	ld [Buffer2], a
+	ld a, [hl]
+	ld [Buffer3], a
+	xor a
+	ld [hld], a
+	ld a, [hl]
+	ld [Buffer4], a
+	xor a
+	ld [hl], a
+	ld [Buffer5], a
+	ld [Buffer6], a
+	ld h, b
+	ld l, c
+	predef AnimateHPBar
+	call RefreshBattleHuds
+
+	call BattleCommand_SwitchTurn
+	xor a
+	ld [wNumHits], a
+	ld [FXAnimID + 1], a
+	inc a
+	ld [wKickCounter], a
+	ld a, DESTINY_BOND
+	call LoadAnim
+	call BattleCommand_SwitchTurn
+
+	jr .finish
+
+.no_dbond
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call GetBattleVar
+	cp EFFECT_MULTI_HIT
+	jr z, .multiple_hit_raise_sub
+	cp EFFECT_DOUBLE_HIT
+	jr z, .multiple_hit_raise_sub
+	cp EFFECT_POISON_MULTI_HIT
+	jr z, .multiple_hit_raise_sub
+	cp EFFECT_TRIPLE_KICK
+	jr z, .multiple_hit_raise_sub
+	cp EFFECT_BEAT_UP
+	jr nz, .finish
+
+.multiple_hit_raise_sub
+	call BattleCommand_RaiseSub
+
+.finish
+	jp EndMoveEffect
+
+; 35250
+
+
+BattleCommand_BuildOpponentRage: ; 35250
+; buildopponentrage
+
+	jp .start
+
+.start
+	ld a, [AttackMissed]
+	and a
+	ret nz
+
+	ld a, BATTLE_VARS_SUBSTATUS4_OPP
+	call GetBattleVar
+	bit SUBSTATUS_RAGE, a
+	ret z
+
+	ld de, wEnemyRageCounter
+	ld a, [hBattleTurn]
+	and a
+	jr z, .player
+	ld de, wPlayerRageCounter
+.player
+	ld a, [de]
+	inc a
+	ret z
+	ld [de], a
+
+	call BattleCommand_SwitchTurn
+	ld hl, RageBuildingText
+	call StdBattleTextBox
+	jp BattleCommand_SwitchTurn
+
+; 3527b
+
+
+BattleCommand_RageDamage: ; 3527b
+; ragedamage
+
+	ld a, [CurDamage]
+	ld h, a
+	ld b, a
+	ld a, [CurDamage + 1]
+	ld l, a
+	ld c, a
+	ld a, [hBattleTurn]
+	and a
+	ld a, [wPlayerRageCounter]
+	jr z, .rage_loop
+	ld a, [wEnemyRageCounter]
+.rage_loop
+	and a
+	jr z, .done
+	dec a
+	add hl, bc
+	jr nc, .rage_loop
+	ld hl, -1
+.done
+	ld a, h
+	ld [CurDamage], a
+	ld a, l
+	ld [CurDamage + 1], a
+	ret
+
+; 352a3
+
+
+EndMoveEffect: ; 352a3
+	ld a, [BattleScriptBufferAddress]
+	ld l, a
+	ld a, [BattleScriptBufferAddress + 1]
+	ld h, a
+	ld a, $ff
+	ld [hli], a
+	ld [hli], a
+	ld [hl], a
+	ret
+
+; 352b1
+
+
+DittoMetalPowder: ; 352b1
+	ld a, MON_SPECIES
+	call BattlePartyAttr
+	ld a, [hBattleTurn]
+	and a
+	ld a, [hl]
+	jr nz, .Ditto
+	ld a, [TempEnemyMonSpecies]
+
+.Ditto:
+	cp DITTO
+	ret nz
+
+	push bc
+	call GetOpponentItem
+	ld a, [hl]
+	cp METAL_POWDER
+	pop bc
+	ret nz
+
+	ld a, c
+	srl a
+	add c
+	ld c, a
+	ret nc
+
+	srl b
+	ld a, b
+	and a
+	jr nz, .done
+	inc b
+.done
+	scf
+	rr c
+	ret
+
+; 352dc
+
+
+BattleCommand_DamageStats: ; 352dc
+; damagestats
+
+	ld a, [hBattleTurn]
+	and a
+	jp nz, EnemyAttackDamage
+
+	; fallthrough
+; 352e2
+
+
+PlayerAttackDamage: ; 352e2
+; Return move power d, player level e, enemy defense c and player attack b.
+
+	call ResetDamage
+
+	ld hl, wPlayerMoveStructPower
+	ld a, [hli]
+	and a
+	ld d, a
+	ret z
+
+	ld a, [hl]
+	cp SPECIAL
+	jr nc, .special
+
+.physical
+	ld hl, EnemyMonDefense
+	ld a, [hli]
+	ld b, a
+	ld c, [hl]
+
+	ld a, [EnemyScreens]
+	bit SCREENS_REFLECT, a
+	jr z, .physicalcrit
+	sla c
+	rl b
+
+.physicalcrit
+	ld hl, BattleMonAttack
+	call GetDamageStatsCritical
+	jr c, .thickclub
+
+	ld hl, EnemyDefense
+	ld a, [hli]
+	ld b, a
+	ld c, [hl]
+	ld hl, PlayerAttack
+	jr .thickclub
+
+.special
+	ld hl, EnemyMonSpclDef
+	ld a, [hli]
+	ld b, a
+	ld c, [hl]
+
+	ld a, [EnemyScreens]
+	bit SCREENS_LIGHT_SCREEN, a
+	jr z, .specialcrit
+	sla c
+	rl b
+
+.specialcrit
+	ld hl, BattleMonSpclAtk
+	call GetDamageStatsCritical
+	jr c, .lightball
+
+	ld hl, EnemySpDef
+	ld a, [hli]
+	ld b, a
+	ld c, [hl]
+	ld hl, PlayerSpAtk
+
+.lightball
+; Note: Returns player special attack at hl in hl.
+	call LightBallBoost
+	jr .done
+
+.thickclub
+; Note: Returns player attack at hl in hl.
+	call ThickClubBoost
+
+.done
+	call TruncateHL_BC
+
+	ld a, [BattleMonLevel]
+	ld e, a
+	call DittoMetalPowder
+
+	ld a, 1
+	and a
+	ret
+
+; 3534d
+
+
+TruncateHL_BC: ; 3534d
+.loop
+; Truncate 16-bit values hl and bc to 8-bit values b and c respectively.
+; b = hl, c = bc
+
+	ld a, h
+	or b
+	jr z, .finish
+
+	srl b
+	rr c
+	srl b
+	rr c
+
+	ld a, c
+	or b
+	jr nz, .done_bc
+	inc c
+
+.done_bc
+	srl h
+	rr l
+	srl h
+	rr l
+
+	ld a, l
+	or h
+	jr nz, .finish
+	inc l
+
+.finish
+	ld a, [wLinkMode]
+	cp 3
+	jr z, .done
+; If we go back to the loop point,
+; it's the same as doing this exact
+; same check twice.
+	ld a, h
+	or b
+	jr nz, .loop
+
+.done
+	ld b, l
+	ret
+
+; 35378
+
+
+GetDamageStatsCritical: ; 35378
+; Return carry if non-critical.
+
+	ld a, [CriticalHit]
+	and a
+	scf
+	ret z
+
+	; fallthrough
+; 3537e
+
+
+GetDamageStats: ; 3537e
+; Return the attacker's offensive stat and the defender's defensive
+; stat based on whether the attacking type is physical or special.
+
+	push hl
+	push bc
+	ld a, [hBattleTurn]
+	and a
+	jr nz, .enemy
+	ld a, [wPlayerMoveStructType]
+	cp SPECIAL
+; special
+	ld a, [PlayerSAtkLevel]
+	ld b, a
+	ld a, [EnemySDefLevel]
+	jr nc, .end
+; physical
+	ld a, [PlayerAtkLevel]
+	ld b, a
+	ld a, [EnemyDefLevel]
+	jr .end
+
+.enemy
+	ld a, [wEnemyMoveStructType]
+	cp SPECIAL
+; special
+	ld a, [EnemySAtkLevel]
+	ld b, a
+	ld a, [PlayerSDefLevel]
+	jr nc, .end
+; physical
+	ld a, [EnemyAtkLevel]
+	ld b, a
+	ld a, [PlayerDefLevel]
+.end
+	cp b
+	pop bc
+	pop hl
+	ret
+
+; 353b5
+
+
+ThickClubBoost: ; 353b5
+; Return in hl the stat value at hl.
+
+; If the attacking monster is Cubone or Marowak and
+; it's holding a Thick Club, double it.
+	push bc
+	push de
+	ld b, CUBONE
+	ld c, MAROWAK
+	ld d, THICK_CLUB
+	call SpeciesItemBoost
+	pop de
+	pop bc
+	ret
+
+; 353c3
+
+
+LightBallBoost: ; 353c3
+; Return in hl the stat value at hl.
+
+; If the attacking monster is Pikachu and it's
+; holding a Light Ball, double it.
+	push bc
+	push de
+	ld b, PIKACHU
+	ld c, PIKACHU
+	ld d, LIGHT_BALL
+	call SpeciesItemBoost
+	pop de
+	pop bc
+	ret
+
+; 353d1
+
+
+SpeciesItemBoost: ; 353d1
+; Return in hl the stat value at hl.
+
+; If the attacking monster is species b or c and
+; it's holding item d, double it.
+
+	ld a, [hli]
+	ld l, [hl]
+	ld h, a
+
+	push hl
+	ld a, MON_SPECIES
+	call BattlePartyAttr
+
+	ld a, [hBattleTurn]
+	and a
+	ld a, [hl]
+	jr z, .CompareSpecies
+	ld a, [TempEnemyMonSpecies]
+.CompareSpecies:
+	pop hl
+
+	cp b
+	jr z, .GetItemHeldEffect
+	cp c
+	ret nz
+
+.GetItemHeldEffect:
+	push hl
+	call GetUserItem
+	ld a, [hl]
+	pop hl
+	cp d
+	ret nz
+
+; Double the stat
+	sla l
+	rl h
+	ret
+
+; 353f6
+
+
+EnemyAttackDamage: ; 353f6
+	call ResetDamage
+
+; No damage dealt with 0 power.
+	ld hl, wEnemyMoveStructPower
+	ld a, [hli] ; hl = wEnemyMoveStructType
+	ld d, a
+	and a
+	ret z
+
+	ld a, [hl]
+	cp SPECIAL
+	jr nc, .Special
+
+.physical
+	ld hl, BattleMonDefense
+	ld a, [hli]
+	ld b, a
+	ld c, [hl]
+
+	ld a, [PlayerScreens]
+	bit SCREENS_REFLECT, a
+	jr z, .physicalcrit
+	sla c
+	rl b
+
+.physicalcrit
+	ld hl, EnemyMonAttack
+	call GetDamageStatsCritical
+	jr c, .thickclub
+
+	ld hl, PlayerDefense
+	ld a, [hli]
+	ld b, a
+	ld c, [hl]
+	ld hl, EnemyAttack
+	jr .thickclub
+
+.Special:
+	ld hl, BattleMonSpclDef
+	ld a, [hli]
+	ld b, a
+	ld c, [hl]
+
+	ld a, [PlayerScreens]
+	bit SCREENS_LIGHT_SCREEN, a
+	jr z, .specialcrit
+	sla c
+	rl b
+
+.specialcrit
+	ld hl, EnemyMonSpclAtk
+	call GetDamageStatsCritical
+	jr c, .lightball
+	ld hl, PlayerSpDef
+	ld a, [hli]
+	ld b, a
+	ld c, [hl]
+	ld hl, EnemySpAtk
+
+.lightball
+	call LightBallBoost
+	jr .done
+
+.thickclub
+	call ThickClubBoost
+
+.done
+	call TruncateHL_BC
+
+	ld a, [EnemyMonLevel]
+	ld e, a
+	call DittoMetalPowder
+
+	ld a, 1
+	and a
+	ret
+
+; 35461
+
+
+BattleCommand_BeatUp: ; 35461
+; beatup
+
+	call ResetDamage
+	ld a, [hBattleTurn]
+	and a
+	jp nz, .enemy_beats_up
+	ld a, [PlayerSubStatus3]
+	bit SUBSTATUS_IN_LOOP, a
+	jr nz, .next_mon
+	ld c, 20
+	call DelayFrames
+	xor a
+	ld [PlayerRolloutCount], a
+	ld [wd002], a
+	ld [wBeatUpHitAtLeastOnce], a
+	jr .got_mon
+
+.next_mon
+	ld a, [PlayerRolloutCount]
+	ld b, a
+	ld a, [PartyCount]
+	sub b
+	ld [wd002], a
+
+.got_mon
+	ld a, [wd002]
+	ld hl, PartyMonNicknames
+	call GetNick
+	ld a, MON_HP
+	call GetBeatupMonLocation
+	ld a, [hli]
+	or [hl]
+	jp z, .beatup_fail ; fainted
+	ld a, [wd002]
+	ld c, a
+	ld a, [CurBattleMon]
+	; BUG: this can desynchronize link battles
+	; Change "cp [hl]" to "cp c" to fix
+	cp [hl]
+	ld hl, BattleMonStatus
+	jr z, .active_mon
+	ld a, MON_STATUS
+	call GetBeatupMonLocation
+.active_mon
+	ld a, [hl]
+	and a
+	jp nz, .beatup_fail
+
+	ld a, $1
+	ld [wBeatUpHitAtLeastOnce], a
+	ld hl, BeatUpAttackText
+	call StdBattleTextBox
+	ld a, [EnemyMonSpecies]
+	ld [CurSpecies], a
+	call GetBaseData
+	ld a, [BaseDefense]
+	ld c, a
+	push bc
+	ld a, MON_SPECIES
+	call GetBeatupMonLocation
+	ld a, [hl]
+	ld [CurSpecies], a
+	call GetBaseData
+	ld a, [BaseAttack]
+	pop bc
+	ld b, a
+	push bc
+	ld a, MON_LEVEL
+	call GetBeatupMonLocation
+	ld a, [hl]
+	ld e, a
+	pop bc
+	ld a, [wPlayerMoveStructPower]
+	ld d, a
+	ret
+
+.enemy_beats_up
+	ld a, [EnemySubStatus3]
+	bit SUBSTATUS_IN_LOOP, a
+	jr nz, .not_first_enemy_beatup
+
+	xor a
+	ld [EnemyRolloutCount], a
+	ld [wd002], a
+	ld [wBeatUpHitAtLeastOnce], a
+	jr .enemy_continue
+
+.not_first_enemy_beatup
+	ld a, [EnemyRolloutCount]
+	ld b, a
+	ld a, [OTPartyCount]
+	sub b
+	ld [wd002], a
+.enemy_continue
+	ld a, [wBattleMode]
+	dec a
+	jr z, .wild
+
+	ld a, [wLinkMode]
+	and a
+	jr nz, .link_or_tower
+
+	ld a, [InBattleTowerBattle]
+	and a
+	jr nz, .link_or_tower
+
+	ld a, [wd002]
+	ld c, a
+	ld b, 0
+	ld hl, OTPartySpecies
+	add hl, bc
+	ld a, [hl]
+	ld [wNamedObjectIndexBuffer], a
+	call GetPokemonName
+	jr .got_enemy_nick
+
+.link_or_tower
+	ld a, [wd002]
+	ld hl, OTPartyMonNicknames
+	ld bc, NAME_LENGTH
+	call AddNTimes
+	ld de, StringBuffer1
+	call CopyBytes
+.got_enemy_nick
+	ld a, MON_HP
+	call GetBeatupMonLocation
+	ld a, [hli]
+	or [hl]
+	jp z, .beatup_fail
+	ld a, [wd002]
+	ld b, a
+	ld a, [CurOTMon]
+	cp b
+	ld hl, EnemyMonStatus
+	jr z, .active_enemy
+
+	ld a, MON_STATUS
+	call GetBeatupMonLocation
+.active_enemy
+	ld a, [hl]
+	and a
+	jr nz, .beatup_fail
+
+	ld a, $1
+	ld [wBeatUpHitAtLeastOnce], a
+	jr .finish_beatup
+
+.wild
+	ld a, [EnemyMonSpecies]
+	ld [wNamedObjectIndexBuffer], a
+	call GetPokemonName
+	ld hl, BeatUpAttackText
+	call StdBattleTextBox
+	jp EnemyAttackDamage
+
+.finish_beatup
+	ld hl, BeatUpAttackText
+	call StdBattleTextBox
+	ld a, [BattleMonSpecies]
+	ld [CurSpecies], a
+	call GetBaseData
+	ld a, [BaseDefense]
+	ld c, a
+	push bc
+	ld a, MON_SPECIES
+	call GetBeatupMonLocation
+	ld a, [hl]
+	ld [CurSpecies], a
+	call GetBaseData
+	ld a, [BaseAttack]
+	pop bc
+	ld b, a
+	push bc
+	ld a, MON_LEVEL
+	call GetBeatupMonLocation
+	ld a, [hl]
+	ld e, a
+	pop bc
+	ld a, [wEnemyMoveStructPower]
+	ld d, a
+	ret
+
+; 355b0
+
+
+.beatup_fail ; 355b0
+	ld b, buildopponentrage_command
+	jp SkipToBattleCommand
+
+; 355b5
+
+
+BattleCommanda8: ; 355b5
+	ld a, [wBeatUpHitAtLeastOnce]
+	and a
+	ret nz
+
+	jp PrintButItFailed
+
+; 355bd
+
+
+GetBeatupMonLocation: ; 355bd
+	push bc
+	ld c, a
+	ld b, 0
+	ld a, [hBattleTurn]
+	and a
+	ld hl, PartyMon1Species
+	jr z, .got_species
+	ld hl, OTPartyMon1Species
+
+.got_species
+	ld a, [wd002]
+	add hl, bc
+	call GetPartyLocation
+	pop bc
+	ret
+
+
+BattleCommand_ClearMissDamage: ; 355d5
+; clearmissdamage
+	ld a, [AttackMissed]
+	and a
+	ret z
+
+	jp ResetDamage
+
+; 355dd
+
+
+HitSelfInConfusion: ; 355dd
+	call ResetDamage
+	ld a, [hBattleTurn]
+	and a
+	ld hl, BattleMonDefense
+	ld de, PlayerScreens
+	ld a, [BattleMonLevel]
+	jr z, .got_it
+
+	ld hl, EnemyMonDefense
+	ld de, EnemyScreens
+	ld a, [EnemyMonLevel]
+.got_it
+	push af
+	ld a, [hli]
+	ld b, a
+	ld c, [hl]
+	ld a, [de]
+	bit SCREENS_REFLECT, a
+	jr z, .mimic_screen
+
+	sla c
+	rl b
+.mimic_screen
+	dec hl
+	dec hl
+	dec hl
+	ld a, [hli]
+	ld l, [hl]
+	ld h, a
+	call TruncateHL_BC
+	ld d, 40
+	pop af
+	ld e, a
+	ret
+
+; 35612
+
+
+BattleCommand_DamageCalc: ; 35612
+; damagecalc
+
+; Return a damage value for move power d, player level e, enemy defense c and player attack b.
+
+; Return 1 if successful, else 0.
+
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call GetBattleVar
+
+; Selfdestruct and Explosion halve defense.
+	cp EFFECT_SELFDESTRUCT
+	jr nz, .dont_selfdestruct
+
+	srl c
+	jr nz, .dont_selfdestruct
+	inc c
+
+.dont_selfdestruct
+
+; Variable-hit moves and Conversion can have a power of 0.
+	cp EFFECT_MULTI_HIT
+	jr z, .skip_zero_damage_check
+
+	cp EFFECT_CONVERSION
+	jr z, .skip_zero_damage_check
+
+; No damage if move power is 0.
+	ld a, d
+	and a
+	ret z
+
+.skip_zero_damage_check
+; Minimum defense value is 1.
+	ld a, c
+	and a
+	jr nz, .not_dividing_by_zero
+	ld c, 1
+.not_dividing_by_zero
+
+	xor a
+	ld hl, hDividend
+	ld [hli], a
+	ld [hli], a
+	ld [hl], a
+
+; Level * 2
+	ld a, e
+	add a
+	jr nc, .level_not_overflowing
+	ld [hl], $1
+.level_not_overflowing
+	inc hl
+	ld [hli], a
+
+; / 5
+	ld a, 5
+	ld [hld], a
+	push bc
+	ld b, $4
+	call Divide
+	pop bc
+
+; + 2
+	inc [hl]
+	inc [hl]
+
+; * bp
+	inc hl
+	ld [hl], d
+	call Multiply
+
+; * Attack
+	ld [hl], b
+	call Multiply
+
+; / Defense
+	ld [hl], c
+	ld b, $4
+	call Divide
+
+; / 50
+	ld [hl], 50
+	ld b, $4
+	call Divide
+
+; Item boosts
+	call GetUserItem
+
+	ld a, b
+	and a
+	jr z, .DoneItem
+
+	ld hl, TypeBoostItems
+
+.NextItem:
+	ld a, [hli]
+	cp $ff
+	jr z, .DoneItem
+
+; Item effect
+	cp b
+	ld a, [hli]
+	jr nz, .NextItem
+
+; Type
+	ld b, a
+	ld a, BATTLE_VARS_MOVE_TYPE
+	call GetBattleVar
+	cp b
+	jr nz, .DoneItem
+
+; * 100 + item effect amount
+	ld a, c
+	add 100
+	ld [hMultiplier], a
+	call Multiply
+
+; / 100
+	ld a, 100
+	ld [hDivisor], a
+	ld b, 4
+	call Divide
+.DoneItem:
+
+; Critical hits
+	call .CriticalMultiplier
+
+
+; Update CurDamage (capped at 997).
+	ld hl, CurDamage
+	ld b, [hl]
+	ld a, [hProduct + 3]
+	add b
+	ld [hProduct + 3], a
+	jr nc, .dont_cap_1
+
+	ld a, [hProduct + 2]
+	inc a
+	ld [hProduct + 2], a
+	and a
+	jr z, .Cap
+
+.dont_cap_1
+	ld a, [hProduct]
+	ld b, a
+	ld a, [hProduct + 1]
+	or a
+	jr nz, .Cap
+
+	ld a, [hProduct + 2]
+	cp HIGH(MAX_STAT_VALUE - MIN_NEUTRAL_DAMAGE + 1)
+	jr c, .dont_cap_2
+
+	cp HIGH(MAX_STAT_VALUE - MIN_NEUTRAL_DAMAGE + 1) + 1
+	jr nc, .Cap
+
+	ld a, [hProduct + 3]
+	cp LOW(MAX_STAT_VALUE - MIN_NEUTRAL_DAMAGE + 1)
+	jr nc, .Cap
+
+.dont_cap_2
+	inc hl
+
+	ld a, [hProduct + 3]
+	ld b, [hl]
+	add b
+	ld [hld], a
+
+	ld a, [hProduct + 2]
+	ld b, [hl]
+	adc b
+	ld [hl], a
+	jr c, .Cap
+
+	ld a, [hl]
+	cp HIGH(MAX_STAT_VALUE - MIN_NEUTRAL_DAMAGE + 1)
+	jr c, .dont_cap_3
+
+	cp HIGH(MAX_STAT_VALUE - MIN_NEUTRAL_DAMAGE + 1) + 1
+	jr nc, .Cap
+
+	inc hl
+	ld a, [hld]
+	cp LOW(MAX_STAT_VALUE - MIN_NEUTRAL_DAMAGE + 1)
+	jr c, .dont_cap_3
+
+.Cap:
+	ld a, HIGH(MAX_STAT_VALUE - MIN_NEUTRAL_DAMAGE)
+	ld [hli], a
+	ld a, LOW(MAX_STAT_VALUE - MIN_NEUTRAL_DAMAGE)
+	ld [hld], a
+
+
+.dont_cap_3
+; Minimum neutral damage is 2 (bringing the cap to 999).
+	inc hl
+	ld a, [hl]
+	add MIN_NEUTRAL_DAMAGE
+	ld [hld], a
+	jr nc, .dont_floor
+	inc [hl]
+.dont_floor
+
+	ld a, 1
+	and a
+	ret
+
+
+.CriticalMultiplier:
+	ld a, [CriticalHit]
+	and a
+	ret z
+
+; x2
+	ld a, [hQuotient + 2]
+	add a
+	ld [hProduct + 3], a
+
+	ld a, [hQuotient + 1]
+	rl a
+	ld [hProduct + 2], a
+
+; Cap at $ffff.
+	ret nc
+
+	ld a, $ff
+	ld [hProduct + 2], a
+	ld [hProduct + 3], a
+
+	ret
+
+; 35703
+
+
+TypeBoostItems: ; 35703
+	db HELD_NORMAL_BOOST,   NORMAL   ; Pink/Polkadot Bow
+	db HELD_FIGHTING_BOOST, FIGHTING ; Blackbelt
+	db HELD_FLYING_BOOST,   FLYING   ; Sharp Beak
+	db HELD_POISON_BOOST,   POISON   ; Poison Barb
+	db HELD_GROUND_BOOST,   GROUND   ; Soft Sand
+	db HELD_ROCK_BOOST,     ROCK     ; Hard Stone
+	db HELD_BUG_BOOST,      BUG      ; Silverpowder
+	db HELD_GHOST_BOOST,    GHOST    ; Spell Tag
+	db HELD_FIRE_BOOST,     FIRE     ; Charcoal
+	db HELD_WATER_BOOST,    WATER    ; Mystic Water
+	db HELD_GRASS_BOOST,    GRASS    ; Miracle Seed
+	db HELD_ELECTRIC_BOOST, ELECTRIC ; Magnet
+	db HELD_PSYCHIC_BOOST,  PSYCHIC  ; Twistedspoon
+	db HELD_ICE_BOOST,      ICE      ; Nevermeltice
+	db HELD_DRAGON_BOOST,   DRAGON   ; Dragon Scale
+	db HELD_DARK_BOOST,     DARK     ; Blackglasses
+	db HELD_STEEL_BOOST,    STEEL    ; Metal Coat
+	db $ff
+; 35726
+
+
+BattleCommand_ConstantDamage: ; 35726
+; constantdamage
+
+	ld hl, BattleMonLevel
+	ld a, [hBattleTurn]
+	and a
+	jr z, .got_turn
+	ld hl, EnemyMonLevel
+
+.got_turn
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call GetBattleVar
+	cp EFFECT_LEVEL_DAMAGE
+	ld b, [hl]
+	ld a, 0
+	jr z, .got_power
+
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call GetBattleVar
+	cp EFFECT_PSYWAVE
+	jr z, .psywave
+
+	cp EFFECT_SUPER_FANG
+	jr z, .super_fang
+
+	cp EFFECT_REVERSAL
+	jr z, .reversal
+
+	ld a, BATTLE_VARS_MOVE_POWER
+	call GetBattleVar
+	ld b, a
+	ld a, $0
+	jr .got_power
+
+.psywave
+	ld a, b
+	srl a
+	add b
+	ld b, a
+.psywave_loop
+	call BattleRandom
+	and a
+	jr z, .psywave_loop
+	cp b
+	jr nc, .psywave_loop
+	ld b, a
+	ld a, $0
+	jr .got_power
+
+.super_fang
+	ld hl, EnemyMonHP
+	ld a, [hBattleTurn]
+	and a
+	jr z, .got_hp
+	ld hl, BattleMonHP
+.got_hp
+	ld a, [hli]
+	srl a
+	ld b, a
+	ld a, [hl]
+	rr a
+	push af
+	ld a, b
+	pop bc
+	and a
+	jr nz, .got_power
+	or b
+	ld a, $0
+	jr nz, .got_power
+	ld b, $1
+	jr .got_power
+
+.got_power
+	ld hl, CurDamage
+	ld [hli], a
+	ld [hl], b
+	ret
+
+.reversal
+	ld hl, BattleMonHP
+	ld a, [hBattleTurn]
+	and a
+	jr z, .reversal_got_hp
+	ld hl, EnemyMonHP
+.reversal_got_hp
+	xor a
+	ld [hDividend], a
+	ld [hMultiplicand + 0], a
+	ld a, [hli]
+	ld [hMultiplicand + 1], a
+	ld a, [hli]
+	ld [hMultiplicand + 2], a
+	ld a, $30
+	ld [hMultiplier], a
+	call Multiply
+	ld a, [hli]
+	ld b, a
+	ld a, [hl]
+	ld [hDivisor], a
+	ld a, b
+	and a
+	jr z, .skip_to_divide
+
+	ld a, [hProduct + 4]
+	srl b
+	rr a
+	srl b
+	rr a
+	ld [hDivisor], a
+	ld a, [hProduct + 2]
+	ld b, a
+	srl b
+	ld a, [hProduct + 3]
+	rr a
+	srl b
+	rr a
+	ld [hDividend + 3], a
+	ld a, b
+	ld [hDividend + 2], a
+
+.skip_to_divide
+	ld b, $4
+	call Divide
+	ld a, [hQuotient + 2]
+	ld b, a
+	ld hl, .FlailPower
+
+.reversal_loop
+	ld a, [hli]
+	cp b
+	jr nc, .break_loop
+	inc hl
+	jr .reversal_loop
+
+.break_loop
+	ld a, [hBattleTurn]
+	and a
+	ld a, [hl]
+	jr nz, .notPlayersTurn
+
+	ld hl, wPlayerMoveStructPower
+	ld [hl], a
+	push hl
+	call PlayerAttackDamage
+	jr .notEnemysTurn
+
+.notPlayersTurn
+	ld hl, wEnemyMoveStructPower
+	ld [hl], a
+	push hl
+	call EnemyAttackDamage
+
+.notEnemysTurn
+	call BattleCommand_DamageCalc
+	pop hl
+	ld [hl], 1
+	ret
+
+.FlailPower:
+	;  px,  bp
+	db  1, 200
+	db  4, 150
+	db  9, 100
+	db 16,  80
+	db 32,  40
+	db 48,  20
+; 35813
+
+
+BattleCommand_Counter: ; 35813
+; counter
+
+	ld a, 1
+	ld [AttackMissed], a
+	ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
+	call GetBattleVar
+	and a
+	ret z
+
+	ld b, a
+	callfar GetMoveEffect
+	ld a, b
+	cp EFFECT_COUNTER
+	ret z
+
+	call BattleCommand_ResetTypeMatchup
+	ld a, [wTypeMatchup]
+	and a
+	ret z
+
+	call CheckOpponentWentFirst
+	ret z
+
+	ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
+	call GetBattleVar
+	dec a
+	ld de, StringBuffer1
+	call GetMoveData
+
+	ld a, [StringBuffer1 + MOVE_POWER]
+	and a
+	ret z
+
+	ld a, [StringBuffer1 + MOVE_TYPE]
+	cp SPECIAL
+	ret nc
+
+	ld hl, CurDamage
+	ld a, [hli]
+	or [hl]
+	ret z
+
+	ld a, [hl]
+	add a
+	ld [hld], a
+	ld a, [hl]
+	adc a
+	ld [hl], a
+	jr nc, .capped
+	ld a, $ff
+	ld [hli], a
+	ld [hl], a
+.capped
+
+	xor a
+	ld [AttackMissed], a
+	ret
+
+; 35864
+
+
+BattleCommand_Encore: ; 35864
+; encore
+
+	ld hl, EnemyMonMoves
+	ld de, EnemyEncoreCount
+	ld a, [hBattleTurn]
+	and a
+	jr z, .ok
+	ld hl, BattleMonMoves
+	ld de, PlayerEncoreCount
+.ok
+	ld a, BATTLE_VARS_LAST_MOVE_OPP
+	call GetBattleVar
+	and a
+	jp z, .failed
+	cp STRUGGLE
+	jp z, .failed
+	cp ENCORE
+	jp z, .failed
+	cp MIRROR_MOVE
+	jp z, .failed
+	ld b, a
+
+.got_move
+	ld a, [hli]
+	cp b
+	jr nz, .got_move
+
+	ld bc, BattleMonPP - BattleMonMoves - 1
+	add hl, bc
+	ld a, [hl]
+	and $3f
+	jp z, .failed
+	ld a, [AttackMissed]
+	and a
+	jp nz, .failed
+	ld a, BATTLE_VARS_SUBSTATUS5_OPP
+	call GetBattleVarAddr
+	bit SUBSTATUS_ENCORED, [hl]
+	jp nz, .failed
+	set SUBSTATUS_ENCORED, [hl]
+	call BattleRandom
+	and $3
+	inc a
+	inc a
+	inc a
+	ld [de], a
+	call CheckOpponentWentFirst
+	jr nz, .finish_move
+	ld a, [hBattleTurn]
+	and a
+	jr z, .force_last_enemy_move
+
+	push hl
+	ld a, [LastPlayerMove]
+	ld b, a
+	ld c, 0
+	ld hl, BattleMonMoves
+.find_player_move
+	ld a, [hli]
+	cp b
+	jr z, .got_player_move
+	inc c
+	ld a, c
+	cp NUM_MOVES
+	jr c, .find_player_move
+	pop hl
+	res SUBSTATUS_ENCORED, [hl]
+	xor a
+	ld [de], a
+	jr .failed
+
+.got_player_move
+	pop hl
+	ld a, c
+	ld [CurMoveNum], a
+	ld a, b
+	ld [CurPlayerMove], a
+	dec a
+	ld de, wPlayerMoveStruct
+	call GetMoveData
+	jr .finish_move
+
+.force_last_enemy_move
+	push hl
+	ld a, [LastEnemyMove]
+	ld b, a
+	ld c, 0
+	ld hl, EnemyMonMoves
+.find_enemy_move
+	ld a, [hli]
+	cp b
+	jr z, .got_enemy_move
+	inc c
+	ld a, c
+	cp NUM_MOVES
+	jr c, .find_enemy_move
+	pop hl
+	res SUBSTATUS_ENCORED, [hl]
+	xor a
+	ld [de], a
+	jr .failed
+
+.got_enemy_move
+	pop hl
+	ld a, c
+	ld [CurEnemyMoveNum], a
+	ld a, b
+	ld [CurEnemyMove], a
+	dec a
+	ld de, wEnemyMoveStruct
+	call GetMoveData
+
+.finish_move
+	call AnimateCurrentMove
+	ld hl, GotAnEncoreText
+	jp StdBattleTextBox
+
+.failed
+	jp PrintDidntAffect2
+
+; 35926
+
+
+BattleCommand_PainSplit: ; 35926
+; painsplit
+
+	ld a, [AttackMissed]
+	and a
+	jp nz, .ButItFailed
+	call CheckSubstituteOpp
+	jp nz, .ButItFailed
+	call AnimateCurrentMove
+	ld hl, BattleMonMaxHP + 1
+	ld de, EnemyMonMaxHP + 1
+	call .PlayerShareHP
+	ld a, $1
+	ld [wWhichHPBar], a
+	hlcoord 10, 9
+	predef AnimateHPBar
+	ld hl, EnemyMonHP
+	ld a, [hli]
+	ld [Buffer4], a
+	ld a, [hli]
+	ld [Buffer3], a
+	ld a, [hli]
+	ld [Buffer2], a
+	ld a, [hl]
+	ld [Buffer1], a
+	call .EnemyShareHP
+	xor a
+	ld [wWhichHPBar], a
+	call ResetDamage
+	hlcoord 2, 2
+	predef AnimateHPBar
+	farcall _UpdateBattleHUDs
+
+	ld hl, SharedPainText
+	jp StdBattleTextBox
+
+.PlayerShareHP:
+	ld a, [hld]
+	ld [Buffer1], a
+	ld a, [hld]
+	ld [Buffer2], a
+	ld a, [hld]
+	ld b, a
+	ld [Buffer3], a
+	ld a, [hl]
+	ld [Buffer4], a
+	dec de
+	dec de
+	ld a, [de]
+	dec de
+	add b
+	ld [CurDamage + 1], a
+	ld b, [hl]
+	ld a, [de]
+	adc b
+	srl a
+	ld [CurDamage], a
+	ld a, [CurDamage + 1]
+	rr a
+	ld [CurDamage + 1], a
+	inc hl
+	inc hl
+	inc hl
+	inc de
+	inc de
+	inc de
+
+.EnemyShareHP: ; 359ac
+	ld c, [hl]
+	dec hl
+	ld a, [CurDamage + 1]
+	sub c
+	ld b, [hl]
+	dec hl
+	ld a, [CurDamage]
+	sbc b
+	jr nc, .skip
+
+	ld a, [CurDamage]
+	ld b, a
+	ld a, [CurDamage + 1]
+	ld c, a
+.skip
+	ld a, c
+	ld [hld], a
+	ld [Buffer5], a
+	ld a, b
+	ld [hli], a
+	ld [Buffer6], a
+	ret
+
+; 359cd
+
+.ButItFailed:
+	jp PrintDidntAffect2
+
+; 359d0
+
+
+BattleCommand_Snore: ; 359d0
+; snore
+	ld a, BATTLE_VARS_STATUS
+	call GetBattleVar
+	and SLP
+	ret nz
+	call ResetDamage
+	ld a, $1
+	ld [AttackMissed], a
+	call FailSnore
+	jp EndMoveEffect
+
+; 359e6
+
+
+BattleCommand_Conversion2: ; 359e6
+; conversion2
+
+	ld a, [AttackMissed]
+	and a
+	jr nz, .failed
+	ld hl, BattleMonType1
+	ld a, [hBattleTurn]
+	and a
+	jr z, .got_type
+	ld hl, EnemyMonType1
+.got_type
+	ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
+	call GetBattleVar
+	and a
+	jr z, .failed
+	push hl
+	dec a
+	ld hl, Moves + MOVE_TYPE
+	call GetMoveAttr
+	ld d, a
+	pop hl
+	cp CURSE_T
+	jr z, .failed
+	call AnimateCurrentMove
+	call BattleCommand_SwitchTurn
+
+.loop
+	call BattleRandom
+	and $1f
+	cp UNUSED_TYPES
+	jr c, .okay
+	cp UNUSED_TYPES_END
+	jr c, .loop
+	cp TYPES_END
+	jr nc, .loop
+.okay
+	ld [hli], a
+	ld [hld], a
+	push hl
+	ld a, BATTLE_VARS_MOVE_TYPE
+	call GetBattleVarAddr
+	push af
+	push hl
+	ld a, d
+	ld [hl], a
+	call BattleCheckTypeMatchup
+	pop hl
+	pop af
+	ld [hl], a
+	pop hl
+	ld a, [wTypeMatchup]
+	cp 10
+	jr nc, .loop
+	call BattleCommand_SwitchTurn
+
+	ld a, [hl]
+	ld [wNamedObjectIndexBuffer], a
+	predef GetTypeName
+	ld hl, TransformedTypeText
+	jp StdBattleTextBox
+
+.failed
+	jp FailConversion2
+
+; 35a53
+
+
+BattleCommand_LockOn: ; 35a53
+; lockon
+
+	call CheckSubstituteOpp
+	jr nz, .fail
+
+	ld a, [AttackMissed]
+	and a
+	jr nz, .fail
+
+	ld a, BATTLE_VARS_SUBSTATUS5_OPP
+	call GetBattleVarAddr
+	set SUBSTATUS_LOCK_ON, [hl]
+	call AnimateCurrentMove
+
+	ld hl, TookAimText
+	jp StdBattleTextBox
+
+.fail
+	call AnimateFailedMove
+	jp PrintDidntAffect
+
+; 35a74
+
+
+BattleCommand_Sketch: ; 35a74
+; sketch
+
+	call ClearLastMove
+; Don't sketch during a link battle
+	ld a, [wLinkMode]
+	and a
+	jr z, .not_linked
+	call AnimateFailedMove
+	jp PrintNothingHappened
+
+.not_linked
+; If the opponent has a substitute up, fail.
+	call CheckSubstituteOpp
+	jp nz, .fail
+; If the opponent is transformed, fail.
+	ld a, BATTLE_VARS_SUBSTATUS5_OPP
+	call GetBattleVarAddr
+	bit SUBSTATUS_TRANSFORMED, [hl]
+	jp nz, .fail
+; Get the user's moveset in its party struct.
+; This move replacement shall be permanent.
+; Pointer will be in de.
+	ld a, MON_MOVES
+	call UserPartyAttr
+	ld d, h
+	ld e, l
+; Get the battle move structs.
+	ld hl, BattleMonMoves
+	ld a, [hBattleTurn]
+	and a
+	jr z, .get_last_move
+	ld hl, EnemyMonMoves
+.get_last_move
+	ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
+	call GetBattleVar
+	ld [wTypeMatchup], a
+	ld b, a
+; Fail if move is invalid or is Struggle.
+	and a
+	jr z, .fail
+	cp STRUGGLE
+	jr z, .fail
+; Fail if user already knows that move
+	ld c, NUM_MOVES
+.does_user_already_know_move
+	ld a, [hli]
+	cp b
+	jr z, .fail
+	dec c
+	jr nz, .does_user_already_know_move
+; Find Sketch in the user's moveset.
+; Pointer in hl, and index in c.
+	dec hl
+	ld c, NUM_MOVES
+.find_sketch
+	dec c
+	ld a, [hld]
+	cp SKETCH
+	jr nz, .find_sketch
+	inc hl
+; The Sketched move is loaded to that slot.
+	ld a, b
+	ld [hl], a
+; Copy the base PP from that move.
+	push bc
+	push hl
+	dec a
+	ld hl, Moves + MOVE_PP
+	call GetMoveAttr
+	pop hl
+	ld bc, BattleMonPP - BattleMonMoves
+	add hl, bc
+	ld [hl], a
+	pop bc
+
+	ld a, [hBattleTurn]
+	and a
+	jr z, .user_trainer
+	ld a, [wBattleMode]
+	dec a
+	jr nz, .user_trainer
+; wildmon
+	ld a, [hl]
+	push bc
+	ld hl, wWildMonPP
+	ld b, 0
+	add hl, bc
+	ld [hl], a
+	ld hl, wWildMonMoves
+	add hl, bc
+	pop bc
+	ld [hl], b
+	jr .done_copy
+
+.user_trainer
+	ld a, [hl]
+	push af
+	ld l, c
+	ld h, 0
+	add hl, de
+	ld a, b
+	ld [hl], a
+	pop af
+	ld de, MON_PP - MON_MOVES
+	add hl, de
+	ld [hl], a
+.done_copy
+	call GetMoveName
+	call AnimateCurrentMove
+
+	ld hl, SketchedText
+	jp StdBattleTextBox
+
+.fail
+	call AnimateFailedMove
+	jp PrintDidntAffect
+
+; 35b16
+
+
+BattleCommand_DefrostOpponent: ; 35b16
+; defrostopponent
+; Thaw the opponent if frozen, and
+; raise the user's Attack one stage.
+
+	call AnimateCurrentMove
+
+	ld a, BATTLE_VARS_STATUS_OPP
+	call GetBattleVarAddr
+	call Defrost
+
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call GetBattleVarAddr
+	ld a, [hl]
+	push hl
+	push af
+
+	ld a, EFFECT_ATTACK_UP
+	ld [hl], a
+	call BattleCommand_StatUp
+
+	pop af
+	pop hl
+	ld [hl], a
+	ret
+
+; 35b33
+
+
+BattleCommand_SleepTalk: ; 35b33
+; sleeptalk
+
+	call ClearLastMove
+	ld a, [AttackMissed]
+	and a
+	jr nz, .fail
+	ld a, [hBattleTurn]
+	and a
+	ld hl, BattleMonMoves + 1
+	ld a, [DisabledMove]
+	ld d, a
+	jr z, .got_moves
+	ld hl, EnemyMonMoves + 1
+	ld a, [EnemyDisabledMove]
+	ld d, a
+.got_moves
+	ld a, BATTLE_VARS_STATUS
+	call GetBattleVar
+	and SLP
+	jr z, .fail
+	ld a, [hl]
+	and a
+	jr z, .fail
+	call .safely_check_has_usable_move
+	jr c, .fail
+	dec hl
+.sample_move
+	push hl
+	call BattleRandom
+	and 3 ; TODO factor in NUM_MOVES
+	ld c, a
+	ld b, 0
+	add hl, bc
+	ld a, [hl]
+	pop hl
+	and a
+	jr z, .sample_move
+	ld e, a
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call GetBattleVar
+	cp e
+	jr z, .sample_move
+	ld a, e
+	cp d
+	jr z, .sample_move
+	call .check_two_turn_move
+	jr z, .sample_move
+	ld a, BATTLE_VARS_MOVE
+	call GetBattleVarAddr
+	ld a, e
+	ld [hl], a
+	call CheckUserIsCharging
+	jr nz, .charging
+	ld a, [wKickCounter]
+	push af
+	call BattleCommand_LowerSub
+	pop af
+	ld [wKickCounter], a
+.charging
+	call LoadMoveAnim
+	call UpdateMoveData
+	jp ResetTurn
+
+.fail
+	call AnimateFailedMove
+	jp TryPrintButItFailed
+
+.safely_check_has_usable_move
+	push hl
+	push de
+	push bc
+	call .check_has_usable_move
+	pop bc
+	pop de
+	pop hl
+	ret
+
+.check_has_usable_move
+	ld a, [hBattleTurn]
+	and a
+	ld a, [DisabledMove]
+	jr z, .got_move_2
+
+	ld a, [EnemyDisabledMove]
+.got_move_2
+	ld b, a
+	ld a, BATTLE_VARS_MOVE
+	call GetBattleVar
+	ld c, a
+	dec hl
+	ld d, NUM_MOVES
+.loop2
+	ld a, [hl]
+	and a
+	jr z, .carry
+
+	cp c
+	jr z, .nope
+	cp b
+	jr z, .nope
+
+	call .check_two_turn_move
+	jr nz, .no_carry
+
+.nope
+	inc hl
+	dec d
+	jr nz, .loop2
+
+.carry
+	scf
+	ret
+
+.no_carry
+	and a
+	ret
+
+.check_two_turn_move
+	push hl
+	push de
+	push bc
+
+	ld b, a
+	callfar GetMoveEffect
+	ld a, b
+
+	pop bc
+	pop de
+	pop hl
+
+	cp EFFECT_SKULL_BASH
+	ret z
+	cp EFFECT_RAZOR_WIND
+	ret z
+	cp EFFECT_SKY_ATTACK
+	ret z
+	cp EFFECT_SOLARBEAM
+	ret z
+	cp EFFECT_FLY
+	ret z
+	cp EFFECT_BIDE
+	ret
+
+; 35bff
+
+
+BattleCommand_DestinyBond: ; 35bff
+; destinybond
+
+	ld a, BATTLE_VARS_SUBSTATUS5
+	call GetBattleVarAddr
+	set SUBSTATUS_DESTINY_BOND, [hl]
+	call AnimateCurrentMove
+	ld hl, DestinyBondEffectText
+	jp StdBattleTextBox
+
+; 35c0f
+
+
+BattleCommand_Spite: ; 35c0f
+; spite
+
+	ld a, [AttackMissed]
+	and a
+	jp nz, .failed
+	ld bc, PARTYMON_STRUCT_LENGTH ; ????
+	ld hl, EnemyMonMoves
+	ld a, [hBattleTurn]
+	and a
+	jr z, .got_moves
+	ld hl, BattleMonMoves
+.got_moves
+	ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
+	call GetBattleVar
+	and a
+	jr z, .failed
+	cp STRUGGLE
+	jr z, .failed
+	ld b, a
+	ld c, -1
+.loop
+	inc c
+	ld a, [hli]
+	cp b
+	jr nz, .loop
+	ld [wTypeMatchup], a
+	dec hl
+	ld b, 0
+	push bc
+	ld c, BattleMonPP - BattleMonMoves
+	add hl, bc
+	pop bc
+	ld a, [hl]
+	and $3f
+	jr z, .failed
+	push bc
+	call GetMoveName
+	call BattleRandom
+	and 3
+	inc a
+	inc a
+	ld b, a
+	ld a, [hl]
+	and $3f
+	cp b
+	jr nc, .deplete_pp
+	ld b, a
+.deplete_pp
+	ld a, [hl]
+	sub b
+	ld [hl], a
+	push af
+	ld a, MON_PP
+	call OpponentPartyAttr
+	ld d, b
+	pop af
+	pop bc
+	add hl, bc
+	ld e, a
+	ld a, BATTLE_VARS_SUBSTATUS5_OPP
+	call GetBattleVar
+	bit SUBSTATUS_TRANSFORMED, a
+	jr nz, .transformed
+	ld a, [hBattleTurn]
+	and a
+	jr nz, .not_wildmon
+	ld a, [wBattleMode]
+	dec a
+	jr nz, .not_wildmon
+	ld hl, wWildMonPP
+	add hl, bc
+.not_wildmon
+	ld [hl], e
+.transformed
+	push de
+	call AnimateCurrentMove
+	pop de
+	ld a, d
+	ld [wTypeMatchup], a
+	ld hl, SpiteEffectText
+	jp StdBattleTextBox
+
+.failed
+	jp PrintDidntAffect2
+
+; 35c94
+
+
+BattleCommand_FalseSwipe: ; 35c94
+; falseswipe
+
+	ld hl, EnemyMonHP
+	ld a, [hBattleTurn]
+	and a
+	jr z, .got_hp
+	ld hl, BattleMonHP
+.got_hp
+	ld de, CurDamage
+	ld c, 2
+	push hl
+	push de
+	call StringCmp
+	pop de
+	pop hl
+	jr c, .done
+	ld a, [hli]
+	ld [de], a
+	inc de
+	ld a, [hl]
+	dec a
+	ld [de], a
+	inc a
+	jr nz, .okay
+	dec de
+	ld a, [de]
+	dec a
+	ld [de], a
+.okay
+	ld a, [CriticalHit]
+	cp $2
+	jr nz, .carry
+	xor a
+	ld [CriticalHit], a
+.carry
+	scf
+	ret
+
+.done
+	and a
+	ret
+
+; 35cc9
+
+
+BattleCommand_HealBell: ; 35cc9
+; healbell
+
+	ld a, BATTLE_VARS_SUBSTATUS1
+	call GetBattleVarAddr
+	res SUBSTATUS_NIGHTMARE, [hl]
+	ld de, PartyMon1Status
+	ld a, [hBattleTurn]
+	and a
+	jr z, .got_status
+	ld de, OTPartyMon1Status
+.got_status
+	ld a, BATTLE_VARS_STATUS
+	call GetBattleVarAddr
+	xor a
+	ld [hl], a
+	ld h, d
+	ld l, e
+	ld bc, PARTYMON_STRUCT_LENGTH
+	ld d, PARTY_LENGTH
+.loop
+	ld [hl], a
+	add hl, bc
+	dec d
+	jr nz, .loop
+	call AnimateCurrentMove
+
+	ld hl, BellChimedText
+	call StdBattleTextBox
+
+	ld a, [hBattleTurn]
+	and a
+	jp z, CalcPlayerStats
+	jp CalcEnemyStats
+
+; 35d00
+
+
+FarPlayBattleAnimation: ; 35d00
+; play animation de
+
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVar
+	and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
+	ret nz
+
+	; fallthrough
+; 35d08
+
+PlayFXAnimID: ; 35d08
+	ld a, e
+	ld [FXAnimID], a
+	ld a, d
+	ld [FXAnimID + 1], a
+
+	ld c, 3
+	call DelayFrames
+
+	callfar PlayBattleAnim
+
+	ret
+
+; 35d1c
+
+
+EnemyHurtItself: ; 35d1c
+	ld hl, CurDamage
+	ld a, [hli]
+	ld b, a
+	ld a, [hl]
+	or b
+	jr z, .did_no_damage
+
+	ld a, c
+	and a
+	jr nz, .mimic_sub_check
+
+	ld a, [EnemySubStatus4]
+	bit SUBSTATUS_SUBSTITUTE, a
+	jp nz, SelfInflictDamageToSubstitute
+
+.mimic_sub_check
+	ld a, [hld]
+	ld b, a
+	ld a, [EnemyMonHP + 1]
+	ld [Buffer3], a
+	sub b
+	ld [EnemyMonHP + 1], a
+	ld a, [hl]
+	ld b, a
+	ld a, [EnemyMonHP]
+	ld [Buffer4], a
+	sbc b
+	ld [EnemyMonHP], a
+	jr nc, .mimic_faint
+
+	ld a, [Buffer4]
+	ld [hli], a
+	ld a, [Buffer3]
+	ld [hl], a
+
+	xor a
+	ld hl, EnemyMonHP
+	ld [hli], a
+	ld [hl], a
+
+.mimic_faint
+	ld hl, EnemyMonMaxHP
+	ld a, [hli]
+	ld [Buffer2], a
+	ld a, [hl]
+	ld [Buffer1], a
+	ld hl, EnemyMonHP
+	ld a, [hli]
+	ld [Buffer6], a
+	ld a, [hl]
+	ld [Buffer5], a
+	hlcoord 2, 2
+	xor a
+	ld [wWhichHPBar], a
+	predef AnimateHPBar
+.did_no_damage
+	jp RefreshBattleHuds
+
+; 35d7e
+
+
+PlayerHurtItself: ; 35d7e
+	ld hl, CurDamage
+	ld a, [hli]
+	ld b, a
+	ld a, [hl]
+	or b
+	jr z, .did_no_damage
+
+	ld a, c
+	and a
+	jr nz, .mimic_sub_check
+
+	ld a, [PlayerSubStatus4]
+	bit SUBSTATUS_SUBSTITUTE, a
+	jp nz, SelfInflictDamageToSubstitute
+.mimic_sub_check
+	ld a, [hld]
+	ld b, a
+	ld a, [BattleMonHP + 1]
+	ld [Buffer3], a
+	sub b
+	ld [BattleMonHP + 1], a
+	ld [Buffer5], a
+	ld b, [hl]
+	ld a, [BattleMonHP]
+	ld [Buffer4], a
+	sbc b
+	ld [BattleMonHP], a
+	ld [Buffer6], a
+	jr nc, .mimic_faint
+
+	ld a, [Buffer4]
+	ld [hli], a
+	ld a, [Buffer3]
+	ld [hl], a
+	xor a
+
+	ld hl, BattleMonHP
+	ld [hli], a
+	ld [hl], a
+	ld hl, Buffer5
+	ld [hli], a
+	ld [hl], a
+
+.mimic_faint
+	ld hl, BattleMonMaxHP
+	ld a, [hli]
+	ld [Buffer2], a
+	ld a, [hl]
+	ld [Buffer1], a
+	hlcoord 10, 9
+	ld a, $1
+	ld [wWhichHPBar], a
+	predef AnimateHPBar
+.did_no_damage
+	jp RefreshBattleHuds
+
+; 35de0
+
+
+SelfInflictDamageToSubstitute: ; 35de0
+
+	ld hl, SubTookDamageText
+	call StdBattleTextBox
+
+	ld de, EnemySubstituteHP
+	ld a, [hBattleTurn]
+	and a
+	jr z, .got_hp
+	ld de, PlayerSubstituteHP
+.got_hp
+
+	ld hl, CurDamage
+	ld a, [hli]
+	and a
+	jr nz, .broke
+
+	ld a, [de]
+	sub [hl]
+	ld [de], a
+	jr z, .broke
+	jr nc, .done
+
+.broke
+	ld a, BATTLE_VARS_SUBSTATUS4_OPP
+	call GetBattleVarAddr
+	res SUBSTATUS_SUBSTITUTE, [hl]
+
+	ld hl, SubFadedText
+	call StdBattleTextBox
+
+	call BattleCommand_SwitchTurn
+	call BattleCommand_LowerSubNoAnim
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVar
+	and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
+	call z, AppearUserLowerSub
+	call BattleCommand_SwitchTurn
+
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call GetBattleVarAddr
+	cp EFFECT_MULTI_HIT
+	jr z, .ok
+	cp EFFECT_DOUBLE_HIT
+	jr z, .ok
+	cp EFFECT_POISON_MULTI_HIT
+	jr z, .ok
+	cp EFFECT_TRIPLE_KICK
+	jr z, .ok
+	cp EFFECT_BEAT_UP
+	jr z, .ok
+	xor a
+	ld [hl], a
+.ok
+	call RefreshBattleHuds
+.done
+	jp ResetDamage
+
+; 35e40
+
+
+UpdateMoveData: ; 35e40
+
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call GetBattleVarAddr
+	ld d, h
+	ld e, l
+
+	ld a, BATTLE_VARS_MOVE
+	call GetBattleVar
+	ld [CurMove], a
+	ld [wNamedObjectIndexBuffer], a
+
+	dec a
+	call GetMoveData
+	call GetMoveName
+	jp CopyName1
+
+; 35e5c
+
+
+BattleCommand_SleepTarget: ; 35e5c
+; sleeptarget
+
+	call GetOpponentItem
+	ld a, b
+	cp HELD_PREVENT_SLEEP
+	jr nz, .not_protected_by_item
+
+	ld a, [hl]
+	ld [wNamedObjectIndexBuffer], a
+	call GetItemName
+	ld hl, ProtectedByText
+	jr .fail
+
+.not_protected_by_item
+	ld a, BATTLE_VARS_STATUS_OPP
+	call GetBattleVarAddr
+	ld d, h
+	ld e, l
+	ld a, [de]
+	and SLP
+	ld hl, AlreadyAsleepText
+	jr nz, .fail
+
+	ld a, [AttackMissed]
+	and a
+	jp nz, PrintDidntAffect2
+
+	ld hl, DidntAffect1Text
+	call .CheckAIRandomFail
+	jr c, .fail
+
+	ld a, [de]
+	and a
+	jr nz, .fail
+
+	call CheckSubstituteOpp
+	jr nz, .fail
+
+	call AnimateCurrentMove
+	ld b, $7
+	ld a, [InBattleTowerBattle]
+	and a
+	jr z, .random_loop
+	ld b, $3
+
+.random_loop
+	call BattleRandom
+	and b
+	jr z, .random_loop
+	cp 7
+	jr z, .random_loop
+	inc a
+	ld [de], a
+	call UpdateOpponentInParty
+	call RefreshBattleHuds
+
+	ld hl, FellAsleepText
+	call StdBattleTextBox
+
+	farcall UseHeldStatusHealingItem
+
+	jp z, OpponentCantMove
+	ret
+
+.fail
+	push hl
+	call AnimateFailedMove
+	pop hl
+	jp StdBattleTextBox
+
+; 35ece
+
+
+.CheckAIRandomFail: ; 35ece
+	; Enemy turn
+	ld a, [hBattleTurn]
+	and a
+	jr z, .dont_fail
+
+	; Not in link battle
+	ld a, [wLinkMode]
+	and a
+	jr nz, .dont_fail
+
+	ld a, [InBattleTowerBattle]
+	and a
+	jr nz, .dont_fail
+
+	; Not locked-on by the enemy
+	ld a, [PlayerSubStatus5]
+	bit SUBSTATUS_LOCK_ON, a
+	jr nz, .dont_fail
+
+	call BattleRandom
+	cp $40 ; 25%
+	ret c
+
+.dont_fail
+	xor a
+	ret
+
+; 35eee
+
+
+BattleCommand_PoisonTarget: ; 35eee
+; poisontarget
+
+	call CheckSubstituteOpp
+	ret nz
+	ld a, BATTLE_VARS_STATUS_OPP
+	call GetBattleVarAddr
+	and a
+	ret nz
+	ld a, [TypeModifier]
+	and $7f
+	ret z
+	call CheckIfTargetIsPoisonType
+	ret z
+	call GetOpponentItem
+	ld a, b
+	cp HELD_PREVENT_POISON
+	ret z
+	ld a, [EffectFailed]
+	and a
+	ret nz
+	call SafeCheckSafeguard
+	ret nz
+
+	call PoisonOpponent
+	ld de, ANIM_PSN
+	call PlayOpponentBattleAnim
+	call RefreshBattleHuds
+
+	ld hl, WasPoisonedText
+	call StdBattleTextBox
+
+	farcall UseHeldStatusHealingItem
+	ret
+
+; 35f2c
+
+
+BattleCommand_Poison: ; 35f2c
+; poison
+
+	ld hl, DoesntAffectText
+	ld a, [TypeModifier]
+	and $7f
+	jp z, .failed
+
+	call CheckIfTargetIsPoisonType
+	jp z, .failed
+
+	ld a, BATTLE_VARS_STATUS_OPP
+	call GetBattleVar
+	ld b, a
+	ld hl, AlreadyPoisonedText
+	and 1 << PSN
+	jp nz, .failed
+
+	call GetOpponentItem
+	ld a, b
+	cp HELD_PREVENT_POISON
+	jr nz, .do_poison
+	ld a, [hl]
+	ld [wNamedObjectIndexBuffer], a
+	call GetItemName
+	ld hl, ProtectedByText
+	jr .failed
+
+.do_poison
+	ld hl, DidntAffect1Text
+	ld a, BATTLE_VARS_STATUS_OPP
+	call GetBattleVar
+	and a
+	jr nz, .failed
+
+	ld a, [hBattleTurn]
+	and a
+	jr z, .mimic_random
+
+	ld a, [wLinkMode]
+	and a
+	jr nz, .mimic_random
+
+	ld a, [InBattleTowerBattle]
+	and a
+	jr nz, .mimic_random
+
+	ld a, [PlayerSubStatus5]
+	bit SUBSTATUS_LOCK_ON, a
+	jr nz, .mimic_random
+
+	call BattleRandom
+	cp $40 ; 25% chance AI fails
+	jr c, .failed
+
+.mimic_random
+	call CheckSubstituteOpp
+	jr nz, .failed
+	ld a, [AttackMissed]
+	and a
+	jr nz, .failed
+	call .check_toxic
+	jr z, .toxic
+
+	call .apply_poison
+	ld hl, WasPoisonedText
+	call StdBattleTextBox
+	jr .finished
+
+.toxic
+	set SUBSTATUS_TOXIC, [hl]
+	xor a
+	ld [de], a
+	call .apply_poison
+
+	ld hl, BadlyPoisonedText
+	call StdBattleTextBox
+
+.finished
+	farcall UseHeldStatusHealingItem
+	ret
+
+.failed
+	push hl
+	call AnimateFailedMove
+	pop hl
+	jp StdBattleTextBox
+
+; 35fc0
+
+
+.apply_poison ; 35fc0
+	call AnimateCurrentMove
+	call PoisonOpponent
+	jp RefreshBattleHuds
+
+; 35fc9
+
+
+.check_toxic ; 35fc9
+	ld a, BATTLE_VARS_SUBSTATUS5_OPP
+	call GetBattleVarAddr
+	ld a, [hBattleTurn]
+	and a
+	ld de, EnemyToxicCount
+	jr z, .ok
+	ld de, PlayerToxicCount
+.ok
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call GetBattleVar
+	cp EFFECT_TOXIC
+	ret
+
+; 35fe1
+
+
+CheckIfTargetIsPoisonType: ; 35fe1
+	ld de, EnemyMonType1
+	ld a, [hBattleTurn]
+	and a
+	jr z, .ok
+	ld de, BattleMonType1
+.ok
+	ld a, [de]
+	inc de
+	cp POISON
+	ret z
+	ld a, [de]
+	cp POISON
+	ret
+
+; 35ff5
+
+
+PoisonOpponent: ; 35ff5
+	ld a, BATTLE_VARS_STATUS_OPP
+	call GetBattleVarAddr
+	set PSN, [hl]
+	jp UpdateOpponentInParty
+
+; 35fff
+
+
+BattleCommand_DrainTarget: ; 35fff
+; draintarget
+	call SapHealth
+	ld hl, SuckedHealthText
+	jp StdBattleTextBox
+
+; 36008
+
+
+BattleCommand_EatDream: ; 36008
+; eatdream
+	call SapHealth
+	ld hl, DreamEatenText
+	jp StdBattleTextBox
+
+; 36011
+
+
+SapHealth: ; 36011
+	ld hl, CurDamage
+	ld a, [hli]
+	srl a
+	ld [hDividend], a
+	ld b, a
+	ld a, [hl]
+	rr a
+	ld [hDividend + 1], a
+	or b
+	jr nz, .ok1
+	ld a, $1
+	ld [hDividend + 1], a
+.ok1
+	ld hl, BattleMonHP
+	ld de, BattleMonMaxHP
+	ld a, [hBattleTurn]
+	and a
+	jr z, .battlemonhp
+	ld hl, EnemyMonHP
+	ld de, EnemyMonMaxHP
+.battlemonhp
+	ld bc, Buffer4
+	ld a, [hli]
+	ld [bc], a
+	ld a, [hl]
+	dec bc
+	ld [bc], a
+	ld a, [de]
+	dec bc
+	ld [bc], a
+	inc de
+	ld a, [de]
+	dec bc
+	ld [bc], a
+	ld a, [hDividend + 1]
+	ld b, [hl]
+	add b
+	ld [hld], a
+	ld [Buffer5], a
+	ld a, [hDividend]
+	ld b, [hl]
+	adc b
+	ld [hli], a
+	ld [Buffer6], a
+	jr c, .okay2
+	ld a, [hld]
+	ld b, a
+	ld a, [de]
+	dec de
+	sub b
+	ld a, [hli]
+	ld b, a
+	ld a, [de]
+	inc de
+	sbc b
+	jr nc, .okay3
+.okay2
+	ld a, [de]
+	ld [hld], a
+	ld [Buffer5], a
+	dec de
+	ld a, [de]
+	ld [hli], a
+	ld [Buffer6], a
+	inc de
+.okay3
+	ld a, [hBattleTurn]
+	and a
+	hlcoord 10, 9
+	ld a, $1
+	jr z, .hp_bar
+	hlcoord 2, 2
+	xor a
+.hp_bar
+	ld [wWhichHPBar], a
+	predef AnimateHPBar
+	call RefreshBattleHuds
+	jp UpdateBattleMonInParty
+
+; 3608c
+
+
+BattleCommand_BurnTarget: ; 3608c
+; burntarget
+
+	xor a
+	ld [wNumHits], a
+	call CheckSubstituteOpp
+	ret nz
+	ld a, BATTLE_VARS_STATUS_OPP
+	call GetBattleVarAddr
+	and a
+	jp nz, Defrost
+	ld a, [TypeModifier]
+	and $7f
+	ret z
+	call CheckMoveTypeMatchesTarget ; Don't burn a Fire-type
+	ret z
+	call GetOpponentItem
+	ld a, b
+	cp HELD_PREVENT_BURN
+	ret z
+	ld a, [EffectFailed]
+	and a
+	ret nz
+	call SafeCheckSafeguard
+	ret nz
+	ld a, BATTLE_VARS_STATUS_OPP
+	call GetBattleVarAddr
+	set BRN, [hl]
+	call UpdateOpponentInParty
+	ld hl, ApplyBrnEffectOnAttack
+	call CallBattleCore
+	ld de, ANIM_BRN
+	call PlayOpponentBattleAnim
+	call RefreshBattleHuds
+
+	ld hl, WasBurnedText
+	call StdBattleTextBox
+
+	farcall UseHeldStatusHealingItem
+	ret
+
+; 360dd
+
+
+Defrost: ; 360dd
+	ld a, [hl]
+	and 1 << FRZ
+	ret z
+
+	xor a
+	ld [hl], a
+
+	ld a, [hBattleTurn]
+	and a
+	ld a, [CurOTMon]
+	ld hl, OTPartyMon1Status
+	jr z, .ok
+	ld hl, PartyMon1Status
+	ld a, [CurBattleMon]
+.ok
+
+	call GetPartyLocation
+	xor a
+	ld [hl], a
+	call UpdateOpponentInParty
+
+	ld hl, DefrostedOpponentText
+	jp StdBattleTextBox
+
+; 36102
+
+
+BattleCommand_FreezeTarget: ; 36102
+; freezetarget
+
+	xor a
+	ld [wNumHits], a
+	call CheckSubstituteOpp
+	ret nz
+	ld a, BATTLE_VARS_STATUS_OPP
+	call GetBattleVarAddr
+	and a
+	ret nz
+	ld a, [TypeModifier]
+	and $7f
+	ret z
+	ld a, [Weather]
+	cp WEATHER_SUN
+	ret z
+	call CheckMoveTypeMatchesTarget ; Don't freeze an Ice-type
+	ret z
+	call GetOpponentItem
+	ld a, b
+	cp HELD_PREVENT_FREEZE
+	ret z
+	ld a, [EffectFailed]
+	and a
+	ret nz
+	call SafeCheckSafeguard
+	ret nz
+	ld a, BATTLE_VARS_STATUS_OPP
+	call GetBattleVarAddr
+	set FRZ, [hl]
+	call UpdateOpponentInParty
+	ld de, ANIM_FRZ
+	call PlayOpponentBattleAnim
+	call RefreshBattleHuds
+
+	ld hl, WasFrozenText
+	call StdBattleTextBox
+
+	farcall UseHeldStatusHealingItem
+	ret nz
+
+	call OpponentCantMove
+	call EndRechargeOpp
+	ld hl, wEnemyJustGotFrozen
+	ld a, [hBattleTurn]
+	and a
+	jr z, .finish
+	ld hl, wPlayerJustGotFrozen
+.finish
+	ld [hl], $1
+	ret
+
+; 36165
+
+
+BattleCommand_ParalyzeTarget: ; 36165
+; paralyzetarget
+
+	xor a
+	ld [wNumHits], a
+	call CheckSubstituteOpp
+	ret nz
+	ld a, BATTLE_VARS_STATUS_OPP
+	call GetBattleVarAddr
+	and a
+	ret nz
+	ld a, [TypeModifier]
+	and $7f
+	ret z
+	call GetOpponentItem
+	ld a, b
+	cp HELD_PREVENT_PARALYZE
+	ret z
+	ld a, [EffectFailed]
+	and a
+	ret nz
+	call SafeCheckSafeguard
+	ret nz
+	ld a, BATTLE_VARS_STATUS_OPP
+	call GetBattleVarAddr
+	set PAR, [hl]
+	call UpdateOpponentInParty
+	ld hl, ApplyPrzEffectOnSpeed
+	call CallBattleCore
+	ld de, ANIM_PAR
+	call PlayOpponentBattleAnim
+	call RefreshBattleHuds
+	call PrintParalyze
+	ld hl, UseHeldStatusHealingItem
+	jp CallBattleCore
+
+; 361ac
+
+
+BattleCommand_AttackUp: ; 361ac
+; attackup
+	ld b, ATTACK
+	jr BattleCommand_StatUp
+
+BattleCommand_DefenseUp: ; 361b0
+; defenseup
+	ld b, DEFENSE
+	jr BattleCommand_StatUp
+
+BattleCommand_SpeedUp: ; 361b4
+; speedup
+	ld b, SPEED
+	jr BattleCommand_StatUp
+
+BattleCommand_SpecialAttackUp: ; 361b8
+; specialattackup
+	ld b, SP_ATTACK
+	jr BattleCommand_StatUp
+
+BattleCommand_SpecialDefenseUp: ; 361bc
+; specialdefenseup
+	ld b, SP_DEFENSE
+	jr BattleCommand_StatUp
+
+BattleCommand_AccuracyUp: ; 361c0
+; accuracyup
+	ld b, ACCURACY
+	jr BattleCommand_StatUp
+
+BattleCommand_EvasionUp: ; 361c4
+; evasionup
+	ld b, EVASION
+	jr BattleCommand_StatUp
+
+BattleCommand_AttackUp2: ; 361c8
+; attackup2
+	ld b, $10 | ATTACK
+	jr BattleCommand_StatUp
+
+BattleCommand_DefenseUp2: ; 361cc
+; defenseup2
+	ld b, $10 | DEFENSE
+	jr BattleCommand_StatUp
+
+BattleCommand_SpeedUp2: ; 361d0
+; speedup2
+	ld b, $10 | SPEED
+	jr BattleCommand_StatUp
+
+BattleCommand_SpecialAttackUp2: ; 361d4
+; specialattackup2
+	ld b, $10 | SP_ATTACK
+	jr BattleCommand_StatUp
+
+BattleCommand_SpecialDefenseUp2: ; 361d8
+; specialdefenseup2
+	ld b, $10 | SP_DEFENSE
+	jr BattleCommand_StatUp
+
+BattleCommand_AccuracyUp2: ; 361dc
+; accuracyup2
+	ld b, $10 | ACCURACY
+	jr BattleCommand_StatUp
+
+BattleCommand_EvasionUp2: ; 361e0
+; evasionup2
+	ld b, $10 | EVASION
+	jr BattleCommand_StatUp
+
+BattleCommand_StatUp: ; 361e4
+; statup
+	call CheckIfStatCanBeRaised
+	ld a, [FailedMessage]
+	and a
+	ret nz
+	jp StatUpAnimation
+
+; 361ef
+
+
+CheckIfStatCanBeRaised: ; 361ef
+	ld a, b
+	ld [LoweredStat], a
+	ld hl, PlayerStatLevels
+	ld a, [hBattleTurn]
+	and a
+	jr z, .got_stat_levels
+	ld hl, EnemyStatLevels
+.got_stat_levels
+	ld a, [AttackMissed]
+	and a
+	jp nz, .stat_raise_failed
+	ld a, [EffectFailed]
+	and a
+	jp nz, .stat_raise_failed
+	ld a, [LoweredStat]
+	and $f
+	ld c, a
+	ld b, 0
+	add hl, bc
+	ld b, [hl]
+	inc b
+	ld a, $d
+	cp b
+	jp c, .cant_raise_stat
+	ld a, [LoweredStat]
+	and $f0
+	jr z, .got_num_stages
+	inc b
+	ld a, $d
+	cp b
+	jr nc, .got_num_stages
+	ld b, a
+.got_num_stages
+	ld [hl], b
+	push hl
+	ld a, c
+	cp $5
+	jr nc, .done_calcing_stats
+	ld hl, BattleMonStats + 1
+	ld de, PlayerStats
+	ld a, [hBattleTurn]
+	and a
+	jr z, .got_stats_pointer
+	ld hl, EnemyMonStats + 1
+	ld de, EnemyStats
+.got_stats_pointer
+	push bc
+	sla c
+	ld b, 0
+	add hl, bc
+	ld a, c
+	add e
+	ld e, a
+	jr nc, .no_carry
+	inc d
+.no_carry
+	pop bc
+	ld a, [hld]
+	sub LOW(MAX_STAT_VALUE)
+	jr nz, .not_already_max
+	ld a, [hl]
+	sbc HIGH(MAX_STAT_VALUE)
+	jp z, .stats_already_max
+.not_already_max
+	ld a, [hBattleTurn]
+	and a
+	jr z, .calc_player_stats
+	call CalcEnemyStats
+	jr .done_calcing_stats
+
+.calc_player_stats
+	call CalcPlayerStats
+.done_calcing_stats
+	pop hl
+	xor a
+	ld [FailedMessage], a
+	ret
+
+; 3626e
+
+
+.stats_already_max ; 3626e
+	pop hl
+	dec [hl]
+	; fallthrough
+; 36270
+
+
+.cant_raise_stat ; 36270
+	ld a, $2
+	ld [FailedMessage], a
+	ld a, $1
+	ld [AttackMissed], a
+	ret
+
+; 3627b
+
+
+.stat_raise_failed ; 3627b
+	ld a, $1
+	ld [FailedMessage], a
+	ret
+
+; 36281
+
+
+StatUpAnimation: ; 36281
+	ld bc, wPlayerMinimized
+	ld hl, DropPlayerSub
+	ld a, [hBattleTurn]
+	and a
+	jr z, .do_player
+	ld bc, wEnemyMinimized
+	ld hl, DropEnemySub
+.do_player
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call GetBattleVar
+	cp MINIMIZE
+	ret nz
+
+	ld a, $1
+	ld [bc], a
+	call _CheckBattleScene
+	ret nc
+
+	xor a
+	ld [hBGMapMode], a
+	call CallBattleCore
+	call WaitBGMap
+	jp BattleCommand_MoveDelay
+
+; 362ad
+
+
+BattleCommand_AttackDown: ; 362ad
+; attackdown
+	ld a, ATTACK
+	jr BattleCommand_StatDown
+
+BattleCommand_DefenseDown: ; 362b1
+; defensedown
+	ld a, DEFENSE
+	jr BattleCommand_StatDown
+
+BattleCommand_SpeedDown: ; 362b5
+; speeddown
+	ld a, SPEED
+	jr BattleCommand_StatDown
+
+BattleCommand_SpecialAttackDown: ; 362b9
+; specialattackdown
+	ld a, SP_ATTACK
+	jr BattleCommand_StatDown
+
+BattleCommand_SpecialDefenseDown: ; 362bd
+; specialdefensedown
+	ld a, SP_DEFENSE
+	jr BattleCommand_StatDown
+
+BattleCommand_AccuracyDown: ; 362c1
+; accuracydown
+	ld a, ACCURACY
+	jr BattleCommand_StatDown
+
+BattleCommand_EvasionDown: ; 362c5
+; evasiondown
+	ld a, EVASION
+	jr BattleCommand_StatDown
+
+BattleCommand_AttackDown2: ; 362c9
+; attackdown2
+	ld a, $10 | ATTACK
+	jr BattleCommand_StatDown
+
+BattleCommand_DefenseDown2: ; 362cd
+; defensedown2
+	ld a, $10 | DEFENSE
+	jr BattleCommand_StatDown
+
+BattleCommand_SpeedDown2: ; 362d1
+; speeddown2
+	ld a, $10 | SPEED
+	jr BattleCommand_StatDown
+
+BattleCommand_SpecialAttackDown2: ; 362d5
+; specialattackdown2
+	ld a, $10 | SP_ATTACK
+	jr BattleCommand_StatDown
+
+BattleCommand_SpecialDefenseDown2: ; 362d9
+; specialdefensedown2
+	ld a, $10 | SP_DEFENSE
+	jr BattleCommand_StatDown
+
+BattleCommand_AccuracyDown2: ; 362dd
+; accuracydown2
+	ld a, $10 | ACCURACY
+	jr BattleCommand_StatDown
+
+BattleCommand_EvasionDown2: ; 362e1
+; evasiondown2
+	ld a, $10 | EVASION
+
+BattleCommand_StatDown: ; 362e3
+; statdown
+
+	ld [LoweredStat], a
+
+	call CheckMist
+	jp nz, .Mist
+
+	ld hl, EnemyStatLevels
+	ld a, [hBattleTurn]
+	and a
+	jr z, .GetStatLevel
+	ld hl, PlayerStatLevels
+
+.GetStatLevel:
+; Attempt to lower the stat.
+	ld a, [LoweredStat]
+	and $f
+	ld c, a
+	ld b, 0
+	add hl, bc
+	ld b, [hl]
+	dec b
+	jp z, .CantLower
+
+; Sharply lower the stat if applicable.
+	ld a, [LoweredStat]
+	and $f0
+	jr z, .ComputerMiss
+	dec b
+	jr nz, .ComputerMiss
+	inc b
+
+.ComputerMiss:
+; Computer opponents have a 1/4 chance of failing.
+	ld a, [hBattleTurn]
+	and a
+	jr z, .DidntMiss
+
+	ld a, [wLinkMode]
+	and a
+	jr nz, .DidntMiss
+
+	ld a, [InBattleTowerBattle]
+	and a
+	jr nz, .DidntMiss
+
+; Lock-On still always works.
+	ld a, [PlayerSubStatus5]
+	bit SUBSTATUS_LOCK_ON, a
+	jr nz, .DidntMiss
+
+; Attacking moves that also lower accuracy are unaffected.
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call GetBattleVar
+	cp EFFECT_ACCURACY_DOWN_HIT
+	jr z, .DidntMiss
+
+	call BattleRandom
+	cp $40
+	jr c, .Failed
+
+.DidntMiss:
+	call CheckSubstituteOpp
+	jr nz, .Failed
+
+	ld a, [AttackMissed]
+	and a
+	jr nz, .Failed
+
+	ld a, [EffectFailed]
+	and a
+	jr nz, .Failed
+
+	call CheckHiddenOpponent
+	jr nz, .Failed
+
+; Accuracy/Evasion reduction don't involve stats.
+	ld [hl], b
+	ld a, c
+	cp ACCURACY
+	jr nc, .Hit
+
+	push hl
+	ld hl, EnemyMonAttack + 1
+	ld de, EnemyStats
+	ld a, [hBattleTurn]
+	and a
+	jr z, .do_enemy
+	ld hl, BattleMonAttack + 1
+	ld de, PlayerStats
+.do_enemy
+	call TryLowerStat
+	pop hl
+	jr z, .CouldntLower
+
+.Hit:
+	xor a
+	ld [FailedMessage], a
+	ret
+
+.CouldntLower:
+	inc [hl]
+.CantLower:
+	ld a, 3
+	ld [FailedMessage], a
+	ld a, 1
+	ld [AttackMissed], a
+	ret
+
+.Failed:
+	ld a, 1
+	ld [FailedMessage], a
+	ld [AttackMissed], a
+	ret
+
+.Mist:
+	ld a, 2
+	ld [FailedMessage], a
+	ld a, 1
+	ld [AttackMissed], a
+	ret
+
+; 36391
+
+
+CheckMist: ; 36391
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call GetBattleVar
+	cp EFFECT_ATTACK_DOWN
+	jr c, .dont_check_mist
+	cp EFFECT_EVASION_DOWN + 1
+	jr c, .check_mist
+	cp EFFECT_ATTACK_DOWN_2
+	jr c, .dont_check_mist
+	cp EFFECT_EVASION_DOWN_2 + 1
+	jr c, .check_mist
+	cp EFFECT_ATTACK_DOWN_HIT
+	jr c, .dont_check_mist
+	cp EFFECT_EVASION_DOWN_HIT + 1
+	jr c, .check_mist
+.dont_check_mist
+	xor a
+	ret
+
+.check_mist
+	ld a, BATTLE_VARS_SUBSTATUS4_OPP
+	call GetBattleVar
+	bit SUBSTATUS_MIST, a
+	ret
+
+; 363b8
+
+
+BattleCommand_StatUpMessage: ; 363b8
+	ld a, [FailedMessage]
+	and a
+	ret nz
+	ld a, [LoweredStat]
+	and $f
+	ld b, a
+	inc b
+	call GetStatName
+	ld hl, .stat
+	jp BattleTextBox
+
+.stat
+	text_jump UnknownText_0x1c0cc6
+	start_asm
+	ld hl, .up
+	ld a, [LoweredStat]
+	and $f0
+	ret z
+	ld hl, .wayup
+	ret
+
+.wayup
+	text_jump UnknownText_0x1c0cd0
+	db "@"
+
+.up
+	text_jump UnknownText_0x1c0ce0
+	db "@"
+
+; 363e9
+
+
+BattleCommand_StatDownMessage: ; 363e9
+	ld a, [FailedMessage]
+	and a
+	ret nz
+	ld a, [LoweredStat]
+	and $f
+	ld b, a
+	inc b
+	call GetStatName
+	ld hl, .stat
+	jp BattleTextBox
+
+.stat
+	text_jump UnknownText_0x1c0ceb
+	start_asm
+	ld hl, .fell
+	ld a, [LoweredStat]
+	and $f0
+	ret z
+	ld hl, .sharplyfell
+	ret
+
+.sharplyfell
+	text_jump UnknownText_0x1c0cf5
+	db "@"
+.fell
+	text_jump UnknownText_0x1c0d06
+	db "@"
+
+; 3641a
+
+
+TryLowerStat: ; 3641a
+; Lower stat c from stat struct hl (buffer de).
+
+	push bc
+	sla c
+	ld b, 0
+	add hl, bc
+	; add de, c
+	ld a, c
+	add e
+	ld e, a
+	jr nc, .no_carry
+	inc d
+.no_carry
+	pop bc
+
+; The lowest possible stat is 1.
+	ld a, [hld]
+	sub 1
+	jr nz, .not_min
+	ld a, [hl]
+	and a
+	ret z
+
+.not_min
+	ld a, [hBattleTurn]
+	and a
+	jr z, .Player
+
+	call BattleCommand_SwitchTurn
+	call CalcPlayerStats
+	call BattleCommand_SwitchTurn
+	jr .end
+
+.Player:
+	call BattleCommand_SwitchTurn
+	call CalcEnemyStats
+	call BattleCommand_SwitchTurn
+.end
+	ld a, 1
+	and a
+	ret
+
+; 3644c
+
+
+BattleCommand_StatUpFailText: ; 3644c
+; statupfailtext
+	ld a, [FailedMessage]
+	and a
+	ret z
+	push af
+	call BattleCommand_MoveDelay
+	pop af
+	dec a
+	jp z, TryPrintButItFailed
+	ld a, [LoweredStat]
+	and $f
+	ld b, a
+	inc b
+	call GetStatName
+	ld hl, WontRiseAnymoreText
+	jp StdBattleTextBox
+
+; 3646a
+
+
+BattleCommand_StatDownFailText: ; 3646a
+; statdownfailtext
+	ld a, [FailedMessage]
+	and a
+	ret z
+	push af
+	call BattleCommand_MoveDelay
+	pop af
+	dec a
+	jp z, TryPrintButItFailed
+	dec a
+	ld hl, ProtectedByMistText
+	jp z, StdBattleTextBox
+	ld a, [LoweredStat]
+	and $f
+	ld b, a
+	inc b
+	call GetStatName
+	ld hl, WontDropAnymoreText
+	jp StdBattleTextBox
+
+; 3648f
+
+
+GetStatName: ; 3648f
+	ld hl, .names
+	ld c, "@"
+.CheckName:
+	dec b
+	jr z, .Copy
+.GetName:
+	ld a, [hli]
+	cp c
+	jr z, .CheckName
+	jr .GetName
+
+.Copy:
+	ld de, StringBuffer2
+	ld bc, StringBuffer3 - StringBuffer2
+	jp CopyBytes
+
+.names
+	db "ATTACK@"
+	db "DEFENSE@"
+	db "SPEED@"
+	db "SPCL.ATK@"
+	db "SPCL.DEF@"
+	db "ACCURACY@"
+	db "EVASION@"
+	db "ABILITY@"
+; 364e6
+
+
+StatLevelMultipliers: ; 364e6
+	db 25, 100 ; 0.25x
+	db 28, 100 ; 0.28x
+	db 33, 100 ; 0.33x
+	db 40, 100 ; 0.40x
+	db 50, 100 ; 0.50x
+	db 66, 100 ; 0.66x
+	db  1,   1 ; 1.00x
+	db 15,  10 ; 1.50x
+	db  2,   1 ; 2.00x
+	db 25,  10 ; 2.50x
+	db  3,   1 ; 3.00x
+	db 35,  10 ; 3.50x
+	db  4,   1 ; 4.00x
+; 36500
+
+
+BattleCommand_AllStatsUp: ; 36500
+; allstatsup
+
+; Attack
+	call ResetMiss
+	call BattleCommand_AttackUp
+	call BattleCommand_StatUpMessage
+
+; Defense
+	call ResetMiss
+	call BattleCommand_DefenseUp
+	call BattleCommand_StatUpMessage
+
+; Speed
+	call ResetMiss
+	call BattleCommand_SpeedUp
+	call BattleCommand_StatUpMessage
+
+; Special Attack
+	call ResetMiss
+	call BattleCommand_SpecialAttackUp
+	call BattleCommand_StatUpMessage
+
+; Special Defense
+	call ResetMiss
+	call BattleCommand_SpecialDefenseUp
+	jp   BattleCommand_StatUpMessage
+; 3652d
+
+
+ResetMiss: ; 3652d
+	xor a
+	ld [AttackMissed], a
+	ret
+
+; 36532
+
+
+LowerStat: ; 36532
+	ld [LoweredStat], a
+
+	ld hl, PlayerStatLevels
+	ld a, [hBattleTurn]
+	and a
+	jr z, .got_target
+	ld hl, EnemyStatLevels
+
+.got_target
+	ld a, [LoweredStat]
+	and $f
+	ld c, a
+	ld b, 0
+	add hl, bc
+	ld b, [hl]
+	dec b
+	jr z, .cant_lower_anymore
+
+	ld a, [LoweredStat]
+	and $f0
+	jr z, .got_num_stages
+	dec b
+	jr nz, .got_num_stages
+	inc b
+
+.got_num_stages
+	ld [hl], b
+	ld a, c
+	cp 5
+	jr nc, .accuracy_evasion
+
+	push hl
+	ld hl, BattleMonStats + 1
+	ld de, PlayerStats
+	ld a, [hBattleTurn]
+	and a
+	jr z, .got_target_2
+	ld hl, EnemyMonStats + 1
+	ld de, EnemyStats
+
+.got_target_2
+	call TryLowerStat
+	pop hl
+	jr z, .failed
+
+.accuracy_evasion
+	ld a, [hBattleTurn]
+	and a
+	jr z, .player
+
+	call CalcEnemyStats
+
+	jr .finish
+
+.player
+	call CalcPlayerStats
+
+.finish
+	xor a
+	ld [FailedMessage], a
+	ret
+
+.failed
+	inc [hl]
+
+.cant_lower_anymore
+	ld a, 2
+	ld [FailedMessage], a
+	ret
+
+; 3658f
+
+
+BattleCommand_TriStatusChance: ; 3658f
+; tristatuschance
+
+	call BattleCommand_EffectChance
+
+; 1/3 chance of each status
+.loop
+	call BattleRandom
+	swap a
+	and 3
+	jr z, .loop
+; jump
+	dec a
+	ld hl, .ptrs
+	rst JumpTable
+	ret
+
+.ptrs
+	dw BattleCommand_ParalyzeTarget ; paralyze
+	dw BattleCommand_FreezeTarget ; freeze
+	dw BattleCommand_BurnTarget ; burn
+; 365a7
+
+
+BattleCommand_Curl: ; 365a7
+; curl
+	ld a, BATTLE_VARS_SUBSTATUS2
+	call GetBattleVarAddr
+	set SUBSTATUS_CURLED, [hl]
+	ret
+
+; 365af
+
+
+BattleCommand_RaiseSubNoAnim: ; 365af
+	ld hl, GetBattleMonBackpic
+	ld a, [hBattleTurn]
+	and a
+	jr z, .PlayerTurn
+	ld hl, GetEnemyMonFrontpic
+.PlayerTurn:
+	xor a
+	ld [hBGMapMode], a
+	call CallBattleCore
+	jp WaitBGMap
+
+; 365c3
+
+
+BattleCommand_LowerSubNoAnim: ; 365c3
+	ld hl, DropPlayerSub
+	ld a, [hBattleTurn]
+	and a
+	jr z, .PlayerTurn
+	ld hl, DropEnemySub
+.PlayerTurn:
+	xor a
+	ld [hBGMapMode], a
+	call CallBattleCore
+	jp WaitBGMap
+
+; 365d7
+
+
+CalcPlayerStats: ; 365d7
+	ld hl, PlayerAtkLevel
+	ld de, PlayerStats
+	ld bc, BattleMonAttack
+
+	ld a, 5
+	call CalcStats
+
+	ld hl, BadgeStatBoosts
+	call CallBattleCore
+
+	call BattleCommand_SwitchTurn
+
+	ld hl, ApplyPrzEffectOnSpeed
+	call CallBattleCore
+
+	ld hl, ApplyBrnEffectOnAttack
+	call CallBattleCore
+
+	jp BattleCommand_SwitchTurn
+
+; 365fd
+
+
+CalcEnemyStats: ; 365fd
+	ld hl, EnemyAtkLevel
+	ld de, EnemyStats
+	ld bc, EnemyMonAttack
+
+	ld a, 5
+	call CalcStats
+
+	call BattleCommand_SwitchTurn
+
+	ld hl, ApplyPrzEffectOnSpeed
+	call CallBattleCore
+
+	ld hl, ApplyBrnEffectOnAttack
+	call CallBattleCore
+
+	jp BattleCommand_SwitchTurn
+
+; 3661d
+
+
+CalcStats: ; 3661d
+.loop
+	push af
+	ld a, [hli]
+	push hl
+	push bc
+
+	ld c, a
+	dec c
+	ld b, 0
+	ld hl, StatLevelMultipliers
+	add hl, bc
+	add hl, bc
+
+	xor a
+	ld [hMultiplicand + 0], a
+	ld a, [de]
+	ld [hMultiplicand + 1], a
+	inc de
+	ld a, [de]
+	ld [hMultiplicand + 2], a
+	inc de
+
+	ld a, [hli]
+	ld [hMultiplier], a
+	call Multiply
+
+	ld a, [hl]
+	ld [hDivisor], a
+	ld b, 4
+	call Divide
+
+	ld a, [hQuotient + 1]
+	ld b, a
+	ld a, [hQuotient + 2]
+	or b
+	jr nz, .check_maxed_out
+
+	ld a, 1
+	ld [hQuotient + 2], a
+	jr .not_maxed_out
+
+.check_maxed_out
+	ld a, [hQuotient + 2]
+	cp LOW(MAX_STAT_VALUE)
+	ld a, b
+	sbc HIGH(MAX_STAT_VALUE)
+	jr c, .not_maxed_out
+
+	ld a, LOW(MAX_STAT_VALUE)
+	ld [hQuotient + 2], a
+	ld a, HIGH(MAX_STAT_VALUE)
+	ld [hQuotient + 1], a
+
+.not_maxed_out
+	pop bc
+	ld a, [hQuotient + 1]
+	ld [bc], a
+	inc bc
+	ld a, [hQuotient + 2]
+	ld [bc], a
+	inc bc
+	pop hl
+	pop af
+	dec a
+	jr nz, .loop
+
+	ret
+
+; 36671
+
+
+BattleCommand_StoreEnergy: ; 36671
+; storeenergy
+
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVar
+	bit SUBSTATUS_BIDE, a
+	ret z
+
+	ld hl, PlayerRolloutCount
+	ld a, [hBattleTurn]
+	and a
+	jr z, .check_still_storing_energy
+	ld hl, EnemyRolloutCount
+.check_still_storing_energy
+	dec [hl]
+	jr nz, .still_storing
+
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVarAddr
+	res SUBSTATUS_BIDE, [hl]
+
+	ld hl, UnleashedEnergyText
+	call StdBattleTextBox
+
+	ld a, BATTLE_VARS_MOVE_POWER
+	call GetBattleVarAddr
+	ld a, 1
+	ld [hl], a
+	ld hl, PlayerDamageTaken + 1
+	ld de, wPlayerCharging ; player
+	ld a, [hBattleTurn]
+	and a
+	jr z, .player
+	ld hl, EnemyDamageTaken + 1
+	ld de, wEnemyCharging ; enemy
+.player
+	ld a, [hld]
+	add a
+	ld b, a
+	ld [CurDamage + 1], a
+	ld a, [hl]
+	rl a
+	ld [CurDamage], a
+	jr nc, .not_maxed
+	ld a, $ff
+	ld [CurDamage], a
+	ld [CurDamage + 1], a
+.not_maxed
+	or b
+	jr nz, .built_up_something
+	ld a, 1
+	ld [AttackMissed], a
+.built_up_something
+	xor a
+	ld [hli], a
+	ld [hl], a
+	ld [de], a
+
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call GetBattleVarAddr
+	ld a, BIDE
+	ld [hl], a
+
+	ld b, unleashenergy_command
+	jp SkipToBattleCommand
+
+.still_storing
+	ld hl, StoringEnergyText
+	call StdBattleTextBox
+	jp EndMoveEffect
+
+; 366e5
+
+
+BattleCommand_UnleashEnergy: ; 366e5
+; unleashenergy
+
+	ld de, PlayerDamageTaken
+	ld bc, PlayerRolloutCount
+	ld a, [hBattleTurn]
+	and a
+	jr z, .got_damage
+	ld de, EnemyDamageTaken
+	ld bc, EnemyRolloutCount
+.got_damage
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVarAddr
+	set SUBSTATUS_BIDE, [hl]
+	xor a
+	ld [de], a
+	inc de
+	ld [de], a
+	ld [wPlayerMoveStructEffect], a
+	ld [wEnemyMoveStructEffect], a
+	call BattleRandom
+	and 1
+	inc a
+	inc a
+	ld [bc], a
+	ld a, 1
+	ld [wKickCounter], a
+	call AnimateCurrentMove
+	jp EndMoveEffect
+
+; 3671a
+
+
+BattleCommand_CheckRampage: ; 3671a
+; checkrampage
+
+	ld de, PlayerRolloutCount
+	ld a, [hBattleTurn]
+	and a
+	jr z, .player
+	ld de, EnemyRolloutCount
+.player
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVarAddr
+	bit SUBSTATUS_RAMPAGE, [hl]
+	ret z
+	ld a, [de]
+	dec a
+	ld [de], a
+	jr nz, .continue_rampage
+
+	res SUBSTATUS_RAMPAGE, [hl]
+	call BattleCommand_SwitchTurn
+	call SafeCheckSafeguard
+	push af
+	call BattleCommand_SwitchTurn
+	pop af
+	jr nz, .continue_rampage
+
+	set SUBSTATUS_CONFUSED, [hl]
+	call BattleRandom
+	and %00000001
+	inc a
+	inc a
+	inc de ; ConfuseCount
+	ld [de], a
+.continue_rampage
+	ld b, rampage_command
+	jp SkipToBattleCommand
+
+; 36751
+
+
+BattleCommand_Rampage: ; 36751
+; rampage
+
+; No rampage during Sleep Talk.
+	ld a, BATTLE_VARS_STATUS
+	call GetBattleVar
+	and SLP
+	ret nz
+
+	ld de, PlayerRolloutCount
+	ld a, [hBattleTurn]
+	and a
+	jr z, .ok
+	ld de, EnemyRolloutCount
+.ok
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVarAddr
+	set SUBSTATUS_RAMPAGE, [hl]
+; Rampage for 1 or 2 more turns
+	call BattleRandom
+	and %00000001
+	inc a
+	ld [de], a
+	ld a, 1
+	ld [wSomeoneIsRampaging], a
+	ret
+
+; 36778
+
+
+BattleCommand_Teleport: ; 36778
+; teleport
+
+	ld a, [BattleType]
+	cp BATTLETYPE_SHINY
+	jr z, .failed
+	cp BATTLETYPE_TRAP
+	jr z, .failed
+	cp BATTLETYPE_CELEBI
+	jr z, .failed
+	cp BATTLETYPE_SUICUNE
+	jr z, .failed
+
+	ld a, BATTLE_VARS_SUBSTATUS5_OPP
+	call GetBattleVar
+	bit SUBSTATUS_CANT_RUN, a
+	jr nz, .failed
+; Only need to check these next things if it's your turn
+	ld a, [hBattleTurn]
+	and a
+	jr nz, .enemy_turn
+; Can't teleport from a trainer battle
+	ld a, [wBattleMode]
+	dec a
+	jr nz, .failed
+; If your level is greater than the opponent's, you run without fail.
+	ld a, [CurPartyLevel]
+	ld b, a
+	ld a, [BattleMonLevel]
+	cp b
+	jr nc, .run_away
+; Generate a number between 0 and (YourLevel + TheirLevel).
+	add b
+	ld c, a
+	inc c
+.loop_player
+	call BattleRandom
+	cp c
+	jr nc, .loop_player
+; If that number is greater than 4 times your level, run away.
+	srl b
+	srl b
+	cp b
+	jr nc, .run_away
+
+.failed
+	call AnimateFailedMove
+	jp PrintButItFailed
+
+.enemy_turn
+	ld a, [wBattleMode]
+	dec a
+	jr nz, .failed
+	ld a, [BattleMonLevel]
+	ld b, a
+	ld a, [CurPartyLevel]
+	cp b
+	jr nc, .run_away
+	add b
+	ld c, a
+	inc c
+.loop_enemy
+	call BattleRandom
+	cp c
+	jr nc, .loop_enemy
+	srl b
+	srl b
+	cp b
+	; This does the wrong thing. What was
+	; probably intended was jr c, .failed
+	; The way this is made makes enemy use
+	; of Teleport always succeed if able
+	jr nc, .run_away
+.run_away
+	call UpdateBattleMonInParty
+	xor a
+	ld [wNumHits], a
+	inc a
+	ld [wForcedSwitch], a
+	ld [wKickCounter], a
+	call SetBattleDraw
+	call BattleCommand_LowerSub
+	call LoadMoveAnim
+	ld c, 20
+	call DelayFrames
+	call SetBattleDraw
+
+	ld hl, FledFromBattleText
+	jp StdBattleTextBox
+
+; 36804
+
+
+SetBattleDraw: ; 36804
+	ld a, [wBattleResult]
+	and $c0
+	or $2
+	ld [wBattleResult], a
+	ret
+
+; 3680f
+
+
+BattleCommand_ForceSwitch: ; 3680f
+; forceswitch
+
+	ld a, [BattleType]
+	cp BATTLETYPE_SHINY
+	jp z, .fail
+	cp BATTLETYPE_TRAP
+	jp z, .fail
+	cp BATTLETYPE_CELEBI
+	jp z, .fail
+	cp BATTLETYPE_SUICUNE
+	jp z, .fail
+	ld a, [hBattleTurn]
+	and a
+	jp nz, .force_player_switch
+	ld a, [AttackMissed]
+	and a
+	jr nz, .missed
+	ld a, [wBattleMode]
+	dec a
+	jr nz, .trainer
+	ld a, [CurPartyLevel]
+	ld b, a
+	ld a, [BattleMonLevel]
+	cp b
+	jr nc, .wild_force_flee
+	add b
+	ld c, a
+	inc c
+.random_loop_wild
+	call BattleRandom
+	cp c
+	jr nc, .random_loop_wild
+	srl b
+	srl b
+	cp b
+	jr nc, .wild_force_flee
+.missed
+	jp .fail
+
+.wild_force_flee
+	call UpdateBattleMonInParty
+	xor a
+	ld [wNumHits], a
+	inc a
+	ld [wForcedSwitch], a
+	call SetBattleDraw
+	ld a, [wPlayerMoveStructAnimation]
+	jp .succeed
+
+.trainer
+	call FindAliveEnemyMons
+	jr c, .switch_fail
+	ld a, [wEnemyGoesFirst]
+	and a
+	jr z, .switch_fail
+	call UpdateEnemyMonInParty
+	ld a, $1
+	ld [wKickCounter], a
+	call AnimateCurrentMove
+	ld c, $14
+	call DelayFrames
+	hlcoord 1, 0
+	lb bc, 4, 10
+	call ClearBox
+	ld c, 20
+	call DelayFrames
+	ld a, [OTPartyCount]
+	ld b, a
+	ld a, [CurOTMon]
+	ld c, a
+; select a random enemy mon to switch to
+.random_loop_trainer
+	call BattleRandom
+	and $7
+	cp b
+	jr nc, .random_loop_trainer
+	cp c
+	jr z, .random_loop_trainer
+	push af
+	push bc
+	ld hl, OTPartyMon1HP
+	call GetPartyLocation
+	ld a, [hli]
+	or [hl]
+	pop bc
+	pop de
+	jr z, .random_loop_trainer
+	ld a, d
+	inc a
+	ld [wEnemySwitchMonIndex], a
+	callfar ForceEnemySwitch
+
+	ld hl, DraggedOutText
+	call StdBattleTextBox
+
+	ld hl, SpikesDamage
+	jp CallBattleCore
+
+.switch_fail
+	jp .fail
+
+.force_player_switch
+	ld a, [AttackMissed]
+	and a
+	jr nz, .player_miss
+
+	ld a, [wBattleMode]
+	dec a
+	jr nz, .vs_trainer
+
+	ld a, [BattleMonLevel]
+	ld b, a
+	ld a, [CurPartyLevel]
+	cp b
+	jr nc, .wild_succeed_playeristarget
+
+	add b
+	ld c, a
+	inc c
+.wild_random_loop_playeristarget
+	call BattleRandom
+	cp c
+	jr nc, .wild_random_loop_playeristarget
+
+	srl b
+	srl b
+	cp b
+	jr nc, .wild_succeed_playeristarget
+
+.player_miss
+	jr .fail
+
+.wild_succeed_playeristarget
+	call UpdateBattleMonInParty
+	xor a
+	ld [wNumHits], a
+	inc a
+	ld [wForcedSwitch], a
+	call SetBattleDraw
+	ld a, [wEnemyMoveStructAnimation]
+	jr .succeed
+
+.vs_trainer
+	call CheckPlayerHasMonToSwitchTo
+	jr c, .fail
+
+	ld a, [wEnemyGoesFirst]
+	cp $1
+	jr z, .switch_fail
+
+	call UpdateBattleMonInParty
+	ld a, $1
+	ld [wKickCounter], a
+	call AnimateCurrentMove
+	ld c, 20
+	call DelayFrames
+	hlcoord 9, 7
+	lb bc, 5, 11
+	call ClearBox
+	ld c, 20
+	call DelayFrames
+	ld a, [PartyCount]
+	ld b, a
+	ld a, [CurBattleMon]
+	ld c, a
+.random_loop_trainer_playeristarget
+	call BattleRandom
+	and $7
+	cp b
+	jr nc, .random_loop_trainer_playeristarget
+
+	cp c
+	jr z, .random_loop_trainer_playeristarget
+
+	push af
+	push bc
+	ld hl, PartyMon1HP
+	call GetPartyLocation
+	ld a, [hli]
+	or [hl]
+	pop bc
+	pop de
+	jr z, .random_loop_trainer_playeristarget
+
+	ld a, d
+	ld [CurPartyMon], a
+	ld hl, SwitchPlayerMon
+	call CallBattleCore
+
+	ld hl, DraggedOutText
+	call StdBattleTextBox
+
+	ld hl, SpikesDamage
+	jp CallBattleCore
+
+.fail
+	call BattleCommand_LowerSub
+	call BattleCommand_MoveDelay
+	call BattleCommand_RaiseSub
+	jp PrintButItFailed
+
+.succeed
+	push af
+	call SetBattleDraw
+	ld a, $1
+	ld [wKickCounter], a
+	call AnimateCurrentMove
+	ld c, 20
+	call DelayFrames
+	pop af
+
+	ld hl, FledInFearText
+	cp ROAR
+	jr z, .do_text
+	ld hl, BlownAwayText
+.do_text
+	jp StdBattleTextBox
+
+; 36994
+
+
+CheckPlayerHasMonToSwitchTo: ; 36994
+	ld a, [PartyCount]
+	ld d, a
+	ld e, 0
+	ld bc, PARTYMON_STRUCT_LENGTH
+.loop
+	ld a, [CurBattleMon]
+	cp e
+	jr z, .next
+
+	ld a, e
+	ld hl, PartyMon1HP
+	call AddNTimes
+	ld a, [hli]
+	or [hl]
+	jr nz, .not_fainted
+
+.next
+	inc e
+	dec d
+	jr nz, .loop
+
+	scf
+	ret
+
+.not_fainted
+	and a
+	ret
+
+; 369b6
+
+
+BattleCommand_EndLoop: ; 369b6
+; endloop
+
+; Loop back to the command before 'critical'.
+
+	ld de, PlayerRolloutCount
+	ld bc, PlayerDamageTaken
+	ld a, [hBattleTurn]
+	and a
+	jr z, .got_addrs
+	ld de, EnemyRolloutCount
+	ld bc, EnemyDamageTaken
+.got_addrs
+
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVarAddr
+	bit SUBSTATUS_IN_LOOP, [hl]
+	jp nz, .in_loop
+	set SUBSTATUS_IN_LOOP, [hl]
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call GetBattleVarAddr
+	ld a, [hl]
+	cp EFFECT_POISON_MULTI_HIT
+	jr z, .twineedle
+	cp EFFECT_DOUBLE_HIT
+	ld a, 1
+	jr z, .double_hit
+	ld a, [hl]
+	cp EFFECT_BEAT_UP
+	jr z, .beat_up
+	cp EFFECT_TRIPLE_KICK
+	jr nz, .not_triple_kick
+.reject_triple_kick_sample
+	call BattleRandom
+	and $3
+	jr z, .reject_triple_kick_sample
+	dec a
+	jr nz, .double_hit
+	ld a, 1
+	ld [bc], a
+	jr .done_loop
+
+.beat_up
+	ld a, [hBattleTurn]
+	and a
+	jr nz, .check_ot_beat_up
+	ld a, [PartyCount]
+	cp 1
+	jp z, .only_one_beatup
+	dec a
+	jr .double_hit
+
+.check_ot_beat_up
+	ld a, [wBattleMode]
+	cp WILD_BATTLE
+	jp z, .only_one_beatup
+	ld a, [OTPartyCount]
+	cp 1
+	jp z, .only_one_beatup
+	dec a
+	jr .double_hit
+
+.only_one_beatup
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVarAddr
+	res SUBSTATUS_IN_LOOP, [hl]
+	call BattleCommanda8
+	jp EndMoveEffect
+
+.not_triple_kick
+	call BattleRandom
+	and $3
+	cp 2
+	jr c, .got_number_hits
+	call BattleRandom
+	and $3
+.got_number_hits
+	inc a
+.double_hit
+	ld [de], a
+	inc a
+	ld [bc], a
+	jr .loop_back_to_critical
+
+.twineedle
+	ld a, 1
+	jr .double_hit
+
+.in_loop
+	ld a, [de]
+	dec a
+	ld [de], a
+	jr nz, .loop_back_to_critical
+.done_loop
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVarAddr
+	res SUBSTATUS_IN_LOOP, [hl]
+
+	ld hl, PlayerHitTimesText
+	ld a, [hBattleTurn]
+	and a
+	jr z, .got_hit_n_times_text
+	ld hl, EnemyHitTimesText
+.got_hit_n_times_text
+
+	push bc
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call GetBattleVar
+	cp EFFECT_BEAT_UP
+	jr z, .beat_up_2
+	call StdBattleTextBox
+.beat_up_2
+
+	pop bc
+	xor a
+	ld [bc], a
+	ret
+
+; Loop back to the command before 'critical'.
+.loop_back_to_critical
+	ld a, [BattleScriptBufferAddress + 1]
+	ld h, a
+	ld a, [BattleScriptBufferAddress]
+	ld l, a
+.not_critical
+	ld a, [hld]
+	cp critical_command
+	jr nz, .not_critical
+	inc hl
+	ld a, h
+	ld [BattleScriptBufferAddress + 1], a
+	ld a, l
+	ld [BattleScriptBufferAddress], a
+	ret
+
+; 36a82
+
+
+BattleCommand_FakeOut: ; 36a82
+	ld a, [AttackMissed]
+	and a
+	ret nz
+
+	call CheckSubstituteOpp
+	jr nz, .fail
+
+	ld a, BATTLE_VARS_STATUS_OPP
+	call GetBattleVar
+	and 1 << FRZ | SLP
+	jr nz, .fail
+
+	call CheckOpponentWentFirst
+	jr z, FlinchTarget
+
+.fail
+	ld a, 1
+	ld [AttackMissed], a
+	ret
+
+; 36aa0
+
+
+BattleCommand_FlinchTarget: ; 36aa0
+	call CheckSubstituteOpp
+	ret nz
+
+	ld a, BATTLE_VARS_STATUS_OPP
+	call GetBattleVar
+	and 1 << FRZ | SLP
+	ret nz
+
+	call CheckOpponentWentFirst
+	ret nz
+
+	ld a, [EffectFailed]
+	and a
+	ret nz
+
+	; fallthrough
+; 36ab5
+
+
+FlinchTarget: ; 36ab5
+	ld a, BATTLE_VARS_SUBSTATUS3_OPP
+	call GetBattleVarAddr
+	set SUBSTATUS_FLINCHED, [hl]
+	jp EndRechargeOpp
+
+; 36abf
+
+
+CheckOpponentWentFirst: ; 36abf
+; Returns a=0, z if user went first
+; Returns a=1, nz if opponent went first
+	push bc
+	ld a, [wEnemyGoesFirst] ; 0 if player went first
+	ld b, a
+	ld a, [hBattleTurn] ; 0 if it's the player's turn
+	xor b ; 1 if opponent went first
+	pop bc
+	ret
+
+; 36ac9
+
+
+BattleCommand_HeldFlinch: ; 36ac9
+; kingsrock
+
+	ld a, [AttackMissed]
+	and a
+	ret nz
+
+	call GetUserItem
+	ld a, b
+	cp HELD_FLINCH
+	ret nz
+
+	call CheckSubstituteOpp
+	ret nz
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call GetBattleVarAddr
+	ld d, h
+	ld e, l
+	call GetUserItem
+	call BattleRandom
+	cp c
+	ret nc
+	call EndRechargeOpp
+	ld a, BATTLE_VARS_SUBSTATUS3_OPP
+	call GetBattleVarAddr
+	set SUBSTATUS_FLINCHED, [hl]
+	ret
+
+; 36af3
+
+
+BattleCommand_OHKO: ; 36af3
+; ohko
+
+	call ResetDamage
+	ld a, [TypeModifier]
+	and $7f
+	jr z, .no_effect
+	ld hl, EnemyMonLevel
+	ld de, BattleMonLevel
+	ld bc, wPlayerMoveStruct + MOVE_ACC
+	ld a, [hBattleTurn]
+	and a
+	jr z, .got_move_accuracy
+	push hl
+	ld h, d
+	ld l, e
+	pop de
+	ld bc, wEnemyMoveStruct + MOVE_ACC
+.got_move_accuracy
+	ld a, [de]
+	sub [hl]
+	jr c, .no_effect
+	add a
+	ld e, a
+	ld a, [bc]
+	add e
+	jr nc, .finish_ohko
+	ld a, $ff
+.finish_ohko
+	ld [bc], a
+	call BattleCommand_CheckHit
+	ld hl, CurDamage
+	ld a, $ff
+	ld [hli], a
+	ld [hl], a
+	ld a, $2
+	ld [CriticalHit], a
+	ret
+
+.no_effect
+	ld a, $ff
+	ld [CriticalHit], a
+	ld a, $1
+	ld [AttackMissed], a
+	ret
+
+; 36b3a
+
+
+BattleCommand_CheckCharge: ; 36b3a
+; checkcharge
+
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVarAddr
+	bit SUBSTATUS_CHARGED, [hl]
+	ret z
+	res SUBSTATUS_CHARGED, [hl]
+	res SUBSTATUS_UNDERGROUND, [hl]
+	res SUBSTATUS_FLYING, [hl]
+	ld b, charge_command
+	jp SkipToBattleCommand
+
+; 36b4d
+
+
+BattleCommand_Charge: ; 36b4d
+; charge
+
+	call BattleCommand_ClearText
+	ld a, BATTLE_VARS_STATUS
+	call GetBattleVar
+	and SLP
+	jr z, .awake
+
+	call BattleCommand_MoveDelay
+	call BattleCommand_RaiseSub
+	call PrintButItFailed
+	jp EndMoveEffect
+
+.awake
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVarAddr
+	set SUBSTATUS_CHARGED, [hl]
+
+	ld hl, IgnoredOrders2Text
+	ld a, [AlreadyDisobeyed]
+	and a
+	call nz, StdBattleTextBox
+
+	call BattleCommand_LowerSub
+	xor a
+	ld [wNumHits], a
+	inc a
+	ld [wKickCounter], a
+	call LoadMoveAnim
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call GetBattleVar
+	cp FLY
+	jr z, .flying
+	cp DIG
+	jr z, .flying
+	call BattleCommand_RaiseSub
+	jr .not_flying
+
+.flying
+	call DisappearUser
+.not_flying
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVarAddr
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call GetBattleVar
+	ld b, a
+	cp FLY
+	jr z, .set_flying
+	cp DIG
+	jr nz, .dont_set_digging
+	set SUBSTATUS_UNDERGROUND, [hl]
+	jr .dont_set_digging
+
+.set_flying
+	set SUBSTATUS_FLYING, [hl]
+
+.dont_set_digging
+	call CheckUserIsCharging
+	jr nz, .mimic
+	ld a, BATTLE_VARS_LAST_COUNTER_MOVE
+	call GetBattleVarAddr
+	ld [hl], b
+	ld a, BATTLE_VARS_LAST_MOVE
+	call GetBattleVarAddr
+	ld [hl], b
+
+.mimic
+	call ResetDamage
+
+	ld hl, .UsedText
+	call BattleTextBox
+
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call GetBattleVar
+	cp EFFECT_SKULL_BASH
+	ld b, endturn_command
+	jp z, SkipToBattleCommand
+	jp EndMoveEffect
+
+.UsedText:
+	text_jump UnknownText_0x1c0d0e ; "[USER]"
+	start_asm
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call GetBattleVar
+	cp RAZOR_WIND
+	ld hl, .RazorWind
+	jr z, .done
+
+	cp SOLARBEAM
+	ld hl, .Solarbeam
+	jr z, .done
+
+	cp SKULL_BASH
+	ld hl, .SkullBash
+	jr z, .done
+
+	cp SKY_ATTACK
+	ld hl, .SkyAttack
+	jr z, .done
+
+	cp FLY
+	ld hl, .Fly
+	jr z, .done
+
+	cp DIG
+	ld hl, .Dig
+
+.done
+	ret
+
+.RazorWind:
+; 'made a whirlwind!'
+	text_jump UnknownText_0x1c0d12
+	db "@"
+
+.Solarbeam:
+; 'took in sunlight!'
+	text_jump UnknownText_0x1c0d26
+	db "@"
+
+.SkullBash:
+; 'lowered its head!'
+	text_jump UnknownText_0x1c0d3a
+	db "@"
+
+.SkyAttack:
+; 'is glowing!'
+	text_jump UnknownText_0x1c0d4e
+	db "@"
+
+.Fly:
+; 'flew up high!'
+	text_jump UnknownText_0x1c0d5c
+	db "@"
+
+.Dig:
+; 'dug a hole!'
+	text_jump UnknownText_0x1c0d6c
+	db "@"
+; 36c2c
+
+
+BattleCommand3c: ; 36c2c
+; unused
+	ret
+
+; 36c2d
+
+
+BattleCommand_TrapTarget: ; 36c2d
+; traptarget
+
+	ld a, [AttackMissed]
+	and a
+	ret nz
+	ld hl, wEnemyWrapCount
+	ld de, wEnemyTrappingMove
+	ld a, [hBattleTurn]
+	and a
+	jr z, .got_trap
+	ld hl, wPlayerWrapCount
+	ld de, wPlayerTrappingMove
+
+.got_trap
+	ld a, [hl]
+	and a
+	ret nz
+	ld a, BATTLE_VARS_SUBSTATUS4_OPP
+	call GetBattleVar
+	bit SUBSTATUS_SUBSTITUTE, a
+	ret nz
+	call BattleRandom
+	and 3
+	inc a
+	inc a
+	inc a
+	ld [hl], a
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call GetBattleVar
+	ld [de], a
+	ld b, a
+	ld hl, .Traps
+
+.find_trap_text
+	ld a, [hli]
+	cp b
+	jr z, .found_trap_text
+	inc hl
+	inc hl
+	jr .find_trap_text
+
+.found_trap_text
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	jp StdBattleTextBox
+
+.Traps:
+	dbw BIND,      UsedBindText      ; 'used BIND on'
+	dbw WRAP,      WrappedByText     ; 'was WRAPPED by'
+	dbw FIRE_SPIN, FireSpinTrapText  ; 'was trapped!'
+	dbw CLAMP,     ClampedByText     ; 'was CLAMPED by'
+	dbw WHIRLPOOL, WhirlpoolTrapText ; 'was trapped!'
+; 36c7e
+
+
+BattleCommand_Mist: ; 36c7e
+; mist
+
+	ld a, BATTLE_VARS_SUBSTATUS4
+	call GetBattleVarAddr
+	bit SUBSTATUS_MIST, [hl]
+	jr nz, .already_mist
+	set SUBSTATUS_MIST, [hl]
+	call AnimateCurrentMove
+	ld hl, MistText
+	jp StdBattleTextBox
+
+.already_mist
+	call AnimateFailedMove
+	jp PrintButItFailed
+
+; 36c98
+
+
+BattleCommand_FocusEnergy: ; 36c98
+; focusenergy
+
+	ld a, BATTLE_VARS_SUBSTATUS4
+	call GetBattleVarAddr
+	bit SUBSTATUS_FOCUS_ENERGY, [hl]
+	jr nz, .already_pumped
+	set SUBSTATUS_FOCUS_ENERGY, [hl]
+	call AnimateCurrentMove
+	ld hl, GettingPumpedText
+	jp StdBattleTextBox
+
+.already_pumped
+	call AnimateFailedMove
+	jp PrintButItFailed
+
+; 36cb2
+
+
+BattleCommand_Recoil: ; 36cb2
+; recoil
+
+	ld hl, BattleMonMaxHP
+	ld a, [hBattleTurn]
+	and a
+	jr z, .got_hp
+	ld hl, EnemyMonMaxHP
+.got_hp
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call GetBattleVar
+	ld d, a
+; get 1/4 damage or 1 HP, whichever is higher
+	ld a, [CurDamage]
+	ld b, a
+	ld a, [CurDamage + 1]
+	ld c, a
+	srl b
+	rr c
+	srl b
+	rr c
+	ld a, b
+	or c
+	jr nz, .min_damage
+	inc c
+.min_damage
+	ld a, [hli]
+	ld [Buffer2], a
+	ld a, [hl]
+	ld [Buffer1], a
+	dec hl
+	dec hl
+	ld a, [hl]
+	ld [Buffer3], a
+	sub c
+	ld [hld], a
+	ld [Buffer5], a
+	ld a, [hl]
+	ld [Buffer4], a
+	sbc b
+	ld [hl], a
+	ld [Buffer6], a
+	jr nc, .dont_ko
+	xor a
+	ld [hli], a
+	ld [hl], a
+	ld hl, Buffer5
+	ld [hli], a
+	ld [hl], a
+.dont_ko
+	hlcoord 10, 9
+	ld a, [hBattleTurn]
+	and a
+	ld a, 1
+	jr z, .animate_hp_bar
+	hlcoord 2, 2
+	xor a
+.animate_hp_bar
+	ld [wWhichHPBar], a
+	predef AnimateHPBar
+	call RefreshBattleHuds
+	ld hl, RecoilText
+	jp StdBattleTextBox
+
+; 36d1d
+
+
+BattleCommand_ConfuseTarget: ; 36d1d
+; confusetarget
+
+	call GetOpponentItem
+	ld a, b
+	cp HELD_PREVENT_CONFUSE
+	ret z
+	ld a, [EffectFailed]
+	and a
+	ret nz
+	call SafeCheckSafeguard
+	ret nz
+	call CheckSubstituteOpp
+	ret nz
+	ld a, BATTLE_VARS_SUBSTATUS3_OPP
+	call GetBattleVarAddr
+	bit SUBSTATUS_CONFUSED, [hl]
+	ret nz
+	jr BattleCommand_FinishConfusingTarget
+
+
+BattleCommand_Confuse: ; 36d3b
+; confuse
+
+	call GetOpponentItem
+	ld a, b
+	cp HELD_PREVENT_CONFUSE
+	jr nz, .no_item_protection
+	ld a, [hl]
+	ld [wNamedObjectIndexBuffer], a
+	call GetItemName
+	call AnimateFailedMove
+	ld hl, ProtectedByText
+	jp StdBattleTextBox
+
+.no_item_protection
+	ld a, BATTLE_VARS_SUBSTATUS3_OPP
+	call GetBattleVarAddr
+	bit SUBSTATUS_CONFUSED, [hl]
+	jr z, .not_already_confused
+	call AnimateFailedMove
+	ld hl, AlreadyConfusedText
+	jp StdBattleTextBox
+
+.not_already_confused
+	call CheckSubstituteOpp
+	jr nz, BattleCommand_Confuse_CheckSnore_Swagger_ConfuseHit
+	ld a, [AttackMissed]
+	and a
+	jr nz, BattleCommand_Confuse_CheckSnore_Swagger_ConfuseHit
+BattleCommand_FinishConfusingTarget: ; 36d70
+	ld bc, EnemyConfuseCount
+	ld a, [hBattleTurn]
+	and a
+	jr z, .got_confuse_count
+	ld bc, PlayerConfuseCount
+
+.got_confuse_count
+	set SUBSTATUS_CONFUSED, [hl]
+	call BattleRandom
+	and 3
+	inc a
+	inc a
+	ld [bc], a
+
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call GetBattleVar
+	cp EFFECT_CONFUSE_HIT
+	jr z, .got_effect
+	cp EFFECT_SNORE
+	jr z, .got_effect
+	cp EFFECT_SWAGGER
+	jr z, .got_effect
+	call AnimateCurrentMove
+
+.got_effect
+	ld de, ANIM_CONFUSED
+	call PlayOpponentBattleAnim
+
+	ld hl, BecameConfusedText
+	call StdBattleTextBox
+
+	call GetOpponentItem
+	ld a, b
+	cp HELD_HEAL_STATUS
+	jr z, .heal_confusion
+	cp HELD_HEAL_CONFUSION
+	ret nz
+.heal_confusion
+	ld hl, UseConfusionHealingItem
+	jp CallBattleCore
+
+; 36db6
+
+BattleCommand_Confuse_CheckSnore_Swagger_ConfuseHit: ; 36db6
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call GetBattleVar
+	cp EFFECT_CONFUSE_HIT
+	ret z
+	cp EFFECT_SNORE
+	ret z
+	cp EFFECT_SWAGGER
+	ret z
+	jp PrintDidntAffect2
+
+; 36dc7
+
+
+BattleCommand_Paralyze: ; 36dc7
+; paralyze
+
+	ld a, BATTLE_VARS_STATUS_OPP
+	call GetBattleVar
+	bit PAR, a
+	jr nz, .paralyzed
+	ld a, [TypeModifier]
+	and $7f
+	jr z, .didnt_affect
+	call GetOpponentItem
+	ld a, b
+	cp HELD_PREVENT_PARALYZE
+	jr nz, .no_item_protection
+	ld a, [hl]
+	ld [wNamedObjectIndexBuffer], a
+	call GetItemName
+	call AnimateFailedMove
+	ld hl, ProtectedByText
+	jp StdBattleTextBox
+
+.no_item_protection
+	ld a, [hBattleTurn]
+	and a
+	jr z, .dont_sample_failure
+
+	ld a, [wLinkMode]
+	and a
+	jr nz, .dont_sample_failure
+
+	ld a, [InBattleTowerBattle]
+	and a
+	jr nz, .dont_sample_failure
+
+	ld a, [PlayerSubStatus5]
+	bit SUBSTATUS_LOCK_ON, a
+	jr nz, .dont_sample_failure
+
+	call BattleRandom
+	cp 1 + 25 percent
+	jr c, .failed
+
+.dont_sample_failure
+	ld a, BATTLE_VARS_STATUS_OPP
+	call GetBattleVarAddr
+	and a
+	jr nz, .failed
+	ld a, [AttackMissed]
+	and a
+	jr nz, .failed
+	call CheckSubstituteOpp
+	jr nz, .failed
+	ld c, 30
+	call DelayFrames
+	call AnimateCurrentMove
+	ld a, $1
+	ld [hBGMapMode], a
+	ld a, BATTLE_VARS_STATUS_OPP
+	call GetBattleVarAddr
+	set PAR, [hl]
+	call UpdateOpponentInParty
+	ld hl, ApplyPrzEffectOnSpeed
+	call CallBattleCore
+	call UpdateBattleHuds
+	call PrintParalyze
+	ld hl, UseHeldStatusHealingItem
+	jp CallBattleCore
+
+.paralyzed
+	call AnimateFailedMove
+	ld hl, AlreadyParalyzedText
+	jp StdBattleTextBox
+
+.failed
+	jp PrintDidntAffect2
+
+.didnt_affect
+	call AnimateFailedMove
+	jp PrintDoesntAffect
+
+; 36e5b
+
+
+CheckMoveTypeMatchesTarget: ; 36e5b
+; Compare move type to opponent type.
+; Return z if matching the opponent type,
+; unless the move is Normal (Tri Attack).
+
+	push hl
+
+	ld hl, EnemyMonType1
+	ld a, [hBattleTurn]
+	and a
+	jr z, .ok
+	ld hl, BattleMonType1
+.ok
+
+	ld a, BATTLE_VARS_MOVE_TYPE
+	call GetBattleVar
+	cp NORMAL
+	jr z, .normal
+
+	cp [hl]
+	jr z, .return
+
+	inc hl
+	cp [hl]
+
+.return
+	pop hl
+	ret
+
+.normal
+	ld a, 1
+	and a
+	pop hl
+	ret
+
+; 36e7c
+
+
+BattleCommand_Substitute: ; 36e7c
+; substitute
+
+	call BattleCommand_MoveDelay
+	ld hl, BattleMonMaxHP
+	ld de, PlayerSubstituteHP
+	ld a, [hBattleTurn]
+	and a
+	jr z, .got_hp
+	ld hl, EnemyMonMaxHP
+	ld de, EnemySubstituteHP
+.got_hp
+
+	ld a, BATTLE_VARS_SUBSTATUS4
+	call GetBattleVar
+	bit SUBSTATUS_SUBSTITUTE, a
+	jr nz, .already_has_sub
+
+	ld a, [hli]
+	ld b, [hl]
+	srl a
+	rr b
+	srl a
+	rr b
+	dec hl
+	dec hl
+	ld a, b
+	ld [de], a
+	ld a, [hld]
+	sub b
+	ld e, a
+	ld a, [hl]
+	sbc 0
+	ld d, a
+	jr c, .too_weak_to_sub
+	ld a, d
+	or e
+	jr z, .too_weak_to_sub
+	ld [hl], d
+	inc hl
+	ld [hl], e
+
+	ld a, BATTLE_VARS_SUBSTATUS4
+	call GetBattleVarAddr
+	set SUBSTATUS_SUBSTITUTE, [hl]
+
+	ld hl, wPlayerWrapCount
+	ld de, wPlayerTrappingMove
+	ld a, [hBattleTurn]
+	and a
+	jr z, .player
+	ld hl, wEnemyWrapCount
+	ld de, wEnemyTrappingMove
+.player
+
+	xor a
+	ld [hl], a
+	ld [de], a
+	call _CheckBattleScene
+	jr c, .no_anim
+
+	xor a
+	ld [wNumHits], a
+	ld [FXAnimID + 1], a
+	ld [wKickCounter], a
+	ld a, SUBSTITUTE
+	call LoadAnim
+	jr .finish
+
+.no_anim
+	call BattleCommand_RaiseSubNoAnim
+.finish
+	ld hl, MadeSubstituteText
+	call StdBattleTextBox
+	jp RefreshBattleHuds
+
+.already_has_sub
+	call CheckUserIsCharging
+	call nz, BattleCommand_RaiseSub
+	ld hl, HasSubstituteText
+	jr .jp_stdbattletextbox
+
+.too_weak_to_sub
+	call CheckUserIsCharging
+	call nz, BattleCommand_RaiseSub
+	ld hl, TooWeakSubText
+.jp_stdbattletextbox
+	jp StdBattleTextBox
+
+; 36f0b
+
+BattleCommand_RechargeNextTurn: ; 36f0b
+; rechargenextturn
+	ld a, BATTLE_VARS_SUBSTATUS4
+	call GetBattleVarAddr
+	set SUBSTATUS_RECHARGE, [hl]
+	ret
+
+; 36f13
+
+
+EndRechargeOpp: ; 36f13
+	push hl
+	ld a, BATTLE_VARS_SUBSTATUS4_OPP
+	call GetBattleVarAddr
+	res SUBSTATUS_RECHARGE, [hl]
+	pop hl
+	ret
+
+; 36f1d
+
+
+BattleCommand_Rage: ; 36f1d
+; rage
+	ld a, BATTLE_VARS_SUBSTATUS4
+	call GetBattleVarAddr
+	set SUBSTATUS_RAGE, [hl]
+	ret
+
+; 36f25
+
+
+BattleCommand_DoubleFlyingDamage: ; 36f25
+; doubleflyingdamage
+	ld a, BATTLE_VARS_SUBSTATUS3_OPP
+	call GetBattleVar
+	bit SUBSTATUS_FLYING, a
+	ret z
+	jr DoubleDamage
+
+; 36f2f
+
+
+BattleCommand_DoubleUndergroundDamage: ; 36f2f
+; doubleundergrounddamage
+	ld a, BATTLE_VARS_SUBSTATUS3_OPP
+	call GetBattleVar
+	bit SUBSTATUS_UNDERGROUND, a
+	ret z
+
+	; fallthrough
+; 36f37
+
+
+DoubleDamage: ; 36f37
+	ld hl, CurDamage + 1
+	sla [hl]
+	dec hl
+	rl [hl]
+	jr nc, .quit
+
+	ld a, $ff
+	ld [hli], a
+	ld [hl], a
+.quit
+	ret
+
+; 36f46
+
+
+BattleCommand_Mimic: ; 36f46
+; mimic
+
+	call ClearLastMove
+	call BattleCommand_MoveDelay
+	ld a, [AttackMissed]
+	and a
+	jr nz, .fail
+	ld hl, BattleMonMoves
+	ld a, [hBattleTurn]
+	and a
+	jr z, .player_turn
+	ld hl, EnemyMonMoves
+.player_turn
+	call CheckHiddenOpponent
+	jr nz, .fail
+	ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
+	call GetBattleVar
+	and a
+	jr z, .fail
+	cp STRUGGLE
+	jr z, .fail
+	ld b, a
+	ld c, NUM_MOVES
+.check_already_knows_move
+	ld a, [hli]
+	cp b
+	jr z, .fail
+	dec c
+	jr nz, .check_already_knows_move
+	dec hl
+.find_mimic
+	ld a, [hld]
+	cp MIMIC
+	jr nz, .find_mimic
+	inc hl
+	ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
+	call GetBattleVar
+	ld [hl], a
+	ld [wNamedObjectIndexBuffer], a
+	ld bc, BattleMonPP - BattleMonMoves
+	add hl, bc
+	ld [hl], 5
+	call GetMoveName
+	call AnimateCurrentMove
+	ld hl, LearnedMoveText
+	jp StdBattleTextBox
+
+.fail
+	jp FailMimic
+
+; 36f9d
+
+
+BattleCommand_LeechSeed: ; 36f9d
+; leechseed
+	ld a, [AttackMissed]
+	and a
+	jr nz, .evaded
+	call CheckSubstituteOpp
+	jr nz, .evaded
+
+	ld de, EnemyMonType1
+	ld a, [hBattleTurn]
+	and a
+	jr z, .ok
+	ld de, BattleMonType1
+.ok
+
+	ld a, [de]
+	cp GRASS
+	jr z, .grass
+	inc de
+	ld a, [de]
+	cp GRASS
+	jr z, .grass
+
+	ld a, BATTLE_VARS_SUBSTATUS4_OPP
+	call GetBattleVarAddr
+	bit SUBSTATUS_LEECH_SEED, [hl]
+	jr nz, .evaded
+	set SUBSTATUS_LEECH_SEED, [hl]
+	call AnimateCurrentMove
+	ld hl, WasSeededText
+	jp StdBattleTextBox
+
+.grass
+	call AnimateFailedMove
+	jp PrintDoesntAffect
+
+.evaded
+	call AnimateFailedMove
+	ld hl, EvadedText
+	jp StdBattleTextBox
+
+; 36fe1
+
+
+BattleCommand_Splash: ; 36fe1
+	call AnimateCurrentMove
+	farcall TrainerRankings_Splash
+	jp PrintNothingHappened
+
+; 36fed
+
+
+BattleCommand_Disable: ; 36fed
+; disable
+
+	ld a, [AttackMissed]
+	and a
+	jr nz, .failed
+
+	ld de, EnemyDisableCount
+	ld hl, EnemyMonMoves
+	ld a, [hBattleTurn]
+	and a
+	jr z, .got_moves
+	ld de, PlayerDisableCount
+	ld hl, BattleMonMoves
+.got_moves
+
+	ld a, [de]
+	and a
+	jr nz, .failed
+
+	ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
+	call GetBattleVar
+	and a
+	jr z, .failed
+	cp STRUGGLE
+	jr z, .failed
+
+	ld b, a
+	ld c, $ff
+.loop
+	inc c
+	ld a, [hli]
+	cp b
+	jr nz, .loop
+
+	ld a, [hBattleTurn]
+	and a
+	ld hl, EnemyMonPP
+	jr z, .got_pp
+	ld hl, BattleMonPP
+.got_pp
+	ld b, 0
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr z, .failed
+.loop2
+	call BattleRandom
+	and 7
+	jr z, .loop2
+	inc a
+	inc c
+	swap c
+	add c
+	ld [de], a
+	call AnimateCurrentMove
+	ld hl, DisabledMove
+	ld a, [hBattleTurn]
+	and a
+	jr nz, .got_disabled_move_pointer
+	inc hl
+.got_disabled_move_pointer
+	ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
+	call GetBattleVar
+	ld [hl], a
+	ld [wNamedObjectIndexBuffer], a
+	call GetMoveName
+	ld hl, WasDisabledText
+	jp StdBattleTextBox
+
+.failed
+	jp FailDisable
+
+; 3705c
+
+
+BattleCommand_PayDay: ; 3705c
+; payday
+
+	xor a
+	ld hl, StringBuffer1
+	ld [hli], a
+
+	ld a, [hBattleTurn]
+	and a
+	ld a, [BattleMonLevel]
+	jr z, .ok
+	ld a, [EnemyMonLevel]
+.ok
+
+	add a
+	ld hl, wPayDayMoney + 2
+	add [hl]
+	ld [hld], a
+	jr nc, .done
+	inc [hl]
+	dec hl
+	jr nz, .done
+	inc [hl]
+.done
+	ld hl, CoinsScatteredText
+	jp StdBattleTextBox
+
+; 3707f
+
+
+BattleCommand_Conversion: ; 3707f
+; conversion
+
+	ld hl, BattleMonMoves
+	ld de, BattleMonType1
+	ld a, [hBattleTurn]
+	and a
+	jr z, .got_moves
+	ld hl, EnemyMonMoves
+	ld de, EnemyMonType1
+.got_moves
+	push de
+	ld c, 0
+	ld de, StringBuffer1
+.loop
+	push hl
+	ld b, 0
+	add hl, bc
+	ld a, [hl]
+	pop hl
+	and a
+	jr z, .okay
+	push hl
+	push bc
+	dec a
+	ld hl, Moves + MOVE_TYPE
+	call GetMoveAttr
+	ld [de], a
+	inc de
+	pop bc
+	pop hl
+	inc c
+	ld a, c
+	cp NUM_MOVES
+	jr c, .loop
+.okay
+	ld a, $ff
+	ld [de], a
+	inc de
+	ld [de], a
+	inc de
+	ld [de], a
+	pop de
+	ld hl, StringBuffer1
+.loop2
+	ld a, [hl]
+	cp -1
+	jr z, .fail
+	cp CURSE_T
+	jr z, .next
+	ld a, [de]
+	cp [hl]
+	jr z, .next
+	inc de
+	ld a, [de]
+	dec de
+	cp [hl]
+	jr nz, .done
+.next
+	inc hl
+	jr .loop2
+
+.fail
+	call AnimateFailedMove
+	jp PrintButItFailed
+
+.done
+.loop3
+	call BattleRandom
+	and 3 ; TODO factor in NUM_MOVES
+	ld c, a
+	ld b, 0
+	ld hl, StringBuffer1
+	add hl, bc
+	ld a, [hl]
+	cp -1
+	jr z, .loop3
+	cp CURSE_T
+	jr z, .loop3
+	ld a, [de]
+	cp [hl]
+	jr z, .loop3
+	inc de
+	ld a, [de]
+	dec de
+	cp [hl]
+	jr z, .loop3
+	ld a, [hl]
+	ld [de], a
+	inc de
+	ld [de], a
+	ld [wNamedObjectIndexBuffer], a
+	farcall GetTypeName
+	call AnimateCurrentMove
+	ld hl, TransformedTypeText
+	jp StdBattleTextBox
+
+; 3710e
+
+
+BattleCommand_ResetStats: ; 3710e
+; resetstats
+
+	ld a, 7 ; neutral
+	ld hl, PlayerStatLevels
+	call .Fill
+	ld hl, EnemyStatLevels
+	call .Fill
+
+	ld a, [hBattleTurn]
+	push af
+
+	call SetPlayerTurn
+	call CalcPlayerStats
+	call SetEnemyTurn
+	call CalcEnemyStats
+
+	pop af
+	ld [hBattleTurn], a
+
+	call AnimateCurrentMove
+
+	ld hl, EliminatedStatsText
+	jp StdBattleTextBox
+
+.Fill:
+	ld b, PlayerStatLevelsEnd - PlayerStatLevels
+.next
+	ld [hli], a
+	dec b
+	jr nz, .next
+	ret
+
+; 3713e
+
+
+BattleCommand_Heal: ; 3713e
+; heal
+
+	ld de, BattleMonHP
+	ld hl, BattleMonMaxHP
+	ld a, [hBattleTurn]
+	and a
+	jr z, .got_hp
+	ld de, EnemyMonHP
+	ld hl, EnemyMonMaxHP
+.got_hp
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call GetBattleVar
+	ld b, a
+	push hl
+	push de
+	push bc
+	ld c, 2
+	call StringCmp
+	pop bc
+	pop de
+	pop hl
+	jp z, .hp_full
+	ld a, b
+	cp REST
+	jr nz, .not_rest
+
+	push hl
+	push de
+	push af
+	call BattleCommand_MoveDelay
+	ld a, BATTLE_VARS_SUBSTATUS5
+	call GetBattleVarAddr
+	res SUBSTATUS_TOXIC, [hl]
+	ld a, BATTLE_VARS_STATUS
+	call GetBattleVarAddr
+	ld a, [hl]
+	and a
+	ld [hl], REST_SLEEP_TURNS + 1
+	ld hl, WentToSleepText
+	jr z, .no_status_to_heal
+	ld hl, RestedText
+.no_status_to_heal
+	call StdBattleTextBox
+	ld a, [hBattleTurn]
+	and a
+	jr nz, .calc_enemy_stats
+	call CalcPlayerStats
+	jr .got_stats
+
+.calc_enemy_stats
+	call CalcEnemyStats
+.got_stats
+	pop af
+	pop de
+	pop hl
+
+.not_rest
+	jr z, .restore_full_hp
+	ld hl, GetHalfMaxHP
+	call CallBattleCore
+	jr .finish
+
+.restore_full_hp
+	ld hl, GetMaxHP
+	call CallBattleCore
+.finish
+	call AnimateCurrentMove
+	call BattleCommand_SwitchTurn
+	ld hl, RestoreHP
+	call CallBattleCore
+	call BattleCommand_SwitchTurn
+	call UpdateUserInParty
+	call RefreshBattleHuds
+	ld hl, RegainedHealthText
+	jp StdBattleTextBox
+
+.hp_full
+	call AnimateFailedMove
+	ld hl, HPIsFullText
+	jp StdBattleTextBox
+
+; 371cd
+
+INCLUDE "engine/battle/effect_commands/transform.asm"
+
+BattleSideCopy: ; 372c6
+; Copy bc bytes from hl to de if it's the player's turn.
+; Copy bc bytes from de to hl if it's the enemy's turn.
+	ld a, [hBattleTurn]
+	and a
+	jr z, .copy
+
+; Swap hl and de
+	push hl
+	ld h, d
+	ld l, e
+	pop de
+.copy
+	jp CopyBytes
+
+; 372d2
+
+
+BattleEffect_ButItFailed: ; 372d2
+	call AnimateFailedMove
+	jp PrintButItFailed
+
+; 372d8
+
+
+ClearLastMove: ; 372d8
+	ld a, BATTLE_VARS_LAST_COUNTER_MOVE
+	call GetBattleVarAddr
+	xor a
+	ld [hl], a
+
+	ld a, BATTLE_VARS_LAST_MOVE
+	call GetBattleVarAddr
+	xor a
+	ld [hl], a
+	ret
+
+; 372e7
+
+
+ResetActorDisable: ; 372e7
+	ld a, [hBattleTurn]
+	and a
+	jr z, .player
+
+	xor a
+	ld [EnemyDisableCount], a
+	ld [EnemyDisabledMove], a
+	ret
+
+.player
+	xor a
+	ld [PlayerDisableCount], a
+	ld [DisabledMove], a
+	ret
+
+; 372fc
+
+
+BattleCommand_Screen: ; 372fc
+; screen
+
+	ld hl, PlayerScreens
+	ld bc, PlayerLightScreenCount
+	ld a, [hBattleTurn]
+	and a
+	jr z, .got_screens_pointer
+	ld hl, EnemyScreens
+	ld bc, EnemyLightScreenCount
+
+.got_screens_pointer
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call GetBattleVar
+	cp EFFECT_LIGHT_SCREEN
+	jr nz, .Reflect
+
+	bit SCREENS_LIGHT_SCREEN, [hl]
+	jr nz, .failed
+	set SCREENS_LIGHT_SCREEN, [hl]
+	ld a, 5
+	ld [bc], a
+	ld hl, LightScreenEffectText
+	jr .good
+
+.Reflect:
+	bit SCREENS_REFLECT, [hl]
+	jr nz, .failed
+	set SCREENS_REFLECT, [hl]
+
+	; LightScreenCount -> ReflectCount
+	inc bc
+
+	ld a, 5
+	ld [bc], a
+	ld hl, ReflectEffectText
+
+.good
+	call AnimateCurrentMove
+	jp StdBattleTextBox
+
+.failed
+	call AnimateFailedMove
+	jp PrintButItFailed
+
+; 3733d
+
+
+PrintDoesntAffect: ; 3733d
+; 'it doesn't affect'
+	ld hl, DoesntAffectText
+	jp StdBattleTextBox
+
+; 37343
+
+
+PrintNothingHappened: ; 37343
+; 'but nothing happened!'
+	ld hl, NothingHappenedText
+	jp StdBattleTextBox
+
+; 37349
+
+
+TryPrintButItFailed: ; 37349
+	ld a, [AlreadyFailed]
+	and a
+	ret nz
+
+	; fallthrough
+; 3734e
+
+
+PrintButItFailed: ; 3734e
+; 'but it failed!'
+	ld hl, ButItFailedText
+	jp StdBattleTextBox
+
+; 37354
+
+
+FailSnore:
+FailDisable:
+FailConversion2:
+FailAttract:
+FailForesight:
+FailSpikes:
+	call AnimateFailedMove
+	; fallthrough
+; 37357
+
+FailMimic: ; 37357
+	ld hl, ButItFailedText ; 'but it failed!'
+	ld de, ItFailedText    ; 'it failed!'
+	jp FailText_CheckOpponentProtect
+
+; 37360
+
+
+PrintDidntAffect: ; 37360
+; 'it didn't affect'
+	ld hl, DidntAffect1Text
+	jp StdBattleTextBox
+
+; 37366
+
+
+PrintDidntAffect2: ; 37366
+	call AnimateFailedMove
+	ld hl, DidntAffect1Text ; 'it didn't affect'
+	ld de, DidntAffect2Text ; 'it didn't affect'
+	jp FailText_CheckOpponentProtect
+
+; 37372
+
+
+PrintParalyze: ; 37372
+; 'paralyzed! maybe it can't attack!'
+	ld hl, ParalyzedText
+	jp StdBattleTextBox
+
+; 37378
+
+
+CheckSubstituteOpp: ; 37378
+	ld a, BATTLE_VARS_SUBSTATUS4_OPP
+	call GetBattleVar
+	bit SUBSTATUS_SUBSTITUTE, a
+	ret
+
+; 37380
+
+
+BattleCommand_Selfdestruct: ; 37380
+	farcall TrainerRankings_Selfdestruct
+	ld a, BATTLEANIM_PLAYER_DAMAGE
+	ld [wNumHits], a
+	ld c, 3
+	call DelayFrames
+	ld a, BATTLE_VARS_STATUS
+	call GetBattleVarAddr
+	xor a
+	ld [hli], a
+	inc hl
+	ld [hli], a
+	ld [hl], a
+	ld a, $1
+	ld [wKickCounter], a
+	call BattleCommand_LowerSub
+	call LoadMoveAnim
+	ld a, BATTLE_VARS_SUBSTATUS4
+	call GetBattleVarAddr
+	res SUBSTATUS_LEECH_SEED, [hl]
+	ld a, BATTLE_VARS_SUBSTATUS5_OPP
+	call GetBattleVarAddr
+	res SUBSTATUS_DESTINY_BOND, [hl]
+	call _CheckBattleScene
+	ret nc
+	farcall DrawPlayerHUD
+	farcall DrawEnemyHUD
+	call WaitBGMap
+	jp RefreshBattleHuds
+
+; 373c9
+
+
+INCLUDE "engine/battle/effect_commands/mirror_move.asm"
+
+INCLUDE "engine/battle/effect_commands/metronome.asm"
+
+
+CheckUserMove: ; 37462
+; Return z if the user has move a.
+	ld b, a
+	ld de, BattleMonMoves
+	ld a, [hBattleTurn]
+	and a
+	jr z, .ok
+	ld de, EnemyMonMoves
+.ok
+
+	ld c, NUM_MOVES
+.loop
+	ld a, [de]
+	inc de
+	cp b
+	ret z
+
+	dec c
+	jr nz, .loop
+
+	ld a, 1
+	and a
+	ret
+
+; 3747b
+
+
+ResetTurn: ; 3747b
+	ld hl, wPlayerCharging
+	ld a, [hBattleTurn]
+	and a
+	jr z, .player
+	ld hl, wEnemyCharging
+
+.player
+	ld [hl], 1
+	xor a
+	ld [AlreadyDisobeyed], a
+	call DoMove
+	jp EndMoveEffect
+
+; 37492
+
+
+INCLUDE "engine/battle/effect_commands/thief.asm"
+
+
+BattleCommand_ArenaTrap: ; 37517
+; arenatrap
+
+; Doesn't work on an absent opponent.
+
+	call CheckHiddenOpponent
+	jr nz, .failed
+
+; Don't trap if the opponent is already trapped.
+
+	ld a, BATTLE_VARS_SUBSTATUS5
+	call GetBattleVarAddr
+	bit SUBSTATUS_CANT_RUN, [hl]
+	jr nz, .failed
+
+; Otherwise trap the opponent.
+
+	set SUBSTATUS_CANT_RUN, [hl]
+	call AnimateCurrentMove
+	ld hl, CantEscapeNowText
+	jp StdBattleTextBox
+
+.failed
+	call AnimateFailedMove
+	jp PrintButItFailed
+
+; 37536
+
+
+INCLUDE "engine/battle/effect_commands/nightmare.asm"
+
+
+BattleCommand_Defrost: ; 37563
+; defrost
+
+; Thaw the user.
+
+	ld a, BATTLE_VARS_STATUS
+	call GetBattleVarAddr
+	bit FRZ, [hl]
+	ret z
+	res FRZ, [hl]
+
+; Don't update the enemy's party struct in a wild battle.
+
+	ld a, [hBattleTurn]
+	and a
+	jr z, .party
+
+	ld a, [wBattleMode]
+	dec a
+	jr z, .done
+
+.party
+	ld a, MON_STATUS
+	call UserPartyAttr
+	res FRZ, [hl]
+
+.done
+	call RefreshBattleHuds
+	ld hl, WasDefrostedText
+	jp StdBattleTextBox
+
+; 37588
+
+
+INCLUDE "engine/battle/effect_commands/curse.asm"
+
+INCLUDE "engine/battle/effect_commands/protect.asm"
+
+INCLUDE "engine/battle/effect_commands/endure.asm"
+
+INCLUDE "engine/battle/effect_commands/spikes.asm"
+
+INCLUDE "engine/battle/effect_commands/foresight.asm"
+
+INCLUDE "engine/battle/effect_commands/perish_song.asm"
+
+INCLUDE "engine/battle/effect_commands/sandstorm.asm"
+
+INCLUDE "engine/battle/effect_commands/rollout.asm"
+
+
+BattleCommand5d: ; 37791
+; unused
+	ret
+
+; 37792
+
+
+BattleCommand_FuryCutter: ; 37792
+; furycutter
+
+	ld hl, PlayerFuryCutterCount
+	ld a, [hBattleTurn]
+	and a
+	jr z, .go
+	ld hl, EnemyFuryCutterCount
+
+.go
+	ld a, [AttackMissed]
+	and a
+	jp nz, ResetFuryCutterCount
+
+	inc [hl]
+
+; Damage capped at 5 turns' worth (16x).
+	ld a, [hl]
+	ld b, a
+	cp 6
+	jr c, .checkdouble
+	ld b, 5
+
+.checkdouble
+	dec b
+	ret z
+
+; Double the damage
+	ld hl, CurDamage + 1
+	sla [hl]
+	dec hl
+	rl [hl]
+	jr nc, .checkdouble
+
+; No overflow
+	ld a, $ff
+	ld [hli], a
+	ld [hl], a
+	ret
+
+; 377be
+
+
+ResetFuryCutterCount: ; 377be
+
+	push hl
+
+	ld hl, PlayerFuryCutterCount
+	ld a, [hBattleTurn]
+	and a
+	jr z, .reset
+	ld hl, EnemyFuryCutterCount
+
+.reset
+	xor a
+	ld [hl], a
+
+	pop hl
+	ret
+
+; 377ce
+
+
+INCLUDE "engine/battle/effect_commands/attract.asm"
+
+BattleCommand_HappinessPower: ; 3784b
+; happinesspower
+	push bc
+	ld hl, BattleMonHappiness
+	ld a, [hBattleTurn]
+	and a
+	jr z, .ok
+	ld hl, EnemyMonHappiness
+.ok
+	xor a
+	ld [hMultiplicand + 0], a
+	ld [hMultiplicand + 1], a
+	ld a, [hl]
+	ld [hMultiplicand + 2], a
+	ld a, 10
+	ld [hMultiplier], a
+	call Multiply
+	ld a, 25
+	ld [hDivisor], a
+	ld b, 4
+	call Divide
+	ld a, [hQuotient + 2]
+	ld d, a
+	pop bc
+	ret
+
+; 37874
+
+
+INCLUDE "engine/battle/effect_commands/present.asm"
+
+BattleCommand_FrustrationPower: ; 3790e
+; frustrationpower
+
+	push bc
+	ld hl, BattleMonHappiness
+	ld a, [hBattleTurn]
+	and a
+	jr z, .got_happiness
+	ld hl, EnemyMonHappiness
+.got_happiness
+	ld a, $ff
+	sub [hl]
+	ld [hMultiplicand + 2], a
+	xor a
+	ld [hMultiplicand + 0], a
+	ld [hMultiplicand + 1], a
+	ld a, 10
+	ld [hMultiplier], a
+	call Multiply
+	ld a, 25
+	ld [hDivisor], a
+	ld b, 4
+	call Divide
+	ld a, [hQuotient + 2]
+	ld d, a
+	pop bc
+	ret
+
+; 37939
+
+
+BattleCommand_Safeguard: ; 37939
+; safeguard
+
+	ld hl, PlayerScreens
+	ld de, PlayerSafeguardCount
+	ld a, [hBattleTurn]
+	and a
+	jr z, .ok
+	ld hl, EnemyScreens
+	ld de, EnemySafeguardCount
+.ok
+	bit SCREENS_SAFEGUARD, [hl]
+	jr nz, .failed
+	set SCREENS_SAFEGUARD, [hl]
+	ld a, 5
+	ld [de], a
+	call AnimateCurrentMove
+	ld hl, CoveredByVeilText
+	jp StdBattleTextBox
+
+.failed
+	call AnimateFailedMove
+	jp PrintButItFailed
+
+; 37962
+
+
+SafeCheckSafeguard: ; 37962
+	push hl
+	ld hl, EnemyScreens
+	ld a, [hBattleTurn]
+	and a
+	jr z, .got_turn
+	ld hl, PlayerScreens
+
+.got_turn
+	bit SCREENS_SAFEGUARD, [hl]
+	pop hl
+	ret
+
+; 37972
+
+
+BattleCommand_CheckSafeguard: ; 37972
+; checksafeguard
+	ld hl, EnemyScreens
+	ld a, [hBattleTurn]
+	and a
+	jr z, .got_turn
+	ld hl, PlayerScreens
+.got_turn
+	bit SCREENS_SAFEGUARD, [hl]
+	ret z
+	ld a, 1
+	ld [AttackMissed], a
+	call BattleCommand_MoveDelay
+	ld hl, SafeguardProtectText
+	call StdBattleTextBox
+	jp EndMoveEffect
+
+; 37991
+
+
+BattleCommand_GetMagnitude: ; 37991
+; getmagnitude
+
+	push bc
+	call BattleRandom
+	ld b, a
+	ld hl, .Magnitudes
+.loop
+	ld a, [hli]
+	cp b
+	jr nc, .ok
+	inc hl
+	inc hl
+	jr .loop
+
+.ok
+	ld d, [hl]
+	push de
+	inc hl
+	ld a, [hl]
+	ld [wTypeMatchup], a
+	call BattleCommand_MoveDelay
+	ld hl, MagnitudeText
+	call StdBattleTextBox
+	pop de
+	pop bc
+	ret
+
+.Magnitudes:
+	;  /255, BP, magnitude
+	db  13,  10,  4
+	db  38,  30,  5
+	db  89,  50,  6
+	db 166,  70,  7
+	db 217,  90,  8
+	db 242, 110,  9
+	db 255, 150, 10
+; 379c9
+
+
+BattleCommand_BatonPass: ; 379c9
+; batonpass
+
+	ld a, [hBattleTurn]
+	and a
+	jp nz, .Enemy
+
+
+; Need something to switch to
+	call CheckAnyOtherAlivePartyMons
+	jp z, FailedBatonPass
+
+	call UpdateBattleMonInParty
+	call AnimateCurrentMove
+
+	ld c, 50
+	call DelayFrames
+
+; Transition into switchmon menu
+	call LoadStandardMenuDataHeader
+	farcall SetUpBattlePartyMenu_NoLoop
+
+	farcall ForcePickSwitchMonInBattle
+
+; Return to battle scene
+	call ClearPalettes
+	farcall _LoadBattleFontsHPBar
+	call CloseWindow
+	call ClearSprites
+	hlcoord 1, 0
+	lb bc, 4, 10
+	call ClearBox
+	ld b, SCGB_BATTLE_COLORS
+	call GetSGBLayout
+	call SetPalettes
+	call BatonPass_LinkPlayerSwitch
+
+; Mobile link battles handle entrances differently
+	farcall CheckMobileBattleError
+	jp c, EndMoveEffect
+
+	ld hl, PassedBattleMonEntrance
+	call CallBattleCore
+
+	call ResetBatonPassStatus
+	ret
+
+
+.Enemy:
+
+; Wildmons don't have anything to switch to
+	ld a, [wBattleMode]
+	dec a ; WILDMON
+	jp z, FailedBatonPass
+
+	call CheckAnyOtherAliveEnemyMons
+	jp z, FailedBatonPass
+
+	call UpdateEnemyMonInParty
+	call AnimateCurrentMove
+	call BatonPass_LinkEnemySwitch
+
+; Mobile link battles handle entrances differently
+	farcall CheckMobileBattleError
+	jp c, EndMoveEffect
+
+; Passed enemy PartyMon entrance
+	xor a
+	ld [wEnemySwitchMonIndex], a
+	ld hl, EnemySwitch_SetMode
+	call CallBattleCore
+	ld hl, ResetBattleParticipants
+	call CallBattleCore
+	ld a, 1
+	ld [wTypeMatchup], a
+	ld hl, ApplyStatLevelMultiplierOnAllStats
+	call CallBattleCore
+
+	ld hl, SpikesDamage
+	call CallBattleCore
+
+	jr ResetBatonPassStatus
+
+; 37a67
+
+
+BatonPass_LinkPlayerSwitch: ; 37a67
+	ld a, [wLinkMode]
+	and a
+	ret z
+
+	ld a, 1
+	ld [wPlayerAction], a
+
+	call LoadStandardMenuDataHeader
+	ld hl, LinkBattleSendReceiveAction
+	call CallBattleCore
+	call CloseWindow
+
+	xor a
+	ld [wPlayerAction], a
+	ret
+
+; 37a82
+
+
+BatonPass_LinkEnemySwitch: ; 37a82
+	ld a, [wLinkMode]
+	and a
+	ret z
+
+	call LoadStandardMenuDataHeader
+	ld hl, LinkBattleSendReceiveAction
+	call CallBattleCore
+
+	ld a, [OTPartyCount]
+	add BATTLEACTION_SWITCH1
+	ld b, a
+	ld a, [wBattleAction]
+	cp BATTLEACTION_SWITCH1
+	jr c, .baton_pass
+	cp b
+	jr c, .switch
+
+.baton_pass
+	ld a, [CurOTMon]
+	add BATTLEACTION_SWITCH1
+	ld [wBattleAction], a
+.switch
+	jp CloseWindow
+
+; 37aab
+
+
+FailedBatonPass: ; 37aab
+	call AnimateFailedMove
+	jp PrintButItFailed
+
+; 37ab1
+
+
+ResetBatonPassStatus: ; 37ab1
+; Reset status changes that aren't passed by Baton Pass.
+
+	; Nightmare isn't passed.
+	ld a, BATTLE_VARS_STATUS
+	call GetBattleVar
+	and SLP
+	jr nz, .ok
+
+	ld a, BATTLE_VARS_SUBSTATUS1
+	call GetBattleVarAddr
+	res SUBSTATUS_NIGHTMARE, [hl]
+.ok
+
+	; Disable isn't passed.
+	call ResetActorDisable
+
+	; Attraction isn't passed.
+	ld hl, PlayerSubStatus1
+	res SUBSTATUS_IN_LOVE, [hl]
+	ld hl, EnemySubStatus1
+	res SUBSTATUS_IN_LOVE, [hl]
+	ld hl, PlayerSubStatus5
+
+	ld a, BATTLE_VARS_SUBSTATUS5
+	call GetBattleVarAddr
+	res SUBSTATUS_TRANSFORMED, [hl]
+	res SUBSTATUS_ENCORED, [hl]
+
+	; New mon hasn't used a move yet.
+	ld a, BATTLE_VARS_LAST_MOVE
+	call GetBattleVarAddr
+	ld [hl], 0
+
+	xor a
+	ld [wPlayerWrapCount], a
+	ld [wEnemyWrapCount], a
+	ret
+
+; 37ae9
+
+
+CheckAnyOtherAlivePartyMons: ; 37ae9
+	ld hl, PartyMon1HP
+	ld a, [PartyCount]
+	ld d, a
+	ld a, [CurBattleMon]
+	ld e, a
+	jr CheckAnyOtherAliveMons
+
+; 37af6
+
+
+CheckAnyOtherAliveEnemyMons: ; 37af6
+	ld hl, OTPartyMon1HP
+	ld a, [OTPartyCount]
+	ld d, a
+	ld a, [CurOTMon]
+	ld e, a
+
+	; fallthrough
+; 37b01
+
+CheckAnyOtherAliveMons: ; 37b01
+; Check for nonzero HP starting from partymon
+; HP at hl for d partymons, besides current mon e.
+
+; Return nz if any are alive.
+
+	xor a
+	ld b, a
+	ld c, a
+.loop
+	ld a, c
+	cp d
+	jr z, .done
+	cp e
+	jr z, .next
+
+	ld a, [hli]
+	or b
+	ld b, a
+	ld a, [hld]
+	or b
+	ld b, a
+
+.next
+	push bc
+	ld bc, PARTYMON_STRUCT_LENGTH
+	add hl, bc
+	pop bc
+	inc c
+	jr .loop
+
+.done
+	ld a, b
+	and a
+	ret
+
+; 37b1d
+
+
+BattleCommand_Pursuit: ; 37b1d
+; pursuit
+; Double damage if the opponent is switching.
+
+	ld hl, wEnemyIsSwitching
+	ld a, [hBattleTurn]
+	and a
+	jr z, .ok
+	ld hl, wPlayerIsSwitching
+.ok
+	ld a, [hl]
+	and a
+	ret z
+
+	ld hl, CurDamage + 1
+	sla [hl]
+	dec hl
+	rl [hl]
+	ret nc
+
+	ld a, $ff
+	ld [hli], a
+	ld [hl], a
+	ret
+
+; 37b39
+
+
+BattleCommand_ClearHazards: ; 37b39
+; clearhazards
+
+	ld a, BATTLE_VARS_SUBSTATUS4
+	call GetBattleVarAddr
+	bit SUBSTATUS_LEECH_SEED, [hl]
+	jr z, .not_leeched
+	res SUBSTATUS_LEECH_SEED, [hl]
+	ld hl, ShedLeechSeedText
+	call StdBattleTextBox
+.not_leeched
+
+	ld hl, PlayerScreens
+	ld de, wPlayerWrapCount
+	ld a, [hBattleTurn]
+	and a
+	jr z, .got_screens_wrap
+	ld hl, EnemyScreens
+	ld de, wEnemyWrapCount
+.got_screens_wrap
+	bit SCREENS_SPIKES, [hl]
+	jr z, .no_spikes
+	res SCREENS_SPIKES, [hl]
+	ld hl, BlewSpikesText
+	push de
+	call StdBattleTextBox
+	pop de
+.no_spikes
+
+	ld a, [de]
+	and a
+	ret z
+	xor a
+	ld [de], a
+	ld hl, ReleasedByText
+	jp StdBattleTextBox
+
+; 37b74
+
+
+BattleCommand_HealMorn: ; 37b74
+; healmorn
+	ld b, MORN_F
+	jr BattleCommand_TimeBasedHealContinue
+
+; 37b78
+
+BattleCommand_HealDay: ; 37b78
+; healday
+	ld b, DAY_F
+	jr BattleCommand_TimeBasedHealContinue
+
+; 37b7c
+
+BattleCommand_HealNite: ; 37b7c
+; healnite
+	ld b, NITE_F
+	; fallthrough
+; 37b7e
+
+BattleCommand_TimeBasedHealContinue: ; 37b7e
+; Time- and weather-sensitive heal.
+
+	ld hl, BattleMonMaxHP
+	ld de, BattleMonHP
+	ld a, [hBattleTurn]
+	and a
+	jr z, .start
+	ld hl, EnemyMonMaxHP
+	ld de, EnemyMonHP
+
+.start
+; Index for .Multipliers
+; Default restores half max HP.
+	ld c, 2
+
+; Don't bother healing if HP is already full.
+	push bc
+	call StringCmp
+	pop bc
+	jr z, .Full
+
+; Don't factor in time of day in link battles.
+	ld a, [wLinkMode]
+	and a
+	jr nz, .Weather
+
+	ld a, [TimeOfDay]
+	cp b
+	jr z, .Weather
+	dec c ; double
+
+.Weather:
+	ld a, [Weather]
+	and a
+	jr z, .Heal
+
+; x2 in sun
+; /2 in rain/sandstorm
+	inc c
+	cp WEATHER_SUN
+	jr z, .Heal
+	dec c
+	dec c
+
+.Heal:
+	ld b, 0
+	ld hl, .Multipliers
+	add hl, bc
+	add hl, bc
+
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	ld a, BANK(GetMaxHP)
+	rst FarCall
+
+	call AnimateCurrentMove
+	call BattleCommand_SwitchTurn
+
+	callfar RestoreHP
+
+	call BattleCommand_SwitchTurn
+	call UpdateUserInParty
+
+; 'regained health!'
+	ld hl, RegainedHealthText
+	jp StdBattleTextBox
+
+.Full:
+	call AnimateFailedMove
+
+; 'hp is full!'
+	ld hl, HPIsFullText
+	jp StdBattleTextBox
+
+.Multipliers:
+	dw GetEighthMaxHP
+	dw GetQuarterMaxHP
+	dw GetHalfMaxHP
+	dw GetMaxHP
+; 37be8
+
+
+BattleCommand_HiddenPower: ; 37be8
+; hiddenpower
+
+	ld a, [AttackMissed]
+	and a
+	ret nz
+	farcall HiddenPowerDamage
+	ret
+
+; 37bf4
+
+
+BattleCommand_StartRain: ; 37bf4
+; startrain
+	ld a, WEATHER_RAIN
+	ld [Weather], a
+	ld a, 5
+	ld [WeatherCount], a
+	call AnimateCurrentMove
+	ld hl, DownpourText
+	jp StdBattleTextBox
+
+; 37c07
+
+
+BattleCommand_StartSun: ; 37c07
+; startsun
+	ld a, WEATHER_SUN
+	ld [Weather], a
+	ld a, 5
+	ld [WeatherCount], a
+	call AnimateCurrentMove
+	ld hl, SunGotBrightText
+	jp StdBattleTextBox
+
+; 37c1a
+
+
+BattleCommand_BellyDrum: ; 37c1a
+; bellydrum
+; This command is buggy because it raises the user's attack
+; before checking that it has enough HP to use the move.
+; Swap the order of these two blocks to fix.
+	call BattleCommand_AttackUp2
+	ld a, [AttackMissed]
+	and a
+	jr nz, .failed
+
+	callfar GetHalfMaxHP
+	callfar CheckUserHasEnoughHP
+	jr nc, .failed
+
+	push bc
+	call AnimateCurrentMove
+	pop bc
+	callfar SubtractHPFromUser
+	call UpdateUserInParty
+	ld a, 5
+
+.max_attack_loop
+	push af
+	call BattleCommand_AttackUp2
+	pop af
+	dec a
+	jr nz, .max_attack_loop
+
+	ld hl, BellyDrumText
+	jp StdBattleTextBox
+
+.failed
+	call AnimateFailedMove
+	jp PrintButItFailed
+
+; 37c55
+
+
+BattleCommand_PsychUp: ; 37c55
+; psychup
+
+	ld hl, EnemyStatLevels
+	ld de, PlayerStatLevels
+	ld a, [hBattleTurn]
+	and a
+	jr z, .pointers_correct
+; It's the enemy's turn, so swap the pointers.
+	push hl
+	ld h, d
+	ld l, e
+	pop de
+.pointers_correct
+	push hl
+	ld b, NUM_LEVEL_STATS
+; If any of the enemy's stats is modified from its base level,
+; the move succeeds.  Otherwise, it fails.
+.loop
+	ld a, [hli]
+	cp BASE_STAT_LEVEL
+	jr nz, .break
+	dec b
+	jr nz, .loop
+	pop hl
+	call AnimateFailedMove
+	jp PrintButItFailed
+
+.break
+	pop hl
+	ld b, NUM_LEVEL_STATS
+.loop2
+	ld a, [hli]
+	ld [de], a
+	inc de
+	dec b
+	jr nz, .loop2
+	ld a, [hBattleTurn]
+	and a
+	jr nz, .calc_enemy_stats
+	call CalcPlayerStats
+	jr .merge
+
+.calc_enemy_stats
+	call CalcEnemyStats
+.merge
+	call AnimateCurrentMove
+	ld hl, CopiedStatsText
+	jp StdBattleTextBox
+
+; 37c95
+
+
+BattleCommand_MirrorCoat: ; 37c95
+; mirrorcoat
+
+	ld a, 1
+	ld [AttackMissed], a
+
+	ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
+	call GetBattleVar
+	and a
+	ret z
+
+	ld b, a
+	callfar GetMoveEffect
+	ld a, b
+	cp EFFECT_MIRROR_COAT
+	ret z
+
+	call BattleCommand_ResetTypeMatchup
+	ld a, [wTypeMatchup]
+	and a
+	ret z
+
+	call CheckOpponentWentFirst
+	ret z
+
+	ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
+	call GetBattleVar
+	dec a
+	ld de, StringBuffer1
+	call GetMoveData
+
+	ld a, [StringBuffer1 + 2]
+	and a
+	ret z
+
+	ld a, [StringBuffer1 + 3]
+	cp SPECIAL
+	ret c
+
+	ld hl, CurDamage
+	ld a, [hli]
+	or [hl]
+	ret z
+
+	ld a, [hl]
+	add a
+	ld [hld], a
+	ld a, [hl]
+	adc a
+	ld [hl], a
+	jr nc, .capped
+	ld a, $ff
+	ld [hli], a
+	ld [hl], a
+.capped
+
+	xor a
+	ld [AttackMissed], a
+	ret
+
+; 37ce6
+
+
+BattleCommand_DoubleMinimizeDamage: ; 37ce6
+; doubleminimizedamage
+
+	ld hl, wEnemyMinimized
+	ld a, [hBattleTurn]
+	and a
+	jr z, .ok
+	ld hl, wPlayerMinimized
+.ok
+	ld a, [hl]
+	and a
+	ret z
+	ld hl, CurDamage + 1
+	sla [hl]
+	dec hl
+	rl [hl]
+	ret nc
+	ld a, $ff
+	ld [hli], a
+	ld [hl], a
+	ret
+
+; 37d02
+
+
+BattleCommand_SkipSunCharge: ; 37d02
+; mimicsuncharge
+	ld a, [Weather]
+	cp WEATHER_SUN
+	ret nz
+	ld b, charge_command
+	jp SkipToBattleCommand
+
+; 37d0d
+
+
+BattleCommand_CheckFutureSight: ; 37d0d
+; checkfuturesight
+
+	ld hl, wPlayerFutureSightCount
+	ld de, wPlayerFutureSightDamage
+	ld a, [hBattleTurn]
+	and a
+	jr z, .ok
+	ld hl, wEnemyFutureSightCount
+	ld de, wEnemyFutureSightDamage
+.ok
+
+	ld a, [hl]
+	and a
+	ret z
+	cp 1
+	ret nz
+
+	ld [hl], 0
+	ld a, [de]
+	inc de
+	ld [CurDamage], a
+	ld a, [de]
+	ld [CurDamage + 1], a
+	ld b, futuresight_command
+	jp SkipToBattleCommand
+
+; 37d34
+
+BattleCommand_FutureSight: ; 37d34
+; futuresight
+
+	call CheckUserIsCharging
+	jr nz, .AlreadyChargingFutureSight
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call GetBattleVar
+	ld b, a
+	ld a, BATTLE_VARS_LAST_COUNTER_MOVE
+	call GetBattleVarAddr
+	ld [hl], b
+	ld a, BATTLE_VARS_LAST_MOVE
+	call GetBattleVarAddr
+	ld [hl], b
+.AlreadyChargingFutureSight:
+	ld hl, wPlayerFutureSightCount
+	ld a, [hBattleTurn]
+	and a
+	jr z, .GotFutureSightCount
+	ld hl, wEnemyFutureSightCount
+.GotFutureSightCount:
+	ld a, [hl]
+	and a
+	jr nz, .failed
+	ld a, 4
+	ld [hl], a
+	call BattleCommand_LowerSub
+	call BattleCommand_MoveDelay
+	ld hl, ForesawAttackText
+	call StdBattleTextBox
+	call BattleCommand_RaiseSub
+	ld de, wPlayerFutureSightDamage
+	ld a, [hBattleTurn]
+	and a
+	jr z, .StoreDamage
+	ld de, wEnemyFutureSightDamage
+.StoreDamage:
+	ld hl, CurDamage
+	ld a, [hl]
+	ld [de], a
+	ld [hl], 0
+	inc hl
+	inc de
+	ld a, [hl]
+	ld [de], a
+	ld [hl], 0
+	jp EndMoveEffect
+
+.failed
+	pop bc
+	call ResetDamage
+	call AnimateFailedMove
+	call PrintButItFailed
+	jp EndMoveEffect
+
+; 37d94
+
+
+BattleCommand_ThunderAccuracy: ; 37d94
+; thunderaccuracy
+
+	ld a, BATTLE_VARS_MOVE_TYPE
+	call GetBattleVarAddr
+	inc hl
+	ld a, [Weather]
+	cp WEATHER_RAIN
+	jr z, .rain
+	cp WEATHER_SUN
+	ret nz
+	ld [hl], 50 percent + 1
+	ret
+
+.rain
+	; Redundant with CheckHit guranteeing hit
+	ld [hl], 100 percent
+	ret
+
+; 37daa
+
+
+CheckHiddenOpponent: ; 37daa
+; BUG: This routine should account for Lock-On and Mind Reader.
+	ld a, BATTLE_VARS_SUBSTATUS3_OPP
+	call GetBattleVar
+	and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
+	ret
+
+; 37db2
+
+
+GetUserItem: ; 37db2
+; Return the effect of the user's item in bc, and its id at hl.
+	ld hl, BattleMonItem
+	ld a, [hBattleTurn]
+	and a
+	jr z, .go
+	ld hl, EnemyMonItem
+.go
+	ld b, [hl]
+	jp GetItemHeldEffect
+
+; 37dc1
+
+
+GetOpponentItem: ; 37dc1
+; Return the effect of the opponent's item in bc, and its id at hl.
+	ld hl, EnemyMonItem
+	ld a, [hBattleTurn]
+	and a
+	jr z, .go
+	ld hl, BattleMonItem
+.go
+	ld b, [hl]
+	jp GetItemHeldEffect
+
+; 37dd0
+
+
+GetItemHeldEffect: ; 37dd0
+; Return the effect of item b in bc.
+	ld a, b
+	and a
+	ret z
+
+	push hl
+	ld hl, ItemAttributes + ITEMATTR_EFFECT
+	dec a
+	ld c, a
+	ld b, 0
+	ld a, ITEMATTR_STRUCT_LENGTH
+	call AddNTimes
+	ld a, BANK(ItemAttributes)
+	call GetFarHalfword
+	ld b, l
+	ld c, h
+	pop hl
+	ret
+
+; 37de9
+
+
+AnimateCurrentMoveEitherSide: ; 37de9
+	push hl
+	push de
+	push bc
+	ld a, [wKickCounter]
+	push af
+	call BattleCommand_LowerSub
+	pop af
+	ld [wKickCounter], a
+	call PlayDamageAnim
+	call BattleCommand_RaiseSub
+	pop bc
+	pop de
+	pop hl
+	ret
+
+; 37e01
+
+
+AnimateCurrentMove: ; 37e01
+	push hl
+	push de
+	push bc
+	ld a, [wKickCounter]
+	push af
+	call BattleCommand_LowerSub
+	pop af
+	ld [wKickCounter], a
+	call LoadMoveAnim
+	call BattleCommand_RaiseSub
+	pop bc
+	pop de
+	pop hl
+	ret
+
+; 37e19
+
+
+PlayDamageAnim: ; 37e19
+	xor a
+	ld [FXAnimID + 1], a
+
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call GetBattleVar
+	and a
+	ret z
+
+	ld [FXAnimID], a
+
+	ld a, [hBattleTurn]
+	and a
+	ld a, BATTLEANIM_ENEMY_DAMAGE
+	jr z, .player
+	ld a, BATTLEANIM_PLAYER_DAMAGE
+
+.player
+	ld [wNumHits], a
+
+	jp PlayUserBattleAnim
+
+; 37e36
+
+
+LoadMoveAnim: ; 37e36
+	xor a
+	ld [wNumHits], a
+	ld [FXAnimID + 1], a
+
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call GetBattleVar
+	and a
+	ret z
+
+	; fallthrough
+; 37e44
+
+
+LoadAnim: ; 37e44
+
+	ld [FXAnimID], a
+
+	; fallthrough
+; 37e47
+
+
+PlayUserBattleAnim: ; 37e47
+	push hl
+	push de
+	push bc
+	callfar PlayBattleAnim
+	pop bc
+	pop de
+	pop hl
+	ret
+
+; 37e54
+
+
+PlayOpponentBattleAnim: ; 37e54
+	ld a, e
+	ld [FXAnimID], a
+	ld a, d
+	ld [FXAnimID + 1], a
+	xor a
+	ld [wNumHits], a
+
+	push hl
+	push de
+	push bc
+	call BattleCommand_SwitchTurn
+
+	callfar PlayBattleAnim
+
+	call BattleCommand_SwitchTurn
+	pop bc
+	pop de
+	pop hl
+	ret
+
+; 37e73
+
+
+CallBattleCore: ; 37e73
+	ld a, BANK(BattleCore)
+	rst FarCall
+	ret
+
+; 37e77
+
+
+AnimateFailedMove: ; 37e77
+	call BattleCommand_LowerSub
+	call BattleCommand_MoveDelay
+	jp BattleCommand_RaiseSub
+
+; 37e80
+
+
+BattleCommand_MoveDelay: ; 37e80
+; movedelay
+; Wait 40 frames.
+	ld c, 40
+	jp DelayFrames
+
+; 37e85
+
+
+BattleCommand_ClearText: ; 37e85
+; cleartext
+
+; Used in multi-hit moves.
+	ld hl, .text
+	jp BattleTextBox
+
+.text
+	db "@"
+; 37e8c
+
+
+SkipToBattleCommand: ; 37e8c
+; Skip over commands until reaching command b.
+	ld a, [BattleScriptBufferAddress + 1]
+	ld h, a
+	ld a, [BattleScriptBufferAddress]
+	ld l, a
+.loop
+	ld a, [hli]
+	cp b
+	jr nz, .loop
+
+	ld a, h
+	ld [BattleScriptBufferAddress + 1], a
+	ld a, l
+	ld [BattleScriptBufferAddress], a
+	ret
+
+; 37ea1
+
+
+GetMoveAttr: ; 37ea1
+; Assuming hl = Moves + x, return attribute x of move a.
+	push bc
+	ld bc, MOVE_LENGTH
+	call AddNTimes
+	call GetMoveByte
+	pop bc
+	ret
+
+; 37ead
+
+
+GetMoveData: ; 37ead
+; Copy move struct a to de.
+	ld hl, Moves
+	ld bc, MOVE_LENGTH
+	call AddNTimes
+	ld a, Bank(Moves)
+	jp FarCopyBytes
+
+; 37ebb
+
+
+GetMoveByte: ; 37ebb
+	ld a, BANK(Moves)
+	jp GetFarByte
+
+; 37ec0
+
+
+DisappearUser: ; 37ec0
+	farcall _DisappearUser
+	ret
+
+; 37ec7
+
+
+AppearUserLowerSub: ; 37ec7
+	farcall _AppearUserLowerSub
+	ret
+
+; 37ece
+
+
+AppearUserRaiseSub: ; 37ece
+	farcall _AppearUserRaiseSub
+	ret
+
+; 37ed5
+
+
+_CheckBattleScene: ; 37ed5
+; Checks the options.  Returns carry if battle animations are disabled.
+	push hl
+	push de
+	push bc
+	farcall CheckBattleScene
+	pop bc
+	pop de
+	pop hl
+	ret
+
+; 37ee2
--- /dev/null
+++ b/engine/battle/effect_commands/attract.asm
@@ -1,0 +1,79 @@
+BattleCommand_Attract: ; 377ce
+; attract
+	ld a, [AttackMissed]
+	and a
+	jr nz, .failed
+	call CheckOppositeGender
+	jr c, .failed
+	call CheckHiddenOpponent
+	jr nz, .failed
+	ld a, BATTLE_VARS_SUBSTATUS1_OPP
+	call GetBattleVarAddr
+	bit SUBSTATUS_IN_LOVE, [hl]
+	jr nz, .failed
+
+	set SUBSTATUS_IN_LOVE, [hl]
+	call AnimateCurrentMove
+
+; 'fell in love!'
+	ld hl, FellInLoveText
+	jp StdBattleTextBox
+
+.failed
+	jp FailAttract
+; 377f5
+
+
+CheckOppositeGender: ; 377f5
+	ld a, MON_SPECIES
+	call BattlePartyAttr
+	ld a, [hl]
+	ld [CurPartySpecies], a
+
+	ld a, [CurBattleMon]
+	ld [CurPartyMon], a
+	xor a
+	ld [MonType], a
+
+	farcall GetGender
+	jr c, .genderless_samegender
+
+	ld b, 1
+	jr nz, .got_gender
+	dec b
+
+.got_gender
+	push bc
+	ld a, [TempEnemyMonSpecies]
+	ld [CurPartySpecies], a
+	ld hl, EnemyMonDVs
+	ld a, [EnemySubStatus5]
+	bit SUBSTATUS_TRANSFORMED, a
+	jr z, .not_transformed
+	ld hl, wEnemyBackupDVs
+.not_transformed
+	ld a, [hli]
+	ld [TempMonDVs], a
+	ld a, [hl]
+	ld [TempMonDVs + 1], a
+	ld a, 3
+	ld [MonType], a
+	farcall GetGender
+	pop bc
+	jr c, .genderless_samegender
+
+	ld a, 1
+	jr nz, .got_enemy_gender
+	dec a
+
+.got_enemy_gender
+	xor b
+	jr z, .genderless_samegender
+
+	and a
+	ret
+
+.genderless_samegender
+	scf
+	ret
+; 3784b
--- /dev/null
+++ b/engine/battle/effect_commands/curse.asm
@@ -1,0 +1,97 @@
+BattleCommand_Curse: ; 37588
+; curse
+
+	ld de, BattleMonType1
+	ld bc, PlayerStatLevels
+	ld a, [hBattleTurn]
+	and a
+	jr z, .go
+	ld de, EnemyMonType1
+	ld bc, EnemyStatLevels
+
+.go
+
+; Curse is different for Ghost-types.
+
+	ld a, [de]
+	cp GHOST
+	jr z, .ghost
+	inc de
+	ld a, [de]
+	cp GHOST
+	jr z, .ghost
+
+
+; If no stats can be increased, don't.
+
+; Attack
+	ld a, [bc]
+	cp MAX_STAT_LEVEL
+	jr c, .raise
+
+; Defense
+	inc bc
+	ld a, [bc]
+	cp MAX_STAT_LEVEL
+	jr nc, .cantraise
+
+.raise
+
+; Raise Attack and Defense, and lower Speed.
+
+	ld a, $1
+	ld [wKickCounter], a
+	call AnimateCurrentMove
+	ld a, SPEED
+	call LowerStat
+	call BattleCommand_SwitchTurn
+	call BattleCommand_StatDownMessage
+	call ResetMiss
+	call BattleCommand_SwitchTurn
+	call BattleCommand_AttackUp
+	call BattleCommand_StatUpMessage
+	call ResetMiss
+	call BattleCommand_DefenseUp
+	jp BattleCommand_StatUpMessage
+
+
+.ghost
+
+; Cut HP in half and put a curse on the opponent.
+
+	call CheckHiddenOpponent
+	jr nz, .failed
+
+	call CheckSubstituteOpp
+	jr nz, .failed
+
+	ld a, BATTLE_VARS_SUBSTATUS1_OPP
+	call GetBattleVarAddr
+	bit SUBSTATUS_CURSE, [hl]
+	jr nz, .failed
+
+	set SUBSTATUS_CURSE, [hl]
+	call AnimateCurrentMove
+	ld hl, GetHalfMaxHP
+	call CallBattleCore
+	ld hl, SubtractHPFromUser
+	call CallBattleCore
+	call UpdateUserInParty
+	ld hl, PutACurseText
+	jp StdBattleTextBox
+
+.failed
+	call AnimateFailedMove
+	jp PrintButItFailed
+
+
+.cantraise
+
+; Can't raise either stat.
+
+	ld b, ABILITY + 1
+	call GetStatName
+	call AnimateFailedMove
+	ld hl, WontRiseAnymoreText
+	jp StdBattleTextBox
+; 37618
--- /dev/null
+++ b/engine/battle/effect_commands/endure.asm
@@ -1,0 +1,17 @@
+BattleCommand_Endure: ; 3766f
+; endure
+
+; Endure shares code with Protect. See protect.asm.
+
+	call ProtectChance
+	ret c
+
+	ld a, BATTLE_VARS_SUBSTATUS1
+	call GetBattleVarAddr
+	set SUBSTATUS_ENDURE, [hl]
+
+	call AnimateCurrentMove
+
+	ld hl, BracedItselfText
+	jp StdBattleTextBox
+; 37683
--- /dev/null
+++ b/engine/battle/effect_commands/foresight.asm
@@ -1,0 +1,23 @@
+BattleCommand_Foresight: ; 376a0
+; foresight
+
+	ld a, [AttackMissed]
+	and a
+	jr nz, .failed
+
+	call CheckHiddenOpponent
+	jr nz, .failed
+
+	ld a, BATTLE_VARS_SUBSTATUS1_OPP
+	call GetBattleVarAddr
+	bit SUBSTATUS_IDENTIFIED, [hl]
+	jr nz, .failed
+
+	set SUBSTATUS_IDENTIFIED, [hl]
+	call AnimateCurrentMove
+	ld hl, IdentifiedText
+	jp StdBattleTextBox
+
+.failed
+	jp FailForesight
+; 376c2
--- /dev/null
+++ b/engine/battle/effect_commands/metronome.asm
@@ -1,0 +1,61 @@
+BattleCommand_Metronome: ; 37418
+; metronome
+
+	call ClearLastMove
+	call CheckUserIsCharging
+	jr nz, .asm_3742b
+
+	ld a, [wKickCounter]
+	push af
+	call BattleCommand_LowerSub
+	pop af
+	ld [wKickCounter], a
+
+.asm_3742b
+	call LoadMoveAnim
+
+.GetMove:
+	call BattleRandom
+
+; No invalid moves.
+	cp NUM_ATTACKS + 1
+	jr nc, .GetMove
+
+; None of the moves in MetronomeExcepts.
+	push af
+	ld de, 1
+	ld hl, MetronomeExcepts
+	call IsInArray
+	pop bc
+	jr c, .GetMove
+
+; No moves the user already has.
+	ld a, b
+	call CheckUserMove
+	jr z, .GetMove
+
+
+	ld a, BATTLE_VARS_MOVE
+	call GetBattleVarAddr
+	ld [hl], b
+	call UpdateMoveData
+	jp ResetTurn
+; 37454
+
+
+MetronomeExcepts: ; 37454
+	db NO_MOVE
+	db METRONOME
+	db STRUGGLE
+	db SKETCH
+	db MIMIC
+	db COUNTER
+	db MIRROR_COAT
+	db PROTECT
+	db DETECT
+	db ENDURE
+	db DESTINY_BOND
+	db SLEEP_TALK
+	db THIEF
+	db -1
+; 37462
--- /dev/null
+++ b/engine/battle/effect_commands/mirror_move.asm
@@ -1,0 +1,52 @@
+BattleCommand_MirrorMove: ; 373c9
+; mirrormove
+
+	call ClearLastMove
+
+	ld a, BATTLE_VARS_MOVE
+	call GetBattleVarAddr
+
+	ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
+	call GetBattleVar
+	and a
+	jr z, .failed
+
+	call CheckUserMove
+	jr nz, .use
+
+.failed
+	call AnimateFailedMove
+
+	ld hl, MirrorMoveFailedText
+	call StdBattleTextBox
+	jp EndMoveEffect
+
+.use
+	ld a, b
+	ld [hl], a
+	ld [wd265], a
+
+	push af
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call GetBattleVarAddr
+	ld d, h
+	ld e, l
+	pop af
+
+	dec a
+	call GetMoveData
+	call GetMoveName
+	call CopyName1
+	call CheckUserIsCharging
+	jr nz, .done
+
+	ld a, [wKickCounter]
+	push af
+	call BattleCommand_LowerSub
+	pop af
+	ld [wKickCounter], a
+
+.done
+	call BattleCommand_MoveDelay
+	jp ResetTurn
+; 37418
--- /dev/null
+++ b/engine/battle/effect_commands/nightmare.asm
@@ -1,0 +1,38 @@
+BattleCommand_Nightmare: ; 37536
+; nightmare
+
+; Can't hit an absent opponent.
+
+	call CheckHiddenOpponent
+	jr nz, .failed
+
+; Can't hit a substitute.
+
+	call CheckSubstituteOpp
+	jr nz, .failed
+
+; Only works on a sleeping opponent.
+
+	ld a, BATTLE_VARS_STATUS_OPP
+	call GetBattleVarAddr
+	and SLP
+	jr z, .failed
+
+; Bail if the opponent is already having a nightmare.
+
+	ld a, BATTLE_VARS_SUBSTATUS1_OPP
+	call GetBattleVarAddr
+	bit SUBSTATUS_NIGHTMARE, [hl]
+	jr nz, .failed
+
+; Otherwise give the opponent a nightmare.
+
+	set SUBSTATUS_NIGHTMARE, [hl]
+	call AnimateCurrentMove
+	ld hl, StartedNightmareText
+	jp StdBattleTextBox
+
+.failed
+	call AnimateFailedMove
+	jp PrintButItFailed
+; 37563
--- /dev/null
+++ b/engine/battle/effect_commands/perish_song.asm
@@ -1,0 +1,40 @@
+BattleCommand_PerishSong: ; 376c2
+; perishsong
+
+
+	ld hl, PlayerSubStatus1
+	ld de, EnemySubStatus1
+	bit SUBSTATUS_PERISH, [hl]
+	jr z, .ok
+
+	ld a, [de]
+	bit SUBSTATUS_PERISH, a
+	jr nz, .failed
+
+.ok
+	bit SUBSTATUS_PERISH, [hl]
+	jr nz, .enemy
+
+	set SUBSTATUS_PERISH, [hl]
+	ld a, 4
+	ld [PlayerPerishCount], a
+
+.enemy
+	ld a, [de]
+	bit SUBSTATUS_PERISH, a
+	jr nz, .done
+
+	set SUBSTATUS_PERISH, a
+	ld [de], a
+	ld a, 4
+	ld [EnemyPerishCount], a
+
+.done
+	call AnimateCurrentMove
+	ld hl, StartPerishText
+	jp StdBattleTextBox
+
+.failed
+	call AnimateFailedMove
+	jp PrintButItFailed
+; 376f8
--- /dev/null
+++ b/engine/battle/effect_commands/present.asm
@@ -1,0 +1,93 @@
+BattleCommand_Present: ; 37874
+; present
+
+	ld a, [wLinkMode]
+	cp LINK_COLOSSEUM
+	jr z, .colosseum_skippush
+	push bc
+	push de
+.colosseum_skippush
+
+	call BattleCommand_Stab
+
+	ld a, [wLinkMode]
+	cp LINK_COLOSSEUM
+	jr z, .colosseum_skippop
+	pop de
+	pop bc
+.colosseum_skippop
+
+	ld a, [wTypeMatchup]
+	and a
+	jp z, AnimateFailedMove
+	ld a, [AttackMissed]
+	and a
+	jp nz, AnimateFailedMove
+
+	push bc
+	call BattleRandom
+	ld b, a
+	ld hl, .PresentPower
+	ld c, 0
+.next
+	ld a, [hli]
+	cp $ff
+	jr z, .heal_effect ; 378a4 $11
+	cp b
+	jr nc, .got_power ; 378a7 $4
+	inc c
+	inc hl
+	jr .next ; 378ab $f4
+
+.got_power
+	ld a, c
+	ld [wPresentPower], a
+	call AnimateCurrentMoveEitherSide
+	ld d, [hl]
+	pop bc
+	ret
+
+.heal_effect
+	pop bc
+	ld a, $3
+	ld [wPresentPower], a
+	call AnimateCurrentMove
+	call BattleCommand_SwitchTurn
+	ld hl, AICheckPlayerMaxHP
+	ld a, [hBattleTurn]
+	and a
+	jr z, .got_hp_fn_pointer ; 378c9 $3
+	ld hl, AICheckEnemyMaxHP
+.got_hp_fn_pointer
+	ld a, BANK(AICheckPlayerMaxHP)
+	rst FarCall
+	jr c, .already_fully_healed ; 378d1 $20
+
+	ld hl, GetQuarterMaxHP
+	call CallBattleCore
+	call BattleCommand_SwitchTurn
+	ld hl, RestoreHP
+	call CallBattleCore
+	call BattleCommand_SwitchTurn
+	ld hl, RegainedHealthText
+	call StdBattleTextBox
+	call BattleCommand_SwitchTurn
+	call UpdateOpponentInParty
+	jr .do_animation ; 378f1 $11
+
+.already_fully_healed
+	call BattleCommand_SwitchTurn
+	call _CheckBattleScene
+	jr nc, .do_animation ; 378f9 $9
+	call AnimateFailedMove
+	ld hl, RefusedGiftText
+	call StdBattleTextBox
+.do_animation
+	jp EndMoveEffect
+
+.PresentPower:
+	db 40 percent,     40
+	db 70 percent + 1, 80
+	db 80 percent,    120
+	db $ff
+; 3790e
--- /dev/null
+++ b/engine/battle/effect_commands/protect.asm
@@ -1,0 +1,80 @@
+BattleCommand_Protect: ; 37618
+; protect
+	call ProtectChance
+	ret c
+
+	ld a, BATTLE_VARS_SUBSTATUS1
+	call GetBattleVarAddr
+	set SUBSTATUS_PROTECT, [hl]
+
+	call AnimateCurrentMove
+
+	ld hl, ProtectedItselfText
+	jp StdBattleTextBox
+; 3762c
+
+
+ProtectChance: ; 3762c
+
+	ld de, PlayerProtectCount
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_37637
+	ld de, EnemyProtectCount
+.asm_37637
+
+	call CheckOpponentWentFirst
+	jr nz, .failed
+
+; Can't have a substitute.
+
+	ld a, BATTLE_VARS_SUBSTATUS4
+	call GetBattleVar
+	bit SUBSTATUS_SUBSTITUTE, a
+	jr nz, .failed
+
+; Halve the chance of a successful Protect for each consecutive use.
+
+	ld b, $ff
+	ld a, [de]
+	ld c, a
+.loop
+	ld a, c
+	and a
+	jr z, .done
+	dec c
+
+	srl b
+	ld a, b
+	and a
+	jr nz, .loop
+	jr .failed
+.done
+
+.rand
+	call BattleRandom
+	and a
+	jr z, .rand
+
+	dec a
+	cp b
+	jr nc, .failed
+
+; Another consecutive Protect use.
+
+	ld a, [de]
+	inc a
+	ld [de], a
+
+	and a
+	ret
+
+
+.failed
+	xor a
+	ld [de], a
+	call AnimateFailedMove
+	call PrintButItFailed
+	scf
+	ret
+; 3766f
--- /dev/null
+++ b/engine/battle/effect_commands/rollout.asm
@@ -1,0 +1,99 @@
+MAX_ROLLOUT_COUNT EQU 5
+
+
+BattleCommand_CheckCurl: ; 37718
+; checkcurl
+
+	ld de, PlayerRolloutCount
+	ld a, [hBattleTurn]
+	and a
+	jr z, .ok
+	ld de, EnemyRolloutCount
+.ok
+	ld a, BATTLE_VARS_SUBSTATUS1
+	call GetBattleVar
+	bit SUBSTATUS_ROLLOUT, a
+	jr z, .reset
+
+	ld b, $4 ; doturn
+	jp SkipToBattleCommand
+
+.reset
+	xor a
+	ld [de], a
+	ret
+; 37734
+
+
+BattleCommand_RolloutPower: ; 37734
+; rolloutpower
+
+	ld a, BATTLE_VARS_STATUS
+	call GetBattleVar
+	and SLP
+	ret nz
+
+	ld hl, PlayerRolloutCount
+	ld a, [hBattleTurn]
+	and a
+	jr z, .got_rollout_count
+	ld hl, EnemyRolloutCount
+
+.got_rollout_count
+	ld a, [hl]
+	and a
+	jr nz, .skip_set_rampage
+	ld a, 1
+	ld [wSomeoneIsRampaging], a
+
+.skip_set_rampage
+	ld a, [AttackMissed]
+	and a
+	jr z, .hit
+
+	ld a, BATTLE_VARS_SUBSTATUS1
+	call GetBattleVarAddr
+	res 6, [hl]
+	ret
+
+.hit
+	inc [hl]
+	ld a, [hl]
+	ld b, a
+	cp MAX_ROLLOUT_COUNT
+	jr c, .not_done_with_rollout
+
+	ld a, BATTLE_VARS_SUBSTATUS1
+	call GetBattleVarAddr
+	res SUBSTATUS_ROLLOUT, [hl]
+	jr .done_with_substatus_flag
+
+.not_done_with_rollout
+	ld a, BATTLE_VARS_SUBSTATUS1
+	call GetBattleVarAddr
+	set SUBSTATUS_ROLLOUT, [hl]
+
+.done_with_substatus_flag
+	ld a, BATTLE_VARS_SUBSTATUS2
+	call GetBattleVar
+	bit SUBSTATUS_CURLED, a
+	jr z, .not_curled
+	inc b
+.not_curled
+.loop
+	dec b
+	jr z, .done_damage
+
+	ld hl, CurDamage + 1
+	sla [hl]
+	dec hl
+	rl [hl]
+	jr nc, .loop
+
+	ld a, $ff
+	ld [hli], a
+	ld [hl], a
+
+.done_damage
+	ret
+; 37791
--- /dev/null
+++ b/engine/battle/effect_commands/sandstorm.asm
@@ -1,0 +1,19 @@
+BattleCommand_StartSandstorm: ; 376f8
+; startsandstorm
+
+	ld a, [Weather]
+	cp WEATHER_SANDSTORM
+	jr z, .failed
+
+	ld a, WEATHER_SANDSTORM
+	ld [Weather], a
+	ld a, 5
+	ld [WeatherCount], a
+	call AnimateCurrentMove
+	ld hl, SandstormBrewedText
+	jp StdBattleTextBox
+
+.failed
+	call AnimateFailedMove
+	jp PrintButItFailed
+; 37718
--- /dev/null
+++ b/engine/battle/effect_commands/spikes.asm
@@ -1,0 +1,27 @@
+BattleCommand_Spikes: ; 37683
+; spikes
+
+	ld hl, EnemyScreens
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_3768e
+	ld hl, PlayerScreens
+.asm_3768e
+
+; Fails if spikes are already down!
+
+	bit SCREENS_SPIKES, [hl]
+	jr nz, .failed
+
+; Nothing else stops it from working.
+
+	set SCREENS_SPIKES, [hl]
+
+	call AnimateCurrentMove
+
+	ld hl, SpikesText
+	jp StdBattleTextBox
+
+.failed
+	jp FailSpikes
+; 376a0
--- /dev/null
+++ b/engine/battle/effect_commands/thief.asm
@@ -1,0 +1,116 @@
+BattleCommand_Thief: ; 37492
+; thief
+
+	ld a, [hBattleTurn]
+	and a
+	jr nz, .enemy
+
+; The player needs to be able to steal an item.
+
+	call .playeritem
+	ld a, [hl]
+	and a
+	ret nz
+
+; The enemy needs to have an item to steal.
+
+	call .enemyitem
+	ld a, [hl]
+	and a
+	ret z
+
+; Can't steal mail.
+
+	ld [wd265], a
+	ld d, a
+	farcall ItemIsMail
+	ret c
+
+	ld a, [EffectFailed]
+	and a
+	ret nz
+
+	ld a, [wLinkMode]
+	and a
+	jr z, .stealenemyitem
+
+	ld a, [wBattleMode]
+	dec a
+	ret z
+
+.stealenemyitem
+	call .enemyitem
+	xor a
+	ld [hl], a
+	ld [de], a
+
+	call .playeritem
+	ld a, [wd265]
+	ld [hl], a
+	ld [de], a
+	jr .stole
+
+
+.enemy
+
+; The enemy can't already have an item.
+
+	call .enemyitem
+	ld a, [hl]
+	and a
+	ret nz
+
+; The player must have an item to steal.
+
+	call .playeritem
+	ld a, [hl]
+	and a
+	ret z
+
+; Can't steal mail!
+
+	ld [wd265], a
+	ld d, a
+	farcall ItemIsMail
+	ret c
+
+	ld a, [EffectFailed]
+	and a
+	ret nz
+
+; If the enemy steals your item,
+; it's gone for good if you don't get it back.
+
+	call .playeritem
+	xor a
+	ld [hl], a
+	ld [de], a
+
+	call .enemyitem
+	ld a, [wd265]
+	ld [hl], a
+	ld [de], a
+
+
+.stole
+	call GetItemName
+	ld hl, StoleText
+	jp StdBattleTextBox
+
+
+.playeritem
+	ld a, 1
+	call BattlePartyAttr
+	ld d, h
+	ld e, l
+	ld hl, BattleMonItem
+	ret
+
+.enemyitem
+	ld a, 1
+	call OTPartyAttr
+	ld d, h
+	ld e, l
+	ld hl, EnemyMonItem
+	ret
+; 37517
--- /dev/null
+++ b/engine/battle/effect_commands/transform.asm
@@ -1,0 +1,141 @@
+
+BattleCommand_Transform: ; 371cd
+; transform
+
+	call ClearLastMove
+	ld a, BATTLE_VARS_SUBSTATUS5_OPP
+	call GetBattleVarAddr
+	bit SUBSTATUS_TRANSFORMED, [hl]
+	jp nz, BattleEffect_ButItFailed
+	call CheckHiddenOpponent
+	jp nz, BattleEffect_ButItFailed
+	xor a
+	ld [wNumHits], a
+	ld [FXAnimID + 1], a
+	ld a, $1
+	ld [wKickCounter], a
+	ld a, BATTLE_VARS_SUBSTATUS4
+	call GetBattleVarAddr
+	bit SUBSTATUS_SUBSTITUTE, [hl]
+	push af
+	jr z, .mimic_substitute
+	call CheckUserIsCharging
+	jr nz, .mimic_substitute
+	ld a, SUBSTITUTE
+	call LoadAnim
+.mimic_substitute
+	ld a, BATTLE_VARS_SUBSTATUS5
+	call GetBattleVarAddr
+	set SUBSTATUS_TRANSFORMED, [hl]
+	call ResetActorDisable
+	ld hl, BattleMonSpecies
+	ld de, EnemyMonSpecies
+	ld a, [hBattleTurn]
+	and a
+	jr nz, .got_mon_species
+	ld hl, EnemyMonSpecies
+	ld de, BattleMonSpecies
+	xor a
+	ld [CurMoveNum], a
+.got_mon_species
+	push hl
+	ld a, [hli]
+	ld [de], a
+	inc hl
+	inc de
+	inc de
+	ld bc, NUM_MOVES
+	call CopyBytes
+	ld a, [hBattleTurn]
+	and a
+	jr z, .mimic_enemy_backup
+	ld a, [de]
+	ld [wEnemyBackupDVs], a
+	inc de
+	ld a, [de]
+	ld [wEnemyBackupDVs + 1], a
+	dec de
+.mimic_enemy_backup
+; copy DVs
+	ld a, [hli]
+	ld [de], a
+	inc de
+	ld a, [hli]
+	ld [de], a
+	inc de
+; move pointer to stats
+	ld bc, BattleMonStats - BattleMonPP
+	add hl, bc
+	push hl
+	ld h, d
+	ld l, e
+	add hl, bc
+	ld d, h
+	ld e, l
+	pop hl
+	ld bc, BattleMonStructEnd - BattleMonStats
+	call CopyBytes
+; init the power points
+	ld bc, BattleMonMoves - BattleMonStructEnd
+	add hl, bc
+	push de
+	ld d, h
+	ld e, l
+	pop hl
+	ld bc, BattleMonPP - BattleMonStructEnd
+	add hl, bc
+	ld b, NUM_MOVES
+.pp_loop
+	ld a, [de]
+	inc de
+	and a
+	jr z, .done_move
+	cp SKETCH
+	ld a, 1
+	jr z, .done_move
+	ld a, 5
+.done_move
+	ld [hli], a
+	dec b
+	jr nz, .pp_loop
+	pop hl
+	ld a, [hl]
+	ld [wNamedObjectIndexBuffer], a
+	call GetPokemonName
+	ld hl, EnemyStats
+	ld de, PlayerStats
+	ld bc, 2 * 5
+	call BattleSideCopy
+	ld hl, EnemyStatLevels
+	ld de, PlayerStatLevels
+	ld bc, 8
+	call BattleSideCopy
+	call _CheckBattleScene
+	jr c, .mimic_anims
+	ld a, [hBattleTurn]
+	and a
+	ld a, [wPlayerMinimized]
+	jr z, .got_byte
+	ld a, [wEnemyMinimized]
+.got_byte
+	and a
+	jr nz, .mimic_anims
+	call LoadMoveAnim
+	jr .after_anim
+
+.mimic_anims
+	call BattleCommand_MoveDelay
+	call BattleCommand_RaiseSubNoAnim
+.after_anim
+	xor a
+	ld [wNumHits], a
+	ld [FXAnimID + 1], a
+	ld a, $2
+	ld [wKickCounter], a
+	pop af
+	ld a, SUBSTITUTE
+	call nz, LoadAnim
+	ld hl, TransformedText
+	jp StdBattleTextBox
+
+; 372c6
--- /dev/null
+++ b/engine/battle/hidden_power.asm
@@ -1,0 +1,111 @@
+HiddenPowerDamage: ; fbced
+; Override Hidden Power's type and power based on the user's DVs.
+
+	ld hl, BattleMonDVs
+	ld a, [hBattleTurn]
+	and a
+	jr z, .got_dvs
+	ld hl, EnemyMonDVs
+.got_dvs
+
+
+; Power:
+
+; Take the top bit from each stat
+
+	; Attack
+	ld a, [hl]
+	swap a
+	and 8
+
+	; Defense
+	ld b, a
+	ld a, [hli]
+	and 8
+	srl a
+	or b
+
+	; Speed
+	ld b, a
+	ld a, [hl]
+	swap a
+	and 8
+	srl a
+	srl a
+	or b
+
+	; Special
+	ld b, a
+	ld a, [hl]
+	and 8
+	srl a
+	srl a
+	srl a
+	or b
+
+; Multiply by 5
+	ld b, a
+	add a
+	add a
+	add b
+
+; Add Special & 3
+	ld b, a
+	ld a, [hld]
+	and 3
+	add b
+
+; Divide by 2 and add 30 + 1
+	srl a
+	add 30
+	inc a
+
+	ld d, a
+
+
+; Type:
+
+	; Def & 3
+	ld a, [hl]
+	and 3
+	ld b, a
+
+	; + (Atk & 3) << 2
+	ld a, [hl]
+	and 3 << 4
+	swap a
+	add a
+	add a
+	or b
+
+; Skip Normal
+	inc a
+
+; Skip Bird
+	cp BIRD
+	jr c, .done
+	inc a
+
+; Skip unused types
+	cp UNUSED_TYPES
+	jr c, .done
+	add SPECIAL - UNUSED_TYPES
+
+.done
+
+; Overwrite the current move type.
+	push af
+	ld a, BATTLE_VARS_MOVE_TYPE
+	call GetBattleVarAddr
+	pop af
+	ld [hl], a
+
+; Get the rest of the damage formula variables
+; based on the new type, but keep base power.
+	ld a, d
+	push af
+	farcall BattleCommand_DamageStats ; damagestats
+	pop af
+	ld d, a
+	ret
+; fbd54
--- /dev/null
+++ b/engine/battle/link_result.asm
@@ -1,0 +1,162 @@
+DetermineLinkBattleResult: ; 2b930
+	farcall UpdateEnemyMonInParty
+	ld hl, PartyMon1HP
+	call .CountMonsRemaining
+	push bc
+	ld hl, OTPartyMon1HP
+	call .CountMonsRemaining
+	ld a, c
+	pop bc
+	cp c
+	jr z, .even_number_of_mons_remaining
+	jr c, .defeat
+	jr .victory
+
+.even_number_of_mons_remaining
+	call .BothSides_CheckNumberMonsAtFullHealth
+	jr z, .drawn
+	ld a, e
+	cp $1
+	jr z, .victory
+	cp $2
+	jr z, .defeat
+	ld hl, PartyMon1HP
+	call .CalcPercentHPRemaining
+	push de
+	ld hl, OTPartyMon1HP
+	call .CalcPercentHPRemaining
+	pop hl
+	ld a, d
+	cp h
+	jr c, .victory
+	jr z, .compare_lo
+	jr .defeat
+
+.compare_lo
+	ld a, e
+	cp l
+	jr z, .drawn
+	jr nc, .defeat
+
+.victory
+	ld a, [wBattleResult]
+	and $f0
+	ld [wBattleResult], a
+	ret
+
+.defeat
+	ld a, [wBattleResult]
+	and $f0
+	add $1
+	ld [wBattleResult], a
+	ret
+
+.drawn
+	ld a, [wBattleResult]
+	and $f0
+	add $2
+	ld [wBattleResult], a
+	ret
+
+.CountMonsRemaining: ; 2b995
+	ld c, 0
+	ld b, 3
+	ld de, PARTYMON_STRUCT_LENGTH - 1
+.loop
+	ld a, [hli]
+	or [hl]
+	jr nz, .not_fainted
+	inc c
+
+.not_fainted
+	add hl, de
+	dec b
+	jr nz, .loop
+	ret
+
+.CalcPercentHPRemaining: ; 2b9a6
+	ld de, 0
+	ld c, $3
+.loop2
+	ld a, [hli]
+	or [hl]
+	jr z, .next
+	dec hl
+	xor a
+	ld [hDividend + 0], a
+	ld a, [hli]
+	ld [hDividend + 1], a
+	ld a, [hli]
+	ld [hDividend + 2], a
+	xor a
+	ld [hDividend + 3], a
+	ld a, [hli]
+	ld b, a
+	ld a, [hld]
+	srl b
+	rr a
+	srl b
+	rr a
+	ld [hDivisor], a
+	ld b, $4
+	call Divide
+	ld a, [hQuotient + 2]
+	add e
+	ld e, a
+	ld a, [hQuotient + 1]
+	adc d
+	ld d, a
+	dec hl
+
+.next
+	push de
+	ld de, $2f
+	add hl, de
+	pop de
+	dec c
+	jr nz, .loop2
+	ret
+
+.BothSides_CheckNumberMonsAtFullHealth: ; 2b9e1
+	ld hl, PartyMon1HP
+	call .CheckFaintedOrFullHealth
+	jr nz, .finish ; we have a pokemon that's neither fainted nor at full health
+	ld hl, OTPartyMon1HP
+	call .CheckFaintedOrFullHealth
+	ld e, $1
+	ret
+
+.finish
+	ld hl, OTPartyMon1HP
+	call .CheckFaintedOrFullHealth
+	ld e, $0
+	ret nz ; we both have pokemon that are neither fainted nor at full health
+	ld e, $2
+	ld a, $1
+	and a
+	ret
+
+.CheckFaintedOrFullHealth: ; 2ba01
+	ld d, 3
+.loop3
+	ld a, [hli]
+	ld b, a
+	ld a, [hli]
+	ld c, a
+	or b
+	jr z, .fainted_or_full_health
+	ld a, [hli]
+	cp b
+	ret nz
+	ld a, [hld]
+	cp c
+	ret nz
+
+.fainted_or_full_health
+	push de
+	ld de, PARTYMON_STRUCT_LENGTH - 2
+	add hl, de
+	pop de
+	dec d
+	jr nz, .loop3
+	ret
--- /dev/null
+++ b/engine/battle/menu.asm
@@ -1,0 +1,118 @@
+LoadBattleMenu: ; 24ef2
+	ld hl, BattleMenuDataHeader
+	call LoadMenuDataHeader
+	ld a, [wBattleMenuCursorBuffer]
+	ld [wMenuCursorBuffer], a
+	call InterpretBattleMenu
+	ld a, [wMenuCursorBuffer]
+	ld [wBattleMenuCursorBuffer], a
+	call ExitMenu
+	ret
+; 24f0b
+
+SafariBattleMenu: ; 24f0b
+; untranslated
+	ld hl, MenuDataHeader_0x24f4e
+	call LoadMenuDataHeader
+	jr Function24f19
+; 24f13
+
+ContestBattleMenu: ; 24f13
+	ld hl, MenuDataHeader_0x24f89
+	call LoadMenuDataHeader
+; 24f19
+
+Function24f19: ; 24f19
+	ld a, [wBattleMenuCursorBuffer]
+	ld [wMenuCursorBuffer], a
+	call _2DMenu
+	ld a, [wMenuCursorBuffer]
+	ld [wBattleMenuCursorBuffer], a
+	call ExitMenu
+	ret
+; 24f2c
+
+BattleMenuDataHeader: ; 24f2c
+	db $40 ; flags
+	db 12, 08 ; start coords
+	db 17, 19 ; end coords
+	dw MenuData_0x24f34
+	db 1 ; default option
+; 24f34
+
+MenuData_0x24f34: ; 0x24f34
+	db $81 ; flags
+	dn 2, 2 ; rows, columns
+	db 6 ; spacing
+	dba Strings24f3d
+	dbw BANK(MenuData_0x24f34), 0
+; 0x24f3d
+
+Strings24f3d: ; 0x24f3d
+	db "FIGHT@"
+	db "<PKMN>@"
+	db "PACK@"
+	db "RUN@"
+; 24f4e
+
+MenuDataHeader_0x24f4e: ; 24f4e
+	db $40 ; flags
+	db 12, 00 ; start coords
+	db 17, 19 ; end coords
+	dw MenuData_0x24f56
+	db 1 ; default option
+; 24f56
+
+MenuData_0x24f56: ; 24f56
+	db $81 ; flags
+	dn 2, 2 ; rows, columns
+	db 11 ; spacing
+	dba Strings24f5f
+	dba Function24f7c
+; 24f5f
+
+Strings24f5f: ; 24f5f
+	db "サファりボール×  @" ; "SAFARI BALL×  @"
+	db "エサをなげる@" ; "THROW BAIT"
+	db "いしをなげる@" ; "THROW ROCK"
+	db "にげる@" ; "RUN"
+; 24f7c
+
+Function24f7c: ; 24f7c
+	hlcoord 17, 13
+	ld de, wSafariBallsRemaining
+	lb bc, PRINTNUM_LEADINGZEROS | 1, 2
+	call PrintNum
+	ret
+; 24f89
+
+MenuDataHeader_0x24f89: ; 24f89
+	db $40 ; flags
+	db 12, 02 ; start coords
+	db 17, 19 ; end coords
+	dw MenuData_0x24f91
+	db 1 ; default option
+; 24f91
+
+MenuData_0x24f91: ; 24f91
+	db $81 ; flags
+	dn 2, 2 ; rows, columns
+	db 12 ; spacing
+	dba Strings24f9a
+	dba Function24fb2
+; 24f9a
+
+Strings24f9a: ; 24f9a
+	db "FIGHT@"
+	db "<PKMN>", "@"
+	db "PARKBALL×  @"
+	db "RUN@"
+; 24fb2
+
+Function24fb2: ; 24fb2
+	hlcoord 13, 16
+	ld de, wParkBallsRemaining
+	lb bc, PRINTNUM_LEADINGZEROS | 1, 2
+	call PrintNum
+	ret
+; 24fbf
--- /dev/null
+++ b/engine/battle/misc.asm
@@ -1,0 +1,257 @@
+_DisappearUser: ; fbd54
+	xor a
+	ld [hBGMapMode], a
+	ld a, [hBattleTurn]
+	and a
+	jr z, .player
+	call GetEnemyFrontpicCoords
+	jr .okay
+.player
+	call GetPlayerBackpicCoords
+.okay
+	call ClearBox
+	jr FinishAppearDisappearUser
+
+_AppearUserRaiseSub: ; fbd69 (3e:7d69)
+	farcall BattleCommand_RaiseSubNoAnim
+	jr AppearUser
+
+_AppearUserLowerSub: ; fbd71 (3e:7d71)
+	farcall BattleCommand_LowerSubNoAnim
+
+AppearUser: ; fbd77 (3e:7d77)
+	xor a
+	ld [hBGMapMode], a
+	ld a, [hBattleTurn]
+	and a
+	jr z, .player
+	call GetEnemyFrontpicCoords
+	xor a
+	jr .okay
+.player
+	call GetPlayerBackpicCoords
+	ld a, $31
+.okay
+	ld [hGraphicStartTile], a
+	predef PlaceGraphic
+FinishAppearDisappearUser: ; fbd91 (3e:7d91)
+	ld a, $1
+	ld [hBGMapMode], a
+	ret
+
+GetEnemyFrontpicCoords: ; fbd96 (3e:7d96)
+	hlcoord 12, 0
+	lb bc, 7, 7
+	ret
+
+GetPlayerBackpicCoords: ; fbd9d (3e:7d9d)
+	hlcoord 2, 6
+	lb bc, 6, 6
+	ret
+
+
+DoWeatherModifiers: ; fbda4
+
+	ld de, .WeatherTypeModifiers
+	ld a, [Weather]
+	ld b, a
+	ld a, [wd265] ; move type
+	ld c, a
+
+.CheckWeatherType:
+	ld a, [de]
+	inc de
+	cp $ff
+	jr z, .done_weather_types
+
+	cp b
+	jr nz, .NextWeatherType
+
+	ld a, [de]
+	cp c
+	jr z, .ApplyModifier
+
+.NextWeatherType:
+	inc de
+	inc de
+	jr .CheckWeatherType
+
+
+.done_weather_types
+	ld de, .WeatherMoveModifiers
+
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call GetBattleVar
+	ld c, a
+
+.CheckWeatherMove:
+	ld a, [de]
+	inc de
+	cp $ff
+	jr z, .done
+
+	cp b
+	jr nz, .NextWeatherMove
+
+	ld a, [de]
+	cp c
+	jr z, .ApplyModifier
+
+.NextWeatherMove:
+	inc de
+	inc de
+	jr .CheckWeatherMove
+
+.ApplyModifier:
+	xor a
+	ld [hMultiplicand + 0], a
+	ld hl, CurDamage
+	ld a, [hli]
+	ld [hMultiplicand + 1], a
+	ld a, [hl]
+	ld [hMultiplicand + 2], a
+
+	inc de
+	ld a, [de]
+	ld [hMultiplier], a
+
+	call Multiply
+
+	ld a, 10
+	ld [hDivisor], a
+	ld b, $4
+	call Divide
+
+	ld a, [hQuotient + 0]
+	and a
+	ld bc, -1
+	jr nz, .Update
+
+	ld a, [hQuotient + 1]
+	ld b, a
+	ld a, [hQuotient + 2]
+	ld c, a
+	or b
+	jr nz, .Update
+
+	ld bc, 1
+
+.Update:
+	ld a, b
+	ld [CurDamage], a
+	ld a, c
+	ld [CurDamage + 1], a
+
+.done
+	ret
+
+.WeatherTypeModifiers:
+	db WEATHER_RAIN, WATER, 15
+	db WEATHER_RAIN, FIRE,  05
+	db WEATHER_SUN,  FIRE,  15
+	db WEATHER_SUN,  WATER, 05
+	db $ff
+
+.WeatherMoveModifiers:
+	db WEATHER_RAIN, EFFECT_SOLARBEAM, 05
+	db $ff
+; fbe24
+
+
+DoBadgeTypeBoosts: ; fbe24
+	ld a, [wLinkMode]
+	and a
+	ret nz
+
+	ld a, [InBattleTowerBattle]
+	and a
+	ret nz
+
+	ld a, [hBattleTurn]
+	and a
+	ret nz
+
+	push de
+	push bc
+
+	ld hl, .BadgeTypes
+
+	ld a, [KantoBadges]
+	ld b, a
+	ld a, [JohtoBadges]
+	ld c, a
+
+.CheckBadge:
+	ld a, [hl]
+	cp $ff
+	jr z, .done
+
+	srl b
+	rr c
+	jr nc, .NextBadge
+
+	ld a, [wd265] ; move type
+	cp [hl]
+	jr z, .ApplyBoost
+
+.NextBadge:
+	inc hl
+	jr .CheckBadge
+
+.ApplyBoost:
+	ld a, [CurDamage]
+	ld h, a
+	ld d, a
+	ld a, [CurDamage + 1]
+	ld l, a
+	ld e, a
+
+	srl d
+	rr e
+	srl d
+	rr e
+	srl d
+	rr e
+
+	ld a, e
+	or d
+	jr nz, .done_min
+	ld e, 1
+
+.done_min
+	add hl, de
+	jr nc, .Update
+
+	ld hl, $ffff
+
+.Update:
+	ld a, h
+	ld [CurDamage], a
+	ld a, l
+	ld [CurDamage + 1], a
+
+.done
+	pop bc
+	pop de
+	ret
+
+.BadgeTypes:
+	db FLYING   ; zephyrbadge
+	db BUG      ; hivebadge
+	db NORMAL   ; plainbadge
+	db GHOST    ; fogbadge
+	db STEEL    ; mineralbadge
+	db FIGHTING ; stormbadge
+	db ICE      ; glacierbadge
+	db DRAGON   ; risingbadge
+
+	db ROCK     ; boulderbadge
+	db WATER    ; cascadebadge
+	db ELECTRIC ; thunderbadge
+	db GRASS    ; rainbowbadge
+	db POISON   ; soulbadge
+	db PSYCHIC  ; marshbadge
+	db FIRE     ; volcanobadge
+	db GROUND   ; earthbadge
+	db $ff
+; fbe91
--- /dev/null
+++ b/engine/battle/read_trainer_attributes.asm
@@ -1,0 +1,64 @@
+GetTrainerClassName: ; 3952d
+	ld hl, RivalName
+	ld a, c
+	cp RIVAL1
+	jr z, .rival
+
+	ld [CurSpecies], a
+	ld a, TRAINER_NAME
+	ld [wNamedObjectTypeBuffer], a
+	call GetName
+	ld de, StringBuffer1
+	ret
+
+.rival
+	ld de, StringBuffer1
+	push de
+	ld bc, NAME_LENGTH
+	call CopyBytes
+	pop de
+	ret
+
+GetOTName: ; 39550
+	ld hl, OTPlayerName
+	ld a, [wLinkMode]
+	and a
+	jr nz, .ok
+
+	ld hl, RivalName
+	ld a, c
+	cp RIVAL1
+	jr z, .ok
+
+	ld [CurSpecies], a
+	ld a, TRAINER_NAME
+	ld [wNamedObjectTypeBuffer], a
+	call GetName
+	ld hl, StringBuffer1
+
+.ok
+	ld bc, TRAINER_CLASS_NAME_LENGTH
+	ld de, OTClassName
+	push de
+	call CopyBytes
+	pop de
+	ret
+
+GetTrainerAttributes: ; 3957b
+	ld a, [TrainerClass]
+	ld c, a
+	call GetOTName
+	ld a, [TrainerClass]
+	dec a
+	ld hl, TrainerClassAttributes + TRNATTR_ITEM1
+	ld bc, NUM_TRAINER_ATTRIBUTES
+	call AddNTimes
+	ld de, wEnemyTrainerItem1
+	ld a, [hli]
+	ld [de], a
+	inc de
+	ld a, [hli]
+	ld [de], a
+	ld a, [hl]
+	ld [wEnemyTrainerBaseReward], a
+	ret
--- /dev/null
+++ b/engine/battle/read_trainer_party.asm
@@ -1,0 +1,398 @@
+
+ReadTrainerParty: ; 39771
+	ld a, [InBattleTowerBattle]
+	bit 0, a
+	ret nz
+
+	ld a, [wLinkMode]
+	and a
+	ret nz
+
+	ld hl, OTPartyCount
+	xor a
+	ld [hli], a
+	dec a
+	ld [hl], a
+
+	ld hl, OTPartyMons
+	ld bc, OTPartyMonsEnd - OTPartyMons
+	xor a
+	call ByteFill
+
+	ld a, [OtherTrainerClass]
+	cp CAL
+	jr nz, .not_cal2
+	ld a, [OtherTrainerID]
+	cp CAL2
+	jr z, .cal2
+	ld a, [OtherTrainerClass]
+.not_cal2
+
+	dec a
+	ld c, a
+	ld b, 0
+	ld hl, TrainerGroups
+	add hl, bc
+	add hl, bc
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+
+	ld a, [OtherTrainerID]
+	ld b, a
+.skip_trainer
+	dec b
+	jr z, .got_trainer
+.loop
+	ld a, [hli]
+	cp $ff
+	jr nz, .loop
+	jr .skip_trainer
+.got_trainer
+
+.skip_name
+	ld a, [hli]
+	cp "@"
+	jr nz, .skip_name
+
+	ld a, [hli]
+	ld c, a
+	ld b, 0
+	ld d, h
+	ld e, l
+	ld hl, TrainerTypes
+	add hl, bc
+	add hl, bc
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	ld bc, .done
+	push bc
+	jp hl
+
+.done
+	jp ComputeTrainerReward
+
+.cal2
+	ld a, BANK(sMysteryGiftTrainer)
+	call GetSRAMBank
+	ld de, sMysteryGiftTrainer
+	call TrainerType2
+	call CloseSRAM
+	jr .done
+; 397e3
+
+TrainerTypes: ; 397e3
+	dw TrainerType1 ; level, species
+	dw TrainerType2 ; level, species, moves
+	dw TrainerType3 ; level, species, item
+	dw TrainerType4 ; level, species, item, moves
+; 397eb
+
+TrainerType1: ; 397eb
+; normal (level, species)
+	ld h, d
+	ld l, e
+.loop
+	ld a, [hli]
+	cp $ff
+	ret z
+
+	ld [CurPartyLevel], a
+	ld a, [hli]
+	ld [CurPartySpecies], a
+	ld a, OTPARTYMON
+	ld [MonType], a
+	push hl
+	predef TryAddMonToParty
+	pop hl
+	jr .loop
+; 39806
+
+TrainerType2: ; 39806
+; moves
+	ld h, d
+	ld l, e
+.loop
+	ld a, [hli]
+	cp $ff
+	ret z
+
+	ld [CurPartyLevel], a
+	ld a, [hli]
+	ld [CurPartySpecies], a
+	ld a, OTPARTYMON
+	ld [MonType], a
+
+	push hl
+	predef TryAddMonToParty
+	ld a, [OTPartyCount]
+	dec a
+	ld hl, OTPartyMon1Moves
+	ld bc, PARTYMON_STRUCT_LENGTH
+	call AddNTimes
+	ld d, h
+	ld e, l
+	pop hl
+
+	ld b, NUM_MOVES
+.copy_moves
+	ld a, [hli]
+	ld [de], a
+	inc de
+	dec b
+	jr nz, .copy_moves
+
+	push hl
+
+	ld a, [OTPartyCount]
+	dec a
+	ld hl, OTPartyMon1Species
+	ld bc, PARTYMON_STRUCT_LENGTH
+	call AddNTimes
+	ld d, h
+	ld e, l
+	ld hl, MON_PP
+	add hl, de
+	push hl
+	ld hl, MON_MOVES
+	add hl, de
+	pop de
+
+	ld b, NUM_MOVES
+.copy_pp
+	ld a, [hli]
+	and a
+	jr z, .copied_pp
+
+	push hl
+	push bc
+	dec a
+	ld hl, Moves + MOVE_PP
+	ld bc, MOVE_LENGTH
+	call AddNTimes
+	ld a, BANK(Moves)
+	call GetFarByte
+	pop bc
+	pop hl
+
+	ld [de], a
+	inc de
+	dec b
+	jr nz, .copy_pp
+.copied_pp
+
+	pop hl
+	jr .loop
+; 39871
+
+TrainerType3: ; 39871
+; item
+	ld h, d
+	ld l, e
+.loop
+	ld a, [hli]
+	cp $ff
+	ret z
+
+	ld [CurPartyLevel], a
+	ld a, [hli]
+	ld [CurPartySpecies], a
+	ld a, OTPARTYMON
+	ld [MonType], a
+	push hl
+	predef TryAddMonToParty
+	ld a, [OTPartyCount]
+	dec a
+	ld hl, OTPartyMon1Item
+	ld bc, PARTYMON_STRUCT_LENGTH
+	call AddNTimes
+	ld d, h
+	ld e, l
+	pop hl
+	ld a, [hli]
+	ld [de], a
+	jr .loop
+; 3989d (e:589d)
+
+TrainerType4: ; 3989d
+; item + moves
+	ld h, d
+	ld l, e
+.loop
+	ld a, [hli]
+	cp $ff
+	ret z
+
+	ld [CurPartyLevel], a
+	ld a, [hli]
+	ld [CurPartySpecies], a
+
+	ld a, OTPARTYMON
+	ld [MonType], a
+
+	push hl
+	predef TryAddMonToParty
+	ld a, [OTPartyCount]
+	dec a
+	ld hl, OTPartyMon1Item
+	ld bc, PARTYMON_STRUCT_LENGTH
+	call AddNTimes
+	ld d, h
+	ld e, l
+	pop hl
+
+	ld a, [hli]
+	ld [de], a
+
+	push hl
+	ld a, [OTPartyCount]
+	dec a
+	ld hl, OTPartyMon1Moves
+	ld bc, PARTYMON_STRUCT_LENGTH
+	call AddNTimes
+	ld d, h
+	ld e, l
+	pop hl
+
+	ld b, NUM_MOVES
+.copy_moves
+	ld a, [hli]
+	ld [de], a
+	inc de
+	dec b
+	jr nz, .copy_moves
+
+	push hl
+
+	ld a, [OTPartyCount]
+	dec a
+	ld hl, OTPartyMon1
+	ld bc, PARTYMON_STRUCT_LENGTH
+	call AddNTimes
+	ld d, h
+	ld e, l
+	ld hl, MON_PP
+	add hl, de
+
+	push hl
+	ld hl, MON_MOVES
+	add hl, de
+	pop de
+
+	ld b, NUM_MOVES
+.copy_pp
+	ld a, [hli]
+	and a
+	jr z, .copied_pp
+
+	push hl
+	push bc
+	dec a
+	ld hl, Moves + MOVE_PP
+	ld bc, MOVE_LENGTH
+	call AddNTimes
+	ld a, BANK(Moves)
+	call GetFarByte
+	pop bc
+	pop hl
+
+	ld [de], a
+	inc de
+	dec b
+	jr nz, .copy_pp
+.copied_pp
+
+	pop hl
+	jr .loop
+; 3991b
+
+ComputeTrainerReward: ; 3991b (e:591b)
+	ld hl, hProduct
+	xor a
+	ld [hli], a
+	ld [hli], a
+	ld [hli], a
+	ld a, [wEnemyTrainerBaseReward]
+	ld [hli], a
+	ld a, [CurPartyLevel]
+	ld [hl], a
+	call Multiply
+	ld hl, wBattleReward
+	xor a
+	ld [hli], a
+	ld a, [hProduct + 2]
+	ld [hli], a
+	ld a, [hProduct + 3]
+	ld [hl], a
+	ret
+
+
+Battle_GetTrainerName:: ; 39939
+	ld a, [InBattleTowerBattle]
+	bit 0, a
+	ld hl, OTPlayerName
+	jp nz, CopyTrainerName
+
+	ld a, [OtherTrainerID]
+	ld b, a
+	ld a, [OtherTrainerClass]
+	ld c, a
+
+GetTrainerName:: ; 3994c
+	ld a, c
+	cp CAL
+	jr nz, .not_cal2
+
+	ld a, BANK(sMysteryGiftTrainerHouseFlag)
+	call GetSRAMBank
+	ld a, [sMysteryGiftTrainerHouseFlag]
+	and a
+	call CloseSRAM
+	jr z, .not_cal2
+
+	ld a, BANK(sMysteryGiftPartnerName)
+	call GetSRAMBank
+	ld hl, sMysteryGiftPartnerName
+	call CopyTrainerName
+	jp CloseSRAM
+
+.not_cal2
+	dec c
+	push bc
+	ld b, 0
+	ld hl, TrainerGroups
+	add hl, bc
+	add hl, bc
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	pop bc
+
+.loop
+	dec b
+	jr z, CopyTrainerName
+
+.skip
+	ld a, [hli]
+	cp $ff
+	jr nz, .skip
+	jr .loop
+
+CopyTrainerName: ; 39984
+	ld de, StringBuffer1
+	push de
+	ld bc, NAME_LENGTH
+	call CopyBytes
+	pop de
+	ret
+; 39990
+
+Function39990: ; 39990
+; This function is useless.
+	ld de, StringBuffer1
+	push de
+	ld bc, NAME_LENGTH
+	pop de
+	ret
+; 39999
--- /dev/null
+++ b/engine/battle/sliding_intro.asm
@@ -1,0 +1,104 @@
+BattleIntroSlidingPics: ; 4e980
+	ld a, [rSVBK]
+	push af
+	ld a, $5
+	ld [rSVBK], a
+	call .subfunction1
+	ld a, rSCX - $ff00
+	ld [hLCDCPointer], a
+	call .subfunction2
+	xor a
+	ld [hLCDCPointer], a
+	pop af
+	ld [rSVBK], a
+	ret
+; 4e998
+
+.subfunction1 ; 4e998
+	call .subfunction4
+	ld a, $90
+	ld [hSCX], a
+	ld a, %11100100
+	call DmgToCgbBGPals
+	lb de, %11100100, %11100100
+	call DmgToCgbObjPals
+	ret
+; 4e9ab
+
+.subfunction2 ; 4e9ab
+	ld d, $90
+	ld e, $72
+	ld a, $48
+	inc a
+.loop1
+	push af
+.loop2
+	ld a, [rLY]
+	cp $60
+	jr c, .loop2
+	ld a, d
+	ld [hSCX], a
+	call .subfunction5
+	inc e
+	inc e
+	dec d
+	dec d
+	pop af
+	push af
+	cp $1
+	jr z, .skip1
+	push de
+	call .subfunction3
+	pop de
+
+.skip1
+	call DelayFrame
+	pop af
+	dec a
+	jr nz, .loop1
+	ret
+; 4e9d6
+
+.subfunction3 ; 4e9d6
+	ld hl, Sprites + 1 ; x pixel
+	ld c, $12 ; 18
+	ld de, $4
+.loop3
+	dec [hl]
+	dec [hl]
+	add hl, de
+	dec c
+	jr nz, .loop3
+	ret
+; 4e9e5
+
+.subfunction4 ; 4e9e5
+	ld hl, LYOverrides
+	ld a, $90
+	ld bc, SCREEN_HEIGHT_PX
+	call ByteFill
+	ret
+; 4e9f1
+
+.subfunction5 ; 4e9f1
+	ld hl, LYOverrides
+	ld a, d
+	ld c, $3e ; 62
+.loop4
+	ld [hli], a
+	dec c
+	jr nz, .loop4
+	ld a, e
+	ld c, $22 ; 34
+.loop5
+	ld [hli], a
+	dec c
+	jr nz, .loop5
+	xor a
+	ld c, $30 ; 48
+.loop6
+	ld [hli], a
+	dec c
+	jr nz, .loop6
+	ret
+; 4ea0a
--- /dev/null
+++ b/engine/battle/start_battle.asm
@@ -1,0 +1,197 @@
+ShowLinkBattleParticipants: ; 2ee18
+; If we're not in a communications room,
+; we don't need to be here.
+	ld a, [wLinkMode]
+	and a
+	ret z
+
+	farcall _ShowLinkBattleParticipants
+	ld c, 150
+	call DelayFrames
+	call ClearTileMap
+	call ClearSprites
+	ret
+
+FindFirstAliveMonAndStartBattle: ; 2ee2f
+	xor a
+	ld [hMapAnims], a
+	call DelayFrame
+	ld b, 6
+	ld hl, PartyMon1HP
+	ld de, PARTYMON_STRUCT_LENGTH - 1
+
+.loop
+	ld a, [hli]
+	or [hl]
+	jr nz, .okay
+	add hl, de
+	dec b
+	jr nz, .loop
+
+.okay
+	ld de, MON_LEVEL - MON_HP
+	add hl, de
+	ld a, [hl]
+	ld [BattleMonLevel], a
+	predef Predef_StartBattle
+	farcall _LoadBattleFontsHPBar
+	ld a, 1
+	ld [hBGMapMode], a
+	call ClearSprites
+	call ClearTileMap
+	xor a
+	ld [hBGMapMode], a
+	ld [hWY], a
+	ld [rWY], a
+	ld [hMapAnims], a
+	ret
+
+PlayBattleMusic: ; 2ee6c
+	push hl
+	push de
+	push bc
+
+	xor a
+	ld [MusicFade], a
+	ld de, MUSIC_NONE
+	call PlayMusic
+	call DelayFrame
+	call MaxVolume
+
+	ld a, [BattleType]
+	cp BATTLETYPE_SUICUNE
+	ld de, MUSIC_SUICUNE_BATTLE
+	jp z, .done
+	cp BATTLETYPE_ROAMING
+	jp z, .done
+
+	; Are we fighting a trainer?
+	ld a, [OtherTrainerClass]
+	and a
+	jr nz, .trainermusic
+
+	farcall RegionCheck
+	ld a, e
+	and a
+	jr nz, .kantowild
+
+	ld de, MUSIC_JOHTO_WILD_BATTLE
+	ld a, [TimeOfDay]
+	cp NITE_F
+	jr nz, .done
+	ld de, MUSIC_JOHTO_WILD_BATTLE_NIGHT
+	jr .done
+
+.kantowild
+	ld de, MUSIC_KANTO_WILD_BATTLE
+	jr .done
+
+.trainermusic
+	ld de, MUSIC_CHAMPION_BATTLE
+	cp CHAMPION
+	jr z, .done
+	cp RED
+	jr z, .done
+
+	; really, they should have included admins and scientists here too...
+	ld de, MUSIC_ROCKET_BATTLE
+	cp GRUNTM
+	jr z, .done
+	cp GRUNTF
+	jr z, .done
+
+	ld de, MUSIC_KANTO_GYM_LEADER_BATTLE
+	farcall IsKantoGymLeader
+	jr c, .done
+
+	ld de, MUSIC_JOHTO_GYM_LEADER_BATTLE
+	farcall IsJohtoGymLeader
+	jr c, .done
+
+	ld de, MUSIC_RIVAL_BATTLE
+	ld a, [OtherTrainerClass]
+	cp RIVAL1
+	jr z, .done
+	cp RIVAL2
+	jr nz, .othertrainer
+
+	ld a, [OtherTrainerID]
+	cp RIVAL2_2_CHIKORITA ; Rival in Indigo Plateau
+	jr c, .done
+	ld de, MUSIC_CHAMPION_BATTLE
+	jr .done
+
+.othertrainer
+	ld a, [wLinkMode]
+	and a
+	jr nz, .johtotrainer
+
+	farcall RegionCheck
+	ld a, e
+	and a
+	jr nz, .kantotrainer
+
+.johtotrainer
+	ld de, MUSIC_JOHTO_TRAINER_BATTLE
+	jr .done
+
+.kantotrainer
+	ld de, MUSIC_KANTO_TRAINER_BATTLE
+
+.done
+	call PlayMusic
+
+	pop bc
+	pop de
+	pop hl
+	ret
+
+ClearBattleRAM: ; 2ef18
+	xor a
+	ld [wPlayerAction], a
+	ld [wBattleResult], a
+
+	ld hl, wPartyMenuCursor
+	ld [hli], a
+	ld [hli], a
+	ld [hli], a
+	ld [hl], a
+
+	ld [wMenuScrollPosition], a
+	ld [CriticalHit], a
+	ld [BattleMonSpecies], a
+	ld [wBattleParticipantsNotFainted], a
+	ld [CurBattleMon], a
+	ld [wForcedSwitch], a
+	ld [TimeOfDayPal], a
+	ld [PlayerTurnsTaken], a
+	ld [EnemyTurnsTaken], a
+	ld [EvolvableFlags], a
+
+	ld hl, PlayerHPPal
+	ld [hli], a
+	ld [hl], a
+
+	ld hl, BattleMonDVs
+	ld [hli], a
+	ld [hl], a
+
+	ld hl, EnemyMonDVs
+	ld [hli], a
+	ld [hl], a
+
+; Clear the entire BattleMons area
+	ld hl, wBattle
+	ld bc, wBattleEnd - wBattle
+	xor a
+	call ByteFill
+
+	callfar ResetEnemyStatLevels
+
+	call ClearWindowData
+
+	ld hl, hBGMapAddress
+	xor a ; LOW(VBGMap0)
+	ld [hli], a
+	ld [hl], HIGH(VBGMap0)
+	ret
--- /dev/null
+++ b/engine/battle/trainer_huds.asm
@@ -1,0 +1,269 @@
+BattleStart_TrainerHuds: ; 2c000
+	ld a, $e4
+	ld [rOBP0], a
+	call LoadBallIconGFX
+	call ShowPlayerMonsRemaining
+	ld a, [wBattleMode]
+	dec a
+	ret z
+	jp ShowOTTrainerMonsRemaining
+; 2c012
+
+EnemySwitch_TrainerHud: ; 2c012
+	ld a, $e4
+	ld [rOBP0], a
+	call LoadBallIconGFX
+	jp ShowOTTrainerMonsRemaining
+; 2c01c
+
+ShowPlayerMonsRemaining: ; 2c01c
+	call DrawPlayerPartyIconHUDBorder
+	ld hl, PartyMon1HP
+	ld de, PartyCount
+	call StageBallTilesData
+	; ldpixel wPlaceBallsX, 12, 12
+	ld a, 12 * 8
+	ld hl, wPlaceBallsX
+	ld [hli], a
+	ld [hl], a
+	ld a, 8
+	ld [wPlaceBallsDirection], a
+	ld hl, Sprites
+	jp LoadTrainerHudOAM
+; 2c03a
+
+ShowOTTrainerMonsRemaining: ; 2c03a
+	call DrawEnemyHUDBorder
+	ld hl, OTPartyMon1HP
+	ld de, OTPartyCount
+	call StageBallTilesData
+	; ldpixel wPlaceBallsX, 9, 4
+	ld hl, wPlaceBallsX
+	ld a, 9 * 8
+	ld [hli], a
+	ld [hl], 4 * 8
+	ld a, -8
+	ld [wPlaceBallsDirection], a
+	ld hl, Sprites + PARTY_LENGTH * 4
+	jp LoadTrainerHudOAM
+; 2c059
+
+StageBallTilesData: ; 2c059
+	ld a, [de]
+	push af
+	ld de, Buffer1
+	ld c, PARTY_LENGTH
+	ld a, $34 ; empty slot
+.loop1
+	ld [de], a
+	inc de
+	dec c
+	jr nz, .loop1
+	pop af
+	ld de, Buffer1
+.loop2
+	push af
+	call .GetHUDTile
+	inc de
+	pop af
+	dec a
+	jr nz, .loop2
+	ret
+; 2c075
+
+.GetHUDTile: ; 2c075
+	ld a, [hli]
+	and a
+	jr nz, .got_hp
+	ld a, [hl]
+	and a
+	ld b, $33 ; fainted
+	jr z, .fainted
+
+.got_hp
+	dec hl
+	dec hl
+	dec hl
+	ld a, [hl]
+	and a
+	ld b, $32 ; statused
+	jr nz, .load
+	dec b ; normal
+	jr .load
+
+.fainted
+	dec hl
+	dec hl
+	dec hl
+
+.load
+	ld a, b
+	ld [de], a
+	ld bc, PARTYMON_STRUCT_LENGTH + MON_HP - MON_STATUS
+	add hl, bc
+	ret
+; 2c095
+
+DrawPlayerHUDBorder: ; 2c095
+	ld hl, .tiles
+	ld de, wTrainerHUDTiles
+	ld bc, 4
+	call CopyBytes
+	hlcoord 18, 10
+	ld de, -1 ; start on right
+	jr PlaceHUDBorderTiles
+
+.tiles
+	db $73 ; right side
+	db $77 ; bottom right
+	db $6f ; bottom left
+	db $76 ; bottom side
+; 2c0ad
+
+DrawPlayerPartyIconHUDBorder: ; 2c0ad
+	ld hl, .tiles
+	ld de, wTrainerHUDTiles
+	ld bc, 4
+	call CopyBytes
+	hlcoord 18, 10
+	ld de, -1 ; start on right
+	jr PlaceHUDBorderTiles
+
+.tiles
+	db $73 ; right side
+	db $5c ; bottom right
+	db $6f ; bottom left
+	db $76 ; bottom side
+; 2c0c5
+
+DrawEnemyHUDBorder: ; 2c0c5
+	ld hl, .tiles
+	ld de, wTrainerHUDTiles
+	ld bc, 4
+	call CopyBytes
+	hlcoord 1, 2
+	ld de, 1 ; start on left
+	call PlaceHUDBorderTiles
+	ld a, [wBattleMode]
+	dec a
+	ret nz
+	ld a, [TempEnemyMonSpecies]
+	dec a
+	call CheckCaughtMon
+	ret z
+	hlcoord 1, 1
+	ld [hl], $5d
+	ret
+
+.tiles
+	db $6d ; left side
+	db $74 ; bottom left
+	db $78 ; bottom right
+	db $76 ; bottom side
+; 2c0f1
+
+PlaceHUDBorderTiles: ; 2c0f1
+	ld a, [wTrainerHUDTiles]
+	ld [hl], a
+	ld bc, SCREEN_WIDTH
+	add hl, bc
+	ld a, [StartFlypoint]
+	ld [hl], a
+	ld b, $8
+.loop
+	add hl, de
+	ld a, [MovementBuffer]
+	ld [hl], a
+	dec b
+	jr nz, .loop
+	add hl, de
+	ld a, [EndFlypoint]
+	ld [hl], a
+	ret
+; 2c10d
+
+LinkBattle_TrainerHuds: ; 2c10d
+	call LoadBallIconGFX
+	ld hl, PartyMon1HP
+	ld de, PartyCount
+	call StageBallTilesData
+	ld hl, wPlaceBallsX
+	ld a, 10 * 8
+	ld [hli], a
+	ld [hl], 8 * 8
+	ld a, $8
+	ld [wPlaceBallsDirection], a
+	ld hl, Sprites
+	call LoadTrainerHudOAM
+
+	ld hl, OTPartyMon1HP
+	ld de, OTPartyCount
+	call StageBallTilesData
+	ld hl, wPlaceBallsX
+	ld a, 10 * 8
+	ld [hli], a
+	ld [hl], 13 * 8
+	ld hl, Sprites + PARTY_LENGTH * 4
+	jp LoadTrainerHudOAM
+; 2c143
+
+LoadTrainerHudOAM: ; 2c143
+	ld de, Buffer1
+	ld c, PARTY_LENGTH
+.loop
+	ld a, [wPlaceBallsY]
+	ld [hli], a
+	ld a, [wPlaceBallsX]
+	ld [hli], a
+	ld a, [de]
+	ld [hli], a
+	ld a, $3
+	ld [hli], a
+	ld a, [wPlaceBallsX]
+	ld b, a
+	ld a, [wPlaceBallsDirection]
+	add b
+	ld [wPlaceBallsX], a
+	inc de
+	dec c
+	jr nz, .loop
+	ret
+; 2c165
+
+LoadBallIconGFX: ; 2c165
+	ld de, .gfx
+	ld hl, VTiles0 tile $31
+	lb bc, BANK(LoadBallIconGFX), 4
+	call Get2bpp_2
+	ret
+; 2c172
+
+.gfx ; 2c172
+INCBIN "gfx/battle/balls.2bpp"
+; 2c1b2
+
+_ShowLinkBattleParticipants: ; 2c1b2
+	call ClearBGPalettes
+	call LoadFontsExtra
+	hlcoord 2, 3
+	ld b, 9
+	ld c, 14
+	call TextBox
+	hlcoord 4, 5
+	ld de, PlayerName
+	call PlaceString
+	hlcoord 4, 10
+	ld de, OTPlayerName
+	call PlaceString
+	hlcoord 9, 8
+	ld a, "<BOLD_V>"
+	ld [hli], a
+	ld [hl], "<BOLD_S>"
+	farcall LinkBattle_TrainerHuds ; no need to farcall
+	ld b, SCGB_DIPLOMA
+	call GetSGBLayout
+	call SetPalettes
+	ld a, $e4
+	ld [rOBP0], a
+	ret
+; 2c1ef
--- /dev/null
+++ b/engine/battle/trainer_scripts.asm
@@ -1,0 +1,31 @@
+TalkToTrainerScript:: ; 0xbe66a
+	faceplayer
+	trainerflagaction CHECK_FLAG
+	iftrue AlreadyBeatenTrainerScript
+	loadmemtrainer
+	encountermusic
+	jump StartBattleWithMapTrainerScript
+
+SeenByTrainerScript:: ; 0xbe675
+	loadmemtrainer
+	encountermusic
+	showemote EMOTE_SHOCK, LAST_TALKED, 30
+	callasm TrainerWalkToPlayer
+	applymovement2 MovementBuffer
+	writeobjectxy LAST_TALKED
+	faceobject PLAYER, LAST_TALKED
+	jump StartBattleWithMapTrainerScript
+
+StartBattleWithMapTrainerScript: ; 0xbe68a
+	opentext
+	trainertext $0
+	waitbutton
+	closetext
+	loadmemtrainer
+	startbattle
+	reloadmapafterbattle
+	trainerflagaction SET_FLAG
+	loadvar wRunningTrainerBattleScript, -1
+
+AlreadyBeatenTrainerScript:
+	scripttalkafter
--- /dev/null
+++ b/engine/battle/used_move_text.asm
@@ -1,0 +1,338 @@
+DisplayUsedMoveText: ; 105db0
+; battle command 03
+	ld hl, UsedMoveText
+	call BattleTextBox
+	jp WaitBGMap
+; 105db9
+
+UsedMoveText: ; 105db9
+; this is a stream of text and asm from 105db9 to 105ef6
+	text_jump _ActorNameText
+	start_asm
+	ld a, [hBattleTurn]
+	and a
+	jr nz, .start
+
+	ld a, [wPlayerMoveStruct + MOVE_ANIM]
+	call UpdateUsedMoves
+
+.start
+	ld a, BATTLE_VARS_LAST_MOVE
+	call GetBattleVarAddr
+	ld d, h
+	ld e, l
+
+	ld a, BATTLE_VARS_LAST_COUNTER_MOVE
+	call GetBattleVarAddr
+
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call GetBattleVar
+	ld [wd265], a
+
+	push hl
+	farcall CheckUserIsCharging
+	pop hl
+	jr nz, .grammar
+
+	; update last move
+	ld a, [wd265]
+	ld [hl], a
+	ld [de], a
+
+.grammar
+	call GetMoveGrammar
+; wd265 now contains MoveGrammar
+
+; everything except 'instead' made redundant in localization
+
+	; check obedience
+	ld a, [AlreadyDisobeyed]
+	and a
+	ld hl, UsedMove2Text
+	ret nz
+
+	; check move grammar
+	ld a, [wd265]
+	cp $3
+	ld hl, UsedMove2Text
+	ret c
+	ld hl, UsedMove1Text
+	ret
+; 105e04
+
+UsedMove1Text: ; 105e04
+	text_jump _UsedMove1Text
+	start_asm
+	jr UsedMoveText_CheckObedience
+; 105e0b
+
+UsedMove2Text: ; 105e0b
+	text_jump _UsedMove2Text
+	start_asm
+UsedMoveText_CheckObedience: ; 105e10
+; check obedience
+	ld a, [AlreadyDisobeyed]
+	and a
+	jr z, .GetMoveNameText
+; print "instead,"
+	ld hl, .UsedInsteadText
+	ret
+; 105e1a
+
+.UsedInsteadText:
+	text_jump _UsedInsteadText
+	start_asm
+.GetMoveNameText:
+	ld hl, MoveNameText
+	ret
+; 105e23
+
+MoveNameText: ; 105e23
+	text_jump _MoveNameText
+	start_asm
+; get start address
+	ld hl, .endusedmovetexts
+
+; get move id
+	ld a, [wd265]
+
+; 2-byte pointer
+	add a
+
+; seek
+	push bc
+	ld b, $0
+	ld c, a
+	add hl, bc
+	pop bc
+
+; get pointer to usedmovetext ender
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	ret
+; 105e39
+
+.endusedmovetexts ; 105e39
+	dw EndUsedMove1Text
+	dw EndUsedMove2Text
+	dw EndUsedMove3Text
+	dw EndUsedMove4Text
+	dw EndUsedMove5Text
+; 105e43
+
+EndUsedMove1Text: ; 105e43
+	text_jump _EndUsedMove1Text
+	db "@"
+; 105e48
+EndUsedMove2Text: ; 105e48
+	text_jump _EndUsedMove2Text
+	db "@"
+; 105e4d
+EndUsedMove3Text: ; 105e4d
+	text_jump _EndUsedMove3Text
+	db "@"
+; 105e52
+EndUsedMove4Text: ; 105e52
+	text_jump _EndUsedMove4Text
+	db "@"
+; 105e57
+EndUsedMove5Text: ; 105e57
+	text_jump _EndUsedMove5Text
+	db "@"
+; 105e5c
+
+
+GetMoveGrammar: ; 105e5c
+; store move grammar type in wd265
+
+	push bc
+; c = move id
+	ld a, [wd265]
+	ld c, a
+	ld b, $0
+
+; read grammar table
+	ld hl, MoveGrammar
+.loop
+	ld a, [hli]
+; end of table?
+	cp $ff
+	jr z, .end
+; match?
+	cp c
+	jr z, .end
+; advance grammar type at $00
+	and a
+	jr nz, .loop
+; next grammar type
+	inc b
+	jr .loop
+
+.end
+; wd265 now contains move grammar
+	ld a, b
+	ld [wd265], a
+
+; we're done
+	pop bc
+	ret
+; 105e7a
+
+MoveGrammar: ; 105e7a
+; made redundant in localization
+; each move is given an identifier for what usedmovetext to use (0-4):
+
+; 0
+	db SWORDS_DANCE
+	db GROWTH
+	db STRENGTH
+	db HARDEN
+	db MINIMIZE
+	db SMOKESCREEN
+	db WITHDRAW
+	db DEFENSE_CURL
+	db EGG_BOMB
+	db SMOG
+	db BONE_CLUB
+	db FLASH
+	db SPLASH
+	db ACID_ARMOR
+	db BONEMERANG
+	db REST
+	db SHARPEN
+	db SUBSTITUTE
+	db MIND_READER
+	db SNORE
+	db PROTECT
+	db SPIKES
+	db ENDURE
+	db ROLLOUT
+	db SWAGGER
+	db SLEEP_TALK
+	db HIDDEN_POWER
+	db PSYCH_UP
+	db EXTREMESPEED
+	db 0 ; end set
+
+; 1
+	db RECOVER
+	db TELEPORT
+	db BIDE
+	db SELFDESTRUCT
+	db AMNESIA
+	db FLAIL
+	db 0 ; end set
+
+; 2
+	db MEDITATE
+	db AGILITY
+	db MIMIC
+	db DOUBLE_TEAM
+	db BARRAGE
+	db TRANSFORM
+	db STRUGGLE
+	db SCARY_FACE
+	db 0 ; end set
+
+; 3
+	db POUND
+	db SCRATCH
+	db VICEGRIP
+	db WING_ATTACK
+	db FLY
+	db BIND
+	db SLAM
+	db HORN_ATTACK
+	db WRAP
+	db THRASH
+	db TAIL_WHIP
+	db LEER
+	db BITE
+	db GROWL
+	db ROAR
+	db SING
+	db PECK
+	db ABSORB
+	db STRING_SHOT
+	db EARTHQUAKE
+	db FISSURE
+	db DIG
+	db TOXIC
+	db SCREECH
+	db METRONOME
+	db LICK
+	db CLAMP
+	db CONSTRICT
+	db POISON_GAS
+	db BUBBLE
+	db SLASH
+	db SPIDER_WEB
+	db NIGHTMARE
+	db CURSE
+	db FORESIGHT
+	db CHARM
+	db ATTRACT
+	db ROCK_SMASH
+	db 0 ; end set
+
+; all other moves = 4
+	db $ff ; end
+; 105ed0
+
+
+UpdateUsedMoves: ; 105ed0
+; append move a to PlayerUsedMoves unless it has already been used
+
+	push bc
+; start of list
+	ld hl, PlayerUsedMoves
+; get move id
+	ld b, a
+; next count
+	ld c, NUM_MOVES
+
+.loop
+; get move from the list
+	ld a, [hli]
+; not used yet?
+	and a
+	jr z, .add
+; already used?
+	cp b
+	jr z, .quit
+; next byte
+	dec c
+	jr nz, .loop
+
+; if the list is full and the move hasn't already been used
+; shift the list back one byte, deleting the first move used
+; this can occur with struggle or a new learned move
+	ld hl, PlayerUsedMoves + 1
+; 1 = 2
+	ld a, [hld]
+	ld [hli], a
+; 2 = 3
+	inc hl
+	ld a, [hld]
+	ld [hli], a
+; 3 = 4
+	inc hl
+	ld a, [hld]
+	ld [hl], a
+; 4 = new move
+	ld a, b
+	ld [PlayerUsedMoves + 3], a
+	jr .quit
+
+.add
+; go back to the byte we just inced from
+	dec hl
+; add the new move
+	ld [hl], b
+
+.quit
+; list updated
+	pop bc
+	ret
+; 105ef6
--- a/engine/battle_transition.asm
+++ /dev/null
@@ -1,873 +1,0 @@
-Predef_StartBattle: ; 8c20f
-	call .InitGFX
-	ld a, [rBGP]
-	ld [wBGP], a
-	ld a, [rOBP0]
-	ld [wOBP0], a
-	ld 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
-	jr nz, .done
-	call FlashyTransitionToBattle
-	call DelayFrame
-	jr .loop
-
-.done
-	ld a, [rSVBK]
-	push af
-	ld a, $5
-	ld [rSVBK], a
-
-	ld hl, UnknBGPals
-	ld bc, 8 palettes
-	xor a
-	call ByteFill
-
-	pop af
-	ld [rSVBK], a
-
-	ld a, %11111111
-	ld [wBGP], a
-	call DmgToCgbBGPals
-	call DelayFrame
-	xor a
-	ld [hLCDCPointer], a
-	ld [hLYOverrideStart], a
-	ld [hLYOverrideEnd], a
-	ld [hSCY], a
-
-	ld a, $1
-	ld [rSVBK], a
-	pop af
-	ld [hVBlank], a
-	call DelayFrame
-	ret
-; 8c26d
-
-.InitGFX: ; 8c26d
-	ld a, [wLinkMode]
-	cp LINK_MOBILE
-	jr z, .mobile
-	farcall ReanchorBGMap_NoOAMUpdate
-	call UpdateSprites
-	call DelayFrame
-	call .NonMobile_LoadPokeballTiles
-	call BattleStart_CopyTilemapAtOnce
-	jr .resume
-
-.mobile
-	call LoadTrainerBattlePokeballTiles
-
-.resume
-	ld a, SCREEN_HEIGHT_PX
-	ld [hWY], a
-	call DelayFrame
-	xor a
-	ld [hBGMapMode], a
-	ld hl, wJumptableIndex
-	xor a
-	ld [hli], a
-	ld [hli], a
-	ld [hl], a
-	call WipeLYOverrides
-	ret
-; 8c2a0
-
-.NonMobile_LoadPokeballTiles: ; 8c2a0
-	call LoadTrainerBattlePokeballTiles
-	hlbgcoord 0, 0
-	call ConvertTrainerBattlePokeballTilesTo2bpp
-	ret
-; 8c2aa
-
-LoadTrainerBattlePokeballTiles:
-; Load the tiles used in the Pokeball Graphic that fills the screen
-; at the start of every Trainer battle.
-	ld de, TrainerBattlePokeballTiles
-	ld hl, VTiles1 tile $7e
-	ld b, BANK(TrainerBattlePokeballTiles)
-	ld c, 2
-	call Request2bpp
-
-	ld a, [rVBK]
-	push af
-	ld a, $1
-	ld [rVBK], a
-
-	ld de, TrainerBattlePokeballTiles
-	ld hl, VTiles4 tile $7e
-	ld b, BANK(TrainerBattlePokeballTiles)
-	ld c, 2
-	call Request2bpp
-
-	pop af
-	ld [rVBK], a
-	ret
-; 8c2cf
-
-ConvertTrainerBattlePokeballTilesTo2bpp: ; 8c2cf
-	ld a, [rSVBK]
-	push af
-	ld a, $6
-	ld [rSVBK], a
-	push hl
-	ld hl, wDecompressScratch
-	ld bc, $28 tiles
-
-.loop
-	ld [hl], -1
-	inc hl
-	dec bc
-	ld a, c
-	or b
-	jr nz, .loop
-
-	pop hl
-	ld de, wDecompressScratch
-	ld b, BANK(ConvertTrainerBattlePokeballTilesTo2bpp) ; BANK(@)
-	ld c, $28
-	call Request2bpp
-	pop af
-	ld [rSVBK], a
-	ret
-; 8c2f4
-
-TrainerBattlePokeballTiles: ; 8c2f4
-INCBIN "gfx/overworld/trainer_battle_pokeball_tiles.2bpp"
-
-
-FlashyTransitionToBattle: ; 8c314
-	jumptable .dw, wJumptableIndex
-; 8c323
-
-.dw ; 8c323 (23:4323)
-	dw StartTrainerBattle_DetermineWhichAnimation ; 00
-
-	; Animation 1: 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
-
-	; Animation 2: 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
-
-	; Animation 3: 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
-
-	; Animation 4: 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
-
-	; All animations jump to here.
-	dw StartTrainerBattle_Finish ; 20
-
-
-StartTrainerBattle_DetermineWhichAnimation: ; 8c365 (23:4365)
-; The screen flashes a different number of times depending on the level of
-; your lead Pokemon relative to the opponent's.
-; BUG: BattleMonLevel and EnemyMonLevel are not set at this point, so whatever
-; values happen to be there will determine the animation.
-	ld de, 0
-	ld a, [BattleMonLevel]
-	add 3
-	ld hl, EnemyMonLevel
-	cp [hl]
-	jr nc, .okay
-	set 0, e
-.okay
-	ld a, [wEnvironment]
-	cp CAVE
-	jr z, .okay2
-	cp ENVIRONMENT_5
-	jr z, .okay2
-	cp DUNGEON
-	jr z, .okay2
-	set 1, e
-.okay2
-	ld hl, .StartingPoints
-	add hl, de
-	ld a, [hl]
-	ld [wJumptableIndex], a
-	ret
-; 8c38f (23:438f)
-
-.StartingPoints: ; 8c38f
-	db 1,  9
-	db 16, 24
-; 8c393
-
-StartTrainerBattle_Finish: ; 8c393 (23:4393)
-	call ClearSprites
-	ld a, $80
-	ld [wJumptableIndex], a
-	ret
-
-StartTrainerBattle_NextScene: ; 8c39c (23:439c)
-	ld hl, wJumptableIndex
-	inc [hl]
-	ret
-
-StartTrainerBattle_SetUpBGMap: ; 8c3a1 (23:43a1)
-	call StartTrainerBattle_NextScene
-	xor a
-	ld [wcf64], a
-	ld [hBGMapMode], a
-	ret
-
-StartTrainerBattle_Flash: ; 8c3ab (23:43ab)
-	call .DoFlashAnimation
-	ret nc
-	call StartTrainerBattle_NextScene
-	ret
-
-.DoFlashAnimation: ; 8c3b3 (23:43b3)
-	ld a, [wTimeOfDayPalset]
-	cp %11111111 ; dark cave
-	jr z, .done
-	ld hl, wcf64
-	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 [wcf64], a
-	scf
-	ret
-; 8c3db (23:43db)
-
-.pals ; 8c3db
-	db %11111001 ; 3321
-	db %11111110 ; 3332
-	db %11111111 ; 3333
-	db %11111110 ; 3332
-	db %11111001 ; 3321
-	db %11100100 ; 3210
-	db %10010000 ; 2100
-	db %01000000 ; 1000
-	db %00000000 ; 0000
-	db %01000000 ; 1000
-	db %10010000 ; 2100
-	db %11100100 ; 3210
-	db %00000001 ; 0001
-; 8c3e8
-
-StartTrainerBattle_SetUpForWavyOutro: ; 8c3e8 (23:43e8)
-	farcall Function5602
-	ld a, $5 ; BANK(LYOverrides)
-	ld [rSVBK], a
-
-	call StartTrainerBattle_NextScene
-
-	ld a, rSCX - $ff00
-	ld [hLCDCPointer], a
-	xor a
-	ld [hLYOverrideStart], a
-	ld a, $90
-	ld [hLYOverrideEnd], a
-	xor a
-	ld [wcf64], a
-	ld [wcf65], a
-	ret
-
-StartTrainerBattle_SineWave: ; 8c408 (23:4408)
-	ld a, [wcf64]
-	cp $60
-	jr nc, .end
-	call .DoSineWave
-	ret
-
-.end
-	ld a, $20
-	ld [wJumptableIndex], a
-	ret
-
-.DoSineWave: ; 8c419 (23:4419)
-	ld hl, wcf65
-	ld a, [hl]
-	inc [hl]
-	ld hl, wcf64
-	ld d, [hl]
-	add [hl]
-	ld [hl], a
-	ld a, LYOverridesEnd - LYOverrides
-	ld bc, LYOverrides
-	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: ; 8c43d (23:443d)
-	farcall Function5602
-	ld a, $5 ; BANK(LYOverrides)
-	ld [rSVBK], a
-	call StartTrainerBattle_NextScene
-	xor a
-	ld [wcf64], a
-	ret
-
-StartTrainerBattle_SpinToBlack: ; 8c44f (23:444f)
-	xor a
-	ld [hBGMapMode], a
-	ld a, [wcf64]
-	ld e, a
-	ld d, 0
-	ld hl, .spintable
-rept 5
-	add hl, de
-endr
-	ld a, [hli]
-	cp -1
-	jr z, .end
-	ld [wcf65], a
-	call .load
-	ld a, $1
-	ld [hBGMapMode], a
-	call DelayFrame
-	call DelayFrame
-	ld hl, wcf64
-	inc [hl]
-	ret
-
-.end
-	ld a, $1
-	ld [hBGMapMode], a
-	call DelayFrame
-	call DelayFrame
-	call DelayFrame
-	xor a
-	ld [hBGMapMode], a
-	ld a, $20
-	ld [wJumptableIndex], a
-	ret
-; 8c490 (23:4490)
-
-; quadrants
-	const_def
-	const UPPER_LEFT
-	const UPPER_RIGHT
-	const LOWER_LEFT
-	const LOWER_RIGHT
-
-.spintable ; 8c490
-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
-; 8c4f5
-
-.load ; 8c4f5 (23:44f5)
-	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], $ff
-	ld a, [wcf65]
-	bit 0, a
-	jr z, .leftside
-	inc hl
-	jr .okay1
-.leftside
-	dec hl
-.okay1
-	dec c
-	jr nz, .loop1
-	pop hl
-	ld a, [wcf65]
-	bit 1, 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, [wcf65]
-	bit 0, a
-	jr z, .leftside2
-	dec hl
-	jr .okay2
-.leftside2
-	inc hl
-.okay2
-	dec c
-	jr nz, .loop2
-	jr .loop
-; 8c538 (23:4538)
-
-.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
-; 8c578
-
-StartTrainerBattle_SetUpForRandomScatterOutro: ; 8c578 (23:4578)
-	farcall Function5602
-	ld a, $5 ; BANK(LYOverrides)
-	ld [rSVBK], a
-	call StartTrainerBattle_NextScene
-	ld a, $10
-	ld [wcf64], a
-	ld a, $1
-	ld [hBGMapMode], a
-	ret
-
-StartTrainerBattle_SpeckleToBlack: ; 8c58f (23:458f)
-	ld hl, wcf64
-	ld a, [hl]
-	and a
-	jr z, .done
-	dec [hl]
-	ld c, $c
-.loop
-	push bc
-	call .BlackOutRandomTile
-	pop bc
-	dec c
-	jr nz, .loop
-	ret
-
-.done
-	ld a, $1
-	ld [hBGMapMode], a
-	call DelayFrame
-	call DelayFrame
-	call DelayFrame
-	xor a
-	ld [hBGMapMode], a
-	ld a, $20
-	ld [wJumptableIndex], a
-	ret
-
-.BlackOutRandomTile: ; 8c5b8 (23:45b8)
-.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 $ff
-	jr z, .y_loop
-	ld [hl], $ff
-	ret
-
-StartTrainerBattle_LoadPokeBallGraphics: ; 8c5dc (23:45dc)
-	ld a, [OtherTrainerClass]
-	and a
-	jp z, .nextscene ; don't need to be here if wild
-
-	xor a
-	ld [hBGMapMode], a
-	hlcoord 0, 0, AttrMap
-	ld bc, SCREEN_HEIGHT * SCREEN_WIDTH
-	inc b
-	inc c
-	jr .enter_loop_midway
-
-.loop
-; set all pals to 7
-	ld a, [hl]
-	or %00000111
-	ld [hli], a
-.enter_loop_midway
-	dec c
-	jr nz, .loop
-	dec b
-	jr nz, .loop
-
-	call .loadpokeballgfx ; ld a, [OtherTrainerClass] \ ld de, PokeBallTransition \ ret
-	hlcoord 2, 1
-
-	ld b, SCREEN_WIDTH - 4
-.loop2
-	push hl
-	ld c, 2
-.loop3
-	push hl
-	ld a, [de]
-	inc de
-.loop4
-; Loading is done bit by bit
-	and a
-	jr z, .done
-	sla a
-	jr nc, .no_load
-	ld [hl], $fe
-.no_load
-	inc hl
-	jr .loop4
-
-.done
-	pop hl
-	push bc
-	ld bc, (SCREEN_WIDTH - 4) / 2
-	add hl, bc
-	pop bc
-	dec c
-	jr nz, .loop3
-
-	pop hl
-	push bc
-	ld bc, SCREEN_WIDTH
-	add hl, bc
-	pop bc
-	dec b
-	jr nz, .loop2
-
-	ld a, [hCGB]
-	and a
-	jr nz, .cgb
-	ld a, $1
-	ld [hBGMapMode], a
-	call DelayFrame
-	call DelayFrame
-	jr .nextscene
-
-.cgb
-	ld hl, .daypals
-	ld a, [TimeOfDayPal]
-	and (1 << 2) - 1
-	cp 3
-	jr nz, .daytime
-	ld hl, .nightpals
-.daytime
-	ld a, [rSVBK]
-	push af
-	ld a, $5 ; WRAM5 = palettes
-	ld [rSVBK], a
-	call .copypals
-	push hl
-	ld de, UnknBGPals palette PAL_BG_TEXT
-	ld bc, 1 palettes
-	call CopyBytes
-	pop hl
-	ld de, BGPals palette PAL_BG_TEXT
-	ld bc, 1 palettes
-	call CopyBytes
-	pop af
-	ld [rSVBK], a
-	ld a, $1
-	ld [hCGBPalUpdate], a
-	call DelayFrame
-	call BattleStart_CopyTilemapAtOnce
-
-.nextscene ; 8c673 (23:4673)
-	call StartTrainerBattle_NextScene
-	ret
-
-.copypals ; 8c677 (23:4677)
-	ld de, UnknBGPals palette PAL_BG_TEXT
-	call .copy
-	ld de, BGPals palette PAL_BG_TEXT
-	call .copy
-	ld de, UnknOBPals palette PAL_OW_TREE
-	call .copy
-	ld de, OBPals palette PAL_OW_TREE
-	call .copy
-	ld de, UnknOBPals palette PAL_OW_ROCK
-	call .copy
-	ld de, OBPals palette PAL_OW_ROCK
-
-.copy ; 8c698 (23:4698)
-	push hl
-	ld bc, 1 palettes
-	call CopyBytes
-	pop hl
-	ret
-; 8c6a1 (23:46a1)
-
-.daypals ; 8c6a1
-	RGB 31, 18, 29
-	RGB 31, 11, 15
-	RGB 31, 05, 05
-	RGB 07, 07, 07
-; 8c6a9
-
-.nightpals ; 8c6a9
-	RGB 31, 18, 29
-	RGB 31, 05, 05
-	RGB 31, 05, 05
-	RGB 31, 05, 05
-
-.loadpokeballgfx
-	ld a, [OtherTrainerClass]
-	ld de, PokeBallTransition
-	ret
-
-PokeBallTransition:
-	db %00000011, %11000000
-	db %00001111, %11110000
-	db %00111100, %00111100
-	db %00110000, %00001100
-	db %01100000, %00000110
-	db %01100011, %11000110
-	db %11000110, %01100011
-	db %11111100, %00111111
-	db %11111100, %00111111
-	db %11000110, %01100011
-	db %01100011, %11000110
-	db %01100000, %00000110
-	db %00110000, %00001100
-	db %00111100, %00111100
-	db %00001111, %11110000
-	db %00000011, %11000000
-
-WipeLYOverrides: ; 8c6d8
-	ld a, [rSVBK]
-	push af
-	ld a, $5
-	ld [rSVBK], a
-
-	ld hl, LYOverrides
-	call .wipe
-	ld hl, LYOverridesBackup
-	call .wipe
-
-	pop af
-	ld [rSVBK], a
-	ret
-; 8c6ef
-
-.wipe ; 8c6ef
-	xor a
-	ld c, SCREEN_HEIGHT_PX
-.loop
-	ld [hli], a
-	dec c
-	jr nz, .loop
-	ret
-; 8c6f7
-
-
-StartTrainerBattle_DrawSineWave: ; 8c6f7 (23:46f7)
-	and (1 << 6) - 1
-	cp 1 << 5
-	jr nc, .okay
-	call .DoSineWave
-	ld a, h
-	ret
-
-.okay
-	and (1 << 5) - 1
-	call .DoSineWave
-	ld a, h
-	xor -1 ; cpl
-	inc a
-	ret
-
-.DoSineWave: ; 8c70c (23:470c)
-	ld e, a
-	ld a, d
-	ld d, 0
-	ld hl, .sinewave
-	add hl, de
-	add hl, de
-	ld e, [hl]
-	inc hl
-	ld d, [hl]
-	ld hl, 0
-.loop
-	srl a
-	jr nc, .skip
-	add hl, de
-.skip
-	sla e
-	rl d
-	and a
-	jr nz, .loop
-	ret
-; 8c728 (23:4728)
-
-.sinewave ; 8c728
-	sine_wave $100
-; 8c768
-
-StartTrainerBattle_ZoomToBlack: ; 8c768 (23:4768)
-	farcall Function5602
-	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
-	ld [hBGMapMode], a
-	call .Copy
-	call WaitBGMap
-	jr .loop
-
-.done
-	ld a, $20
-	ld [wJumptableIndex], a
-	ret
-; 8c792 (23:4792)
-
-.boxes ; 8c792
-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
-; 8c7b7
-
-.Copy: ; 8c7b7 (23:47b7)
-	ld a, $ff
-.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
-; 8c7c9 (23:47c9)
-
-Function8c7c9:
-; XXX
-	ld a, $1
-	ld [hBGMapMode], a
-	call WaitBGMap
-	xor a
-	ld [hBGMapMode], a
-	ret
--- a/engine/map_setup.asm
+++ b/engine/map_setup.asm
@@ -1,4 +1,3 @@
-
 RunMapSetupScript:: ; 15363
 	ld a, [hMapEntryMethod]
 	and $f
@@ -15,184 +14,8 @@
 	ret
 ; 15377
 
-MapSetupScripts: ; 15377
-	dw MapSetupScript_Warp
-	dw MapSetupScript_Continue
-	dw MapSetupScript_ReloadMap
-	dw MapSetupScript_Teleport
-	dw MapSetupScript_Door
-	dw MapSetupScript_Fall
-	dw MapSetupScript_Connection
-	dw MapSetupScript_LinkReturn
-	dw MapSetupScript_Train
-	dw MapSetupScript_Submenu
-	dw MapSetupScript_BadWarp
-	dw MapSetupScript_Fly
-; 1538f
+INCLUDE "data/maps/map_setup_scripts.asm"
 
-MapSetupScript_Teleport: ; 1538f
-	db map_prolong_sprites
-MapSetupScript_Fly: ; 15390
-	db map_fade_out_palettes
-	db map_keep_roam
-MapSetupScript_Warp: ; 15392
-	db map_lcd_off
-	db map_sound_off
-	db map_load_spawn
-	db map_attributes
-	db map_change_callback
-	db map_spawn_coord
-	db map_player_coord
-	db map_anchor_screen
-	db map_load_blocks
-	db map_buffer_screen
-	db map_load_graphics
-	db map_time_of_day
-	db map_load_objects
-	db map_lcd_on
-	db map_palettes
-	db map_face_down
-	db map_sprites
-	db map_bike_music
-	db map_max_volume
-	db map_fade_in_palettes
-	db map_animations_on
-	db map_wildmons
-	db map_end
-
-MapSetupScript_BadWarp: ; 153a9
-	db map_load_spawn
-	db map_attributes
-	db map_change_callback
-	db map_spawn_coord
-	db map_player_coord
-	db map_anchor_screen
-	db map_load_blocks
-	db map_buffer_screen
-	db map_lcd_off
-	db map_load_graphics
-	db map_time_of_day
-	db map_fade_out_music
-	db map_lcd_on
-	db map_load_objects
-	db map_palettes
-	db map_face_down
-	db map_sprites
-	db map_fade_music
-	db map_fade_in_palettes
-	db map_animations_on
-	db map_wildmons
-	db map_end
-
-MapSetupScript_Connection: ; 153bf
-	db map_animations_off
-	db map_load_connection
-	db map_attributes
-	db map_change_callback
-	db map_player_coord
-	db map_load_blocks
-	db map_load_tileset
-	db map_save_screen
-	db map_load_objects
-	db map_fade_music
-	db map_palettes
-	db map_stop_script
-	db map_keep_palettes
-	db map_wildmons
-	db map_update_roam
-	db map_animations_on
-	db map_end
-
-MapSetupScript_Fall: ; 153d0
-	db map_prolong_sprites
-MapSetupScript_Door: ; 153d1
-	db map_fade_out_palettes
-MapSetupScript_Train: ; 153d2
-	db map_load_warp
-	db map_attributes
-	db map_warp_face
-	db map_change_callback
-	db map_player_coord
-	db map_load_blocks
-	db map_buffer_screen
-	db map_lcd_off
-	db map_load_graphics
-	db map_time_of_day
-	db map_fade_out_music
-	db map_lcd_on
-	db map_load_objects
-	db map_palettes
-	db map_sprites
-	db map_fade_music
-	db map_fade_in_palettes
-	db map_animations_on
-	db map_wildmons
-	db map_update_roam
-	db map_end
-
-MapSetupScript_ReloadMap: ; 153e7
-	db map_fade
-	db map_clear_bg_palettes
-	db map_lcd_off
-	db map_sound_off
-	db map_load_blocks
-	db map_connection_blocks
-	db map_load_graphics
-	db map_time_of_day
-	db map_lcd_on
-	db map_palettes
-	db map_sprites
-	db map_music_force
-	db map_fade_in_palettes
-	db map_animations_on
-	db map_wildmons
-	db map_end
-
-MapSetupScript_LinkReturn: ; 153f7
-	db map_fade
-	db map_lcd_off
-	db map_sound_off
-	db map_change_callback
-	db map_load_blocks
-	db map_buffer_screen
-	db map_load_graphics
-	db map_time_of_day
-	db map_lcd_on
-	db map_palettes
-	db map_sprites
-	db map_bike_music
-	db map_fade_in_palettes
-	db map_animations_on
-	db map_wildmons
-	db map_text_scroll_off
-	db map_end
-
-MapSetupScript_Continue: ; 15408
-	db map_lcd_off
-	db map_sound_off
-	db map_attributes_2
-	db map_anchor_screen
-	db map_start_callback
-	db map_load_blocks
-	db map_connection_blocks
-	db map_buffer_screen
-	db map_load_graphics
-	db map_time_of_day
-	db map_lcd_on
-	db map_palettes
-	db map_sprites
-	db map_bike_music
-	db map_fade_in_palettes
-	db map_animations_on
-	db map_wildmons
-	db map_end
-
-MapSetupScript_Submenu: ; 1541a
-	db map_load_blocks
-	db map_connection_blocks
-	db map_end
-
-
 ReadMapSetupScript: ; 1541d
 .loop
 	ld a, [hli]
@@ -238,6 +61,7 @@
 ; 15440
 
 MapSetupCommands: ; 15440
+; entries correspond to command indexes in constants/map_setup_constants.asm
 	dba EnableLCD ; 00
 	dba DisableLCD ; 01
 	dba MapSetup_Sound_Off ; 02
--- a/engine/mystery_gift_2.asm
+++ b/engine/mystery_gift_2.asm
@@ -147,6 +147,6 @@
 ; 2c725 (b:4725)
 
 
-INCLUDE "data/mystery_gift/items.asm"
+INCLUDE "data/mystery_gift_items.asm"
 
-INCLUDE "data/mystery_gift/decos.asm"
+INCLUDE "data/mystery_gift_decos.asm"
--- a/engine/pokegear.asm
+++ b/engine/pokegear.asm
@@ -2338,7 +2338,7 @@
 
 ; 91c5e
 
-INCLUDE "data/flypoints.asm"
+INCLUDE "data/maps/flypoints.asm"
 
 ret_91c8f: ; 91c8f
 	ret
--- a/engine/read_trainer_attributes.asm
+++ /dev/null
@@ -1,64 +1,0 @@
-GetTrainerClassName: ; 3952d
-	ld hl, RivalName
-	ld a, c
-	cp RIVAL1
-	jr z, .rival
-
-	ld [CurSpecies], a
-	ld a, TRAINER_NAME
-	ld [wNamedObjectTypeBuffer], a
-	call GetName
-	ld de, StringBuffer1
-	ret
-
-.rival
-	ld de, StringBuffer1
-	push de
-	ld bc, NAME_LENGTH
-	call CopyBytes
-	pop de
-	ret
-
-GetOTName: ; 39550
-	ld hl, OTPlayerName
-	ld a, [wLinkMode]
-	and a
-	jr nz, .ok
-
-	ld hl, RivalName
-	ld a, c
-	cp RIVAL1
-	jr z, .ok
-
-	ld [CurSpecies], a
-	ld a, TRAINER_NAME
-	ld [wNamedObjectTypeBuffer], a
-	call GetName
-	ld hl, StringBuffer1
-
-.ok
-	ld bc, TRAINER_CLASS_NAME_LENGTH
-	ld de, OTClassName
-	push de
-	call CopyBytes
-	pop de
-	ret
-
-GetTrainerAttributes: ; 3957b
-	ld a, [TrainerClass]
-	ld c, a
-	call GetOTName
-	ld a, [TrainerClass]
-	dec a
-	ld hl, TrainerClassAttributes + TRNATTR_ITEM1
-	ld bc, NUM_TRAINER_ATTRIBUTES
-	call AddNTimes
-	ld de, wEnemyTrainerItem1
-	ld a, [hli]
-	ld [de], a
-	inc de
-	ld a, [hli]
-	ld [de], a
-	ld a, [hl]
-	ld [wEnemyTrainerBaseReward], a
-	ret
--- a/engine/read_trainer_party.asm
+++ /dev/null
@@ -1,398 +1,0 @@
-
-ReadTrainerParty: ; 39771
-	ld a, [InBattleTowerBattle]
-	bit 0, a
-	ret nz
-
-	ld a, [wLinkMode]
-	and a
-	ret nz
-
-	ld hl, OTPartyCount
-	xor a
-	ld [hli], a
-	dec a
-	ld [hl], a
-
-	ld hl, OTPartyMons
-	ld bc, OTPartyMonsEnd - OTPartyMons
-	xor a
-	call ByteFill
-
-	ld a, [OtherTrainerClass]
-	cp CAL
-	jr nz, .not_cal2
-	ld a, [OtherTrainerID]
-	cp CAL2
-	jr z, .cal2
-	ld a, [OtherTrainerClass]
-.not_cal2
-
-	dec a
-	ld c, a
-	ld b, 0
-	ld hl, TrainerGroups
-	add hl, bc
-	add hl, bc
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-
-	ld a, [OtherTrainerID]
-	ld b, a
-.skip_trainer
-	dec b
-	jr z, .got_trainer
-.loop
-	ld a, [hli]
-	cp $ff
-	jr nz, .loop
-	jr .skip_trainer
-.got_trainer
-
-.skip_name
-	ld a, [hli]
-	cp "@"
-	jr nz, .skip_name
-
-	ld a, [hli]
-	ld c, a
-	ld b, 0
-	ld d, h
-	ld e, l
-	ld hl, TrainerTypes
-	add hl, bc
-	add hl, bc
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	ld bc, .done
-	push bc
-	jp hl
-
-.done
-	jp ComputeTrainerReward
-
-.cal2
-	ld a, BANK(sMysteryGiftTrainer)
-	call GetSRAMBank
-	ld de, sMysteryGiftTrainer
-	call TrainerType2
-	call CloseSRAM
-	jr .done
-; 397e3
-
-TrainerTypes: ; 397e3
-	dw TrainerType1 ; level, species
-	dw TrainerType2 ; level, species, moves
-	dw TrainerType3 ; level, species, item
-	dw TrainerType4 ; level, species, item, moves
-; 397eb
-
-TrainerType1: ; 397eb
-; normal (level, species)
-	ld h, d
-	ld l, e
-.loop
-	ld a, [hli]
-	cp $ff
-	ret z
-
-	ld [CurPartyLevel], a
-	ld a, [hli]
-	ld [CurPartySpecies], a
-	ld a, OTPARTYMON
-	ld [MonType], a
-	push hl
-	predef TryAddMonToParty
-	pop hl
-	jr .loop
-; 39806
-
-TrainerType2: ; 39806
-; moves
-	ld h, d
-	ld l, e
-.loop
-	ld a, [hli]
-	cp $ff
-	ret z
-
-	ld [CurPartyLevel], a
-	ld a, [hli]
-	ld [CurPartySpecies], a
-	ld a, OTPARTYMON
-	ld [MonType], a
-
-	push hl
-	predef TryAddMonToParty
-	ld a, [OTPartyCount]
-	dec a
-	ld hl, OTPartyMon1Moves
-	ld bc, PARTYMON_STRUCT_LENGTH
-	call AddNTimes
-	ld d, h
-	ld e, l
-	pop hl
-
-	ld b, NUM_MOVES
-.copy_moves
-	ld a, [hli]
-	ld [de], a
-	inc de
-	dec b
-	jr nz, .copy_moves
-
-	push hl
-
-	ld a, [OTPartyCount]
-	dec a
-	ld hl, OTPartyMon1Species
-	ld bc, PARTYMON_STRUCT_LENGTH
-	call AddNTimes
-	ld d, h
-	ld e, l
-	ld hl, MON_PP
-	add hl, de
-	push hl
-	ld hl, MON_MOVES
-	add hl, de
-	pop de
-
-	ld b, NUM_MOVES
-.copy_pp
-	ld a, [hli]
-	and a
-	jr z, .copied_pp
-
-	push hl
-	push bc
-	dec a
-	ld hl, Moves + MOVE_PP
-	ld bc, MOVE_LENGTH
-	call AddNTimes
-	ld a, BANK(Moves)
-	call GetFarByte
-	pop bc
-	pop hl
-
-	ld [de], a
-	inc de
-	dec b
-	jr nz, .copy_pp
-.copied_pp
-
-	pop hl
-	jr .loop
-; 39871
-
-TrainerType3: ; 39871
-; item
-	ld h, d
-	ld l, e
-.loop
-	ld a, [hli]
-	cp $ff
-	ret z
-
-	ld [CurPartyLevel], a
-	ld a, [hli]
-	ld [CurPartySpecies], a
-	ld a, OTPARTYMON
-	ld [MonType], a
-	push hl
-	predef TryAddMonToParty
-	ld a, [OTPartyCount]
-	dec a
-	ld hl, OTPartyMon1Item
-	ld bc, PARTYMON_STRUCT_LENGTH
-	call AddNTimes
-	ld d, h
-	ld e, l
-	pop hl
-	ld a, [hli]
-	ld [de], a
-	jr .loop
-; 3989d (e:589d)
-
-TrainerType4: ; 3989d
-; item + moves
-	ld h, d
-	ld l, e
-.loop
-	ld a, [hli]
-	cp $ff
-	ret z
-
-	ld [CurPartyLevel], a
-	ld a, [hli]
-	ld [CurPartySpecies], a
-
-	ld a, OTPARTYMON
-	ld [MonType], a
-
-	push hl
-	predef TryAddMonToParty
-	ld a, [OTPartyCount]
-	dec a
-	ld hl, OTPartyMon1Item
-	ld bc, PARTYMON_STRUCT_LENGTH
-	call AddNTimes
-	ld d, h
-	ld e, l
-	pop hl
-
-	ld a, [hli]
-	ld [de], a
-
-	push hl
-	ld a, [OTPartyCount]
-	dec a
-	ld hl, OTPartyMon1Moves
-	ld bc, PARTYMON_STRUCT_LENGTH
-	call AddNTimes
-	ld d, h
-	ld e, l
-	pop hl
-
-	ld b, NUM_MOVES
-.copy_moves
-	ld a, [hli]
-	ld [de], a
-	inc de
-	dec b
-	jr nz, .copy_moves
-
-	push hl
-
-	ld a, [OTPartyCount]
-	dec a
-	ld hl, OTPartyMon1
-	ld bc, PARTYMON_STRUCT_LENGTH
-	call AddNTimes
-	ld d, h
-	ld e, l
-	ld hl, MON_PP
-	add hl, de
-
-	push hl
-	ld hl, MON_MOVES
-	add hl, de
-	pop de
-
-	ld b, NUM_MOVES
-.copy_pp
-	ld a, [hli]
-	and a
-	jr z, .copied_pp
-
-	push hl
-	push bc
-	dec a
-	ld hl, Moves + MOVE_PP
-	ld bc, MOVE_LENGTH
-	call AddNTimes
-	ld a, BANK(Moves)
-	call GetFarByte
-	pop bc
-	pop hl
-
-	ld [de], a
-	inc de
-	dec b
-	jr nz, .copy_pp
-.copied_pp
-
-	pop hl
-	jr .loop
-; 3991b
-
-ComputeTrainerReward: ; 3991b (e:591b)
-	ld hl, hProduct
-	xor a
-	ld [hli], a
-	ld [hli], a
-	ld [hli], a
-	ld a, [wEnemyTrainerBaseReward]
-	ld [hli], a
-	ld a, [CurPartyLevel]
-	ld [hl], a
-	call Multiply
-	ld hl, wBattleReward
-	xor a
-	ld [hli], a
-	ld a, [hProduct + 2]
-	ld [hli], a
-	ld a, [hProduct + 3]
-	ld [hl], a
-	ret
-
-
-Battle_GetTrainerName:: ; 39939
-	ld a, [InBattleTowerBattle]
-	bit 0, a
-	ld hl, OTPlayerName
-	jp nz, CopyTrainerName
-
-	ld a, [OtherTrainerID]
-	ld b, a
-	ld a, [OtherTrainerClass]
-	ld c, a
-
-GetTrainerName:: ; 3994c
-	ld a, c
-	cp CAL
-	jr nz, .not_cal2
-
-	ld a, BANK(sMysteryGiftTrainerHouseFlag)
-	call GetSRAMBank
-	ld a, [sMysteryGiftTrainerHouseFlag]
-	and a
-	call CloseSRAM
-	jr z, .not_cal2
-
-	ld a, BANK(sMysteryGiftPartnerName)
-	call GetSRAMBank
-	ld hl, sMysteryGiftPartnerName
-	call CopyTrainerName
-	jp CloseSRAM
-
-.not_cal2
-	dec c
-	push bc
-	ld b, 0
-	ld hl, TrainerGroups
-	add hl, bc
-	add hl, bc
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	pop bc
-
-.loop
-	dec b
-	jr z, CopyTrainerName
-
-.skip
-	ld a, [hli]
-	cp $ff
-	jr nz, .skip
-	jr .loop
-
-CopyTrainerName: ; 39984
-	ld de, StringBuffer1
-	push de
-	ld bc, NAME_LENGTH
-	call CopyBytes
-	pop de
-	ret
-; 39990
-
-Function39990: ; 39990
-; This function is useless.
-	ld de, StringBuffer1
-	push de
-	ld bc, NAME_LENGTH
-	pop de
-	ret
-; 39999
--- a/engine/sprites.asm
+++ b/engine/sprites.asm
@@ -551,13 +551,13 @@
 ; 8d1c4
 
 
-INCLUDE "data/sprite_anim_seqs.asm"
+INCLUDE "data/sprites/sequences.asm"
 
 INCLUDE "engine/sprite_anims.asm"
 
-INCLUDE "data/sprite_anim_frames.asm"
+INCLUDE "data/sprites/framesets.asm"
 
-INCLUDE "data/sprite_anim_oam.asm"
+INCLUDE "data/sprites/oam.asm"
 
 
 BrokenStdGFXPointers: ; Broken 2bpp pointers
--- a/engine/start_battle.asm
+++ /dev/null
@@ -1,197 +1,0 @@
-ShowLinkBattleParticipants: ; 2ee18
-; If we're not in a communications room,
-; we don't need to be here.
-	ld a, [wLinkMode]
-	and a
-	ret z
-
-	farcall _ShowLinkBattleParticipants
-	ld c, 150
-	call DelayFrames
-	call ClearTileMap
-	call ClearSprites
-	ret
-
-FindFirstAliveMonAndStartBattle: ; 2ee2f
-	xor a
-	ld [hMapAnims], a
-	call DelayFrame
-	ld b, 6
-	ld hl, PartyMon1HP
-	ld de, PARTYMON_STRUCT_LENGTH - 1
-
-.loop
-	ld a, [hli]
-	or [hl]
-	jr nz, .okay
-	add hl, de
-	dec b
-	jr nz, .loop
-
-.okay
-	ld de, MON_LEVEL - MON_HP
-	add hl, de
-	ld a, [hl]
-	ld [BattleMonLevel], a
-	predef Predef_StartBattle
-	farcall _LoadBattleFontsHPBar
-	ld a, 1
-	ld [hBGMapMode], a
-	call ClearSprites
-	call ClearTileMap
-	xor a
-	ld [hBGMapMode], a
-	ld [hWY], a
-	ld [rWY], a
-	ld [hMapAnims], a
-	ret
-
-PlayBattleMusic: ; 2ee6c
-	push hl
-	push de
-	push bc
-
-	xor a
-	ld [MusicFade], a
-	ld de, MUSIC_NONE
-	call PlayMusic
-	call DelayFrame
-	call MaxVolume
-
-	ld a, [BattleType]
-	cp BATTLETYPE_SUICUNE
-	ld de, MUSIC_SUICUNE_BATTLE
-	jp z, .done
-	cp BATTLETYPE_ROAMING
-	jp z, .done
-
-	; Are we fighting a trainer?
-	ld a, [OtherTrainerClass]
-	and a
-	jr nz, .trainermusic
-
-	farcall RegionCheck
-	ld a, e
-	and a
-	jr nz, .kantowild
-
-	ld de, MUSIC_JOHTO_WILD_BATTLE
-	ld a, [TimeOfDay]
-	cp NITE_F
-	jr nz, .done
-	ld de, MUSIC_JOHTO_WILD_BATTLE_NIGHT
-	jr .done
-
-.kantowild
-	ld de, MUSIC_KANTO_WILD_BATTLE
-	jr .done
-
-.trainermusic
-	ld de, MUSIC_CHAMPION_BATTLE
-	cp CHAMPION
-	jr z, .done
-	cp RED
-	jr z, .done
-
-	; really, they should have included admins and scientists here too...
-	ld de, MUSIC_ROCKET_BATTLE
-	cp GRUNTM
-	jr z, .done
-	cp GRUNTF
-	jr z, .done
-
-	ld de, MUSIC_KANTO_GYM_LEADER_BATTLE
-	farcall IsKantoGymLeader
-	jr c, .done
-
-	ld de, MUSIC_JOHTO_GYM_LEADER_BATTLE
-	farcall IsJohtoGymLeader
-	jr c, .done
-
-	ld de, MUSIC_RIVAL_BATTLE
-	ld a, [OtherTrainerClass]
-	cp RIVAL1
-	jr z, .done
-	cp RIVAL2
-	jr nz, .othertrainer
-
-	ld a, [OtherTrainerID]
-	cp RIVAL2_2_CHIKORITA ; Rival in Indigo Plateau
-	jr c, .done
-	ld de, MUSIC_CHAMPION_BATTLE
-	jr .done
-
-.othertrainer
-	ld a, [wLinkMode]
-	and a
-	jr nz, .johtotrainer
-
-	farcall RegionCheck
-	ld a, e
-	and a
-	jr nz, .kantotrainer
-
-.johtotrainer
-	ld de, MUSIC_JOHTO_TRAINER_BATTLE
-	jr .done
-
-.kantotrainer
-	ld de, MUSIC_KANTO_TRAINER_BATTLE
-
-.done
-	call PlayMusic
-
-	pop bc
-	pop de
-	pop hl
-	ret
-
-ClearBattleRAM: ; 2ef18
-	xor a
-	ld [wPlayerAction], a
-	ld [wBattleResult], a
-
-	ld hl, wPartyMenuCursor
-	ld [hli], a
-	ld [hli], a
-	ld [hli], a
-	ld [hl], a
-
-	ld [wMenuScrollPosition], a
-	ld [CriticalHit], a
-	ld [BattleMonSpecies], a
-	ld [wBattleParticipantsNotFainted], a
-	ld [CurBattleMon], a
-	ld [wForcedSwitch], a
-	ld [TimeOfDayPal], a
-	ld [PlayerTurnsTaken], a
-	ld [EnemyTurnsTaken], a
-	ld [EvolvableFlags], a
-
-	ld hl, PlayerHPPal
-	ld [hli], a
-	ld [hl], a
-
-	ld hl, BattleMonDVs
-	ld [hli], a
-	ld [hl], a
-
-	ld hl, EnemyMonDVs
-	ld [hli], a
-	ld [hl], a
-
-; Clear the entire BattleMons area
-	ld hl, wBattle
-	ld bc, wBattleEnd - wBattle
-	xor a
-	call ByteFill
-
-	callfar ResetEnemyStatLevels
-
-	call ClearWindowData
-
-	ld hl, hBGMapAddress
-	xor a ; LOW(VBGMap0)
-	ld [hli], a
-	ld [hl], HIGH(VBGMap0)
-	ret
--- a/engine/tmhm.asm
+++ b/engine/tmhm.asm
@@ -46,4 +46,4 @@
 ; 1167a
 
 
-INCLUDE "data/tmhm_moves.asm"
+INCLUDE "data/moves/tmhm_moves.asm"
--- a/engine/trainer_scripts.asm
+++ /dev/null
@@ -1,31 +1,0 @@
-TalkToTrainerScript:: ; 0xbe66a
-	faceplayer
-	trainerflagaction CHECK_FLAG
-	iftrue AlreadyBeatenTrainerScript
-	loadmemtrainer
-	encountermusic
-	jump StartBattleWithMapTrainerScript
-
-SeenByTrainerScript:: ; 0xbe675
-	loadmemtrainer
-	encountermusic
-	showemote EMOTE_SHOCK, LAST_TALKED, 30
-	callasm TrainerWalkToPlayer
-	applymovement2 MovementBuffer
-	writeobjectxy LAST_TALKED
-	faceobject PLAYER, LAST_TALKED
-	jump StartBattleWithMapTrainerScript
-
-StartBattleWithMapTrainerScript: ; 0xbe68a
-	opentext
-	trainertext $0
-	waitbutton
-	closetext
-	loadmemtrainer
-	startbattle
-	reloadmapafterbattle
-	trainerflagaction SET_FLAG
-	loadvar wRunningTrainerBattleScript, -1
-
-AlreadyBeatenTrainerScript:
-	scripttalkafter
--- /dev/null
+++ b/engine/types.asm
@@ -1,0 +1,101 @@
+PrintMonTypes: ; 5090d
+; Print one or both types of [CurSpecies]
+; on the stats screen at hl.
+
+	push hl
+	call GetBaseData
+	pop hl
+
+	push hl
+	ld a, [BaseType1]
+	call .Print
+
+	; Single-typed monsters really
+	; have two of the same type.
+	ld a, [BaseType1]
+	ld b, a
+	ld a, [BaseType2]
+	cp b
+	pop hl
+	jr z, .hide_type_2
+
+	ld bc, SCREEN_WIDTH
+	add hl, bc
+
+.Print:
+	ld b, a
+	jr PrintType
+
+.hide_type_2
+	; Erase any type name that was here before.
+	; Seems to be pointless in localized versions.
+	ld a, " "
+	ld bc, SCREEN_WIDTH - 3
+	add hl, bc
+	ld [hl], a
+	inc bc
+	add hl, bc
+	ld bc, 5
+	jp ByteFill
+; 5093a
+
+
+PrintMoveType: ; 5093a
+; Print the type of move b at hl.
+
+	push hl
+	ld a, b
+	dec a
+	ld bc, MOVE_LENGTH
+	ld hl, Moves
+	call AddNTimes
+	ld de, StringBuffer1
+	ld a, BANK(Moves)
+	call FarCopyBytes
+	ld a, [StringBuffer1 + MOVE_TYPE]
+	pop hl
+
+	ld b, a
+
+
+PrintType: ; 50953
+; Print type b at hl.
+
+	ld a, b
+
+	push hl
+	add a
+	ld hl, TypeNames
+	ld e, a
+	ld d, 0
+	add hl, de
+	ld a, [hli]
+	ld e, a
+	ld d, [hl]
+	pop hl
+
+	jp PlaceString
+; 50964
+
+
+GetTypeName: ; 50964
+; Copy the name of type [wd265] to StringBuffer1.
+
+	ld a, [wd265]
+	ld hl, TypeNames
+	ld e, a
+	ld d, 0
+	add hl, de
+	add hl, de
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	ld de, StringBuffer1
+	ld bc, 13
+	jp CopyBytes
+; 5097b
+
+
+INCLUDE "data/type_names.asm"
+
+; 50a28
--- /dev/null
+++ b/gfx/anims.asm
@@ -1,0 +1,41 @@
+AnimObj00GFX: ; 84a2e
+AnimObjHitGFX:       INCBIN "gfx/anims/hit.2bpp.lz"
+AnimObjCutGFX:       INCBIN "gfx/anims/cut.2bpp.lz"
+AnimObjFireGFX:      INCBIN "gfx/anims/fire.2bpp.lz"
+AnimObjWaterGFX:     INCBIN "gfx/anims/water.2bpp.lz"
+AnimObjLightningGFX: INCBIN "gfx/anims/lightning.2bpp.lz"
+AnimObjSmokeGFX:     INCBIN "gfx/anims/smoke.2bpp.lz"
+AnimObjExplosionGFX: INCBIN "gfx/anims/explosion.2bpp.lz"
+AnimObjIceGFX:       INCBIN "gfx/anims/ice.2bpp.lz"
+AnimObjRocksGFX:     INCBIN "gfx/anims/rocks.2bpp.lz"
+AnimObjPoisonGFX:    INCBIN "gfx/anims/poison.2bpp.lz"
+AnimObjPlantGFX:     INCBIN "gfx/anims/plant.2bpp.lz"
+AnimObjPokeBallGFX:  INCBIN "gfx/anims/pokeball.2bpp.lz"
+AnimObjBubbleGFX:    INCBIN "gfx/anims/bubble.2bpp.lz"
+AnimObjNoiseGFX:     INCBIN "gfx/anims/noise.2bpp.lz"
+AnimObjReflectGFX:   INCBIN "gfx/anims/reflect.2bpp.lz"
+AnimObjPowderGFX:    INCBIN "gfx/anims/powder.2bpp.lz"
+AnimObjBeamGFX:      INCBIN "gfx/anims/beam.2bpp.lz"
+AnimObjSpeedGFX:     INCBIN "gfx/anims/speed.2bpp.lz"
+AnimObjChargeGFX:    INCBIN "gfx/anims/charge.2bpp.lz"
+AnimObjWindGFX:      INCBIN "gfx/anims/wind.2bpp.lz"
+AnimObjWhipGFX:      INCBIN "gfx/anims/whip.2bpp.lz"
+AnimObjRopeGFX:      INCBIN "gfx/anims/rope.2bpp.lz"
+AnimObjEggGFX:       INCBIN "gfx/anims/egg.2bpp.lz"
+AnimObjPsychicGFX:   INCBIN "gfx/anims/psychic.2bpp.lz"
+AnimObjSandGFX:      INCBIN "gfx/anims/sand.2bpp.lz"
+AnimObjWebGFX:       INCBIN "gfx/anims/web.2bpp.lz"
+AnimObjHazeGFX:      INCBIN "gfx/anims/haze.2bpp.lz"
+AnimObjHornGFX:      INCBIN "gfx/anims/horn.2bpp.lz"
+AnimObjFlowerGFX:    INCBIN "gfx/anims/flower.2bpp.lz"
+AnimObjMiscGFX:      INCBIN "gfx/anims/misc.2bpp.lz"
+AnimObjSkyAttackGFX: INCBIN "gfx/anims/skyattack.2bpp.lz"
+AnimObjGlobeGFX:     INCBIN "gfx/anims/globe.2bpp.lz"
+AnimObjShapesGFX:    INCBIN "gfx/anims/shapes.2bpp.lz"
+AnimObjStatusGFX:    INCBIN "gfx/anims/status.2bpp.lz"
+AnimObjObjectsGFX:   INCBIN "gfx/anims/objects.2bpp.lz"
+AnimObjShineGFX:     INCBIN "gfx/anims/shine.2bpp.lz"
+AnimObjAngelsGFX:    INCBIN "gfx/anims/angels.2bpp.lz"
+AnimObjWaveGFX:      INCBIN "gfx/anims/wave.2bpp.lz"
+AnimObjAeroblastGFX: INCBIN "gfx/anims/aeroblast.2bpp.lz"
+; 8640e
binary files /dev/null b/gfx/anims/aeroblast.2bpp.lz.2f07c4ea differ
binary files /dev/null b/gfx/anims/aeroblast.png differ
binary files /dev/null b/gfx/anims/angels.2bpp.lz.b026d81e differ
binary files /dev/null b/gfx/anims/angels.png differ
binary files /dev/null b/gfx/anims/beam.2bpp.lz.80b6d613 differ
binary files /dev/null b/gfx/anims/beam.png differ
binary files /dev/null b/gfx/anims/bubble.2bpp.lz.03b8ac99 differ
binary files /dev/null b/gfx/anims/bubble.png differ
binary files /dev/null b/gfx/anims/charge.2bpp.lz.95d3ea98 differ
binary files /dev/null b/gfx/anims/charge.png differ
binary files /dev/null b/gfx/anims/cut.2bpp.lz.03d343ed differ
binary files /dev/null b/gfx/anims/cut.png differ
binary files /dev/null b/gfx/anims/egg.2bpp.lz.41dd1a53 differ
binary files /dev/null b/gfx/anims/egg.png differ
binary files /dev/null b/gfx/anims/explosion.2bpp.lz.55fc334f differ
binary files /dev/null b/gfx/anims/explosion.png differ
binary files /dev/null b/gfx/anims/fire.2bpp.lz.d7701cda differ
binary files /dev/null b/gfx/anims/fire.png differ
binary files /dev/null b/gfx/anims/flower.2bpp.lz.1bc2e9d2 differ
binary files /dev/null b/gfx/anims/flower.png differ
binary files /dev/null b/gfx/anims/globe.2bpp.lz.710dbb8e differ
binary files /dev/null b/gfx/anims/globe.png differ
binary files /dev/null b/gfx/anims/haze.2bpp.lz.91424607 differ
binary files /dev/null b/gfx/anims/haze.png differ
binary files /dev/null b/gfx/anims/hit.2bpp.lz.2b3c83f2 differ
binary files /dev/null b/gfx/anims/hit.png differ
binary files /dev/null b/gfx/anims/horn.2bpp.lz.48908aae differ
binary files /dev/null b/gfx/anims/horn.png differ
binary files /dev/null b/gfx/anims/ice.2bpp.lz.664d900f differ
binary files /dev/null b/gfx/anims/ice.png differ
binary files /dev/null b/gfx/anims/lightning.2bpp.lz.a88fc131 differ
binary files /dev/null b/gfx/anims/lightning.png differ
binary files /dev/null b/gfx/anims/misc.2bpp.lz.4b20c3d7 differ
binary files /dev/null b/gfx/anims/misc.png differ
binary files /dev/null b/gfx/anims/noise.2bpp.lz.acb4a76e differ
binary files /dev/null b/gfx/anims/noise.png differ
binary files /dev/null b/gfx/anims/objects.2bpp.lz.83f812de differ
binary files /dev/null b/gfx/anims/objects.png differ
--- /dev/null
+++ b/gfx/anims/plant.2bpp.lz.4a00c417
@@ -1,0 +1,3 @@
+a<<~B��ߡ>�����
+<$xx��c	>2��88i��~Bø}c}CC��➆�xx<$|D~B^b3=a��C	e00PpC��
+=%}EC_c�����<�>��c����_aOq'83<e
79Nr����
)���`�@I@�  00<,.2/1'9a��
,4\d����	������
\ No newline at end of file
binary files /dev/null b/gfx/anims/plant.png differ
binary files /dev/null b/gfx/anims/poison.2bpp.lz.fc7dc9c1 differ
binary files /dev/null b/gfx/anims/poison.png differ
binary files /dev/null b/gfx/anims/pokeball.2bpp.lz.c58f7e01 differ
binary files /dev/null b/gfx/anims/pokeball.png differ
--- /dev/null
+++ b/gfx/anims/powder.2bpp.lz.bfd566bb
@@ -1,0 +1,1 @@
+@@��GEa8(@@��EG��Î
\ No newline at end of file
binary files /dev/null b/gfx/anims/powder.png differ
binary files /dev/null b/gfx/anims/psychic.2bpp.lz.d80f285c differ
binary files /dev/null b/gfx/anims/psychic.png differ
binary files /dev/null b/gfx/anims/reflect.2bpp.lz.9a9c822d differ
binary files /dev/null b/gfx/anims/reflect.png differ
binary files /dev/null b/gfx/anims/rocks.2bpp.lz.73d0153e differ
binary files /dev/null b/gfx/anims/rocks.png differ
binary files /dev/null b/gfx/anims/rope.2bpp.lz.209d63dd differ
binary files /dev/null b/gfx/anims/rope.png differ
binary files /dev/null b/gfx/anims/sand.2bpp.lz.c87c0eaa differ
binary files /dev/null b/gfx/anims/sand.png differ
binary files /dev/null b/gfx/anims/shapes.2bpp.lz.262d77f0 differ
binary files /dev/null b/gfx/anims/shapes.png differ
binary files /dev/null b/gfx/anims/shine.2bpp.lz.5fb79056 differ
binary files /dev/null b/gfx/anims/shine.png differ
binary files /dev/null b/gfx/anims/skyattack.2bpp.lz.31738ab8 differ
binary files /dev/null b/gfx/anims/skyattack.png differ
binary files /dev/null b/gfx/anims/smoke.2bpp.lz.aa05905e differ
binary files /dev/null b/gfx/anims/smoke.png differ
binary files /dev/null b/gfx/anims/speed.2bpp.lz.1732b364 differ
binary files /dev/null b/gfx/anims/speed.png differ
binary files /dev/null b/gfx/anims/status.2bpp.lz.0c0aa13e differ
binary files /dev/null b/gfx/anims/status.png differ
binary files /dev/null b/gfx/anims/water.2bpp.lz.7b52ed12 differ
binary files /dev/null b/gfx/anims/water.png differ
binary files /dev/null b/gfx/anims/wave.2bpp.lz.bee99402 differ
binary files /dev/null b/gfx/anims/wave.png differ
binary files /dev/null b/gfx/anims/web.2bpp.lz.80e3d480 differ
binary files /dev/null b/gfx/anims/web.png differ
binary files /dev/null b/gfx/anims/whip.2bpp.lz.d80d8d6e differ
binary files /dev/null b/gfx/anims/whip.png differ
binary files /dev/null b/gfx/anims/wind.2bpp.lz.5a785180 differ
binary files /dev/null b/gfx/anims/wind.png differ
binary files a/gfx/fx/aeroblast.2bpp.lz.2f07c4ea /dev/null differ
binary files a/gfx/fx/aeroblast.png /dev/null differ
binary files a/gfx/fx/angels.2bpp.lz.b026d81e /dev/null differ
binary files a/gfx/fx/angels.png /dev/null differ
binary files a/gfx/fx/beam.2bpp.lz.80b6d613 /dev/null differ
binary files a/gfx/fx/beam.png /dev/null differ
binary files a/gfx/fx/bubble.2bpp.lz.03b8ac99 /dev/null differ
binary files a/gfx/fx/bubble.png /dev/null differ
binary files a/gfx/fx/charge.2bpp.lz.95d3ea98 /dev/null differ
binary files a/gfx/fx/charge.png /dev/null differ
binary files a/gfx/fx/cut.2bpp.lz.03d343ed /dev/null differ
binary files a/gfx/fx/cut.png /dev/null differ
binary files a/gfx/fx/egg.2bpp.lz.41dd1a53 /dev/null differ
binary files a/gfx/fx/egg.png /dev/null differ
binary files a/gfx/fx/explosion.2bpp.lz.55fc334f /dev/null differ
binary files a/gfx/fx/explosion.png /dev/null differ
binary files a/gfx/fx/fire.2bpp.lz.d7701cda /dev/null differ
binary files a/gfx/fx/fire.png /dev/null differ
binary files a/gfx/fx/flower.2bpp.lz.1bc2e9d2 /dev/null differ
binary files a/gfx/fx/flower.png /dev/null differ
binary files a/gfx/fx/globe.2bpp.lz.710dbb8e /dev/null differ
binary files a/gfx/fx/globe.png /dev/null differ
binary files a/gfx/fx/haze.2bpp.lz.91424607 /dev/null differ
binary files a/gfx/fx/haze.png /dev/null differ
binary files a/gfx/fx/hit.2bpp.lz.2b3c83f2 /dev/null differ
binary files a/gfx/fx/hit.png /dev/null differ
binary files a/gfx/fx/horn.2bpp.lz.48908aae /dev/null differ
binary files a/gfx/fx/horn.png /dev/null differ
binary files a/gfx/fx/ice.2bpp.lz.664d900f /dev/null differ
binary files a/gfx/fx/ice.png /dev/null differ
binary files a/gfx/fx/lightning.2bpp.lz.a88fc131 /dev/null differ
binary files a/gfx/fx/lightning.png /dev/null differ
binary files a/gfx/fx/misc.2bpp.lz.4b20c3d7 /dev/null differ
binary files a/gfx/fx/misc.png /dev/null differ
binary files a/gfx/fx/noise.2bpp.lz.acb4a76e /dev/null differ
binary files a/gfx/fx/noise.png /dev/null differ
binary files a/gfx/fx/objects.2bpp.lz.83f812de /dev/null differ
binary files a/gfx/fx/objects.png /dev/null differ
--- a/gfx/fx/plant.2bpp.lz.4a00c417
+++ /dev/null
@@ -1,3 +1,0 @@
-a<<~B��ߡ>�����
-<$xx��c	>2��88i��~Bø}c}CC��➆�xx<$|D~B^b3=a��C	e00PpC��
-=%}EC_c�����<�>��c����_aOq'83<e
79Nr����
)���`�@I@�  00<,.2/1'9a��
,4\d����	������
\ No newline at end of file
binary files a/gfx/fx/plant.png /dev/null differ
binary files a/gfx/fx/poison.2bpp.lz.fc7dc9c1 /dev/null differ
binary files a/gfx/fx/poison.png /dev/null differ
binary files a/gfx/fx/pokeball.2bpp.lz.c58f7e01 /dev/null differ
binary files a/gfx/fx/pokeball.png /dev/null differ
--- a/gfx/fx/powder.2bpp.lz.bfd566bb
+++ /dev/null
@@ -1,1 +1,0 @@
-@@��GEa8(@@��EG��Î
\ No newline at end of file
binary files a/gfx/fx/powder.png /dev/null differ
binary files a/gfx/fx/psychic.2bpp.lz.d80f285c /dev/null differ
binary files a/gfx/fx/psychic.png /dev/null differ
binary files a/gfx/fx/reflect.2bpp.lz.9a9c822d /dev/null differ
binary files a/gfx/fx/reflect.png /dev/null differ
binary files a/gfx/fx/rocks.2bpp.lz.73d0153e /dev/null differ
binary files a/gfx/fx/rocks.png /dev/null differ
binary files a/gfx/fx/rope.2bpp.lz.209d63dd /dev/null differ
binary files a/gfx/fx/rope.png /dev/null differ
binary files a/gfx/fx/sand.2bpp.lz.c87c0eaa /dev/null differ
binary files a/gfx/fx/sand.png /dev/null differ
binary files a/gfx/fx/shapes.2bpp.lz.262d77f0 /dev/null differ
binary files a/gfx/fx/shapes.png /dev/null differ
binary files a/gfx/fx/shine.2bpp.lz.5fb79056 /dev/null differ
binary files a/gfx/fx/shine.png /dev/null differ
binary files a/gfx/fx/skyattack.2bpp.lz.31738ab8 /dev/null differ
binary files a/gfx/fx/skyattack.png /dev/null differ
binary files a/gfx/fx/smoke.2bpp.lz.aa05905e /dev/null differ
binary files a/gfx/fx/smoke.png /dev/null differ
binary files a/gfx/fx/speed.2bpp.lz.1732b364 /dev/null differ
binary files a/gfx/fx/speed.png /dev/null differ
binary files a/gfx/fx/status.2bpp.lz.0c0aa13e /dev/null differ
binary files a/gfx/fx/status.png /dev/null differ
binary files a/gfx/fx/water.2bpp.lz.7b52ed12 /dev/null differ
binary files a/gfx/fx/water.png /dev/null differ
binary files a/gfx/fx/wave.2bpp.lz.bee99402 /dev/null differ
binary files a/gfx/fx/wave.png /dev/null differ
binary files a/gfx/fx/web.2bpp.lz.80e3d480 /dev/null differ
binary files a/gfx/fx/web.png /dev/null differ
binary files a/gfx/fx/whip.2bpp.lz.d80d8d6e /dev/null differ
binary files a/gfx/fx/whip.png /dev/null differ
binary files a/gfx/fx/wind.2bpp.lz.5a785180 /dev/null differ
binary files a/gfx/fx/wind.png /dev/null differ
--- a/macros/scripts/effect_commands.asm
+++ b/macros/scripts/effect_commands.asm
@@ -3,7 +3,7 @@
 \1 equs "db \1_command"
 endm
 
-; BattleCommandPointers indexes (see battle/effect_commands.asm)
+; BattleCommandPointers indexes (see data/moves/effect_command_pointers.asm)
 	enum_start 1
 	command checkturn               ; 01
 	command checkobedience          ; 02
--- a/macros/scripts/move_anim.asm
+++ b/macros/scripts/move_anim.asm
@@ -5,7 +5,7 @@
 	db \1
 	endm
 
-; BattleAnimCommands indexes (see battle/anim_commands.asm)
+; BattleAnimCommands indexes (see engine/anims/anim_commands.asm)
 	enum_start $d0
 
 	enum anim_obj_command ; $d0
--- a/main.asm
+++ b/main.asm
@@ -34,7 +34,7 @@
 INCLUDE "event/overworld.asm"
 INCLUDE "engine/items.asm"
 INCLUDE "engine/player_step.asm"
-INCLUDE "engine/anim_hp_bar.asm"
+INCLUDE "engine/battle/anim_hp_bar.asm"
 INCLUDE "engine/move_mon.asm"
 INCLUDE "engine/billspctop.asm"
 INCLUDE "engine/routines/getbreedmonlevelgrowth.asm"
@@ -111,7 +111,7 @@
 INCLUDE "engine/switch_items.asm"
 INCLUDE "engine/menu_2.asm"
 INCLUDE "engine/mon_menu.asm"
-INCLUDE "battle/menu.asm"
+INCLUDE "engine/battle/menu.asm"
 INCLUDE "engine/buy_sell_toss.asm"
 INCLUDE "engine/trainer_card.asm"
 INCLUDE "engine/prof_oaks_pc.asm"
@@ -120,8 +120,8 @@
 INCLUDE "data/trainers/trainer_dvs.asm"
 INCLUDE "engine/routines/returntobattle_useball.asm"
 INCLUDE "engine/routines/consumehelditem.asm"
-INCLUDE "battle/moves/move_effects_pointers.asm"
-INCLUDE "battle/moves/move_effects.asm"
+INCLUDE "data/moves/move_effects_pointers.asm"
+INCLUDE "data/moves/move_effects.asm"
 INCLUDE "engine/routines/kurt_selectquantity_interpretjoypad.asm"
 
 
@@ -129,7 +129,7 @@
 
 INCLUDE "engine/link.asm"
 INCLUDE "engine/wildmons.asm"
-INCLUDE "battle/link_result.asm"
+INCLUDE "engine/battle/link_result.asm"
 
 ChrisBackpic: ; 2ba1a
 INCBIN "gfx/player/chris_back.2bpp.lz"
@@ -140,30 +140,30 @@
 
 SECTION "bankB", ROMX
 
-INCLUDE "battle/trainer_huds.asm"
+INCLUDE "engine/battle/trainer_huds.asm"
 INCLUDE "data/trainers/trainer_class_names.asm"
-INCLUDE "battle/ai/redundant.asm"
+INCLUDE "engine/battle/ai/redundant.asm"
 INCLUDE "event/move_deleter.asm"
 INCLUDE "engine/mystery_gift_2.asm"
 INCLUDE "engine/tmhm2.asm"
-INCLUDE "battle/moves/move_descriptions.asm"
+INCLUDE "data/moves/move_descriptions.asm"
 INCLUDE "engine/pokerus/pokerus.asm"
-INCLUDE "engine/start_battle.asm"
+INCLUDE "engine/battle/start_battle.asm"
 INCLUDE "engine/routines/placegraphic.asm"
 
 
 SECTION "Effect Commands", ROMX
 
-INCLUDE "battle/effect_commands.asm"
+INCLUDE "engine/battle/effect_commands.asm"
 
 
 SECTION "Enemy Trainers", ROMX
 
-INCLUDE "battle/ai/items.asm"
-INCLUDE "battle/ai/scoring.asm"
-INCLUDE "engine/read_trainer_attributes.asm"
+INCLUDE "engine/battle/ai/items.asm"
+INCLUDE "engine/battle/ai/scoring.asm"
+INCLUDE "engine/battle/read_trainer_attributes.asm"
 INCLUDE "data/trainers/trainer_attributes.asm"
-INCLUDE "engine/read_trainer_party.asm"
+INCLUDE "engine/battle/read_trainer_party.asm"
 INCLUDE "data/trainers/party_pointers.asm"
 INCLUDE "data/trainers/parties.asm"
 
@@ -170,14 +170,14 @@
 
 SECTION "Battle Core", ROMX
 
-INCLUDE "battle/core.asm"
-INCLUDE "battle/effect_command_pointers.asm"
+INCLUDE "engine/battle/core.asm"
+INCLUDE "data/moves/effect_command_pointers.asm"
 
 
 SECTION "bank10", ROMX
 
 INCLUDE "engine/pokedex.asm"
-INCLUDE "battle/moves/moves.asm"
+INCLUDE "data/moves/moves.asm"
 INCLUDE "engine/evolve.asm"
 
 
@@ -184,7 +184,7 @@
 SECTION "bank11", ROMX
 
 INCLUDE "engine/fruit_trees.asm"
-INCLUDE "battle/ai/move.asm"
+INCLUDE "engine/battle/ai/move.asm"
 INCLUDE "engine/pokedex_2.asm"
 INCLUDE "data/pokemon/dex_entry_pointers.asm"
 INCLUDE "engine/mail.asm"
@@ -244,7 +244,7 @@
 INCLUDE "engine/evolution_animation.asm"
 INCLUDE "engine/init_hof_credits.asm"
 INCLUDE "mobile/get_trainer_class.asm"
-INCLUDE "battle/sliding_intro.asm"
+INCLUDE "engine/battle/sliding_intro.asm"
 INCLUDE "mobile/print_opp_message.asm"
 INCLUDE "engine/routines/checkbattlescene.asm"
 INCLUDE "engine/gbc_only.asm"
@@ -261,7 +261,7 @@
 INCLUDE "event/basement_key.asm"
 INCLUDE "event/sacred_ash.asm"
 INCLUDE "engine/tempmon.asm"
-INCLUDE "text/types.asm"
+INCLUDE "engine/types.asm"
 INCLUDE "text/unused_gen_1_trainers.asm"
 INCLUDE "engine/mon_stats.asm"
 INCLUDE "engine/routines/initlist.asm"
@@ -308,7 +308,7 @@
 SECTION "bank21", ROMX
 
 INCLUDE "engine/printer.asm"
-INCLUDE "battle/anim_gfx.asm"
+INCLUDE "gfx/anims.asm"
 INCLUDE "event/halloffame.asm"
 
 
@@ -327,7 +327,7 @@
 SECTION "bank23", ROMX
 
 INCLUDE "engine/timeofdaypals.asm"
-INCLUDE "engine/battle_transition.asm"
+INCLUDE "engine/battle/battle_transition.asm"
 INCLUDE "event/field_moves.asm"
 INCLUDE "event/magnet_train.asm"
 INCLUDE "engine/routines/battlestart_copytilemapatonce.asm"
@@ -384,13 +384,13 @@
 INCLUDE "engine/std_scripts.asm"
 INCLUDE "engine/phone/phone_scripts.asm"
 INCLUDE "engine/phone/generic_calls.asm"
-INCLUDE "engine/trainer_scripts.asm"
+INCLUDE "engine/battle/trainer_scripts.asm"
 
 
 SECTION "bank32", ROMX
 
-INCLUDE "battle/bg_effects.asm"
-INCLUDE "battle/anims.asm"
+INCLUDE "engine/anims/bg_effects.asm"
+INCLUDE "data/moves/move_anims.asm"
 INCLUDE "event/poisonstep_pals.asm"
 
 TheEndGFX:: ; cbd2e
@@ -397,11 +397,17 @@
 INCBIN "gfx/credits/theend.2bpp"
 
 
-SECTION "bank33", ROMX
+SECTION "Move Animations", ROMX
 
 INCLUDE "event/bug_contest/display_stats.asm"
-INCLUDE "battle/anim_commands.asm"
-INCLUDE "battle/anim_objects.asm"
+INCLUDE "engine/anims/anim_commands.asm"
+INCLUDE "engine/anims/engine.asm"
+INCLUDE "data/anims/objects.asm"
+INCLUDE "engine/anims/functions.asm"
+INCLUDE "engine/anims/helpers.asm"
+INCLUDE "data/anims/framesets.asm"
+INCLUDE "data/anims/oam.asm"
+INCLUDE "data/anims/object_gfx.asm"
 
 
 SECTION "Pic Animations 1", ROMX
@@ -477,8 +483,8 @@
 INCLUDE "engine/time_capsule_2.asm"
 INCLUDE "engine/unown_dex.asm"
 INCLUDE "event/magikarp.asm"
-INCLUDE "battle/hidden_power.asm"
-INCLUDE "battle/misc.asm"
+INCLUDE "engine/battle/hidden_power.asm"
+INCLUDE "engine/battle/misc.asm"
 
 
 SECTION "bank3F", ROMX
@@ -497,7 +503,7 @@
 INCLUDE "gfx/emotes.asm"
 INCLUDE "engine/warp_connection.asm"
 INCLUDE "engine/mystery_gift.asm"
-INCLUDE "battle/used_move_text.asm"
+INCLUDE "engine/battle/used_move_text.asm"
 INCLUDE "mobile/mobile_41.asm"
 INCLUDE "gfx/overworld_font.asm"
 
@@ -589,7 +595,7 @@
 
 INCLUDE "data/items/item_names.asm"
 INCLUDE "data/items/item_descriptions.asm"
-INCLUDE "battle/move_names.asm"
+INCLUDE "data/moves/move_names.asm"
 INCLUDE "engine/landmarks.asm"
 
 
--- a/pokecrystal.link
+++ b/pokecrystal.link
@@ -135,7 +135,7 @@
 ROMX $32
 	"bank32"
 ROMX $33
-	"bank33"
+	"Move Animations"
 	"Extra Songs 2"
 ROMX $34
 	"Pic Animations 1"
--- a/text/battle_tower.asm
+++ b/text/battle_tower.asm
@@ -1,4 +1,3 @@
-
 BattleTowerText_0x1ec000: ; 0x1ec000
 	text "Hello, glad to"
 	line "meet you!"
--- a/text/types.asm
+++ /dev/null
@@ -1,149 +1,0 @@
-PrintMonTypes: ; 5090d
-; Print one or both types of [CurSpecies]
-; on the stats screen at hl.
-
-	push hl
-	call GetBaseData
-	pop hl
-
-	push hl
-	ld a, [BaseType1]
-	call .Print
-
-	; Single-typed monsters really
-	; have two of the same type.
-	ld a, [BaseType1]
-	ld b, a
-	ld a, [BaseType2]
-	cp b
-	pop hl
-	jr z, .hide_type_2
-
-	ld bc, SCREEN_WIDTH
-	add hl, bc
-
-.Print:
-	ld b, a
-	jr PrintType
-
-.hide_type_2
-	; Erase any type name that was here before.
-	; Seems to be pointless in localized versions.
-	ld a, " "
-	ld bc, SCREEN_WIDTH - 3
-	add hl, bc
-	ld [hl], a
-	inc bc
-	add hl, bc
-	ld bc, 5
-	jp ByteFill
-; 5093a
-
-
-PrintMoveType: ; 5093a
-; Print the type of move b at hl.
-
-	push hl
-	ld a, b
-	dec a
-	ld bc, MOVE_LENGTH
-	ld hl, Moves
-	call AddNTimes
-	ld de, StringBuffer1
-	ld a, BANK(Moves)
-	call FarCopyBytes
-	ld a, [StringBuffer1 + MOVE_TYPE]
-	pop hl
-
-	ld b, a
-
-
-PrintType: ; 50953
-; Print type b at hl.
-
-	ld a, b
-
-	push hl
-	add a
-	ld hl, TypeNames
-	ld e, a
-	ld d, 0
-	add hl, de
-	ld a, [hli]
-	ld e, a
-	ld d, [hl]
-	pop hl
-
-	jp PlaceString
-; 50964
-
-
-GetTypeName: ; 50964
-; Copy the name of type [wd265] to StringBuffer1.
-
-	ld a, [wd265]
-	ld hl, TypeNames
-	ld e, a
-	ld d, 0
-	add hl, de
-	add hl, de
-	ld a, [hli]
-	ld h, [hl]
-	ld l, a
-	ld de, StringBuffer1
-	ld bc, 13
-	jp CopyBytes
-; 5097b
-
-
-TypeNames: ; 5097b
-	dw Normal
-	dw Fighting
-	dw Flying
-	dw Poison
-	dw Ground
-	dw Rock
-	dw Bird
-	dw Bug
-	dw Ghost
-	dw Steel
-	dw Normal
-	dw Normal
-	dw Normal
-	dw Normal
-	dw Normal
-	dw Normal
-	dw Normal
-	dw Normal
-	dw Normal
-	dw CurseType
-	dw Fire
-	dw Water
-	dw Grass
-	dw Electric
-	dw Psychic
-	dw Ice
-	dw Dragon
-	dw Dark
-
-Normal:    db "NORMAL@"
-Fighting:  db "FIGHTING@"
-Flying:    db "FLYING@"
-Poison:    db "POISON@"
-CurseType: db "???@"
-Fire:      db "FIRE@"
-Water:     db "WATER@"
-Grass:     db "GRASS@"
-Electric:  db "ELECTRIC@"
-Psychic:   db "PSYCHIC@"
-Ice:       db "ICE@"
-Ground:    db "GROUND@"
-Rock:      db "ROCK@"
-Bird:      db "BIRD@"
-Bug:       db "BUG@"
-Ghost:     db "GHOST@"
-Steel:     db "STEEL@"
-Dragon:    db "DRAGON@"
-Dark:      db "DARK@"
-
-; 50a28