shithub: pokecrystal

Download patch

ref: 3e6c37fe5242d78ba915192a03e183dfbf031110
parent: b582066865787dfa21193cd7754395c7d8ee3a85
author: yenatch <[email protected]>
date: Tue Mar 26 16:39:44 EDT 2013

Move effect commands dump

--- /dev/null
+++ b/battle/effect_command_pointers.asm
@@ -1,0 +1,177 @@
+; 3fd28
+	dw BattleCommand01 ; 34084
+	dw BattleCommand02 ; 343db
+	dw BattleCommand03 ; 34541
+	dw BattleCommand04 ; 34555
+	dw BattleCommand05 ; 34631
+	dw BattleCommand06 ; 352dc
+	dw BattleCommand07 ; 346d2
+	dw BattleCommand08 ; 34cfd
+	dw BattleCommand09 ; 34d32
+	dw BattleCommand0a ; 34eee
+	dw BattleCommand0b ; 34f60
+	dw BattleCommand0c ; 35004
+	dw BattleCommand0d ; 35023
+	dw BattleCommand0e ; 3505e
+	dw BattleCommand0f ; 35175
+	dw BattleCommand10 ; 351ad
+	dw BattleCommand11 ; 351c0
+	dw BattleCommand12 ; 35250
+	dw BattleCommand13 ; 35eee
+	dw BattleCommand14 ; 35e5c
+	dw BattleCommand15 ; 35fff
+	dw BattleCommand16 ; 36008
+	dw BattleCommand17 ; 3608c
+	dw BattleCommand18 ; 36102
+	dw BattleCommand19 ; 36165
+	dw BattleCommand1a ; 37380
+	dw BattleCommand1b ; 373c9
+	dw BattleCommand1c ; 361e4
+	dw BattleCommand1d ; 362e3
+	dw BattleCommand1e ; 3705c
+	dw BattleCommand1f ; 3707f
+	dw BattleCommand20 ; 3710e
+	dw BattleCommand21 ; 36671
+	dw BattleCommand22 ; 366e5
+	dw BattleCommand23 ; 3680f
+	dw BattleCommand24 ; 369b6
+	dw BattleCommand25 ; 36aa0
+	dw BattleCommand26 ; 36af3
+	dw BattleCommand27 ; 36cb2
+	dw BattleCommand28 ; 36c7e
+	dw BattleCommand29 ; 36c98
+	dw BattleCommand2a ; 36d3b
+	dw BattleCommand2b ; 36d1d
+	dw BattleCommand2c ; 3713e
+	dw BattleCommand2d ; 371cd
+	dw BattleCommand2e ; 372fc
+	dw BattleCommand2f ; 35f2c
+	dw BattleCommand30 ; 36dc7
+	dw BattleCommand31 ; 36e7c
+	dw BattleCommand32 ; 36f0b
+	dw BattleCommand33 ; 36f46
+	dw BattleCommand34 ; 37418
+	dw BattleCommand35 ; 36f9d
+	dw BattleCommand36 ; 36fe1
+	dw BattleCommand37 ; 36fed
+	dw BattleCommand38 ; 37e85
+	dw BattleCommand39 ; 36b4d
+	dw BattleCommand3a ; 36b3a
+	dw BattleCommand3b ; 36c2d
+	dw BattleCommand3c ; 36c2c
+	dw BattleCommand3d ; 36751
+	dw BattleCommand3e ; 3671a
+	dw BattleCommand3f ; 35726
+	dw BattleCommand40 ; 35813
+	dw BattleCommand41 ; 35864
+	dw BattleCommand42 ; 35926
+	dw BattleCommand43 ; 359d0
+	dw BattleCommand44 ; 359e6
+	dw BattleCommand45 ; 35a53
+	dw BattleCommand46 ; 35a74
+	dw BattleCommand47 ; 35b16
+	dw BattleCommand48 ; 35b33
+	dw BattleCommand49 ; 35bff
+	dw BattleCommand4a ; 35c0f
+	dw BattleCommand4b ; 35c94
+	dw BattleCommand4c ; 35cc9
+	dw BattleCommand4d ; 36ac9
+	dw BattleCommand4e ; 346b2
+	dw BattleCommand4f ; 346cd
+	dw BattleCommand50 ; 37492
+	dw BattleCommand51 ; 37517
+	dw BattleCommand52 ; 37536
+	dw BattleCommand53 ; 37563
+	dw BattleCommand54 ; 37588
+	dw BattleCommand55 ; 37618
+	dw BattleCommand56 ; 37683
+	dw BattleCommand57 ; 376a0
+	dw BattleCommand58 ; 376c2
+	dw BattleCommand59 ; 376f8
+	dw BattleCommand5a ; 3766f
+	dw BattleCommand5b ; 37718
+	dw BattleCommand5c ; 37734
+	dw BattleCommand5d ; 37791
+	dw BattleCommand5e ; 37792
+	dw BattleCommand5f ; 377ce
+	dw BattleCommand60 ; 3784b
+	dw BattleCommand61 ; 37874
+	dw BattleCommand62 ; 35612
+	dw BattleCommand63 ; 3790e
+	dw BattleCommand64 ; 37939
+	dw BattleCommand65 ; 37972
+	dw BattleCommand66 ; 37991
+	dw BattleCommand67 ; 379c9
+	dw BattleCommand68 ; 37b1d
+	dw BattleCommand69 ; 37b39
+	dw BattleCommand6a ; 37b74
+	dw BattleCommand6b ; 37b78
+	dw BattleCommand6c ; 37b7c
+	dw BattleCommand6d ; 37be8
+	dw BattleCommand6e ; 37bf4
+	dw BattleCommand6f ; 37c07
+	dw BattleCommand70 ; 361ac
+	dw BattleCommand71 ; 361b0
+	dw BattleCommand72 ; 361b4
+	dw BattleCommand73 ; 361b8
+	dw BattleCommand74 ; 361bc
+	dw BattleCommand75 ; 361c0
+	dw BattleCommand76 ; 361c4
+	dw BattleCommand77 ; 361c8
+	dw BattleCommand78 ; 361cc
+	dw BattleCommand79 ; 361d0
+	dw BattleCommand7a ; 361d4
+	dw BattleCommand7b ; 361d8
+	dw BattleCommand7c ; 361dc
+	dw BattleCommand7d ; 361e0
+	dw BattleCommand7e ; 362ad
+	dw BattleCommand7f ; 362b1
+	dw BattleCommand80 ; 362b5
+	dw BattleCommand81 ; 362b9
+	dw BattleCommand82 ; 362bd
+	dw BattleCommand83 ; 362c1
+	dw BattleCommand84 ; 362c5
+	dw BattleCommand85 ; 362c9
+	dw BattleCommand86 ; 362cd
+	dw BattleCommand87 ; 362d1
+	dw BattleCommand88 ; 362d5
+	dw BattleCommand89 ; 362d9
+	dw BattleCommand8a ; 362dd
+	dw BattleCommand8b ; 362e1
+	dw BattleCommand8c ; 363b8
+	dw BattleCommand8d ; 363e9
+	dw BattleCommand8e ; 3644c
+	dw BattleCommand8f ; 3646a
+	dw BattleCommand90 ; 34ecc
+	dw BattleCommand91 ; 34fdb
+	dw BattleCommand92 ; 34fd1
+	dw BattleCommand93 ; 34ffd
+	dw BattleCommand94 ; 36a82
+	dw BattleCommand95 ; 37c1a
+	dw BattleCommand96 ; 37c55
+	dw BattleCommand97 ; 36f1d
+	dw BattleCommand98 ; 36f25
+	dw BattleCommand99 ; 36f2f
+	dw BattleCommand9a ; 37c95
+	dw BattleCommand9b ; 37d0d
+	dw BattleCommand9c ; 37d34
+	dw BattleCommand9d ; 37ce6
+	dw BattleCommand9e ; 37d02
+	dw BattleCommand9f ; 37d94
+	dw BattleCommanda0 ; 36778
+	dw BattleCommanda1 ; 35461
+	dw BattleCommanda2 ; 3527b
+	dw BattleCommanda3 ; 34833
+	dw BattleCommanda4 ; 36500
+	dw BattleCommanda5 ; 35165
+	dw BattleCommanda6 ; 365af
+	dw BattleCommanda7 ; 365c3
+	dw BattleCommanda8 ; 355b5
+	dw BattleCommanda9 ; 355d5
+	dw BattleCommandaa ; 37e80
+	dw BattleCommandab ; 34f57
+	dw BattleCommandac ; 3658f
+	dw BattleCommandad ; 351a5
+	dw BattleCommandae ; 35197
+	dw BattleCommandaf ; 365a7
+; 3fe86
--- /dev/null
+++ b/battle/effect_commands.asm
@@ -1,0 +1,10511 @@
+DoPlayerTurn: ; 34000
+	call SetPlayerTurn
+
+	ld a, [$d0ec]
+	and a
+	ret nz
+
+	jr DoTurn
+; 3400a
+
+
+DoEnemyTurn: ; 3400a
+	call SetEnemyTurn
+
+	ld a, [InLinkBattle]
+	and a
+	jr z, DoTurn
+
+	ld a, [$d430]
+	cp $e
+	jr z, DoTurn
+	cp $4
+	ret nc
+
+	; fallthrough
+; 3401d
+
+
+DoTurn: ; 3401d
+; Read in and execute the user's move effects for this turn.
+
+	xor a
+	ld [$c6b4], a
+
+; Effect command checkturn is called for every move.
+	call CheckTurn
+
+	ld a, [$c6b4]
+	and a
+	ret nz
+
+	call UpdateMoveData
+; 3402c
+
+
+DoMove: ; 3402c
+; Get the user's move effect.
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call CleanGetBattleVarPair
+	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 [BattleScriptBufferLoc], a
+	ld a, h
+	ld [BattleScriptBufferLoc + 1], a
+
+.ReadMoveEffectCommand
+
+; ld a, [BattleScriptBufferLoc++]
+	ld a, [BattleScriptBufferLoc]
+	ld l, a
+	ld a, [BattleScriptBufferLoc + 1]
+	ld h, a
+
+	ld a, [hli]
+
+	push af
+	ld a, l
+	ld [BattleScriptBufferLoc], a
+	ld a, h
+	ld [BattleScriptBufferLoc + 1], a
+	pop af
+
+; $fe is used to terminate branches without ending the read cycle.
+	cp $fe
+	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:
+BattleCommand01: ; 34084
+; checkturn
+
+; Repurposed as hardcoded turn handling. Useless as a command.
+
+; Move $ff immediately ends the turn.
+	ld a, BATTLE_VARS_MOVE
+	call CleanGetBattleVarPair
+	inc a
+	jp z, Function0x34385
+
+	xor a
+	ld [AttackMissed], a
+	ld [$c70d], a
+	ld [$c689], a
+	ld [AlreadyDisobeyed], a
+	ld [$c6fb], a
+	ld [$c73e], a
+
+	ld a, 10 ; 1.0
+	ld [TypeModifier], a
+
+	ld a, [hBattleTurn]
+	and a
+	jp nz, CheckEnemyTurn
+
+
+CheckPlayerTurn:
+
+; check recharge
+	ld hl, PlayerSubStatus4
+	bit 5, [hl]
+	jr z, .CheckSleep
+	res 5, [hl]
+
+; 'must recharge!'
+	ld hl, MustRechargeText
+	call FarBattleTextBox
+
+	call CantMove
+	jp Function0x34385
+
+
+.CheckSleep
+	ld hl, BattleMonStatus
+	ld a, [hl]
+	and $7
+	jr z, .CheckFrozen
+	dec a
+	ld [BattleMonStatus], a
+	and $7
+	jr z, .WokeUp
+	xor a
+	ld [$cfca], a
+	ld de, ANIM_SLEEP
+	call FarPlayBattleAnimation
+	jr .FastAsleep
+
+
+.WokeUp
+; 'woke up!'
+	ld hl, WokeUpText
+	call FarBattleTextBox
+
+	call CantMove
+	call $399c
+	ld hl, $5f48
+	call $7e73
+	ld a, $1
+	ld [$ffd4], a
+	ld hl, PlayerSubStatus1
+	res 0, [hl]
+	jr .CheckFrozen
+
+
+.FastAsleep
+; 'fast asleep!'
+	ld hl, FastAsleepText
+	call FarBattleTextBox
+
+; Snore and Sleep Talk bypass sleep.
+	ld a, [CurPlayerMove]
+	cp SNORE
+	jr z, .CheckFrozen
+	cp SLEEP_TALK
+	jr z, .CheckFrozen
+	call CantMove
+	jp Function0x34385
+
+
+.CheckFrozen
+	ld hl, BattleMonStatus
+	bit 5, [hl]
+	jr z, .CheckFlinch
+
+; Flame Wheel and Sacred Fire thaw the user.
+	ld a, [CurPlayerMove]
+	cp FLAME_WHEEL
+	jr z, .CheckFlinch
+	cp SACRED_FIRE
+	jr z, .CheckFlinch
+
+; 'frozen solid!'
+	ld hl, FrozenSolidText
+	call FarBattleTextBox
+
+	call CantMove
+	jp Function0x34385
+
+
+.CheckFlinch
+	ld hl, PlayerSubStatus3
+	bit 3, [hl] ; flinch
+	jr z, .CheckDisabled
+
+	res 3, [hl]
+
+; 'flinched!'
+	ld hl, FlinchedText
+	call FarBattleTextBox
+
+	call CantMove
+	jp Function0x34385
+
+
+.CheckDisabled
+	ld hl, PlayerDisableCount
+	ld a, [hl]
+	and a
+	jr z, .CheckConfused
+	dec a
+	ld [hl], a
+	and $f
+	jr nz, .CheckConfused
+	ld [hl], a
+	ld [DisabledMove], a
+
+; 'disabled no more!'
+	ld hl, DisabledNoMoreText
+	call FarBattleTextBox
+
+
+.CheckConfused
+	ld a, [PlayerSubStatus3]
+	add a
+	jr nc, .CheckAttract
+	ld hl, PlayerConfuseCount
+	dec [hl]
+	jr nz, .Confused
+
+	ld hl, PlayerSubStatus3
+	res 7, [hl]
+
+; 'confused no more!'
+	ld hl, ConfusedNoMoreText
+	call FarBattleTextBox
+
+	jr .CheckAttract
+
+
+.Confused
+; 'confused!'
+	ld hl, IsConfusedText
+	call FarBattleTextBox
+
+	xor a
+	ld [$cfca], a
+	ld de, ANIM_CONFUSED
+	call FarPlayBattleAnimation
+
+; 50% chance of hitting itself
+	call FarBattleRNG
+	cp $80
+	jr nc, .CheckAttract
+
+	ld hl, PlayerSubStatus3
+	ld a, [hl]
+	and $80
+	ld [hl], a
+
+	call HitConfusion
+
+	call CantMove
+	jp Function0x34385
+
+
+.CheckAttract
+	ld a, [PlayerSubStatus1]
+	add a ; check bit 7
+	jr nc, .CheckDisabledMove
+
+; 'in love with'
+	ld hl, InLoveWithText
+	call FarBattleTextBox
+
+	xor a
+	ld [$cfca], a
+
+	ld de, ANIM_INLOVE
+	call FarPlayBattleAnimation
+
+; 50% chance of infatuation
+	call FarBattleRNG
+	cp $80
+	jr c, .CheckDisabledMove
+
+; 'infatuation kept it from attacking!'
+	ld hl, InfatuationText
+	call FarBattleTextBox
+
+	call CantMove
+	jp Function0x34385
+
+
+.CheckDisabledMove
+; We can't disable a move that doesn't exist.
+	ld a, [DisabledMove]
+	and a
+	jr z, .CheckParalyzed
+
+; Are we using the disabled move?
+	ld hl, CurPlayerMove
+	cp [hl]
+	jr nz, .CheckParalyzed
+
+	call MoveDisabled
+	call CantMove
+	jp Function0x34385
+
+
+.CheckParalyzed
+	ld hl, BattleMonStatus
+	bit 6, [hl]
+	ret z
+
+; 25% chance to be fully paralyzed
+	call FarBattleRNG
+	cp $3f
+	ret nc
+
+; 'fully paralyzed!'
+	ld hl, FullyParalyzedText
+	call FarBattleTextBox
+	call CantMove
+	jp Function0x34385
+; 341f0
+
+
+CantMove: ; 341f0
+	ld a, BATTLE_VARS_SUBSTATUS1
+	call GetBattleVarPair
+	res 6, [hl]
+
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVarPair
+	ld a, [hl]
+	and $ec
+	ld [hl], a
+
+	call Function0x377be
+
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call CleanGetBattleVarPair
+	cp FLY
+	jr z, .asm_3420f
+
+	cp $5b
+	ret nz
+
+.asm_3420f
+	res 5, [hl]
+	res 6, [hl]
+	jp $7ece
+; 34216
+
+
+
+Function0x34216: ; 34216
+	call $4ffd
+	call CantMove
+	jp $4ffd
+; 3421f
+
+
+
+CheckEnemyTurn: ; 3421f
+
+; check recharge
+	ld hl, EnemySubStatus4
+	bit 5, [hl]
+	jr z, .CheckSleep
+	res 5, [hl]
+
+; 'must recharge!'
+	ld hl, MustRechargeText
+	call FarBattleTextBox
+	call CantMove
+	jp Function0x34385
+
+
+.CheckSleep
+	ld hl, EnemyMonStatus
+	ld a, [hl]
+	and $7
+	jr z, .CheckFrozen
+	dec a
+	ld [EnemyMonStatus], a
+	and a
+	jr z, .WokeUp
+
+; 'fast asleep!'
+	ld hl, FastAsleepText
+	call FarBattleTextBox
+	xor a
+	ld [$cfca], a
+	ld de, ANIM_SLEEP
+	call FarPlayBattleAnimation
+	jr .FastAsleep
+
+
+.WokeUp
+; 'woke up!'
+	ld hl, WokeUpText
+	call FarBattleTextBox
+	call CantMove
+	call $39b0
+	ld hl, $6036
+	call $7e73
+	ld a, $1
+	ld [$ffd4], a
+	ld hl, EnemySubStatus1
+	res 0, [hl]
+	jr .CheckFrozen
+
+
+.FastAsleep
+; Snore and Sleep Talk bypass sleep.
+	ld a, [CurEnemyMove]
+	cp SNORE
+	jr z, .CheckFrozen
+	cp SLEEP_TALK
+	jr z, .CheckFrozen
+	call CantMove
+	jp Function0x34385
+
+
+.CheckFrozen
+	ld hl, EnemyMonStatus
+	bit 5, [hl]
+	jr z, .CheckFlinch
+	ld a, [CurEnemyMove]
+	cp $ac
+	jr z, .CheckFlinch
+	cp $dd
+	jr z, .CheckFlinch
+
+; 'frozen solid!'
+	ld hl, FrozenSolidText
+	call FarBattleTextBox
+	call CantMove
+	jp Function0x34385
+
+
+.CheckFlinch
+	ld hl, EnemySubStatus3
+	bit 3, [hl]
+	jr z, .CheckDisabled
+
+	res 3, [hl]
+
+; 'flinched!'
+	ld hl, FlinchedText
+	call FarBattleTextBox
+
+	call CantMove
+	jp Function0x34385
+
+
+.CheckDisabled
+	ld hl, EnemyEncoreCount
+	ld a, [hl]
+	and a
+	jr z, .CheckConfused
+
+	dec a
+	ld [hl], a
+	and $f
+	jr nz, .CheckConfused
+
+	ld [hl], a
+	ld [EnemyEncoredMove], a
+
+; 'disabled no more!'
+	ld hl, DisabledNoMoreText
+	call FarBattleTextBox
+
+
+.CheckConfused
+	ld a, [EnemySubStatus3]
+	add a
+	jr nc, .CheckAttract
+
+	ld hl, $c67b
+	dec [hl]
+	jr nz, .Confused
+
+	ld hl, EnemySubStatus3
+	res 7, [hl]
+
+; 'confused no more!'
+	ld hl, ConfusedNoMoreText
+	call FarBattleTextBox
+
+	jr .CheckAttract
+
+
+.Confused
+; 'confused!'
+	ld hl, IsConfusedText
+	call FarBattleTextBox
+
+	xor a
+	ld [$cfca], a
+	ld de, ANIM_CONFUSED
+	call FarPlayBattleAnimation
+
+; 50% chance of hitting itself
+	call FarBattleRNG
+	cp $80
+	jr nc, .CheckAttract
+
+	ld hl, EnemySubStatus3
+	ld a, [hl]
+	and %10000000
+	ld [hl], a
+
+; 'hurt itself in its confusion!'
+	ld hl, HurtItselfText
+	call FarBattleTextBox
+
+	call Function0x355dd
+
+	call $5612
+
+	call BattleCommand0a
+
+	xor a
+	ld [$cfca], a
+
+; Flicker the monster pic unless flying or underground.
+	ld de, $0115
+	ld a, BATTLE_VARS_SUBSTATUS3_OPP
+	call CleanGetBattleVarPair
+	and $60
+	call z, PlayFXAnimID
+
+	ld c, $1
+	call Function0x35d1c
+
+	call $5004
+
+	call CantMove
+	jp Function0x34385
+
+
+.CheckAttract
+	ld a, [EnemySubStatus1]
+	add a ; check bit 7
+	jr nc, .CheckDisabledMove
+
+; 'in love with'
+	ld hl, InLoveWithText
+	call FarBattleTextBox
+
+	xor a
+	ld [$cfca], a
+
+	ld de, ANIM_INLOVE
+	call FarPlayBattleAnimation
+
+; 50% chance of infatuation
+	call FarBattleRNG
+	cp $80
+	jr c, .CheckDisabledMove
+
+; 'infatuation kept it from attacking!'
+	ld hl, InfatuationText
+	call FarBattleTextBox
+
+	call CantMove
+	jp Function0x34385
+
+
+.CheckDisabledMove
+; We can't disable a move that doesn't exist.
+	ld a, [EnemyEncoredMove]
+	and a
+	jr z, .CheckParalyzed
+
+; Are we using the disabled move?
+	ld hl, CurEnemyMove
+	cp [hl]
+	jr nz, .CheckParalyzed
+
+	call MoveDisabled
+
+	call CantMove
+	jp Function0x34385
+
+
+.CheckParalyzed
+	ld hl, EnemyMonStatus
+	bit 6, [hl]
+	ret z
+
+; 25% chance to be fully paralyzed
+	call FarBattleRNG
+	cp $3f
+	ret nc
+
+; 'fully paralyzed!'
+	ld hl, FullyParalyzedText
+	call FarBattleTextBox
+
+	call CantMove
+
+	; fallthrough
+; 34385
+
+
+Function0x34385: ; 34385
+	ld a, $1
+	ld [$c6b4], a
+	jp ResetDamage
+; 3438d
+
+
+MoveDisabled: ; 3438d
+
+; Make sure any charged moves fail
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVarPair
+	res 4, [hl]
+
+	ld a, BATTLE_VARS_MOVE
+	call CleanGetBattleVarPair
+	ld [$d265], a
+	call $34f8
+
+; 'disabled!'
+	ld hl, DisabledMoveText
+	jp FarBattleTextBox
+; 343a5
+
+
+HitConfusion: ; 343a5
+
+; 'hurt itself in its confusion!'
+	ld hl, HurtItselfText
+	call FarBattleTextBox
+
+	xor a
+	ld [CriticalHit], a
+
+	call Function0x355dd
+
+	call $5612
+
+	call BattleCommand0a
+
+	xor a
+	ld [$cfca], a
+
+; Flicker the monster pic unless flying or underground.
+	ld de, $0115
+	ld a, BATTLE_VARS_SUBSTATUS3_OPP
+	call CleanGetBattleVarPair
+	and $60
+	call z, PlayFXAnimID
+
+	ld hl, $5f48
+	call $7e73
+
+	ld a, $1
+	ld [$ffd4], a
+
+	ld c, $1
+	call Function0x35d7e
+
+	jp $5004
+; 343db
+
+
+BattleCommand02: ; 343db
+; checkobedience
+
+; Enemy can't disobey
+	ld a, [hBattleTurn]
+	and a
+	ret nz
+
+	call Function0x34548
+	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, [InLinkBattle]
+	and a
+	ret nz
+
+	ld a, [$cfc0]
+	and a
+	ret nz
+
+; If the monster's id doesn't match the player's,
+; some conditions need to be met.
+	ld a, PartyMon1ID - PartyMon1
+	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 7, [hl]
+	ld a, 101
+	jr nz, .getlevel
+
+; stormbadge
+	bit 5, [hl]
+	ld a, 70
+	jr nz, .getlevel
+
+; fogbadge
+	bit 3, [hl]
+	ld a, 50
+	jr nz, .getlevel
+
+; hivebadge
+	bit 1, [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 FarBattleRNG
+	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 FarBattleRNG
+	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 FarBattleRNG
+	swap a
+	sub b
+	jr c, .Nap
+
+; The chance of not hitting itself is the same.
+	cp b
+	jr nc, .DoNothing
+
+; 'won't obey!'
+	ld hl, WontObeyText
+	call FarBattleTextBox
+
+	call HitConfusion
+
+	jp $450c
+
+
+.Nap
+	call FarBattleRNG
+	add a
+	swap a
+	and 7
+	jr z, .Nap
+
+	ld [BattleMonStatus], a
+
+; 'began to nap!'
+	ld hl, BeganToNapText
+	jr .Print
+
+
+.DoNothing
+	call FarBattleRNG
+	and 3
+
+; 'loafing around!'
+	ld hl, LoafingAroundText
+	and a
+	jr z, .Print
+
+; 'won't obey!'
+	ld hl, WontObeyText
+	dec a
+	jr z, .Print
+
+; 'turned away!'
+	ld hl, TurnedAwayText
+	dec a
+	jr z, .Print
+
+; 'ignored orders!'
+	ld hl, IgnoredOrdersText
+
+.Print
+	call FarBattleTextBox
+	jp $450c
+
+
+.UseInstead
+
+; Can't use another move if the monster only has one!
+	ld a, [BattleMonMove2]
+	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, [$cfa3]
+	ld b, a
+
+; Save the move we originally picked for afterward.
+	ld a, [CurMoveNum]
+	ld c, a
+	push af
+
+
+.RandomMove
+	call FarBattleRNG
+	and 3
+
+	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
+
+	xor a
+	ld [LastPlayerMove], a
+	ld [LastEnemyCounterMove], a
+
+	ld hl, PlayerSubStatus5
+	res 4, [hl]
+
+; Break encore too.
+	xor a
+	ld [PlayerEncoreCount], a
+
+	jp EndMoveEffect
+; 3451f
+
+
+IgnoreSleepOnly: ; 3451f
+
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call CleanGetBattleVarPair
+
+	cp SNORE
+	jr z, .CheckSleep
+	cp SLEEP_TALK
+	jr z, .CheckSleep
+	and a
+	ret
+
+.CheckSleep
+	ld a, BATTLE_VARS_STATUS
+	call CleanGetBattleVarPair
+	and 7
+	ret z
+
+; 'ignored orders…sleeping!'
+	ld hl, $4f7b
+	call FarBattleTextBox
+
+	call EndMoveEffect
+
+	scf
+	ret
+; 34541
+
+
+BattleCommand03: ; 34541
+; usedmovetext
+	callba DisplayUsedMoveText
+	ret
+; 34548
+
+
+Function0x34548: ; 34548
+
+	ld a, [hBattleTurn]
+	and a
+	ld a, [$c732] ; player
+	jr z, .end
+	ld a, [$c733] ; enemy
+.end
+	and a
+	ret
+; 34555
+
+
+BattleCommand04: ; 34555
+	call Function0x34548
+	ret nz
+
+	ld hl, BattleMonPP
+	ld de, PlayerSubStatus3
+	ld bc, PlayerTurnsTaken
+
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_34570
+
+	ld hl, EnemyMonPP
+	ld de, EnemySubStatus3
+	ld bc, EnemyTurnsTaken
+
+.asm_34570
+; 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 CleanGetBattleVarPair
+	cp STRUGGLE
+	ret z
+
+	ld a, [de]
+	and %111 ; rollout | bide | ???
+	ret nz
+
+	call .asm_345ad
+	ld a, b
+	and a
+	jp nz, EndMoveEffect
+
+; SubStatus5
+	inc de
+	inc de
+
+	ld a, [de]
+	bit 3, a
+	ret nz
+
+	ld a, [hBattleTurn]
+	and a
+
+	ld hl, PartyMon1PP
+	ld a, [CurBattleMon]
+	jr z, .asm_345a4
+
+; skip this part entirely if wildbattle
+	ld a, [IsInBattle]
+	dec a
+	jr z, .asm_345c5
+
+	ld hl, OTPartyMon1PP
+	ld a, [CurOTMon]
+
+.asm_345a4
+	call GetPartyLocation
+	push hl
+	call Function0x3460b
+	pop hl
+	ret c
+
+.asm_345ad
+	ld a, [hBattleTurn]
+	and a
+	ld a, [CurMoveNum]
+	jr z, .asm_345b8
+	ld a, [CurEnemyMoveNum]
+
+.asm_345b8
+	ld c, a
+	ld b, $0
+	add hl, bc
+	ld a, [hl]
+	and $3f
+	jr z, .asm_345e3
+	dec [hl]
+	ld b, $0
+	ret
+
+.asm_345c5
+	ld hl, EnemyMonMoves
+	ld a, [CurEnemyMoveNum]
+	ld c, a
+	ld b, $0
+	add hl, bc
+	ld a, [hl]
+	cp MIMIC
+	jr z, .asm_345dc
+	ld hl, $c735
+	add hl, bc
+	ld a, [hl]
+	cp MIMIC
+	ret z
+
+.asm_345dc
+	ld hl, $c739
+	call .asm_345ad
+	ret
+
+.asm_345e3
+	call $7e80
+; get move effect
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call CleanGetBattleVarPair
+; continuous?
+	ld hl, .continuousmoves
+	ld de, $0001 ; don't skip
+	call IsInArray
+
+; 'has no pp left for [move]'
+	ld hl, $4fba
+	jr c, .print
+; 'but no pp is left for the move'
+	ld hl, $4f99
+.print
+	call FarBattleTextBox
+	ld b, $1
+	ret
+; 34602
+
+.continuousmoves ; 34602
+	db $27 ; RAZOR_WIND
+	db $4b ; SKY_ATTACK
+	db $91 ; SKULL_BASH
+	db $97 ; SOLARBEAM
+	db $9b ; FLY, DIG
+	db $75 ; ROLLOUT
+	db $1a ; BIDE
+	db $1b ; THRASH, PETAL_DANCE, OUTRAGE
+	db $ff ; end
+; 3460b
+
+Function0x3460b: ; 3460b
+	ld a, [hBattleTurn]
+	and a
+	ld a, [CurMoveNum]
+	jr z, .asm_34616
+	ld a, [CurEnemyMoveNum]
+
+.asm_34616
+	ld c, a
+	ld a, 2
+	call $3945
+
+	ld a, BATTLE_VARS_MOVE
+	call CleanGetBattleVarPair
+	cp MIMIC
+	jr z, .asm_3462f
+
+	ld b, 0
+	add hl, bc
+	ld a, [hl]
+	cp MIMIC
+	jr nz, .asm_3462f
+
+	scf
+	ret
+
+.asm_3462f
+	and a
+	ret
+; 34631
+
+
+BattleCommand05: ; 34631
+; critical
+
+; Determine whether this attack's hit will be critical.
+
+	xor a
+	ld [CriticalHit], a
+
+	ld a, BATTLE_VARS_MOVE_POWER
+	call CleanGetBattleVarPair
+	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 CleanGetBattleVarPair
+	bit 2, a
+	jr z, .CheckCritical
+
+; +1 critical level
+	inc c
+
+.CheckCritical
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call CleanGetBattleVarPair
+	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 $49 ; 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 FarBattleRNG
+	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
+
+
+BattleCommand4e: ; 346b2
+	ld a, [$c689]
+	ld b, a
+	inc b
+	ld hl, CurDamage + 1
+	ld a, [hld]
+	ld e, a
+	ld a, [hli]
+	ld d, a
+.asm_346be
+	dec b
+	ret z
+	ld a, [hl]
+	add e
+	ld [hld], a
+	ld a, [hl]
+	adc d
+	ld [hli], a
+	jr nc, .asm_346be ; 346c6 $f6
+	ld a, $ff
+	ld [hld], a
+	ld [hl], a
+	ret
+; 346cd
+
+
+BattleCommand4f: ; 346cd
+	ld hl, $c689
+	inc [hl]
+	ret
+; 346d2
+
+
+BattleCommand07: ; 346d2
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call CleanGetBattleVarPair
+	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, .asm_346f7
+
+	ld hl, EnemyMonType1
+	ld a, [hli]
+	ld b, a
+	ld c, [hl]
+	ld hl, BattleMonType1
+	ld a, [hli]
+	ld d, a
+	ld e, [hl]
+
+.asm_346f7
+	ld a, BATTLE_VARS_MOVE_TYPE
+	call GetBattleVarPair
+	ld [$d265], a
+
+	push hl
+	push de
+	push bc
+	ld a, $3e
+	ld hl, $7da4
+	rst FarCall
+	pop bc
+	pop de
+	pop hl
+
+	push de
+	push bc
+	ld a, $3e
+	ld hl, $7e24
+	rst FarCall
+	pop bc
+	pop de
+
+	ld a, [$d265]
+	cp b
+	jr z, .asm_34720
+	cp c
+	jr z, .asm_34720
+	jr .asm_3473a
+
+.asm_34720
+	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]
+.asm_3473a
+	ld a, BATTLE_VARS_MOVE_TYPE
+	call CleanGetBattleVarPair
+	ld b, a
+	ld hl, TypeMatchup
+.asm_34743
+	ld a, [hli]
+	cp $ff
+	jr z, .asm_347b7 ; 34746 $6f
+	cp $fe
+	jr nz, .asm_34757 ; 3474a $b
+	ld a, BATTLE_VARS_SUBSTATUS1_OPP
+	call CleanGetBattleVarPair
+	bit 3, a
+	jr nz, .asm_347b7 ; 34753 $62
+	jr .asm_34743 ; 34755 $ec
+.asm_34757
+	cp b
+	jr nz, .asm_347b3 ; 34758 $59
+	ld a, [hl]
+	cp d
+	jr z, .asm_34763 ; 3475c $5
+	cp e
+	jr z, .asm_34763 ; 3475f $2
+	jr .asm_347b3 ; 34761 $50
+.asm_34763
+	push hl
+	push bc
+	inc hl
+	ld a, [TypeModifier]
+	and %10000000
+	ld b, a
+	ld a, [hl]
+	and a
+	jr nz, .asm_34775 ; 3476e $5
+	inc a
+	ld [AttackMissed], a
+	xor a
+.asm_34775
+	ld [$ffb7], a
+	add b
+	ld [TypeModifier], a
+	xor a
+	ld [$ffb4], a
+	ld hl, CurDamage
+	ld a, [hli]
+	ld [$ffb5], a
+	ld a, [hld]
+	ld [$ffb6], a
+	call $3119
+	ld a, [$ffb4]
+	ld b, a
+	ld a, [$ffb5]
+	or b
+	ld b, a
+	ld a, [$ffb6]
+	or b
+	jr z, .asm_347ab ; 34794 $15
+	ld a, $a
+	ld [$ffb7], a
+	ld b, $4
+	call $3124
+	ld a, [$ffb5]
+	ld b, a
+	ld a, [$ffb6]
+	or b
+	jr nz, .asm_347ab ; 347a5 $4
+	ld a, $1
+	ld [$ffb6], a
+.asm_347ab
+	ld a, [$ffb5]
+	ld [hli], a
+	ld a, [$ffb6]
+	ld [hl], a
+	pop bc
+	pop hl
+.asm_347b3
+	inc hl
+	inc hl
+	jr .asm_34743 ; 347b5 $8c
+.asm_347b7
+	call Function0x347c8
+	ld a, [$d265]
+	ld b, a
+	ld a, [TypeModifier]
+	and $80
+	or b
+	ld [TypeModifier], a
+	ret
+; 347c8
+
+
+Function0x347c8: ; 347c8
+	ld hl, EnemyMonType1
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_347d3 ; 0x347ce $3
+	ld hl, BattleMonType1
+.asm_347d3
+	push hl
+	push de
+	push bc
+	ld a, $f
+	call CleanGetBattleVarPair
+	ld d, a
+	ld b, [hl]
+	inc hl
+	ld c, [hl]
+	ld a, $a
+	ld [$d265], a
+	ld hl, TypeMatchup
+.asm_347e7
+	ld a, [hli]
+	cp $ff
+	jr z, .asm_3482f ; 0x347ea $43
+	cp $fe
+	jr nz, .asm_347fb ; 0x347ee $b
+	ld a, $5
+	call CleanGetBattleVarPair
+	bit 3, a
+	jr nz, .asm_3482f ; 0x347f7 $36
+	jr .asm_347e7 ; 0x347f9 $ec
+.asm_347fb
+	cp d
+	jr nz, .asm_34807 ; 0x347fc $9
+	ld a, [hli]
+	cp b
+	jr z, .asm_3480b ; 0x34800 $9
+	cp c
+	jr z, .asm_3480b ; 0x34803 $6
+	jr .asm_34808 ; 0x34805 $1
+.asm_34807
+	inc hl
+.asm_34808
+	inc hl
+	jr .asm_347e7 ; 0x34809 $dc
+.asm_3480b
+	xor a
+	ld [$ffb3], a
+	ld [$ffb4], a
+	ld [$ffb5], a
+	ld a, [hli]
+	ld [$ffb6], a
+	ld a, [$d265]
+	ld [$ffb7], a
+	call Multiply
+	ld a, $a
+	ld [$ffb7], a
+	push bc
+	ld b, $4
+	call Divide
+	pop bc
+	ld a, [$ffb6]
+	ld [$d265], a
+	jr .asm_347e7 ; 0x3482d $b8
+.asm_3482f
+	pop bc
+	pop de
+	pop hl
+	ret
+; 34833
+
+
+BattleCommanda3: ; 34833
+	call Function0x347c8
+	ld a, [$d265]
+	and a
+	ld a, $a
+	jr nz, .asm_3484a ; 3483c $c
+	call ResetDamage
+	xor a
+	ld [TypeModifier], a
+	inc a
+	ld [AttackMissed], a
+	ret
+.asm_3484a
+	ld [$d265], a
+	ret
+; 3484e
+
+
+; 3484e
+	push hl
+	push de
+	push bc
+	ld a, $a
+	ld [$c716], a
+	ld hl, PlayerUsedMoves
+	ld a, [hl]
+	and a
+	jr z, .asm_348b0 ; 0x3485b $53
+	ld d, $4
+	ld e, $0
+.asm_34861
+	ld a, [hli]
+	and a
+	jr z, .asm_3489f ; 0x34863 $3a
+	push hl
+	dec a
+	ld hl, $5afd
+	call $7ea1
+	and a
+	jr z, .asm_3489b ; 0x3486e $2b
+	inc hl
+	call $7ebb
+	ld hl, EnemyMonType1
+	call $47d3
+	ld a, [$d265]
+	cp $b
+	jr nc, .asm_34895 ; 0x3487f $14
+	and a
+	jr z, .asm_3489b ; 0x34882 $17
+	cp $a
+	jr nc, .asm_34891 ; 0x34886 $9
+	ld a, e
+	cp $1
+	jr nc, .asm_3489b ; 0x3488b $e
+	ld e, $1
+	jr .asm_3489b ; 0x3488f $a
+.asm_34891
+	ld e, $2
+	jr .asm_3489b ; 0x34893 $6
+.asm_34895
+	call $4931
+	pop hl
+	jr .asm_348d7 ; 0x34899 $3c
+.asm_3489b
+	pop hl
+	dec d
+	jr nz, .asm_34861 ; 0x3489d $c2
+.asm_3489f
+	ld a, e
+	cp $2
+	jr z, .asm_348d7 ; 0x348a2 $33
+	call $4939
+	ld a, e
+	and a
+	jr nz, .asm_348d7 ; 0x348a9 $2c
+	call $4939
+	jr .asm_348d7 ; 0x348ae $27
+.asm_348b0
+	ld a, [BattleMonType1]
+	ld b, a
+	ld hl, EnemyMonType1
+	call $47d3
+	ld a, [$d265]
+	cp $b
+	jr c, .asm_348c4 ; 0x348bf $3
+	call $4931
+.asm_348c4
+	ld a, [BattleMonType2]
+	cp b
+	jr z, .asm_348d7 ; 0x348c8 $d
+	call $47d3
+	ld a, [$d265]
+	cp $b
+	jr c, .asm_348d7 ; 0x348d2 $3
+	call $4931
+.asm_348d7
+	call $48de
+	pop bc
+	pop de
+	pop hl
+	ret
+; 348de
+
+
+; 348de
+	ld de, EnemyMonMove1
+	ld b, 5
+	ld c, 0
+
+	ld a, [$d265]
+	push af
+
+.loop
+	dec b
+	jr z, .exit
+
+	ld a, [de]
+	and a
+	jr z, .exit
+
+	inc de
+	dec a
+	ld hl, $5afd
+	call $7ea1
+	and a
+	jr z, .loop
+
+	inc hl
+	call $7ebb
+	ld hl, BattleMonType1
+	call $47d3
+	ld a, [$d265]
+	and a
+	jr z, .loop
+
+	inc c
+	cp $a
+	jr c, .loop
+
+	inc c
+	inc c
+	inc c
+	inc c
+	inc c
+
+	cp $a
+	jr z, .loop
+
+	ld c, $64
+	jr .loop
+.exit
+
+	pop af
+	ld [$d265], a
+
+	ld a, c
+	and a
+	jr z, .doubledown
+	cp $5
+	jr c, .down
+	cp $64
+	ret c
+	jr .up
+
+.doubledown
+	call .down
+
+.down
+	ld a, [$c716]
+	dec a
+	ld [$c716], a
+	ret
+
+.up
+	ld a, [$c716]
+	inc a
+	ld [$c716], a
+	ret
+; 34941
+
+
+; 34941
+	xor a
+	ld [$c717], a
+	call $49f4
+	ret c
+
+	ld a, [EnemySubStatus1]
+	bit 4, a
+	jr z, .asm_34986
+
+	ld a, [$c67f]
+	cp $1
+	jr nz, .asm_34986
+
+	call $49f4
+	call $4b77
+	call $4b20
+	call $4a85
+	ld a, e
+	cp $2
+	jr nz, .asm_34971
+
+	ld a, [$c716]
+	add $30
+	ld [$c717], a
+	ret
+
+.asm_34971
+	call $49f4
+	sla c
+	sla c
+	ld b, $ff
+
+.asm_3497a
+	inc b
+	sla c
+	jr nc, .asm_3497a
+
+	ld a, b
+	add $30
+	ld [$c717], a
+	ret
+
+.asm_34986
+	call $484e
+	ld a, [$c716]
+	cp $b
+	ret nc
+
+	ld a, [LastEnemyCounterMove]
+	and a
+	jr z, .asm_349d2
+
+	call $4a2a
+	ld a, [$c716]
+	and a
+	jr z, .asm_349d2
+
+	ld c, a
+	call $4aa7
+	ld a, [$c716]
+	cp $ff
+	ret z
+
+	ld b, a
+	ld a, e
+	cp $2
+	jr z, .asm_349be
+
+	call $484e
+	ld a, [$c716]
+	cp $a
+	ret nc
+
+	ld a, b
+	add $10
+	ld [$c717], a
+	ret
+
+.asm_349be
+	ld c, $10
+	call $484e
+	ld a, [$c716]
+	cp $a
+	jr nc, .asm_349cc
+	ld c, $20
+
+.asm_349cc
+	ld a, b
+	add c
+	ld [$c717], a
+	ret
+
+.asm_349d2
+	call $484e
+	ld a, [$c716]
+	cp $a
+	ret nc
+
+	call $49f4
+	call $4b77
+	call $4b20
+	call $4a85
+
+	ld a, e
+	cp $2
+	ret nz
+
+	ld a, [$c716]
+	add $10
+	ld [$c717], a
+	ret
+; 349f4
+
+
+; 349f4
+	ld a, [OTPartyCount]
+	cp $2
+	jr c, .asm_34a26
+
+	ld d, a
+	ld e, $0
+	ld b, $20
+	ld c, $0
+	ld hl, OTPartyMon1CurHP
+
+.asm_34a05
+	ld a, [CurOTMon]
+	cp e
+	jr z, .asm_34a16
+
+	push bc
+	ld b, [hl]
+	inc hl
+	ld a, [hld]
+	or b
+	pop bc
+	jr z, .asm_34a16
+
+	ld a, c
+	or b
+	ld c, a
+.asm_34a16
+	srl b
+	push bc
+	ld bc, $0030
+	add hl, bc
+	pop bc
+	inc e
+	dec d
+	jr nz, .asm_34a05
+
+	ld a, c
+	and a
+	jr nz, .asm_34a28
+
+.asm_34a26
+	scf
+	ret
+
+.asm_34a28
+	and a
+	ret
+; 34a2a
+
+
+; 34a2a
+	ld hl, OTPartyMon1Species2
+	ld a, [OTPartyCount]
+	ld b, a
+	ld c, $20
+	ld d, 0
+	xor a
+	ld [$c716], a
+
+.asm_34a39
+	ld a, [CurOTMon]
+	cp d
+	push hl
+	jr z, .asm_34a77
+
+	push hl
+	push bc
+	ld bc, $0022
+	add hl, bc
+	pop bc
+	ld a, [hli]
+	or [hl]
+	pop hl
+	jr z, .asm_34a77
+
+	ld a, [hl]
+	ld [CurSpecies], a
+	call GetBaseStats
+	ld a, [LastEnemyCounterMove]
+	dec a
+	ld hl, $5afd
+	call $7ea1
+	and a
+	jr z, .asm_34a77
+
+	inc hl
+	call $7ebb
+	ld hl, $d23d
+	call $47d3
+	ld a, [$d265]
+	and a
+	jr nz, .asm_34a77
+
+	ld a, [$c716]
+	or c
+	ld [$c716], a
+.asm_34a77
+	pop hl
+	dec b
+	ret z
+
+	push bc
+	ld bc, $30
+	add hl, bc
+	pop bc
+
+	inc d
+	srl c
+	jr .asm_34a39
+
+	push bc
+	ld a, [OTPartyCount]
+	ld e, a
+	ld hl, OTPartyMon1CurHP
+	ld b, $20
+	ld c, $0
+.asm_34a91
+	ld a, [hli]
+	or [hl]
+	jr z, .asm_34a98
+
+	ld a, b
+	or c
+	ld c, a
+.asm_34a98
+	srl b
+	push bc
+	ld bc, $002f
+	add hl, bc
+	pop bc
+	dec e
+	jr nz, .asm_34a91
+
+	ld a, c
+	pop bc
+
+	and c
+	ld c, a
+	ld a, $ff
+	ld [$c716], a
+	ld hl, OTPartyMon1Move1
+	ld b, $20
+	ld d, $0
+	ld e, $0
+.asm_34ab5
+	ld a, b
+	and c
+	jr z, .asm_34b00
+
+	push hl
+	push bc
+	ld b, $4
+	ld c, $0
+.asm_34abf
+	ld a, [hli]
+	and a
+	push hl
+	jr z, .asm_34aef
+
+	dec a
+	ld hl, $5afd
+	call $7ea1
+	and a
+	jr z, .asm_34ae9
+
+	inc hl
+	call $7ebb
+	ld hl, BattleMonType1
+	call $47d3
+	ld a, [$d265]
+	cp $a
+	jr c, .asm_34ae9
+
+	ld e, $1
+	cp $b
+	jr c, .asm_34ae9
+
+	ld e, $2
+	jr .asm_34aef
+
+.asm_34ae9
+	pop hl
+	dec b
+	jr nz, .asm_34abf
+
+	jr .asm_34af0
+
+.asm_34aef
+	pop hl
+.asm_34af0
+	ld a, e
+	pop bc
+	pop hl
+	cp $2
+	jr z, .asm_34b0e
+
+	cp $1
+	jr nz, .asm_34b00
+
+	ld a, d
+	or b
+	ld d, a
+	jr .asm_34b00
+
+.asm_34b00
+	push bc
+	ld bc, $0030
+	add hl, bc
+	pop bc
+	srl b
+	jr nc, .asm_34ab5
+
+	ld a, d
+	ld b, a
+	and a
+	ret z
+
+.asm_34b0e
+	push bc
+	sla b
+	sla b
+	ld c, $ff
+.asm_34b15
+	inc c
+	sla b
+	jr nc, .asm_34b15
+
+	ld a, c
+	ld [$c716], a
+	pop bc
+	ret
+; 34b20
+
+
+; 34b20
+	push bc
+	ld hl, OTPartySpecies
+	ld b, $20
+	ld c, $0
+
+.asm_34b28
+	ld a, [hli]
+	cp $ff
+	jr z, .asm_34b72
+
+	push hl
+	ld [CurSpecies], a
+	call GetBaseStats
+	ld a, [LastEnemyCounterMove]
+	and a
+	jr z, .asm_34b4a
+
+	dec a
+	ld hl, $5afd
+	call $7ea1
+	and a
+	jr z, .asm_34b4a
+
+	inc hl
+	call $7ebb
+	jr .asm_34b5d
+
+.asm_34b4a
+	ld a, [BattleMonType1]
+	ld hl, $d23d
+	call $47d3
+	ld a, [$d265]
+	cp $b
+	jr nc, .asm_34b6d
+	ld a, [BattleMonType2]
+
+.asm_34b5d
+	ld hl, $d23d
+	call $47d3
+	ld a, [$d265]
+	cp $b
+	jr nc, .asm_34b6d
+
+	ld a, b
+	or c
+	ld c, a
+
+.asm_34b6d
+	srl b
+	pop hl
+	jr .asm_34b28
+
+.asm_34b72
+	ld a, c
+	pop bc
+	and c
+	ld c, a
+	ret
+; 34b77
+
+
+; 34b77
+	push bc
+	ld de, OTPartySpecies
+	ld b, $20
+	ld c, $0
+	ld hl, OTPartyMon1CurHP
+
+.asm_34b82
+	ld a, [de]
+	inc de
+	cp $ff
+	jr z, .asm_34bac
+
+	push hl
+	push bc
+	ld b, [hl]
+	inc hl
+	ld c, [hl]
+	inc hl
+	inc hl
+	srl c
+	rl b
+	srl c
+	rl b
+	ld a, [hld]
+	cp c
+	ld a, [hl]
+	sbc b
+	pop bc
+	jr nc, .asm_34ba1
+
+	ld a, b
+	or c
+	ld c, a
+
+.asm_34ba1
+	srl b
+	pop hl
+	push bc
+	ld bc, $0030
+	add hl, bc
+	pop bc
+	jr .asm_34b82
+
+.asm_34bac
+	ld a, c
+	pop bc
+	and c
+	ld c, a
+	ret
+; 34bb1
+
+
+TypeMatchup: ; 34bb1
+INCLUDE "battle/type_matchup.asm"
+; 34cfd
+
+
+BattleCommand08: ; 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 [$ffb4], a
+	dec hl
+	ld a, [hli]
+	ld [$ffb5], a
+	ld a, [hl]
+	ld [$ffb6], a
+
+; Multiply by 85-100%...
+.loop
+	call FarBattleRNG
+	rrca
+	cp $d9 ; 85%
+	jr c, .loop
+
+	ld [$ffb7], a
+	call Multiply
+
+; ...divide by 100%...
+	ld a, $ff ; 100%
+	ld [$ffb7], a
+	ld b, $4
+	call Divide
+
+; ...to get .85-1.00x damage.
+	ld a, [$ffb5]
+	ld hl, CurDamage
+	ld [hli], a
+	ld a, [$ffb6]
+	ld [hl], a
+	ret
+; 34d32
+
+
+BattleCommand09: ; 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 .UnleashedEnergy
+	ret nz
+
+; Perfect-accuracy moves
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call CleanGetBattleVarPair
+	cp $11
+	ret z
+
+	call .StatModifiers
+
+	ld a, [PlayerMoveAccuracy]
+	ld b, a
+	ld a, [hBattleTurn]
+	and a
+	jr z, .BrightPowder
+	ld a, [EnemyMoveAccuracy]
+	ld b, a
+
+.BrightPowder
+	push bc
+	call GetOpponentItem
+	ld a, b
+	cp $4d ; brightpowder
+	ld a, c ; % miss
+	pop bc
+	jr nz, .asm_34d81
+
+	ld c, a
+	ld a, b
+	sub c
+	ld b, a
+	jr nc, .asm_34d81
+	ld b, 0
+
+.asm_34d81
+	ld a, b
+	cp $ff
+	jr z, .Hit
+
+	call FarBattleRNG
+	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 CleanGetBattleVarPair
+	cp $2d
+	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 CleanGetBattleVarPair
+	cp $8
+	ret nz
+
+	ld a, BATTLE_VARS_STATUS_OPP
+	call CleanGetBattleVarPair
+	and 7 ; sleep
+	ret
+
+
+.Protect
+; Return nz if the opponent is protected.
+	ld a, BATTLE_VARS_SUBSTATUS1_OPP
+	call CleanGetBattleVarPair
+	bit 2, a
+	ret z
+
+	ld c, 40
+	call DelayFrames
+
+; 'protecting itself!'
+	ld hl, BattleText_0x8167a
+	call FarBattleTextBox
+
+	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 GetBattleVarPair
+	bit 5, [hl]
+	res 5, [hl]
+	ret z
+
+	ld a, BATTLE_VARS_SUBSTATUS3_OPP
+	call CleanGetBattleVarPair
+	bit 6, a ; flying
+	jr z, .LockedOn
+
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call CleanGetBattleVarPair
+
+	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 ; CheckOpponentSub
+	jr z, .asm_34e00
+
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call CleanGetBattleVarPair
+
+	cp $3 ; drain
+	ret z
+	cp $8 ; dream eater
+	ret z
+
+.asm_34e00
+	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 CleanGetBattleVarPair
+	and $60 ; fly | dig
+	ret z
+
+	bit 6, a
+	jr z, .DigMoves
+
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call CleanGetBattleVarPair
+
+	cp GUST
+	ret z
+	cp WHIRLWIND
+	ret z
+	cp THUNDER
+	ret z
+	cp TWISTER
+	ret
+
+.DigMoves
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call CleanGetBattleVarPair
+
+	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 CleanGetBattleVarPair
+	cp $98
+	ret nz
+
+	ld a, [Weather]
+	cp WEATHER_RAIN
+	ret
+
+
+.UnleashedEnergy
+; Return nz if unleashing energy from Bide.
+	ld a, BATTLE_VARS_SUBSTATUS4
+	call CleanGetBattleVarPair
+	bit 0, a
+	ret
+
+
+.StatModifiers
+
+	ld a, [hBattleTurn]
+	and a
+
+	ld hl, PlayerMoveAccuracy
+	ld a, [PlayerAccLevel]
+	ld b, a
+	ld a, [EnemyEvaLevel]
+	ld c, a
+
+	jr z, .asm_34e60
+
+	ld hl, EnemyMoveAccuracy
+	ld a, [EnemyAccLevel]
+	ld b, a
+	ld a, [PlayerEvaLevel]
+	ld c, a
+
+.asm_34e60
+	cp b
+	jr c, .asm_34e6b
+
+	ld a, BATTLE_VARS_SUBSTATUS1_OPP
+	call CleanGetBattleVarPair
+	bit 3, a
+	ret nz
+
+.asm_34e6b
+	ld a, $e
+	sub c
+	ld c, a
+	xor a
+	ld [$ffb4], a
+	ld [$ffb5], a
+	ld a, [hl]
+	ld [$ffb6], a
+	push hl
+	ld d, $2
+
+.asm_34e7a
+	push bc
+	ld hl, .AccProb
+	dec b
+	sla b
+	ld c, b
+	ld b, 0
+	add hl, bc
+	pop bc
+	ld a, [hli]
+	ld [$ffb7], a
+	call Multiply
+	ld a, [hl]
+	ld [$ffb7], a
+	ld b, $4
+	call Divide
+	ld a, [$ffb6]
+	ld b, a
+	ld a, [$ffb5]
+	or b
+	jr nz, .asm_34ea2
+	ld [$ffb5], a
+	ld a, $1
+	ld [$ffb6], a
+
+.asm_34ea2
+	ld b, c
+	dec d
+	jr nz, .asm_34e7a
+
+	ld a, [$ffb5]
+	and a
+	ld a, [$ffb6]
+	jr z, .asm_34eaf
+	ld a, $ff
+
+.asm_34eaf
+	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
+
+
+BattleCommand90: ; 34ecc
+	xor a
+	ld [$c70d], a
+	call CheckSubstituteOpp
+	jr nz, .asm_34ee7 ; 34ed3 $12
+	push hl
+	ld hl, PlayerMoveEffectChance
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_34ee1 ; 34edc $3
+	ld hl, EnemyMoveEffectChance
+.asm_34ee1
+	call FarBattleRNG
+	cp [hl]
+	pop hl
+	ret c
+.asm_34ee7
+	ld a, $1
+	ld [$c70d], a
+	and a
+	ret
+; 34eee
+
+
+BattleCommand0a: ; 34eee
+	ld a, BATTLE_VARS_SUBSTATUS4
+	call CleanGetBattleVarPair
+	bit 4, a
+	ret z
+
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call CleanGetBattleVarPair
+	bit 4, a
+	jr nz, .asm_34f18
+
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call CleanGetBattleVarPair
+	cp $27 ; razor wind
+	jr z, .asm_34f21
+	cp $4b ; sky attack
+	jr z, .asm_34f21
+	cp $91 ; skull bash
+	jr z, .asm_34f21
+	cp $97 ; solarbeam
+	jr z, .asm_34f21
+	cp $9b ; fly / dig
+	jr z, .asm_34f21
+
+.asm_34f18
+	call .Rampage
+	jr z, .asm_34f21
+
+	call Function0x34548
+	ret nz
+
+.asm_34f21
+	call $7ed5
+	jr c, .asm_34f36
+
+	xor a
+	ld [$cfca], a
+	ld [FXAnimIDHi], a
+	inc a
+	ld [$c689], a
+	ld a, $a4
+	jp $7e44
+
+.asm_34f36
+	call $65c3
+	jp $7e80
+
+.Rampage
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call CleanGetBattleVarPair
+	cp $75 ; rollout
+	jr z, .asm_34f4d
+	cp $1b ; rampage
+	jr z, .asm_34f4d
+
+	ld a, 1
+	and a
+	ret
+
+.asm_34f4d
+	ld a, [$c73e]
+	and a
+	ld a, 0
+	ld [$c73e], a
+	ret
+; 34f57
+
+
+BattleCommandab: ; 34f57
+; hittarget
+	call BattleCommand0a
+	call BattleCommand0b
+	jp BattleCommand0c
+; 34f60
+
+
+BattleCommand0b: ; 34f60
+	ld a, [AttackMissed]
+	and a
+	jp nz, $7e80
+
+	ld a, [hBattleTurn]
+	and a
+	ld de, $c672
+	ld a, 1
+	jr z, .asm_34f76
+	ld de, $c67a
+	ld a, 4
+
+.asm_34f76
+	ld [$cfca], a
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call CleanGetBattleVarPair
+	cp $1d ; multihit
+	jr z, .asm_34fb0
+	cp $1e ; conversion
+	jr z, .asm_34fb0
+	cp $2c ; double kick / bonemerang
+	jr z, .asm_34fb0
+	cp $4d ; twineedle
+	jr z, .asm_34fb0
+	cp $68 ; triple kick
+	jr z, .asm_34f96
+	xor a
+	ld [$c689], a
+
+.asm_34f96
+
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call CleanGetBattleVarPair
+	ld e, a
+	ld d, 0
+	call PlayFXAnimID
+
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call CleanGetBattleVarPair
+	cp FLY
+	jr z, .asm_34fad
+	cp DIG
+	ret nz
+
+.asm_34fad
+; clear sprite
+	jp $7ec7
+.asm_34fb0
+	ld a, [$c689]
+	and $1
+	xor $1
+	ld [$c689], a
+	ld a, [de]
+	cp $1
+	push af
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call CleanGetBattleVarPair
+	ld e, a
+	ld d, $0
+	pop af
+	jp z, PlayFXAnimID
+	xor a
+	ld [$cfca], a
+	jp PlayFXAnimID
+; 34fd1
+
+
+BattleCommand92: ; 34fd1
+	ld a, [AttackMissed]
+	and a
+	jp nz, $7e80
+
+	xor a
+	jr BattleCommand91_92
+; 34fdb
+
+
+BattleCommand91: ; 34fdb
+	ld a, [AttackMissed]
+	and a
+	jp nz, $7e80
+
+	ld a, [hBattleTurn]
+	and a
+	ld a, 2
+	jr z, BattleCommand91_92
+	ld a, 5
+
+	; fallthrough
+; 34feb
+
+
+BattleCommand91_92: ; 34feb
+	ld [$cfca], a
+	xor a
+	ld [$c689], a
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call CleanGetBattleVarPair
+	ld e, a
+	ld d, 0
+	jp PlayFXAnimID
+; 34ffd
+
+
+BattleCommand93: ; 34ffd
+	ld a, [hBattleTurn]
+	xor $1
+	ld [hBattleTurn], a
+	ret
+; 35004
+
+
+BattleCommand0c: ; 35004
+	ld a, BATTLE_VARS_SUBSTATUS4
+	call CleanGetBattleVarPair
+	bit 4, a
+	ret z
+	call $7ed5
+	jp c, BattleCommanda6
+	xor a
+	ld [$cfca], a
+	ld [FXAnimIDHi], a
+	ld a, $2
+	ld [$c689], a
+	ld a, $a4
+	jp $7e44
+; 35023
+
+
+BattleCommand0d: ; 35023
+	ld a, [AttackMissed]
+	and a
+	ret z
+	call $50e4
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call GetBattleVarPair
+	cp $13
+	jr z, .asm_3504f ; 35032 $1b
+	cp $5b
+	jr z, .asm_3504f ; 35036 $17
+	inc hl
+	ld a, [hl]
+	cp $1d
+	jr z, .asm_35049 ; 3503c $b
+	cp $2c
+	jr z, .asm_35049 ; 35040 $7
+	cp $4d
+	jr z, .asm_35049 ; 35044 $3
+	jp EndMoveEffect
+.asm_35049
+	call BattleCommand0c
+	jp EndMoveEffect
+.asm_3504f
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVarPair
+	res 5, [hl]
+	res 6, [hl]
+	call $7ece
+	jp EndMoveEffect
+; 3505e
+
+
+BattleCommand0e: ; 3505e
+	ld a, BATTLE_VARS_SUBSTATUS1_OPP
+	call CleanGetBattleVarPair
+	bit 5, a
+	jr z, .asm_35072 ; 35065 $b
+	call $5c94
+	ld b, $0
+	jr nc, .asm_3508b ; 3506c $1d
+	ld b, $1
+	jr .asm_3508b ; 35070 $19
+
+.asm_35072
+	call GetOpponentItem
+	ld a, b
+	cp $4f
+	ld b, $0
+	jr nz, .asm_3508b ; 3507a $f
+	call FarBattleRNG
+	cp c
+	jr nc, .asm_3508b ; 35080 $9
+	call $5c94
+	ld b, $0
+	jr nc, .asm_3508b ; 35087 $2
+	ld b, $2
+.asm_3508b
+	push bc
+	call .asm_50bb
+	ld c, $0
+	ld a, [hBattleTurn]
+	and a
+	jr nz, .asm_3509b
+	call Function0x35d1c
+	jr .asm_3509e
+
+.asm_3509b
+	call Function0x35d7e
+
+.asm_3509e
+	pop bc
+	ld a, b
+	and a
+	ret z
+	dec a
+	jr nz, .asm_350ab ; 350a3 $6
+	ld hl, $4eb0
+	jp FarBattleTextBox
+
+.asm_350ab
+	call GetOpponentItem
+	ld a, [hl]
+	ld [$d265], a
+	call $3468
+	ld hl, $4e99
+	jp FarBattleTextBox
+
+.asm_50bb
+	ld a, $8
+	call CleanGetBattleVarPair
+	bit 4, a
+	ret nz
+	ld de, EnemyDamageTaken
+	ld a, [hBattleTurn]
+	and a
+	jr nz, .asm_350ce ; 0x350c9 $3
+	ld de, $c685
+
+.asm_350ce
+	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
+
+
+; 350e4
+	ld hl, $5071
+	ld de, $5071
+	ld a, [TypeModifier]
+	and $7f
+	jr z, .asm_35110 ; 0x350ef $1f
+	ld a, $d
+	call CleanGetBattleVarPair
+	cp $94
+	ld hl, $54f0
+	ld de, $5500
+	jr z, .asm_35110 ; 0x350fe $10
+	ld hl, $5020
+	ld de, $5033
+	ld a, [CriticalHit]
+	cp $ff
+	jr nz, .asm_35110 ; 0x3510b $3
+	ld hl, $5061
+.asm_35110
+	call Function0x35157
+	xor a
+	ld [CriticalHit], a
+	ld a, $d
+	call CleanGetBattleVarPair
+	cp $2d
+	ret nz
+	ld a, [TypeModifier]
+	and $7f
+	ret z
+	ld hl, CurDamage
+	ld a, [hli]
+	ld b, [hl]
+	srl a
+	rr b
+	srl a
+	rr b
+	srl a
+	rr b
+	ld [hl], b
+	dec hl
+	ld [hli], a
+	or b
+	jr nz, .asm_3513e ; 0x3513a $2
+	inc a
+	ld [hl], a
+.asm_3513e
+	ld hl, $5046
+	call FarBattleTextBox
+	ld a, $1
+	ld [$c689], a
+	call $7e36
+	ld c, $1
+	ld a, [hBattleTurn]
+	and a
+	jp nz, Function0x35d1c
+	jp Function0x35d7e
+
+Function0x35157: ; 35157
+	ld a, BATTLE_VARS_SUBSTATUS1_OPP
+	call CleanGetBattleVarPair
+	bit 2, a ; protect
+	jr z, .asm_35162
+	ld h, d
+	ld l, e
+.asm_35162
+	jp FarBattleTextBox
+; 35165
+
+
+BattleCommanda5: ; 35165
+	ld a, [AttackMissed]
+	and a
+	ret z
+
+	ld a, [TypeModifier]
+	and $7f
+	jp z, PrintDoesntAffect
+	jp $734e
+; 35175
+
+
+BattleCommand0f: ; 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, .ptrs
+	ld b, 0
+	ld c, a
+	add hl, bc
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	call FarBattleTextBox
+
+	xor a
+	ld [CriticalHit], a
+
+.wait
+	ld c, 20
+	jp DelayFrames
+
+.ptrs
+	dw BattleText_0x81086 ; 'critical hit'
+	dw BattleText_0x81097 ; 'one-hit ko'
+; 35197
+
+
+BattleCommandae: ; 35197
+; player
+	ld hl, $c672
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_351a2
+; enemy
+	ld hl, $c67a
+
+.asm_351a2
+	xor a
+	ld [hl], a
+	ret
+; 351a5
+
+
+BattleCommandad: ; 351a5
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVarPair
+	bit 2, a
+	ret nz
+
+	; fallthrough
+; 351ad
+
+
+BattleCommand10: ; 351ad
+	ld a, [TypeModifier]
+	and $7f
+	cp 10 ; 1.0
+	ret z
+	ld hl, BattleText_0x810aa ; 'super-effective'
+	jr nc, .print
+	ld hl, BattleText_0x810c1 ; 'not very effective'
+.print
+	jp FarBattleTextBox
+; 351c0
+
+
+BattleCommand11: ; 351c0
+	ld hl, EnemyMonHPHi
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_351cb
+	ld hl, BattleMonHP
+.asm_351cb
+	ld a, [hli]
+	or [hl]
+	ret nz
+	ld a, BATTLE_VARS_SUBSTATUS5_OPP
+	call CleanGetBattleVarPair
+	bit 6, a
+	jr z, .asm_35231 ; 351d5 $5a
+	ld hl, $50da
+	call FarBattleTextBox
+	ld a, [hBattleTurn]
+	and a
+	ld hl, EnemyMonMaxHPLo
+	ld bc, $c4ca
+	ld a, $0
+	jr nz, .asm_351f2 ; 351e8 $8
+	ld hl, $c63f
+	ld bc, $c55e
+	ld a, $1
+.asm_351f2
+	ld [$d10a], a
+	ld a, [hld]
+	ld [$d1ea], a
+	ld a, [hld]
+	ld [$d1eb], a
+	ld a, [hl]
+	ld [$d1ec], a
+	xor a
+	ld [hld], a
+	ld a, [hl]
+	ld [$d1ed], a
+	xor a
+	ld [hl], a
+	ld [$d1ee], a
+	ld [$d1ef], a
+	ld h, b
+	ld l, c
+	ld a, $b
+	call $2d83
+	call $39c9
+	call $4ffd
+	xor a
+	ld [$cfca], a
+	ld [FXAnimIDHi], a
+	inc a
+	ld [$c689], a
+	ld a, $c2
+	call $7e44
+	call $4ffd
+	jr .asm_3524d ; 3522f $1c
+.asm_35231
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call CleanGetBattleVarPair
+	cp $1d
+	jr z, .asm_3524a ; 35238 $10
+	cp $2c
+	jr z, .asm_3524a ; 3523c $c
+	cp $4d
+	jr z, .asm_3524a ; 35240 $8
+	cp $68
+	jr z, .asm_3524a ; 35244 $4
+	cp $9a
+	jr nz, .asm_3524d ; 35248 $3
+.asm_3524a
+	call BattleCommand0c
+.asm_3524d
+	jp EndMoveEffect
+; 35250
+
+
+BattleCommand12: ; 35250
+	jp .start
+.start
+	ld a, [AttackMissed]
+	and a
+	ret nz
+	ld a, $8
+	call CleanGetBattleVarPair
+	bit 6, a
+	ret z
+	ld de, $c72c
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_3526b
+	ld de, $c72b
+.asm_3526b
+	ld a, [de]
+	inc a
+	ret z
+	ld [de], a
+	call $4ffd
+	ld hl, $50f3
+	call FarBattleTextBox
+	jp $4ffd
+; 3527b
+
+
+BattleCommanda2: ; 3527b
+	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, [$c72b]
+	jr z, .asm_35290 ; 3528b $3
+	ld a, [$c72c]
+.asm_35290
+	and a
+	jr z, .asm_3529a ; 35291 $7
+	dec a
+	add hl, bc
+	jr nc, .asm_35290 ; 35295 $f9
+	ld hl, $ffff
+.asm_3529a
+	ld a, h
+	ld [CurDamage], a
+	ld a, l
+	ld [CurDamage + 1], a
+	ret
+; 352a3
+
+
+EndMoveEffect: ; 352a3
+	ld a, [BattleScriptBufferLoc]
+	ld l, a
+	ld a, [BattleScriptBufferLoc + 1]
+	ld h, a
+	ld a, $ff
+	ld [hli], a
+	ld [hli], a
+	ld [hl], a
+	ret
+; 352b1
+
+
+DittoMetalPowder: ; 352b1
+	ld a, PartyMon1Species - PartyMon1
+	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, .asm_352d8
+	inc b
+.asm_352d8
+	scf
+	rr c
+	ret
+; 352dc
+
+
+BattleCommand06: ; 352dc
+; damagecalc
+
+	ld a, [hBattleTurn]
+	and a
+	jp nz, EnemyAttackDamage
+
+	; fallthrough
+; 352e2
+
+
+PlayerAttackDamage: ; 352e2
+
+	call ResetDamage
+	ld hl, PlayerMovePower
+	ld a, [hli]
+	and a
+	ld d, a
+	ret z
+	ld a, [hl]
+	cp $14
+	jr nc, .asm_35315 ; 352ef $24
+	ld hl, EnemyMonDef
+	ld a, [hli]
+	ld b, a
+	ld c, [hl]
+	ld a, [$c700]
+	bit 4, a
+	jr z, .asm_35302 ; 352fc $4
+	sla c
+	rl b
+.asm_35302
+	ld hl, BattleMonAtk
+	call GetDamageStatsCritical
+	jr c, .asm_3533c ; 35308 $32
+	ld hl, $c6c3
+	ld a, [hli]
+	ld b, a
+	ld c, [hl]
+	ld hl, $c6b6
+	jr .asm_3533c ; 35313 $27
+.asm_35315
+	ld hl, EnemyMonSpclDef
+	ld a, [hli]
+	ld b, a
+	ld c, [hl]
+	ld a, [$c700]
+	bit 3, a
+	jr z, .asm_35326 ; 35320 $4
+	sla c
+	rl b
+.asm_35326
+	ld hl, BattleMonSpclAtk
+	call GetDamageStatsCritical
+	jr c, .asm_35337 ; 3532c $9
+	ld hl, $c6c9
+	ld a, [hli]
+	ld b, a
+	ld c, [hl]
+	ld hl, $c6bc
+.asm_35337
+	call $53c3
+	jr .asm_3533f ; 3533a $3
+.asm_3533c
+	call $53b5
+.asm_3533f
+	call .asm_3534d
+	ld a, [BattleMonLevel]
+	ld e, a
+	call DittoMetalPowder
+	ld a, 1
+	and a
+	ret
+
+.asm_3534d
+	ld a, h
+	or b
+	jr z, .asm_3536b ; 0x3534f $1a
+	srl b
+	rr c
+	srl b
+	rr c
+	ld a, c
+	or b
+	jr nz, .asm_3535e ; 0x3535b $1
+	inc c
+.asm_3535e
+	srl h
+	rr l
+	srl h
+	rr l
+	ld a, l
+	or h
+	jr nz, .asm_3536b ; 0x35368 $1
+	inc l
+.asm_3536b
+	ld a, [InLinkBattle]
+	cp $3
+	jr z, .asm_35376 ; 0x35370 $4
+	ld a, h
+	or b
+	jr nz, .asm_3534d ; 0x35374 $d7
+.asm_35376
+	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, [PlayerMoveType]
+	cp FIRE
+; 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, [EnemyMoveType]
+	cp FIRE
+; 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
+; If the attacking monster is Cubone or Marowak and
+; it's holding a Thick Club, double stat value hl.
+	push bc
+	push de
+	ld b, CUBONE
+	ld c, MAROWAK
+	ld d, THICK_CLUB
+	call SpeciesItemBoost
+	pop de
+	pop bc
+	ret
+; 353c3
+
+
+LightBallBoost: ; 353c3
+; If the attacking monster is Pikachu and it's
+; holding a Light Ball, double stat value hl.
+	push bc
+	push de
+	ld b, PIKACHU
+	ld c, PIKACHU
+	ld d, LIGHT_BALL
+	call SpeciesItemBoost
+	pop de
+	pop bc
+	ret
+; 353d1
+
+
+SpeciesItemBoost: ; 353d1
+; If the attacking monster is species b or c and
+; it's holding item d, double stat value hl.
+
+	ld a, [hli]
+	ld l, [hl]
+	ld h, a
+
+	push hl
+	ld a, PartyMon1Species - PartyMon1
+	call BattlePartyAttr
+
+	ld a, [hBattleTurn]
+	and a
+	ld a, [hl]
+	jr z, .CompareSpecies
+	ld a, [TempEnemyMonSpecies]
+.CompareSpecies
+	pop hl
+
+	cp b
+	jr z, .GetItem
+	cp c
+	ret nz
+
+.GetItem
+	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, EnemyMovePower
+	ld a, [hli] ; hl = EnemyMoveType
+	ld d, a
+	and a
+	ret z
+
+	ld a, [hl]
+	cp FIRE
+	jr nc, .Special
+
+
+; Physical
+	ld hl, BattleMonDef
+	ld a, [hli]
+	ld b, a
+	ld c, [hl]
+
+; Reflect
+	ld a, [PlayerScreens]
+	bit 4, a
+	jr z, .asm_35416
+	sla c
+	rl b
+
+.asm_35416
+	ld hl, EnemyMonAtk
+	call GetDamageStatsCritical
+	jr c, .asm_35450
+
+	ld hl, $c6b8
+	ld a, [hli]
+	ld b, a
+	ld c, [hl]
+	ld hl, $c6c1
+	jr .asm_35450
+
+
+.Special
+	ld hl, BattleMonSpclDef
+	ld a, [hli]
+	ld b, a
+	ld c, [hl]
+
+; Light Screen
+	ld a, [PlayerScreens]
+	bit 3, a
+	jr z, .asm_3543a
+	sla c
+	rl b
+
+.asm_3543a
+	ld hl, EnemyMonSpclAtk
+	call GetDamageStatsCritical
+	jr c, .asm_3544b
+	ld hl, $c6be
+	ld a, [hli]
+	ld b, a
+	ld c, [hl]
+	ld hl, $c6c7
+
+.asm_3544b
+	call $53c3
+	jr .asm_35453
+
+.asm_35450
+	call $53b5
+
+.asm_35453
+	call $534d
+	ld a, [EnemyMonLevel]
+	ld e, a
+	call $52b1
+	ld a, 1
+	and a
+	ret
+; 35461
+
+
+BattleCommanda1: ; 35461
+; beatup
+
+	call ResetDamage
+	ld a, [hBattleTurn]
+	and a
+	jp nz, .asm_354ef
+	ld a, [PlayerSubStatus3]
+	bit 2, a
+	jr nz, .asm_35482 ; 3546f $11
+	ld c, $14
+	call DelayFrames
+	xor a
+	ld [$c672], a
+	ld [DefaultFlypoint], a
+	ld [$c72d], a
+	jr .asm_3548d ; 35480 $b
+.asm_35482
+	ld a, [$c672]
+	ld b, a
+	ld a, [PartyCount]
+	sub b
+	ld [DefaultFlypoint], a
+.asm_3548d
+	ld a, [DefaultFlypoint]
+	ld hl, PartyMon1Nickname
+	call $38a2
+	ld a, $22
+	call Function0x355bd
+	ld a, [hli]
+	or [hl]
+	jp z, $55b0
+	ld a, [DefaultFlypoint]
+	ld c, a
+	ld a, [CurBattleMon]
+	cp [hl]
+	ld hl, BattleMonStatus
+	jr z, .asm_354b2 ; 354ab $5
+	ld a, $20
+	call Function0x355bd
+.asm_354b2
+	ld a, [hl]
+	and a
+	jp nz, $55b0
+	ld a, $1
+	ld [$c72d], a
+	ld hl, BeatUpAttackText
+	call FarBattleTextBox
+	ld a, [EnemyMonSpecies]
+	ld [CurSpecies], a
+	call $3856
+	ld a, [$d239]
+	ld c, a
+	push bc
+	ld a, $0
+	call Function0x355bd
+	ld a, [hl]
+	ld [CurSpecies], a
+	call $3856
+	ld a, [$d238]
+	pop bc
+	ld b, a
+	push bc
+	ld a, $1f
+	call Function0x355bd
+	ld a, [hl]
+	ld e, a
+	pop bc
+	ld a, [PlayerMovePower]
+	ld d, a
+	ret
+
+.asm_354ef
+	ld a, [EnemySubStatus3]
+	bit 2, a
+	jr nz, .asm_35502
+
+	xor a
+	ld [$c67a], a
+	ld [DefaultFlypoint], a
+	ld [$c72d], a
+	jr .asm_3550d
+
+.asm_35502
+	ld a, [$c67a]
+	ld b, a
+	ld a, [OTPartyCount]
+	sub b
+	ld [DefaultFlypoint], a
+.asm_3550d
+	ld a, [IsInBattle]
+	dec a
+	jr z, .asm_3556b
+
+	ld a, [InLinkBattle]
+	and a
+	jr nz, .asm_35532
+
+	ld a, [$cfc0]
+	and a
+	jr nz, .asm_35532
+
+	ld a, [DefaultFlypoint]
+	ld c, a
+	ld b, $0
+	ld hl, OTPartySpecies
+	add hl, bc
+	ld a, [hl]
+	ld [$d265], a
+	call $343b
+	jr .asm_35544
+
+.asm_35532
+	ld a, [DefaultFlypoint]
+	ld hl, OTPartyMon1Nickname
+	ld bc, $000b
+	call AddNTimes
+	ld de, StringBuffer1
+	call CopyBytes
+.asm_35544
+	ld a, $22
+	call Function0x355bd
+	ld a, [hli]
+	or [hl]
+	jp z, $55b0
+	ld a, [DefaultFlypoint]
+	ld b, a
+	ld a, [CurOTMon]
+	cp b
+	ld hl, EnemyMonStatus
+	jr z, .asm_35560
+
+	ld a, $20
+	call Function0x355bd
+.asm_35560
+	ld a, [hl]
+	and a
+	jr nz, .asm_355b0
+
+	ld a, $1
+	ld [$c72d], a
+	jr .asm_3557d
+
+.asm_3556b
+	ld a, [EnemyMonSpecies]
+	ld [$d265], a
+	call $343b
+	ld hl, BeatUpAttackText
+	call FarBattleTextBox
+	jp $53f6
+.asm_3557d
+	ld hl, BeatUpAttackText
+	call FarBattleTextBox
+	ld a, [BattleMonSpecies]
+	ld [CurSpecies], a
+	call GetBaseStats
+	ld a, [$d239]
+	ld c, a
+	push bc
+	ld a, $0
+	call Function0x355bd
+	ld a, [hl]
+	ld [CurSpecies], a
+	call GetBaseStats
+	ld a, [$d238]
+	pop bc
+	ld b, a
+	push bc
+	ld a, $1f
+	call Function0x355bd
+	ld a, [hl]
+	ld e, a
+	pop bc
+	ld a, [EnemyMovePower]
+	ld d, a
+	ret
+
+.asm_355b0
+	ld b, $12
+	jp $7e8c
+; 355b5
+
+
+BattleCommanda8: ; 355b5
+	ld a, [$c72d]
+	and a
+	ret nz
+	jp $734e
+; 355bd
+
+
+Function0x355bd: ; 355bd
+	push bc
+	ld c, a
+	ld b, 0
+	ld a, [hBattleTurn]
+	and a
+	ld hl, PartyMon1Species
+	jr z, .asm_355cc
+
+	ld hl, OTPartyMon1Species2
+.asm_355cc
+	ld a, [DefaultFlypoint]
+	add hl, bc
+	call GetPartyLocation
+	pop bc
+	ret
+; 355d5
+
+
+BattleCommanda9: ; 355d5
+	ld a, [AttackMissed]
+	and a
+	ret z
+	jp ResetDamage
+; 355dd
+
+
+Function0x355dd: ; 355dd
+	call ResetDamage
+	ld a, [hBattleTurn]
+	and a
+	ld hl, BattleMonDef
+	ld de, PlayerScreens
+	ld a, [BattleMonLevel]
+	jr z, .asm_355f7
+
+	ld hl, EnemyMonDef
+	ld de, $c700
+	ld a, [EnemyMonLevel]
+.asm_355f7
+	push af
+	ld a, [hli]
+	ld b, a
+	ld c, [hl]
+	ld a, [de]
+	bit 4, a
+	jr z, .asm_35604
+
+	sla c
+	rl b
+.asm_35604
+	dec hl
+	dec hl
+	dec hl
+	ld a, [hli]
+	ld l, [hl]
+	ld h, a
+	call $534d
+	ld d, $28
+	pop af
+	ld e, a
+	ret
+; 35612
+
+
+BattleCommand62: ; 35612
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call CleanGetBattleVarPair
+	cp $7
+	jr nz, .asm_35620 ; 35619 $5
+	srl c
+	jr nz, .asm_35620 ; 3561d $1
+	inc c
+.asm_35620
+	cp $1d
+	jr z, .asm_3562b ; 35622 $7
+	cp $1e
+	jr z, .asm_3562b ; 35626 $3
+	ld a, d
+	and a
+	ret z
+.asm_3562b
+	ld a, c
+	and a
+	jr nz, .asm_35631 ; 3562d $2
+	ld c, $1
+.asm_35631
+	xor a
+	ld hl, $ffb3
+	ld [hli], a
+	ld [hli], a
+	ld [hl], a
+	ld a, e
+	add a
+	jr nc, .asm_3563e ; 3563a $2
+	ld [hl], $1
+.asm_3563e
+	inc hl
+	ld [hli], a
+	ld a, $5
+	ld [hld], a
+	push bc
+	ld b, $4
+	call $3124
+	pop bc
+	inc [hl]
+	inc [hl]
+	inc hl
+	ld [hl], d
+	call $3119
+	ld [hl], b
+	call $3119
+	ld [hl], c
+	ld b, $4
+	call $3124
+	ld [hl], $32
+	ld b, $4
+	call $3124
+	call GetUserItem
+	ld a, b
+	and a
+	jr z, .asm_3568f ; 35667 $26
+	ld hl, TypeBoostItems
+.asm_3566c
+	ld a, [hli]
+	cp $ff
+	jr z, .asm_3568f ; 3566f $1e
+	cp b
+	ld a, [hli]
+	jr nz, .asm_3566c ; 35673 $f7
+	ld b, a
+	ld a, BATTLE_VARS_MOVE_TYPE
+	call CleanGetBattleVarPair
+	cp b
+	jr nz, .asm_3568f ; 3567c $11
+	ld a, c
+	add $64
+	ld [$ffb7], a
+	call $3119
+	ld a, $64
+	ld [$ffb7], a
+	ld b, $4
+	call $3124
+.asm_3568f
+	call Function0x356eb
+	ld hl, CurDamage
+	ld b, [hl]
+	ld a, [$ffb6]
+	add b
+	ld [$ffb6], a
+	jr nc, .asm_356a5 ; 3569b $8
+	ld a, [$ffb5]
+	inc a
+	ld [$ffb5], a
+	and a
+	jr z, .asm_356d9 ; 356a3 $34
+.asm_356a5
+	ld a, [$ffb3]
+	ld b, a
+	ld a, [$ffb4]
+	or a
+	jr nz, .asm_356d9 ; 356ab $2c
+	ld a, [$ffb5]
+	cp $3
+	jr c, .asm_356bd ; 356b1 $a
+	cp $4
+	jr nc, .asm_356d9 ; 356b5 $22
+	ld a, [$ffb6]
+	cp $e6
+	jr nc, .asm_356d9 ; 356bb $1c
+.asm_356bd
+	inc hl
+	ld a, [$ffb6]
+	ld b, [hl]
+	add b
+	ld [hld], a
+	ld a, [$ffb5]
+	ld b, [hl]
+	adc b
+	ld [hl], a
+	jr c, .asm_356d9 ; 356c8 $f
+	ld a, [hl]
+	cp $3
+	jr c, .asm_356df ; 356cd $10
+	cp $4
+	jr nc, .asm_356d9 ; 356d1 $6
+	inc hl
+	ld a, [hld]
+	cp $e6
+	jr c, .asm_356df ; 356d7 $6
+.asm_356d9
+	ld a, $3
+	ld [hli], a
+	ld a, $e5
+	ld [hld], a
+.asm_356df
+	inc hl
+	ld a, [hl]
+	add $2
+	ld [hld], a
+	jr nc, .asm_356e7 ; 356e4 $1
+	inc [hl]
+.asm_356e7
+	ld a, $1
+	and a
+	ret
+; 356eb
+
+
+Function0x356eb: ; 356eb
+	ld a, [CriticalHit]
+	and a
+	ret z
+
+	ld a, [$ffb6]
+	add a
+	ld [$ffb6], a
+	ld a, [$ffb5]
+	rl a
+	ld [$ffb5], a
+	ret nc
+
+	ld a, $ff
+	ld [$ffb5], a
+	ld [$ffb6], a
+	ret
+; 35703
+
+
+TypeBoostItems: ; 35703
+	db $32, NORMAL   ; Pink/Polkadot Bow
+	db $33, FIGHTING ; Blackbelt
+	db $34, FLYING   ; Sharp Beak
+	db $35, POISON   ; Poison Barb
+	db $36, GROUND   ; Soft Sand
+	db $37, ROCK     ; Hard Stone
+	db $38, BUG      ; Silverpowder
+	db $39, GHOST    ; Spell Tag
+	db $3a, FIRE     ; Charcoal
+	db $3b, WATER    ; Mystic Water
+	db $3c, GRASS    ; Miracle Seed
+	db $3d, ELECTRIC ; Magnet
+	db $3e, PSYCHIC  ; Twistedspoon
+	db $3f, ICE      ; Nevermeltice
+	db $40, DRAGON   ; Dragon Scale
+	db $41, DARK     ; Blackglasses
+	db $42, STEEL    ; Metal Coat
+	db $ff
+; 35726
+
+
+BattleCommand3f: ; 35726
+
+	ld hl, BattleMonLevel
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_35731
+	ld hl, EnemyMonLevel
+
+.asm_35731
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call CleanGetBattleVarPair
+	cp $57
+	ld b, [hl]
+	ld a, 0
+	jr z, .asm_3578c
+
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call CleanGetBattleVarPair
+	cp $58
+	jr z, .asm_35758
+
+	cp $28
+	jr z, .asm_3576b
+
+	cp $63
+	jr z, .asm_35792
+
+	ld a, BATTLE_VARS_MOVE_POWER
+	call CleanGetBattleVarPair
+	ld b, a
+	ld a, $0
+	jr .asm_3578c
+
+.asm_35758
+	ld a, b
+	srl a
+	add b
+	ld b, a
+.asm_3575d
+	call FarBattleRNG
+	and a
+	jr z, .asm_3575d ; 35761 $fa
+	cp b
+	jr nc, .asm_3575d ; 35764 $f7
+	ld b, a
+	ld a, $0
+	jr .asm_3578c ; 35769 $21
+.asm_3576b
+	ld hl, EnemyMonHPHi
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_35776 ; 35771 $3
+	ld hl, BattleMonHP
+.asm_35776
+	ld a, [hli]
+	srl a
+	ld b, a
+	ld a, [hl]
+	rr a
+	push af
+	ld a, b
+	pop bc
+	and a
+	jr nz, .asm_3578c ; 35781 $9
+	or b
+	ld a, $0
+	jr nz, .asm_3578c ; 35786 $4
+	ld b, $1
+	jr .asm_3578c ; 3578a $0
+.asm_3578c
+	ld hl, CurDamage
+	ld [hli], a
+	ld [hl], b
+	ret
+.asm_35792
+	ld hl, BattleMonHP
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_3579d ; 35798 $3
+	ld hl, EnemyMonHPHi
+.asm_3579d
+	xor a
+	ld [$ffb3], a
+	ld [$ffb4], a
+	ld a, [hli]
+	ld [$ffb5], a
+	ld a, [hli]
+	ld [$ffb6], a
+	ld a, $30
+	ld [$ffb7], a
+	call $3119
+	ld a, [hli]
+	ld b, a
+	ld a, [hl]
+	ld [$ffb7], a
+	ld a, b
+	and a
+	jr z, .asm_357d6
+
+	ld a, [$ffb7]
+	srl b
+	rr a
+	srl b
+	rr a
+	ld [$ffb7], a
+	ld a, [$ffb5]
+	ld b, a
+	srl b
+	ld a, [$ffb6]
+	rr a
+	srl b
+	rr a
+	ld [$ffb6], a
+	ld a, b
+	ld [$ffb5], a
+
+.asm_357d6
+	ld b, $4
+	call $3124
+	ld a, [$ffb6]
+	ld b, a
+	ld hl, .table_35807
+
+.asm_357e1
+	ld a, [hli]
+	cp b
+	jr nc, .asm_357e8
+	inc hl
+	jr .asm_357e1
+
+.asm_357e8
+	ld a, [hBattleTurn]
+	and a
+	ld a, [hl]
+	jr nz, .asm_357f8
+
+	ld hl, PlayerMovePower
+	ld [hl], a
+	push hl
+	call PlayerAttackDamage
+	jr .asm_35800
+
+.asm_357f8
+	ld hl, EnemyMovePower
+	ld [hl], a
+	push hl
+	call EnemyAttackDamage
+
+.asm_35800
+	call $5612
+	pop hl
+	ld [hl], 1
+	ret
+
+.table_35807
+	db  1, $c8
+	db  4, $96
+	db  9, $64
+	db 16, $50
+	db 32, $28
+	db 48, $14
+; 35813
+
+
+BattleCommand40: ; 35813
+	ld a, $1
+	ld [AttackMissed], a
+	ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
+	call CleanGetBattleVarPair
+	and a
+	ret z
+	ld b, a
+	ld hl, $45ec
+	ld a, $f
+	rst FarCall
+	ld a, b
+	cp $59
+	ret z
+	call $4833
+	ld a, [$d265]
+	and a
+	ret z
+	call Function0x36abf
+	ret z
+	ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
+	call CleanGetBattleVarPair
+	dec a
+	ld de, StringBuffer1
+	call GetMoveData
+	ld a, [$d075]
+	and a
+	ret z
+	ld a, [$d076]
+	cp $14
+	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, .asm_3585f ; 35859 $4
+	ld a, $ff
+	ld [hli], a
+	ld [hl], a
+.asm_3585f
+	xor a
+	ld [AttackMissed], a
+	ret
+; 35864
+
+
+BattleCommand41: ; 35864
+	ld hl, EnemyMonMoves
+	ld de, EnemyPerishCount
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_35875 ; 3586d $6
+	ld hl, BattleMonMoves
+	ld de, PlayerEncoreCount
+.asm_35875
+	ld a, BATTLE_VARS_LAST_MOVE_OPP
+	call CleanGetBattleVarPair
+	and a
+	jp z, $5923
+	cp $a5
+	jp z, $5923
+	cp $e3
+	jp z, $5923
+	cp $77
+	jp z, $5923
+	ld b, a
+.asm_3588e
+	ld a, [hli]
+	cp b
+	jr nz, .asm_3588e ; 35890 $fc
+	ld bc, $0005
+	add hl, bc
+	ld a, [hl]
+	and $3f
+	jp z, $5923
+	ld a, [AttackMissed]
+	and a
+	jp nz, $5923
+	ld a, BATTLE_VARS_SUBSTATUS5_OPP
+	call GetBattleVarPair
+	bit 4, [hl]
+	jp nz, $5923
+	set 4, [hl]
+	call FarBattleRNG
+	and $3
+	inc a
+	inc a
+	inc a
+	ld [de], a
+	call Function0x36abf
+	jr nz, .asm_3591a ; 358bb $5d
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_358ef ; 358c0 $2d
+	push hl
+	ld a, [LastPlayerMove]
+	ld b, a
+	ld c, $0
+	ld hl, BattleMonMoves
+.asm_358cc
+	ld a, [hli]
+	cp b
+	jr z, .asm_358dd ; 358ce $d
+	inc c
+	ld a, c
+	cp $4
+	jr c, .asm_358cc ; 358d4 $f6
+	pop hl
+	res 4, [hl]
+	xor a
+	ld [de], a
+	jr .asm_35923 ; 358db $46
+.asm_358dd
+	pop hl
+	ld a, c
+	ld [CurMoveNum], a
+	ld a, b
+	ld [CurPlayerMove], a
+	dec a
+	ld de, PlayerMoveStruct
+	call GetMoveData
+	jr .asm_3591a ; 358ed $2b
+.asm_358ef
+	push hl
+	ld a, [LastEnemyMove]
+	ld b, a
+	ld c, $0
+	ld hl, EnemyMonMoves
+.asm_358f9
+	ld a, [hli]
+	cp b
+	jr z, .asm_3590a ; 358fb $d
+	inc c
+	ld a, c
+	cp $4
+	jr c, .asm_358f9 ; 35901 $f6
+	pop hl
+	res 4, [hl]
+	xor a
+	ld [de], a
+	jr .asm_35923 ; 35908 $19
+.asm_3590a
+	pop hl
+	ld a, c
+	ld [CurEnemyMoveNum], a
+	ld a, b
+	ld [CurEnemyMove], a
+	dec a
+	ld de, EnemyMoveStruct
+	call GetMoveData
+.asm_3591a
+	call $7e01
+	ld hl, $5109
+	jp FarBattleTextBox
+.asm_35923
+	jp PrintDidntAffect2
+; 35926
+
+
+BattleCommand42: ; 35926
+	ld a, [AttackMissed]
+	and a
+	jp nz, .asm_359cd
+	call CheckSubstituteOpp
+	jp nz, .asm_359cd
+	call $7e01
+	ld hl, $c63f
+	ld de, EnemyMonMaxHPLo
+	call .asm_3597d
+	ld a, $1
+	ld [$d10a], a
+	ld hl, $c55e
+	ld a, $b
+	call $2d83
+	ld hl, EnemyMonHPHi
+	ld a, [hli]
+	ld [$d1ed], a
+	ld a, [hli]
+	ld [$d1ec], a
+	ld a, [hli]
+	ld [$d1eb], a
+	ld a, [hl]
+	ld [$d1ea], a
+	call $59ac
+	xor a
+	ld [$d10a], a
+	call ResetDamage
+	ld hl, $c4ca
+	ld a, $b
+	call $2d83
+	ld a, $5e
+	ld hl, $4000
+	rst FarCall
+	ld hl, $511b
+	jp FarBattleTextBox
+
+.asm_3597d
+	ld a, [hld]
+	ld [$d1ea], a
+	ld a, [hld]
+	ld [$d1eb], a
+	ld a, [hld]
+	ld b, a
+	ld [$d1ec], a
+	ld a, [hl]
+	ld [$d1ed], a
+	dec de
+	dec de
+	ld a, [de]
+	dec de
+	add b
+	ld [$d257], a
+	ld b, [hl]
+	ld a, [de]
+	adc b
+	srl a
+	ld [CurDamage], a
+	ld a, [$d257]
+	rr a
+	ld [$d257], a
+	inc hl
+	inc hl
+	inc hl
+	inc de
+	inc de
+	inc de
+	ld c, [hl]
+	dec hl
+	ld a, [$d257]
+	sub c
+	ld b, [hl]
+	dec hl
+	ld a, [CurDamage]
+	sbc b
+	jr nc, .asm_359c2
+
+	ld a, [CurDamage]
+	ld b, a
+	ld a, [$d257]
+	ld c, a
+.asm_359c2
+	ld a, c
+	ld [hld], a
+	ld [$d1ee], a
+	ld a, b
+	ld [hli], a
+	ld [$d1ef], a
+	ret
+
+.asm_359cd
+	jp $7366
+; 359d0
+
+
+BattleCommand43: ; 359d0
+	ld a, BATTLE_VARS_STATUS
+	call CleanGetBattleVarPair
+	and $7
+	ret nz
+	call ResetDamage
+	ld a, $1
+	ld [AttackMissed], a
+	call Function0x37354
+	jp EndMoveEffect
+; 359e6
+
+
+BattleCommand44: ; 359e6
+	ld a, [AttackMissed]
+	and a
+	jr nz, .asm_35a50 ; 359ea $64
+	ld hl, BattleMonType1
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_359f7 ; 359f2 $3
+	ld hl, EnemyMonType1
+.asm_359f7
+	ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
+	call CleanGetBattleVarPair
+	and a
+	jr z, .asm_35a50 ; 359fd $51
+	push hl
+	dec a
+	ld hl, $5afe
+	call $7ea1
+	ld d, a
+	pop hl
+	cp $13
+	jr z, .asm_35a50 ; 35a0b $43
+	call $7e01
+	call $4ffd
+.asm_35a13
+	call FarBattleRNG
+	and $1f
+	cp $a
+	jr c, .asm_35a24 ; 35a1a $8
+	cp $14
+	jr c, .asm_35a13 ; 35a1e $f3
+	cp $1c
+	jr nc, .asm_35a13 ; 35a22 $ef
+.asm_35a24
+	ld [hli], a
+	ld [hld], a
+	push hl
+	ld a, BATTLE_VARS_MOVE_TYPE
+	call GetBattleVarPair
+	push af
+	push hl
+	ld a, d
+	ld [hl], a
+	call Function0x347c8
+	pop hl
+	pop af
+	ld [hl], a
+	pop hl
+	ld a, [$d265]
+	cp $a
+	jr nc, .asm_35a13 ; 35a3c $d5
+	call $4ffd
+	ld a, [hl]
+	ld [$d265], a
+	ld a, $29
+	call $2d83
+	ld hl, $5452
+	jp FarBattleTextBox
+.asm_35a50
+	jp Function0x37354
+; 35a53
+
+
+BattleCommand45: ; 35a53
+	call CheckSubstituteOpp
+	jr nz, .asm_35a6e ; 35a56 $16
+	ld a, [AttackMissed]
+	and a
+	jr nz, .asm_35a6e ; 35a5c $10
+	ld a, BATTLE_VARS_SUBSTATUS5_OPP
+	call GetBattleVarPair
+	set 5, [hl]
+	call $7e01
+	ld hl, $5136
+	jp FarBattleTextBox
+.asm_35a6e
+	call $7e77
+	jp PrintDidntAffect
+; 35a74
+
+
+BattleCommand46: ; 35a74
+	call Function0x372d8
+	ld a, [InLinkBattle]
+	and a
+	jr z, .asm_35a83 ; 35a7b $6
+	call $7e77
+	jp PrintNothingHappened
+.asm_35a83
+	call CheckSubstituteOpp
+	jp nz, $5b10
+	ld a, BATTLE_VARS_SUBSTATUS5_OPP
+	call GetBattleVarPair
+	bit 3, [hl]
+	jp nz, $5b10
+	ld a, $2
+	call $3945
+	ld d, h
+	ld e, l
+	ld hl, BattleMonMoves
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_35aa5 ; 35aa0 $3
+	ld hl, EnemyMonMoves
+.asm_35aa5
+	ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
+	call CleanGetBattleVarPair
+	ld [$d265], a
+	ld b, a
+	and a
+	jr z, .asm_35b10 ; 35aaf $5f
+	cp $a5
+	jr z, .asm_35b10 ; 35ab3 $5b
+	ld c, $4
+.asm_35ab7
+	ld a, [hli]
+	cp b
+	jr z, .asm_35b10 ; 35ab9 $55
+	dec c
+	jr nz, .asm_35ab7 ; 35abc $f9
+	dec hl
+	ld c, $4
+.asm_35ac1
+	dec c
+	ld a, [hld]
+	cp $a6
+	jr nz, .asm_35ac1 ; 35ac5 $fa
+	inc hl
+	ld a, b
+	ld [hl], a
+	push bc
+	push hl
+	dec a
+	ld hl, $5b00
+	call $7ea1
+	pop hl
+	ld bc, $0006
+	add hl, bc
+	ld [hl], a
+	pop bc
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_35af6 ; 35add $17
+	ld a, [IsInBattle]
+	dec a
+	jr nz, .asm_35af6 ; 35ae3 $11
+	ld a, [hl]
+	push bc
+	ld hl, $c739
+	ld b, $0
+	add hl, bc
+	ld [hl], a
+	ld hl, $c735
+	add hl, bc
+	pop bc
+	ld [hl], b
+	jr .asm_35b04 ; 35af4 $e
+.asm_35af6
+	ld a, [hl]
+	push af
+	ld l, c
+	ld h, $0
+	add hl, de
+	ld a, b
+	ld [hl], a
+	pop af
+	ld de, $0015
+	add hl, de
+	ld [hl], a
+.asm_35b04
+	call $34f8
+	call $7e01
+	ld hl, $5143
+	jp FarBattleTextBox
+.asm_35b10
+	call $7e77
+	jp PrintDidntAffect
+; 35b16
+
+
+BattleCommand47: ; 35b16
+	call $7e01
+	ld a, BATTLE_VARS_STATUS_OPP
+	call GetBattleVarPair
+	call Function0x360dd
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call GetBattleVarPair
+	ld a, [hl]
+	push hl
+	push af
+	ld a, $a
+	ld [hl], a
+	call BattleCommand1c
+	pop af
+	pop hl
+	ld [hl], a
+	ret
+; 35b33
+
+
+BattleCommand48: ; 35b33
+	call Function0x372d8
+	ld a, [AttackMissed]
+	and a
+	jr nz, .asm_35ba3 ; 35b3a $67
+	ld a, [hBattleTurn]
+	and a
+	ld hl, BattleMonMove2
+	ld a, [DisabledMove]
+	ld d, a
+	jr z, .asm_35b4f ; 35b46 $7
+	ld hl, EnemyMonMove2
+	ld a, [EnemyEncoredMove]
+	ld d, a
+.asm_35b4f
+	ld a, BATTLE_VARS_STATUS
+	call CleanGetBattleVarPair
+	and $7
+	jr z, .asm_35ba3 ; 35b56 $4b
+	ld a, [hl]
+	and a
+	jr z, .asm_35ba3 ; 35b5a $47
+	call .asm_35ba9
+	jr c, .asm_35ba3 ; 35b5f $42
+	dec hl
+.asm_35b62
+	push hl
+	call FarBattleRNG
+	and $3
+	ld c, a
+	ld b, $0
+	add hl, bc
+	ld a, [hl]
+	pop hl
+	and a
+	jr z, .asm_35b62 ; 35b6f $f1
+	ld e, a
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call CleanGetBattleVarPair
+	cp e
+	jr z, .asm_35b62 ; 35b78 $e8
+	ld a, e
+	cp d
+	jr z, .asm_35b62 ; 35b7c $e4
+	call .asm_35bdf
+	jr z, .asm_35b62 ; 35b81 $df
+	ld a, BATTLE_VARS_MOVE
+	call GetBattleVarPair
+	ld a, e
+	ld [hl], a
+	call Function0x34548
+	jr nz, .asm_35b9a ; 35b8d $b
+	ld a, [$c689]
+	push af
+	call BattleCommand0a
+	pop af
+	ld [$c689], a
+.asm_35b9a
+	call $7e36
+	call UpdateMoveData
+	jp ResetTurn
+.asm_35ba3
+	call $7e77
+	jp $7349
+
+.asm_35ba9
+	push hl
+	push de
+	push bc
+	call .asm_35bb3
+	pop bc
+	pop de
+	pop hl
+	ret
+
+.asm_35bb3
+	ld a, [$ffe4]
+	and a
+	ld a, [DisabledMove]
+	jr z, .asm_35bbe
+
+	ld a, [EnemyEncoredMove]
+.asm_35bbe
+	ld b, a
+	ld a, $10
+	call CleanGetBattleVarPair
+	ld c, a
+	dec hl
+	ld d, $4
+.asm_35bc8
+	ld a, [hl]
+	and a
+	jr z, .asm_35bdb
+
+	cp c
+	jr z, .asm_35bd7
+
+	cp b
+	jr z, .asm_35bd7
+
+	call .asm_35bdf
+	jr nz, .asm_35bdd
+
+.asm_35bd7
+	inc hl
+	dec d
+	jr nz, .asm_35bc8
+
+.asm_35bdb
+	scf
+	ret
+
+.asm_35bdd
+	and a
+	ret
+
+.asm_35bdf
+	push hl
+	push de
+	push bc
+
+	ld b, a
+	ld hl, $45ec
+	ld a, $f
+	rst $8
+	ld a, b
+
+	pop bc
+	pop de
+	pop hl
+
+	cp $91
+	ret z
+
+	cp $27
+	ret z
+
+	cp $4b
+	ret z
+
+	cp $97
+	ret z
+
+	cp $9b
+	ret z
+
+	cp $1a
+	ret
+; 35bff
+
+
+BattleCommand49: ; 35bff
+	ld a, BATTLE_VARS_SUBSTATUS5
+	call GetBattleVarPair
+	set 6, [hl]
+	call $7e01
+	ld hl, $5156
+	jp FarBattleTextBox
+; 35c0f
+
+
+BattleCommand4a: ; 35c0f
+	ld a, [AttackMissed]
+	and a
+	jp nz, $5c91
+	ld bc, $0030
+	ld hl, EnemyMonMoves
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_35c24 ; 35c1f $3
+	ld hl, BattleMonMoves
+.asm_35c24
+	ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
+	call CleanGetBattleVarPair
+	and a
+	jr z, .asm_35c91 ; 35c2a $65
+	cp $a5
+	jr z, .asm_35c91 ; 35c2e $61
+	ld b, a
+	ld c, $ff
+.asm_35c33
+	inc c
+	ld a, [hli]
+	cp b
+	jr nz, .asm_35c33 ; 35c36 $fb
+	ld [$d265], a
+	dec hl
+	ld b, $0
+	push bc
+	ld c, $6
+	add hl, bc
+	pop bc
+	ld a, [hl]
+	and $3f
+	jr z, .asm_35c91 ; 35c46 $49
+	push bc
+	call $34f8
+	call FarBattleRNG
+	and $3
+	inc a
+	inc a
+	ld b, a
+	ld a, [hl]
+	and $3f
+	cp b
+	jr nc, .asm_35c5b ; 35c58 $1
+	ld b, a
+.asm_35c5b
+	ld a, [hl]
+	sub b
+	ld [hl], a
+	push af
+	ld a, $17
+	call $3951
+	ld d, b
+	pop af
+	pop bc
+	add hl, bc
+	ld e, a
+	ld a, BATTLE_VARS_SUBSTATUS5_OPP
+	call CleanGetBattleVarPair
+	bit 3, a
+	jr nz, .asm_35c82 ; 35c70 $10
+	ld a, [hBattleTurn]
+	and a
+	jr nz, .asm_35c81 ; 35c75 $a
+	ld a, [IsInBattle]
+	dec a
+	jr nz, .asm_35c81 ; 35c7b $4
+	ld hl, $c739
+	add hl, bc
+.asm_35c81
+	ld [hl], e
+.asm_35c82
+	push de
+	call $7e01
+	pop de
+	ld a, d
+	ld [$d265], a
+	ld hl, $517f
+	jp FarBattleTextBox
+.asm_35c91
+	jp PrintDidntAffect2
+; 35c94
+
+
+BattleCommand4b: ; 35c94
+	ld hl, EnemyMonHPHi
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_35c9f ; 35c9a $3
+	ld hl, BattleMonHP
+.asm_35c9f
+	ld de, CurDamage
+	ld c, $2
+	push hl
+	push de
+	call StringCmp
+	pop de
+	pop hl
+	jr c, .asm_35cc7 ; 35cab $1a
+	ld a, [hli]
+	ld [de], a
+	inc de
+	ld a, [hl]
+	dec a
+	ld [de], a
+	inc a
+	jr nz, .asm_35cba ; 35cb4 $4
+	dec de
+	ld a, [de]
+	dec a
+	ld [de], a
+.asm_35cba
+	ld a, [CriticalHit]
+	cp $2
+	jr nz, .asm_35cc5 ; 35cbf $4
+	xor a
+	ld [CriticalHit], a
+.asm_35cc5
+	scf
+	ret
+.asm_35cc7
+	and a
+	ret
+; 35cc9
+
+
+BattleCommand4c: ; 35cc9
+	ld a, BATTLE_VARS_SUBSTATUS1
+	call GetBattleVarPair
+	res 0, [hl]
+	ld de, PartyMon1Status
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_35cdb ; 35cd6 $3
+	ld de, OTPartyMon1Status
+.asm_35cdb
+	ld a, BATTLE_VARS_STATUS
+	call GetBattleVarPair
+	xor a
+	ld [hl], a
+	ld h, d
+	ld l, e
+	ld bc, $0030
+	ld d, $6
+.asm_35ce9
+	ld [hl], a
+	add hl, bc
+	dec d
+	jr nz, .asm_35ce9 ; 35cec $fb
+	call $7e01
+	ld hl, $51a0
+	call FarBattleTextBox
+	ld a, [hBattleTurn]
+	and a
+	jp z, Function0x365d7
+	jp Function0x365fd
+; 35d00
+
+
+FarPlayBattleAnimation: ; 35d00
+; play animation de
+
+; battle animations disabled?
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call CleanGetBattleVarPair
+	and $60 ; bit 6 | 5
+	ret nz
+
+	; fallthrough
+; 35d08
+
+PlayFXAnimID: ; 35d08
+	ld a, e
+	ld [FXAnimIDLo], a
+	ld a, d
+	ld [FXAnimIDHi], a
+
+	ld c, 3
+	call DelayFrames
+
+	ld hl, $40d6
+	ld a, $33
+	rst FarCall ; callab SafePlayBattleAnimation
+
+	ret
+; 35d1c
+
+
+Function0x35d1c: ; 35d1c
+	ld hl, CurDamage
+	ld a, [hli]
+	ld b, a
+	ld a, [hl]
+	or b
+	jr z, .asm_35d7b
+
+	ld a, c
+	and a
+	jr nz, .asm_35d31
+
+	ld a, [EnemySubStatus4]
+	bit 4, a
+	jp nz, Function0x35de0
+.asm_35d31
+	ld a, [hld]
+	ld b, a
+	ld a, [EnemyMonHPLo]
+	ld [$d1ec], a
+	sub b
+	ld [EnemyMonHPLo], a
+	ld a, [hl]
+	ld b, a
+	ld a, [EnemyMonHPHi]
+	ld [$d1ed], a
+	sbc b
+	ld [EnemyMonHPHi], a
+	jr nc, .asm_35d59
+
+	ld a, [$d1ed]
+	ld [hli], a
+	ld a, [$d1ec]
+	ld [hl], a
+	xor a
+	ld hl, EnemyMonHPHi
+	ld [hli], a
+	ld [hl], a
+.asm_35d59
+	ld hl, EnemyMonMaxHPHi
+	ld a, [hli]
+	ld [$d1eb], a
+	ld a, [hl]
+	ld [$d1ea], a
+	ld hl, EnemyMonHPHi
+	ld a, [hli]
+	ld [$d1ef], a
+	ld a, [hl]
+	ld [$d1ee], a
+	ld hl, $c4ca
+	xor a
+	ld [$d10a], a
+	ld a, $b
+	call Predef
+.asm_35d7b
+	jp $39c9
+; 35d7e
+
+
+Function0x35d7e: ; 35d7e
+	ld hl, CurDamage
+	ld a, [hli]
+	ld b, a
+	ld a, [hl]
+	or b
+	jr z, .asm_35ddd
+
+	ld a, c
+	and a
+	jr nz, .asm_35d93
+
+	ld a, [PlayerSubStatus4]
+	bit 4, a
+	jp nz, Function0x35de0
+.asm_35d93
+	ld a, [hld]
+	ld b, a
+	ld a, [$c63d]
+	ld [$d1ec], a
+	sub b
+	ld [$c63d], a
+	ld [$d1ee], a
+	ld b, [hl]
+	ld a, [BattleMonHP]
+	ld [$d1ed], a
+	sbc b
+	ld [BattleMonHP], a
+	ld [$d1ef], a
+	jr nc, .asm_35dc5
+
+	ld a, [$d1ed]
+	ld [hli], a
+	ld a, [$d1ec]
+	ld [hl], a
+	xor a
+	ld hl, BattleMonHP
+	ld [hli], a
+	ld [hl], a
+	ld hl, $d1ee
+	ld [hli], a
+	ld [hl], a
+.asm_35dc5
+	ld hl, BattleMonMaxHP
+	ld a, [hli]
+	ld [$d1eb], a
+	ld a, [hl]
+	ld [$d1ea], a
+	ld hl, $c55e
+	ld a, $1
+	ld [$d10a], a
+	ld a, $b
+	call Predef
+.asm_35ddd
+	jp $39c9
+; 35de0
+
+
+Function0x35de0: ; 35de0
+	ld hl, $53ad
+	call FarBattleTextBox
+	ld de, $c6e0
+	ld a, [$ffe4]
+	and a
+	jr z, .asm_35df1
+
+	ld de, $c6df
+.asm_35df1
+	ld hl, CurDamage
+	ld a, [hli]
+	and a
+	jr nz, .asm_35dff
+
+	ld a, [de]
+	sub [hl]
+	ld [de], a
+	jr z, .asm_35dff
+
+	jr nc, .asm_35e3d
+
+.asm_35dff
+	ld a, $8
+	call GetBattleVarPair
+	res 4, [hl]
+	ld hl, $53d0
+	call FarBattleTextBox
+	call $4ffd
+	call $65c3
+	ld a, $2
+	call CleanGetBattleVarPair
+	and $60
+	call z, $7ec7
+	call $4ffd
+	ld a, $d
+	call GetBattleVarPair
+	cp $1d
+	jr z, .asm_35e3a
+
+	cp $2c
+	jr z, .asm_35e3a
+
+	cp $4d
+	jr z, .asm_35e3a
+
+	cp $68
+	jr z, .asm_35e3a
+
+	cp $9a
+	jr z, .asm_35e3a
+
+	xor a
+	ld [hl], a
+.asm_35e3a
+	call $39c9
+.asm_35e3d
+	jp ResetDamage
+; 35e40
+
+
+UpdateMoveData: ; 35e40
+
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call GetBattleVarPair
+	ld d, h
+	ld e, l
+
+	ld a, BATTLE_VARS_MOVE
+	call CleanGetBattleVarPair
+	ld [$cf60], a ; not CurSpecies
+	ld [$d265], a
+
+	dec a
+	call GetMoveData
+	call GetMoveName
+	jp CopyName1
+; 35e5c
+
+
+BattleCommand14: ; 35e5c
+; sleeptarget
+	call GetOpponentItem
+	ld a, b
+	cp $17
+	jr nz, .asm_35e70 ; 35e62 $c
+	ld a, [hl]
+	ld [$d265], a
+	call $3468
+	ld hl, $55a9
+	jr .asm_35ec6 ; 35e6e $56
+.asm_35e70
+	ld a, BATTLE_VARS_STATUS_OPP
+	call GetBattleVarPair
+	ld d, h
+	ld e, l
+	ld a, [de]
+	and $7
+	ld hl, $51c1
+	jr nz, .asm_35ec6 ; 35e7d $47
+	ld a, [AttackMissed]
+	and a
+	jp nz, PrintDidntAffect2
+	ld hl, $550c
+	call Function0x35ece
+	jr c, .asm_35ec6 ; 35e8c $38
+	ld a, [de]
+	and a
+	jr nz, .asm_35ec6 ; 35e90 $34
+	call CheckSubstituteOpp
+	jr nz, .asm_35ec6 ; 35e95 $2f
+	call $7e01
+	ld b, $7
+	ld a, [$cfc0]
+	and a
+	jr z, .asm_35ea4 ; 35ea0 $2
+	ld b, $3
+.asm_35ea4
+	call FarBattleRNG
+	and b
+	jr z, .asm_35ea4 ; 35ea8 $fa
+	cp $7
+	jr z, .asm_35ea4 ; 35eac $f6
+	inc a
+	ld [de], a
+	call $398e
+	call $39c9
+	ld hl, $51b1
+	call FarBattleTextBox
+	ld a, $f
+	ld hl, $5de9
+	rst FarCall
+	jp z, $4216
+	ret
+.asm_35ec6
+	push hl
+	call $7e77
+	pop hl
+	jp FarBattleTextBox
+; 35ece
+
+
+Function0x35ece: ; 35ece
+; Enemy turn
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_35eec
+
+; Not in link battle
+	ld a, [InLinkBattle]
+	and a
+	jr nz, .asm_35eec
+
+
+	ld a, [$cfc0]
+	and a
+	jr nz, .asm_35eec
+
+; Not locked-on by the enemy
+	ld a, [PlayerSubStatus5]
+	bit 5, a
+	jr nz, .asm_35eec
+
+	call FarBattleRNG
+	cp $40
+	ret c
+
+.asm_35eec
+	xor a
+	ret
+; 35eee
+
+
+BattleCommand13: ; 35eee
+	call CheckSubstituteOpp
+	ret nz
+	ld a, BATTLE_VARS_STATUS_OPP
+	call GetBattleVarPair
+	and a
+	ret nz
+	ld a, [TypeModifier]
+	and $7f
+	ret z
+	call Function0x35fe1
+	ret z
+	call GetOpponentItem
+	ld a, b
+	cp $14
+	ret z
+	ld a, [$c70d]
+	and a
+	ret nz
+	call Function0x37962
+	ret nz
+	call Function0x35ff5
+	ld de, $0106
+	call $7e54
+	call $39c9
+	ld hl, $51d5
+	call FarBattleTextBox
+	ld a, $f
+	ld hl, $5de9
+	rst FarCall
+	ret
+; 35f2c
+
+
+BattleCommand2f: ; 35f2c
+	ld hl, $5071
+	ld a, [TypeModifier]
+	and $7f
+	jp z, $5fb8
+	call Function0x35fe1
+	jp z, $5fb8
+	ld a, BATTLE_VARS_STATUS_OPP
+	call CleanGetBattleVarPair
+	ld b, a
+	ld hl, $51fa
+	and $8
+	jp nz, $5fb8
+	call GetOpponentItem
+	ld a, b
+	cp $14
+	jr nz, .asm_35f5f ; 35f51 $c
+	ld a, [hl]
+	ld [$d265], a
+	call $3468
+	ld hl, $55a9
+	jr .asm_35fb8 ; 35f5d $59
+.asm_35f5f
+	ld hl, $550c
+	ld a, BATTLE_VARS_STATUS_OPP
+	call CleanGetBattleVarPair
+	and a
+	jr nz, .asm_35fb8 ; 35f68 $4e
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_35f89 ; 35f6d $1a
+	ld a, [InLinkBattle]
+	and a
+	jr nz, .asm_35f89 ; 35f73 $14
+	ld a, [$cfc0]
+	and a
+	jr nz, .asm_35f89 ; 35f79 $e
+	ld a, [PlayerSubStatus5]
+	bit 5, a
+	jr nz, .asm_35f89 ; 35f80 $7
+	call FarBattleRNG
+	cp $40
+	jr c, .asm_35fb8 ; 35f87 $2f
+.asm_35f89
+	call CheckSubstituteOpp
+	jr nz, .asm_35fb8 ; 35f8c $2a
+	ld a, [AttackMissed]
+	and a
+	jr nz, .asm_35fb8 ; 35f92 $24
+	call Function0x35fc9
+	jr z, .asm_35fa4 ; 35f97 $b
+	call Function0x35fc0
+	ld hl, $51d5
+	call FarBattleTextBox
+	jr .asm_35fb1 ; 35fa2 $d
+.asm_35fa4
+	set 0, [hl]
+	xor a
+	ld [de], a
+	call Function0x35fc0
+	ld hl, $51e6
+	call FarBattleTextBox
+.asm_35fb1
+	ld a, $f
+	ld hl, $5de9
+	rst FarCall
+	ret
+.asm_35fb8
+	push hl
+	call $7e77
+	pop hl
+	jp FarBattleTextBox
+; 35fc0
+
+
+Function0x35fc0: ; 35fc0
+	call $7e01
+	call Function0x35ff5
+	jp $39c9
+; 35fc9
+
+
+Function0x35fc9: ; 35fc9
+	ld a, $9
+	call $39e7
+	ld a, [hBattleTurn]
+	and a
+	ld de, $c67c
+	jr z, .asm_35fd9 ; 0x35fd4 $3
+	ld de, $c674
+.asm_35fd9
+	ld a, $d
+	call CleanGetBattleVarPair
+	cp $21
+	ret
+; 35fe1
+
+
+Function0x35fe1: ; 35fe1
+	ld de, EnemyMonType1
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_35fec ; 0x35fe7 $3
+	ld de, BattleMonType1
+.asm_35fec
+	ld a, [de]
+	inc de
+	cp $3
+	ret z
+	ld a, [de]
+	cp $3
+	ret
+; 35ff5
+
+
+Function0x35ff5: ; 35ff5
+	ld a, $b
+	call $39e7
+	set 3, [hl]
+	jp $398e
+; 35fff
+
+
+BattleCommand15: ; 35fff
+	call Function0x36011
+	ld hl, $5210
+	jp FarBattleTextBox
+; 36008
+
+
+BattleCommand16: ; 36008
+	call Function0x36011
+	ld hl, $5227
+	jp FarBattleTextBox
+; 36011
+
+
+Function0x36011: ; 36011
+	ld hl, CurDamage
+	ld a, [hli]
+	srl a
+	ld [$ffb3], a
+	ld b, a
+	ld a, [hl]
+	rr a
+	ld [$ffb4], a
+	or b
+	jr nz, .asm_36026 ; 0x36020 $4
+	ld a, $1
+	ld [$ffb4], a
+.asm_36026
+	ld hl, BattleMonHP
+	ld de, BattleMonMaxHP
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_36037 ; 0x3602f $6
+	ld hl, EnemyMonHPHi
+	ld de, EnemyMonMaxHPHi
+.asm_36037
+	ld bc, $d1ed
+	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, [$ffb4]
+	ld b, [hl]
+	add b
+	ld [hld], a
+	ld [$d1ee], a
+	ld a, [$ffb3]
+	ld b, [hl]
+	adc b
+	ld [hli], a
+	ld [$d1ef], a
+	jr c, .asm_36064 ; 0x36056 $c
+	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, .asm_36070 ; 0x36062 $c
+.asm_36064
+	ld a, [de]
+	ld [hld], a
+	ld [$d1ee], a
+	dec de
+	ld a, [de]
+	ld [hli], a
+	ld [$d1ef], a
+	inc de
+.asm_36070
+	ld a, [hBattleTurn]
+	and a
+	ld hl, $c55e
+	ld a, $1
+	jr z, .asm_3607e ; 0x36078 $4
+	ld hl, $c4ca
+	xor a
+.asm_3607e
+	ld [$d10a], a
+	ld a, $b
+	call Predef
+	call $39c9
+	jp $399c
+; 3608c
+
+
+BattleCommand17: ; 3608c
+	xor a
+	ld [$cfca], a
+	call CheckSubstituteOpp
+	ret nz
+	ld a, BATTLE_VARS_STATUS_OPP
+	call GetBattleVarPair
+	and a
+	jp nz, Function0x360dd
+	ld a, [TypeModifier]
+	and $7f
+	ret z
+	call Function0x36e5b
+	ret z
+	call GetOpponentItem
+	ld a, b
+	cp $15
+	ret z
+	ld a, [$c70d]
+	and a
+	ret nz
+	call Function0x37962
+	ret nz
+	ld a, BATTLE_VARS_STATUS_OPP
+	call GetBattleVarPair
+	set 4, [hl]
+	call $398e
+	ld hl, $6c76
+	call $7e73
+	ld de, $0105
+	call $7e54
+	call $39c9
+	ld hl, $523c
+	call FarBattleTextBox
+	ld a, $f
+	ld hl, $5de9
+	rst FarCall
+	ret
+; 360dd
+
+
+Function0x360dd: ; 360dd
+	ld a, [hl]
+	and $20
+	ret z
+	xor a
+	ld [hl], a
+	ld a, [hBattleTurn]
+	and a
+	ld a, [CurOTMon]
+	ld hl, OTPartyMon1Status
+	jr z, .asm_360f4 ; 0x360ec $6
+	ld hl, PartyMon1Status
+	ld a, [CurBattleMon]
+.asm_360f4
+	call GetPartyLocation
+	xor a
+	ld [hl], a
+	call $398e
+	ld hl, $524b
+	jp FarBattleTextBox
+; 36102
+
+
+BattleCommand18: ; 36102
+	xor a
+	ld [$cfca], a
+	call CheckSubstituteOpp
+	ret nz
+	ld a, BATTLE_VARS_STATUS_OPP
+	call GetBattleVarPair
+	and a
+	ret nz
+	ld a, [TypeModifier]
+	and $7f
+	ret z
+	ld a, [Weather]
+	cp $2
+	ret z
+	call Function0x36e5b
+	ret z
+	call GetOpponentItem
+	ld a, b
+	cp $16
+	ret z
+	ld a, [$c70d]
+	and a
+	ret nz
+	call Function0x37962
+	ret nz
+	ld a, BATTLE_VARS_STATUS_OPP
+	call GetBattleVarPair
+	set 5, [hl]
+	call $398e
+	ld de, $0108
+	call $7e54
+	call $39c9
+	ld hl, $525d
+	call FarBattleTextBox
+	ld a, $f
+	ld hl, $5de9
+	rst FarCall
+	ret nz
+	call $4216
+	call EndRechargeOpp
+	ld hl, $c740
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_36162 ; 3615d $3
+	ld hl, $c73f
+.asm_36162
+	ld [hl], $1
+	ret
+; 36165
+
+
+BattleCommand19: ; 36165
+	xor a
+	ld [$cfca], a
+	call CheckSubstituteOpp
+	ret nz
+	ld a, BATTLE_VARS_STATUS_OPP
+	call GetBattleVarPair
+	and a
+	ret nz
+	ld a, [TypeModifier]
+	and $7f
+	ret z
+	call GetOpponentItem
+	ld a, b
+	cp $18
+	ret z
+	ld a, [$c70d]
+	and a
+	ret nz
+	call Function0x37962
+	ret nz
+	ld a, BATTLE_VARS_STATUS_OPP
+	call GetBattleVarPair
+	set 6, [hl]
+	call $398e
+	ld hl, $6c39
+	call $7e73
+	ld de, $0109
+	call $7e54
+	call $39c9
+	call PrintParalyze
+	ld hl, $5de9
+	jp $7e73
+; 361ac
+
+
+BattleCommand70: ; 361ac
+; attackup
+	ld b, $0
+	jr BattleCommand1c
+BattleCommand71: ; 361b0
+; defenseup
+	ld b, $1
+	jr BattleCommand1c
+BattleCommand72: ; 361b4
+; speedup
+	ld b, $2
+	jr BattleCommand1c
+BattleCommand73: ; 361b8
+; specialattackup
+	ld b, $3
+	jr BattleCommand1c
+BattleCommand74: ; 361bc
+; specialdefenseup
+	ld b, $4
+	jr BattleCommand1c
+BattleCommand75: ; 361c0
+; accuracyup
+	ld b, $5
+	jr BattleCommand1c
+BattleCommand76: ; 361c4
+; evasionup
+	ld b, $6
+	jr BattleCommand1c
+BattleCommand77: ; 361c8
+; attackup2
+	ld b, $10
+	jr BattleCommand1c
+BattleCommand78: ; 361cc
+; defenseup2
+	ld b, $11
+	jr BattleCommand1c
+BattleCommand79: ; 361d0
+; speedup2
+	ld b, $12
+	jr BattleCommand1c
+BattleCommand7a: ; 361d4
+; specialattackup2
+	ld b, $13
+	jr BattleCommand1c
+BattleCommand7b: ; 361d8
+; specialdefenseup2
+	ld b, $14
+	jr BattleCommand1c
+BattleCommand7c: ; 361dc
+; accuracyup2
+	ld b, $15
+	jr BattleCommand1c
+BattleCommand7d: ; 361e0
+; evasionup2
+	ld b, $16
+	jr BattleCommand1c
+BattleCommand1c: ; 361e4
+; statup
+	call Function0x361ef
+	ld a, [$c70e]
+	and a
+	ret nz
+	jp Function0x36281
+; 361ef
+
+
+Function0x361ef: ; 361ef
+	ld a, b
+	ld [$c70c], a
+	ld hl, PlayerStatLevels
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_361fe ; 0x361f9 $3
+	ld hl, EnemyStatLevels
+.asm_361fe
+	ld a, [AttackMissed]
+	and a
+	jp nz, Function0x3627b
+	ld a, [$c70d]
+	and a
+	jp nz, Function0x3627b
+	ld a, [$c70c]
+	and $f
+	ld c, a
+	ld b, $0
+	add hl, bc
+	ld b, [hl]
+	inc b
+	ld a, $d
+	cp b
+	jp c, $6270
+	ld a, [$c70c]
+	and $f0
+	jr z, .asm_3622b ; 0x36222 $7
+	inc b
+	ld a, $d
+	cp b
+	jr nc, .asm_3622b ; 0x36228 $1
+	ld b, a
+.asm_3622b
+	ld [hl], b
+	push hl
+	ld a, c
+	cp $5
+	jr nc, .asm_36268 ; 0x36230 $36
+	ld hl, $c641
+	ld de, $c6b6
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_36243 ; 0x3623b $6
+	ld hl, $d21b
+	ld de, $c6c1
+.asm_36243
+	push bc
+	sla c
+	ld b, $0
+	add hl, bc
+	ld a, c
+	add e
+	ld e, a
+	jr nc, .asm_3624f ; 0x3624c $1
+	inc d
+.asm_3624f
+	pop bc
+	ld a, [hld]
+	sub $e7
+	jr nz, .asm_3625b ; 0x36253 $6
+	ld a, [hl]
+	sbc $3
+	jp z, Function0x3626e
+.asm_3625b
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_36265 ; 0x3625e $5
+	call Function0x365fd
+	jr .asm_36268 ; 0x36263 $3
+.asm_36265
+	call Function0x365d7
+.asm_36268
+	pop hl
+	xor a
+	ld [$c70e], a
+	ret
+; 3626e
+
+Function0x3626e: ; 3626e
+	pop hl
+	dec [hl]
+	ld a, $2
+	ld [$c70e], a
+	ld a, $1
+	ld [AttackMissed], a
+	ret
+; 3627b
+
+Function0x3627b: ; 3627b
+	ld a, $1
+	ld [$c70e], a
+	ret
+; 36281
+
+Function0x36281: ; 36281
+	ld bc, $c6fe
+	ld hl, $7447
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_36292 ; 0x3628a $6
+	ld bc, $c6fa
+	ld hl, $7486
+.asm_36292
+	ld a, $c
+	call CleanGetBattleVarPair
+	cp $6b
+	ret nz
+	ld a, $1
+	ld [bc], a
+	call $7ed5
+	ret nc
+	xor a
+	ld [$ffd4], a
+	call $7e73
+	call WaitBGMap
+	jp $7e80
+; 362ad
+
+
+BattleCommand7e: ; 362ad
+; attackdown
+	ld a, $0
+	jr BattleCommand1d
+BattleCommand7f: ; 362b1
+; defensedown
+	ld a, $1
+	jr BattleCommand1d
+BattleCommand80: ; 362b5
+; speeddown
+	ld a, $2
+	jr BattleCommand1d
+BattleCommand81: ; 362b9
+; specialattackdown
+	ld a, $3
+	jr BattleCommand1d
+BattleCommand82: ; 362bd
+; specialdefensedown
+	ld a, $4
+	jr BattleCommand1d
+BattleCommand83: ; 362c1
+; accuracydown
+	ld a, $5
+	jr BattleCommand1d
+BattleCommand84: ; 362c5
+; evasiondown
+	ld a, $6
+	jr BattleCommand1d
+BattleCommand85: ; 362c9
+; attackdown2
+	ld a, $10
+	jr BattleCommand1d
+BattleCommand86: ; 362cd
+; defensedown2
+	ld a, $11
+	jr BattleCommand1d
+BattleCommand87: ; 362d1
+; speeddown2
+	ld a, $12
+	jr BattleCommand1d
+BattleCommand88: ; 362d5
+; specialattackdown2
+	ld a, $13
+	jr BattleCommand1d
+BattleCommand89: ; 362d9
+; specialdefensedown2
+	ld a, $14
+	jr BattleCommand1d
+BattleCommand8a: ; 362dd
+; accuracydown2
+	ld a, $15
+	jr BattleCommand1d
+BattleCommand8b: ; 362e1
+; evasiondown2
+	ld a, $16
+
+BattleCommand1d: ; 362e3
+; statdown
+	ld [$c70c], a
+	call Function0x36391
+	jp nz, Function0x36386
+	ld hl, EnemyStatLevels
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_362f7 ; 362f2 $3
+	ld hl, PlayerStatLevels
+.asm_362f7
+	ld a, [$c70c]
+	and $f
+	ld c, a
+	ld b, $0
+	add hl, bc
+	ld b, [hl]
+	dec b
+	jp z, $6372
+	ld a, [$c70c]
+	and $f0
+	jr z, .asm_36310 ; 3630a $4
+	dec b
+	jr nz, .asm_36310 ; 3630d $1
+	inc b
+.asm_36310
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_36338 ; 36313 $23
+	ld a, [InLinkBattle]
+	and a
+	jr nz, .asm_36338 ; 36319 $1d
+	ld a, [$cfc0]
+	and a
+	jr nz, .asm_36338 ; 3631f $17
+	ld a, [PlayerSubStatus5]
+	bit 5, a
+	jr nz, .asm_36338 ; 36326 $10
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call CleanGetBattleVarPair
+	cp $49
+	jr z, .asm_36338 ; 3632f $7
+	call FarBattleRNG
+	cp $40
+	jr c, .asm_3637d ; 36336 $45
+.asm_36338
+	call CheckSubstituteOpp
+	jr nz, .asm_3637d ; 3633b $40
+	ld a, [AttackMissed]
+	and a
+	jr nz, .asm_3637d ; 36341 $3a
+	ld a, [$c70d]
+	and a
+	jr nz, .asm_3637d ; 36347 $34
+	call CheckHiddenOpponent
+	jr nz, .asm_3637d ; 3634c $2f
+	ld [hl], b
+	ld a, c
+	cp $5
+	jr nc, .asm_3636c ; 36352 $18
+	push hl
+	ld hl, $d21b
+	ld de, $c6c1
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_36366 ; 3635e $6
+	ld hl, $c641
+	ld de, $c6b6
+.asm_36366
+	call Function0x3641a
+	pop hl
+	jr z, .asm_36371 ; 3636a $5
+.asm_3636c
+	xor a
+	ld [$c70e], a
+	ret
+.asm_36371
+	inc [hl]
+	ld a, $3
+	ld [$c70e], a
+	ld a, $1
+	ld [AttackMissed], a
+	ret
+.asm_3637d
+	ld a, $1
+	ld [$c70e], a
+	ld [AttackMissed], a
+	ret
+; 36386
+
+
+Function0x36386: ; 36386
+	ld a, $2
+	ld [$c70e], a
+	ld a, $1
+	ld [AttackMissed], a
+	ret
+; 36391
+
+
+Function0x36391: ; 36391
+	ld a, $d
+	call CleanGetBattleVarPair
+	cp $12
+	jr c, .asm_363ae ; 0x36398 $14
+	cp $19
+	jr c, .asm_363b0 ; 0x3639c $12
+	cp $3a
+	jr c, .asm_363ae ; 0x363a0 $c
+	cp $41
+	jr c, .asm_363b0 ; 0x363a4 $a
+	cp $44
+	jr c, .asm_363ae ; 0x363a8 $4
+	cp $4b
+	jr c, .asm_363b0 ; 0x363ac $2
+.asm_363ae
+	xor a
+	ret
+.asm_363b0
+	ld a, $8
+	call CleanGetBattleVarPair
+	bit 1, a
+	ret
+; 363b8
+
+
+BattleCommand8c: ; 363b8
+	ld a, [$c70e]
+	and a
+	ret nz
+	ld a, [$c70c]
+	and $f
+	ld b, a
+	inc b
+	call $648f
+	ld hl, .stat
+	jp BattleTextBox
+
+.stat
+	TX_FAR UnknownText_0x1c0cc6
+	start_asm
+
+	ld hl, .up
+	ld a, [$c70c]
+	and $f0
+	ret z
+	ld hl, .wayup
+	ret
+
+.wayup
+	TX_FAR UnknownText_0x1c0cd0
+	db "@"
+
+.up
+	TX_FAR UnknownText_0x1c0ce0
+	db "@"
+
+; 363e9
+
+
+BattleCommand8d: ; 363e9
+	ld a, [$c70e]
+	and a
+	ret nz
+	ld a, [$c70c]
+	and $f
+	ld b, a
+	inc b
+	call $648f
+	ld hl, .stat
+	jp BattleTextBox
+
+.stat
+	TX_FAR UnknownText_0x1c0ceb
+	start_asm
+
+	ld hl, .fell
+	ld a, [$c70c]
+	and $f0
+	ret z
+	ld hl, .sharplyfell
+	ret
+
+.sharplyfell
+	TX_FAR UnknownText_0x1c0cf5
+	db "@"
+.fell
+	TX_FAR UnknownText_0x1c0d06
+	db "@"
+
+; 3641a
+
+
+Function0x3641a: ; 3641a
+	push bc
+	sla c
+	ld b, $0
+	add hl, bc
+	ld a, c
+	add e
+	ld e, a
+	jr nc, .asm_36426 ; 0x36423 $1
+	inc d
+.asm_36426
+	pop bc
+	ld a, [hld]
+	sub $1
+	jr nz, .asm_3642f ; 0x3642a $3
+	ld a, [hl]
+	and a
+	ret z
+.asm_3642f
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_3643f ; 0x36432 $b
+	call $4ffd
+	call Function0x365d7
+	call $4ffd
+	jr .asm_36448 ; 0x3643d $9
+.asm_3643f
+	call $4ffd
+	call Function0x365fd
+	call $4ffd
+.asm_36448
+	ld a, $1
+	and a
+	ret
+; 3644c
+
+
+BattleCommand8e: ; 3644c
+; applystatuser
+	ld a, [$c70e]
+	and a
+	ret z
+	push af
+	call $7e80
+	pop af
+	dec a
+	jp z, $7349
+	ld a, [$c70c]
+	and $f
+	ld b, a
+	inc b
+	call $648f
+	ld hl, $5272
+	jp FarBattleTextBox
+; 3646a
+
+
+BattleCommand8f: ; 3646a
+; applystattarget
+	ld a, [$c70e]
+	and a
+	ret z
+	push af
+	call $7e80
+	pop af
+	dec a
+	jp z, $7349
+	dec a
+	ld hl, $5321
+	jp z, FarBattleTextBox
+	ld a, [$c70c]
+	and $f
+	ld b, a
+	inc b
+	call $648f
+	ld hl, $528f
+	jp FarBattleTextBox
+; 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
+
+
+Table0x364e6: ; 364e6
+	dw $6419
+	dw $641c
+	dw $6421
+	dw $6428
+	dw $6432
+	dw $6442
+; 364f2
+
+
+StatLevelMulipliers: ; 364f2
+	db  1,  1 ; 1.0x
+	db 15, 10 ; 1.5x
+	db  2,  1 ; 2.0x
+	db 25, 10 ; 2.5x
+	db  3,  1 ; 3.0x
+	db 35, 10 ; 3.5x
+	db  4,  1 ; 4.0x
+; 36500
+
+
+BattleCommanda4: ; 36500
+	call ResetMiss
+	call BattleCommand70
+	call $63b8
+
+	call ResetMiss
+	call $61b0
+	call $63b8
+
+	call ResetMiss
+	call $61b4
+	call $63b8
+
+	call ResetMiss
+	call $61b8
+	call $63b8
+
+	call ResetMiss
+	call $61bc
+	jp   $63b8
+; 3652d
+
+
+ResetMiss: ; 3652d
+	xor a
+	ld [AttackMissed], a
+	ret
+; 36532
+
+
+Function0x36532: ; 36532
+	ld [$c70c], a
+
+	ld hl, PlayerStatLevels
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_36540
+	ld hl, EnemyStatLevels
+
+.asm_36540
+	ld a, [$c70c]
+	and $f
+	ld c, a
+	ld b, 0
+	add hl, bc
+	ld b, [hl]
+	dec b
+	jr z, .asm_36589
+
+	ld a, [$c70c]
+	and $f0
+	jr z, .asm_36558
+	dec b
+	jr nz, .asm_36558
+	inc b
+
+.asm_36558
+	ld [hl], b
+	ld a, c
+	cp 5
+	jr nc, .asm_36576
+
+	push hl
+	ld hl, $c641
+	ld de, $c6b6
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_36570
+	ld hl, $d21b
+	ld de, $c6c1
+
+.asm_36570
+	call $641a
+	pop hl
+	jr z, .asm_36588
+
+.asm_36576
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_36580
+
+	call Function0x365fd
+
+	jr .asm_36583
+
+.asm_36580
+	call Function0x365d7
+
+.asm_36583
+	xor a
+	ld [$c70e], a
+	ret
+
+.asm_36588
+	inc [hl]
+
+.asm_36589
+	ld a, 2
+	ld [$c70e], a
+	ret
+; 3658f
+
+
+BattleCommandac: ; 3658f
+;
+	call $4ecc
+
+; get bit 4-5
+; ensure result is nonzero
+; (this makes the chance of each result 1/3)
+.loop
+	call FarBattleRNG
+	swap a
+	and %11
+	jr z, .loop
+; jump
+	dec a
+	ld hl, .ptrs
+	rst $28
+	ret
+.ptrs
+	dw $6165
+	dw $6102
+	dw $608c
+; 365a7
+
+
+BattleCommandaf: ; 365a7
+	ld a, BATTLE_VARS_SUBSTATUS2
+	call GetBattleVarPair
+	set 0, [hl]
+	ret
+; 365af
+
+
+BattleCommanda6: ; 365af
+	ld hl, $743d
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_365ba ; 365b5 $3
+	ld hl, $747c
+.asm_365ba
+	xor a
+	ld [$ffd4], a
+	call $7e73
+	jp $31f6
+; 365c3
+
+
+BattleCommanda7: ; 365c3
+	ld hl, $7447
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_365ce ; 365c9 $3
+	ld hl, $7486
+.asm_365ce
+	xor a
+	ld [$ffd4], a
+	call $7e73
+	jp $31f6
+; 365d7
+
+
+Function0x365d7: ; 365d7
+	ld hl, PlayerAtkLevel
+	ld de, $c6b6
+	ld bc, BattleMonAtk
+
+	ld a, $5
+	call Function0x3661d
+
+	ld hl, $6d45
+	call $7e73
+
+	call $4ffd
+
+	ld hl, $6c39
+	call $7e73
+
+	ld hl, $6c76
+	call $7e73
+
+	jp $4ffd
+; 365fd
+
+
+Function0x365fd: ; 365fd
+	ld hl, EnemyAtkLevel
+	ld de, $c6c1
+	ld bc, EnemyMonAtk
+
+	ld a, $5
+	call Function0x3661d
+
+	call $4ffd
+
+	ld hl, $6c39
+	call $7e73
+
+	ld hl, $6c76
+	call $7e73
+
+	jp $4ffd
+; 3661d
+
+
+Function0x3661d: ; 3661d
+.asm_3661d
+	push af
+	ld a, [hli]
+	push hl
+	push bc
+	ld c, a
+	dec c
+	ld b, 0
+	ld hl, Table0x364e6
+	add hl, bc
+	add hl, bc
+	xor a
+	ld [$ffb4], a
+	ld a, [de]
+	ld [$ffb5], a
+	inc de
+	ld a, [de]
+	ld [$ffb6], a
+	inc de
+	ld a, [hli]
+	ld [$ffb7], a
+	call Multiply
+
+	ld a, [hl]
+	ld [$ffb7], a
+	ld b, $4
+	call Divide
+
+	ld a, [$ffb5]
+	ld b, a
+	ld a, [$ffb6]
+	or b
+	jr nz, .asm_36651
+
+	ld a, $1
+	ld [$ffb6], a
+	jr .asm_36662
+
+.asm_36651
+	ld a, [$ffb6]
+	cp $e7
+	ld a, b
+	sbc $3
+	jr c, .asm_36662
+
+	ld a, $e7
+	ld [$ffb6], a
+	ld a, $3
+	ld [$ffb5], a
+.asm_36662
+	pop bc
+	ld a, [$ffb5]
+	ld [bc], a
+	inc bc
+	ld a, [$ffb6]
+	ld [bc], a
+	inc bc
+	pop hl
+	pop af
+	dec a
+	jr nz, .asm_3661d
+
+	ret
+; 36671
+
+
+BattleCommand21: ; 36671
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call CleanGetBattleVarPair
+	bit 0, a
+	ret z
+	ld hl, $c672
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_36684 ; 3667f $3
+	ld hl, $c67a
+.asm_36684
+	dec [hl]
+	jr nz, .asm_366dc ; 36685 $55
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVarPair
+	res 0, [hl]
+	ld hl, $4e84
+	call FarBattleTextBox
+	ld a, BATTLE_VARS_MOVE_POWER
+	call GetBattleVarPair
+	ld a, $1
+	ld [hl], a
+	ld hl, EnemyDamageTaken
+	ld de, $c732
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_366ad ; 366a5 $6
+	ld hl, $c685
+	ld de, $c733
+.asm_366ad
+	ld a, [hld]
+	add a
+	ld b, a
+	ld [CurDamage + 1], a
+	ld a, [hl]
+	rl a
+	ld [CurDamage], a
+	jr nc, .asm_366c3 ; 366b9 $8
+	ld a, $ff
+	ld [CurDamage], a
+	ld [CurDamage + 1], a
+.asm_366c3
+	or b
+	jr nz, .asm_366cb ; 366c4 $5
+	ld a, $1
+	ld [AttackMissed], a
+.asm_366cb
+	xor a
+	ld [hli], a
+	ld [hl], a
+	ld [de], a
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call GetBattleVarPair
+	ld a, $75
+	ld [hl], a
+	ld b, $22
+	jp $7e8c
+.asm_366dc
+	ld hl, $4e6e
+	call FarBattleTextBox
+	jp EndMoveEffect
+; 366e5
+
+
+BattleCommand22: ; 366e5
+	ld de, $c682
+	ld bc, $c672
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_366f6 ; 366ee $6
+	ld de, $c684
+	ld bc, $c67a
+.asm_366f6
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVarPair
+	set 0, [hl]
+	xor a
+	ld [de], a
+	inc de
+	ld [de], a
+	ld [PlayerMoveEffect], a
+	ld [EnemyMoveEffect], a
+	call FarBattleRNG
+	and $1
+	inc a
+	inc a
+	ld [bc], a
+	ld a, $1
+	ld [$c689], a
+	call $7e01
+	jp EndMoveEffect
+; 3671a
+
+
+BattleCommand3e: ; 3671a
+	ld de, $c672
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_36725 ; 36720 $3
+	ld de, $c67a
+.asm_36725
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVarPair
+	bit 1, [hl]
+	ret z
+	ld a, [de]
+	dec a
+	ld [de], a
+	jr nz, .asm_3674c ; 36730 $1a
+	res 1, [hl]
+	call $4ffd
+	call Function0x37962
+	push af
+	call $4ffd
+	pop af
+	jr nz, .asm_3674c ; 3673f $b
+	set 7, [hl]
+	call FarBattleRNG
+	and $1
+	inc a
+	inc a
+	inc de
+	ld [de], a
+.asm_3674c
+	ld b, $3d
+	jp $7e8c
+; 36751
+
+
+BattleCommand3d: ; 36751
+	ld a, BATTLE_VARS_STATUS
+	call CleanGetBattleVarPair
+	and $7
+	ret nz
+	ld de, $c672
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_36764 ; 3675f $3
+	ld de, $c67a
+.asm_36764
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVarPair
+	set 1, [hl]
+	call FarBattleRNG
+	and $1
+	inc a
+	ld [de], a
+	ld a, $1
+	ld [$c73e], a
+	ret
+; 36778
+
+
+BattleCommanda0: ; 36778
+; run
+	ld a, [BattleType]
+	cp $7 ; BATTLE_SHINY
+	jr z, .asm_367b9
+	cp $9 ; ?
+	jr z, .asm_367b9
+	cp $b ; ?
+	jr z, .asm_367b9
+	cp $c ; suicune
+	jr z, .asm_367b9
+	ld a, BATTLE_VARS_SUBSTATUS5_OPP
+	call CleanGetBattleVarPair
+	bit 7, a
+	jr nz, .asm_367b9
+	ld a, [hBattleTurn]
+	and a
+	jr nz, .asm_367bf
+	ld a, [IsInBattle]
+	dec a
+	jr nz, .asm_367b9
+	ld a, [$d143]
+	ld b, a
+	ld a, [BattleMonLevel]
+	cp b
+	jr nc, .asm_367df
+	add b
+	ld c, a
+	inc c
+.asm_367ac
+	call FarBattleRNG
+	cp c
+	jr nc, .asm_367ac ; 367b0 $fa
+	srl b
+	srl b
+	cp b
+	jr nc, .asm_367df ; 367b7 $26
+
+.asm_367b9
+	call $7e77
+	jp $734e
+
+.asm_367bf
+	ld a, [IsInBattle]
+	dec a
+	jr nz, .asm_367b9 ; 367c3 $f4
+	ld a, [BattleMonLevel]
+	ld b, a
+	ld a, [$d143]
+	cp b
+	jr nc, .asm_367df ; 367cd $10
+	add b
+	ld c, a
+	inc c
+.asm_367d2
+	call FarBattleRNG
+	cp c
+	jr nc, .asm_367d2 ; 367d6 $fa
+	srl b
+	srl b
+	cp b
+	jr nc, .asm_367df ; 367dd $0
+.asm_367df
+	call $399c
+	xor a
+	ld [$cfca], a
+	inc a
+	ld [$d232], a
+	ld [$c689], a
+	call Function0x36804
+	call BattleCommand0a
+	call $7e36
+	ld c, $14
+	call DelayFrames
+	call Function0x36804
+	ld hl, $52ac
+	jp FarBattleTextBox
+; 36804
+
+
+Function0x36804: ; 36804
+	ld a, [$d0ee]
+	and $c0
+	or $2
+	ld [$d0ee], a
+	ret
+; 3680f
+
+
+BattleCommand23: ; 3680f
+	ld a, [BattleType]
+	cp $7
+	jp z, $6969
+	cp $9
+	jp z, $6969
+	cp $b
+	jp z, $6969
+	cp $c
+	jp z, $6969
+	ld a, [hBattleTurn]
+	and a
+	jp nz, .asm_368cd
+	ld a, [AttackMissed]
+	and a
+	jr nz, .asm_36852 ; 36830 $20
+	ld a, [IsInBattle]
+	dec a
+	jr nz, .asm_36869 ; 36836 $31
+	ld a, [$d143]
+	ld b, a
+	ld a, [BattleMonLevel]
+	cp b
+	jr nc, .asm_36855 ; 36840 $13
+	add b
+	ld c, a
+	inc c
+.asm_36845
+	call FarBattleRNG
+	cp c
+	jr nc, .asm_36845 ; 36849 $fa
+	srl b
+	srl b
+	cp b
+	jr nc, .asm_36855 ; 36850 $3
+.asm_36852
+	jp $6969
+.asm_36855
+	call $399c
+	xor a
+	ld [$cfca], a
+	inc a
+	ld [$d232], a
+	call Function0x36804
+	ld a, [PlayerMoveAnimation]
+	jp $6975
+.asm_36869
+	call $49f4
+	jr c, .asm_368ca ; 3686c $5c
+	ld a, [$c70f]
+	and a
+	jr z, .asm_368ca ; 36872 $56
+	call $39b0
+	ld a, $1
+	ld [$c689], a
+	call $7e01
+	ld c, $14
+	call DelayFrames
+	ld hl, $c4a1
+	ld bc, $040a
+	call ClearBox
+	ld c, $14
+	call DelayFrames
+	ld a, [OTPartyCount]
+	ld b, a
+	ld a, [CurOTMon]
+	ld c, a
+.asm_3689a
+	call FarBattleRNG
+	and $7
+	cp b
+	jr nc, .asm_3689a ; 368a0 $f8
+	cp c
+	jr z, .asm_3689a ; 368a3 $f5
+	push af
+	push bc
+	ld hl, OTPartyMon1CurHP
+	call GetPartyLocation
+	ld a, [hli]
+	or [hl]
+	pop bc
+	pop de
+	jr z, .asm_3689a ; 368b1 $e7
+	ld a, d
+	inc a
+	ld [$c718], a
+	ld hl, $54c3
+	ld a, $f
+	rst FarCall
+	ld hl, $5544
+	call FarBattleTextBox
+	ld hl, $5c23
+	jp $7e73
+.asm_368ca
+	jp $6969
+
+.asm_368cd
+	ld a, [AttackMissed]
+	and a
+	jr nz, .asm_368f3
+
+	ld a, [IsInBattle]
+	dec a
+	jr nz, .asm_36908
+
+	ld a, [BattleMonLevel]
+	ld b, a
+	ld a, [$d143]
+	cp b
+	jr nc, .asm_368f5
+
+	add b
+	ld c, a
+	inc c
+.asm_368e6
+	call FarBattleRNG
+	cp c
+	jr nc, .asm_368e6
+
+	srl b
+	srl b
+	cp b
+	jr nc, .asm_368f5
+
+.asm_368f3
+	jr .asm_36969
+
+.asm_368f5
+	call $399c
+	xor a
+	ld [$cfca], a
+	inc a
+	ld [$d232], a
+	call $6804
+	ld a, [EnemyMoveAnimation]
+	jr .asm_36975
+
+.asm_36908
+	call Function0x36994
+	jr c, .asm_36969
+
+	ld a, [$c70f]
+	cp $1
+	jr z, .asm_368ca
+
+	call $399c
+	ld a, $1
+	ld [$c689], a
+	call $7e01
+	ld c, $14
+	call DelayFrames
+	ld hl, $c535
+	ld bc, $050b
+	call $0fb6
+	ld c, $14
+	call DelayFrames
+	ld a, [PartyCount]
+	ld b, a
+	ld a, [CurBattleMon]
+	ld c, a
+.asm_3693a
+	call FarBattleRNG
+	and $7
+	cp b
+	jr nc, .asm_3693a
+
+	cp c
+	jr z, .asm_3693a
+
+	push af
+	push bc
+	ld hl, PartyMon1CurHP
+	call GetPartyLocation
+	ld a, [hli]
+	or [hl]
+	pop bc
+	pop de
+	jr z, .asm_3693a
+
+	ld a, d
+	ld [CurPartyMon], a
+	ld hl, $5b32
+	call $7e73
+	ld hl, $5544
+	call FarBattleTextBox
+	ld hl, $5c23
+	jp $7e73
+.asm_36969
+	call $4eee
+	call $7e80
+	call $5004
+	jp $734e
+.asm_36975
+	push af
+	call $6804
+	ld a, $1
+	ld [$c689], a
+	call $7e01
+	ld c, $14
+	call DelayFrames
+	pop af
+	ld hl, $52c1
+	cp $2e
+	jr z, .asm_36991
+
+	ld hl, $52d2
+.asm_36991
+	jp FarBattleTextBox
+; 36994
+
+
+Function0x36994: ; 36994
+	ld a, [PartyCount]
+	ld d, a
+	ld e, 0
+	ld bc, $30
+.asm_3699d
+	ld a, [CurBattleMon]
+	cp e
+	jr z, .asm_369ae
+
+	ld a, e
+	ld hl, PartyMon1CurHP
+	call AddNTimes
+	ld a, [hli]
+	or [hl]
+	jr nz, .asm_369b4
+
+.asm_369ae
+	inc e
+	dec d
+	jr nz, .asm_3699d
+
+	scf
+	ret
+
+.asm_369b4
+	and a
+	ret
+; 369b6
+
+
+BattleCommand24: ; 369b6
+	ld de, $c672
+	ld bc, $c682
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_369c7 ; 369bf $6
+	ld de, $c67a
+	ld bc, $c684
+.asm_369c7
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVarPair
+	bit 2, [hl]
+	jp nz, $6a43
+	set 2, [hl]
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call GetBattleVarPair
+	ld a, [hl]
+	cp $4d
+	jr z, .asm_36a3f ; 369db $62
+	cp $2c
+	ld a, $1
+	jr z, .asm_36a3a ; 369e1 $57
+	ld a, [hl]
+	cp $9a
+	jr z, .asm_369fb ; 369e6 $13
+	cp $68
+	jr nz, .asm_36a2b ; 369ea $3f
+.asm_369ec
+	call FarBattleRNG
+	and $3
+	jr z, .asm_369ec ; 369f1 $f9
+	dec a
+	jr nz, .asm_36a3a ; 369f4 $44
+	ld a, $1
+	ld [bc], a
+	jr .asm_36a48 ; 369f9 $4d
+.asm_369fb
+	ld a, [hBattleTurn]
+	and a
+	jr nz, .asm_36a0b ; 369fe $b
+	ld a, [PartyCount]
+	cp $1
+	jp z, $6a1e
+	dec a
+	jr .asm_36a3a ; 36a09 $2f
+.asm_36a0b
+	ld a, [IsInBattle]
+	cp $1
+	jp z, $6a1e
+	ld a, [OTPartyCount]
+	cp $1
+	jp z, $6a1e
+	dec a
+	jr .asm_36a3a ; 36a1c $1c
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVarPair
+	res 2, [hl]
+	call $55b5
+	jp EndMoveEffect
+.asm_36a2b
+	call FarBattleRNG
+	and $3
+	cp $2
+	jr c, .asm_36a39 ; 36a32 $5
+	call FarBattleRNG
+	and $3
+.asm_36a39
+	inc a
+.asm_36a3a
+	ld [de], a
+	inc a
+	ld [bc], a
+	jr .asm_36a6b ; 36a3d $2c
+.asm_36a3f
+	ld a, $1
+	jr .asm_36a3a ; 36a41 $f7
+	ld a, [de]
+	dec a
+	ld [de], a
+	jr nz, .asm_36a6b ; 36a46 $23
+.asm_36a48
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVarPair
+	res 2, [hl]
+	ld hl, $52e5
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_36a5a ; 36a55 $3
+	ld hl, $52f8
+.asm_36a5a
+	push bc
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call CleanGetBattleVarPair
+	cp $9a
+	jr z, .asm_36a67 ; 36a62 $3
+	call FarBattleTextBox
+.asm_36a67
+	pop bc
+	xor a
+	ld [bc], a
+	ret
+.asm_36a6b
+	ld a, [BattleScriptBufferLoc + 1]
+	ld h, a
+	ld a, [BattleScriptBufferLoc]
+	ld l, a
+.asm_36a73
+	ld a, [hld]
+	cp $5
+	jr nz, .asm_36a73 ; 36a76 $fb
+	inc hl
+	ld a, h
+	ld [BattleScriptBufferLoc + 1], a
+	ld a, l
+	ld [BattleScriptBufferLoc], a
+	ret
+; 36a82
+
+
+BattleCommand94: ; 36a82
+	ld a, [AttackMissed]
+	and a
+	ret nz
+	call CheckSubstituteOpp
+	jr nz, .asm_36a9a ; 36a8a $e
+	ld a, BATTLE_VARS_STATUS_OPP
+	call CleanGetBattleVarPair
+	and $27
+	jr nz, .asm_36a9a ; 36a93 $5
+	call Function0x36abf
+	jr z, Function0x36ab5 ; 36a98 $1b
+.asm_36a9a
+	ld a, 1
+	ld [AttackMissed], a
+	ret
+; 36aa0
+
+
+BattleCommand25: ; 36aa0
+	call CheckSubstituteOpp
+	ret nz
+	ld a, BATTLE_VARS_STATUS_OPP
+	call CleanGetBattleVarPair
+	and $27
+	ret nz
+	call Function0x36abf
+	ret nz
+	ld a, [$c70d]
+	and a
+	ret nz
+
+	; fallthrough
+; 36ab5
+
+
+Function0x36ab5: ; 36ab5
+	ld a, BATTLE_VARS_SUBSTATUS3_OPP
+	call GetBattleVarPair
+	set 3, [hl]
+	jp EndRechargeOpp
+; 36abf
+
+
+Function0x36abf: ; 36abf
+	push bc
+	ld a, [$c70f]
+	ld b, a
+	ld a, [hBattleTurn]
+	xor b
+	pop bc
+	ret
+; 36ac9
+
+
+BattleCommand4d: ; 36ac9
+	ld a, [AttackMissed]
+	and a
+	ret nz
+	call GetUserItem
+	ld a, b
+	cp $4b
+	ret nz
+	call CheckSubstituteOpp
+	ret nz
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call GetBattleVarPair
+	ld d, h
+	ld e, l
+	call GetUserItem
+	call FarBattleRNG
+	cp c
+	ret nc
+	call EndRechargeOpp
+	ld a, BATTLE_VARS_SUBSTATUS3_OPP
+	call GetBattleVarPair
+	set 3, [hl]
+	ret
+; 36af3
+
+
+BattleCommand26: ; 36af3
+	call ResetDamage
+	ld a, [TypeModifier]
+	and $7f
+	jr z, .asm_36b2f ; 36afb $32
+	ld hl, EnemyMonLevel
+	ld de, BattleMonLevel
+	ld bc, PlayerMoveAccuracy
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_36b12 ; 36b09 $7
+	push hl
+	ld h, d
+	ld l, e
+	pop de
+	ld bc, EnemyMoveAccuracy
+.asm_36b12
+	ld a, [de]
+	sub [hl]
+	jr c, .asm_36b2f ; 36b14 $19
+	add a
+	ld e, a
+	ld a, [bc]
+	add e
+	jr nc, .asm_36b1e ; 36b1a $2
+	ld a, $ff
+.asm_36b1e
+	ld [bc], a
+	call $4d32
+	ld hl, CurDamage
+	ld a, $ff
+	ld [hli], a
+	ld [hl], a
+	ld a, $2
+	ld [CriticalHit], a
+	ret
+.asm_36b2f
+	ld a, $ff
+	ld [CriticalHit], a
+	ld a, $1
+	ld [AttackMissed], a
+	ret
+; 36b3a
+
+
+BattleCommand3a: ; 36b3a
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVarPair
+; charged?
+	bit 4, [hl]
+	ret z
+; go to town
+	res 4, [hl]
+	res 5, [hl]
+	res 6, [hl]
+	ld b, $39
+	jp $7e8c
+; 36b4d
+
+
+BattleCommand39: ; 36b4d
+	call $7e85
+	ld a, BATTLE_VARS_STATUS
+	call CleanGetBattleVarPair
+	and $7
+	jr z, .asm_36b65 ; 36b57 $c
+	call $7e80
+	call BattleCommand0c
+	call $734e
+	jp EndMoveEffect
+.asm_36b65
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVarPair
+	set 4, [hl]
+	ld hl, $5850
+	ld a, [AlreadyDisobeyed]
+	and a
+	call nz, FarBattleTextBox
+	call BattleCommand0a
+	xor a
+	ld [$cfca], a
+	inc a
+	ld [$c689], a
+	call $7e36
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call CleanGetBattleVarPair
+	cp $13
+	jr z, .asm_36b96 ; 36b8b $9
+	cp $5b
+	jr z, .asm_36b96 ; 36b8f $5
+	call BattleCommand0c
+	jr .asm_36b99 ; 36b94 $3
+.asm_36b96
+	call $7ec0
+.asm_36b99
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVarPair
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call CleanGetBattleVarPair
+	ld b, a
+	cp $13
+	jr z, .asm_36bb0 ; 36ba6 $8
+	cp $5b
+	jr nz, .asm_36bb2 ; 36baa $6
+	set 5, [hl]
+	jr .asm_36bb2 ; 36bae $2
+
+.asm_36bb0
+	set 6, [hl]
+
+.asm_36bb2
+	call Function0x34548
+	jr nz, .asm_36bc3 ; 36bb5 $c
+	ld a, BATTLE_VARS_LAST_COUNTER_MOVE
+	call GetBattleVarPair
+	ld [hl], b
+	ld a, BATTLE_VARS_LAST_MOVE
+	call GetBattleVarPair
+	ld [hl], b
+
+.asm_36bc3
+	call ResetDamage
+
+	ld hl, .text_36bdb
+	call BattleTextBox
+
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call CleanGetBattleVarPair
+	cp $91 ; skull bash
+	ld b, $fe
+	jp z, $7e8c
+	jp EndMoveEffect
+
+.text_36bdb
+; [user]
+	TX_FAR UnknownText_0x1c0d0e
+	start_asm
+
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call CleanGetBattleVarPair
+	cp RAZOR_WIND
+	ld hl, .RazorWind
+	jr z, .asm_36c0d
+
+	cp SOLARBEAM
+	ld hl, .Solarbeam
+	jr z, .asm_36c0d
+
+	cp SKULL_BASH
+	ld hl, .SkullBash
+	jr z, .asm_36c0d
+
+	cp SKY_ATTACK
+	ld hl, .SkyAttack
+	jr z, .asm_36c0d
+
+	cp FLY
+	ld hl, .Fly
+	jr z, .asm_36c0d
+
+	cp DIG
+	ld hl, .Dig
+
+.asm_36c0d
+	ret
+
+.RazorWind
+; 'made a whirlwind!'
+	TX_FAR UnknownText_0x1c0d12
+	db "@"
+
+.Solarbeam
+; 'took in sunlight!'
+	TX_FAR UnknownText_0x1c0d26
+	db "@"
+
+.SkullBash
+; 'lowered its head!'
+	TX_FAR UnknownText_0x1c0d3a
+	db "@"
+
+.SkyAttack
+; 'is glowing!'
+	TX_FAR UnknownText_0x1c0d4e
+	db "@"
+
+.Fly
+; 'flew up high!'
+	TX_FAR UnknownText_0x1c0d5c
+	db "@"
+
+.Dig
+; 'dug a hole!'
+	TX_FAR UnknownText_0x1c0d6c
+	db "@"
+; 36c2c
+
+
+BattleCommand3c: ; 36c2c
+; unused
+	ret
+; 36c2d
+
+
+BattleCommand3b: ; 36c2d
+	ld a, [AttackMissed]
+	and a
+	ret nz
+	ld hl, $c731
+	ld de, $c72f
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_36c43
+	ld hl, $c730
+	ld de, $c72e
+
+.asm_36c43
+	ld a, [hl]
+	and a
+	ret nz
+	ld a, BATTLE_VARS_SUBSTATUS4_OPP
+	call CleanGetBattleVarPair
+	bit 4, a
+	ret nz
+	call FarBattleRNG
+	and 3
+	inc a
+	inc a
+	inc a
+	ld [hl], a
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call CleanGetBattleVarPair
+	ld [de], a
+	ld b, a
+	ld hl, .Traps
+
+.asm_36c61
+	ld a, [hli]
+	cp b
+	jr z, .asm_36c69
+	inc hl
+	inc hl
+	jr .asm_36c61
+
+.asm_36c69
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	jp FarBattleTextBox
+
+.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
+
+
+BattleCommand28: ; 36c7e
+	ld a, BATTLE_VARS_SUBSTATUS4
+	call GetBattleVarPair
+	bit 1, [hl]
+	jr nz, .asm_36c92 ; 36c85 $b
+	set 1, [hl]
+	call $7e01
+	ld hl, MistText
+	jp FarBattleTextBox
+.asm_36c92
+	call $7e77
+	jp $734e
+; 36c98
+
+
+BattleCommand29: ; 36c98
+	ld a, BATTLE_VARS_SUBSTATUS4
+	call GetBattleVarPair
+	bit 2, [hl]
+	jr nz, .asm_36cac ; 36c9f $b
+	set 2, [hl]
+	call $7e01
+	ld hl, GettingPumpedText
+	jp FarBattleTextBox
+.asm_36cac
+	call $7e77
+	jp $734e
+; 36cb2
+
+
+BattleCommand27: ; 36cb2
+	ld hl, BattleMonMaxHP
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_36cbd ; 36cb8 $3
+	ld hl, EnemyMonMaxHPHi
+.asm_36cbd
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call CleanGetBattleVarPair
+	ld d, a
+	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, .asm_36cd8 ; 36cd5 $1
+	inc c
+.asm_36cd8
+	ld a, [hli]
+	ld [$d1eb], a
+	ld a, [hl]
+	ld [$d1ea], a
+	dec hl
+	dec hl
+	ld a, [hl]
+	ld [$d1ec], a
+	sub c
+	ld [hld], a
+	ld [$d1ee], a
+	ld a, [hl]
+	ld [$d1ed], a
+	sbc b
+	ld [hl], a
+	ld [$d1ef], a
+	jr nc, .asm_36cfe ; 36cf4 $8
+	xor a
+	ld [hli], a
+	ld [hl], a
+	ld hl, $d1ee
+	ld [hli], a
+	ld [hl], a
+.asm_36cfe
+	ld hl, $c55e
+	ld a, [hBattleTurn]
+	and a
+	ld a, $1
+	jr z, .asm_36d0c ; 36d06 $4
+	ld hl, $c4ca
+	xor a
+.asm_36d0c
+	ld [$d10a], a
+	ld a, $b
+	call $2d83
+	call $39c9
+	ld hl, RecoilText
+	jp FarBattleTextBox
+; 36d1d
+
+
+BattleCommand2b: ; 36d1d
+; battleanimation + confuse
+	call GetOpponentItem
+	ld a, b
+	cp $19
+	ret z
+	ld a, [$c70d]
+	and a
+	ret nz
+	call Function0x37962
+	ret nz
+	call CheckSubstituteOpp
+	ret nz
+	ld a, BATTLE_VARS_SUBSTATUS3_OPP
+	call GetBattleVarPair
+	bit 7, [hl]
+	ret nz
+	jr Function0x36d70
+
+BattleCommand2a: ; 36d3b
+	call GetOpponentItem
+	ld a, b
+	cp $19
+	jr nz, .asm_36d53
+	ld a, [hl]
+	ld [$d265], a
+	call $3468
+	call $7e77
+	ld hl, ProtectedByText
+	jp FarBattleTextBox
+
+.asm_36d53
+	ld a, BATTLE_VARS_SUBSTATUS3_OPP
+	call GetBattleVarPair
+	bit 7, [hl]
+	jr z, .asm_36d65
+	call $7e77
+	ld hl, AlreadyConfusedText
+	jp FarBattleTextBox
+
+.asm_36d65
+	call CheckSubstituteOpp
+	jr nz, Function0x36db6
+	ld a, [AttackMissed]
+	and a
+	jr nz, Function0x36db6
+
+	; fallthrough
+; 36d70
+
+
+Function0x36d70: ; 36d70
+	ld bc, $c67b
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_36d7b ; 36d76 $3
+	ld bc, PlayerConfuseCount
+.asm_36d7b
+	set 7, [hl]
+	call FarBattleRNG
+	and $3
+	inc a
+	inc a
+	ld [bc], a
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call CleanGetBattleVarPair
+	cp $4c
+	jr z, .asm_36d99
+	cp $5c
+	jr z, .asm_36d99
+	cp $76
+	jr z, .asm_36d99
+	call $7e01
+.asm_36d99
+	ld de, $0103
+	call $7e54
+	ld hl, BecameConfusedText
+	call FarBattleTextBox
+	call GetOpponentItem
+	ld a, b
+	cp $f
+	jr z, .asm_36db0
+	cp $10
+	ret nz
+.asm_36db0
+	ld hl, $5e51
+	jp $7e73
+; 36db6
+
+Function0x36db6: ; 36db6
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call CleanGetBattleVarPair
+	cp $4c
+	ret z
+	cp $5c
+	ret z
+	cp $76
+	ret z
+	jp PrintDidntAffect2
+; 36dc7
+
+
+BattleCommand30: ; 36dc7
+	ld a, BATTLE_VARS_STATUS_OPP
+	call CleanGetBattleVarPair
+	bit 6, a
+	jr nz, .asm_36e49 ; 36dce $79
+	ld a, [TypeModifier]
+	and $7f
+	jr z, .asm_36e55 ; 36dd5 $7e
+	call GetOpponentItem
+	ld a, b
+	cp $18
+	jr nz, .asm_36def ; 36ddd $10
+	ld a, [hl]
+	ld [$d265], a
+	call $3468
+	call $7e77
+	ld hl, ProtectedByText
+	jp FarBattleTextBox
+.asm_36def
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_36e0e ; 36df2 $1a
+	ld a, [InLinkBattle]
+	and a
+	jr nz, .asm_36e0e ; 36df8 $14
+	ld a, [$cfc0]
+	and a
+	jr nz, .asm_36e0e ; 36dfe $e
+	ld a, [PlayerSubStatus5]
+	bit 5, a
+	jr nz, .asm_36e0e ; 36e05 $7
+	call FarBattleRNG
+	cp $40
+	jr c, .asm_36e52 ; 36e0c $44
+.asm_36e0e
+	ld a, BATTLE_VARS_STATUS_OPP
+	call GetBattleVarPair
+	and a
+	jr nz, .asm_36e52 ; 36e14 $3c
+	ld a, [AttackMissed]
+	and a
+	jr nz, .asm_36e52 ; 36e1a $36
+	call CheckSubstituteOpp
+	jr nz, .asm_36e52 ; 36e1f $31
+	ld c, $1e
+	call DelayFrames
+	call $7e01
+	ld a, $1
+	ld [$ffd4], a
+	ld a, BATTLE_VARS_STATUS_OPP
+	call GetBattleVarPair
+	set 6, [hl]
+	call $398e
+	ld hl, $6c39
+	call $7e73
+	call $39d4
+	call PrintParalyze
+	ld hl, $5de9
+	jp $7e73
+.asm_36e49
+	call $7e77
+	ld hl, AlreadyParalyzedText
+	jp FarBattleTextBox
+.asm_36e52
+	jp PrintDidntAffect2
+.asm_36e55
+	call $7e77
+	jp PrintDoesntAffect
+; 36e5b
+
+
+Function0x36e5b: ; 36e5b
+; Compare move type to user type.
+; Return z if matching the user type (unless the move is Normal).
+
+	push hl
+
+	ld hl, EnemyMonType1
+	ld a, [hBattleTurn]
+	and a
+	jr z, .ok
+	ld hl, BattleMonType1
+.ok
+
+	ld a, BATTLE_VARS_MOVE_TYPE
+	call CleanGetBattleVarPair
+	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
+
+
+BattleCommand31: ; 36e7c
+	call $7e80
+	ld hl, BattleMonMaxHP
+	ld de, $c6df
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_36e90 ; 36e88 $6
+	ld hl, EnemyMonMaxHPHi
+	ld de, $c6e0
+.asm_36e90
+	ld a, BATTLE_VARS_SUBSTATUS4
+	call CleanGetBattleVarPair
+	bit 4, a
+	jr nz, .asm_36ef4 ; 36e97 $5b
+	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, .asm_36eff ; 36eae $4f
+	ld a, d
+	or e
+	jr z, .asm_36eff ; 36eb2 $4b
+	ld [hl], d
+	inc hl
+	ld [hl], e
+	ld a, BATTLE_VARS_SUBSTATUS4
+	call GetBattleVarPair
+	set 4, [hl]
+	ld hl, $c730
+	ld de, $c72e
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_36ecf ; 36ec7 $6
+	ld hl, $c731
+	ld de, $c72f
+.asm_36ecf
+	xor a
+	ld [hl], a
+	ld [de], a
+	call $7ed5
+	jr c, .asm_36ee8 ; 36ed5 $11
+	xor a
+	ld [$cfca], a
+	ld [FXAnimIDHi], a
+	ld [$c689], a
+	ld a, $a4
+	call $7e44
+	jr .asm_36eeb ; 36ee6 $3
+.asm_36ee8
+	call BattleCommanda6
+.asm_36eeb
+	ld hl, MadeSubstituteText
+	call FarBattleTextBox
+	jp $39c9
+.asm_36ef4
+	call Function0x34548
+	call nz, BattleCommand0c
+	ld hl, HasSubstituteText
+	jr .asm_36f08 ; 36efd $9
+.asm_36eff
+	call Function0x34548
+	call nz, BattleCommand0c
+	ld hl, TooWeakSubText
+.asm_36f08
+	jp FarBattleTextBox
+; 36f0b
+
+BattleCommand32: ; 36f0b
+	ld a, BATTLE_VARS_SUBSTATUS4
+	call GetBattleVarPair
+	set 5, [hl]
+	ret
+; 36f13
+
+
+EndRechargeOpp: ; 36f13
+	push hl
+	ld a, BATTLE_VARS_SUBSTATUS4_OPP
+	call GetBattleVarPair
+	res 5, [hl]
+	pop hl
+	ret
+; 36f1d
+
+
+BattleCommand97: ; 36f1d
+	ld a, BATTLE_VARS_SUBSTATUS4
+	call GetBattleVarPair
+	set 6, [hl]
+	ret
+; 36f25
+
+
+BattleCommand98: ; 36f25
+	ld a, BATTLE_VARS_SUBSTATUS3_OPP
+	call CleanGetBattleVarPair
+	bit 6, a
+	ret z
+	jr BattleCommand9899
+; 36f2f
+
+
+BattleCommand99: ; 36f2f
+	ld a, BATTLE_VARS_SUBSTATUS3_OPP
+	call CleanGetBattleVarPair
+	bit 5, a ; recharge
+	ret z
+
+	; fallthrough
+; 36f37
+
+
+BattleCommand9899: ; 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
+
+
+BattleCommand33: ; 36f46
+	call Function0x372d8
+	call $7e80
+	ld a, [AttackMissed]
+	and a
+	jr nz, .asm_36f9a ; 36f50 $48
+	ld hl, BattleMonMoves
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_36f5d ; 36f58 $3
+	ld hl, EnemyMonMoves
+.asm_36f5d
+	call CheckHiddenOpponent
+	jr nz, .asm_36f9a ; 36f60 $38
+	ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
+	call CleanGetBattleVarPair
+	and a
+	jr z, .asm_36f9a ; 36f68 $30
+	cp $a5
+	jr z, .asm_36f9a ; 36f6c $2c
+	ld b, a
+	ld c, $4
+.asm_36f71
+	ld a, [hli]
+	cp b
+	jr z, .asm_36f9a ; 36f73 $25
+	dec c
+	jr nz, .asm_36f71 ; 36f76 $f9
+	dec hl
+.asm_36f79
+	ld a, [hld]
+	cp $66
+	jr nz, .asm_36f79 ; 36f7c $fb
+	inc hl
+	ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
+	call CleanGetBattleVarPair
+	ld [hl], a
+	ld [$d265], a
+	ld bc, $0006
+	add hl, bc
+	ld [hl], $5
+	call $34f8
+	call $7e01
+	ld hl, LearnedMoveText
+	jp FarBattleTextBox
+.asm_36f9a
+	jp $7357
+; 36f9d
+
+
+BattleCommand35: ; 36f9d
+; leechseed
+	ld a, [AttackMissed]
+	and a
+	jr nz, .asm_36fd8 ; 36fa1 $35
+	call CheckSubstituteOpp
+	jr nz, .asm_36fd8 ; 36fa6 $30
+	ld de, EnemyMonType1
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_36fb3 ; 36fae $3
+	ld de, BattleMonType1
+.asm_36fb3
+	ld a, [de]
+	cp $16
+	jr z, .asm_36fd2 ; 36fb6 $1a
+	inc de
+	ld a, [de]
+	cp $16
+	jr z, .asm_36fd2 ; 36fbc $14
+	ld a, BATTLE_VARS_SUBSTATUS4_OPP
+	call GetBattleVarPair
+	bit 7, [hl]
+	jr nz, .asm_36fd8 ; 36fc5 $11
+	set 7, [hl]
+	call $7e01
+	ld hl, WasSeededText
+	jp FarBattleTextBox
+.asm_36fd2
+	call $7e77
+	jp PrintDoesntAffect
+.asm_36fd8
+	call $7e77
+	ld hl, EvadedText
+	jp FarBattleTextBox
+; 36fe1
+
+
+BattleCommand36: ; 36fe1
+	call $7e01
+	ld a, $41
+	ld hl, $60e5
+	rst FarCall
+	jp PrintNothingHappened
+; 36fed
+
+
+BattleCommand37: ; 36fed
+; disable
+
+	ld a, [AttackMissed]
+	and a
+	jr nz, .asm_37059 ; 36ff1 $66
+	ld de, EnemyEncoreCount
+	ld hl, EnemyMonMoves
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_37004 ; 36ffc $6
+	ld de, PlayerDisableCount
+	ld hl, BattleMonMoves
+.asm_37004
+	ld a, [de]
+	and a
+	jr nz, .asm_37059 ; 37006 $51
+	ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
+	call CleanGetBattleVarPair
+	and a
+	jr z, .asm_37059 ; 3700e $49
+	cp $a5
+	jr z, .asm_37059 ; 37012 $45
+	ld b, a
+	ld c, $ff
+.asm_37017
+	inc c
+	ld a, [hli]
+	cp b
+	jr nz, .asm_37017 ; 3701a $fb
+	ld a, [hBattleTurn]
+	and a
+	ld hl, EnemyMonPPMove1
+	jr z, .asm_37027 ; 37022 $3
+	ld hl, BattleMonPP
+.asm_37027
+	ld b, $0
+	add hl, bc
+	ld a, [hl]
+	and a
+	jr z, .asm_37059 ; 3702c $2b
+.asm_3702e
+	call FarBattleRNG
+	and $7
+	jr z, .asm_3702e ; 37033 $f9
+	inc a
+	inc c
+	swap c
+	add c
+	ld [de], a
+	call $7e01
+	ld hl, DisabledMove
+	ld a, [hBattleTurn]
+	and a
+	jr nz, .asm_37047 ; 37044 $1
+	inc hl
+.asm_37047
+	ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
+	call CleanGetBattleVarPair
+	ld [hl], a
+	ld [$d265], a
+	call $34f8
+	ld hl, WasDisabledText
+	jp FarBattleTextBox
+.asm_37059
+	jp Function0x37354
+; 3705c
+
+
+BattleCommand1e: ; 3705c
+	xor a
+	ld hl, StringBuffer1
+	ld [hli], a
+	ld a, [hBattleTurn]
+	and a
+	ld a, [BattleMonLevel]
+	jr z, .asm_3706c ; 37067 $3
+	ld a, [EnemyMonLevel]
+.asm_3706c
+	add a
+	ld hl, $c6ee
+	add [hl]
+	ld [hld], a
+	jr nc, .asm_37079 ; 37072 $5
+	inc [hl]
+	dec hl
+	jr nz, .asm_37079 ; 37076 $1
+	inc [hl]
+.asm_37079
+	ld hl, CoinsScatteredText
+	jp FarBattleTextBox
+; 3707f
+
+
+BattleCommand1f: ; 3707f
+	ld hl, BattleMonMoves
+	ld de, BattleMonType1
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_37090 ; 37088 $6
+	ld hl, EnemyMonMoves
+	ld de, EnemyMonType1
+.asm_37090
+	push de
+	ld c, $0
+	ld de, StringBuffer1
+.asm_37096
+	push hl
+	ld b, $0
+	add hl, bc
+	ld a, [hl]
+	pop hl
+	and a
+	jr z, .asm_370b2 ; 3709d $13
+	push hl
+	push bc
+	dec a
+	ld hl, $5afe
+	call $7ea1
+	ld [de], a
+	inc de
+	pop bc
+	pop hl
+	inc c
+	ld a, c
+	cp $4
+	jr c, .asm_37096 ; 370b0 $e4
+.asm_370b2
+	ld a, $ff
+	ld [de], a
+	inc de
+	ld [de], a
+	inc de
+	ld [de], a
+	pop de
+	ld hl, StringBuffer1
+.asm_370bd
+	ld a, [hl]
+	cp $ff
+	jr z, .asm_370d3 ; 370c0 $11
+	cp $13
+	jr z, .asm_370d0 ; 370c4 $a
+	ld a, [de]
+	cp [hl]
+	jr z, .asm_370d0 ; 370c8 $6
+	inc de
+	ld a, [de]
+	dec de
+	cp [hl]
+	jr nz, .asm_370d9 ; 370ce $9
+.asm_370d0
+	inc hl
+	jr .asm_370bd ; 370d1 $ea
+.asm_370d3
+	call $7e77
+	jp $734e
+.asm_370d9
+	call FarBattleRNG
+	and $3
+	ld c, a
+	ld b, $0
+	ld hl, StringBuffer1
+	add hl, bc
+	ld a, [hl]
+	cp $ff
+	jr z, .asm_370d9 ; 370e8 $ef
+	cp $13
+	jr z, .asm_370d9 ; 370ec $eb
+	ld a, [de]
+	cp [hl]
+	jr z, .asm_370d9 ; 370f0 $e7
+	inc de
+	ld a, [de]
+	dec de
+	cp [hl]
+	jr z, .asm_370d9 ; 370f6 $e1
+	ld a, [hl]
+	ld [de], a
+	inc de
+	ld [de], a
+	ld [$d265], a
+	ld a, $14
+	ld hl, $4964
+	rst FarCall
+	call $7e01
+	ld hl, TransformedTypeText
+	jp FarBattleTextBox
+; 3710e
+
+
+BattleCommand20: ; 3710e
+; resetstats
+	ld a, 7 ; neutral
+	ld hl, PlayerStatLevels
+	call .Fill
+	ld hl, EnemyStatLevels
+	call .Fill
+
+	ld a, [hBattleTurn]
+	push af
+
+	call SetPlayerTurn
+	call Function0x365d7
+	call SetEnemyTurn
+	call Function0x365fd
+
+	pop af
+	ld [hBattleTurn], a
+
+	call $7e01
+
+	ld hl, EliminatedStatsText
+	jp FarBattleTextBox
+
+.Fill
+	ld b, PlayerStatLevelsEnd - PlayerStatLevels
+.asm_37139
+	ld [hli], a
+	dec b
+	jr nz, .asm_37139
+	ret
+; 3713e
+
+
+BattleCommand2c: ; 3713e
+	ld de, BattleMonHP
+	ld hl, BattleMonMaxHP
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_3714f ; 37147 $6
+	ld de, EnemyMonHPHi
+	ld hl, EnemyMonMaxHPHi
+.asm_3714f
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call CleanGetBattleVarPair
+	ld b, a
+	push hl
+	push de
+	push bc
+	ld c, $2
+	call StringCmp
+	pop bc
+	pop de
+	pop hl
+	jp z, .asm_371c4
+	ld a, b
+	cp $9c
+	jr nz, .asm_37199 ; 37166 $31
+	push hl
+	push de
+	push af
+	call $7e80
+	ld a, BATTLE_VARS_SUBSTATUS5
+	call GetBattleVarPair
+	res 0, [hl]
+	ld a, BATTLE_VARS_STATUS
+	call GetBattleVarPair
+	ld a, [hl]
+	and a
+	ld [hl], $3
+	ld hl, WentToSleepText
+	jr z, .asm_37186 ; 37181 $3
+	ld hl, RestedText
+.asm_37186
+	call FarBattleTextBox
+	ld a, [hBattleTurn]
+	and a
+	jr nz, .asm_37193 ; 3718c $5
+	call Function0x365d7
+	jr .asm_37196 ; 37191 $3
+.asm_37193
+	call Function0x365fd
+.asm_37196
+	pop af
+	pop de
+	pop hl
+.asm_37199
+	jr z, .asm_371a3 ; 37199 $8
+	ld hl, $4c9f
+	call $7e73
+	jr .asm_371a9 ; 371a1 $6
+.asm_371a3
+	ld hl, $4cac
+	call $7e73
+.asm_371a9
+	call $7e01
+	call $4ffd
+	ld hl, $4cef
+	call $7e73
+	call $4ffd
+	call $3995
+	call $39c9
+	ld hl, RegainedHealthText
+	jp FarBattleTextBox
+
+.asm_371c4
+	call $7e77
+	ld hl, HPIsFullText
+	jp FarBattleTextBox
+; 371cd
+
+
+BattleCommand2d: ; 371cd
+; transform
+
+	call Function0x372d8
+	ld a, BATTLE_VARS_SUBSTATUS5_OPP
+	call GetBattleVarPair
+	bit 3, [hl]
+	jp nz, Function0x372d2
+	call CheckHiddenOpponent
+	jp nz, Function0x372d2
+	xor a
+	ld [$cfca], a
+	ld [FXAnimIDHi], a
+	ld a, $1
+	ld [$c689], a
+	ld a, BATTLE_VARS_SUBSTATUS4
+	call GetBattleVarPair
+	bit 4, [hl]
+	push af
+	jr z, .asm_37200 ; 371f4 $a
+	call Function0x34548
+	jr nz, .asm_37200 ; 371f9 $5
+	ld a, $a4
+	call $7e44
+.asm_37200
+	ld a, BATTLE_VARS_SUBSTATUS5
+	call GetBattleVarPair
+	set 3, [hl]
+	call $72e7
+	ld hl, BattleMonSpecies
+	ld de, EnemyMonSpecies
+	ld a, [hBattleTurn]
+	and a
+	jr nz, .asm_3721f ; 37213 $a
+	ld hl, EnemyMonSpecies
+	ld de, BattleMonSpecies
+	xor a
+	ld [CurMoveNum], a
+.asm_3721f
+	push hl
+	ld a, [hli]
+	ld [de], a
+	inc hl
+	inc de
+	inc de
+	ld bc, $0004
+	call $3026
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_3723a ; 3722e $a
+	ld a, [de]
+	ld [$c6f2], a
+	inc de
+	ld a, [de]
+	ld [$c6f3], a
+	dec de
+.asm_3723a
+	ld a, [hli]
+	ld [de], a
+	inc de
+	ld a, [hli]
+	ld [de], a
+	inc de
+	ld bc, $000c
+	add hl, bc
+	push hl
+	ld h, d
+	ld l, e
+	add hl, bc
+	ld d, h
+	ld e, l
+	pop hl
+	ld bc, $000c
+	call $3026
+	ld bc, $ffe2
+	add hl, bc
+	push de
+	ld d, h
+	ld e, l
+	pop hl
+	ld bc, $ffe8
+	add hl, bc
+	ld b, $4
+.asm_3725f
+	ld a, [de]
+	inc de
+	and a
+	jr z, .asm_3726c ; 37262 $8
+	cp $a6
+	ld a, $1
+	jr z, .asm_3726c ; 37268 $2
+	ld a, $5
+.asm_3726c
+	ld [hli], a
+	dec b
+	jr nz, .asm_3725f ; 3726e $ef
+	pop hl
+	ld a, [hl]
+	ld [$d265], a
+	call $343b
+	ld hl, $c6c1
+	ld de, $c6b6
+	ld bc, $000a
+	call BattleSideCopy
+	ld hl, EnemyStatLevels
+	ld de, PlayerStatLevels
+	ld bc, $0008
+	call BattleSideCopy
+	call $7ed5
+	jr c, .asm_372a8 ; 37293 $13
+	ld a, [hBattleTurn]
+	and a
+	ld a, [$c6fe]
+	jr z, .asm_372a0 ; 3729b $3
+	ld a, [$c6fa]
+.asm_372a0
+	and a
+	jr nz, .asm_372a8 ; 372a1 $5
+	call $7e36
+	jr .asm_372ae ; 372a6 $6
+.asm_372a8
+	call $7e80
+	call BattleCommanda6
+.asm_372ae
+	xor a
+	ld [$cfca], a
+	ld [FXAnimIDHi], a
+	ld a, $2
+	ld [$c689], a
+	pop af
+	ld a, $a4
+	call nz, $7e44
+	ld hl, TransformedText
+	jp FarBattleTextBox
+; 372c6
+
+
+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
+
+
+Function0x372d2: ; 372d2
+	call $7e77
+	jp $734e
+; 372d8
+
+
+Function0x372d8: ; 372d8
+	ld a, BATTLE_VARS_LAST_COUNTER_MOVE
+	call GetBattleVarPair
+	xor a
+	ld [hl], a
+
+	ld a, BATTLE_VARS_LAST_MOVE
+	call GetBattleVarPair
+	xor a
+	ld [hl], a
+	ret
+; 372e7
+
+
+; 372e7
+	ld a, [hBattleTurn]
+	and a
+	jr z, .player
+
+	xor a
+	ld [EnemyEncoreCount], a
+	ld [EnemyEncoredMove], a
+	ret
+
+.player
+	xor a
+	ld [PlayerDisableCount], a
+	ld [DisabledMove], a
+	ret
+; 372fc
+
+
+BattleCommand2e: ; 372fc
+	ld hl, PlayerScreens
+	ld bc, PlayerLightScreenCount
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_3730d ; 37305 $6
+	ld hl, $c700
+	ld bc, $c706
+.asm_3730d
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call CleanGetBattleVarPair
+	cp $23
+	jr nz, .asm_37324 ; 37314 $e
+	bit 3, [hl]
+	jr nz, .asm_37337 ; 37318 $1d
+	set 3, [hl]
+	ld a, $5
+	ld [bc], a
+	ld hl, $54b4
+	jr .asm_37331 ; 37322 $d
+.asm_37324
+	bit 4, [hl]
+	jr nz, .asm_37337 ; 37326 $f
+	set 4, [hl]
+	inc bc
+	ld a, $5
+	ld [bc], a
+	ld hl, $54c7
+.asm_37331
+	call $7e01
+	jp FarBattleTextBox
+.asm_37337
+	call $7e77
+	jp $734e
+; 3733d
+
+
+PrintDoesntAffect: ; 3733d
+; 'it doesn't affect'
+	ld hl, DoesntAffectText
+	jp FarBattleTextBox
+; 37343
+
+
+PrintNothingHappened: ; 37343
+; 'but nothing happened!'
+	ld hl, NothingHappenedText
+	jp FarBattleTextBox
+; 37349
+
+
+PrintButItFailed: ; 37349
+	ld a, [$c6fb]
+	and a
+	ret nz
+
+; 'but it failed!'
+	ld hl, ButItFailedText
+	jp FarBattleTextBox
+; 37354
+
+
+Function0x37354: ; 37354
+	call $7e77
+	ld hl, ButItFailedText ; 'but it failed!'
+	ld de, ItFailedText    ; 'it failed!'
+	jp Function0x35157
+; 37360
+
+
+PrintDidntAffect; 37360
+; 'it didn't affect'
+	ld hl, DidntAffect1Text
+	jp FarBattleTextBox
+; 37366
+
+
+PrintDidntAffect2: ; 37366
+	call $7e77
+	ld hl, DidntAffect1Text ; 'it didn't affect'
+	ld de, DidntAffect2Text ; 'it didn't affect'
+	jp Function0x35157
+; 37372
+
+
+PrintParalyze: ; 37372
+; 'paralyzed! maybe it can't attack!'
+	ld hl, ParalyzedText
+	jp FarBattleTextBox
+; 37378
+
+
+CheckSubstituteOpp: ; 37378
+	ld a, BATTLE_VARS_SUBSTATUS4_OPP
+	call CleanGetBattleVarPair
+	bit 4, a
+	ret
+; 37380
+
+
+BattleCommand1a: ; 37380
+	ld a, $41
+	ld hl, $610d
+	rst FarCall
+	ld a, $4
+	ld [$cfca], a
+	ld c, $3
+	call DelayFrames
+	ld a, BATTLE_VARS_STATUS
+	call GetBattleVarPair
+	xor a
+	ld [hli], a
+	inc hl
+	ld [hli], a
+	ld [hl], a
+	ld a, $1
+	ld [$c689], a
+	call BattleCommand0a
+	call $7e36
+	ld a, BATTLE_VARS_SUBSTATUS4
+	call GetBattleVarPair
+	res 7, [hl]
+	ld a, BATTLE_VARS_SUBSTATUS5_OPP
+	call GetBattleVarPair
+	res 6, [hl]
+	call $7ed5
+	ret nc
+	ld a, $f
+	ld hl, $5f58
+	rst FarCall
+	ld a, $f
+	ld hl, $6043
+	rst FarCall
+	call $31f6
+	jp $39c9
+; 373c9
+
+
+BattleCommand1b: ; 373c9
+; mirrormove
+
+	call Function0x372d8
+	ld a, BATTLE_VARS_MOVE
+	call GetBattleVarPair
+	ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
+	call CleanGetBattleVarPair
+	and a
+	jr z, .asm_373de ; 373d7 $5
+	call CheckUserMove
+	jr nz, .asm_373ea ; 373dc $c
+.asm_373de
+	call $7e77
+	ld hl, MirrorMoveFailedText
+	call FarBattleTextBox
+	jp EndMoveEffect
+.asm_373ea
+	ld a, b
+	ld [hl], a
+	ld [$d265], a
+	push af
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call GetBattleVarPair
+	ld d, h
+	ld e, l
+	pop af
+	dec a
+	call GetMoveData
+	call $34f8
+	call $30d6
+	call Function0x34548
+	jr nz, .asm_37412 ; 37405 $b
+	ld a, [$c689]
+	push af
+	call BattleCommand0a
+	pop af
+	ld [$c689], a
+.asm_37412
+	call $7e80
+	jp ResetTurn
+; 37418
+
+
+BattleCommand34: ; 37418
+; metronome
+
+	call Function0x372d8
+	call Function0x34548
+	jr nz, .asm_3742b
+
+	ld a, [$c689]
+	push af
+	call BattleCommand0a
+	pop af
+	ld [$c689], a
+
+.asm_3742b
+	call $7e36
+
+.GetMove
+	call FarBattleRNG
+
+; No invalid moves.
+	cp BEAT_UP + 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 GetBattleVarPair
+	ld [hl], b
+	call UpdateMoveData
+	jp ResetTurn
+; 37454
+
+
+MetronomeExcepts: ; 37454
+	db $00
+	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 $ff
+; 37462
+
+
+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, $c732
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_37486
+	ld hl, $c733
+
+.asm_37486
+	ld [hl], 1
+	xor a
+	ld [AlreadyDisobeyed], a
+	call $402c
+	jp $52a3
+; 37492
+
+
+BattleCommand50: ; 37492
+; thief
+
+	ld a, [hBattleTurn]
+	and a
+	jr nz, .asm_374ce ; 37495 $37
+	call .asm_37501
+	ld a, [hl]
+	and a
+	ret nz
+	call .asm_3750c
+	ld a, [hl]
+	and a
+	ret z
+	ld [$d265], a
+	ld d, a
+	ld a, $2e
+	ld hl, $5e76
+	rst FarCall
+	ret c
+	ld a, [$c70d]
+	and a
+	ret nz
+	ld a, [InLinkBattle]
+	and a
+	jr z, .asm_374be ; 374b7 $5
+	ld a, [IsInBattle]
+	dec a
+	ret z
+.asm_374be
+	call .asm_3750c
+	xor a
+	ld [hl], a
+	ld [de], a
+	call .asm_37501
+	ld a, [$d265]
+	ld [hl], a
+	ld [de], a
+	jr .asm_374f8 ; 374cc $2a
+.asm_374ce
+	call .asm_3750c
+	ld a, [hl]
+	and a
+	ret nz
+	call .asm_37501
+	ld a, [hl]
+	and a
+	ret z
+	ld [$d265], a
+	ld d, a
+	ld a, $2e
+	ld hl, $5e76
+	rst FarCall
+	ret c
+	ld a, [$c70d]
+	and a
+	ret nz
+	call .asm_37501
+	xor a
+	ld [hl], a
+	ld [de], a
+	call .asm_3750c
+	ld a, [$d265]
+	ld [hl], a
+	ld [de], a
+.asm_374f8
+	call $3468
+	ld hl, StoleText
+	jp FarBattleTextBox
+
+.asm_37501
+	ld a, 1
+	call BattlePartyAttr
+	ld d, h
+	ld e, l
+	ld hl, BattleMonItem
+	ret
+
+.asm_3750c
+	ld a, 1
+	call $396d ; GetOTStat_Battle
+	ld d, h
+	ld e, l
+	ld hl, EnemyMonItem
+	ret
+; 37517
+
+
+BattleCommand51: ; 37517
+; arenatrap
+	call CheckHiddenOpponent
+	jr nz, .asm_37530 ; 3751a $14
+	ld a, BATTLE_VARS_SUBSTATUS5
+	call GetBattleVarPair
+	bit 7, [hl]
+	jr nz, .asm_37530 ; 37523 $b
+	set 7, [hl]
+	call $7e01
+	ld hl, CantEscapeNowText
+	jp FarBattleTextBox
+.asm_37530
+	call $7e77
+	jp $734e
+; 37536
+
+
+BattleCommand52: ; 37536
+; nightmare
+
+	call CheckHiddenOpponent
+	jr nz, .asm_3755d ; 37539 $22
+	call CheckSubstituteOpp
+	jr nz, .asm_3755d ; 3753e $1d
+	ld a, BATTLE_VARS_STATUS_OPP
+	call GetBattleVarPair
+	and $7
+	jr z, .asm_3755d ; 37547 $14
+	ld a, BATTLE_VARS_SUBSTATUS1_OPP
+	call GetBattleVarPair
+	bit 0, [hl]
+	jr nz, .asm_3755d ; 37550 $b
+	set 0, [hl]
+	call $7e01
+	ld hl, StartedNightmareText
+	jp FarBattleTextBox
+.asm_3755d
+	call $7e77
+	jp $734e
+; 37563
+
+
+BattleCommand53: ; 37563
+; defrost
+
+	ld a, BATTLE_VARS_STATUS
+	call GetBattleVarPair
+	bit 5, [hl]
+	ret z
+	res 5, [hl]
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_37578 ; 37570 $6
+	ld a, [IsInBattle]
+	dec a
+	jr z, .asm_3757f ; 37576 $7
+.asm_37578
+	ld a, $20
+	call $3945
+	res 5, [hl]
+.asm_3757f
+	call $39c9
+	ld hl, WasDefrostedText
+	jp FarBattleTextBox
+; 37588
+
+
+BattleCommand54: ; 37588
+; curse
+
+	ld de, BattleMonType1
+	ld bc, PlayerStatLevels
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_37599 ; 37591 $6
+	ld de, EnemyMonType1
+	ld bc, EnemyStatLevels
+.asm_37599
+	ld a, [de]
+	cp $8
+	jr z, .asm_375d7 ; 3759c $39
+	inc de
+	ld a, [de]
+	cp $8
+	jr z, .asm_375d7 ; 375a2 $33
+	ld a, [bc]
+	cp $d
+	jr c, .asm_375af ; 375a7 $6
+	inc bc
+	ld a, [bc]
+	cp $d
+	jr nc, .asm_3760a ; 375ad $5b
+.asm_375af
+	ld a, $1
+	ld [$c689], a
+	call $7e01
+	ld a, $2
+	call Function0x36532
+	call $4ffd
+	call $63e9
+	call ResetMiss
+	call $4ffd
+	call BattleCommand70
+	call $63b8
+	call ResetMiss
+	call $61b0
+	jp $63b8
+.asm_375d7
+	call CheckHiddenOpponent
+	jr nz, .asm_37604 ; 375da $28
+	call CheckSubstituteOpp
+	jr nz, .asm_37604 ; 375df $23
+	ld a, BATTLE_VARS_SUBSTATUS1_OPP
+	call GetBattleVarPair
+	bit 1, [hl]
+	jr nz, .asm_37604 ; 375e8 $1a
+	set 1, [hl]
+	call $7e01
+	ld hl, $4c9f
+	call $7e73
+	ld hl, $4c3f
+	call $7e73
+	call $3995
+	ld hl, PutACurseText
+	jp FarBattleTextBox
+.asm_37604
+	call $7e77
+	jp $734e
+.asm_3760a
+	ld b, $8
+	call $648f
+	call $7e77
+	ld hl, WontRiseAnymoreText
+	jp FarBattleTextBox
+; 37618
+
+
+BattleCommand55: ; 37618
+; protect
+
+	call Function0x3762c
+	ret c
+	ld a, BATTLE_VARS_SUBSTATUS1
+	call GetBattleVarPair
+	set 2, [hl]
+	call $7e01
+	ld hl, ProtectedItselfText
+	jp FarBattleTextBox
+; 3762c
+
+
+Function0x3762c: ; 3762c
+	ld de, $c679
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_37637
+
+	ld de, PlayerDamageTaken
+.asm_37637
+	call $6abf
+	jr nz, .asm_37665
+
+	ld a, $3
+	call CleanGetBattleVarPair
+	bit 4, a
+	jr nz, .asm_37665
+
+	ld b, $ff
+	ld a, [de]
+	ld c, a
+.asm_37649
+	ld a, c
+	and a
+	jr z, .asm_37656
+
+	dec c
+	srl b
+	ld a, b
+	and a
+	jr nz, .asm_37649
+
+	jr .asm_37665
+
+.asm_37656
+	call FarBattleRNG
+	and a
+	jr z, .asm_37656
+
+	dec a
+	cp b
+	jr nc, .asm_37665
+
+	ld a, [de]
+	inc a
+	ld [de], a
+	and a
+	ret
+
+.asm_37665
+	xor a
+	ld [de], a
+	call $7e77
+	call $734e
+	scf
+	ret
+; 3766f
+
+
+BattleCommand5a: ; 3766f
+; endure
+
+	call Function0x3762c
+	ret c
+; get substatus1
+	ld a, BATTLE_VARS_SUBSTATUS1
+	call GetBattleVarPair
+	set 5, [hl] ; endure
+	call $7e01
+	ld hl, BracedItselfText
+	jp FarBattleTextBox
+; 37683
+
+
+BattleCommand56: ; 37683
+; spikes
+
+	ld hl, $c700
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_3768e ; 37689 $3
+	ld hl, PlayerScreens
+.asm_3768e
+	bit 0, [hl]
+	jr nz, .asm_3769d ; 37690 $b
+	set 0, [hl]
+	call $7e01
+	ld hl, SpikesText
+	jp FarBattleTextBox
+.asm_3769d
+	jp Function0x37354
+; 376a0
+
+
+BattleCommand57: ; 376a0
+; foresight
+
+	ld a, [AttackMissed]
+	and a
+	jr nz, .asm_376bf ; 376a4 $19
+	call CheckHiddenOpponent
+	jr nz, .asm_376bf ; 376a9 $14
+	ld a, BATTLE_VARS_SUBSTATUS1_OPP
+	call GetBattleVarPair
+	bit 3, [hl]
+	jr nz, .asm_376bf ; 376b2 $b
+	set 3, [hl]
+	call $7e01
+	ld hl, IdentifiedText
+	jp FarBattleTextBox
+.asm_376bf
+	jp Function0x37354
+; 376c2
+
+
+BattleCommand58: ; 376c2
+; perishsong
+
+	ld hl, PlayerSubStatus1
+	ld de, EnemySubStatus1
+	bit 4, [hl]
+	jr z, .asm_376d1 ; 376ca $5
+	ld a, [de]
+	bit 4, a
+	jr nz, .asm_376f2 ; 376cf $21
+.asm_376d1
+	bit 4, [hl]
+	jr nz, .asm_376dc ; 376d3 $7
+	set 4, [hl]
+	ld a, $4
+	ld [PlayerPerishCount], a
+.asm_376dc
+	ld a, [de]
+	bit 4, a
+	jr nz, .asm_376e9 ; 376df $8
+	set 4, a
+	ld [de], a
+	ld a, $4
+	ld [$c67f], a
+.asm_376e9
+	call $7e01
+	ld hl, StartPerishText
+	jp FarBattleTextBox
+.asm_376f2
+	call $7e77
+	jp $734e
+; 376f8
+
+
+BattleCommand59: ; 376f8
+; startsandstorm
+
+	ld a, [Weather]
+	cp WEATHER_SANDSTORM
+	jr z, .asm_37712
+	ld a, WEATHER_SANDSTORM
+	ld [Weather], a
+	ld a, 5
+	ld [WeatherCount], a
+	call $7e01
+	ld hl, SandstormBrewedText
+	jp FarBattleTextBox
+.asm_37712
+	call $7e77
+	jp $734e
+; 37718
+
+
+BattleCommand5b: ; 37718
+; checkcurl
+
+	ld de, $c672
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_37723 ; 3771e $3
+	ld de, $c67a
+.asm_37723
+	ld a, BATTLE_VARS_SUBSTATUS1
+	call CleanGetBattleVarPair
+	bit 6, a
+	jr z, .asm_37731 ; 3772a $5
+	ld b, $4
+	jp $7e8c
+.asm_37731
+	xor a
+	ld [de], a
+	ret
+; 37734
+
+
+BattleCommand5c: ; 37734
+; rolloutpower
+
+	ld a, BATTLE_VARS_STATUS
+	call CleanGetBattleVarPair
+	and $7
+	ret nz
+	ld hl, $c672
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_37747 ; 37742 $3
+	ld hl, $c67a
+.asm_37747
+	ld a, [hl]
+	and a
+	jr nz, .asm_37750 ; 37749 $5
+	ld a, $1
+	ld [$c73e], a
+.asm_37750
+	ld a, [AttackMissed]
+	and a
+	jr z, .asm_3775e ; 37754 $8
+	ld a, BATTLE_VARS_SUBSTATUS1
+	call GetBattleVarPair
+	res 6, [hl]
+	ret
+.asm_3775e
+	inc [hl]
+	ld a, [hl]
+	ld b, a
+	cp $5
+	jr c, .asm_3776e ; 37763 $9
+	ld a, BATTLE_VARS_SUBSTATUS1
+	call GetBattleVarPair
+	res 6, [hl]
+	jr .asm_37775 ; 3776c $7
+.asm_3776e
+	ld a, BATTLE_VARS_SUBSTATUS1
+	call GetBattleVarPair
+	set 6, [hl]
+.asm_37775
+	ld a, BATTLE_VARS_SUBSTATUS2
+	call CleanGetBattleVarPair
+	bit 0, a
+	jr z, .asm_3777f ; 3777c $1
+	inc b
+.asm_3777f
+	dec b
+	jr z, .asm_37790 ; 37780 $e
+	ld hl, CurDamage + 1
+	sla [hl]
+	dec hl
+	rl [hl]
+	jr nc, .asm_3777f ; 3778a $f3
+	ld a, $ff
+	ld [hli], a
+	ld [hl], a
+.asm_37790
+	ret
+; 37791
+
+
+BattleCommand5d: ; 37791
+; unused
+	ret
+; 37792
+
+
+BattleCommand5e: ; 37792
+; furycutter
+
+	ld hl, $c678
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_3779d ; 37798 $3
+	ld hl, $c680
+.asm_3779d
+	ld a, [AttackMissed]
+	and a
+	jp nz, Function0x377be
+	inc [hl]
+	ld a, [hl]
+	ld b, a
+	cp $6
+	jr c, .asm_377ad ; 377a9 $2
+	ld b, $5
+.asm_377ad
+	dec b
+	ret z
+	ld hl, CurDamage + 1
+	sla [hl]
+	dec hl
+	rl [hl]
+	jr nc, .asm_377ad ; 377b7 $f4
+	ld a, $ff
+	ld [hli], a
+	ld [hl], a
+	ret
+; 377be
+
+
+Function0x377be: ; 377be
+	push hl
+
+	ld hl, $c678
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_377ca
+	ld hl, $c680
+
+.asm_377ca
+	xor a
+	ld [hl], a
+
+	pop hl
+	ret
+; 377ce
+
+
+BattleCommand5f: ; 377ce
+; attract
+	ld a, [AttackMissed]
+	and a
+	jr nz, .asm_377f2
+	call Function0x377f5
+	jr c, .asm_377f2
+	call CheckHiddenOpponent
+	jr nz, .asm_377f2
+	ld a, BATTLE_VARS_SUBSTATUS1_OPP
+	call GetBattleVarPair
+	bit 7, [hl]
+	jr nz, .asm_377f2
+
+	set 7, [hl]
+	call $7e01
+
+; 'fell in love!'
+	ld hl, FellInLoveText
+	jp FarBattleTextBox
+
+.asm_377f2
+	jp Function0x37354
+; 377f5
+
+
+Function0x377f5: ; 377f5
+	ld a, 0
+	call BattlePartyAttr
+	ld a, [hl]
+	ld [CurPartySpecies], a
+
+	ld a, [CurBattleMon]
+	ld [CurPartyMon], a
+	xor a
+	ld [MonType], a
+
+	ld a, $14
+	ld hl, $4bdd
+	rst FarCall
+	jr c, .asm_37849
+
+	ld b, 1
+	jr nz, .asm_37815
+	dec b
+
+.asm_37815
+	push bc
+	ld a, [TempEnemyMonSpecies]
+	ld [CurPartySpecies], a
+	ld hl, EnemyMonAtkDefDV
+	ld a, [EnemySubStatus5]
+	bit 3, a
+	jr z, .asm_37829
+	ld hl, $c6f2
+
+.asm_37829
+	ld a, [hli]
+	ld [$d123], a
+	ld a, [hl]
+	ld [$d124], a
+	ld a, $3
+	ld [MonType], a
+	ld a, $14
+	ld hl, $4bdd
+	rst FarCall
+	pop bc
+	jr c, .asm_37849
+
+	ld a, 1
+	jr nz, .asm_37844
+	dec a
+
+.asm_37844
+	xor b
+	jr z, .asm_37849
+
+	and a
+	ret
+
+.asm_37849
+	scf
+	ret
+; 3784b
+
+
+BattleCommand60: ; 3784b
+; checkhappiness
+	push bc
+	ld hl, BattleMonHappiness
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_37857 ; 37852 $3
+	ld hl, EnemyMonHappiness
+.asm_37857
+	xor a
+	ld [$ffb4], a
+	ld [$ffb5], a
+	ld a, [hl]
+	ld [$ffb6], a
+	ld a, $a
+	ld [$ffb7], a
+	call $3119
+	ld a, $19
+	ld [$ffb7], a
+	ld b, $4
+	call $3124
+	ld a, [$ffb6]
+	ld d, a
+	pop bc
+	ret
+; 37874
+
+
+BattleCommand61: ; 37874
+; present
+
+	ld a, [InLinkBattle]
+	cp $3
+	jr z, .asm_3787d ; 37879 $2
+	push bc
+	push de
+.asm_3787d
+	call $46d2
+	ld a, [InLinkBattle]
+	cp $3
+	jr z, .asm_37889 ; 37885 $2
+	pop de
+	pop bc
+.asm_37889
+	ld a, [$d265]
+	and a
+	jp z, $7e77
+	ld a, [AttackMissed]
+	and a
+	jp nz, $7e77
+	push bc
+	call FarBattleRNG
+	ld b, a
+	ld hl, .table_37907
+	ld c, 0
+.asm_378a1
+	ld a, [hli]
+	cp $ff
+	jr z, .asm_378b7 ; 378a4 $11
+	cp b
+	jr nc, .asm_378ad ; 378a7 $4
+	inc c
+	inc hl
+	jr .asm_378a1 ; 378ab $f4
+.asm_378ad
+	ld a, c
+	ld [$c689], a
+	call $7de9
+	ld d, [hl]
+	pop bc
+	ret
+.asm_378b7
+	pop bc
+	ld a, $3
+	ld [$c689], a
+	call $7e01
+	call $4ffd
+	ld hl, $5246
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_378ce ; 378c9 $3
+	ld hl, $5251
+.asm_378ce
+	ld a, $e
+	rst FarCall
+	jr c, .asm_378f3 ; 378d1 $20
+	ld hl, $4c8e
+	call $7e73
+	call $4ffd
+	ld hl, $4cef
+	call $7e73
+	call $4ffd
+	ld hl, RegainedHealthText
+	call FarBattleTextBox
+	call $4ffd
+	call $398e
+	jr .asm_37904 ; 378f1 $11
+.asm_378f3
+	call $4ffd
+	call $7ed5
+	jr nc, .asm_37904 ; 378f9 $9
+	call $7e77
+	ld hl, RefusedGiftText
+	call FarBattleTextBox
+.asm_37904
+	jp EndMoveEffect
+
+.table_37907
+	db $66,  40
+	db $b3,  80
+	db $cc, 120
+	db $ff
+; 3790e
+
+
+BattleCommand63: ; 3790e
+; checkfrustration
+
+	push bc
+	ld hl, BattleMonHappiness
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_3791a ; 37915 $3
+	ld hl, EnemyMonHappiness
+.asm_3791a
+	ld a, $ff
+	sub [hl]
+	ld [$ffb6], a
+	xor a
+	ld [$ffb4], a
+	ld [$ffb5], a
+	ld a, $a
+	ld [$ffb7], a
+	call $3119
+	ld a, $19
+	ld [$ffb7], a
+	ld b, $4
+	call $3124
+	ld a, [$ffb6]
+	ld d, a
+	pop bc
+	ret
+; 37939
+
+
+BattleCommand64: ; 37939
+; safeguard
+
+	ld hl, PlayerScreens
+	ld de, $c701
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_3794a ; 37942 $6
+	ld hl, $c700
+	ld de, $c705
+.asm_3794a
+	bit 2, [hl]
+	jr nz, .asm_3795c ; 3794c $e
+	set 2, [hl]
+	ld a, $5
+	ld [de], a
+	call $7e01
+	ld hl, CoveredByVeilText
+	jp FarBattleTextBox
+.asm_3795c
+	call $7e77
+	jp $734e
+; 37962
+
+
+Function0x37962: ; 37962
+	push hl
+	ld hl, $c700
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_3796e
+	ld hl, PlayerScreens
+
+.asm_3796e
+	bit 2, [hl]
+	pop hl
+	ret
+; 37972
+
+
+BattleCommand65: ; 37972
+	ld hl, $c700
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_3797d ; 37978 $3
+	ld hl, PlayerScreens
+.asm_3797d
+	bit 2, [hl]
+	ret z
+	ld a, $1
+	ld [AttackMissed], a
+	call $7e80
+	ld hl, SafeguardProtectText
+	call FarBattleTextBox
+	jp EndMoveEffect
+; 37991
+
+
+BattleCommand66: ; 37991
+; getmagnitude
+
+	push bc
+	call FarBattleRNG
+	ld b, a
+	ld hl, .Magnitudes
+.asm_37999
+	ld a, [hli]
+	cp b
+	jr nc, .asm_379a1 ; 3799b $4
+	inc hl
+	inc hl
+	jr .asm_37999 ; 3799f $f8
+.asm_379a1
+	ld d, [hl]
+	push de
+	inc hl
+	ld a, [hl]
+	ld [$d265], a
+	call $7e80
+	ld hl, MagnitudeText
+	call FarBattleTextBox
+	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
+
+
+BattleCommand67: ; 379c9
+; batonpass
+
+	ld a, [hBattleTurn]
+	and a
+	jp nz, .Enemy
+
+	call Function0x37ae9
+	jp z, $7aab
+
+	call $399c
+	call $7e01
+
+	ld c, 50
+	call DelayFrames
+
+	call $1d6e
+
+	ld a, $f
+	ld hl, $52f7
+	rst FarCall
+
+	ld a, $f
+	ld hl, $5380
+	rst FarCall
+
+	call $3317
+
+	ld a, $f
+	ld hl, $6d9f
+	rst FarCall
+
+	call $1c17
+	call $300b
+
+	ld hl, $c4a1
+	ld bc, $040a
+	call ClearBox
+
+	ld b, 1
+	call $3340
+	call $32f9
+	call $7a67
+
+	ld a, $f
+	ld hl, $52e0
+	rst FarCall
+
+	jp c, EndMoveEffect
+
+	ld hl, $6459
+	call $7e73
+	call $7ab1
+
+	ret
+
+.Enemy
+	ld a, [IsInBattle]
+	dec a
+	jp z, $7aab
+
+	call $7af6
+	jp z, $7aab
+
+	call $39b0
+	call $7e01
+	call $7a82
+
+	ld a, $f
+	ld hl, $52e0
+	rst FarCall
+	jp c, $52a3
+
+	xor a
+	ld [$c718], a
+
+	ld hl, $5517
+	call $7e73
+
+	ld hl, $557a
+	call $7e73
+
+	ld a, 1
+	ld [$d265], a
+
+	ld hl, $6cab
+	call $7e73
+
+	ld hl, $5c23
+	call $7e73
+
+	jr Function0x37ab1
+
+	ld a, [InLinkBattle]
+	and a
+	ret z
+
+	ld a, 1
+	ld [$d0ec], a
+
+	call $1d6e
+
+	ld hl, $68e4
+	call $7e73
+
+	call $1c17
+
+	xor a
+	ld [$d0ec], a
+
+	ret
+; 37a82
+
+	ld a, [InLinkBattle]
+	and a
+	ret z
+
+	call $1d6e
+	ld hl, $68e4
+	call $7e73
+	ld a, [OTPartyCount]
+	add $4
+	ld b, a
+	ld a, [$d430]
+	cp $4
+	jr c, .asm_37aa0
+
+	cp b
+	jr c, .asm_37aa8
+
+.asm_37aa0
+	ld a, [CurOTMon]
+	add $4
+	ld [$d430], a
+.asm_37aa8
+	jp $1c17
+	call $7e77
+	jp $734e
+
+
+Function0x37ab1: ; 37ab1
+	ld a, $a
+	call CleanGetBattleVarPair
+	and $7
+	jr nz, .asm_37ac1
+	ld a, $0
+	call GetBattleVarPair
+	res 0, [hl]
+
+.asm_37ac1
+	call $72e7
+	ld hl, PlayerSubStatus1
+	res 7, [hl]
+	ld hl, EnemySubStatus1
+	res 7, [hl]
+	ld hl, PlayerSubStatus5
+	ld a, $4
+	call GetBattleVarPair
+	res 3, [hl]
+	res 4, [hl]
+	ld a, $13
+	call GetBattleVarPair
+	ld [hl], $0
+	xor a
+	ld [$c730], a
+	ld [$c731], a
+	ret
+; 37ae9
+
+
+Function0x37ae9: ; 37ae9
+	ld hl, PartyMon1CurHP
+	ld a, [PartyCount]
+	ld d, a
+	ld a, [CurBattleMon]
+	ld e, a
+	jr .asm_37b01
+
+	ld hl, OTPartyMon1CurHP
+	ld a, [OTPartyCount]
+	ld d, a
+	ld a, [CurOTMon]
+	ld e, a
+.asm_37b01
+	xor a
+	ld b, a
+	ld c, a
+.asm_37b04
+	ld a, c
+	cp d
+	jr z, .asm_37b1a
+
+	cp e
+	jr z, .asm_37b11
+
+	ld a, [hli]
+	or b
+	ld b, a
+	ld a, [hld]
+	or b
+	ld b, a
+.asm_37b11
+	push bc
+	ld bc, $0030
+	add hl, bc
+	pop bc
+	inc c
+	jr .asm_37b04
+
+.asm_37b1a
+	ld a, b
+	and a
+	ret
+; 37b1d
+
+
+BattleCommand68: ; 37b1d
+	ld hl, $c711
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_37b28 ; 37b23 $3
+	ld hl, $c710
+.asm_37b28
+	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
+
+
+BattleCommand69: ; 37b39
+; clearhazards
+
+	ld a, BATTLE_VARS_SUBSTATUS4
+	call GetBattleVarPair
+	bit 7, [hl]
+	jr z, .asm_37b4a ; 37b40 $8
+	res 7, [hl]
+	ld hl, ShedLeechSeedText
+	call FarBattleTextBox
+.asm_37b4a
+	ld hl, PlayerScreens
+	ld de, $c730
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_37b5b ; 37b53 $6
+	ld hl, $c700
+	ld de, $c731
+.asm_37b5b
+	bit 0, [hl]
+	jr z, .asm_37b69 ; 37b5d $a
+	res 0, [hl]
+	ld hl, BlewSpikesText
+	push de
+	call FarBattleTextBox
+	pop de
+.asm_37b69
+	ld a, [de]
+	and a
+	ret z
+	xor a
+	ld [de], a
+	ld hl, ReleasedByText
+	jp FarBattleTextBox
+; 37b74
+
+
+BattleCommand6a: ; 37b74
+; healmorn
+	ld b, MORN
+	jr BattleCommand6a6c
+; 37b78
+
+BattleCommand6b: ; 37b78
+; healday
+	ld b, DAY
+	jr BattleCommand6a6c
+; 37b7c
+
+BattleCommand6c: ; 37b7c
+; healnite
+	ld b, NITE
+	; fallthrough
+; 37b7e
+
+BattleCommand6a6c: ; 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, [InLinkBattle]
+	and a
+	jr nz, .Weather
+
+	ld a, [TimeOfDay]
+	cp b
+	jr z, .Weather
+	dec c
+
+.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 $7e01
+	call $4ffd
+
+	ld hl, $4cef
+	ld a, $f
+	rst FarCall ; callab 3ccef
+
+	call $4ffd
+	call $3995
+
+; 'regained health!'
+	ld hl, RegainedHealthText
+	jp FarBattleTextBox
+
+.Full
+	call $7e77
+
+; 'hp is full!'
+	ld hl, HPIsFullText
+	jp FarBattleTextBox
+
+.Multipliers
+	dw GetEighthMaxHP
+	dw GetQuarterMaxHP
+	dw GetHalfMaxHP
+	dw GetMaxHP
+; 37be8
+
+
+BattleCommand6d: ; 37be8
+	ld a, [AttackMissed]
+	and a
+	ret nz
+
+	ld a, $3e
+	ld hl, $7ced
+	rst FarCall ; callba 3e 7ced
+	ret
+; 37bf4
+
+
+BattleCommand6e: ; 37bf4
+; startrain
+	ld a, WEATHER_RAIN
+	ld [Weather], a
+	ld a, 5
+	ld [WeatherCount], a
+	call $7e01
+	ld hl, DownpourText
+	jp FarBattleTextBox
+; 37c07
+
+
+BattleCommand6f: ; 37c07
+; startsun
+	ld a, WEATHER_SUN
+	ld [Weather], a
+	ld a, 5
+	ld [WeatherCount], a
+	call $7e01
+	ld hl, SunGotBrightText
+	jp FarBattleTextBox
+; 37c1a
+
+
+BattleCommand95: ; 37c1a
+; bellydrum
+	call $61c8
+	ld a, [AttackMissed]
+	and a
+	jr nz, .asm_37c4f ; 37c21 $2c
+	ld hl, $4c9f
+	ld a, $f
+	rst FarCall
+	ld hl, $4cde
+	ld a, $f
+	rst FarCall
+	jr nc, .asm_37c4f ; 37c2f $1e
+	push bc
+	call $7e01
+	pop bc
+	ld hl, $4c3f
+	ld a, $f
+	rst FarCall
+	call $3995
+	ld a, $5
+.asm_37c41
+	push af
+	call $61c8
+	pop af
+	dec a
+	jr nz, .asm_37c41 ; 37c47 $f8
+	ld hl, BellyDrumText
+	jp FarBattleTextBox
+.asm_37c4f
+	call $7e77
+	jp $734e
+; 37c55
+
+
+BattleCommand96: ; 37c55
+; psychup
+
+	ld hl, EnemyStatLevels
+	ld de, PlayerStatLevels
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_37c64 ; 37c5e $4
+	push hl
+	ld h, d
+	ld l, e
+	pop de
+.asm_37c64
+	push hl
+	ld b, $8
+.asm_37c67
+	ld a, [hli]
+	cp $7
+	jr nz, .asm_37c76 ; 37c6a $a
+	dec b
+	jr nz, .asm_37c67 ; 37c6d $f8
+	pop hl
+	call $7e77
+	jp $734e
+.asm_37c76
+	pop hl
+	ld b, $8
+.asm_37c79
+	ld a, [hli]
+	ld [de], a
+	inc de
+	dec b
+	jr nz, .asm_37c79 ; 37c7d $fa
+	ld a, [hBattleTurn]
+	and a
+	jr nz, .asm_37c89 ; 37c82 $5
+	call Function0x365d7
+	jr .asm_37c8c ; 37c87 $3
+.asm_37c89
+	call Function0x365fd
+.asm_37c8c
+	call $7e01
+	ld hl, CopiedStatsText
+	jp FarBattleTextBox
+; 37c95
+
+
+BattleCommand9a: ; 37c95
+; mirrorcoat
+
+	ld a, $1
+	ld [AttackMissed], a
+	ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
+	call CleanGetBattleVarPair
+	and a
+	ret z
+	ld b, a
+	ld hl, $45ec
+	ld a, $f
+	rst FarCall
+	ld a, b
+	cp $90
+	ret z
+	call $4833
+	ld a, [$d265]
+	and a
+	ret z
+	call Function0x36abf
+	ret z
+	ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
+	call CleanGetBattleVarPair
+	dec a
+	ld de, StringBuffer1
+	call GetMoveData
+	ld a, [$d075]
+	and a
+	ret z
+	ld a, [$d076]
+	cp $14
+	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, .asm_37ce1 ; 37cdb $4
+	ld a, $ff
+	ld [hli], a
+	ld [hl], a
+.asm_37ce1
+	xor a
+	ld [AttackMissed], a
+	ret
+; 37ce6
+
+
+BattleCommand9d: ; 37ce6
+; checkminimize
+
+	ld hl, $c6fa
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_37cf1 ; 37cec $3
+	ld hl, $c6fe
+.asm_37cf1
+	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
+
+
+BattleCommand9e: ; 37d02
+; skipsuncharge
+	ld a, [Weather]
+	cp WEATHER_SUN
+	ret nz
+	ld b, $39
+	jp $7e8c
+; 37d0d
+
+
+BattleCommand9b: ; 37d0d
+	ld hl, $c71d
+	ld de, $c727
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_37d1e ; 37d16 $6
+	ld hl, $c71e
+	ld de, $c729
+.asm_37d1e
+	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, $9c
+	jp $7e8c
+; 37d34
+
+BattleCommand9c: ; 37d34
+; futuresight
+
+	call Function0x34548
+	jr nz, .asm_37d4b ; 37d37 $12
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call CleanGetBattleVarPair
+	ld b, a
+	ld a, BATTLE_VARS_LAST_COUNTER_MOVE
+	call GetBattleVarPair
+	ld [hl], b
+	ld a, BATTLE_VARS_LAST_MOVE
+	call GetBattleVarPair
+	ld [hl], b
+.asm_37d4b
+	ld hl, $c71d
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_37d56 ; 37d51 $3
+	ld hl, $c71e
+.asm_37d56
+	ld a, [hl]
+	and a
+	jr nz, .asm_37d87 ; 37d58 $2d
+	ld a, $4
+	ld [hl], a
+	call BattleCommand0a
+	call $7e80
+	ld hl, ForesawAttackText
+	call FarBattleTextBox
+	call BattleCommand0c
+	ld de, $c727
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_37d77 ; 37d72 $3
+	ld de, $c729
+.asm_37d77
+	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
+.asm_37d87
+	pop bc
+	call ResetDamage
+	call $7e77
+	call $734e
+	jp EndMoveEffect
+; 37d94
+
+
+BattleCommand9f: ; 37d94
+; thunderaccuracy
+
+	ld a, BATTLE_VARS_MOVE_TYPE
+	call GetBattleVarPair
+	inc hl
+	ld a, [Weather]
+	cp WEATHER_RAIN
+	jr z, .asm_37da7 ; 37d9f $6
+	cp WEATHER_SUN
+	ret nz
+	ld [hl], $80
+	ret
+.asm_37da7
+	ld [hl], $ff
+	ret
+; 37daa
+
+
+CheckHiddenOpponent: ; 37daa
+	ld a, BATTLE_VARS_SUBSTATUS3_OPP
+	call CleanGetBattleVarPair
+	and $60 ; fly | dig
+	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 GetItem
+; 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 GetItem
+; 37dd0
+
+
+GetItem: ; 37dd0
+; Return the effect of item b in bc.
+	ld a, b
+	and a
+	ret z
+
+	push hl
+	ld hl, $67c3 ; Items
+	dec a
+	ld c, a
+	ld b, 0
+	ld a, 7
+	call AddNTimes
+	ld a, $1 ; BANK(Items)
+	call GetFarHalfword
+	ld b, l
+	ld c, h
+	pop hl
+	ret
+; 37de9
+
+
+INCBIN "baserom.gbc", $37de9, $37e80 - $37de9
+
+
+BattleCommandaa: ; 37e80
+; wait
+; Wait 40 frames.
+	ld c, 40
+	jp DelayFrames
+; 37e85
+
+
+BattleCommand38: ; 37e85
+; duped out
+; Used in multi-hit moves.
+	ld hl, .text
+	jp BattleTextBox
+.text
+	db "@"
+; 37e8c
+
+
+INCBIN "baserom.gbc", $37e8c, $37ead - $37e8c
+
+
+GetMoveData: ; 37ead
+; Get move struct a.
+	ld hl, Moves
+	ld bc, Move1 - Move0
+	call AddNTimes
+	ld a, Bank(Moves)
+	jp FarCopyBytes
+; 37ebb
+
+INCBIN "baserom.gbc", $37ebb, $37ee2 - $37ebb
+
+
+
--- a/main.asm
+++ b/main.asm
@@ -1126,14 +1126,34 @@
 ; 0xeba
 
 
-INCBIN "baserom.gbc",$eba,$fc8 - $eba
+INCBIN "baserom.gbc",$eba,$fb6 - $eba
 
 
+ClearBox: ; fb6
+; Fill a c*b box at hl with blank tiles.
+
+	ld a, " "
+.y
+	push bc
+	push hl
+.x
+	ld [hli], a
+	dec c
+	jr nz, .x
+	pop hl
+	ld bc, 20 ; screen width
+	add hl, bc
+	pop bc
+	dec b
+	jr nz, .y
+	ret
+; fc8
+
 ClearTileMap: ; fc8
-; Fill the tile map with blank tiles
+; Fill TileMap with blank tiles
 	ld hl, TileMap
-	ld a, $7f ; blank tile
-	ld bc, 360 ; length of TileMap
+	ld a, " "
+	ld bc, 360 ; screen dimensions 20*18
 	call ByteFill
 	
 ; We aren't done if the LCD is on
@@ -3271,8 +3291,10 @@
 	ret
 ; 0x3420
 
+
 INCBIN "baserom.gbc",$3420,$3468 - $3420
 
+
 GetItemName: ; 3468
 	push hl
 	push bc
@@ -3291,10 +3313,31 @@
 	pop bc
 	pop hl
 	ret
-; 0x3487
+; 3487
 
-INCBIN "baserom.gbc",$3487,$3856 - $3487
 
+INCBIN "baserom.gbc", $3487, $34f8 - $3487
+
+
+GetMoveName: ; 34f8
+	push hl
+; move name
+	ld a, $2 ; move names
+	ld [$cf61], a
+; move id
+	ld a, [$d265]
+	ld [$cf60], a
+
+	call GetName
+	ld de, StringBuffer1
+	pop hl
+	ret
+; 350c
+
+
+INCBIN "baserom.gbc", $350c, $3856 - $350c
+
+
 GetBaseStats: ; 3856
 	push bc
 	push de
@@ -3483,8 +3526,27 @@
 	jp AddNTimes
 ; 392d
 
-INCBIN "baserom.gbc", $392d, $397d - $392d
 
+INCBIN "baserom.gbc", $392d, $395d - $392d
+
+
+BattlePartyAttr: ; 395d
+; Get attribute a from the active monster's party struct.
+	push bc
+	ld c, a
+	ld b, 0
+	ld hl, PartyMons
+	add hl, bc
+	ld a, [CurBattleMon]
+	call GetPartyLocation
+	pop bc
+	ret
+; 396d
+
+
+INCBIN "baserom.gbc", $396d, $397d - $396d
+
+
 ResetDamage: ; 397d
 	xor a
 	ld [CurDamage], a
@@ -5666,9 +5728,17 @@
 	db $98, $88 ; mysticalman
 ; 2715c
 
-INCBIN "baserom.gbc",$2715c,$27a2d - $2715c
+INCBIN "baserom.gbc", $2715c, $271f4 - $2715c
 
+MoveEffectsPointers: ; 271f4
 
+INCBIN "baserom.gbc", $271f4, $2732e - $271f4
+
+MoveEffects: ; 2732e
+
+INCBIN "baserom.gbc", $2732e, $27a2d - $2732e
+
+
 SECTION "bankA",DATA,BANK[$A]
 
 INCBIN "baserom.gbc",$28000,$2a2a0 - $28000
@@ -6006,15 +6076,9 @@
 
 SECTION "bankD",DATA,BANK[$D]
 
-INCBIN "baserom.gbc",$34000,$34bb1 - $34000
+INCLUDE "battle/effect_commands.asm"
 
-TypeMatchup: ; 34bb1
-INCLUDE "battle/type_matchup.asm"
-; 34cfd
 
-INCBIN "baserom.gbc",$34cfd,$37ee2 - $34cfd
-
-
 SECTION "bankE",DATA,BANK[$E]
 
 INCBIN "baserom.gbc",$38000,$39999 - $38000
@@ -6027,8 +6091,92 @@
 
 SECTION "bankF",DATA,BANK[$F]
 
-INCBIN "baserom.gbc",$3C000,$3d123 - $3C000
+INCBIN "baserom.gbc", $3c000, $3cc83 - $3c000
 
+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 reslut
+	srl b
+	rr c
+
+; floor = 1
+	ld a, c
+	or b
+	jr nz, .end
+	inc c
+.end
+	ret
+; 3ccac
+
+
+GetMaxHP: ; 3ccac
+; output: bc, $d1ea-b
+
+; player
+	ld hl, BattleMonMaxHP
+
+; whose turn?
+	ld a, [hBattleTurn]
+	and a
+	jr z, .gethp
+
+; enemy
+	ld hl, EnemyMonMaxHP
+
+.gethp
+	ld a, [hli]
+	ld [$d1eb], a
+	ld b, a
+
+	ld a, [hl]
+	ld [$d1ea], a
+	ld c, a
+	ret
+; 3ccc2
+
+
+INCBIN "baserom.gbc", $3ccc2, $3d123 - $3ccc2
+
+
 ; These functions check if the current opponent is a gym leader or one of a
 ; few other special trainers.
 
@@ -6894,9 +7042,16 @@
 	ret
 ; 0x3fd26
 
-INCBIN "baserom.gbc",$3fd26,$3fe86 - $3fd26
 
+	dw $0000 ; padding
 
+
+BattleCommandPointers: ; 3fd28
+
+INCLUDE "battle/effect_command_pointers.asm"
+
+
+
 SECTION "bank10",DATA,BANK[$10]
 
 INCBIN "baserom.gbc",$40000,$40c65-$40000
@@ -14626,7 +14781,366 @@
 ; japanese mystery gift gfx
 INCBIN "gfx/misc/mystery_gift_jp.2bpp"
 
-INCBIN "baserom.gbc",$105db0,$105ef6 - $105db0
+
+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
+
+; print actor name
+	text_jump _ActorNameText, BANK(_ActorNameText)
+	start_asm
+
+; ????
+	ld a, [hBattleTurn]
+	and a
+	jr nz, .start
+	
+; append used move list
+	ld a, [PlayerMoveAnimation]
+	call UpdateUsedMoves
+	
+.start
+; get address for last move
+	ld a, $13 ; last move
+	call GetBattleVarPair
+	ld d, h
+	ld e, l
+	
+; get address for last counter move
+	ld a, $11
+	call GetBattleVarPair
+	
+; get move animation (id)
+	ld a, $c ; move animation
+	call CleanGetBattleVarPair
+	ld [$d265], a
+	
+; check actor ????
+	push hl
+	callba Function0x34548
+	pop hl
+	jr nz, .grammar
+	
+; update last move
+	ld a, [$d265]
+	ld [hl], a
+	ld [de], a
+	
+.grammar
+	call GetMoveGrammar
+; $d265 now contains MoveGrammar
+	
+	
+; everything except 'instead' made redundant in localization
+
+; check obedience
+	ld a, [$c6f4]
+	and a
+	ld hl, UsedMove2Text
+	ret nz
+	
+; check move grammar
+	ld a, [$d265]
+	cp $3
+	ld hl, UsedMove2Text
+	ret c
+	ld hl, UsedMove1Text
+	ret
+; 105e04
+
+UsedMove1Text: ; 105e04
+	text_jump _UsedMove1Text, BANK(_UsedMove1Text)
+	start_asm
+	jr Function105e10
+; 105e0b
+
+UsedMove2Text: ; 105e0b
+	text_jump _UsedMove2Text, BANK(_UsedMove2Text)
+	start_asm
+; 105e10
+
+Function105e10: ; 105e10
+; check obedience
+	ld a, [$c6f4]
+	and a
+	jr z, GetMoveNameText
+; print "instead,"
+	ld hl, UsedInsteadText
+	ret
+; 105e1a
+
+UsedInsteadText: ; 105e1a
+	text_jump _UsedInsteadText, BANK(_UsedInsteadText)
+	start_asm
+; 105e1f
+
+GetMoveNameText: ; 105e1f
+	ld hl, MoveNameText
+	ret
+; 105e23
+
+MoveNameText: ; 105e23
+	text_jump _MoveNameText, BANK(_MoveNameText)
+	start_asm
+; 105e28
+
+GetUsedMoveTextEnder: ; 105e28
+; get start address
+	ld hl, .endusedmovetexts
+	
+; get move id
+	ld a, [$d265]
+	
+; 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, BANK(_EndUsedMove1Text)
+	db "@"
+; 105e48
+EndUsedMove2Text: ; 105e48
+	text_jump _EndUsedMove2Text, BANK(_EndUsedMove2Text)
+	db "@"
+; 105e4d
+EndUsedMove3Text: ; 105e4d
+	text_jump _EndUsedMove3Text, BANK(_EndUsedMove3Text)
+	db "@"
+; 105e52
+EndUsedMove4Text: ; 105e52
+	text_jump _EndUsedMove4Text, BANK(_EndUsedMove4Text)
+	db "@"
+; 105e57
+EndUsedMove5Text: ; 105e57
+	text_jump _EndUsedMove5Text, BANK(_EndUsedMove5Text)
+	db "@"
+; 105e5c
+
+
+GetMoveGrammar: ; 105e5c
+; store move grammar type in $d265
+
+	push bc
+; c = move id
+	ld a, [$d265]
+	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
+; $d265 now contains move grammar
+	ld a, b
+	ld [$d265], 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
+; loop 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
+
+
 
 HallOfFame2: ; 0x105ef6
 	ret
--- a/wram.asm
+++ b/wram.asm
@@ -604,7 +604,7 @@
 EnemyDamageTaken: ; c684
 	ds 2
 
-	ds 4
+	ds 5
 
 BattleScriptBuffer: ; c68a
 	ds 40
@@ -612,7 +612,7 @@
 BattleScriptBufferLoc: ; c6b2
 	ds 2
 
-	ds 25
+	ds 24
 
 PlayerStatLevels: ; c6cc
 ; 07 neutral