shithub: pokecrystal

Download patch

ref: 0e47273378b1f7f010e4d3e6dbab2a14dcc781ce
parent: a238e4bd55f7934a0201a2a523c739be70820760
parent: 6f6988e3d116b3d663235736ba9d9300cd3d4777
author: Bryan Bishop <kanzure@gmail.com>
date: Sat Apr 27 13:28:49 EDT 2013

Merge yenatch/master.

--- a/.gitignore
+++ b/.gitignore
@@ -26,8 +26,10 @@
 # for any of the poor souls with save game files in their working directory
 baserom.sgm
 baserom.sav
-pokered.sgm
-pokered.sav
+baserom.rtc
+pokecrystal.sgm
+pokecrystal.sav
+pokecrystal.rtc
 
 # for vim configuration
 # url: http://www.vim.org/scripts/script.php?script_id=441
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -1,5 +1,22 @@
-# Linux
+# Getting Started
 
+Compiling requires a certain Pokemon Crystal ROM:
+
+```
+Pokemon - Crystal Version (UE) (V1.0) [C][!].gbc
+md5: 9f2922b235a5eeb78d65594e82ef5dde
+```
+
+Save it as `baserom.gbc` in the repository.
+
+
+Feel free to ask us on nucleus.kafuka.org #skeetendo if something goes wrong (remember to tell where)!
+
+Don't know how to use IRC? Try [mibbit](http://chat.mibbit.com/?server=nucleus.kafuka.org&channel=#skeetendo).
+
+
+## Linux
+
 ```bash
 sudo apt-get install make gcc bison git python python-setuptools 
 
@@ -24,153 +41,38 @@
 
 # install python requirements
 pip install -r requirements.txt
-
-make clean && make
 ```
 
-# Windows
-
-Follow these instructions to install `pokecrystal` on Microsoft Windows. Once
-installed, you can run `make` to compile `main.asm` into a ROM.
-
-## Installing cygwin
-
-Cygwin provides a virtual linux environment on Windows systems. Just get
-`setup.exe`: http://cygwin.com/install.html
-
-During the install:
-
-  1. Keep the defaults.
-
-  2. It shouldn't matter which mirror you choose, but http://mirrors.kernel.org
-  seems to work.
-
-  3. Select the packages listed below.
-
-You'll be presented with a package selection screen. Select the following
-packages (hint: there's a search box).
-
-  1. `python` (installed by default)
-
-  2. `gcc` and `gcc-core` (under devel)
-
-  3. `byacc` (under devel)
-
-  4. `make` (under devel)
-
-  5. `wget` (under web)
-
-  6. `git` (under devel)
-
-  7. `mercurial` (optional, if you wish to work with pokered as well)
-
-Let cygwin finish the install.  Might take a sec while all packages are
-downloading.
-
-## Installing other requirements
-
-Launch cygwin (bash). Maybe you know your way around the linux terminal. If not, a
-crash course:
-
-```bash
-# list files in current directory
-ls
-
-# show current directory
-pwd
-
-# change directory
-cd /away/we/go
+To compile the ROM from ASM source:
 ```
-
-The next step is building `rgbds`, the GB assembler. Type:
-
-```bash
-# download rgbds source code
-git clone git://github.com/bentley/rgbds.git
-
-# compile rgbds
-cd rgbds
-YACC=byacc make
-
-# make rgbds accessible for all time
-export PATH=$PATH:`pwd`
-echo "export PATH=$PATH:`pwd`" >> ~/.bashrc
-
-# check if rgbasm is installed now
-which rgbasm
+make clean && make
 ```
 
-If that fails (it shouldn't), you can download binaries like so:
+That will take between 3 and 15 seconds, depending on your computer. If you see
+`cmp baserom.gbc pokecrystal.gbc` as the last line, the build was successful! Rejoice!
 
-```bash
-# download rgbds binaries
-wget http://diyhpl.us/~bryan/irc/pokered/rgbds/rgbds.zip --output-document=rgbds.zip
 
-# unzip
-unzip rgbds.zip
+## Windows
 
-# make rgbds accessible for all time
-export PATH=$PATH:`pwd`/rgbds
-echo "export PATH=$PATH:`pwd`/rgbds" >> ~/.bashrc
+Set up [GitHub for Windows](http://windows.github.com/) and clone this repository.
 
-# clean up that zip file
-rm rgbds.zip
-```
+If you haven't already, get [Python 2.7](http://www.python.org/ftp/python/2.7.3/python-2.7.3.msi) ([64-bit](http://www.python.org/ftp/python/2.7.3/python-2.7.3.amd64.msi)).
 
-The next step is to install `unittest2`, unless you installed python2.7
-earlier:
+Extract the following files from the [RGBDS](https://github.com/downloads/bentley/rgbds/rgbds-0.0.1.zip) package into the repository:
+`rgbasm.exe`
+`rgbds.exe`
+`rgbfix.exe`
+`rgblink.exe`
 
-```bash
-cd ~
-wget http://peak.telecommunity.com/dist/ez_setup.py
-python ez_setup.py
-easy_install unittest2
-```
+Install [make](http://gnuwin32.sourceforge.net/downlinks/make.php) for Windows.
 
-Now you should be able to build `pokecrystal` for the first time:
+To compile the ROM from ASM source, run `pokecrystal.bat`.
 
-```bash
-cd ~
-git clone git://github.com/kanzure/pokecrystal.git
-cd pokecrystal
-```
-
-The final requirement is downloading a certain Pokemon Crystal ROM:
-
-```
-Pokemon - Crystal Version (UE) (V1.0) [C][!].gbc
-md5: 9f2922b235a5eeb78d65594e82ef5dde
-```
-
-Save it as `C:\cygwin\home\(your username)\pokecrystal\baserom.gbc`. You can
-check the md5 of a file by typing `md5sum baserom.gbc`.
-
-To compile the ROM from ASM source, type:
-
-```bash
-make
-```
-
 That will take between 3 and 15 seconds, depending on your computer. If you see
-`cmp baserom.gbc pokecrystal.gbc` as the last line, the build was successful!
-Rejoice!
+`FC: no differences encountered`, the build was successful! Rejoice!
 
-Now you may try messing around with `main.asm`, or just do whatever you wanted
-to.
+Now you may try messing around with `main.asm`, or just do whatever you wanted to.
 
-To build again, you should use the following command:
 
-```bash
-make clean && make
-```
+# Contributions are welcome!
 
-Feel free to ask us on nucleus.kafuka.org #skeetendo if something goes wrong
-(remember to tell where)! Don't know how to use IRC? Try
-[mibbit](http://mibbit.com/) or something.
-
-# Contributing changes
-
-## Setting up a public git repo
-
-For those uninitiated with git-based collaboration, and who do not want to setup a server to host git repositories, use GitHub. Register on GitHub and follow [this tutorial to setup ssh keys](https://help.github.com/articles/generating-ssh-keys). Then go to [the pokecrystal repo](https://github.com/kanzure/pokecrystal) and click the giant "fork" button. This will bring you to a page with some instructions regarding `git remote` (follow these steps in your pokecrystal folder).
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,7 @@
 .SUFFIXES: .asm .tx .o .gbc .png .2bpp .lz
 
-TEXTFILES =	text/sweethoney.tx \
+TEXTFILES = \
+		text/sweethoney.tx \
 		text/phone/bill.tx \
 		text/phone/elm.tx \
 		text/phone/mom.tx \
@@ -10,7 +11,8 @@
 		text/common_3.tx \
 		main.tx
 
-VERTGFX =	gfx/pics/%.png \
+VERTGFX = \
+		gfx/pics/%.png \
 		gfx/trainers/%.png
 
 HORIZGFX =	$(filter-out gfx/%.png, $(VERTGFX))
@@ -24,10 +26,16 @@
 # so take care to reorganize accordingly
 
 all: pokecrystal.gbc
+	cmp baserom.gbc $<
 
+win: pokecrystal.gbc
+	fc baserom.gbc $<
+
 clean:
 	rm -f main.tx pokecrystal.o pokecrystal.gbc ${TEXTFILES}
 
+winclean:
+	del main.tx pokecrystal.o pokecrystal.gbc .\text\sweethoney.tx .\text\phone\bill.tx .\text\phone\elm.tx .\text\phone\mom.tx .\text\phone\trainers1.tx .\text\common.tx .\text\common_2.tx .\text\common_3.tx
 
 pokecrystal.o: pokecrystal.asm constants.asm wram.asm ${TEXTFILES}
 	rgbasm -o pokecrystal.o pokecrystal.asm
@@ -38,7 +46,6 @@
 pokecrystal.gbc: pokecrystal.o
 	rgblink -o $@ $<
 	rgbfix -Cjv -i BYTE -k 01 -l 0x33 -m 0x10 -p 0 -r 3 -t PM_CRYSTAL $@
-	cmp baserom.gbc $@
 
 
 lzs: ${VERTGFX} ${HORIZGFX}
@@ -51,8 +58,8 @@
 	cd extras && python gfx.py png-to-lz --front $@ $(OBJECT_DIRECTORY)/tiles.2bpp
 tiles.png:
 	cd extras && python gfx.py png-to-2bpp $@
-.png: ${VERTGFX}
+.png:: ${VERTGFX}
 	cd extras && python gfx.py png-to-lz --vert $@
-.png: ${HORIZGFX}
+.png:: ${HORIZGFX}
 	cd extras && python gfx.py png-to-lz $@
 
--- a/README.md
+++ b/README.md
@@ -4,65 +4,29 @@
 
 The source code in this project successfully converts back into a ROM image. All source code is meticulously commented.
 
+
 ## Base ROM
 
 The following ROM is required for compiling:
 
+```
 Pokemon - Crystal Version (UE) (V1.0) [C][!].gbc
-
 md5: 9f2922b235a5eeb78d65594e82ef5dde
+```
 
 Eventually this will not be necessary.
 
-## Installing
 
-Simple.
-
-``` bash
-sudo apt-get install make gcc bison git python python-setuptools 
-
-# unittest2 is required if using python2.6
-sudo easy_install unittest2
-sudo easy_install pip
-
-# download rgbds source code
-git clone git://github.com/bentley/rgbds.git
-
-# compile rgbds
-cd rgbds
-make
-sudo make install
-
-# check if rgbasm is installed now
-which rgbasm
-
-# download pokecrystal
-git clone https://github.com/kanzure/pokecrystal.git
-cd pokecrystal
-
-pip install -r requirements.txt
-
-make clean && make
-```
-
-Also, there are [Windows installation instructions](https://github.com/kanzure/pokecrystal/blob/master/INSTALL.md).
-
-## Assembling
-
-* To assemble, first install RGBDS and put it in your path. The version of RGBDS needed is [rgbds-linux](https://github.com/bentley/rgbds/).
-
-* Next, copy the Pokémon ROM to this directory as "baserom.gbc".
-
-* Then run "make" in your shell.
-
-* This will output a file named "pokecrystal.gbc".
-
 ## See also
 
 * disassembly of [Pokémon Red](http://bitbucket.org/iimarckus/pokered).
 
+
 ## Contributing
 
-* Hang out with us on IRC, nucleus.kafuka.org #skeetendo (you can [ use mibbit](http://chat.mibbit.com/) to this server)
+* Hang out with us on IRC: `nucleus.kafuka.org #skeetendo` (for example, by
+using [mibbit](http://chat.mibbit.com/)).
+
+* Are we missing something? Make a pull request! Contributions are welcome.
 
 * Tackle some [issues](https://github.com/kanzure/pokecrystal/issues)!
--- /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,11200 @@
+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 [AlreadyFailed], 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 CallBankF
+	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 ResetFuryCutterCount
+
+	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 Function0x37ece
+; 34216
+
+
+
+Function0x34216: ; 34216
+	call SwitchTurn
+	call CantMove
+	jp SwitchTurn
+; 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 CallBankF
+	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 BattleCommand62
+
+	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 BattleCommand0c
+
+	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 BattleCommand62
+
+	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 CallBankF
+
+	ld a, $1
+	ld [$ffd4], a
+
+	ld c, $1
+	call Function0x35d7e
+
+	jp BattleCommand0c
+; 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 Function0x3450c
+
+
+.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 Function0x3450c
+
+
+.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
+
+	; fallthrough
+; 3450c
+
+
+Function0x3450c: ; 3450c
+	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, IgnoredSleepingText
+	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 BattleCommandaa
+; get move effect
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call CleanGetBattleVarPair
+; continuous?
+	ld hl, .continuousmoves
+	ld de, 1
+	call IsInArray
+
+; 'has no pp left for [move]'
+	ld hl, HasNoPPLeftText
+	jr c, .print
+; 'but no pp is left for the move'
+	ld hl, NoPPLeftText
+.print
+	call FarBattleTextBox
+	ld b, 1
+	ret
+; 34602
+
+.continuousmoves ; 34602
+	db EFFECT_RAZOR_WIND
+	db EFFECT_SKY_ATTACK
+	db EFFECT_SKULL_BASH
+	db EFFECT_SOLARBEAM
+	db EFFECT_FLY
+	db EFFECT_ROLLOUT
+	db EFFECT_BIDE
+	db EFFECT_RAMPAGE
+	db $ff
+; 3460b
+
+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
+; triplekick
+
+	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
+
+; No overflow.
+	jr nc, .asm_346be
+	ld a, $ff
+	ld [hld], a
+	ld [hl], a
+	ret
+; 346cd
+
+
+BattleCommand4f: ; 346cd
+; kickcounter
+
+	ld hl, $c689
+	inc [hl]
+	ret
+; 346d2
+
+
+BattleCommand07: ; 346d2
+; stab
+	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, .go
+
+	ld hl, EnemyMonType1
+	ld a, [hli]
+	ld b, a
+	ld c, [hl]
+	ld hl, BattleMonType1
+	ld a, [hli]
+	ld d, a
+	ld e, [hl]
+
+.go
+	ld a, BATTLE_VARS_MOVE_TYPE
+	call GetBattleVarPair
+	ld [$d265], a
+
+	push hl
+	push de
+	push bc
+	callba DoWeatherModifiers
+	pop bc
+	pop de
+	pop hl
+
+	push de
+	push bc
+	callba DoBadgeTypeBoosts
+	pop bc
+	pop de
+
+	ld a, [$d265]
+	cp b
+	jr z, .stab
+	cp c
+	jr z, .stab
+
+	jr .asm_3473a
+
+.stab
+	ld hl, CurDamage + 1
+	ld a, [hld]
+	ld h, [hl]
+	ld l, a
+
+	ld b, h
+	ld c, l
+	srl b
+	rr c
+	add hl, bc
+
+	ld a, h
+	ld [CurDamage], a
+	ld a, l
+	ld [CurDamage + 1], a
+
+	ld hl, TypeModifier
+	set 7, [hl]
+
+.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, .end
+
+; foresight
+	cp $fe
+	jr nz, .asm_34757
+	ld a, BATTLE_VARS_SUBSTATUS1_OPP
+	call CleanGetBattleVarPair
+	bit 3, a
+	jr nz, .end
+
+	jr .asm_34743
+
+.asm_34757
+	cp b
+	jr nz, .asm_347b3
+	ld a, [hl]
+	cp d
+	jr z, .asm_34763
+	cp e
+	jr z, .asm_34763
+	jr .asm_347b3
+
+.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
+	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
+
+	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
+
+	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
+
+.end
+	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, Function0x347d3
+	ld hl, BattleMonType1
+
+	; fallthrough
+; 347d3
+
+
+Function0x347d3: ; 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
+
+
+Function0x3484e: ; 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 GetMoveAttr
+	and a
+	jr z, .asm_3489b ; 0x3486e $2b
+	inc hl
+	call GetMoveByte
+	ld hl, EnemyMonType1
+	call Function0x347d3
+	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 Function0x34931
+	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 Function0x34939
+	ld a, e
+	and a
+	jr nz, .asm_348d7 ; 0x348a9 $2c
+	call Function0x34939
+	jr .asm_348d7 ; 0x348ae $27
+.asm_348b0
+	ld a, [BattleMonType1]
+	ld b, a
+	ld hl, EnemyMonType1
+	call Function0x347d3
+	ld a, [$d265]
+	cp $b
+	jr c, .asm_348c4 ; 0x348bf $3
+	call Function0x34931
+.asm_348c4
+	ld a, [BattleMonType2]
+	cp b
+	jr z, .asm_348d7 ; 0x348c8 $d
+	call Function0x347d3
+	ld a, [$d265]
+	cp $b
+	jr c, .asm_348d7 ; 0x348d2 $3
+	call Function0x34931
+.asm_348d7
+	call Function0x348de
+	pop bc
+	pop de
+	pop hl
+	ret
+; 348de
+
+
+Function0x348de: ; 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 GetMoveAttr
+	and a
+	jr z, .loop
+
+	inc hl
+	call GetMoveByte
+	ld hl, BattleMonType1
+	call Function0x347d3
+	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 ; double down
+	cp $5
+	jr c, Function0x34931 ; down
+	cp $64
+	ret c
+	jr Function0x34939 ; up
+
+.doubledown
+	call Function0x34931
+	
+	; fallthrough
+; 34931
+
+
+Function0x34931: ; 34931
+	ld a, [$c716]
+	dec a
+	ld [$c716], a
+	ret
+; 34939
+
+
+Function0x34939: ; 34939
+	ld a, [$c716]
+	inc a
+	ld [$c716], a
+	ret
+; 34941
+
+
+Function0x34941: ; 34941
+	xor a
+	ld [$c717], a
+	call Function0x349f4
+	ret c
+
+	ld a, [EnemySubStatus1]
+	bit 4, a
+	jr z, .asm_34986
+
+	ld a, [$c67f]
+	cp $1
+	jr nz, .asm_34986
+
+	call Function0x349f4
+	call Function0x34b77
+	call Function0x34b20
+	call Function0x34a85
+
+	ld a, e
+	cp $2
+	jr nz, .asm_34971
+
+	ld a, [$c716]
+	add $30
+	ld [$c717], a
+	ret
+
+.asm_34971
+	call Function0x349f4
+	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 Function0x3484e
+	ld a, [$c716]
+	cp $b
+	ret nc
+
+	ld a, [LastEnemyCounterMove]
+	and a
+	jr z, .asm_349d2
+
+	call Function0x34a2a
+	ld a, [$c716]
+	and a
+	jr z, .asm_349d2
+
+	ld c, a
+	call Function0x34aa7
+	ld a, [$c716]
+	cp $ff
+	ret z
+
+	ld b, a
+	ld a, e
+	cp $2
+	jr z, .asm_349be
+
+	call Function0x3484e
+	ld a, [$c716]
+	cp $a
+	ret nc
+
+	ld a, b
+	add $10
+	ld [$c717], a
+	ret
+
+.asm_349be
+	ld c, $10
+	call Function0x3484e
+	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 Function0x3484e
+	ld a, [$c716]
+	cp $a
+	ret nc
+
+	call Function0x349f4
+	call Function0x34b77
+	call Function0x34b20
+	call Function0x34a85
+
+	ld a, e
+	cp $2
+	ret nz
+
+	ld a, [$c716]
+	add $10
+	ld [$c717], a
+	ret
+; 349f4
+
+
+Function0x349f4: ; 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, $30
+	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
+
+
+Function0x34a2a: ; 34a2a
+	ld hl, OTPartyMon1
+	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 GetMoveAttr
+	and a
+	jr z, .asm_34a77
+
+	inc hl
+	call GetMoveByte
+	ld hl, $d23d
+	call Function0x347d3
+	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
+; 34a85
+
+
+Function0x34a85: ; 34a85
+	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, $2f
+	add hl, bc
+	pop bc
+	dec e
+	jr nz, .asm_34a91
+
+	ld a, c
+	pop bc
+
+	and c
+	ld c, a
+
+	; fallthrough
+; 34aa7
+
+Function0x34aa7: ; 34aa7
+
+	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 GetMoveAttr
+	and a
+	jr z, .asm_34ae9
+
+	inc hl
+	call GetMoveByte
+	ld hl, BattleMonType1
+	call Function0x347d3
+	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
+
+
+Function0x34b20: ; 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 GetMoveAttr
+	and a
+	jr z, .asm_34b4a
+
+	inc hl
+	call GetMoveByte
+	jr .asm_34b5d
+
+.asm_34b4a
+	ld a, [BattleMonType1]
+	ld hl, $d23d
+	call Function0x347d3
+	ld a, [$d265]
+	cp $b
+	jr nc, .asm_34b6d
+	ld a, [BattleMonType2]
+
+.asm_34b5d
+	ld hl, $d23d
+	call Function0x347d3
+	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
+
+
+Function0x34b77: ; 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, ProtectingItselfText
+	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
+; effectchance
+
+	xor a
+	ld [$c70d], a
+	call CheckSubstituteOpp
+	jr nz, .failed
+
+	push hl
+	ld hl, PlayerMoveEffectChance
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_34ee1
+	ld hl, EnemyMoveEffectChance
+.asm_34ee1
+
+	call FarBattleRNG
+	cp [hl]
+	pop hl
+	ret c
+
+.failed
+	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 EFFECT_RAZOR_WIND
+	jr z, .asm_34f21
+	cp EFFECT_SKY_ATTACK
+	jr z, .asm_34f21
+	cp EFFECT_SKULL_BASH
+	jr z, .asm_34f21
+	cp EFFECT_SOLARBEAM
+	jr z, .asm_34f21
+	cp EFFECT_FLY
+	jr z, .asm_34f21
+
+.asm_34f18
+	call .Rampage
+	jr z, .asm_34f21
+
+	call Function0x34548
+	ret nz
+
+.asm_34f21
+	call Function0x37ed5
+	jr c, .asm_34f36
+
+	xor a
+	ld [$cfca], a
+	ld [FXAnimIDHi], a
+	inc a
+	ld [$c689], a
+	ld a, $a4
+	jp Function0x37e44
+
+.asm_34f36
+	call BattleCommanda7
+	jp BattleCommandaa
+
+.Rampage
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call CleanGetBattleVarPair
+	cp EFFECT_ROLLOUT
+	jr z, .asm_34f4d
+	cp EFFECT_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, BattleCommandaa
+
+	ld a, [hBattleTurn]
+	and a
+	ld de, PlayerRolloutCount
+	ld a, 1
+	jr z, .asm_34f76
+	ld de, EnemyRolloutCount
+	ld a, 4
+
+.asm_34f76
+	ld [$cfca], a
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call CleanGetBattleVarPair
+	cp EFFECT_MULTI_HIT
+	jr z, .asm_34fb0
+	cp EFFECT_CONVERSION
+	jr z, .asm_34fb0
+	cp EFFECT_DOUBLE_HIT
+	jr z, .asm_34fb0
+	cp EFFECT_TWINEEDLE
+	jr z, .asm_34fb0
+	cp EFFECT_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 Function0x37ec7
+.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, BattleCommandaa
+
+	xor a
+	jr BattleCommand91_92
+; 34fdb
+
+
+BattleCommand91: ; 34fdb
+	ld a, [AttackMissed]
+	and a
+	jp nz, BattleCommandaa
+
+	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
+
+
+SwitchTurn: ; 34ffd
+BattleCommand93: ; 34ffd
+; switchturn
+
+	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 Function0x37ed5
+	jp c, BattleCommanda6
+
+	xor a
+	ld [$cfca], a
+	ld [FXAnimIDHi], a
+	ld a, $2
+	ld [$c689], a
+	ld a, $a4
+	jp Function0x37e44
+; 35023
+
+
+BattleCommand0d: ; 35023
+; resulttext
+	ld a, [AttackMissed]
+	and a
+	ret z
+
+	call Function0x350e4
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call GetBattleVarPair
+
+	cp FLY
+	jr z, .asm_3504f ; 35032 $1b
+	cp DIG
+	jr z, .asm_3504f ; 35036 $17
+
+; Move effect:
+	inc hl
+	ld a, [hl]
+
+	cp EFFECT_MULTI_HIT
+	jr z, .asm_35049
+	cp EFFECT_DOUBLE_HIT
+	jr z, .asm_35049
+	cp EFFECT_TWINEEDLE
+	jr z, .asm_35049
+	jp EndMoveEffect
+
+.asm_35049
+	call BattleCommand0c
+	jp EndMoveEffect
+
+.asm_3504f
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVarPair
+	res 5, [hl]
+	res 6, [hl]
+	call Function0x37ece
+	jp EndMoveEffect
+; 3505e
+
+
+BattleCommand0e: ; 3505e
+; checkfaint
+
+	ld a, BATTLE_VARS_SUBSTATUS1_OPP
+	call CleanGetBattleVarPair
+	bit 5, a
+	jr z, .asm_35072 ; 35065 $b
+	call BattleCommand4b
+	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 BattleCommand4b
+	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, EnduredText
+	jp FarBattleTextBox
+
+.asm_350ab
+	call GetOpponentItem
+	ld a, [hl]
+	ld [$d265], a
+	call $3468
+
+	ld hl, HungOnText
+	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
+
+
+Function0x350e4: ; 350e4
+	ld hl, DoesntAffectText
+	ld de, DoesntAffectText
+	ld a, [TypeModifier]
+	and $7f
+	jr z, .asm_35110 ; 0x350ef $1f
+	ld a, $d
+	call CleanGetBattleVarPair
+	cp $94
+	ld hl, ButItFailedText
+	ld de, ItFailedText
+	jr z, .asm_35110 ; 0x350fe $10
+	ld hl, AttackMissedText
+	ld de, AttackMissed2Text
+	ld a, [CriticalHit]
+	cp $ff
+	jr nz, .asm_35110 ; 0x3510b $3
+	ld hl, UnaffectedText
+.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, CrashedText
+	call FarBattleTextBox
+	ld a, $1
+	ld [$c689], a
+	call Function0x37e36
+	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 PrintButItFailed
+; 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 CriticalHitText ; 'critical hit'
+	dw OneHitKOText    ; 'one-hit ko'
+; 35197
+
+
+BattleCommandae: ; 35197
+; startloop
+
+	ld hl, PlayerRolloutCount
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_351a2
+	ld hl, EnemyRolloutCount
+
+.asm_351a2
+	xor a
+	ld [hl], a
+	ret
+; 351a5
+
+
+BattleCommandad: ; 351a5
+; supereffectivelooptext
+
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVarPair
+	bit 2, a
+	ret nz
+
+	; fallthrough
+; 351ad
+
+
+BattleCommand10: ; 351ad
+; supereffectivetext
+
+	ld a, [TypeModifier]
+	and $7f
+	cp 10 ; 1.0
+	ret z
+	ld hl, SuperEffectiveText ; 'super-effective'
+	jr nc, .print
+	ld hl, NotVeryEffectiveText ; 'not very effective'
+.print
+	jp FarBattleTextBox
+; 351c0
+
+
+BattleCommand11: ; 351c0
+; checkdestinybond
+
+; Faint the user if it fainted an opponent using Destiny Bond.
+
+	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
+
+	ld hl, TookDownWithItText
+	call FarBattleTextBox
+
+	ld a, [hBattleTurn]
+	and a
+	ld hl, EnemyMonMaxHP + 1
+	bccoord 2, 2 ; hp bar
+	ld a, 0
+	jr nz, .asm_351f2
+	ld hl, BattleMonMaxHP + 1
+	bccoord 10, 9 ; hp bar
+	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 SwitchTurn
+	xor a
+	ld [$cfca], a
+	ld [FXAnimIDHi], a
+	inc a
+	ld [$c689], a
+	ld a, $c2
+	call Function0x37e44
+	call SwitchTurn
+
+	jr .asm_3524d ; 3522f $1c
+
+.asm_35231
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call CleanGetBattleVarPair
+	cp EFFECT_MULTI_HIT
+	jr z, .asm_3524a
+	cp EFFECT_DOUBLE_HIT
+	jr z, .asm_3524a
+	cp EFFECT_TWINEEDLE
+	jr z, .asm_3524a
+	cp EFFECT_TRIPLE_KICK
+	jr z, .asm_3524a
+	cp EFFECT_BEAT_UP
+	jr nz, .asm_3524d
+
+.asm_3524a
+	call BattleCommand0c
+
+.asm_3524d
+	jp EndMoveEffect
+; 35250
+
+
+BattleCommand12: ; 35250
+; buildopponentrage
+
+	jp .start
+.start
+	ld a, [AttackMissed]
+	and a
+	ret nz
+
+	ld a, BATTLE_VARS_SUBSTATUS4_OPP
+	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 SwitchTurn
+	ld hl, RageBuildingText
+	call FarBattleTextBox
+	jp SwitchTurn
+; 3527b
+
+
+BattleCommanda2: ; 3527b
+; ragedamage
+
+	ld a, [CurDamage]
+	ld h, a
+	ld b, a
+	ld a, [CurDamage + 1]
+	ld l, a
+	ld c, a
+	ld a, [hBattleTurn]
+	and a
+	ld a, [$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
+; damagestats
+
+	ld a, [hBattleTurn]
+	and a
+	jp nz, EnemyAttackDamage
+
+	; fallthrough
+; 352e2
+
+
+PlayerAttackDamage: ; 352e2
+; Return move power d, player level e, enemy defense c and player attack b.
+
+	call ResetDamage
+
+	ld hl, PlayerMovePower
+	ld a, [hli]
+	and a
+	ld d, a
+	ret z
+
+	ld a, [hl]
+	cp FIRE
+	jr nc, .special
+
+
+; Physical
+	ld hl, EnemyMonDef
+	ld a, [hli]
+	ld b, a
+	ld c, [hl]
+
+; Reflect
+	ld a, [EnemyScreens]
+	bit 4, a
+	jr z, .physicalcrit
+	sla c
+	rl b
+
+.physicalcrit
+	ld hl, BattleMonAtk
+	call GetDamageStatsCritical
+	jr c, .thickclub
+
+	ld hl, $c6c3
+	ld a, [hli]
+	ld b, a
+	ld c, [hl]
+	ld hl, $c6b6
+	jr .thickclub
+
+
+.special
+	ld hl, EnemyMonSpclDef
+	ld a, [hli]
+	ld b, a
+	ld c, [hl]
+
+; Light Screen
+	ld a, [EnemyScreens]
+	bit 3, a
+	jr z, .specialcrit
+	sla c
+	rl b
+
+.specialcrit
+	ld hl, BattleMonSpclAtk
+	call GetDamageStatsCritical
+	jr c, .lightball
+
+	ld hl, $c6c9
+	ld a, [hli]
+	ld b, a
+	ld c, [hl]
+	ld hl, $c6bc
+
+.lightball
+; Note: Returns player special attack at hl in hl.
+	call LightBallBoost
+	jr .done
+
+.thickclub
+; Note: Returns player attack at hl in hl.
+	call ThickClubBoost
+
+.done
+	call Function0x3534d
+
+	ld a, [BattleMonLevel]
+	ld e, a
+	call DittoMetalPowder
+
+	ld a, 1
+	and a
+	ret
+; 3534d
+
+
+Function0x3534d: ; 3534d
+; Truncate 16-bit values hl and bc to 8-bit values b and c respectively.
+; b = hl, c = bc
+
+	ld a, h
+	or b
+	jr z, .asm_3536b
+
+	srl b
+	rr c
+	srl b
+	rr c
+
+	ld a, c
+	or b
+	jr nz, .asm_3535e
+	inc c
+
+.asm_3535e
+	srl h
+	rr l
+	srl h
+	rr l
+
+	ld a, l
+	or h
+	jr nz, .asm_3536b
+	inc l
+
+.asm_3536b
+	ld a, [InLinkBattle]
+	cp 3
+	jr z, .done
+
+	ld a, h
+	or b
+	jr nz, Function0x3534d
+
+.done
+	ld b, l
+	ret
+; 35378
+
+
+GetDamageStatsCritical: ; 35378
+; Return carry if non-critical.
+
+	ld a, [CriticalHit]
+	and a
+	scf
+	ret z
+
+	; fallthrough
+; 3537e
+
+
+GetDamageStats: ; 3537e
+; Return the attacker's offensive stat and the defender's defensive
+; stat based on whether the attacking type is physical or special.
+
+	push hl
+	push bc
+	ld a, [hBattleTurn]
+	and a
+	jr nz, .enemy
+	ld a, [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
+; Return in hl the stat value at hl.
+
+; If the attacking monster is Cubone or Marowak and
+; it's holding a Thick Club, double it.
+	push bc
+	push de
+	ld b, CUBONE
+	ld c, MAROWAK
+	ld d, THICK_CLUB
+	call SpeciesItemBoost
+	pop de
+	pop bc
+	ret
+; 353c3
+
+
+LightBallBoost: ; 353c3
+; Return in hl the stat value at hl.
+
+; If the attacking monster is Pikachu and it's
+; holding a Light Ball, double it.
+	push bc
+	push de
+	ld b, PIKACHU
+	ld c, PIKACHU
+	ld d, LIGHT_BALL
+	call SpeciesItemBoost
+	pop de
+	pop bc
+	ret
+; 353d1
+
+
+SpeciesItemBoost: ; 353d1
+; Return in hl the stat value at hl.
+
+; If the attacking monster is species b or c and
+; it's holding item d, double it.
+
+	ld a, [hli]
+	ld l, [hl]
+	ld h, a
+
+	push hl
+	ld a, 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, .physicalcrit
+	sla c
+	rl b
+
+.physicalcrit
+	ld hl, EnemyMonAtk
+	call GetDamageStatsCritical
+	jr c, .thickclub
+
+	ld hl, $c6b8
+	ld a, [hli]
+	ld b, a
+	ld c, [hl]
+	ld hl, $c6c1
+	jr .thickclub
+
+
+.Special
+	ld hl, BattleMonSpclDef
+	ld a, [hli]
+	ld b, a
+	ld c, [hl]
+
+; Light Screen
+	ld a, [PlayerScreens]
+	bit 3, a
+	jr z, .specialcrit
+	sla c
+	rl b
+
+.specialcrit
+	ld hl, EnemyMonSpclAtk
+	call GetDamageStatsCritical
+	jr c, .lightball
+	ld hl, $c6be
+	ld a, [hli]
+	ld b, a
+	ld c, [hl]
+	ld hl, $c6c7
+
+.lightball
+	call LightBallBoost
+	jr .done
+
+.thickclub
+	call ThickClubBoost
+
+.done
+	call Function0x3534d
+
+	ld a, [EnemyMonLevel]
+	ld e, a
+	call DittoMetalPowder
+
+	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 [PlayerRolloutCount], a
+	ld [DefaultFlypoint], a
+	ld [$c72d], a
+	jr .asm_3548d ; 35480 $b
+.asm_35482
+	ld a, [PlayerRolloutCount]
+	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, Function0x355b0
+	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, Function0x355b0
+	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 [EnemyRolloutCount], a
+	ld [DefaultFlypoint], a
+	ld [$c72d], a
+	jr .asm_3550d
+
+.asm_35502
+	ld a, [EnemyRolloutCount]
+	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, Function0x355b0
+	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, Function0x355b0
+
+	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 EnemyAttackDamage
+.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
+; 355b0
+
+
+Function0x355b0: ; 355b0
+	ld b, $12 ; buildopponentrage
+	jp SkipToBattleCommand
+; 355b5
+
+
+BattleCommanda8: ; 355b5
+	ld a, [$c72d]
+	and a
+	ret nz
+	jp PrintButItFailed
+; 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, OTPartyMon1Species
+
+.asm_355cc
+	ld a, [DefaultFlypoint]
+	add hl, bc
+	call GetPartyLocation
+	pop bc
+	ret
+; 355d5
+
+
+BattleCommanda9: ; 355d5
+; clearmissdamage
+	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, EnemyScreens
+	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 Function0x3534d
+	ld d, $28
+	pop af
+	ld e, a
+	ret
+; 35612
+
+
+BattleCommand62: ; 35612
+; damagecalc
+
+; Return a damage value for move power d, player level e, enemy defense c and player attack b.
+
+; Return 1 if successful, else 0.
+
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call CleanGetBattleVarPair
+
+; Selfdestruct and Explosion halve defense.
+	cp EFFECT_EXPLOSION
+	jr nz, .asm_35620
+
+	srl c
+	jr nz, .asm_35620
+	inc c
+
+.asm_35620
+
+; Variable-hit moves and Conversion can have a power of 0.
+	cp EFFECT_MULTI_HIT
+	jr z, .asm_3562b
+
+	cp EFFECT_CONVERSION
+	jr z, .asm_3562b
+
+; No damage if move power is 0.
+	ld a, d
+	and a
+	ret z
+
+.asm_3562b
+; Minimum defense value is 1.
+	ld a, c
+	and a
+	jr nz, .asm_35631
+	ld c, 1
+.asm_35631
+
+
+	xor a
+	ld hl, hDividend
+	ld [hli], a
+	ld [hli], a
+	ld [hl], a
+
+; Level * 2
+	ld a, e
+	add a
+	jr nc, .asm_3563e
+	ld [hl], $1
+.asm_3563e
+	inc hl
+	ld [hli], a
+
+; / 5
+	ld a, 5
+	ld [hld], a
+	push bc
+	ld b, $4
+	call Divide
+	pop bc
+
+; + 2
+	inc [hl]
+	inc [hl]
+
+; * bp
+	inc hl
+	ld [hl], d
+	call Multiply
+
+; * Attack
+	ld [hl], b
+	call Multiply
+
+; / Defense
+	ld [hl], c
+	ld b, $4
+	call Divide
+
+; / 50
+	ld [hl], 50
+	ld b, $4
+	call Divide
+
+
+; Item boosts
+	call GetUserItem
+
+	ld a, b
+	and a
+	jr z, .DoneItem
+
+	ld hl, TypeBoostItems
+
+.NextItem
+	ld a, [hli]
+	cp $ff
+	jr z, .DoneItem
+
+; Item effect
+	cp b
+	ld a, [hli]
+	jr nz, .NextItem
+
+; Type
+	ld b, a
+	ld a, BATTLE_VARS_MOVE_TYPE
+	call CleanGetBattleVarPair
+	cp b
+	jr nz, .DoneItem
+
+; * 100 + item effect amount
+	ld a, c
+	add 100
+	ld [hMultiplier], a
+	call Multiply
+
+; / 100
+	ld a, 100
+	ld [hDivisor], a
+	ld b, 4
+	call Divide
+.DoneItem
+
+; Critical hits
+	call .CriticalMultiplier
+
+
+; Update CurDamage (capped at 997).
+	ld hl, CurDamage
+	ld b, [hl]
+	ld a, [$ffb6]
+	add b
+	ld [$ffb6], a
+	jr nc, .asm_356a5
+
+	ld a, [$ffb5]
+	inc a
+	ld [$ffb5], a
+	and a
+	jr z, .Cap
+
+.asm_356a5
+	ld a, [$ffb3]
+	ld b, a
+	ld a, [$ffb4]
+	or a
+	jr nz, .Cap
+
+	ld a, [$ffb5]
+	cp 998 / $100
+	jr c, .asm_356bd
+
+	cp 998 / $100 + 1
+	jr nc, .Cap
+
+	ld a, [$ffb6]
+	cp 998 % $100
+	jr nc, .Cap
+
+.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, .Cap
+
+	ld a, [hl]
+	cp 998 / $100
+	jr c, .asm_356df
+
+	cp 998 / $100 + 1
+	jr nc, .Cap
+
+	inc hl
+	ld a, [hld]
+	cp 998 % $100
+	jr c, .asm_356df
+
+.Cap
+	ld a, 997 / $100
+	ld [hli], a
+	ld a, 997 % $100
+	ld [hld], a
+
+
+.asm_356df
+; Minimum neutral damage is 2 (bringing the cap to 999).
+	inc hl
+	ld a, [hl]
+	add 2
+	ld [hld], a
+	jr nc, .asm_356e7
+	inc [hl]
+.asm_356e7
+
+	ld a, 1
+	and a
+	ret
+
+
+.CriticalMultiplier
+	ld a, [CriticalHit]
+	and a
+	ret z
+
+; x2
+	ld a, [$ffb6]
+	add a
+	ld [$ffb6], a
+
+	ld a, [$ffb5]
+	rl a
+	ld [$ffb5], a
+
+; Cap at $ffff.
+	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
+; constantdamage
+
+	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 ; by level (seismic toss, night shade)
+	ld b, [hl]
+	ld a, 0
+	jr z, .asm_3578c
+
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call CleanGetBattleVarPair
+	cp $58 ; variable (psywave)
+	jr z, .asm_35758
+
+	cp $28 ; half hp (super fang)
+	jr z, .asm_3576b
+
+	cp $63 ; by hp (flail, reversal)
+	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 BattleCommand62
+	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
+; counter
+
+	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 BattleCommanda3
+	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
+; encore
+
+	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, Function0x35923
+	cp STRUGGLE
+	jp z, Function0x35923
+	cp ENCORE
+	jp z, Function0x35923
+	cp MIRROR_MOVE
+	jp z, Function0x35923
+	ld b, a
+
+.asm_3588e
+	ld a, [hli]
+	cp b
+	jr nz, .asm_3588e
+
+	ld bc, $0005
+	add hl, bc
+	ld a, [hl]
+	and $3f
+	jp z, Function0x35923
+	ld a, [AttackMissed]
+	and a
+	jp nz, Function0x35923
+	ld a, BATTLE_VARS_SUBSTATUS5_OPP
+	call GetBattleVarPair
+	bit 4, [hl]
+	jp nz, Function0x35923
+	set 4, [hl]
+	call FarBattleRNG
+	and $3
+	inc a
+	inc a
+	inc a
+	ld [de], a
+	call Function0x36abf
+	jr nz, .asm_3591a
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_358ef
+	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
+	inc c
+	ld a, c
+	cp $4
+	jr c, .asm_358cc
+	pop hl
+	res 4, [hl]
+	xor a
+	ld [de], a
+	jr Function0x35923
+.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
+.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
+	inc c
+	ld a, c
+	cp $4
+	jr c, .asm_358f9
+	pop hl
+	res 4, [hl]
+	xor a
+	ld [de], a
+	jr Function0x35923
+.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 Function0x37e01
+
+	ld hl, GotAnEncoreText
+	jp FarBattleTextBox
+; 35923
+
+
+Function0x35923: ; 35923
+	jp PrintDidntAffect2
+; 35926
+
+
+BattleCommand42: ; 35926
+; painsplit
+
+	ld a, [AttackMissed]
+	and a
+	jp nz, Function0x359cd
+	call CheckSubstituteOpp
+	jp nz, Function0x359cd
+	call Function0x37e01
+	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 Function0x359ac
+	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, SharedPainText
+	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
+
+	; fallthrough
+; 359ac
+
+
+Function0x359ac: ; 359ac
+	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
+; 359cd
+
+Function0x359cd: ; 359cd
+	jp PrintDidntAffect2
+; 359d0
+
+
+BattleCommand43: ; 359d0
+; snore
+	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
+; conversion2
+
+	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 GetMoveAttr
+	ld d, a
+	pop hl
+	cp $13
+	jr z, .asm_35a50 ; 35a0b $43
+	call Function0x37e01
+
+	call SwitchTurn
+.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 SwitchTurn
+
+	ld a, [hl]
+	ld [$d265], a
+	ld a, $29
+	call $2d83
+	ld hl, $5452
+	jp FarBattleTextBox
+.asm_35a50
+	jp Function0x37354
+; 35a53
+
+
+BattleCommand45: ; 35a53
+; lockon
+
+	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 Function0x37e01
+
+	ld hl, TookAimText
+	jp FarBattleTextBox
+
+.asm_35a6e
+	call Function0x37e77
+	jp PrintDidntAffect
+; 35a74
+
+
+BattleCommand46: ; 35a74
+; sketch
+
+	call Function0x372d8
+	ld a, [InLinkBattle]
+	and a
+	jr z, .asm_35a83 ; 35a7b $6
+	call Function0x37e77
+	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 GetMoveAttr
+	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 Function0x37e01
+
+	ld hl, SketchedText
+	jp FarBattleTextBox
+
+.asm_35b10
+	call Function0x37e77
+	jp PrintDidntAffect
+; 35b16
+
+
+BattleCommand47: ; 35b16
+; defrostopponent
+
+; If the opponent isn't frozen, raise Attack one stage.
+; If the opponent is frozen, thaw them and raise Accuracy two stages.
+
+	call Function0x37e01
+
+	ld a, BATTLE_VARS_STATUS_OPP
+	call GetBattleVarPair
+	call Defrost
+
+; Sharply raise accuracy
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call GetBattleVarPair
+	ld a, [hl]
+	push hl
+	push af
+
+	ld a, $a ; meditate, sharpen
+	ld [hl], a
+	call BattleCommand1c
+
+	pop af
+	pop hl
+	ld [hl], a
+	ret
+; 35b33
+
+
+BattleCommand48: ; 35b33
+; sleeptalk
+
+	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 Function0x37e36
+	call UpdateMoveData
+	jp ResetTurn
+.asm_35ba3
+	call Function0x37e77
+	jp TryPrintButItFailed
+
+.asm_35ba9
+	push hl
+	push de
+	push bc
+	call .asm_35bb3
+	pop bc
+	pop de
+	pop hl
+	ret
+
+.asm_35bb3
+	ld a, [hBattleTurn]
+	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
+; destinybond
+
+	ld a, BATTLE_VARS_SUBSTATUS5
+	call GetBattleVarPair
+	set 6, [hl]
+	call Function0x37e01
+	ld hl, DestinyBondEffectText
+	jp FarBattleTextBox
+; 35c0f
+
+
+BattleCommand4a: ; 35c0f
+; spite
+
+	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 Function0x37e01
+	pop de
+	ld a, d
+	ld [$d265], a
+	ld hl, SpiteEffectText
+	jp FarBattleTextBox
+.asm_35c91
+	jp PrintDidntAffect2
+; 35c94
+
+
+BattleCommand4b: ; 35c94
+; falseswipe
+
+	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
+; healbell
+
+	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, $30
+	ld d, $6
+.asm_35ce9
+	ld [hl], a
+	add hl, bc
+	dec d
+	jr nz, .asm_35ce9
+	call Function0x37e01
+
+	ld hl, BellChimedText
+	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, SubTookDamageText
+	call FarBattleTextBox
+
+	ld de, $c6e0
+	ld a, [hBattleTurn]
+	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, SubFadedText
+	call FarBattleTextBox
+
+	call SwitchTurn
+	call BattleCommanda7
+	ld a, $2
+	call CleanGetBattleVarPair
+	and $60
+	call z, Function0x37ec7
+	call SwitchTurn
+
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	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, ProtectedByText
+	jr .asm_35ec6
+
+.asm_35e70
+	ld a, BATTLE_VARS_STATUS_OPP
+	call GetBattleVarPair
+	ld d, h
+	ld e, l
+	ld a, [de]
+	and 7
+	ld hl, AlreadyAsleepText
+	jr nz, .asm_35ec6
+
+	ld a, [AttackMissed]
+	and a
+	jp nz, PrintDidntAffect2
+
+	ld hl, DidntAffect1Text
+	call Function0x35ece
+	jr c, .asm_35ec6
+
+	ld a, [de]
+	and a
+	jr nz, .asm_35ec6
+
+	call CheckSubstituteOpp
+	jr nz, .asm_35ec6
+
+	call Function0x37e01
+	ld b, $7
+	ld a, [$cfc0]
+	and a
+	jr z, .asm_35ea4
+	ld b, $3
+
+.asm_35ea4
+	call FarBattleRNG
+	and b
+	jr z, .asm_35ea4
+	cp 7
+	jr z, .asm_35ea4
+	inc a
+	ld [de], a
+	call $398e
+	call $39c9
+
+	ld hl, FellAsleepText
+	call FarBattleTextBox
+
+	ld a, $f
+	ld hl, $5de9
+	rst FarCall
+
+	jp z, Function0x34216
+	ret
+
+.asm_35ec6
+	push hl
+	call Function0x37e77
+	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
+; poisontarget
+
+	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 Function0x37e54
+	call $39c9
+
+	ld hl, WasPoisonedText
+	call FarBattleTextBox
+
+	ld a, $f
+	ld hl, $5de9
+	rst FarCall
+	ret
+; 35f2c
+
+
+BattleCommand2f: ; 35f2c
+; poison
+
+	ld hl, DoesntAffectText
+	ld a, [TypeModifier]
+	and $7f
+	jp z, .asm_35fb8
+	call Function0x35fe1
+	jp z, .asm_35fb8
+	ld a, BATTLE_VARS_STATUS_OPP
+	call CleanGetBattleVarPair
+	ld b, a
+	ld hl, AlreadyPoisonedText
+	and $8
+	jp nz, .asm_35fb8
+	call GetOpponentItem
+	ld a, b
+	cp $14
+	jr nz, .asm_35f5f ; 35f51 $c
+	ld a, [hl]
+	ld [$d265], a
+	call $3468
+	ld hl, ProtectedByText
+	jr .asm_35fb8 ; 35f5d $59
+.asm_35f5f
+	ld hl, DidntAffect1Text
+	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, WasPoisonedText
+	call FarBattleTextBox
+
+	jr .asm_35fb1 ; 35fa2 $d
+.asm_35fa4
+	set 0, [hl]
+	xor a
+	ld [de], a
+	call Function0x35fc0
+
+	ld hl, BadlyPoisonedText
+	call FarBattleTextBox
+
+.asm_35fb1
+	ld a, $f
+	ld hl, $5de9
+	rst FarCall
+	ret
+
+.asm_35fb8
+	push hl
+	call Function0x37e77
+	pop hl
+	jp FarBattleTextBox
+; 35fc0
+
+
+Function0x35fc0: ; 35fc0
+	call Function0x37e01
+	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
+; draintarget
+	call Function0x36011
+	ld hl, SuckedHealthText
+	jp FarBattleTextBox
+; 36008
+
+
+BattleCommand16: ; 36008
+; eatdream
+	call Function0x36011
+	ld hl, DreamEatenText
+	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
+; burntarget
+
+	xor a
+	ld [$cfca], a
+	call CheckSubstituteOpp
+	ret nz
+	ld a, BATTLE_VARS_STATUS_OPP
+	call GetBattleVarPair
+	and a
+	jp nz, Defrost
+	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 CallBankF
+	ld de, $0105
+	call Function0x37e54
+	call $39c9
+
+	ld hl, WasBurnedText
+	call FarBattleTextBox
+
+	ld a, $f
+	ld hl, $5de9
+	rst FarCall
+	ret
+; 360dd
+
+
+Defrost: ; 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, .ok
+	ld hl, PartyMon1Status
+	ld a, [CurBattleMon]
+.ok
+
+	call GetPartyLocation
+	xor a
+	ld [hl], a
+	call $398e
+
+	ld hl, DefrostedOpponentText
+	jp FarBattleTextBox
+; 36102
+
+
+BattleCommand18: ; 36102
+; freezetarget
+
+	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 Function0x37e54
+	call $39c9
+
+	ld hl, WasFrozenText
+	call FarBattleTextBox
+
+	ld a, $f
+	ld hl, $5de9
+	rst FarCall
+	ret nz
+	call Function0x34216
+	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
+; paralyzetarget
+
+	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 CallBankF
+	ld de, $0109
+	call Function0x37e54
+	call $39c9
+	call PrintParalyze
+	ld hl, $5de9
+	jp CallBankF
+; 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, Function0x36270
+	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]
+	; fallthrough
+; 36270
+
+
+Function0x36270: ; 36270
+	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 Function0x37ed5
+	ret nc
+	xor a
+	ld [$ffd4], a
+	call CallBankF
+	call WaitBGMap
+	jp BattleCommandaa
+; 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, .asm_36372
+	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]
+.asm_36372
+	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 GetStatName
+	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 GetStatName
+	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
+; selfdestruct
+
+	push bc
+	sla c
+	ld b, 0
+	add hl, bc
+	ld a, c
+	add e
+	ld e, a
+	jr nc, .asm_36426
+	inc d
+.asm_36426
+
+	pop bc
+	ld a, [hld]
+	sub 1
+	jr nz, .asm_3642f
+	ld a, [hl]
+	and a
+	ret z
+
+.asm_3642f
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_3643f
+
+	call SwitchTurn
+	call Function0x365d7
+	call SwitchTurn
+
+	jr .asm_36448
+
+.asm_3643f
+	call SwitchTurn
+	call Function0x365fd
+	call SwitchTurn
+
+.asm_36448
+	ld a, $1
+	and a
+	ret
+; 3644c
+
+
+BattleCommand8e: ; 3644c
+; statupfailtext
+	ld a, [$c70e]
+	and a
+	ret z
+	push af
+	call BattleCommandaa
+	pop af
+	dec a
+	jp z, TryPrintButItFailed
+	ld a, [$c70c]
+	and $f
+	ld b, a
+	inc b
+	call GetStatName
+	ld hl, WontRiseAnymoreText
+	jp FarBattleTextBox
+; 3646a
+
+
+BattleCommand8f: ; 3646a
+; statdownfailtext
+	ld a, [$c70e]
+	and a
+	ret z
+	push af
+	call BattleCommandaa
+	pop af
+	dec a
+	jp z, TryPrintButItFailed
+	dec a
+	ld hl, ProtectedByMistText
+	jp z, FarBattleTextBox
+	ld a, [$c70c]
+	and $f
+	ld b, a
+	inc b
+	call GetStatName
+	ld hl, WontDropAnymoreText
+	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
+; allstatsup
+
+; Attack
+	call ResetMiss
+	call BattleCommand70
+	call BattleCommand8c
+
+; Defense
+	call ResetMiss
+	call BattleCommand71
+	call BattleCommand8c
+
+; Speed
+	call ResetMiss
+	call BattleCommand72
+	call BattleCommand8c
+
+; Special Attack
+	call ResetMiss
+	call BattleCommand73
+	call BattleCommand8c
+
+; Special Defense
+	call ResetMiss
+	call BattleCommand74
+	jp   BattleCommand8c
+; 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 Function0x3641a
+	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
+; tristatuschance
+
+	call BattleCommand90
+
+; 1/3 chance of each status
+.loop
+	call FarBattleRNG
+	swap a
+	and 3
+	jr z, .loop
+; jump
+	dec a
+	ld hl, .ptrs
+	rst $28
+	ret
+.ptrs
+	dw BattleCommand19 ; paralyze
+	dw BattleCommand18 ; freeze
+	dw BattleCommand17 ; burn
+; 365a7
+
+
+BattleCommandaf: ; 365a7
+; curl
+	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 CallBankF
+	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 CallBankF
+	jp $31f6
+; 365d7
+
+
+Function0x365d7: ; 365d7
+	ld hl, PlayerAtkLevel
+	ld de, $c6b6
+	ld bc, BattleMonAtk
+
+	ld a, $5
+	call Function0x3661d
+
+	ld hl, $6d45
+	call CallBankF
+
+	call SwitchTurn
+
+	ld hl, $6c39
+	call CallBankF
+
+	ld hl, $6c76
+	call CallBankF
+
+	jp SwitchTurn
+; 365fd
+
+
+Function0x365fd: ; 365fd
+	ld hl, EnemyAtkLevel
+	ld de, $c6c1
+	ld bc, EnemyMonAtk
+
+	ld a, $5
+	call Function0x3661d
+
+	call SwitchTurn
+
+	ld hl, $6c39
+	call CallBankF
+
+	ld hl, $6c76
+	call CallBankF
+
+	jp SwitchTurn
+; 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
+; storeenergy
+
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call CleanGetBattleVarPair
+	bit 0, a
+	ret z
+	ld hl, PlayerRolloutCount
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_36684 ; 3667f $3
+	ld hl, EnemyRolloutCount
+.asm_36684
+	dec [hl]
+	jr nz, .asm_366dc ; 36685 $55
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVarPair
+	res 0, [hl]
+
+	ld hl, UnleashedEnergyText
+	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 ; unleashenergy
+	jp SkipToBattleCommand
+
+.asm_366dc
+	ld hl, StoringEnergyText
+	call FarBattleTextBox
+	jp EndMoveEffect
+; 366e5
+
+
+BattleCommand22: ; 366e5
+; unleashenergy
+
+	ld de, $c682
+	ld bc, PlayerRolloutCount
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_366f6 ; 366ee $6
+	ld de, $c684
+	ld bc, EnemyRolloutCount
+.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 Function0x37e01
+	jp EndMoveEffect
+; 3671a
+
+
+BattleCommand3e: ; 3671a
+; checkrampage
+
+	ld de, PlayerRolloutCount
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_36725 ; 36720 $3
+	ld de, EnemyRolloutCount
+.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 SwitchTurn
+	call Function0x37962
+	push af
+	call SwitchTurn
+	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 ; rampage
+	jp SkipToBattleCommand
+; 36751
+
+
+BattleCommand3d: ; 36751
+; rampage
+
+; No rampage during Sleep Talk.
+	ld a, BATTLE_VARS_STATUS
+	call CleanGetBattleVarPair
+	and 7
+	ret nz
+
+	ld de, PlayerRolloutCount
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_36764 ; 3675f $3
+	ld de, EnemyRolloutCount
+.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
+; teleport
+
+	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 Function0x37e77
+	jp PrintButItFailed
+
+.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 Function0x37e36
+	ld c, $14
+	call DelayFrames
+	call Function0x36804
+
+	ld hl, FledFromBattleText
+	jp FarBattleTextBox
+; 36804
+
+
+Function0x36804: ; 36804
+	ld a, [$d0ee]
+	and $c0
+	or $2
+	ld [$d0ee], a
+	ret
+; 3680f
+
+
+BattleCommand23: ; 3680f
+; forceswitch
+
+	ld a, [BattleType]
+	cp $7
+	jp z, .asm_36969
+	cp $9
+	jp z, .asm_36969
+	cp $b
+	jp z, .asm_36969
+	cp $c
+	jp z, .asm_36969
+	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 .asm_36969
+.asm_36855
+	call $399c
+	xor a
+	ld [$cfca], a
+	inc a
+	ld [$d232], a
+	call Function0x36804
+	ld a, [PlayerMoveAnimation]
+	jp .asm_36975
+.asm_36869
+	call Function0x349f4
+	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 Function0x37e01
+	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, DraggedOutText
+	call FarBattleTextBox
+
+	ld hl, $5c23
+	jp CallBankF
+
+.asm_368ca
+	jp .asm_36969
+
+.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 Function0x36804
+	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 Function0x37e01
+	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 CallBankF
+
+	ld hl, DraggedOutText
+	call FarBattleTextBox
+
+	ld hl, $5c23
+	jp CallBankF
+
+.asm_36969
+	call BattleCommand0a
+	call BattleCommandaa
+	call BattleCommand0c
+	jp PrintButItFailed
+
+.asm_36975
+	push af
+	call Function0x36804
+	ld a, $1
+	ld [$c689], a
+	call Function0x37e01
+	ld c, $14
+	call DelayFrames
+	pop af
+
+	ld hl, FledInFearText
+	cp $2e
+	jr z, .asm_36991
+	ld hl, BlownAwayText
+.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
+; endloop
+
+; Loop back to the command before 'critical'.
+
+	ld de, PlayerRolloutCount
+	ld bc, $c682
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_369c7
+	ld de, EnemyRolloutCount
+	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 EFFECT_TWINEEDLE
+	jr z, .asm_36a3f
+	cp EFFECT_DOUBLE_HIT
+	ld a, $1
+	jr z, .asm_36a3a
+	ld a, [hl]
+	cp EFFECT_BEAT_UP
+	jr z, .asm_369fb
+	cp EFFECT_TRIPLE_KICK
+	jr nz, .asm_36a2b
+.asm_369ec
+	call FarBattleRNG
+	and $3
+	jr z, .asm_369ec
+	dec a
+	jr nz, .asm_36a3a
+	ld a, $1
+	ld [bc], a
+	jr .asm_36a48
+.asm_369fb
+	ld a, [hBattleTurn]
+	and a
+	jr nz, .asm_36a0b
+	ld a, [PartyCount]
+	cp $1
+	jp z, .asm_36a1e
+	dec a
+	jr .asm_36a3a
+.asm_36a0b
+	ld a, [IsInBattle]
+	cp $1
+	jp z, .asm_36a1e
+	ld a, [OTPartyCount]
+	cp $1
+	jp z, .asm_36a1e
+	dec a
+	jr .asm_36a3a
+
+.asm_36a1e
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVarPair
+	res 2, [hl]
+	call BattleCommanda8
+	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, PlayerHitTimesText
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_36a5a
+	ld hl, EnemyHitTimesText
+.asm_36a5a
+
+	push bc
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call CleanGetBattleVarPair
+	cp EFFECT_BEAT_UP
+	jr z, .asm_36a67
+	call FarBattleTextBox
+.asm_36a67
+
+	pop bc
+	xor a
+	ld [bc], a
+	ret
+
+; Loop back to the command before 'critical'.
+.asm_36a6b
+	ld a, [BattleScriptBufferLoc + 1]
+	ld h, a
+	ld a, [BattleScriptBufferLoc]
+	ld l, a
+.asm_36a73
+	ld a, [hld]
+	cp $5 ; critical
+	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
+; kingsrock
+
+	ld a, [AttackMissed]
+	and a
+	ret nz
+
+	call GetUserItem
+	ld a, b
+	cp $4b ; king's rock
+	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
+; ohko
+
+	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 BattleCommand09
+	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
+; checkcharge
+
+; charged?
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVarPair
+	bit 4, [hl]
+	ret z
+; go to town
+	res 4, [hl]
+	res 5, [hl]
+	res 6, [hl]
+	ld b, $39 ; charge
+	jp SkipToBattleCommand
+; 36b4d
+
+
+BattleCommand39: ; 36b4d
+; charge
+
+	call BattleCommand38
+	ld a, BATTLE_VARS_STATUS
+	call CleanGetBattleVarPair
+	and $7
+	jr z, .asm_36b65
+
+	call BattleCommandaa
+	call BattleCommand0c
+	call PrintButItFailed
+	jp EndMoveEffect
+
+.asm_36b65
+	ld a, BATTLE_VARS_SUBSTATUS3
+	call GetBattleVarPair
+	set 4, [hl]
+
+	ld hl, IgnoredOrders2Text
+	ld a, [AlreadyDisobeyed]
+	and a
+	call nz, FarBattleTextBox
+
+	call BattleCommand0a
+	xor a
+	ld [$cfca], a
+	inc a
+	ld [$c689], a
+	call Function0x37e36
+	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 Function0x37ec0
+.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 EFFECT_SKULL_BASH
+	ld b, $fe ; endturn
+	jp z, SkipToBattleCommand
+	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
+; traptarget
+
+	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
+; mist
+
+	ld a, BATTLE_VARS_SUBSTATUS4
+	call GetBattleVarPair
+	bit 1, [hl]
+	jr nz, .asm_36c92 ; 36c85 $b
+	set 1, [hl]
+	call Function0x37e01
+	ld hl, MistText
+	jp FarBattleTextBox
+.asm_36c92
+	call Function0x37e77
+	jp PrintButItFailed
+; 36c98
+
+
+BattleCommand29: ; 36c98
+; focusenergy
+
+	ld a, BATTLE_VARS_SUBSTATUS4
+	call GetBattleVarPair
+	bit 2, [hl]
+	jr nz, .asm_36cac ; 36c9f $b
+	set 2, [hl]
+	call Function0x37e01
+	ld hl, GettingPumpedText
+	jp FarBattleTextBox
+.asm_36cac
+	call Function0x37e77
+	jp PrintButItFailed
+; 36cb2
+
+
+BattleCommand27: ; 36cb2
+; recoil
+
+	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
+; confusetarget
+
+	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
+; confuse
+
+	call GetOpponentItem
+	ld a, b
+	cp $19
+	jr nz, .asm_36d53
+	ld a, [hl]
+	ld [$d265], a
+	call $3468
+	call Function0x37e77
+	ld hl, ProtectedByText
+	jp FarBattleTextBox
+
+.asm_36d53
+	ld a, BATTLE_VARS_SUBSTATUS3_OPP
+	call GetBattleVarPair
+	bit 7, [hl]
+	jr z, .asm_36d65
+	call Function0x37e77
+	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, EnemyConfuseCount
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_36d7b
+	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 EFFECT_CONFUSE_HIT
+	jr z, .asm_36d99
+	cp EFFECT_SNORE
+	jr z, .asm_36d99
+	cp EFFECT_SWAGGER
+	jr z, .asm_36d99
+	call Function0x37e01
+
+.asm_36d99
+	ld de, $0103
+	call Function0x37e54
+
+	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 CallBankF
+; 36db6
+
+Function0x36db6: ; 36db6
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call CleanGetBattleVarPair
+	cp EFFECT_CONFUSE_HIT
+	ret z
+	cp EFFECT_SNORE
+	ret z
+	cp EFFECT_SWAGGER
+	ret z
+	jp PrintDidntAffect2
+; 36dc7
+
+
+BattleCommand30: ; 36dc7
+; paralyze
+
+	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 Function0x37e77
+	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 Function0x37e01
+	ld a, $1
+	ld [$ffd4], a
+	ld a, BATTLE_VARS_STATUS_OPP
+	call GetBattleVarPair
+	set 6, [hl]
+	call $398e
+	ld hl, $6c39
+	call CallBankF
+	call $39d4
+	call PrintParalyze
+	ld hl, $5de9
+	jp CallBankF
+.asm_36e49
+	call Function0x37e77
+	ld hl, AlreadyParalyzedText
+	jp FarBattleTextBox
+.asm_36e52
+	jp PrintDidntAffect2
+.asm_36e55
+	call Function0x37e77
+	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
+; substitute
+
+	call BattleCommandaa
+	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 Function0x37ed5
+	jr c, .asm_36ee8 ; 36ed5 $11
+	xor a
+	ld [$cfca], a
+	ld [FXAnimIDHi], a
+	ld [$c689], a
+	ld a, $a4
+	call Function0x37e44
+	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
+; rechargenextturn
+	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
+; rage
+	ld a, BATTLE_VARS_SUBSTATUS4
+	call GetBattleVarPair
+	set 6, [hl]
+	ret
+; 36f25
+
+
+BattleCommand98: ; 36f25
+; doubleflyingdamage
+	ld a, BATTLE_VARS_SUBSTATUS3_OPP
+	call CleanGetBattleVarPair
+	bit 6, a ; flying
+	ret z
+	jr DoubleDamage
+; 36f2f
+
+
+BattleCommand99: ; 36f2f
+; doubleundergrounddamage
+	ld a, BATTLE_VARS_SUBSTATUS3_OPP
+	call CleanGetBattleVarPair
+	bit 5, a ; underground
+	ret z
+
+	; fallthrough
+; 36f37
+
+
+DoubleDamage: ; 36f37
+	ld hl, CurDamage + 1
+	sla [hl]
+	dec hl
+	rl [hl]
+	jr nc, .quit
+
+	ld a, $ff
+	ld [hli], a
+	ld [hl], a
+.quit
+	ret
+; 36f46
+
+
+BattleCommand33: ; 36f46
+; mimic
+
+	call Function0x372d8
+	call BattleCommandaa
+	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 Function0x37e01
+	ld hl, LearnedMoveText
+	jp FarBattleTextBox
+.asm_36f9a
+	jp Function0x37357
+; 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 Function0x37e01
+	ld hl, WasSeededText
+	jp FarBattleTextBox
+.asm_36fd2
+	call Function0x37e77
+	jp PrintDoesntAffect
+.asm_36fd8
+	call Function0x37e77
+	ld hl, EvadedText
+	jp FarBattleTextBox
+; 36fe1
+
+
+BattleCommand36: ; 36fe1
+	call Function0x37e01
+	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 Function0x37e01
+	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
+; payday
+
+	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
+; conversion
+
+	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 GetMoveAttr
+	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 Function0x37e77
+	jp PrintButItFailed
+.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 Function0x37e01
+	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 Function0x37e01
+
+	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
+; heal
+
+	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 BattleCommandaa
+	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 CallBankF
+	jr .asm_371a9 ; 371a1 $6
+.asm_371a3
+	ld hl, $4cac
+	call CallBankF
+.asm_371a9
+	call Function0x37e01
+	call SwitchTurn
+	ld hl, $4cef
+	call CallBankF
+	call SwitchTurn
+	call $3995
+	call $39c9
+	ld hl, RegainedHealthText
+	jp FarBattleTextBox
+
+.asm_371c4
+	call Function0x37e77
+	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 Function0x37e44
+.asm_37200
+	ld a, BATTLE_VARS_SUBSTATUS5
+	call GetBattleVarPair
+	set 3, [hl]
+	call Function0x372e7
+	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 Function0x37ed5
+	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 Function0x37e36
+	jr .asm_372ae ; 372a6 $6
+.asm_372a8
+	call BattleCommandaa
+	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, Function0x37e44
+	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 Function0x37e77
+	jp PrintButItFailed
+; 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
+
+
+Function0x372e7: ; 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
+; screen
+
+	ld hl, PlayerScreens
+	ld bc, PlayerLightScreenCount
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_3730d
+	ld hl, EnemyScreens
+	ld bc, EnemyLightScreenCount
+
+.asm_3730d
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call CleanGetBattleVarPair
+	cp EFFECT_LIGHT_SCREEN
+	jr nz, .Reflect
+
+	bit 3, [hl]
+	jr nz, .asm_37337
+	set 3, [hl]
+	ld a, $5
+	ld [bc], a
+	ld hl, LightScreenEffectText
+	jr .asm_37331
+
+.Reflect
+	bit 4, [hl]
+	jr nz, .asm_37337
+	set 4, [hl]
+
+; LightScreenCount -> ReflectCount
+	inc bc
+
+	ld a, $5
+	ld [bc], a
+	ld hl, ReflectEffectText
+
+.asm_37331
+	call Function0x37e01
+	jp FarBattleTextBox
+
+.asm_37337
+	call Function0x37e77
+	jp PrintButItFailed
+; 3733d
+
+
+PrintDoesntAffect: ; 3733d
+; 'it doesn't affect'
+	ld hl, DoesntAffectText
+	jp FarBattleTextBox
+; 37343
+
+
+PrintNothingHappened: ; 37343
+; 'but nothing happened!'
+	ld hl, NothingHappenedText
+	jp FarBattleTextBox
+; 37349
+
+
+TryPrintButItFailed: ; 37349
+	ld a, [AlreadyFailed]
+	and a
+	ret nz
+
+	; fallthrough
+; 3734e
+
+
+PrintButItFailed: ; 3734e
+; 'but it failed!'
+	ld hl, ButItFailedText
+	jp FarBattleTextBox
+; 37354
+
+
+Function0x37354: ; 37354
+	call Function0x37e77
+	; fallthrough
+; 37357
+
+Function0x37357: ; 37357
+	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 Function0x37e77
+	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 Function0x37e36
+	ld a, BATTLE_VARS_SUBSTATUS4
+	call GetBattleVarPair
+	res 7, [hl]
+	ld a, BATTLE_VARS_SUBSTATUS5_OPP
+	call GetBattleVarPair
+	res 6, [hl]
+	call Function0x37ed5
+	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 Function0x37e77
+	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 BattleCommandaa
+	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 Function0x37e36
+
+.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 DoMove
+	jp EndMoveEffect
+; 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 Function0x37e01
+	ld hl, CantEscapeNowText
+	jp FarBattleTextBox
+.asm_37530
+	call Function0x37e77
+	jp PrintButItFailed
+; 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 Function0x37e01
+	ld hl, StartedNightmareText
+	jp FarBattleTextBox
+.asm_3755d
+	call Function0x37e77
+	jp PrintButItFailed
+; 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 Function0x37e01
+	ld a, $2
+	call Function0x36532
+	call SwitchTurn
+	call BattleCommand8d
+	call ResetMiss
+	call SwitchTurn
+	call BattleCommand70
+	call BattleCommand8c
+	call ResetMiss
+	call BattleCommand71
+	jp BattleCommand8c
+.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 Function0x37e01
+	ld hl, $4c9f
+	call CallBankF
+	ld hl, $4c3f
+	call CallBankF
+	call $3995
+	ld hl, PutACurseText
+	jp FarBattleTextBox
+.asm_37604
+	call Function0x37e77
+	jp PrintButItFailed
+.asm_3760a
+	ld b, $8
+	call GetStatName
+	call Function0x37e77
+	ld hl, WontRiseAnymoreText
+	jp FarBattleTextBox
+; 37618
+
+
+BattleCommand55: ; 37618
+; protect
+
+	call Function0x3762c
+	ret c
+	ld a, BATTLE_VARS_SUBSTATUS1
+	call GetBattleVarPair
+	set 2, [hl]
+	call Function0x37e01
+	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 Function0x36abf
+	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 Function0x37e77
+	call PrintButItFailed
+	scf
+	ret
+; 3766f
+
+
+BattleCommand5a: ; 3766f
+; endure
+
+	call Function0x3762c
+	ret c
+; get substatus1
+	ld a, BATTLE_VARS_SUBSTATUS1
+	call GetBattleVarPair
+	set 5, [hl] ; endure
+	call Function0x37e01
+	ld hl, BracedItselfText
+	jp FarBattleTextBox
+; 37683
+
+
+BattleCommand56: ; 37683
+; spikes
+
+	ld hl, EnemyScreens
+	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 Function0x37e01
+	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 Function0x37e01
+	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 Function0x37e01
+	ld hl, StartPerishText
+	jp FarBattleTextBox
+.asm_376f2
+	call Function0x37e77
+	jp PrintButItFailed
+; 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 Function0x37e01
+	ld hl, SandstormBrewedText
+	jp FarBattleTextBox
+.asm_37712
+	call Function0x37e77
+	jp PrintButItFailed
+; 37718
+
+
+BattleCommand5b: ; 37718
+; checkcurl
+
+	ld de, PlayerRolloutCount
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_37723 ; 3771e $3
+	ld de, EnemyRolloutCount
+.asm_37723
+	ld a, BATTLE_VARS_SUBSTATUS1
+	call CleanGetBattleVarPair
+	bit 6, a
+	jr z, .asm_37731 ; 3772a $5
+
+	ld b, $4 ; doturn
+	jp SkipToBattleCommand
+
+.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, PlayerRolloutCount
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_37747
+	ld hl, EnemyRolloutCount
+
+.asm_37747
+	ld a, [hl]
+	and a
+	jr nz, .asm_37750
+	ld a, 1
+	ld [$c73e], a
+
+.asm_37750
+	ld a, [AttackMissed]
+	and a
+	jr z, .hit
+
+	ld a, BATTLE_VARS_SUBSTATUS1
+	call GetBattleVarPair
+	res 6, [hl]
+	ret
+
+.hit
+	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, PlayerFuryCutterCount
+	ld a, [hBattleTurn]
+	and a
+	jr z, .go
+	ld hl, EnemyFuryCutterCount
+
+.go
+	ld a, [AttackMissed]
+	and a
+	jp nz, ResetFuryCutterCount
+
+	inc [hl]
+
+; Damage capped at 5 turns' worth (16x).
+	ld a, [hl]
+	ld b, a
+	cp 6
+	jr c, .checkdouble
+	ld b, 5
+
+.checkdouble
+	dec b
+	ret z
+
+; Double the damage
+	ld hl, CurDamage + 1
+	sla [hl]
+	dec hl
+	rl [hl]
+	jr nc, .checkdouble
+
+; No overflow
+	ld a, $ff
+	ld [hli], a
+	ld [hl], a
+	ret
+; 377be
+
+
+ResetFuryCutterCount: ; 377be
+
+	push hl
+
+	ld hl, PlayerFuryCutterCount
+	ld a, [hBattleTurn]
+	and a
+	jr z, .reset
+	ld hl, EnemyFuryCutterCount
+
+.reset
+	xor a
+	ld [hl], a
+
+	pop hl
+	ret
+; 377ce
+
+
+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 Function0x37e01
+
+; '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
+; happinesspower
+	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 BattleCommand07
+	ld a, [InLinkBattle]
+	cp $3
+	jr z, .asm_37889 ; 37885 $2
+	pop de
+	pop bc
+.asm_37889
+	ld a, [$d265]
+	and a
+	jp z, Function0x37e77
+	ld a, [AttackMissed]
+	and a
+	jp nz, Function0x37e77
+	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 Function0x37de9
+	ld d, [hl]
+	pop bc
+	ret
+.asm_378b7
+	pop bc
+	ld a, $3
+	ld [$c689], a
+	call Function0x37e01
+	call SwitchTurn
+	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 CallBankF
+	call SwitchTurn
+	ld hl, $4cef
+	call CallBankF
+	call SwitchTurn
+	ld hl, RegainedHealthText
+	call FarBattleTextBox
+	call SwitchTurn
+	call $398e
+	jr .asm_37904 ; 378f1 $11
+.asm_378f3
+	call SwitchTurn
+	call Function0x37ed5
+	jr nc, .asm_37904 ; 378f9 $9
+	call Function0x37e77
+	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
+; frustrationpower
+
+	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, EnemyScreens
+	ld de, $c705
+.asm_3794a
+	bit 2, [hl]
+	jr nz, .asm_3795c ; 3794c $e
+	set 2, [hl]
+	ld a, $5
+	ld [de], a
+	call Function0x37e01
+	ld hl, CoveredByVeilText
+	jp FarBattleTextBox
+.asm_3795c
+	call Function0x37e77
+	jp PrintButItFailed
+; 37962
+
+
+Function0x37962: ; 37962
+	push hl
+	ld hl, EnemyScreens
+	ld a, [hBattleTurn]
+	and a
+	jr z, .asm_3796e
+	ld hl, PlayerScreens
+
+.asm_3796e
+	bit 2, [hl]
+	pop hl
+	ret
+; 37972
+
+
+BattleCommand65: ; 37972
+; checksafeguard
+	ld hl, EnemyScreens
+	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 BattleCommandaa
+	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 BattleCommandaa
+	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, Function0x37aab
+
+	call $399c
+	call Function0x37e01
+
+	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 Function0x37a67
+
+	ld a, $f
+	ld hl, $52e0
+	rst FarCall
+
+	jp c, EndMoveEffect
+
+	ld hl, $6459
+	call CallBankF
+	call Function0x37ab1
+
+	ret
+
+.Enemy
+	ld a, [IsInBattle]
+	dec a
+	jp z, Function0x37aab
+
+	call Function0x37af6
+	jp z, Function0x37aab
+
+	call $39b0
+	call Function0x37e01
+	call Function0x37a82
+
+	ld a, $f
+	ld hl, $52e0
+	rst FarCall
+	jp c, EndMoveEffect
+
+	xor a
+	ld [$c718], a
+
+	ld hl, $5517
+	call CallBankF
+
+	ld hl, $557a
+	call CallBankF
+
+	ld a, 1
+	ld [$d265], a
+
+	ld hl, $6cab
+	call CallBankF
+
+	ld hl, $5c23
+	call CallBankF
+
+	jr Function0x37ab1
+; 37a67
+
+
+Function0x37a67: ; 37a67
+	ld a, [InLinkBattle]
+	and a
+	ret z
+
+	ld a, 1
+	ld [$d0ec], a
+
+	call $1d6e
+
+	ld hl, $68e4
+	call CallBankF
+
+	call $1c17
+
+	xor a
+	ld [$d0ec], a
+
+	ret
+; 37a82
+
+
+Function0x37a82; 37a82
+	ld a, [InLinkBattle]
+	and a
+	ret z
+
+	call $1d6e
+	ld hl, $68e4
+	call CallBankF
+	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
+; 37aab
+
+
+Function0x37aab: ; 37aab
+	call Function0x37e77
+	jp PrintButItFailed
+; 37ab1
+
+
+Function0x37ab1: ; 37ab1
+	ld a, BATTLE_VARS_STATUS
+	call CleanGetBattleVarPair
+	and 7
+	jr nz, .asm_37ac1
+	ld a, BATTLE_VARS_SUBSTATUS1
+	call GetBattleVarPair
+	res 0, [hl]
+
+.asm_37ac1
+	call Function0x372e7
+	ld hl, PlayerSubStatus1
+	res 7, [hl]
+	ld hl, EnemySubStatus1
+	res 7, [hl]
+	ld hl, PlayerSubStatus5
+	ld a, BATTLE_VARS_SUBSTATUS5
+	call GetBattleVarPair
+	res 3, [hl]
+	res 4, [hl]
+	ld a, BATTLE_VARS_LAST_MOVE
+	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 Function0x37b01
+; 37af6
+
+
+Function0x37af6: ; 37af6
+	ld hl, OTPartyMon1CurHP
+	ld a, [OTPartyCount]
+	ld d, a
+	ld a, [CurOTMon]
+	ld e, a
+
+	; fallthrough
+; 37b01
+
+Function0x37b01: ; 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, $30
+	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, EnemyScreens
+	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 Function0x37e01
+	call SwitchTurn
+
+	ld hl, $4cef
+	ld a, $f
+	rst FarCall ; callab 3ccef
+
+	call SwitchTurn
+	call $3995
+
+; 'regained health!'
+	ld hl, RegainedHealthText
+	jp FarBattleTextBox
+
+.Full
+	call Function0x37e77
+
+; 'hp is full!'
+	ld hl, HPIsFullText
+	jp FarBattleTextBox
+
+.Multipliers
+	dw GetEighthMaxHP
+	dw GetQuarterMaxHP
+	dw GetHalfMaxHP
+	dw GetMaxHP
+; 37be8
+
+
+BattleCommand6d: ; 37be8
+; hiddenpower
+
+	ld a, [AttackMissed]
+	and a
+	ret nz
+
+	ld a, $3e
+	ld hl, $7ced
+	rst FarCall
+
+	ret
+; 37bf4
+
+
+BattleCommand6e: ; 37bf4
+; startrain
+	ld a, WEATHER_RAIN
+	ld [Weather], a
+	ld a, 5
+	ld [WeatherCount], a
+	call Function0x37e01
+	ld hl, DownpourText
+	jp FarBattleTextBox
+; 37c07
+
+
+BattleCommand6f: ; 37c07
+; startsun
+	ld a, WEATHER_SUN
+	ld [Weather], a
+	ld a, 5
+	ld [WeatherCount], a
+	call Function0x37e01
+	ld hl, SunGotBrightText
+	jp FarBattleTextBox
+; 37c1a
+
+
+BattleCommand95: ; 37c1a
+; bellydrum
+	call BattleCommand77
+	ld a, [AttackMissed]
+	and a
+	jr nz, .asm_37c4f
+
+	ld hl, $4c9f
+	ld a, $f
+	rst FarCall
+
+	ld hl, $4cde
+	ld a, $f
+	rst FarCall
+	jr nc, .asm_37c4f
+
+	push bc
+	call Function0x37e01
+	pop bc
+	ld hl, $4c3f
+	ld a, $f
+	rst FarCall
+	call $3995
+	ld a, $5
+
+.asm_37c41
+	push af
+	call BattleCommand77
+	pop af
+	dec a
+	jr nz, .asm_37c41 ; 37c47 $f8
+
+	ld hl, BellyDrumText
+	jp FarBattleTextBox
+.asm_37c4f
+	call Function0x37e77
+	jp PrintButItFailed
+; 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 Function0x37e77
+	jp PrintButItFailed
+.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 Function0x37e01
+	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 BattleCommanda3
+	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
+; doubleminimizedamage
+
+	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 ; charge
+	jp SkipToBattleCommand
+; 37d0d
+
+
+BattleCommand9b: ; 37d0d
+; checkfuturesight
+
+	ld hl, $c71d
+	ld de, $c727
+	ld a, [hBattleTurn]
+	and a
+	jr z, .ok
+	ld hl, $c71e
+	ld de, $c729
+.ok
+
+	ld a, [hl]
+	and a
+	ret z
+	cp 1
+	ret nz
+
+	ld [hl], 0
+	ld a, [de]
+	inc de
+	ld [CurDamage], a
+	ld a, [de]
+	ld [CurDamage + 1], a
+	ld b, $9c ; futuresight
+	jp SkipToBattleCommand
+; 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 BattleCommandaa
+	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 Function0x37e77
+	call PrintButItFailed
+	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
+
+
+Function0x37de9: ; 37de9
+	push hl
+	push de
+	push bc
+	ld a, [$c689]
+	push af
+	call BattleCommand0a
+	pop af
+	ld [$c689], a
+	call Function0x37e19
+	call BattleCommand0c
+	pop bc
+	pop de
+	pop hl
+	ret
+; 37e01
+
+
+Function0x37e01: ; 37e01
+	push hl
+	push de
+	push bc
+	ld a, [$c689]
+	push af
+	call BattleCommand0a
+	pop af
+	ld [$c689], a
+	call Function0x37e36
+	call BattleCommand0c
+	pop bc
+	pop de
+	pop hl
+	ret
+; 37e19
+
+
+Function0x37e19: ; 37e19
+	xor a
+	ld [FXAnimIDHi], a
+
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call CleanGetBattleVarPair
+	and a
+	ret z
+
+	ld [FXAnimIDLo], a
+
+	ld a, [hBattleTurn]
+	and a
+	ld a, 1
+	jr z, .asm_37e30
+	ld a, 4
+
+.asm_37e30
+	ld [$cfca], a
+
+	jp Function0x37e47
+; 37e36
+
+
+Function0x37e36: ; 37e36
+	xor a
+	ld [$cfca], a
+	ld [FXAnimIDHi], a
+
+	ld a, BATTLE_VARS_MOVE_ANIM
+	call CleanGetBattleVarPair
+	and a
+	ret z
+
+	; fallthrough
+; 37e44
+
+
+Function0x37e44: ; 37e44
+
+	ld [FXAnimIDLo], a
+
+	; fallthrough
+; 37e47
+
+
+Function0x37e47: ; 37e47
+	push hl
+	push de
+	push bc
+	ld hl, $40d6
+	ld a, $33
+	rst FarCall ; callab SafePlayBattleAnimation
+	pop bc
+	pop de
+	pop hl
+	ret
+; 37e54
+
+
+Function0x37e54: ; 37e54
+	ld a, e
+	ld [FXAnimIDLo], a
+	ld a, d
+	ld [FXAnimIDHi], a
+	xor a
+	ld [$cfca], a
+
+	push hl
+	push de
+	push bc
+	call SwitchTurn
+
+	ld hl, $40d6
+	ld a, $33
+	rst FarCall ; callab SafePlayBattleAnimation
+
+	call SwitchTurn
+	pop bc
+	pop de
+	pop hl
+	ret
+; 37e73
+
+
+CallBankF: ; 37e73
+	ld a, $f
+	rst FarCall
+	ret
+; 37e77
+
+
+Function0x37e77: ; 37e77
+	call BattleCommand0a
+	call BattleCommandaa
+	jp BattleCommand0c
+; 37e80
+
+
+BattleCommandaa: ; 37e80
+; wait
+; Wait 40 frames.
+	ld c, 40
+	jp DelayFrames
+; 37e85
+
+
+BattleCommand38: ; 37e85
+; cleartext
+
+; Used in multi-hit moves.
+	ld hl, .text
+	jp BattleTextBox
+.text
+	db "@"
+; 37e8c
+
+
+SkipToBattleCommand: ; 37e8c
+; Skip over commands until reaching command b.
+	ld a, [BattleScriptBufferLoc + 1]
+	ld h, a
+	ld a, [BattleScriptBufferLoc]
+	ld l, a
+.asm_37e94
+	ld a, [hli]
+	cp b
+	jr nz, .asm_37e94
+
+	ld a, h
+	ld [BattleScriptBufferLoc + 1], a
+	ld a, l
+	ld [BattleScriptBufferLoc], a
+	ret
+; 37ea1
+
+
+GetMoveAttr: ; 37ea1
+; Assuming hl = Moves + x, return attribute x of move a.
+	push bc
+	ld bc, Move2 - Move1
+	call AddNTimes
+	call GetMoveByte
+	pop bc
+	ret
+; 37ead
+
+
+GetMoveData: ; 37ead
+; Copy move struct a to de.
+	ld hl, Moves
+	ld bc, Move2 - Move1
+	call AddNTimes
+	ld a, Bank(Moves)
+	jp FarCopyBytes
+; 37ebb
+
+
+GetMoveByte: ; 37ebb
+	ld a, BANK(Moves)
+	jp GetFarByte
+; 37ec0
+
+
+Function0x37ec0: ; 37ec0
+	ld a, $3e
+	ld hl, $7d54
+	rst $8
+	ret
+; 37ec7
+
+
+Function0x37ec7: ; 37ec7
+	ld a, $3e
+	ld hl, $7d71
+	rst $8
+	ret
+; 37ece
+
+
+Function0x37ece: ; 37ece
+	ld a, $3e
+	ld hl, $7d69
+	rst $8
+	ret
+; 37ed5
+
+
+Function0x37ed5: ; 37ed5
+; Related to mobile link battles.
+	push hl
+	push de
+	push bc
+	ld a, $13
+	ld hl, $6a44
+	rst $8
+	pop bc
+	pop de
+	pop hl
+	ret
+; 37ee2
+
+
+
--- /dev/null
+++ b/battle/moves/move_effects.asm
@@ -1,0 +1,2243 @@
+Pound:
+KarateChop:
+MegaPunch:
+Scratch:
+Vicegrip:
+Cut:
+WingAttack:
+Slam:
+VineWhip:
+MegaKick:
+HornAttack:
+Tackle:
+WaterGun:
+HydroPump:
+Surf:
+Peck:
+DrillPeck:
+Strength:
+RazorLeaf:
+RockThrow:
+EggBomb:
+Waterfall:
+Crabhammer:
+Slash:
+Aeroblast:
+Megahorn:
+CrossChop:
+Swift:
+FaintAttack:
+VitalThrow:
+JumpKick:
+HiJumpKick:
+QuickAttack:
+MachPunch:
+Extremespeed:
+NormalHit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+Sing:
+SleepPowder:
+Hypnosis:
+LovelyKiss:
+Spore:
+DoSleep:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	checksafeguard
+	sleeptarget
+	endmove
+
+PoisonSting:
+Smog:
+Sludge:
+SludgeBomb:
+PoisonHit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	poisontarget
+	endmove
+
+Absorb:
+MegaDrain:
+LeechLife:
+GigaDrain:
+LeechHit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	draintarget
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+FirePunch:
+Ember:
+Flamethrower:
+FireBlast:
+BurnHit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	burntarget
+	endmove
+
+IcePunch:
+IceBeam:
+Blizzard:
+PowderSnow:
+FreezeHit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	freezetarget
+	endmove
+
+Thunderpunch:
+BodySlam:
+Thundershock:
+Thunderbolt:
+Lick:
+ZapCannon:
+Spark:
+Dragonbreath:
+ParalyzeHit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	paralyzetarget
+	endmove
+
+Selfdestruct:
+Explosion:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	selfdestruct
+	effect0x0b
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+DreamEater:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	eatdream
+	checkdestinybond
+	buildopponentrage
+	endmove
+
+MirrorMove:
+	checkobedience
+	usedmovetext
+	doturn
+	mirrormove
+	endmove
+
+Meditate:
+Sharpen:
+AttackUp:
+	checkobedience
+	usedmovetext
+	doturn
+	attackup
+	effect0x0a
+	effect0x92
+	effect0x0c
+	statmessageuser
+	statupfailtext
+	endmove
+
+Harden:
+Withdraw:
+DefenseUp:
+	checkobedience
+	usedmovetext
+	doturn
+	defenseup
+	effect0x0a
+	effect0x92
+	effect0x0c
+	statmessageuser
+	statupfailtext
+	endmove
+
+SpeedUp:
+	checkobedience
+	usedmovetext
+	doturn
+	speedup
+	effect0x0a
+	effect0x92
+	effect0x0c
+	statmessageuser
+	statupfailtext
+	endmove
+
+Growth:
+SpecialAttackUp:
+	checkobedience
+	usedmovetext
+	doturn
+	specialattackup
+	effect0x0a
+	effect0x92
+	effect0x0c
+	statmessageuser
+	statupfailtext
+	endmove
+
+SpecialDefenseUp:
+	checkobedience
+	usedmovetext
+	doturn
+	specialdefenseup
+	effect0x0a
+	effect0x92
+	effect0x0c
+	statmessageuser
+	statupfailtext
+	endmove
+
+AccuracyUp:
+	checkobedience
+	usedmovetext
+	doturn
+	accuracyup
+	effect0x0a
+	effect0x92
+	effect0x0c
+	statmessageuser
+	statupfailtext
+	endmove
+
+DoubleTeam:
+Minimize:
+EvasionUp:
+	checkobedience
+	usedmovetext
+	doturn
+	effect0x0a
+	evasionup
+	effect0x92
+	effect0xa7
+	effect0x0c
+	statmessageuser
+	statupfailtext
+	endmove
+
+SwordsDance:
+AttackUp2:
+	checkobedience
+	usedmovetext
+	doturn
+	attackup2
+	effect0x0a
+	effect0x92
+	effect0x0c
+	statmessageuser
+	statupfailtext
+	endmove
+
+Barrier:
+AcidArmor:
+DefenseUp2:
+	checkobedience
+	usedmovetext
+	doturn
+	defenseup2
+	effect0x0a
+	effect0x92
+	effect0x0c
+	statmessageuser
+	statupfailtext
+	endmove
+
+Agility:
+SpeedUp2:
+	checkobedience
+	usedmovetext
+	doturn
+	speedup2
+	effect0x0a
+	effect0x92
+	effect0x0c
+	statmessageuser
+	statupfailtext
+	endmove
+
+SpecialAttackUp2:
+	checkobedience
+	usedmovetext
+	doturn
+	specialattackup2
+	effect0x0a
+	effect0x92
+	effect0x0c
+	statmessageuser
+	statupfailtext
+	endmove
+
+Amnesia:
+SpecialDefenseUp2:
+	checkobedience
+	usedmovetext
+	doturn
+	specialdefenseup2
+	effect0x0a
+	effect0x92
+	effect0x0c
+	statmessageuser
+	statupfailtext
+	endmove
+
+AccuracyUp2:
+	checkobedience
+	usedmovetext
+	doturn
+	accuracyup2
+	effect0x0a
+	effect0x92
+	effect0x0c
+	statmessageuser
+	statupfailtext
+	endmove
+
+EvasionUp2:
+	checkobedience
+	usedmovetext
+	doturn
+	evasionup2
+	effect0x0a
+	effect0x92
+	effect0x0c
+	statmessageuser
+	statupfailtext
+	endmove
+
+Growl:
+AttackDown:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	attackdown
+	effect0x0a
+	effect0x91
+	effect0x0c
+	statmessagetarget
+	statdownfailtext
+	endmove
+
+TailWhip:
+Leer:
+DefenseDown:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	defensedown
+	effect0x0a
+	effect0x91
+	effect0x0c
+	statmessagetarget
+	statdownfailtext
+	endmove
+
+StringShot:
+SpeedDown:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	speeddown
+	effect0x0a
+	effect0x91
+	effect0x0c
+	statmessagetarget
+	statdownfailtext
+	endmove
+
+SpecialAttackDown:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	specialattackdown
+	effect0x0a
+	effect0x91
+	effect0x0c
+	statmessagetarget
+	statdownfailtext
+	endmove
+
+SpecialDefenseDown:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	specialdefensedown
+	effect0x0a
+	effect0x91
+	effect0x0c
+	statmessagetarget
+	statdownfailtext
+	endmove
+
+SandAttack:
+Smokescreen:
+Kinesis:
+Flash:
+AccuracyDown:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	accuracydown
+	effect0x0a
+	effect0x91
+	effect0x0c
+	statmessagetarget
+	statdownfailtext
+	endmove
+
+SweetScent:
+EvasionDown:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	evasiondown
+	effect0x0a
+	effect0x91
+	effect0x0c
+	statmessagetarget
+	statdownfailtext
+	endmove
+
+Charm:
+AttackDown2:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	attackdown2
+	effect0x0a
+	effect0x91
+	effect0x0c
+	statmessagetarget
+	statdownfailtext
+	endmove
+
+Screech:
+DefenseDown2:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	defensedown2
+	effect0x0a
+	effect0x91
+	effect0x0c
+	statmessagetarget
+	statdownfailtext
+	endmove
+
+CottonSpore:
+ScaryFace:
+SpeedDown2:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	speeddown2
+	effect0x0a
+	effect0x91
+	effect0x0c
+	statmessagetarget
+	statdownfailtext
+	endmove
+
+SpecialAttackDown2:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	specialattackdown2
+	effect0x0a
+	effect0x91
+	effect0x0c
+	statmessagetarget
+	statdownfailtext
+	endmove
+
+SpecialDefenseDown2:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	specialdefensedown2
+	effect0x0a
+	effect0x91
+	effect0x0c
+	statmessagetarget
+	statdownfailtext
+	endmove
+
+AccuracyDown2:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	accuracydown2
+	effect0x0a
+	effect0x91
+	effect0x0c
+	statmessagetarget
+	statdownfailtext
+	endmove
+
+EvasionDown2:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	evasiondown2
+	effect0x0a
+	effect0x91
+	effect0x0c
+	statmessagetarget
+	statdownfailtext
+	endmove
+
+AuroraBeam:
+AttackDownHit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	attackdown
+	statmessagetarget
+	endmove
+
+Acid:
+IronTail:
+RockSmash:
+DefenseDownHit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	effectchance
+	defensedown
+	statmessagetarget
+	endmove
+
+Bubblebeam:
+Constrict:
+Bubble:
+IcyWind:
+SpeedDownHit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	speeddown
+	statmessagetarget
+	endmove
+
+SpecialAttackDownHit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	specialattackdown
+	statmessagetarget
+	endmove
+
+PsychicM:
+Crunch:
+ShadowBall:
+SpecialDefenseDownHit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	specialdefensedown
+	statmessagetarget
+	endmove
+
+MudSlap:
+Octazooka:
+AccuracyDownHit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	accuracydown
+	statmessagetarget
+	endmove
+
+EvasionDownHit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	evasiondown
+	statmessagetarget
+	endmove
+
+SteelWing:
+DefenseUpHit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	defenseup
+	statmessageuser
+	endmove
+
+MetalClaw:
+AttackUpHit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	attackup
+	statmessageuser
+	endmove
+
+Ancientpower:
+AllUpHit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	allstatsup
+	endmove
+
+PayDay:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	payday
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+Conversion:
+	checkobedience
+	usedmovetext
+	doturn
+	conversion
+	endmove
+
+Haze:
+	checkobedience
+	usedmovetext
+	doturn
+	resetstats
+	endmove
+
+Bide:
+	storeenergy
+	checkobedience
+	doturn
+	usedmovetext
+	unleashenergy
+	effect0xa3
+	checkhit
+	hittarget
+	effect0xa5
+	checkfaint
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+Thrash:
+PetalDance:
+Outrage:
+Rampage:
+	checkrampage
+	checkobedience
+	doturn
+	rampage
+	usedmovetext
+	checkhit
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	clearmissdamage
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+Whirlwind:
+Roar:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	forceswitch
+	endmove
+
+Doubleslap:
+CometPunch:
+FuryAttack:
+PinMissile:
+SpikeCannon:
+Barrage:
+FurySwipes:
+BoneRush:
+DoubleKick:
+Bonemerang:
+MultiHit:
+	checkobedience
+	usedmovetext
+	doturn
+	startloop
+	effect0x0a
+	checkhit
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	clearmissdamage
+	effect0x0b
+	resulttext
+	checkfaint
+	criticaltext
+	cleartext
+	supereffectivelooptext
+	checkdestinybond
+	buildopponentrage
+	endloop
+	effect0x0c
+	kingsrock
+	endmove
+
+Twineedle:
+PoisonMultiHit:
+	checkobedience
+	usedmovetext
+	doturn
+	startloop
+	effect0x0a
+	checkhit
+	effectchance
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	clearmissdamage
+	effect0x0b
+	resulttext
+	checkfaint
+	criticaltext
+	cleartext
+	supereffectivelooptext
+	checkdestinybond
+	buildopponentrage
+	endloop
+	effect0x0c
+	kingsrock
+	poisontarget
+	endmove
+
+RollingKick:
+Headbutt:
+Bite:
+LowKick:
+BoneClub:
+RockSlide:
+HyperFang:
+FlinchHit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	flinchtarget
+	endmove
+
+Guillotine:
+HornDrill:
+Fissure:
+OHKOHit:
+	checkobedience
+	usedmovetext
+	doturn
+	stab
+	ohko
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	endmove
+
+TakeDown:
+DoubleEdge:
+Submission:
+Struggle:
+RecoilHit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	recoil
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+Mist:
+	checkobedience
+	usedmovetext
+	doturn
+	mist
+	endmove
+
+FocusEnergy:
+CriticalUp:
+	checkobedience
+	usedmovetext
+	doturn
+	focusenergy
+	endmove
+
+Supersonic:
+ConfuseRay:
+SweetKiss:
+DoConfuse:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	checksafeguard
+	confuse
+	endmove
+
+Psybeam:
+Confusion:
+DizzyPunch:
+Dynamicpunch:
+ConfuseHit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	confusetarget
+	endmove
+
+Recover:
+Softboiled:
+Rest:
+MilkDrink:
+Heal:
+	checkobedience
+	usedmovetext
+	doturn
+	heal
+	endmove
+
+Transform:
+	checkobedience
+	usedmovetext
+	doturn
+	transform
+	endmove
+
+LightScreen:
+Reflect:
+Screen:
+	checkobedience
+	usedmovetext
+	doturn
+	screen
+	endmove
+
+TriAttack:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	tristatuschance
+	endmove
+
+Toxic:
+Poisonpowder:
+PoisonGas:
+DoPoison:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	stab
+	checksafeguard
+	poison
+	endmove
+
+StunSpore:
+ThunderWave:
+Glare:
+DoParalyze:
+	checkobedience
+	usedmovetext
+	doturn
+	stab
+	checkhit
+	checksafeguard
+	paralyze
+	endmove
+
+SkyAttack:
+	checkcharge
+	checkobedience
+	doturn
+	charge
+	usedmovetext
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	flinchtarget
+	kingsrock
+	endmove
+
+Substitute:
+	checkobedience
+	usedmovetext
+	doturn
+	substitute
+	endmove
+
+HyperBeam:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	rechargenextturn
+	checkdestinybond
+	buildopponentrage
+	endmove
+
+Rage:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	checkhit
+	ragedamage
+	damagevariation
+	hittarget
+	resulttext
+	rage
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+Mimic:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	mimic
+	endmove
+
+Metronome:
+	checkobedience
+	usedmovetext
+	doturn
+	metronome
+	endmove
+
+LeechSeed:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	leechseed
+	endmove
+
+Splash:
+	checkobedience
+	usedmovetext
+	doturn
+	splash
+	endmove
+
+Disable:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	disable
+	endmove
+
+RazorWind:
+	checkcharge
+	checkobedience
+	doturn
+	charge
+	usedmovetext
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+Fly:
+Dig:
+	checkcharge
+	checkobedience
+	doturn
+	charge
+	usedmovetext
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effect0x0b
+	effect0x0c
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+Bind:
+Wrap:
+FireSpin:
+Clamp:
+Whirlpool:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	clearmissdamage
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	traptarget
+	endmove
+
+SuperFang:
+Sonicboom:
+DragonRage:
+SeismicToss:
+NightShade:
+Psywave:
+StaticDamage:
+	checkobedience
+	usedmovetext
+	doturn
+	constantdamage
+	checkhit
+	effect0xa3
+	hittarget
+	resulttext
+	checkfaint
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+Flail:
+Reversal:
+	checkobedience
+	usedmovetext
+	doturn
+	constantdamage
+	stab
+	checkhit
+	hittarget
+	resulttext
+	checkfaint
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+Counter:
+	checkobedience
+	usedmovetext
+	doturn
+	counter
+	hittarget
+	resulttext
+	checkfaint
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+Encore:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	encore
+	endmove
+
+PainSplit:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	painsplit
+	endmove
+
+Snore:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	snore
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	flinchtarget
+	kingsrock
+	endmove
+
+Conversion2:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	conversion2
+	endmove
+
+MindReader:
+LockOn:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	lockon
+	endmove
+
+Sketch:
+	checkobedience
+	usedmovetext
+	doturn
+	sketch
+	endmove
+
+DefrostOpponent:
+	checkobedience
+	usedmovetext
+	doturn
+	defrostopponent
+	endmove
+
+SleepTalk:
+	checkobedience
+	usedmovetext
+	doturn
+	sleeptalk
+	endmove
+
+DestinyBond:
+	checkobedience
+	usedmovetext
+	doturn
+	destinybond
+	endmove
+
+Spite:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	spite
+	endmove
+
+FalseSwipe:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	falseswipe
+	checkhit
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+HealBell:
+	checkobedience
+	usedmovetext
+	doturn
+	healbell
+	endmove
+
+TripleKick:
+	checkobedience
+	usedmovetext
+	doturn
+	startloop
+	effect0x0a
+	checkhit
+	critical
+	damagestats
+	damagecalc
+	triplekick
+	stab
+	damagevariation
+	clearmissdamage
+	effect0x0b
+	resulttext
+	checkfaint
+	criticaltext
+	cleartext
+	supereffectivelooptext
+	checkdestinybond
+	buildopponentrage
+	kickcounter
+	endloop
+	effect0x0c
+	kingsrock
+	endmove
+
+Thief:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	thief
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+SpiderWeb:
+MeanLook:
+	checkobedience
+	usedmovetext
+	doturn
+	arenatrap
+	endmove
+
+Nightmare:
+	checkobedience
+	usedmovetext
+	doturn
+	nightmare
+	endmove
+
+FlameWheel:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	defrost
+	checkdestinybond
+	buildopponentrage
+	burntarget
+	endmove
+
+Curse:
+	checkobedience
+	usedmovetext
+	doturn
+	curse
+	endmove
+
+Protect:
+Detect:
+	checkobedience
+	usedmovetext
+	doturn
+	protect
+	endmove
+
+Spikes:
+	checkobedience
+	usedmovetext
+	doturn
+	spikes
+	endmove
+
+Foresight:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	foresight
+	endmove
+
+PerishSong:
+	checkobedience
+	usedmovetext
+	doturn
+	perishsong
+	endmove
+
+Sandstorm:
+	checkobedience
+	usedmovetext
+	doturn
+	startsandstorm
+	endmove
+
+Endure:
+	checkobedience
+	usedmovetext
+	doturn
+	endure
+	endmove
+
+Rollout:
+	checkcurl
+	checkobedience
+	doturn
+	usedmovetext
+	critical
+	damagestats
+	damagecalc
+	stab
+	checkhit
+	rolloutpower
+	damagevariation
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+Swagger:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	switchturn
+	attackup2
+	switchturn
+	effect0x0a
+	effect0x92
+	effect0x0c
+	resulttext
+	switchturn
+	statmessageuser
+	switchturn
+	confusetarget
+	endmove
+
+FuryCutter:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	checkhit
+	furycutter
+	damagevariation
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+Attract:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	attract
+	endmove
+
+Return:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	happinesspower
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+Present:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	critical
+	damagestats
+	present
+	damagecalc
+	stab
+	damagevariation
+	clearmissdamage
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+Frustration:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	frustrationpower
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+Safeguard:
+	checkobedience
+	usedmovetext
+	doturn
+	safeguard
+	endmove
+
+SacredFire:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	effectchance
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	defrost
+	checkdestinybond
+	buildopponentrage
+	burntarget
+	endmove
+
+Magnitude:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	getmagnitude
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	doubleundergrounddamage
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+BatonPass:
+	checkobedience
+	usedmovetext
+	doturn
+	batonpass
+	endmove
+
+Pursuit:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	pursuit
+	checkhit
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+RapidSpin:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	clearhazards
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+MorningSun:
+	checkobedience
+	usedmovetext
+	doturn
+	healmorn
+	endmove
+
+Synthesis:
+	checkobedience
+	usedmovetext
+	doturn
+	healday
+	endmove
+
+Moonlight:
+	checkobedience
+	usedmovetext
+	doturn
+	healnite
+	endmove
+
+HiddenPower:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	hiddenpower
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+RainDance:
+	checkobedience
+	usedmovetext
+	doturn
+	startrain
+	endmove
+
+SunnyDay:
+	checkobedience
+	usedmovetext
+	doturn
+	startsun
+	endmove
+
+FakeOut:
+	checkobedience
+	usedmovetext
+	doturn
+	checkhit
+	fakeout
+	hittarget
+	resulttext
+	endmove
+
+BellyDrum:
+	checkobedience
+	usedmovetext
+	doturn
+	bellydrum
+	endmove
+
+PsychUp:
+	checkobedience
+	usedmovetext
+	doturn
+	psychup
+	endmove
+
+MirrorCoat:
+	checkobedience
+	usedmovetext
+	doturn
+	mirrorcoat
+	hittarget
+	resulttext
+	checkfaint
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+SkullBash:
+	checkcharge
+	checkobedience
+	doturn
+	charge
+	usedmovetext
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endturn
+	defenseup
+	statmessageuser
+	endmove
+
+Twister:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	doubleflyingdamage
+	checkhit
+	effectchance
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	flinchtarget
+	endmove
+
+Earthquake:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	doubleundergrounddamage
+	checkhit
+	effectchance
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	endmove
+
+FutureSight:
+	checkfuturesight
+	checkobedience
+	usedmovetext
+	doturn
+	damagestats
+	damagecalc
+	futuresight
+	damagevariation
+	checkhit
+	effect0x0b
+	resulttext
+	checkfaint
+	checkdestinybond
+	buildopponentrage
+	endmove
+
+Gust:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	doubleflyingdamage
+	checkhit
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	endmove
+
+Stomp:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	doubleminimizedamage
+	checkhit
+	effectchance
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	flinchtarget
+	endmove
+
+Solarbeam:
+	checkcharge
+	checkobedience
+	doturn
+	skipsuncharge
+	charge
+	usedmovetext
+	critical
+	damagestats
+	damagecalc
+	stab
+	damagevariation
+	checkhit
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	kingsrock
+	endmove
+
+Thunder:
+	checkobedience
+	usedmovetext
+	doturn
+	critical
+	damagestats
+	damagecalc
+	thunderaccuracy
+	checkhit
+	effectchance
+	stab
+	damagevariation
+	hittarget
+	resulttext
+	checkfaint
+	criticaltext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	paralyzetarget
+	endmove
+
+Teleport:
+	checkobedience
+	usedmovetext
+	doturn
+	teleport
+	endmove
+
+BeatUp:
+	checkobedience
+	usedmovetext
+	wait
+	doturn
+	startloop
+	effect0x0a
+	checkhit
+	critical
+	beatup
+	damagecalc
+	damagevariation
+	clearmissdamage
+	effect0x0b
+	resulttext
+	checkfaint
+	criticaltext
+	cleartext
+	supereffectivetext
+	checkdestinybond
+	buildopponentrage
+	endloop
+	effect0xa8
+	effect0x0c
+	kingsrock
+	endmove
+
+DefenseCurl:
+	checkobedience
+	usedmovetext
+	doturn
+	defenseup
+	curl
+	effect0x0a
+	effect0x92
+	effect0x0c
+	statmessageuser
+	statupfailtext
+	endmove
+
+
+
+
--- /dev/null
+++ b/battle/moves/move_effects_pointers.asm
@@ -1,0 +1,158 @@
+	dw NormalHit
+	dw DoSleep
+	dw PoisonHit
+	dw LeechHit
+	dw BurnHit
+	dw FreezeHit
+	dw ParalyzeHit
+	dw Explosion
+	dw DreamEater
+	dw MirrorMove
+	dw AttackUp
+	dw DefenseUp
+	dw SpeedUp
+	dw Growth
+	dw SpecialDefenseUp
+	dw AccuracyUp
+	dw EvasionUp
+	dw NormalHit
+	dw Growl
+	dw DefenseDown
+	dw StringShot
+	dw SpecialAttackDown
+	dw SpecialDefenseDown
+	dw AccuracyDown
+	dw SweetScent
+	dw Haze
+	dw Bide
+	dw Rampage
+	dw Whirlwind
+	dw MultiHit
+	dw Conversion
+	dw FlinchHit
+	dw Heal
+	dw Toxic
+	dw PayDay
+	dw LightScreen
+	dw TriAttack
+	dw NormalHit
+	dw OHKOHit
+	dw RazorWind
+	dw SuperFang
+	dw StaticDamage
+	dw Bind
+	dw NormalHit
+	dw MultiHit
+	dw NormalHit
+	dw Mist
+	dw FocusEnergy
+	dw RecoilHit
+	dw DoConfuse
+	dw SwordsDance
+	dw DefenseUp2
+	dw Agility
+	dw SpecialAttackUp2
+	dw Amnesia
+	dw AccuracyUp2
+	dw EvasionUp2
+	dw Transform
+	dw Charm
+	dw Screech
+	dw SpeedDown2
+	dw SpecialAttackDown2
+	dw SpecialDefenseDown2
+	dw AccuracyDown2
+	dw EvasionDown2
+	dw Reflect
+	dw DoPoison
+	dw DoParalyze
+	dw AuroraBeam
+	dw DefenseDownHit
+	dw SpeedDownHit
+	dw SpecialAttackDownHit
+	dw SpecialDefenseDownHit
+	dw AccuracyDownHit
+	dw EvasionDownHit
+	dw SkyAttack
+	dw ConfuseHit
+	dw Twineedle
+	dw NormalHit
+	dw Substitute
+	dw HyperBeam
+	dw Rage
+	dw Mimic
+	dw Metronome
+	dw LeechSeed
+	dw Splash
+	dw Disable
+	dw StaticDamage
+	dw Psywave
+	dw Counter
+	dw Encore
+	dw PainSplit
+	dw Snore
+	dw Conversion2
+	dw LockOn
+	dw Sketch
+	dw DefrostOpponent
+	dw SleepTalk
+	dw DestinyBond
+	dw Reversal
+	dw Spite
+	dw FalseSwipe
+	dw HealBell
+	dw NormalHit
+	dw TripleKick
+	dw Thief
+	dw MeanLook
+	dw Nightmare
+	dw FlameWheel
+	dw Curse
+	dw NormalHit
+	dw Protect
+	dw Spikes
+	dw Foresight
+	dw PerishSong
+	dw Sandstorm
+	dw Endure
+	dw Rollout
+	dw Swagger
+	dw FuryCutter
+	dw Attract
+	dw Return
+	dw Present
+	dw Frustration
+	dw Safeguard
+	dw SacredFire
+	dw Magnitude
+	dw BatonPass
+	dw Pursuit
+	dw RapidSpin
+	dw NormalHit
+	dw NormalHit
+	dw MorningSun
+	dw Synthesis
+	dw Moonlight
+	dw HiddenPower
+	dw RainDance
+	dw SunnyDay
+	dw SteelWing
+	dw MetalClaw
+	dw Ancientpower
+	dw FakeOut
+	dw BellyDrum
+	dw PsychUp
+	dw MirrorCoat
+	dw SkullBash
+	dw Twister
+	dw Earthquake
+	dw FutureSight
+	dw Gust
+	dw Stomp
+	dw Solarbeam
+	dw Thunder
+	dw Teleport
+	dw BeatUp
+	dw Fly
+	dw DefenseCurl
+
--- a/battle/moves/moves.asm
+++ b/battle/moves/moves.asm
@@ -1,257 +1,258 @@
 ; Characteristics of each move
 
 ; animation, effect, power, type, accuracy, PP, effect chance
-Move0:
-	db POUND,        $00,  40, NORMAL,   $ff, 35, $00
+
 Move1:
-	db KARATE_CHOP,  $00,  50, FIGHTING, $ff, 25, $00
-	db DOUBLESLAP,   $1d,  15, NORMAL,   $d8, 10, $00
-	db COMET_PUNCH,  $1d,  18, NORMAL,   $d8, 15, $00
-	db MEGA_PUNCH,   $00,  80, NORMAL,   $d8, 20, $00
-	db PAY_DAY,      $22,  40, NORMAL,   $ff, 20, $00
-	db FIRE_PUNCH,   $04,  75, FIRE,     $ff, 15, $19
-	db ICE_PUNCH,    $05,  75, ICE,      $ff, 15, $19
-	db THUNDERPUNCH, $06,  75, ELECTRIC, $ff, 15, $19
-	db SCRATCH,      $00,  40, NORMAL,   $ff, 35, $00
-	db VICEGRIP,     $00,  55, NORMAL,   $ff, 30, $00
-	db GUILLOTINE,   $26,   0, NORMAL,   $4c,  5, $00
-	db RAZOR_WIND,   $27,  80, NORMAL,   $bf, 10, $00
-	db SWORDS_DANCE, $32,   0, NORMAL,   $ff, 30, $00
-	db CUT,          $00,  50, NORMAL,   $f2, 30, $00
-	db GUST,         $95,  40, FLYING,   $ff, 35, $00
-	db WING_ATTACK,  $00,  60, FLYING,   $ff, 35, $00
-	db WHIRLWIND,    $1c,   0, NORMAL,   $ff, 20, $00
-	db FLY,          $9b,  70, FLYING,   $f2, 15, $00
-	db BIND,         $2a,  15, NORMAL,   $bf, 20, $00
-	db SLAM,         $00,  80, NORMAL,   $bf, 20, $00
-	db VINE_WHIP,    $00,  35, GRASS,    $ff, 10, $00
-	db STOMP,        $96,  65, NORMAL,   $ff, 20, $4c
-	db DOUBLE_KICK,  $2c,  30, FIGHTING, $ff, 30, $00
-	db MEGA_KICK,    $00, 120, NORMAL,   $bf,  5, $00
-	db JUMP_KICK,    $2d,  70, FIGHTING, $f2, 25, $00
-	db ROLLING_KICK, $1f,  60, FIGHTING, $d8, 15, $4c
-	db SAND_ATTACK,  $17,   0, GROUND,   $ff, 15, $00
-	db HEADBUTT,     $1f,  70, NORMAL,   $ff, 15, $4c
-	db HORN_ATTACK,  $00,  65, NORMAL,   $ff, 25, $00
-	db FURY_ATTACK,  $1d,  15, NORMAL,   $d8, 20, $00
-	db HORN_DRILL,   $26,   1, NORMAL,   $4c,  5, $00
-	db TACKLE,       $00,  35, NORMAL,   $f2, 35, $00
-	db BODY_SLAM,    $06,  85, NORMAL,   $ff, 15, $4c
-	db WRAP,         $2a,  15, NORMAL,   $d8, 20, $00
-	db TAKE_DOWN,    $30,  90, NORMAL,   $d8, 20, $00
-	db THRASH,       $1b,  90, NORMAL,   $ff, 20, $00
-	db DOUBLE_EDGE,  $30, 120, NORMAL,   $ff, 15, $00
-	db TAIL_WHIP,    $13,   0, NORMAL,   $ff, 30, $00
-	db POISON_STING, $02,  15, POISON,   $ff, 35, $4c
-	db TWINEEDLE,    $4d,  25, BUG,      $ff, 20, $33
-	db PIN_MISSILE,  $1d,  14, BUG,      $d8, 20, $00
-	db LEER,         $13,   0, NORMAL,   $ff, 30, $00
-	db BITE,         $1f,  60, DARK,     $ff, 25, $4c
-	db GROWL,        $12,   0, NORMAL,   $ff, 40, $00
-	db ROAR,         $1c,   0, NORMAL,   $ff, 20, $00
-	db SING,         $01,   0, NORMAL,   $8c, 15, $00
-	db SUPERSONIC,   $31,   0, NORMAL,   $8c, 20, $00
-	db SONICBOOM,    $29,  20, NORMAL,   $e5, 20, $00
-	db DISABLE,      $56,   0, NORMAL,   $8c, 20, $00
-	db ACID,         $45,  40, POISON,   $ff, 30, $19
-	db EMBER,        $04,  40, FIRE,     $ff, 25, $19
-	db FLAMETHROWER, $04,  95, FIRE,     $ff, 15, $19
-	db MIST,         $2e,   0, ICE,      $ff, 30, $00
-	db WATER_GUN,    $00,  40, WATER,    $ff, 25, $00
-	db HYDRO_PUMP,   $00, 120, WATER,    $cc,  5, $00
-	db SURF,         $00,  95, WATER,    $ff, 15, $00
-	db ICE_BEAM,     $05,  95, ICE,      $ff, 10, $19
-	db BLIZZARD,     $05, 120, ICE,      $b2,  5, $19
-	db PSYBEAM,      $4c,  65, PSYCHIC,  $ff, 20, $19
-	db BUBBLEBEAM,   $46,  65, WATER,    $ff, 20, $19
-	db AURORA_BEAM,  $44,  65, ICE,      $ff, 20, $19
-	db HYPER_BEAM,   $50, 150, NORMAL,   $e5,  5, $00
-	db PECK,         $00,  35, FLYING,   $ff, 35, $00
-	db DRILL_PECK,   $00,  80, FLYING,   $ff, 20, $00
-	db SUBMISSION,   $30,  80, FIGHTING, $cc, 25, $00
-	db LOW_KICK,     $1f,  50, FIGHTING, $e5, 20, $4c
-	db COUNTER,      $59,   1, FIGHTING, $ff, 20, $00
-	db SEISMIC_TOSS, $57,   1, FIGHTING, $ff, 20, $00
-	db STRENGTH,     $00,  80, NORMAL,   $ff, 15, $00
-	db ABSORB,       $03,  20, GRASS,    $ff, 20, $00
-	db MEGA_DRAIN,   $03,  40, GRASS,    $ff, 10, $00
-	db LEECH_SEED,   $54,   0, GRASS,    $e5, 10, $00
-	db GROWTH,       $0d,   0, NORMAL,   $ff, 40, $00
-	db RAZOR_LEAF,   $00,  55, GRASS,    $f2, 25, $00
-	db SOLARBEAM,    $97, 120, GRASS,    $ff, 10, $00
-	db POISONPOWDER, $42,   0, POISON,   $bf, 35, $00
-	db STUN_SPORE,   $43,   0, GRASS,    $bf, 30, $00
-	db SLEEP_POWDER, $01,   0, GRASS,    $bf, 15, $00
-	db PETAL_DANCE,  $1b,  70, GRASS,    $ff, 20, $00
-	db STRING_SHOT,  $14,   0, BUG,      $f2, 40, $00
-	db DRAGON_RAGE,  $29,  40, DRAGON,   $ff, 10, $00
-	db FIRE_SPIN,    $2a,  15, FIRE,     $b2, 15, $00
-	db THUNDERSHOCK, $06,  40, ELECTRIC, $ff, 30, $19
-	db THUNDERBOLT,  $06,  95, ELECTRIC, $ff, 15, $19
-	db THUNDER_WAVE, $43,   0, ELECTRIC, $ff, 20, $00
-	db THUNDER,      $98, 120, ELECTRIC, $b2, 10, $4c
-	db ROCK_THROW,   $00,  50, ROCK,     $e5, 15, $00
-	db EARTHQUAKE,   $93, 100, GROUND,   $ff, 10, $00
-	db FISSURE,      $26,   1, GROUND,   $4c,  5, $00
-	db DIG,          $9b,  60, GROUND,   $ff, 10, $00
-	db TOXIC,        $21,   0, POISON,   $d8, 10, $00
-	db CONFUSION,    $4c,  50, PSYCHIC,  $ff, 25, $19
-	db PSYCHIC_M,    $48,  90, PSYCHIC,  $ff, 10, $19
-	db HYPNOSIS,     $01,   0, PSYCHIC,  $99, 20, $00
-	db MEDITATE,     $0a,   0, PSYCHIC,  $ff, 40, $00
-	db AGILITY,      $34,   0, PSYCHIC,  $ff, 30, $00
-	db QUICK_ATTACK, $67,  40, NORMAL,   $ff, 30, $00
-	db RAGE,         $51,  20, NORMAL,   $ff, 20, $00
-	db TELEPORT,     $99,   0, PSYCHIC,  $ff, 20, $00
-	db NIGHT_SHADE,  $57,   1, GHOST,    $ff, 15, $00
-	db MIMIC,        $52,   0, NORMAL,   $ff, 10, $00
-	db SCREECH,      $3b,   0, NORMAL,   $d8, 40, $00
-	db DOUBLE_TEAM,  $10,   0, NORMAL,   $ff, 15, $00
-	db RECOVER,      $20,   0, NORMAL,   $ff, 20, $00
-	db HARDEN,       $0b,   0, NORMAL,   $ff, 30, $00
-	db MINIMIZE,     $10,   0, NORMAL,   $ff, 20, $00
-	db SMOKESCREEN,  $17,   0, NORMAL,   $ff, 20, $00
-	db CONFUSE_RAY,  $31,   0, GHOST,    $ff, 10, $00
-	db WITHDRAW,     $0b,   0, WATER,    $ff, 40, $00
-	db DEFENSE_CURL, $9c,   0, NORMAL,   $ff, 40, $00
-	db BARRIER,      $33,   0, PSYCHIC,  $ff, 30, $00
-	db LIGHT_SCREEN, $23,   0, PSYCHIC,  $ff, 30, $00
-	db HAZE,         $19,   0, ICE,      $ff, 30, $00
-	db REFLECT,      $41,   0, PSYCHIC,  $ff, 20, $00
-	db FOCUS_ENERGY, $2f,   0, NORMAL,   $ff, 30, $00
-	db BIDE,         $1a,   0, NORMAL,   $ff, 10, $00
-	db METRONOME,    $53,   0, NORMAL,   $ff, 10, $00
-	db MIRROR_MOVE,  $09,   0, FLYING,   $ff, 20, $00
-	db SELFDESTRUCT, $07, 200, NORMAL,   $ff,  5, $00
-	db EGG_BOMB,     $00, 100, NORMAL,   $bf, 10, $00
-	db LICK,         $06,  20, GHOST,    $ff, 30, $4c
-	db SMOG,         $02,  20, POISON,   $b2, 20, $66
-	db SLUDGE,       $02,  65, POISON,   $ff, 20, $4c
-	db BONE_CLUB,    $1f,  65, GROUND,   $d8, 20, $19
-	db FIRE_BLAST,   $04, 120, FIRE,     $d8,  5, $19
-	db WATERFALL,    $00,  80, WATER,    $ff, 15, $00
-	db CLAMP,        $2a,  35, WATER,    $bf, 10, $00
-	db SWIFT,        $11,  60, NORMAL,   $ff, 20, $00
-	db SKULL_BASH,   $91, 100, NORMAL,   $ff, 15, $00
-	db SPIKE_CANNON, $1d,  20, NORMAL,   $ff, 15, $00
-	db CONSTRICT,    $46,  10, NORMAL,   $ff, 35, $19
-	db AMNESIA,      $36,   0, PSYCHIC,  $ff, 20, $00
-	db KINESIS,      $17,   0, PSYCHIC,  $cc, 15, $00
-	db SOFTBOILED,   $20,   0, NORMAL,   $ff, 10, $00
-	db HI_JUMP_KICK, $2d,  85, FIGHTING, $e5, 20, $00
-	db GLARE,        $43,   0, NORMAL,   $bf, 30, $00
-	db DREAM_EATER,  $08, 100, PSYCHIC,  $ff, 15, $00
-	db POISON_GAS,   $42,   0, POISON,   $8c, 40, $00
-	db BARRAGE,      $1d,  15, NORMAL,   $d8, 20, $00
-	db LEECH_LIFE,   $03,  20, BUG,      $ff, 15, $00
-	db LOVELY_KISS,  $01,   0, NORMAL,   $bf, 10, $00
-	db SKY_ATTACK,   $4b, 140, FLYING,   $e5,  5, $00
-	db TRANSFORM,    $39,   0, NORMAL,   $ff, 10, $00
-	db BUBBLE,       $46,  20, WATER,    $ff, 30, $19
-	db DIZZY_PUNCH,  $4c,  70, NORMAL,   $ff, 10, $33
-	db SPORE,        $01,   0, GRASS,    $ff, 15, $00
-	db FLASH,        $17,   0, NORMAL,   $b2, 20, $00
-	db PSYWAVE,      $58,   1, PSYCHIC,  $cc, 15, $00
-	db SPLASH,       $55,   0, NORMAL,   $ff, 40, $00
-	db ACID_ARMOR,   $33,   0, POISON,   $ff, 40, $00
-	db CRABHAMMER,   $00,  90, WATER,    $d8, 10, $00
-	db EXPLOSION,    $07, 250, NORMAL,   $ff,  5, $00
-	db FURY_SWIPES,  $1d,  18, NORMAL,   $cc, 15, $00
-	db BONEMERANG,   $2c,  50, GROUND,   $e5, 10, $00
-	db REST,         $20,   0, PSYCHIC,  $ff, 10, $00
-	db ROCK_SLIDE,   $1f,  75, ROCK,     $e5, 10, $4c
-	db HYPER_FANG,   $1f,  80, NORMAL,   $e5, 15, $19
-	db SHARPEN,      $0a,   0, NORMAL,   $ff, 30, $00
-	db CONVERSION,   $1e,   0, NORMAL,   $ff, 30, $00
-	db TRI_ATTACK,   $24,  80, NORMAL,   $ff, 10, $33
-	db SUPER_FANG,   $28,   1, NORMAL,   $e5, 10, $00
-	db SLASH,        $00,  70, NORMAL,   $ff, 20, $00
-	db SUBSTITUTE,   $4f,   0, NORMAL,   $ff, 10, $00
-	db STRUGGLE,     $30,  50, NORMAL,   $ff,  1, $00
-	db SKETCH,       $5f,   0, NORMAL,   $ff,  1, $00
-	db TRIPLE_KICK,  $68,  10, FIGHTING, $e5, 10, $00
-	db THIEF,        $69,  40, DARK,     $ff, 10, $ff
-	db SPIDER_WEB,   $6a,   0, BUG,      $ff, 10, $00
-	db MIND_READER,  $5e,   0, NORMAL,   $ff,  5, $00
-	db NIGHTMARE,    $6b,   0, GHOST,    $ff, 15, $00
-	db FLAME_WHEEL,  $6c,  60, FIRE,     $ff, 25, $19
-	db SNORE,        $5c,  40, NORMAL,   $ff, 15, $4c
-	db CURSE,        $6d,   0, CURSE_T,  $ff, 10, $00
-	db FLAIL,        $63,   1, NORMAL,   $ff, 15, $00
-	db CONVERSION2,  $5d,   0, NORMAL,   $ff, 30, $00
-	db AEROBLAST,    $00, 100, FLYING,   $f2,  5, $00
-	db COTTON_SPORE, $3c,   0, GRASS,    $d8, 40, $00
-	db REVERSAL,     $63,   1, FIGHTING, $ff, 15, $00
-	db SPITE,        $64,   0, GHOST,    $ff, 10, $00
-	db POWDER_SNOW,  $05,  40, ICE,      $ff, 25, $19
-	db PROTECT,      $6f,   0, NORMAL,   $ff, 10, $00
-	db MACH_PUNCH,   $67,  40, FIGHTING, $ff, 30, $00
-	db SCARY_FACE,   $3c,   0, NORMAL,   $e5, 10, $00
-	db FAINT_ATTACK, $11,  60, DARK,     $ff, 20, $00
-	db SWEET_KISS,   $31,   0, NORMAL,   $bf, 10, $00
-	db BELLY_DRUM,   $8e,   0, NORMAL,   $ff, 10, $00
-	db SLUDGE_BOMB,  $02,  90, POISON,   $ff, 10, $4c
-	db MUD_SLAP,     $49,  20, GROUND,   $ff, 10, $ff
-	db OCTAZOOKA,    $49,  65, WATER,    $d8, 10, $7f
-	db SPIKES,       $70,   0, GROUND,   $ff, 20, $00
-	db ZAP_CANNON,   $06, 100, ELECTRIC, $7f,  5, $ff
-	db FORESIGHT,    $71,   0, NORMAL,   $ff, 40, $00
-	db DESTINY_BOND, $62,   0, GHOST,    $ff,  5, $00
-	db PERISH_SONG,  $72,   0, NORMAL,   $ff,  5, $00
-	db ICY_WIND,     $46,  55, ICE,      $f2, 15, $ff
-	db DETECT,       $6f,   0, FIGHTING, $ff,  5, $00
-	db BONE_RUSH,    $1d,  25, GROUND,   $cc, 10, $00
-	db LOCK_ON,      $5e,   0, NORMAL,   $ff,  5, $00
-	db OUTRAGE,      $1b,  90, DRAGON,   $ff, 15, $00
-	db SANDSTORM,    $73,   0, ROCK,     $ff, 10, $00
-	db GIGA_DRAIN,   $03,  60, GRASS,    $ff,  5, $00
-	db ENDURE,       $74,   0, NORMAL,   $ff, 10, $00
-	db CHARM,        $3a,   0, NORMAL,   $ff, 20, $00
-	db ROLLOUT,      $75,  30, ROCK,     $e5, 20, $00
-	db FALSE_SWIPE,  $65,  40, NORMAL,   $ff, 40, $00
-	db SWAGGER,      $76,   0, NORMAL,   $e5, 15, $ff
-	db MILK_DRINK,   $20,   0, NORMAL,   $ff, 10, $00
-	db SPARK,        $06,  65, ELECTRIC, $ff, 20, $4c
-	db FURY_CUTTER,  $77,  10, BUG,      $f2, 20, $00
-	db STEEL_WING,   $8a,  70, STEEL,    $e5, 25, $19
-	db MEAN_LOOK,    $6a,   0, NORMAL,   $ff,  5, $00
-	db ATTRACT,      $78,   0, NORMAL,   $ff, 15, $00
-	db SLEEP_TALK,   $61,   0, NORMAL,   $ff, 10, $00
-	db HEAL_BELL,    $66,   0, NORMAL,   $ff,  5, $00
-	db RETURN,       $79,   1, NORMAL,   $ff, 20, $00
-	db PRESENT,      $7a,   1, NORMAL,   $e5, 15, $00
-	db FRUSTRATION,  $7b,   1, NORMAL,   $ff, 20, $00
-	db SAFEGUARD,    $7c,   0, NORMAL,   $ff, 25, $00
-	db PAIN_SPLIT,   $5b,   0, NORMAL,   $ff, 20, $00
-	db SACRED_FIRE,  $7d, 100, FIRE,     $f2,  5, $7f
-	db MAGNITUDE,    $7e,   1, GROUND,   $ff, 30, $00
-	db DYNAMICPUNCH, $4c, 100, FIGHTING, $7f,  5, $ff
-	db MEGAHORN,     $00, 120, BUG,      $d8, 10, $00
-	db DRAGONBREATH, $06,  60, DRAGON,   $ff, 20, $4c
-	db BATON_PASS,   $7f,   0, NORMAL,   $ff, 40, $00
-	db ENCORE,       $5a,   0, NORMAL,   $ff,  5, $00
-	db PURSUIT,      $80,  40, DARK,     $ff, 20, $00
-	db RAPID_SPIN,   $81,  20, NORMAL,   $ff, 40, $00
-	db SWEET_SCENT,  $18,   0, NORMAL,   $ff, 20, $00
-	db IRON_TAIL,    $45, 100, STEEL,    $bf, 15, $4c
-	db METAL_CLAW,   $8b,  50, STEEL,    $f2, 35, $19
-	db VITAL_THROW,  $11,  70, FIGHTING, $ff, 10, $00
-	db MORNING_SUN,  $84,   0, NORMAL,   $ff,  5, $00
-	db SYNTHESIS,    $85,   0, GRASS,    $ff,  5, $00
-	db MOONLIGHT,    $86,   0, NORMAL,   $ff,  5, $00
-	db HIDDEN_POWER, $87,   1, NORMAL,   $ff, 15, $00
-	db CROSS_CHOP,   $00, 100, FIGHTING, $cc,  5, $00
-	db TWISTER,      $92,  40, DRAGON,   $ff, 20, $33
-	db RAIN_DANCE,   $88,   0, WATER,    $e5,  5, $00
-	db SUNNY_DAY,    $89,   0, FIRE,     $e5,  5, $00
-	db CRUNCH,       $48,  80, DARK,     $ff, 15, $33
-	db MIRROR_COAT,  $90,   1, PSYCHIC,  $ff, 20, $00
-	db PSYCH_UP,     $8f,   0, NORMAL,   $ff, 10, $00
-	db EXTREMESPEED, $67,  80, NORMAL,   $ff,  5, $00
-	db ANCIENTPOWER, $8c,  60, ROCK,     $ff,  5, $19
-	db SHADOW_BALL,  $48,  80, GHOST,    $ff, 15, $33
-	db FUTURE_SIGHT, $94,  80, PSYCHIC,  $e5, 15, $00
-	db ROCK_SMASH,   $45,  20, FIGHTING, $ff, 15, $7f
-	db WHIRLPOOL,    $2a,  15, WATER,    $b2, 15, $00
-	db BEAT_UP,      $9a,  10, DARK,     $ff, 10, $00
+	db POUND,        EFFECT_NORMAL_HIT,            40, NORMAL,   $ff, 35, $00
+Move2:
+	db KARATE_CHOP,  EFFECT_NORMAL_HIT,            50, FIGHTING, $ff, 25, $00
+	db DOUBLESLAP,   EFFECT_MULTI_HIT,             15, NORMAL,   $d8, 10, $00
+	db COMET_PUNCH,  EFFECT_MULTI_HIT,             18, NORMAL,   $d8, 15, $00
+	db MEGA_PUNCH,   EFFECT_NORMAL_HIT,            80, NORMAL,   $d8, 20, $00
+	db PAY_DAY,      EFFECT_PAY_DAY,               40, NORMAL,   $ff, 20, $00
+	db FIRE_PUNCH,   EFFECT_BURN_HIT,              75, FIRE,     $ff, 15, $19
+	db ICE_PUNCH,    EFFECT_FREEZE_HIT,            75, ICE,      $ff, 15, $19
+	db THUNDERPUNCH, EFFECT_PARALYZE_HIT,          75, ELECTRIC, $ff, 15, $19
+	db SCRATCH,      EFFECT_NORMAL_HIT,            40, NORMAL,   $ff, 35, $00
+	db VICEGRIP,     EFFECT_NORMAL_HIT,            55, NORMAL,   $ff, 30, $00
+	db GUILLOTINE,   EFFECT_OHKO,                   0, NORMAL,   $4c,  5, $00
+	db RAZOR_WIND,   EFFECT_RAZOR_WIND,            80, NORMAL,   $bf, 10, $00
+	db SWORDS_DANCE, EFFECT_ATTACK_UP_2,            0, NORMAL,   $ff, 30, $00
+	db CUT,          EFFECT_NORMAL_HIT,            50, NORMAL,   $f2, 30, $00
+	db GUST,         EFFECT_GUST,                  40, FLYING,   $ff, 35, $00
+	db WING_ATTACK,  EFFECT_NORMAL_HIT,            60, FLYING,   $ff, 35, $00
+	db WHIRLWIND,    EFFECT_WHIRLWIND,              0, NORMAL,   $ff, 20, $00
+	db FLY,          EFFECT_FLY,                   70, FLYING,   $f2, 15, $00
+	db BIND,         EFFECT_BIND,                  15, NORMAL,   $bf, 20, $00
+	db SLAM,         EFFECT_NORMAL_HIT,            80, NORMAL,   $bf, 20, $00
+	db VINE_WHIP,    EFFECT_NORMAL_HIT,            35, GRASS,    $ff, 10, $00
+	db STOMP,        EFFECT_STOMP,                 65, NORMAL,   $ff, 20, $4c
+	db DOUBLE_KICK,  EFFECT_DOUBLE_HIT,            30, FIGHTING, $ff, 30, $00
+	db MEGA_KICK,    EFFECT_NORMAL_HIT,           120, NORMAL,   $bf,  5, $00
+	db JUMP_KICK,    EFFECT_JUMP_KICK,             70, FIGHTING, $f2, 25, $00
+	db ROLLING_KICK, EFFECT_FLINCH_HIT,            60, FIGHTING, $d8, 15, $4c
+	db SAND_ATTACK,  EFFECT_ACCURACY_DOWN,          0, GROUND,   $ff, 15, $00
+	db HEADBUTT,     EFFECT_FLINCH_HIT,            70, NORMAL,   $ff, 15, $4c
+	db HORN_ATTACK,  EFFECT_NORMAL_HIT,            65, NORMAL,   $ff, 25, $00
+	db FURY_ATTACK,  EFFECT_MULTI_HIT,             15, NORMAL,   $d8, 20, $00
+	db HORN_DRILL,   EFFECT_OHKO,                   1, NORMAL,   $4c,  5, $00
+	db TACKLE,       EFFECT_NORMAL_HIT,            35, NORMAL,   $f2, 35, $00
+	db BODY_SLAM,    EFFECT_PARALYZE_HIT,          85, NORMAL,   $ff, 15, $4c
+	db WRAP,         EFFECT_BIND,                  15, NORMAL,   $d8, 20, $00
+	db TAKE_DOWN,    EFFECT_RECOIL_HIT,            90, NORMAL,   $d8, 20, $00
+	db THRASH,       EFFECT_RAMPAGE,               90, NORMAL,   $ff, 20, $00
+	db DOUBLE_EDGE,  EFFECT_RECOIL_HIT,           120, NORMAL,   $ff, 15, $00
+	db TAIL_WHIP,    EFFECT_DEFENSE_DOWN,           0, NORMAL,   $ff, 30, $00
+	db POISON_STING, EFFECT_POISON_HIT,            15, POISON,   $ff, 35, $4c
+	db TWINEEDLE,    EFFECT_TWINEEDLE,             25, BUG,      $ff, 20, $33
+	db PIN_MISSILE,  EFFECT_MULTI_HIT,             14, BUG,      $d8, 20, $00
+	db LEER,         EFFECT_DEFENSE_DOWN,           0, NORMAL,   $ff, 30, $00
+	db BITE,         EFFECT_FLINCH_HIT,            60, DARK,     $ff, 25, $4c
+	db GROWL,        EFFECT_ATTACK_DOWN,            0, NORMAL,   $ff, 40, $00
+	db ROAR,         EFFECT_WHIRLWIND,              0, NORMAL,   $ff, 20, $00
+	db SING,         EFFECT_SLEEP,                  0, NORMAL,   $8c, 15, $00
+	db SUPERSONIC,   EFFECT_CONFUSE,                0, NORMAL,   $8c, 20, $00
+	db SONICBOOM,    EFFECT_STATIC_DAMAGE,         20, NORMAL,   $e5, 20, $00
+	db DISABLE,      EFFECT_DISABLE,                0, NORMAL,   $8c, 20, $00
+	db ACID,         EFFECT_DEFENSE_DOWN_HIT,      40, POISON,   $ff, 30, $19
+	db EMBER,        EFFECT_BURN_HIT,              40, FIRE,     $ff, 25, $19
+	db FLAMETHROWER, EFFECT_BURN_HIT,              95, FIRE,     $ff, 15, $19
+	db MIST,         EFFECT_MIST,                   0, ICE,      $ff, 30, $00
+	db WATER_GUN,    EFFECT_NORMAL_HIT,            40, WATER,    $ff, 25, $00
+	db HYDRO_PUMP,   EFFECT_NORMAL_HIT,           120, WATER,    $cc,  5, $00
+	db SURF,         EFFECT_NORMAL_HIT,            95, WATER,    $ff, 15, $00
+	db ICE_BEAM,     EFFECT_FREEZE_HIT,            95, ICE,      $ff, 10, $19
+	db BLIZZARD,     EFFECT_FREEZE_HIT,           120, ICE,      $b2,  5, $19
+	db PSYBEAM,      EFFECT_CONFUSE_HIT,           65, PSYCHIC,  $ff, 20, $19
+	db BUBBLEBEAM,   EFFECT_SPEED_DOWN_HIT,        65, WATER,    $ff, 20, $19
+	db AURORA_BEAM,  EFFECT_ATTACK_DOWN_HIT,       65, ICE,      $ff, 20, $19
+	db HYPER_BEAM,   EFFECT_HYPER_BEAM,           150, NORMAL,   $e5,  5, $00
+	db PECK,         EFFECT_NORMAL_HIT,            35, FLYING,   $ff, 35, $00
+	db DRILL_PECK,   EFFECT_NORMAL_HIT,            80, FLYING,   $ff, 20, $00
+	db SUBMISSION,   EFFECT_RECOIL_HIT,            80, FIGHTING, $cc, 25, $00
+	db LOW_KICK,     EFFECT_FLINCH_HIT,            50, FIGHTING, $e5, 20, $4c
+	db COUNTER,      EFFECT_COUNTER,                1, FIGHTING, $ff, 20, $00
+	db SEISMIC_TOSS, EFFECT_LEVEL_DAMAGE,           1, FIGHTING, $ff, 20, $00
+	db STRENGTH,     EFFECT_NORMAL_HIT,            80, NORMAL,   $ff, 15, $00
+	db ABSORB,       EFFECT_LEECH_HIT,             20, GRASS,    $ff, 20, $00
+	db MEGA_DRAIN,   EFFECT_LEECH_HIT,             40, GRASS,    $ff, 10, $00
+	db LEECH_SEED,   EFFECT_LEECH_SEED,             0, GRASS,    $e5, 10, $00
+	db GROWTH,       EFFECT_SP_ATTACK_UP,           0, NORMAL,   $ff, 40, $00
+	db RAZOR_LEAF,   EFFECT_NORMAL_HIT,            55, GRASS,    $f2, 25, $00
+	db SOLARBEAM,    EFFECT_SOLARBEAM,            120, GRASS,    $ff, 10, $00
+	db POISONPOWDER, EFFECT_POISON,                 0, POISON,   $bf, 35, $00
+	db STUN_SPORE,   EFFECT_PARALYZE,               0, GRASS,    $bf, 30, $00
+	db SLEEP_POWDER, EFFECT_SLEEP,                  0, GRASS,    $bf, 15, $00
+	db PETAL_DANCE,  EFFECT_RAMPAGE,               70, GRASS,    $ff, 20, $00
+	db STRING_SHOT,  EFFECT_SPEED_DOWN,             0, BUG,      $f2, 40, $00
+	db DRAGON_RAGE,  EFFECT_STATIC_DAMAGE,         40, DRAGON,   $ff, 10, $00
+	db FIRE_SPIN,    EFFECT_BIND,                  15, FIRE,     $b2, 15, $00
+	db THUNDERSHOCK, EFFECT_PARALYZE_HIT,          40, ELECTRIC, $ff, 30, $19
+	db THUNDERBOLT,  EFFECT_PARALYZE_HIT,          95, ELECTRIC, $ff, 15, $19
+	db THUNDER_WAVE, EFFECT_PARALYZE,               0, ELECTRIC, $ff, 20, $00
+	db THUNDER,      EFFECT_THUNDER,              120, ELECTRIC, $b2, 10, $4c
+	db ROCK_THROW,   EFFECT_NORMAL_HIT,            50, ROCK,     $e5, 15, $00
+	db EARTHQUAKE,   EFFECT_EARTHQUAKE,           100, GROUND,   $ff, 10, $00
+	db FISSURE,      EFFECT_OHKO,                   1, GROUND,   $4c,  5, $00
+	db DIG,          EFFECT_FLY,                   60, GROUND,   $ff, 10, $00
+	db TOXIC,        EFFECT_TOXIC,                  0, POISON,   $d8, 10, $00
+	db CONFUSION,    EFFECT_CONFUSE_HIT,           50, PSYCHIC,  $ff, 25, $19
+	db PSYCHIC_M,    EFFECT_SP_DEFENSE_DOWN_HIT,   90, PSYCHIC,  $ff, 10, $19
+	db HYPNOSIS,     EFFECT_SLEEP,                  0, PSYCHIC,  $99, 20, $00
+	db MEDITATE,     EFFECT_ATTACK_UP,              0, PSYCHIC,  $ff, 40, $00
+	db AGILITY,      EFFECT_SPEED_UP_2,             0, PSYCHIC,  $ff, 30, $00
+	db QUICK_ATTACK, EFFECT_PRIORITY_HIT,          40, NORMAL,   $ff, 30, $00
+	db RAGE,         EFFECT_RAGE,                  20, NORMAL,   $ff, 20, $00
+	db TELEPORT,     EFFECT_TELEPORT,               0, PSYCHIC,  $ff, 20, $00
+	db NIGHT_SHADE,  EFFECT_LEVEL_DAMAGE,           1, GHOST,    $ff, 15, $00
+	db MIMIC,        EFFECT_MIMIC,                  0, NORMAL,   $ff, 10, $00
+	db SCREECH,      EFFECT_DEFENSE_DOWN_2,         0, NORMAL,   $d8, 40, $00
+	db DOUBLE_TEAM,  EFFECT_EVASION_UP,             0, NORMAL,   $ff, 15, $00
+	db RECOVER,      EFFECT_HEAL,                   0, NORMAL,   $ff, 20, $00
+	db HARDEN,       EFFECT_DEFENSE_UP,             0, NORMAL,   $ff, 30, $00
+	db MINIMIZE,     EFFECT_EVASION_UP,             0, NORMAL,   $ff, 20, $00
+	db SMOKESCREEN,  EFFECT_ACCURACY_DOWN,          0, NORMAL,   $ff, 20, $00
+	db CONFUSE_RAY,  EFFECT_CONFUSE,                0, GHOST,    $ff, 10, $00
+	db WITHDRAW,     EFFECT_DEFENSE_UP,             0, WATER,    $ff, 40, $00
+	db DEFENSE_CURL, EFFECT_DEFENSE_CURL,           0, NORMAL,   $ff, 40, $00
+	db BARRIER,      EFFECT_DEFENSE_UP_2,           0, PSYCHIC,  $ff, 30, $00
+	db LIGHT_SCREEN, EFFECT_LIGHT_SCREEN,           0, PSYCHIC,  $ff, 30, $00
+	db HAZE,         EFFECT_HAZE,                   0, ICE,      $ff, 30, $00
+	db REFLECT,      EFFECT_REFLECT,                0, PSYCHIC,  $ff, 20, $00
+	db FOCUS_ENERGY, EFFECT_FOCUS_ENERGY,           0, NORMAL,   $ff, 30, $00
+	db BIDE,         EFFECT_BIDE,                   0, NORMAL,   $ff, 10, $00
+	db METRONOME,    EFFECT_METRONOME,              0, NORMAL,   $ff, 10, $00
+	db MIRROR_MOVE,  EFFECT_MIRROR_MOVE,            0, FLYING,   $ff, 20, $00
+	db SELFDESTRUCT, EFFECT_EXPLOSION,            200, NORMAL,   $ff,  5, $00
+	db EGG_BOMB,     EFFECT_NORMAL_HIT,           100, NORMAL,   $bf, 10, $00
+	db LICK,         EFFECT_PARALYZE_HIT,          20, GHOST,    $ff, 30, $4c
+	db SMOG,         EFFECT_POISON_HIT,            20, POISON,   $b2, 20, $66
+	db SLUDGE,       EFFECT_POISON_HIT,            65, POISON,   $ff, 20, $4c
+	db BONE_CLUB,    EFFECT_FLINCH_HIT,            65, GROUND,   $d8, 20, $19
+	db FIRE_BLAST,   EFFECT_BURN_HIT,             120, FIRE,     $d8,  5, $19
+	db WATERFALL,    EFFECT_NORMAL_HIT,            80, WATER,    $ff, 15, $00
+	db CLAMP,        EFFECT_BIND,                  35, WATER,    $bf, 10, $00
+	db SWIFT,        EFFECT_ALWAYS_HIT,            60, NORMAL,   $ff, 20, $00
+	db SKULL_BASH,   EFFECT_SKULL_BASH,           100, NORMAL,   $ff, 15, $00
+	db SPIKE_CANNON, EFFECT_MULTI_HIT,             20, NORMAL,   $ff, 15, $00
+	db CONSTRICT,    EFFECT_SPEED_DOWN_HIT,        10, NORMAL,   $ff, 35, $19
+	db AMNESIA,      EFFECT_SP_DEFENSE_UP_2,        0, PSYCHIC,  $ff, 20, $00
+	db KINESIS,      EFFECT_ACCURACY_DOWN,          0, PSYCHIC,  $cc, 15, $00
+	db SOFTBOILED,   EFFECT_HEAL,                   0, NORMAL,   $ff, 10, $00
+	db HI_JUMP_KICK, EFFECT_JUMP_KICK,             85, FIGHTING, $e5, 20, $00
+	db GLARE,        EFFECT_PARALYZE,               0, NORMAL,   $bf, 30, $00
+	db DREAM_EATER,  EFFECT_DREAM_EATER,          100, PSYCHIC,  $ff, 15, $00
+	db POISON_GAS,   EFFECT_POISON,                 0, POISON,   $8c, 40, $00
+	db BARRAGE,      EFFECT_MULTI_HIT,             15, NORMAL,   $d8, 20, $00
+	db LEECH_LIFE,   EFFECT_LEECH_HIT,             20, BUG,      $ff, 15, $00
+	db LOVELY_KISS,  EFFECT_SLEEP,                  0, NORMAL,   $bf, 10, $00
+	db SKY_ATTACK,   EFFECT_SKY_ATTACK,           140, FLYING,   $e5,  5, $00
+	db TRANSFORM,    EFFECT_TRANSFORM,              0, NORMAL,   $ff, 10, $00
+	db BUBBLE,       EFFECT_SPEED_DOWN_HIT,        20, WATER,    $ff, 30, $19
+	db DIZZY_PUNCH,  EFFECT_CONFUSE_HIT,           70, NORMAL,   $ff, 10, $33
+	db SPORE,        EFFECT_SLEEP,                  0, GRASS,    $ff, 15, $00
+	db FLASH,        EFFECT_ACCURACY_DOWN,          0, NORMAL,   $b2, 20, $00
+	db PSYWAVE,      EFFECT_PSYWAVE,                1, PSYCHIC,  $cc, 15, $00
+	db SPLASH,       EFFECT_SPLASH,                 0, NORMAL,   $ff, 40, $00
+	db ACID_ARMOR,   EFFECT_DEFENSE_UP_2,           0, POISON,   $ff, 40, $00
+	db CRABHAMMER,   EFFECT_NORMAL_HIT,            90, WATER,    $d8, 10, $00
+	db EXPLOSION,    EFFECT_EXPLOSION,            250, NORMAL,   $ff,  5, $00
+	db FURY_SWIPES,  EFFECT_MULTI_HIT,             18, NORMAL,   $cc, 15, $00
+	db BONEMERANG,   EFFECT_DOUBLE_HIT,            50, GROUND,   $e5, 10, $00
+	db REST,         EFFECT_HEAL,                   0, PSYCHIC,  $ff, 10, $00
+	db ROCK_SLIDE,   EFFECT_FLINCH_HIT,            75, ROCK,     $e5, 10, $4c
+	db HYPER_FANG,   EFFECT_FLINCH_HIT,            80, NORMAL,   $e5, 15, $19
+	db SHARPEN,      EFFECT_ATTACK_UP,              0, NORMAL,   $ff, 30, $00
+	db CONVERSION,   EFFECT_CONVERSION,             0, NORMAL,   $ff, 30, $00
+	db TRI_ATTACK,   EFFECT_TRI_ATTACK,            80, NORMAL,   $ff, 10, $33
+	db SUPER_FANG,   EFFECT_SUPER_FANG,             1, NORMAL,   $e5, 10, $00
+	db SLASH,        EFFECT_NORMAL_HIT,            70, NORMAL,   $ff, 20, $00
+	db SUBSTITUTE,   EFFECT_SUBSTITUTE,             0, NORMAL,   $ff, 10, $00
+	db STRUGGLE,     EFFECT_RECOIL_HIT,            50, NORMAL,   $ff,  1, $00
+	db SKETCH,       EFFECT_SKETCH,                 0, NORMAL,   $ff,  1, $00
+	db TRIPLE_KICK,  EFFECT_TRIPLE_KICK,           10, FIGHTING, $e5, 10, $00
+	db THIEF,        EFFECT_THIEF,                 40, DARK,     $ff, 10, $ff
+	db SPIDER_WEB,   EFFECT_MEAN_LOOK,              0, BUG,      $ff, 10, $00
+	db MIND_READER,  EFFECT_LOCK_ON,                0, NORMAL,   $ff,  5, $00
+	db NIGHTMARE,    EFFECT_NIGHTMARE,              0, GHOST,    $ff, 15, $00
+	db FLAME_WHEEL,  EFFECT_FLAME_WHEEL,           60, FIRE,     $ff, 25, $19
+	db SNORE,        EFFECT_SNORE,                 40, NORMAL,   $ff, 15, $4c
+	db CURSE,        EFFECT_CURSE,                  0, CURSE_T,  $ff, 10, $00
+	db FLAIL,        EFFECT_REVERSAL,               1, NORMAL,   $ff, 15, $00
+	db CONVERSION2,  EFFECT_CONVERSION2,            0, NORMAL,   $ff, 30, $00
+	db AEROBLAST,    EFFECT_NORMAL_HIT,           100, FLYING,   $f2,  5, $00
+	db COTTON_SPORE, EFFECT_SPEED_DOWN_2,           0, GRASS,    $d8, 40, $00
+	db REVERSAL,     EFFECT_REVERSAL,               1, FIGHTING, $ff, 15, $00
+	db SPITE,        EFFECT_SPITE,                  0, GHOST,    $ff, 10, $00
+	db POWDER_SNOW,  EFFECT_FREEZE_HIT,            40, ICE,      $ff, 25, $19
+	db PROTECT,      EFFECT_PROTECT,                0, NORMAL,   $ff, 10, $00
+	db MACH_PUNCH,   EFFECT_PRIORITY_HIT,          40, FIGHTING, $ff, 30, $00
+	db SCARY_FACE,   EFFECT_SPEED_DOWN_2,           0, NORMAL,   $e5, 10, $00
+	db FAINT_ATTACK, EFFECT_ALWAYS_HIT,            60, DARK,     $ff, 20, $00
+	db SWEET_KISS,   EFFECT_CONFUSE,                0, NORMAL,   $bf, 10, $00
+	db BELLY_DRUM,   EFFECT_BELLY_DRUM,             0, NORMAL,   $ff, 10, $00
+	db SLUDGE_BOMB,  EFFECT_POISON_HIT,            90, POISON,   $ff, 10, $4c
+	db MUD_SLAP,     EFFECT_ACCURACY_DOWN_HIT,     20, GROUND,   $ff, 10, $ff
+	db OCTAZOOKA,    EFFECT_ACCURACY_DOWN_HIT,     65, WATER,    $d8, 10, $7f
+	db SPIKES,       EFFECT_SPIKES,                 0, GROUND,   $ff, 20, $00
+	db ZAP_CANNON,   EFFECT_PARALYZE_HIT,         100, ELECTRIC, $7f,  5, $ff
+	db FORESIGHT,    EFFECT_FORESIGHT,              0, NORMAL,   $ff, 40, $00
+	db DESTINY_BOND, EFFECT_DESTINY_BOND,           0, GHOST,    $ff,  5, $00
+	db PERISH_SONG,  EFFECT_PERISH_SONG,            0, NORMAL,   $ff,  5, $00
+	db ICY_WIND,     EFFECT_SPEED_DOWN_HIT,        55, ICE,      $f2, 15, $ff
+	db DETECT,       EFFECT_PROTECT,                0, FIGHTING, $ff,  5, $00
+	db BONE_RUSH,    EFFECT_MULTI_HIT,             25, GROUND,   $cc, 10, $00
+	db LOCK_ON,      EFFECT_LOCK_ON,                0, NORMAL,   $ff,  5, $00
+	db OUTRAGE,      EFFECT_RAMPAGE,               90, DRAGON,   $ff, 15, $00
+	db SANDSTORM,    EFFECT_SANDSTORM,              0, ROCK,     $ff, 10, $00
+	db GIGA_DRAIN,   EFFECT_LEECH_HIT,             60, GRASS,    $ff,  5, $00
+	db ENDURE,       EFFECT_ENDURE,                 0, NORMAL,   $ff, 10, $00
+	db CHARM,        EFFECT_ATTACK_DOWN_2,          0, NORMAL,   $ff, 20, $00
+	db ROLLOUT,      EFFECT_ROLLOUT,               30, ROCK,     $e5, 20, $00
+	db FALSE_SWIPE,  EFFECT_FALSE_SWIPE,           40, NORMAL,   $ff, 40, $00
+	db SWAGGER,      EFFECT_SWAGGER,                0, NORMAL,   $e5, 15, $ff
+	db MILK_DRINK,   EFFECT_HEAL,                   0, NORMAL,   $ff, 10, $00
+	db SPARK,        EFFECT_PARALYZE_HIT,          65, ELECTRIC, $ff, 20, $4c
+	db FURY_CUTTER,  EFFECT_FURY_CUTTER,           10, BUG,      $f2, 20, $00
+	db STEEL_WING,   EFFECT_STEEL_WING,            70, STEEL,    $e5, 25, $19
+	db MEAN_LOOK,    EFFECT_MEAN_LOOK,              0, NORMAL,   $ff,  5, $00
+	db ATTRACT,      EFFECT_ATTRACT,                0, NORMAL,   $ff, 15, $00
+	db SLEEP_TALK,   EFFECT_SLEEP_TALK,             0, NORMAL,   $ff, 10, $00
+	db HEAL_BELL,    EFFECT_HEAL_BELL,              0, NORMAL,   $ff,  5, $00
+	db RETURN,       EFFECT_RETURN,                 1, NORMAL,   $ff, 20, $00
+	db PRESENT,      EFFECT_PRESENT,                1, NORMAL,   $e5, 15, $00
+	db FRUSTRATION,  EFFECT_FRUSTRATION,            1, NORMAL,   $ff, 20, $00
+	db SAFEGUARD,    EFFECT_SAFEGUARD,              0, NORMAL,   $ff, 25, $00
+	db PAIN_SPLIT,   EFFECT_PAIN_SPLIT,             0, NORMAL,   $ff, 20, $00
+	db SACRED_FIRE,  EFFECT_SACRED_FIRE,          100, FIRE,     $f2,  5, $7f
+	db MAGNITUDE,    EFFECT_MAGNITUDE,              1, GROUND,   $ff, 30, $00
+	db DYNAMICPUNCH, EFFECT_CONFUSE_HIT,          100, FIGHTING, $7f,  5, $ff
+	db MEGAHORN,     EFFECT_NORMAL_HIT,           120, BUG,      $d8, 10, $00
+	db DRAGONBREATH, EFFECT_PARALYZE_HIT,          60, DRAGON,   $ff, 20, $4c
+	db BATON_PASS,   EFFECT_BATON_PASS,             0, NORMAL,   $ff, 40, $00
+	db ENCORE,       EFFECT_ENCORE,                 0, NORMAL,   $ff,  5, $00
+	db PURSUIT,      EFFECT_PURSUIT,               40, DARK,     $ff, 20, $00
+	db RAPID_SPIN,   EFFECT_RAPID_SPIN,            20, NORMAL,   $ff, 40, $00
+	db SWEET_SCENT,  EFFECT_EVASION_DOWN,           0, NORMAL,   $ff, 20, $00
+	db IRON_TAIL,    EFFECT_DEFENSE_DOWN_HIT,     100, STEEL,    $bf, 15, $4c
+	db METAL_CLAW,   EFFECT_METAL_CLAW,            50, STEEL,    $f2, 35, $19
+	db VITAL_THROW,  EFFECT_ALWAYS_HIT,            70, FIGHTING, $ff, 10, $00
+	db MORNING_SUN,  EFFECT_MORNING_SUN,            0, NORMAL,   $ff,  5, $00
+	db SYNTHESIS,    EFFECT_SYNTHESIS,              0, GRASS,    $ff,  5, $00
+	db MOONLIGHT,    EFFECT_MOONLIGHT,              0, NORMAL,   $ff,  5, $00
+	db HIDDEN_POWER, EFFECT_HIDDEN_POWER,           1, NORMAL,   $ff, 15, $00
+	db CROSS_CHOP,   EFFECT_NORMAL_HIT,           100, FIGHTING, $cc,  5, $00
+	db TWISTER,      EFFECT_TWISTER,               40, DRAGON,   $ff, 20, $33
+	db RAIN_DANCE,   EFFECT_RAIN_DANCE,             0, WATER,    $e5,  5, $00
+	db SUNNY_DAY,    EFFECT_SUNNY_DAY,              0, FIRE,     $e5,  5, $00
+	db CRUNCH,       EFFECT_SP_DEFENSE_DOWN_HIT,   80, DARK,     $ff, 15, $33
+	db MIRROR_COAT,  EFFECT_MIRROR_COAT,            1, PSYCHIC,  $ff, 20, $00
+	db PSYCH_UP,     EFFECT_PSYCH_UP,               0, NORMAL,   $ff, 10, $00
+	db EXTREMESPEED, EFFECT_PRIORITY_HIT,          80, NORMAL,   $ff,  5, $00
+	db ANCIENTPOWER, EFFECT_ANCIENTPOWER,          60, ROCK,     $ff,  5, $19
+	db SHADOW_BALL,  EFFECT_SP_DEFENSE_DOWN_HIT,   80, GHOST,    $ff, 15, $33
+	db FUTURE_SIGHT, EFFECT_FUTURE_SIGHT,          80, PSYCHIC,  $e5, 15, $00
+	db ROCK_SMASH,   EFFECT_DEFENSE_DOWN_HIT,      20, FIGHTING, $ff, 15, $7f
+	db WHIRLPOOL,    EFFECT_BIND,                  15, WATER,    $b2, 15, $00
+	db BEAT_UP,      EFFECT_BEAT_UP,               10, DARK,     $ff, 10, $00
 
--- a/constants.asm
+++ b/constants.asm
@@ -2337,6 +2337,7 @@
 EVOLVE_STAT      EQU 5
 
 ; happiness evolution triggers
+HAPPINESS_TO_EVOLVE EQU 220
 TR_ANYTIME EQU 1
 TR_MORNDAY EQU 2
 TR_NITE    EQU 3
@@ -3321,42 +3322,45 @@
 ; specials
 NUM_SPECIALS EQU $a8
 
-SPECIAL_UPDATESPRITETILES 	EQU $0038
+SPECIAL_UPDATESPRITETILES EQU $0038
 
-SPECIAL_WAITSFX 			EQU $003b
-SPECIAL_BIKESURFMUSIC 		EQU $003c
+SPECIAL_WAITSFX           EQU $003b
+SPECIAL_BIKESURFMUSIC     EQU $003c
 
-SPECIAL_LOADFACESTEP 		EQU $003f
+SPECIAL_LOADFACESTEP      EQU $003f
 
-SPECIAL_SNORLAXAWAKE 		EQU $0060
+SPECIAL_GIVESHUCKLE       EQU $004b
 
-SPECIAL_GAMEBOYCHECK 		EQU $0066
-SPECIAL_TRAINERHOUSE 		EQU $0067
+SPECIAL_SNORLAXAWAKE      EQU $0060
 
-SPECIAL_RUSTLETREE 			EQU $006a
+SPECIAL_GAMEBOYCHECK      EQU $0066
+SPECIAL_TRAINERHOUSE      EQU $0067
 
-SPECIAL_ODDEGG 				EQU $007d
+SPECIAL_RUSTLETREE        EQU $006a
 
-SPECIAL_MOVETUTOR 			EQU $0083
-SPECIAL_OMANYTECHAMBER 		EQU $0084
+SPECIAL_ODDEGG            EQU $007d
 
-SPECIAL_RUINCHAMBERWALL 	EQU $0087
+SPECIAL_MOVETUTOR         EQU $0083
+SPECIAL_OMANYTECHAMBER    EQU $0084
 
-SPECIAL_HOOHCHAMBER 		EQU $008d
+SPECIAL_RUINCHAMBERWALL   EQU $0087
 
-SPECIAL_CELEBI 				EQU $008f
+SPECIAL_HOOHCHAMBER       EQU $008d
 
-SPECIAL_AFTERCELEBI 		EQU $0090
-SPECIAL_POKESEER 			EQU $0091
+SPECIAL_CELEBI            EQU $008f
 
-SPECIAL_DRATINI 			EQU $0094
+SPECIAL_AFTERCELEBI       EQU $0090
+SPECIAL_POKESEER          EQU $0091
 
-SPECIAL_BEASTSCHECK 		EQU $0096
-SPECIAL_MONCHECK 			EQU $0097
+SPECIAL_DRATINI           EQU $0094
 
+SPECIAL_BEASTSCHECK       EQU $0096
+SPECIAL_MONCHECK          EQU $0097
 
+
 ; predefs
 PREDEF_FILLPP EQU $05
+PREDEF_ADDPARTYMON EQU $06
 PREDEF_FILLSTATS EQU $0C
 PREDEF_FILLMOVES EQU $1B
 PREDEF_GETUNOWNLETTER EQU $2D
@@ -3440,6 +3444,221 @@
 BATTLE_VARS_LAST_COUNTER_MOVE_OPP EQU 18
 BATTLE_VARS_LAST_MOVE EQU 19
 BATTLE_VARS_LAST_MOVE_OPP EQU 20
+
+
+SUBSTATUS_IN_LOVE      EQU 7
+SUBSTATUS_ENCORED      EQU 6
+SUBSTATUS_ENDURE       EQU 5
+SUBSTATUS_PERISH       EQU 4
+SUBSTATUS_PROTECT      EQU 2
+SUBSTATUS_CURSE        EQU 1
+SUBSTATUS_NIGHTMARE    EQU 0
+
+SUBSTATUS_CURLED       EQU 0
+
+SUBSTATUS_CONFUSED     EQU 7
+SUBSTATUS_FLYING       EQU 6
+SUBSTATUS_UNDERGROUND  EQU 5
+SUBSTATUS_CHARGED      EQU 4
+SUBSTATUS_FLINCHED     EQU 3
+SUBSTATUS_ROLLOUT      EQU 1
+SUBSTATUS_BIDE         EQU 0
+
+SUBSTATUS_LEECH_SEED   EQU 7
+SUBSTATUS_RAGE         EQU 6
+SUBSTATUS_RECHARGE     EQU 5
+SUBSTATUS_SUBSTITUTE   EQU 4
+SUBSTATUS_FOCUS_ENERGY EQU 2
+SUBSTATUS_UNLEASH      EQU 0
+
+SUBSTATUS_DESTINY_BOND EQU 6
+SUBSTATUS_LOCK_ON      EQU 5
+
+
+; status
+SLP EQU 7
+PSN EQU 1 << 3
+BRN EQU 1 << 4
+FRZ EQU 1 << 5
+PAR EQU 1 << 6
+
+
+
+; move effects
+EFFECT_NORMAL_HIT          EQU $00
+EFFECT_SLEEP               EQU $01
+EFFECT_POISON_HIT          EQU $02
+EFFECT_LEECH_HIT           EQU $03
+EFFECT_BURN_HIT            EQU $04
+EFFECT_FREEZE_HIT          EQU $05
+EFFECT_PARALYZE_HIT        EQU $06
+EFFECT_EXPLOSION           EQU $07
+EFFECT_DREAM_EATER         EQU $08
+EFFECT_MIRROR_MOVE         EQU $09
+EFFECT_ATTACK_UP           EQU $0a
+EFFECT_DEFENSE_UP          EQU $0b
+EFFECT_SPEED_UP            EQU $0c
+EFFECT_SP_ATTACK_UP        EQU $0d
+EFFECT_SP_DEFENSE_UP       EQU $0e
+EFFECT_ACCURACY_UP         EQU $0f
+EFFECT_EVASION_UP          EQU $10
+EFFECT_ALWAYS_HIT          EQU $11
+EFFECT_ATTACK_DOWN         EQU $12
+EFFECT_DEFENSE_DOWN        EQU $13
+EFFECT_SPEED_DOWN          EQU $14
+EFFECT_SP_ATTACK_DOWN      EQU $15
+EFFECT_SP_DEFENSE_DOWN     EQU $16
+EFFECT_ACCURACY_DOWN       EQU $17
+EFFECT_EVASION_DOWN        EQU $18
+EFFECT_HAZE                EQU $19
+EFFECT_BIDE                EQU $1a
+EFFECT_RAMPAGE             EQU $1b
+EFFECT_WHIRLWIND           EQU $1c
+EFFECT_MULTI_HIT           EQU $1d
+EFFECT_CONVERSION          EQU $1e
+EFFECT_FLINCH_HIT          EQU $1f
+EFFECT_HEAL                EQU $20
+EFFECT_TOXIC               EQU $21
+EFFECT_PAY_DAY             EQU $22
+EFFECT_LIGHT_SCREEN        EQU $23
+EFFECT_TRI_ATTACK          EQU $24
+; unused                   EQU $25
+EFFECT_OHKO                EQU $26
+EFFECT_RAZOR_WIND          EQU $27
+EFFECT_SUPER_FANG          EQU $28
+EFFECT_STATIC_DAMAGE       EQU $29
+EFFECT_BIND                EQU $2a
+; unused                   EQU $2b
+EFFECT_DOUBLE_HIT          EQU $2c
+EFFECT_JUMP_KICK           EQU $2d
+EFFECT_MIST                EQU $2e
+EFFECT_FOCUS_ENERGY        EQU $2f
+EFFECT_RECOIL_HIT          EQU $30
+EFFECT_CONFUSE             EQU $31
+EFFECT_ATTACK_UP_2         EQU $32
+EFFECT_DEFENSE_UP_2        EQU $33
+EFFECT_SPEED_UP_2          EQU $34
+EFFECT_SP_ATTACK_UP_2      EQU $35
+EFFECT_SP_DEFENSE_UP_2     EQU $36
+EFFECT_ACCURACY_UP_2       EQU $37
+EFFECT_EVASION_UP_2        EQU $38
+EFFECT_TRANSFORM           EQU $39
+EFFECT_ATTACK_DOWN_2       EQU $3a
+EFFECT_DEFENSE_DOWN_2      EQU $3b
+EFFECT_SPEED_DOWN_2        EQU $3c
+EFFECT_SP_ATTACK_DOWN_2    EQU $3d
+EFFECT_SP_DEFENSE_DOWN_2   EQU $3e
+EFFECT_ACCURACY_DOWN_2     EQU $3f
+EFFECT_EVASION_DOWN_2      EQU $40
+EFFECT_REFLECT             EQU $41
+EFFECT_POISON              EQU $42
+EFFECT_PARALYZE            EQU $43
+EFFECT_ATTACK_DOWN_HIT     EQU $44
+EFFECT_DEFENSE_DOWN_HIT    EQU $45
+EFFECT_SPEED_DOWN_HIT      EQU $46
+EFFECT_SP_ATTACK_DOWN_HIT  EQU $47
+EFFECT_SP_DEFENSE_DOWN_HIT EQU $48
+EFFECT_ACCURACY_DOWN_HIT   EQU $49
+EFFECT_EVASION_DOWN_HIT    EQU $4a
+EFFECT_SKY_ATTACK          EQU $4b
+EFFECT_CONFUSE_HIT         EQU $4c
+EFFECT_TWINEEDLE           EQU $4d
+; unused                   EQU $4e
+EFFECT_SUBSTITUTE          EQU $4f
+EFFECT_HYPER_BEAM          EQU $50
+EFFECT_RAGE                EQU $51
+EFFECT_MIMIC               EQU $52
+EFFECT_METRONOME           EQU $53
+EFFECT_LEECH_SEED          EQU $54
+EFFECT_SPLASH              EQU $55
+EFFECT_DISABLE             EQU $56
+EFFECT_LEVEL_DAMAGE        EQU $57
+EFFECT_PSYWAVE             EQU $58
+EFFECT_COUNTER             EQU $59
+EFFECT_ENCORE              EQU $5a
+EFFECT_PAIN_SPLIT          EQU $5b
+EFFECT_SNORE               EQU $5c
+EFFECT_CONVERSION2         EQU $5d
+EFFECT_LOCK_ON             EQU $5e
+EFFECT_SKETCH              EQU $5f
+EFFECT_DEFROST_OPPONENT    EQU $60
+EFFECT_SLEEP_TALK          EQU $61
+EFFECT_DESTINY_BOND        EQU $62
+EFFECT_REVERSAL            EQU $63
+EFFECT_SPITE               EQU $64
+EFFECT_FALSE_SWIPE         EQU $65
+EFFECT_HEAL_BELL           EQU $66
+EFFECT_PRIORITY_HIT        EQU $67
+EFFECT_TRIPLE_KICK         EQU $68
+EFFECT_THIEF               EQU $69
+EFFECT_MEAN_LOOK           EQU $6a
+EFFECT_NIGHTMARE           EQU $6b
+EFFECT_FLAME_WHEEL         EQU $6c
+EFFECT_CURSE               EQU $6d
+; unused                   EQU $6e
+EFFECT_PROTECT             EQU $6f
+EFFECT_SPIKES              EQU $70
+EFFECT_FORESIGHT           EQU $71
+EFFECT_PERISH_SONG         EQU $72
+EFFECT_SANDSTORM           EQU $73
+EFFECT_ENDURE              EQU $74
+EFFECT_ROLLOUT             EQU $75
+EFFECT_SWAGGER             EQU $76
+EFFECT_FURY_CUTTER         EQU $77
+EFFECT_ATTRACT             EQU $78
+EFFECT_RETURN              EQU $79
+EFFECT_PRESENT             EQU $7a
+EFFECT_FRUSTRATION         EQU $7b
+EFFECT_SAFEGUARD           EQU $7c
+EFFECT_SACRED_FIRE         EQU $7d
+EFFECT_MAGNITUDE           EQU $7e
+EFFECT_BATON_PASS          EQU $7f
+EFFECT_PURSUIT             EQU $80
+EFFECT_RAPID_SPIN          EQU $81
+; unused                   EQU $82
+; unused                   EQU $83
+EFFECT_MORNING_SUN         EQU $84
+EFFECT_SYNTHESIS           EQU $85
+EFFECT_MOONLIGHT           EQU $86
+EFFECT_HIDDEN_POWER        EQU $87
+EFFECT_RAIN_DANCE          EQU $88
+EFFECT_SUNNY_DAY           EQU $89
+EFFECT_STEEL_WING          EQU $8a
+EFFECT_METAL_CLAW          EQU $8b
+EFFECT_ANCIENTPOWER        EQU $8c
+EFFECT_FAKE_OUT            EQU $8d
+EFFECT_BELLY_DRUM          EQU $8e
+EFFECT_PSYCH_UP            EQU $8f
+EFFECT_MIRROR_COAT         EQU $90
+EFFECT_SKULL_BASH          EQU $91
+EFFECT_TWISTER             EQU $92
+EFFECT_EARTHQUAKE          EQU $93
+EFFECT_FUTURE_SIGHT        EQU $94
+EFFECT_GUST                EQU $95
+EFFECT_STOMP               EQU $96
+EFFECT_SOLARBEAM           EQU $97
+EFFECT_THUNDER             EQU $98
+EFFECT_TELEPORT            EQU $99
+EFFECT_BEAT_UP             EQU $9a
+EFFECT_FLY                 EQU $9b
+EFFECT_DEFENSE_CURL        EQU $9c
+
+
+
+; battle animations
+; animations below fc are 1:1 with move constants
+ANIM_CONFUSED EQU $103
+ANIM_SLEEP    EQU $104
+
+ANIM_INLOVE   EQU $10a
+
+
+WEATHER_RAIN EQU 1
+WEATHER_SUN EQU 2
+WEATHER_SANDSTORM EQU 3
+WEATHER_RAIN_END EQU 4
+WEATHER_SUN_END EQU 5
+WEATHER_SANDSTORM_END EQU 6
 
 
 ; joypad
--- a/extras/chars.py
+++ b/extras/chars.py
@@ -98,6 +98,7 @@
     0xE9: "&",
     0xEA: "é",
     0xEB: "→",
+    0xED: "▶",
     0xEF: "♂",
     0xF0: "¥",
     0xF1: "×",
--- a/extras/crystal.py
+++ b/extras/crystal.py
@@ -2917,7 +2917,7 @@
 # special case for 0xFD (if loopchannel.count = 0, break)
 
 def create_music_command_classes(debug=False):
-    klasses = [GivePoke]
+    klasses = []
     for (byte, cmd) in music_commands_new.items():
         cmd_name = cmd[0].replace(" ", "_")
         params = {"id": byte, "size": 1, "end": byte in music_command_enders, "macro_name": cmd_name}
@@ -2942,6 +2942,221 @@
     # later an individual klass will be instantiated to handle something
     return klasses
 music_classes = create_music_command_classes()
+
+
+
+effect_commands = {
+	0x1: ['checkturn'],
+	0x2: ['checkobedience'],
+	0x3: ['usedmovetext'],
+	0x4: ['doturn'],
+	0x5: ['critical'],
+	0x6: ['damagestats'],
+	0x7: ['stab'],
+	0x8: ['damagevariation'],
+	0x9: ['checkhit'],
+	0xa: ['effect0x0a'],
+	0xb: ['effect0x0b'],
+	0xc: ['effect0x0c'],
+	0xd: ['resulttext'],
+	0xe: ['checkfaint'],
+	0xf: ['criticaltext'],
+	0x10: ['supereffectivetext'],
+	0x11: ['checkdestinybond'],
+	0x12: ['buildopponentrage'],
+	0x13: ['poisontarget'],
+	0x14: ['sleeptarget'],
+	0x15: ['draintarget'],
+	0x16: ['eatdream'],
+	0x17: ['burntarget'],
+	0x18: ['freezetarget'],
+	0x19: ['paralyzetarget'],
+	0x1a: ['selfdestruct'],
+	0x1b: ['mirrormove'],
+	0x1c: ['statup'],
+	0x1d: ['statdown'],
+	0x1e: ['payday'],
+	0x1f: ['conversion'],
+	0x20: ['resetstats'],
+	0x21: ['storeenergy'],
+	0x22: ['unleashenergy'],
+	0x23: ['forceswitch'],
+	0x24: ['endloop'],
+	0x25: ['flinchtarget'],
+	0x26: ['ohko'],
+	0x27: ['recoil'],
+	0x28: ['mist'],
+	0x29: ['focusenergy'],
+	0x2a: ['confuse'],
+	0x2b: ['confusetarget'],
+	0x2c: ['heal'],
+	0x2d: ['transform'],
+	0x2e: ['screen'],
+	0x2f: ['poison'],
+	0x30: ['paralyze'],
+	0x31: ['substitute'],
+	0x32: ['rechargenextturn'],
+	0x33: ['mimic'],
+	0x34: ['metronome'],
+	0x35: ['leechseed'],
+	0x36: ['splash'],
+	0x37: ['disable'],
+	0x38: ['cleartext'],
+	0x39: ['charge'],
+	0x3a: ['checkcharge'],
+	0x3b: ['traptarget'],
+	0x3c: ['effect0x3c'],
+	0x3d: ['rampage'],
+	0x3e: ['checkrampage'],
+	0x3f: ['constantdamage'],
+	0x40: ['counter'],
+	0x41: ['encore'],
+	0x42: ['painsplit'],
+	0x43: ['snore'],
+	0x44: ['conversion2'],
+	0x45: ['lockon'],
+	0x46: ['sketch'],
+	0x47: ['defrostopponent'],
+	0x48: ['sleeptalk'],
+	0x49: ['destinybond'],
+	0x4a: ['spite'],
+	0x4b: ['falseswipe'],
+	0x4c: ['healbell'],
+	0x4d: ['kingsrock'],
+	0x4e: ['triplekick'],
+	0x4f: ['kickcounter'],
+	0x50: ['thief'],
+	0x51: ['arenatrap'],
+	0x52: ['nightmare'],
+	0x53: ['defrost'],
+	0x54: ['curse'],
+	0x55: ['protect'],
+	0x56: ['spikes'],
+	0x57: ['foresight'],
+	0x58: ['perishsong'],
+	0x59: ['startsandstorm'],
+	0x5a: ['endure'],
+	0x5b: ['checkcurl'],
+	0x5c: ['rolloutpower'],
+	0x5d: ['effect0x5d'],
+	0x5e: ['furycutter'],
+	0x5f: ['attract'],
+	0x60: ['happinesspower'],
+	0x61: ['present'],
+	0x62: ['damagecalc'],
+	0x63: ['frustrationpower'],
+	0x64: ['safeguard'],
+	0x65: ['checksafeguard'],
+	0x66: ['getmagnitude'],
+	0x67: ['batonpass'],
+	0x68: ['pursuit'],
+	0x69: ['clearhazards'],
+	0x6a: ['healmorn'],
+	0x6b: ['healday'],
+	0x6c: ['healnite'],
+	0x6d: ['hiddenpower'],
+	0x6e: ['startrain'],
+	0x6f: ['startsun'],
+	0x70: ['attackup'],
+	0x71: ['defenseup'],
+	0x72: ['speedup'],
+	0x73: ['specialattackup'],
+	0x74: ['specialdefenseup'],
+	0x75: ['accuracyup'],
+	0x76: ['evasionup'],
+	0x77: ['attackup2'],
+	0x78: ['defenseup2'],
+	0x79: ['speedup2'],
+	0x7a: ['specialattackup2'],
+	0x7b: ['specialdefenseup2'],
+	0x7c: ['accuracyup2'],
+	0x7d: ['evasionup2'],
+	0x7e: ['attackdown'],
+	0x7f: ['defensedown'],
+	0x80: ['speeddown'],
+	0x81: ['specialattackdown'],
+	0x82: ['specialdefensedown'],
+	0x83: ['accuracydown'],
+	0x84: ['evasiondown'],
+	0x85: ['attackdown2'],
+	0x86: ['defensedown2'],
+	0x87: ['speeddown2'],
+	0x88: ['specialattackdown2'],
+	0x89: ['specialdefensedown2'],
+	0x8a: ['accuracydown2'],
+	0x8b: ['evasiondown2'],
+	0x8c: ['statmessageuser'],
+	0x8d: ['statmessagetarget'],
+	0x8e: ['statupfailtext'],
+	0x8f: ['statdownfailtext'],
+	0x90: ['effectchance'],
+	0x91: ['effect0x91'],
+	0x92: ['effect0x92'],
+	0x93: ['switchturn'],
+	0x94: ['fakeout'],
+	0x95: ['bellydrum'],
+	0x96: ['psychup'],
+	0x97: ['rage'],
+	0x98: ['doubleflyingdamage'],
+	0x99: ['doubleundergrounddamage'],
+	0x9a: ['mirrorcoat'],
+	0x9b: ['checkfuturesight'],
+	0x9c: ['futuresight'],
+	0x9d: ['doubleminimizedamage'],
+	0x9e: ['skipsuncharge'],
+	0x9f: ['thunderaccuracy'],
+	0xa0: ['teleport'],
+	0xa1: ['beatup'],
+	0xa2: ['ragedamage'],
+	0xa3: ['effect0xa3'],
+	0xa4: ['allstatsup'],
+	0xa5: ['effect0xa5'],
+	0xa6: ['effect0xa6'],
+	0xa7: ['effect0xa7'],
+	0xa8: ['effect0xa8'],
+	0xa9: ['clearmissdamage'],
+	0xaa: ['wait'],
+	0xab: ['hittarget'],
+	0xac: ['tristatuschance'],
+	0xad: ['supereffectivelooptext'],
+	0xae: ['startloop'],
+	0xaf: ['curl'],
+	0xfe: ['endturn'],
+	0xff: ['endmove'],
+}
+
+effect_command_enders = [0xFF,]
+
+def create_effect_command_classes(debug=False):
+    klasses = []
+    for (byte, cmd) in effect_commands.items():
+        cmd_name = cmd[0].replace(" ", "_")
+        params = {
+            "id": byte,
+            "size": 1,
+            "end": byte in effect_command_enders,
+            "macro_name": cmd_name
+	}
+        params["param_types"] = {}
+        if len(cmd) > 1:
+            param_types = cmd[1:]
+            for (i, each) in enumerate(param_types):
+                thing = {"name": each[0], "class": each[1]}
+                params["param_types"][i] = thing
+                if debug:
+                    print "each is: " + str(each)
+                    print "thing[class] is: " + str(thing["class"])
+                params["size"] += thing["class"].size
+        klass_name = cmd_name+"Command"
+        klass = classobj(klass_name, (Command,), params)
+        globals()[klass_name] = klass
+        klasses.append(klass)
+    # later an individual klass will be instantiated to handle something
+    return klasses
+
+effect_classes = create_effect_command_classes()
+
+
 
 def generate_macros(filename="../script_macros.asm"):
     """generates all macros based on commands
--- a/hram.asm
+++ b/hram.asm
@@ -26,6 +26,16 @@
 
 hPastLeadingZeroes EQU $ffb3
 
+hDividend          EQU $ffb3
+hDivisor           EQU $ffb7
+hQuotient          EQU $ffb4
+
+hMultiplicand      EQU $ffb4
+hMultiplier        EQU $ffb7
+hProduct           EQU $ffb3
+
+hMathBuffer        EQU $ffb8
+
 hLCDStatCustom     EQU $ffc6
 
 hBGMapMode         EQU $ffd4
--- a/main.asm
+++ b/main.asm
@@ -56,7 +56,7 @@
 
 SECTION "start",HOME[$150]
 
-INCBIN "baserom.gbc",$150,$283 - $150
+INCBIN "baserom.gbc", $150, $283 - $150
 
 
 VBlank: ; 283
@@ -63,7 +63,7 @@
 INCLUDE "vblank.asm"
 
 
-DelayFrame: ; 0x45a
+DelayFrame: ; 45a
 ; Wait for one frame
 	ld a, 1
 	ld [VBlankOccurred], a
@@ -75,25 +75,26 @@
 	and a
 	jr nz, .halt
 	ret
-; 0x468
+; 468
 
-DelayFrames: ; 0x468
+
+DelayFrames: ; 468
 ; Wait c frames
 	call DelayFrame
 	dec c
 	jr nz, DelayFrames
 	ret
-; 0x46f
+; 46f
 
+
 RTC: ; 46f
 ; update time and time-sensitive palettes
 
 ; rtc enabled?
 	ld a, [$c2ce]
-	cp $0
+	cp 0
 	ret z
 	
-; update clock
 	call UpdateTime
 	
 ; obj update on?
@@ -106,8 +107,10 @@
 	ret
 ; 485
 
-INCBIN "baserom.gbc",$485,$52f - $485
 
+INCBIN "baserom.gbc", $485, $52f - $485
+
+
 IncGradGBPalTable_01: ; 52f
 	db %11111111 ; bgp
 	db %11111111 ; obp1
@@ -142,8 +145,10 @@
 	db %00000000
 ; 547
 
-INCBIN "baserom.gbc",$547,$568 - $547
 
+INCBIN "baserom.gbc", $547, $568 - $547
+
+
 DisableLCD: ; 568
 ; Turn the LCD off
 ; Most of this is just going through the motions
@@ -186,6 +191,7 @@
 	ret
 ; 58a
 
+
 EnableLCD: ; 58a
 	ld a, [rLCDC]
 	set 7, a ; lcd enable
@@ -193,10 +199,12 @@
 	ret
 ; 591
 
+
 AskTimer: ; 591
-	INCBIN "baserom.gbc",$591,$59c - $591
+	INCBIN "baserom.gbc", $591, $59c - $591
 ; 59c
 
+
 LatchClock: ; 59c
 ; latch clock counter data
 	ld a, $0
@@ -206,6 +214,7 @@
 	ret
 ; 5a7
 
+
 UpdateTime: ; 5a7
 ; get rtc data
 	call GetClock
@@ -218,6 +227,7 @@
 	ret
 ; 5b7
 
+
 GetClock: ; 5b7
 ; store clock data in hRTCDayHi-hRTCSeconds
 
@@ -374,7 +384,7 @@
 	ret
 ; 658
 
-INCBIN "baserom.gbc",$658,$691 - $658
+INCBIN "baserom.gbc", $658, $691 - $658
 
 SetClock: ; 691
 ; set clock data from hram
@@ -424,13 +434,13 @@
 	ret
 ; 6c4
 
-INCBIN "baserom.gbc",$6c4,$92e - $6c4
+INCBIN "baserom.gbc", $6c4, $92e - $6c4
 
 
 INCLUDE "joypad.asm"
 
 
-INCBIN "baserom.gbc",$a1b,$b40 - $a1b
+INCBIN "baserom.gbc", $a1b, $b40 - $a1b
 
 FarDecompress: ; b40
 ; Decompress graphics data at a:hl to de
@@ -811,7 +821,8 @@
 	ld a, [hCGB]
 	and a
 	ret z
-	
+
+
 UpdateCGBPals: ; c33
 ; return carry if successful
 ; any pals to update?
@@ -818,114 +829,54 @@
 	ld a, [hCGBPalUpdate]
 	and a
 	ret z
-	
+
+
 ForceUpdateCGBPals: ; c37
-; save wram bank
+
 	ld a, [rSVBK]
 	push af
-; bankswitch
 	ld a, 5 ; BANK(BGPals)
 	ld [rSVBK], a
-; get bg pal buffer
+
 	ld hl, BGPals ; 5:d080
-	
-; update bg pals
+
+; copy 8 pals to bgpd
 	ld a, %10000000 ; auto increment, index 0
 	ld [rBGPI], a
-	ld c, rBGPD - rJOYP
+	ld c, rBGPD % $100
 	ld b, 4 ; NUM_PALS / 2
-	
 .bgp
-; copy 16 bytes (8 colors / 2 pals) to bgpd
+	rept $10
 	ld a, [hli]
 	ld [$ff00+c], a
-	ld a, [hli]
-	ld [$ff00+c], a
-	ld a, [hli]
-	ld [$ff00+c], a
-	ld a, [hli]
-	ld [$ff00+c], a
-	ld a, [hli]
-	ld [$ff00+c], a
-	ld a, [hli]
-	ld [$ff00+c], a
-	ld a, [hli]
-	ld [$ff00+c], a
-	ld a, [hli]
-	ld [$ff00+c], a
-	ld a, [hli]
-	ld [$ff00+c], a
-	ld a, [hli]
-	ld [$ff00+c], a
-	ld a, [hli]
-	ld [$ff00+c], a
-	ld a, [hli]
-	ld [$ff00+c], a
-	ld a, [hli]
-	ld [$ff00+c], a
-	ld a, [hli]
-	ld [$ff00+c], a
-	ld a, [hli]
-	ld [$ff00+c], a
-	ld a, [hli]
-	ld [$ff00+c], a
-; done?
+	endr
+
 	dec b
 	jr nz, .bgp
 	
 ; hl is now 5:d0c0 OBPals
 	
-; update obj pals
+; copy 8 pals to obpd
 	ld a, %10000000 ; auto increment, index 0
 	ld [rOBPI], a
 	ld c, rOBPD - rJOYP
 	ld b, 4 ; NUM_PALS / 2
-	
 .obp
-; copy 16 bytes (8 colors / 2 pals) to obpd
+	rept $10
 	ld a, [hli]
 	ld [$ff00+c], a
-	ld a, [hli]
-	ld [$ff00+c], a
-	ld a, [hli]
-	ld [$ff00+c], a
-	ld a, [hli]
-	ld [$ff00+c], a
-	ld a, [hli]
-	ld [$ff00+c], a
-	ld a, [hli]
-	ld [$ff00+c], a
-	ld a, [hli]
-	ld [$ff00+c], a
-	ld a, [hli]
-	ld [$ff00+c], a
-	ld a, [hli]
-	ld [$ff00+c], a
-	ld a, [hli]
-	ld [$ff00+c], a
-	ld a, [hli]
-	ld [$ff00+c], a
-	ld a, [hli]
-	ld [$ff00+c], a
-	ld a, [hli]
-	ld [$ff00+c], a
-	ld a, [hli]
-	ld [$ff00+c], a
-	ld a, [hli]
-	ld [$ff00+c], a
-	ld a, [hli]
-	ld [$ff00+c], a
-; done?
+	endr
+
 	dec b
 	jr nz, .obp
 	
-; restore wram bank
 	pop af
 	ld [rSVBK], a
+
 ; clear pal update queue
 	xor a
 	ld [hCGBPalUpdate], a
-; successfully updated palettes
+
 	scf
 	ret
 ; c9f
@@ -935,23 +886,22 @@
 ; exists to forego reinserting cgb-converted image data
 
 ; input: a -> bgp
+
 	ld [rBGP], a
 	push af
-	
-; check cgb
+
 	ld a, [hCGB]
 	and a
 	jr z, .end
-	
+
 	push hl
 	push de
 	push bc
-; save wram bank
-	ld a, [$ff70]
+	ld a, [rSVBK]
 	push af
-; wram bank 5
+
 	ld a, 5
-	ld [$ff70], a
+	ld [rSVBK], a
 
 ; copy & reorder bg pal buffer
 	ld hl, BGPals ; to
@@ -959,15 +909,15 @@
 ; order
 	ld a, [rBGP]
 	ld b, a
-; # pals
-	ld c, 8 ; all pals
+; all pals
+	ld c, 8
 	call CopyPals
 ; request pal update
-	ld a, $1
+	ld a, 1
 	ld [hCGBPalUpdate], a
-; restore wram bank
+
 	pop af
-	ld [$ff70], a
+	ld [rSVBK], a
 	pop bc
 	pop de
 	pop hl
@@ -981,44 +931,41 @@
 ; exists to forego reinserting cgb-converted image data
 
 ; input: d -> obp1
-;		 e -> obp2
+;        e -> obp2
+
 	ld a, e
 	ld [rOBP0], a
 	ld a, d
 	ld [rOBP1], a
 	
-; check cgb
 	ld a, [hCGB]
 	and a
 	ret z
-	
+
 	push hl
 	push de
 	push bc
-; save wram bank
-	ld a, [$ff70]
+	ld a, [rSVBK]
 	push af
-; wram bank 5
-	ld a, $5
-	ld [$ff70], a
-	
+
+	ld a, 5
+	ld [rSVBK], a
+
 ; copy & reorder obj pal buffer
-	; to
-	ld hl, OBPals
-	; from
-	ld de, Unkn2Pals
+	ld hl, OBPals ; to
+	ld de, Unkn2Pals ; from
 ; order
 	ld a, [rOBP0]
 	ld b, a
-; # pals
-	ld c, 8 ; all pals
+; all pals
+	ld c, 8
 	call CopyPals
 ; request pal update
-	ld a, $1
+	ld a, 1
 	ld [hCGBPalUpdate], a
-; restore wram bank
+
 	pop af
-	ld [$ff70], a
+	ld [rSVBK], a
 	pop bc
 	pop de
 	pop hl
@@ -1025,8 +972,10 @@
 	ret
 ; cf8
 
-INCBIN "baserom.gbc",$cf8,$d50 - $cf8
 
+INCBIN "baserom.gbc", $cf8, $d50 - $cf8
+
+
 CopyPals: ; d50
 ; copy c palettes in order b from de to hl
 
@@ -1079,47 +1028,60 @@
 	ret
 ; d79
 
-INCBIN "baserom.gbc",$d79,$e8d - $d79
 
-; copy bc bytes from a:hl to de
+INCBIN "baserom.gbc", $d79, $e8d - $d79
+
+
 FarCopyBytes: ; e8d
+; copy bc bytes from a:hl to de
+
 	ld [hBuffer], a
-	ld a, [hROMBank] ; save old bank
+	ld a, [hROMBank]
 	push af
 	ld a, [hBuffer]
 	rst Bankswitch
+
 	call CopyBytes
+
 	pop af
 	rst Bankswitch
 	ret
 ; 0xe9b
 
-; copy bc*2 source bytes from a:hl to de, doubling each byte in process
+
 FarCopyBytesDouble: ; e9b
+; Copy bc bytes from a:hl to bc*2 bytes at de,
+; doubling each byte in the process.
+
 	ld [hBuffer], a
-	ld a, [hROMBank] ; save current bank
+	ld a, [hROMBank]
 	push af
 	ld a, [hBuffer]
-	rst Bankswitch ; bankswitch
-	ld a, h ; switcheroo, de <> hl
+	rst Bankswitch
+
+; switcheroo, de <> hl
+	ld a, h
 	ld h, d
 	ld d, a
 	ld a, l
 	ld l, e
 	ld e, a
+
 	inc b
 	inc c
-	jr .dec ; 0xeab $4
+	jr .dec
+
 .loop
 	ld a, [de]
 	inc de
-	ld [hli], a ; write twice
 	ld [hli], a
+	ld [hli], a
 .dec
 	dec c
 	jr nz, .loop
 	dec b
 	jr nz, .loop
+
 	pop af
 	rst Bankswitch
 	ret
@@ -1126,16 +1088,39 @@
 ; 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
+; We aren't done if the LCD is on.
 	ld a, [rLCDC]
 	bit 7, a
 	ret z
@@ -1142,8 +1127,27 @@
 	jp WaitBGMap
 ; fdb
 
-INCBIN "baserom.gbc",$fdb,$ff1 - $fdb
 
+INCBIN "baserom.gbc", $fdb, $fe8 - $fdb
+
+
+TextBox: ; fe8
+; draw a text box of given location/size
+; ? hl
+; size bc
+; ? de
+
+; draw border
+	push bc
+	push hl
+	call TextBoxBorder
+	pop hl
+	pop bc
+; fill textbox area with palette 7
+	jr TextBoxPalette
+; ff1
+
+
 TextBoxBorder: ; ff1
 ; draw a text box
 ; upper-left corner at coordinates hl
@@ -1185,9 +1189,10 @@
 	call NPlaceChar
 	ld [hl], "┘"
 	ret
-; 0x101e
+; 101e
 
-NPlaceChar: ; 0x101e
+
+NPlaceChar: ; 101e
 ; place a row of width c of identical characters
 	ld d,c
 .loop\@
@@ -1195,13 +1200,64 @@
 	dec d
 	jr nz,.loop\@
 	ret
-; 0x1024
+; 1024
 
-INCBIN "baserom.gbc",$1024,$1078 - $1024
 
-PlaceString: ; $1078
+TextBoxPalette: ; 1024
+; fill textbox area with pal 07
+; hl: tile address
+; b: height
+; c: width
+	ld de, AttrMap - TileMap
+	add hl, de
+	inc b
+	inc b
+	inc c
+	inc c
+	ld a, $07 ; palette
+.gotoy
+	push bc
 	push hl
-PlaceNextChar:
+.gotox
+	ld [hli], a
+	dec c
+	jr nz, .gotox
+	pop hl
+	ld de, $0014 ; screen width in tiles (20)
+	add hl, de
+	pop bc
+	dec b
+	jr nz, .gotoy
+	ret
+; 103e
+
+
+SpeechTextBox: ; 103e
+; Standard textbox.
+	ld hl, $c590 ; tile 0, 12
+	ld b, $4 ; height
+	ld c, $12 ; width ; SCREEN_WIDTH - 2 (border)
+	jp TextBox
+; 1048
+
+
+INCBIN "baserom.gbc", $1048, $1065 - $1048
+
+
+PrintTextBoxText: ; 1065
+	ld bc, $c5b9 ; TileMap(1,14)
+	call $13e5 ; PrintText
+	ret
+; 106c
+
+
+INCBIN "baserom.gbc", $106c, $1078 - $106c
+
+
+PlaceString: ; 1078
+	push hl
+
+PlaceNextChar: ; 1079
 	ld a, [de]
 	cp "@"
 	jr nz, CheckDict
@@ -1215,7 +1271,7 @@
 	inc de
 	jp PlaceNextChar
 
-CheckDict:
+CheckDict: ; 1087
 	cp $15
 	jp z, $117b
 	cp $4f
@@ -1329,8 +1385,10 @@
 	jp NextChar
 ; 0x117b
 
-INCBIN "baserom.gbc",$117b,$1203 - $117b
 
+INCBIN "baserom.gbc", $117b, $1203 - $117b
+
+
 Char5D:
 	ld a, [hBattleTurn]
 	push de
@@ -1400,7 +1458,7 @@
 Char5BText: ; 0x127e
 	db "PC@"
 
-INCBIN "baserom.gbc",$1281,$1293 - $1281
+INCBIN "baserom.gbc", $1281, $1293 - $1281
 
 Char56Text: ; 0x1293
 	db "…@"
@@ -1407,7 +1465,7 @@
 Char5AText: ; 0x1295
 	db "Enemy @"
 
-INCBIN "baserom.gbc",$129c,$1356 - $129c
+INCBIN "baserom.gbc", $129c, $1356 - $129c
 
 Char5F: ; 0x1356
 ; ends a Pokédex entry
@@ -1415,7 +1473,7 @@
 	pop hl
 	ret
 
-INCBIN "baserom.gbc",$135a,$15d8 - $135a
+INCBIN "baserom.gbc", $135a, $15d8 - $135a
 
 DMATransfer: ; 15d8
 ; DMA transfer
@@ -2025,7 +2083,7 @@
 	ret
 ; 17ff
 
-INCBIN "baserom.gbc",$17ff,$185d - $17ff
+INCBIN "baserom.gbc", $17ff, $185d - $17ff
 
 GetTileType: ; 185d
 ; checks the properties of a tile
@@ -2050,7 +2108,7 @@
 	ret
 ; 1875
 
-INCBIN "baserom.gbc",$1875,$2063 - $1875
+INCBIN "baserom.gbc", $1875, $2063 - $1875
 
 AskSerial: ; 2063
 ; send out a handshake while serial int is off
@@ -2090,7 +2148,7 @@
 	ret
 ; 208a
 
-INCBIN "baserom.gbc",$208a,$209e - $208a
+INCBIN "baserom.gbc", $208a, $209e - $208a
 
 GameTimer: ; 209e
 ; precautionary
@@ -2220,7 +2278,7 @@
 	ret
 ; 210f
 
-INCBIN "baserom.gbc",$210f,$261f - $210f
+INCBIN "baserom.gbc", $210f, $261f - $210f
 
 PushScriptPointer: ; 261f
 ; used to call a script from asm
@@ -2244,7 +2302,7 @@
 	ret
 ; 2631
 
-INCBIN "baserom.gbc",$2631,$26d4 - $2631
+INCBIN "baserom.gbc", $2631, $26d4 - $2631
 
 GetScriptByte: ; 0x26d4
 ; Return byte at ScriptBank:ScriptPos in a.
@@ -2289,7 +2347,7 @@
 	db "@"
 ; 0x26f7
 
-INCBIN "baserom.gbc",$26f7,$2bed-$26f7
+INCBIN "baserom.gbc", $26f7, $2bed-$26f7
 
 GetMapHeaderPointer: ; 0x2bed
 ; Prior to calling this function, you must have switched banks so that
@@ -2359,7 +2417,7 @@
 	ret
 ; 0x2c1c
 
-INCBIN "baserom.gbc",$2c1c,$2c7d-$2c1c
+INCBIN "baserom.gbc", $2c1c, $2c7d-$2c1c
 
 GetSecondaryMapHeaderPointer: ; 0x2c7d
 ; returns the current map's secondary map header pointer in hl.
@@ -2373,7 +2431,7 @@
 	pop bc
 	ret
 
-INCBIN "baserom.gbc",$2c8a,$2caf-$2c8a
+INCBIN "baserom.gbc", $2c8a, $2caf-$2c8a
 
 GetWorldMapLocation: ; 0x2caf
 ; given a map group/id in bc, return its location on the Pokégear map.
@@ -2389,7 +2447,7 @@
 	ret
 ; 0x2cbd
 
-INCBIN "baserom.gbc",$2cbd,$2d63-$2cbd
+INCBIN "baserom.gbc", $2cbd, $2d63-$2cbd
 
 FarJpHl: ; 2d63
 ; Jump to a:hl.
@@ -2500,7 +2558,7 @@
 	ret
 ; 2dba
 
-INCBIN "baserom.gbc",$2dba,$2e6f-$2dba
+INCBIN "baserom.gbc", $2dba, $2e6f-$2dba
 
 BitTable1Func: ; 0x2e6f
 	ld hl, $da72
@@ -2692,7 +2750,7 @@
 	jp [hl]
 ; 2fed
 
-INCBIN "baserom.gbc",$2fed,$300b-$2fed
+INCBIN "baserom.gbc", $2fed, $300b-$2fed
 
 ClearSprites: ; 300b
 	ld hl, Sprites
@@ -2813,7 +2871,7 @@
 	ret
 ; 0x306b
 
-INCBIN "baserom.gbc",$306b,$30d6-$306b
+INCBIN "baserom.gbc", $306b, $30d6-$306b
 
 CopyName1: ; 30d6
 	ld hl, StringBuffer2
@@ -2836,7 +2894,7 @@
 	ld c,a
 .loop\@
 	ld a,[hl]
-	cp a,$FF
+	cp a, $FF
 	jr z,.NotInArray\@
 	cp c
 	jr z,.InArray\@
@@ -2874,34 +2932,49 @@
 	ret
 ; 0x3105
 
-INCBIN "baserom.gbc",$3105,$3119-$3105
 
-Multiply: ; 0x3119
-; function to do multiplication
-; all values are big endian
-; INPUT
-; ffb4-ffb6 =  multiplicand
-; ffb7 = multiplier
-; OUTPUT
-; ffb3-ffb6 = product
-	INCBIN "baserom.gbc",$3119,$3124 - $3119
-; 0x3124
+INCBIN "baserom.gbc", $3105, $3119 - $3105
 
-Divide: ; 0x3124
-; function to do division
-; all values are big endian
-; INPUT
-; ffb3-ffb6 = dividend
-; ffb7 = divisor
-; b = number of bytes in the dividend (starting from ffb3)
-; OUTPUT
-; ffb4-ffb6 = quotient
-; ffb7 = remainder
-	INCBIN "baserom.gbc",$3124,$3136 - $3124
-; 0x3136
 
-INCBIN "baserom.gbc",$3136,$313d - $3136
+Multiply: ; 3119
+; Multiply hMultiplicand (3 bytes) by hMultiplier. Result in hProduct.
+; All values are big endian.
+	push hl
+	push bc
 
+	callab _Multiply
+
+	pop bc
+	pop hl
+	ret
+; 3124
+
+
+Divide: ; 3124
+; Divide hDividend length b (max 4 bytes) by hDivisor. Result in hQuotient.
+; All values are big endian.
+	push hl
+	push de
+	push bc
+	ld a, [hROMBank]
+	push af
+	ld a, BANK(_Divide)
+	rst Bankswitch
+
+	call _Divide
+
+	pop af
+	rst Bankswitch
+	pop bc
+	pop de
+	pop hl
+	ret
+; 3136
+
+
+INCBIN "baserom.gbc", $3136, $313d - $3136
+
+
 PrintLetterDelay: ; 313d
 ; wait some frames before printing the next letter
 ; the text speed setting in Options is actually a frame count
@@ -3004,7 +3077,7 @@
 	ret
 ; 0x3198
 
-INCBIN "baserom.gbc",$3198,$31db - $3198
+INCBIN "baserom.gbc", $3198, $31db - $3198
 
 StringCmp: ; 31db
 ; Compare strings, c bytes in length, at de and hl.
@@ -3019,7 +3092,7 @@
 	ret
 ; 0x31e4
 
-INCBIN "baserom.gbc",$31e4,$31f3 - $31e4
+INCBIN "baserom.gbc", $31e4, $31f3 - $31e4
 
 WhiteBGMap: ; 31f3
 	call ClearPalettes
@@ -3033,7 +3106,7 @@
 	ret
 ; 3200
 
-INCBIN "baserom.gbc",$3200,$3317 - $3200
+INCBIN "baserom.gbc", $3200, $3317 - $3200
 
 ClearPalettes: ; 3317
 ; Make all palettes white
@@ -3052,11 +3125,11 @@
 	
 .cgb
 ; Save WRAM bank
-	ld a, [$ff70]
+	ld a, [rSVBK]
 	push af
 ; WRAM bank 5
 	ld a, 5
-	ld [$ff70], a
+	ld [rSVBK], a
 ; Fill BGPals and OBPals with $ffff (white)
 	ld hl, BGPals
 	ld bc, $0080
@@ -3064,7 +3137,7 @@
 	call ByteFill
 ; Restore WRAM bank
 	pop af
-	ld [$ff70], a
+	ld [rSVBK], a
 ; Request palette update
 	ld a, 1
 	ld [hCGBPalUpdate], a
@@ -3091,7 +3164,7 @@
 	jp Predef
 ; 334e
 
-INCBIN "baserom.gbc",$334e,$335f - $334e
+INCBIN "baserom.gbc", $334e, $335f - $334e
 
 CountSetBits: ; 0x335f
 ; function to count how many bits are set in a string of bytes
@@ -3119,7 +3192,7 @@
 	ret
 ; 0x3376
 
-INCBIN "baserom.gbc",$3376,$33ab - $3376
+INCBIN "baserom.gbc", $3376, $33ab - $3376
 
 NamesPointerTable: ; 33ab
 	dbw BANK(PokemonNames), PokemonNames
@@ -3181,7 +3254,7 @@
 	ret
 ; 0x3411
 
-INCBIN "baserom.gbc",$3411,$3411 - $3411
+INCBIN "baserom.gbc", $3411, $3411 - $3411
 
 GetNthString: ; 3411
 ; Starting at hl, this function returns the start address of the ath string.
@@ -3200,8 +3273,10 @@
 	ret
 ; 0x3420
 
-INCBIN "baserom.gbc",$3420,$3468 - $3420
 
+INCBIN "baserom.gbc", $3420, $3468 - $3420
+
+
 GetItemName: ; 3468
 	push hl
 	push bc
@@ -3220,10 +3295,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
@@ -3286,7 +3382,7 @@
 	ret
 ; 389c
 
-INCBIN "baserom.gbc",$389c,$38a2 - $389c
+INCBIN "baserom.gbc", $389c, $38a2 - $389c
 
 GetNick: ; 38a2
 ; get the nickname of a partymon
@@ -3407,16 +3503,39 @@
 ; 3927
 
 GetPartyLocation: ; 3927
-; Add the length of a PartyMon struct to hl a times
-; input:
-;	a: partymon #
-;	hl: partymon struct
-	ld bc, $0030 ; PARTYMON_LENGTH
+; Add the length of a PartyMon struct to hl a times.
+	ld bc, PartyMon2 - PartyMon1
 	jp AddNTimes
 ; 392d
 
-INCBIN "baserom.gbc", $392d, $3985 - $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
+	ld [CurDamage + 1], a
+	ret
+; 3985
+
 SetPlayerTurn: ; 3985
 	xor a
 	ld [hBattleTurn], a
@@ -3429,8 +3548,217 @@
 	ret
 ; 398e
 
-INCBIN "baserom.gbc", $398e, $3b86 - $398e
+INCBIN "baserom.gbc", $398e, $39e1 - $398e
 
+CleanGetBattleVarPair: ; 39e1
+; Preserves hl.
+	push hl
+	call GetBattleVarPair
+	pop hl
+	ret
+; 39e7
+
+GetBattleVarPair: ; 39e7
+; Get variable from pair a, depending on whose turn it is.
+; There are 21 variable pairs.
+
+	push bc
+	
+; get var pair
+	ld hl, .battlevarpairs
+	ld c, a
+	ld b, 0
+	add hl, bc
+	add hl, bc
+	
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	
+; Enemy turn uses the second byte instead.
+; This lets battle variable calls be side-neutral.
+	ld a, [hBattleTurn]
+	and a
+	jr z, .getvar
+	inc hl
+	
+.getvar
+; get var id
+	ld a, [hl]
+	ld c, a
+	ld b, $0
+	
+; seek
+	ld hl, .vars
+	add hl, bc
+	add hl, bc
+	
+; get var address
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	
+	ld a, [hl]
+	
+	pop bc
+	ret
+
+
+.battlevarpairs
+	dw .substatus1         ; 0
+	dw .substatus2         ; 1
+	dw .substatus3         ; 2
+	dw .substatus4         ; 3
+	dw .substatus5         ; 4
+	dw .substatus1opp      ; 5
+	dw .substatus2opp      ; 6
+	dw .substatus3opp      ; 7
+	dw .substatus4opp      ; 8
+	dw .substatus5opp      ; 9
+	dw .status             ; a
+	dw .statusopp          ; b
+	dw .animation          ; c
+	dw .effect             ; d
+	dw .power              ; e
+	dw .type               ; f
+	dw .curmove            ; 10
+	dw .lastcountermove    ; 11
+	dw .lastcountermoveopp ; 12
+	dw .lastmove           ; 13
+	dw .lastmoveopp        ; 14
+
+	;                  player             enemy
+.substatus1
+	db $00, $01 ; PLAYER_SUBSTATUS1, ENEMY_SUBSTATUS1
+.substatus1opp
+	db $01, $00 ; ENEMY_SUBSTATUS1, PLAYER_SUBSTATUS1
+.substatus2
+	db $02, $03 ; PLAYER_SUBSTATUS2, ENEMY_SUBSTATUS2
+.substatus2opp
+	db $03, $02 ; ENEMY_SUBSTATUS2, PLAYER_SUBSTATUS2
+.substatus3
+	db $04, $05 ; PLAYER_SUBSTATUS3, ENEMY_SUBSTATUS3
+.substatus3opp
+	db $05, $04 ; ENEMY_SUBSTATUS3, PLAYER_SUBSTATUS3
+.substatus4
+	db $06, $07 ; PLAYER_SUBSTATUS4, ENEMY_SUBSTATUS4
+.substatus4opp
+	db $07, $06 ; ENEMY_SUBSTATUS4, PLAYER_SUBSTATUS4
+.substatus5
+	db $08, $09 ; PLAYER_SUBSTATUS5, ENEMY_SUBSTATUS5
+.substatus5opp
+	db $09, $08 ; ENEMY_SUBSTATUS5, PLAYER_SUBSTATUS5
+.status
+	db $0a, $0b ; PLAYER_STATUS, ENEMY_STATUS
+.statusopp
+	db $0b, $0a ; ENEMY_STATUS, PLAYER_STATUS
+.animation
+	db $0c, $0d ; PLAYER_MOVE_ANIMATION, ENEMY_MOVE_ANIMATION
+.effect
+	db $0e, $0f ; PLAYER_MOVE_EFFECT, ENEMY_MOVE_EFFECT
+.power
+	db $10, $11 ; PLAYER_MOVE_POWER, ENEMY_MOVE_POWER
+.type
+	db $12, $13 ; PLAYER_MOVE_TYPE, ENEMY_MOVE_TYPE
+.curmove
+	db $14, $15 ; PLAYER_CUR_MOVE, ENEMY_CUR_MOVE
+.lastcountermove
+	db $16, $17 ; ENEMY_LAST_COUNTER_MOVE, PLAYER_LAST_COUNTER_MOVE
+.lastcountermoveopp
+	db $17, $16 ; PLAYER_LAST_COUNTER_MOVE, ENEMY_LAST_COUNTER_MOVE
+.lastmove
+	db $18, $19 ; PLAYER_LAST_MOVE, ENEMY_LAST_MOVE
+.lastmoveopp
+	db $19, $18 ; ENEMY_LAST_MOVE, PLAYER_LAST_MOVE
+
+.vars
+	dw PlayerSubStatus1
+	dw EnemySubStatus1
+	
+	dw PlayerSubStatus2
+	dw EnemySubStatus2
+	
+	dw PlayerSubStatus3
+	dw EnemySubStatus3
+	
+	dw PlayerSubStatus4
+	dw EnemySubStatus4
+	
+	dw PlayerSubStatus5
+	dw EnemySubStatus5
+	
+	dw BattleMonStatus
+	dw EnemyMonStatus
+	
+	dw PlayerMoveAnimation
+	dw EnemyMoveAnimation
+	
+	dw PlayerMoveEffect
+	dw EnemyMoveEffect
+	
+	dw PlayerMovePower
+	dw EnemyMovePower
+	
+	dw PlayerMoveType
+	dw EnemyMoveType
+	
+	dw CurPlayerMove
+	dw CurEnemyMove
+	
+	dw LastEnemyCounterMove
+	dw LastPlayerCounterMove
+	
+	dw LastPlayerMove
+	dw LastEnemyMove
+; 3a90
+
+INCBIN "baserom.gbc", $3a90, $3ab2 - $3a90
+
+
+MobileTextBorder: ; 3ab2
+; For mobile link battles only.
+	ld a, [InLinkBattle]
+	cp 4
+	ret c
+; Draw a cell phone icon at the top right corner of the border.
+	ld hl, $c5a3 ; TileMap(19,12)
+	ld [hl], $5e ; cell phone top
+	ld hl, $c5b7 ; TileMap(19,13)
+	ld [hl], $5f ; cell phone bottom
+	ret
+; 3ac3
+
+
+BattleTextBox: ; 3ac3
+	push hl
+	call SpeechTextBox
+	call MobileTextBorder
+	call $1ad2 ; UpdateSprites
+	call $321c ; refresh?
+	pop hl
+	call PrintTextBoxText
+	ret
+; 3ad5
+
+
+FarBattleTextBox: ; 3ad5
+; save bank
+	ld a, [$ff9d] ; bank
+	push af
+; bank 20
+	ld a, $20
+	rst $10
+; print text at hl
+	call BattleTextBox
+; restore bank
+	pop af
+	rst $10
+	ret
+; 3ae1
+
+
+INCBIN "baserom.gbc", $3ae1, $3b86 - $3ae1
+
 LoadMusicByte: ; 3b86
 ; load music data into CurMusicByte
 ; input:
@@ -3476,7 +3804,7 @@
 	ret
 ; 3bbc
 
-INCBIN "baserom.gbc",$3bbc,$3be3 - $3bbc
+INCBIN "baserom.gbc", $3bbc, $3be3 - $3bbc
 
 PlayCryHeader: ; 3be3
 ; Play a cry given parameters in header de
@@ -3577,7 +3905,7 @@
 	ret
 ; 3c4e
 
-INCBIN "baserom.gbc",$3c4e,$3c55-$3c4e
+INCBIN "baserom.gbc", $3c4e, $3c55-$3c4e
 
 WaitSFX: ; 3c55
 ; infinite loop until sfx is done playing
@@ -3606,7 +3934,7 @@
 	ret
 ; 3c74
 
-INCBIN "baserom.gbc",$3c74,$3c97-$3c74
+INCBIN "baserom.gbc", $3c74, $3c97-$3c74
 
 MaxVolume: ; 3c97
 	ld a, $77 ; max
@@ -3626,7 +3954,7 @@
 	ret
 ; 3ca8
 
-INCBIN "baserom.gbc",$3ca8,$3dde - $3ca8
+INCBIN "baserom.gbc", $3ca8, $3dde - $3ca8
 
 CheckSFX: ; 3dde
 ; returns carry if sfx channels are active
@@ -3649,7 +3977,7 @@
 	ret
 ; 3dfe
 
-INCBIN "baserom.gbc",$3dfe,$3e10 - $3dfe
+INCBIN "baserom.gbc", $3dfe, $3e10 - $3dfe
 
 ChannelsOff: ; 3e10
 ; Quickly turn off music channels
@@ -3673,12 +4001,12 @@
 	ret
 ; 3e32
 
-INCBIN "baserom.gbc",$3e32,$3fb5 - $3e32
+INCBIN "baserom.gbc", $3e32, $3fb5 - $3e32
 
 
 SECTION "bank1",DATA,BANK[$1]
 
-INCBIN "baserom.gbc",$4000,$617c - $4000
+INCBIN "baserom.gbc", $4000, $617c - $4000
 
 IntroFadePalettes: ; 0x617c
 	db %01010100
@@ -3689,7 +4017,7 @@
 	db %11100100
 ; 6182
 
-INCBIN "baserom.gbc",$6182,$6274 - $6182
+INCBIN "baserom.gbc", $6182, $6274 - $6182
 
 FarStartTitleScreen: ; 6274
 	callba StartTitleScreen
@@ -3696,7 +4024,7 @@
 	ret
 ; 627b
 
-INCBIN "baserom.gbc",$627b,$62bc - $627b
+INCBIN "baserom.gbc", $627b, $62bc - $627b
 
 TitleScreenEntrance: ; 62bc
 
@@ -3748,7 +4076,7 @@
 	ret
 ; 62f6
 
-INCBIN "baserom.gbc",$62f6,$669f - $62f6
+INCBIN "baserom.gbc", $62f6, $669f - $62f6
 
 CheckNickErrors: ; 669f
 ; error-check monster nick before use
@@ -3828,8 +4156,208 @@
 	db $ff ; end
 ; 66de
 
-INCBIN "baserom.gbc",$66de,$6eef - $66de
 
+_Multiply: ; 66de
+
+; hMultiplier is one byte.
+	ld a, 8
+	ld b, a
+
+	xor a
+	ld [hMultiplicand - 1], a
+	ld [hMathBuffer + 1], a
+	ld [hMathBuffer + 2], a
+	ld [hMathBuffer + 3], a
+	ld [hMathBuffer + 4], a
+
+
+.loop
+	ld a, [hMultiplier]
+	srl a
+	ld [hMultiplier], a
+	jr nc, .next
+
+	ld a, [hMathBuffer + 4]
+	ld c, a
+	ld a, [hMultiplicand + 2]
+	add c
+	ld [hMathBuffer + 4], a
+
+	ld a, [hMathBuffer + 3]
+	ld c, a
+	ld a, [hMultiplicand + 1]
+	adc c
+	ld [hMathBuffer + 3], a
+
+	ld a, [hMathBuffer + 2]
+	ld c, a
+	ld a, [hMultiplicand + 0]
+	adc c
+	ld [hMathBuffer + 2], a
+
+	ld a, [hMathBuffer + 1]
+	ld c, a
+	ld a, [hMultiplicand - 1]
+	adc c
+	ld [hMathBuffer + 1], a
+
+.next
+	dec b
+	jr z, .done
+
+
+; hMultiplicand <<= 1
+
+	ld a, [hMultiplicand + 2]
+	add a
+	ld [hMultiplicand + 2], a
+
+	ld a, [hMultiplicand + 1]
+	rla
+	ld [hMultiplicand + 1], a
+
+	ld a, [hMultiplicand + 0]
+	rla
+	ld [hMultiplicand + 0], a
+
+	ld a, [hMultiplicand - 1]
+	rla
+	ld [hMultiplicand - 1], a
+
+	jr .loop
+
+
+.done
+	ld a, [hMathBuffer + 4]
+	ld [hProduct + 3], a
+
+	ld a, [hMathBuffer + 3]
+	ld [hProduct + 2], a
+
+	ld a, [hMathBuffer + 2]
+	ld [hProduct + 1], a
+
+	ld a, [hMathBuffer + 1]
+	ld [hProduct + 0], a
+
+	ret
+; 673e
+
+
+_Divide: ; 673e
+	xor a
+	ld [hMathBuffer + 0], a
+	ld [hMathBuffer + 1], a
+	ld [hMathBuffer + 2], a
+	ld [hMathBuffer + 3], a
+	ld [hMathBuffer + 4], a
+
+	ld a, 9
+	ld e, a
+
+.loop
+	ld a, [hMathBuffer + 0]
+	ld c, a
+	ld a, [hDividend + 1]
+	sub c
+	ld d, a
+
+	ld a, [hDivisor]
+	ld c, a
+	ld a, [hDividend + 0]
+	sbc c
+	jr c, .asm_6767
+
+	ld [hDividend + 0], a
+
+	ld a, d
+	ld [hDividend + 1], a
+
+	ld a, [hMathBuffer + 4]
+	inc a
+	ld [hMathBuffer + 4], a
+
+	jr .loop
+
+.asm_6767
+	ld a, b
+	cp 1
+	jr z, .done
+
+	ld a, [hMathBuffer + 4]
+	add a
+	ld [hMathBuffer + 4], a
+
+	ld a, [hMathBuffer + 3]
+	rla
+	ld [hMathBuffer + 3], a
+
+	ld a, [hMathBuffer + 2]
+	rla
+	ld [hMathBuffer + 2], a
+
+	ld a, [hMathBuffer + 1]
+	rla
+	ld [hMathBuffer + 1], a
+
+	dec e
+	jr nz, .asm_6798
+
+	ld e, 8
+	ld a, [hMathBuffer + 0]
+	ld [hDivisor], a
+	xor a
+	ld [hMathBuffer + 0], a
+
+	ld a, [hDividend + 1]
+	ld [hDividend + 0], a
+
+	ld a, [hDividend + 2]
+	ld [hDividend + 1], a
+
+	ld a, [hDividend + 3]
+	ld [hDividend + 2], a
+
+.asm_6798
+	ld a, e
+	cp 1
+	jr nz, .asm_679e
+	dec b
+
+.asm_679e
+	ld a, [hDivisor]
+	srl a
+	ld [hDivisor], a
+
+	ld a, [hMathBuffer + 0]
+	rr a
+	ld [hMathBuffer + 0], a
+
+	jr .loop
+
+.done
+	ld a, [hDividend + 1]
+	ld [hDivisor], a
+
+	ld a, [hMathBuffer + 4]
+	ld [hDividend + 3], a
+
+	ld a, [hMathBuffer + 3]
+	ld [hDividend + 2], a
+
+	ld a, [hMathBuffer + 2]
+	ld [hDividend + 1], a
+
+	ld a, [hMathBuffer + 1]
+	ld [hDividend + 0], a
+
+	ret
+; 67c1
+
+
+INCBIN "baserom.gbc", $67c1, $6eef - $67c1
+
+
 DrawGraphic: ; 6eef
 ; input:
 ;   hl: draw location
@@ -3856,12 +4384,93 @@
 	ret
 ; 6f07
 
-INCBIN "baserom.gbc",$6f07,$747b - $6f07
 
+INCBIN "baserom.gbc", $6f07, $7305 - $6f07
 
+
+SpecialGiveShuckle: ; 7305
+
+; Adding to the party.
+	xor a
+	ld [MonType], a
+
+; Level 15 Shuckle.
+	ld a, SHUCKLE
+	ld [CurPartySpecies], a
+	ld a, 15
+	ld [CurPartyLevel], a
+
+	ld a, PREDEF_ADDPARTYMON
+	call Predef
+	jr nc, .NotGiven
+
+; Caught data.
+	ld b, 0
+	ld a, $13
+	ld hl, $5ba3
+	rst $8
+
+; Holding a Berry.
+	ld bc, PartyMon2 - PartyMon1
+	ld a, [PartyCount]
+	dec a
+	push af
+	push bc
+	ld hl, PartyMon1Item
+	call AddNTimes
+	ld [hl], BERRY
+	pop bc
+	pop af
+
+; OT ID.
+	ld hl, PartyMon1ID
+	call AddNTimes
+	ld a, $2
+	ld [hli], a
+	ld [hl], $6
+
+; Nickname.
+	ld a, [PartyCount]
+	dec a
+	ld hl, PartyMon1Nickname
+	call SkipNames
+	ld de, .Shuckie
+	call CopyName2
+
+; OT.
+	ld a, [PartyCount]
+	dec a
+	ld hl, PartyMon1OT
+	call SkipNames
+	ld de, .Mania
+	call CopyName2
+
+; Bittable2 flag for this event.
+	ld hl, $dc1e
+	set 5, [hl]
+
+	ld a, 1
+	ld [ScriptVar], a
+	ret
+
+.NotGiven
+	xor a
+	ld [ScriptVar], a
+	ret
+
+.Mania
+	db "MANIA@"
+.Shuckie
+	db "SHUCKIE@"
+; 737e
+
+
+INCBIN "baserom.gbc", $737e, $747b - $737e
+
+
 SECTION "bank2",DATA,BANK[$2]
 
-INCBIN "baserom.gbc",$8000,$854b - $8000
+INCBIN "baserom.gbc", $8000, $854b - $8000
 
 GetPredefFn: ; 854b
 ; input:
@@ -3979,7 +4588,7 @@
 	dwb $43ff, $2d
 ; 864c
 
-INCBIN "baserom.gbc",$864c,$8a68 - $864c
+INCBIN "baserom.gbc", $864c, $8a68 - $864c
 
 CheckShininess: ; 0x8a68
 ; given a pointer to Attack/Defense DV in bc, determine if monster is shiny.
@@ -4007,7 +4616,7 @@
 	and a ; clear carry flag
 	ret
 
-INCBIN "baserom.gbc",$8a88,$9a52-$8a88
+INCBIN "baserom.gbc", $8a88, $9a52-$8a88
 
 CopyData: ; 0x9a52
 ; copy bc bytes of data from hl to de
@@ -4053,22 +4662,22 @@
 	ret
 ; 0x9a7a
 
-INCBIN "baserom.gbc",$9a7a,$a51e - $9a7a
+INCBIN "baserom.gbc", $9a7a, $a51e - $9a7a
 
 SGBBorder:
 INCBIN "gfx/misc/sgb_border.2bpp"
 
-INCBIN "baserom.gbc",$a8be,$a8d6 - $a8be
+INCBIN "baserom.gbc", $a8be, $a8d6 - $a8be
 
 PokemonPalettes:
 INCLUDE "gfx/pics/palette_pointers.asm"
 
-INCBIN "baserom.gbc",$b0ae,$b0d2 - $b0ae
+INCBIN "baserom.gbc", $b0ae, $b0d2 - $b0ae
 
 TrainerPalettes:
 INCLUDE "gfx/trainers/palette_pointers.asm"
 
-INCBIN "baserom.gbc",$b1de,$b319 - $b1de
+INCBIN "baserom.gbc", $b1de, $b319 - $b1de
 
 MornPal: ; 0xb319
 INCBIN "tilesets/morn.pal"
@@ -4086,185 +4695,185 @@
 INCBIN "tilesets/dark.pal"
 ; 0xb419
 
-INCBIN "baserom.gbc",$b419,$b825 - $b419
+INCBIN "baserom.gbc", $b419, $b825 - $b419
 
 
 SECTION "bank3",DATA,BANK[$3]
 
-INCBIN "baserom.gbc",$c000,$29
+INCBIN "baserom.gbc", $c000, $29
 
 SpecialsPointers: ; 0xc029
-	dbw $25,$7c28
-	dbw $0a,$5ce8
-	dbw $0a,$5d11
-	dbw $0a,$5d92
-	dbw $0a,$5e66
-	dbw $0a,$5e82
-	dbw $0a,$5efa
-	dbw $0a,$5eee
-	dbw $0a,$5c92
-	dbw $0a,$5cf1
-	dbw $0a,$5cfa
-	dbw $0a,$5bfb
-	dbw $0a,$5c7b
-	dbw $0a,$5ec4
-	dbw $0a,$5ed9
-	dbw $0a,$5eaf
-	dbw $0a,$5f47
-	dbw $03,$42f6
-	dbw $03,$4309
-	dbw $41,$50b9
-	dbw $03,$434a
-	dbw $13,$59e5
-	dbw $04,$7a12
-	dbw $04,$7a31
-	dbw $04,$75db
-	dbw $3e,$7b32
-	dbw $3e,$7cd2
-	dbw $03,$4658
-	dbw $05,$559a
-	dbw $03,$42e7
-	dbw $05,$66d6
-	dbw $05,$672a
-	dbw $05,$6936
-	dbw $0b,$4547
-	dbw $05,$6218
-	dbw $23,$4c04
-	dbw $03,$429d
-	dbw $24,$4913
-	dbw $03,$42c0
-	dbw $03,$42cd
-	dbw $03,$4355
-	dbw $03,$4360
-	dbw $03,$4373
-	dbw $03,$4380
-	dbw $03,$438d
-	dbw $03,$43db
-	dbw $23,$4084
-	dbw $23,$4092
-	dbw $23,$40b6
-	dbw $23,$4079
-	dbw $23,$40ab
-	dbw $00,$0d91
-	dbw $00,$31f3
-	dbw $00,$0485
-	dbw $00,$0fc8
-	dbw $00,$1ad2
-	dbw $00,$0e4a
-	dbw $03,$4230
-	dbw $03,$4252
+	dbw $25, $7c28
+	dbw $0a, $5ce8
+	dbw $0a, $5d11
+	dbw $0a, $5d92
+	dbw $0a, $5e66
+	dbw $0a, $5e82
+	dbw $0a, $5efa
+	dbw $0a, $5eee
+	dbw $0a, $5c92
+	dbw $0a, $5cf1
+	dbw $0a, $5cfa
+	dbw $0a, $5bfb
+	dbw $0a, $5c7b
+	dbw $0a, $5ec4
+	dbw $0a, $5ed9
+	dbw $0a, $5eaf
+	dbw $0a, $5f47
+	dbw $03, $42f6
+	dbw $03, $4309
+	dbw $41, $50b9
+	dbw $03, $434a
+	dbw $13, $59e5
+	dbw $04, $7a12
+	dbw $04, $7a31
+	dbw $04, $75db
+	dbw $3e, $7b32
+	dbw $3e, $7cd2
+	dbw $03, $4658
+	dbw $05, $559a
+	dbw $03, $42e7
+	dbw $05, $66d6
+	dbw $05, $672a
+	dbw $05, $6936
+	dbw $0b, $4547
+	dbw $05, $6218
+	dbw $23, $4c04
+	dbw $03, $429d
+	dbw $24, $4913
+	dbw $03, $42c0
+	dbw $03, $42cd
+	dbw $03, $4355
+	dbw $03, $4360
+	dbw $03, $4373
+	dbw $03, $4380
+	dbw $03, $438d
+	dbw $03, $43db
+	dbw $23, $4084
+	dbw $23, $4092
+	dbw $23, $40b6
+	dbw $23, $4079
+	dbw $23, $40ab
+	dbw $00, $0d91
+	dbw $00, $31f3
+	dbw $00, $0485
+	dbw $00, $0fc8
+	dbw $00, $1ad2
+	dbw $00, $0e4a
+	dbw $03, $4230
+	dbw $03, $4252
 	dbw BANK(WaitSFX),WaitSFX
-	dbw $00,$3cdf
-	dbw $00,$3d47
-	dbw $04,$6324
-	dbw $02,$4379
-	dbw $03,$425a
-	dbw $03,$4268
-	dbw $03,$4276
-	dbw $03,$4284
-	dbw $03,$43ef
-	dbw $05,$7421
-	dbw $05,$7440
-	dbw $04,$79a8
-	dbw $03,$43fc
-	dbw $09,$6feb
-	dbw $09,$7043
-	dbw $01,$7305
-	dbw $01,$737e
-	dbw $01,$73f7
+	dbw $00, $3cdf
+	dbw $00, $3d47
+	dbw $04, $6324
+	dbw $02, $4379
+	dbw $03, $425a
+	dbw $03, $4268
+	dbw $03, $4276
+	dbw $03, $4284
+	dbw $03, $43ef
+	dbw $05, $7421
+	dbw $05, $7440
+	dbw $04, $79a8
+	dbw $03, $43fc
+	dbw $09, $6feb
+	dbw $09, $7043
+	dbw BANK(SpecialGiveShuckle), SpecialGiveShuckle
+	dbw $01, $737e
+	dbw $01, $73f7
 	dbw BANK(SpecialCheckPokerus),SpecialCheckPokerus
-	dbw $09,$4b25
-	dbw $09,$4b4e
-	dbw $09,$4ae8
-	dbw $13,$587a
-	dbw $03,$4434
-	dbw $03,$4422
-	dbw $13,$59d3
-	dbw $22,$4018
-	dbw $03,$42b9
-	dbw $03,$42da
-	dbw $01,$718d
-	dbw $01,$71ac
-	dbw $0a,$64ab
-	dbw $0a,$651f
-	dbw $0a,$6567
-	dbw $05,$4209
-	dbw $3e,$7841
+	dbw $09, $4b25
+	dbw $09, $4b4e
+	dbw $09, $4ae8
+	dbw $13, $587a
+	dbw $03, $4434
+	dbw $03, $4422
+	dbw $13, $59d3
+	dbw $22, $4018
+	dbw $03, $42b9
+	dbw $03, $42da
+	dbw $01, $718d
+	dbw $01, $71ac
+	dbw $0a, $64ab
+	dbw $0a, $651f
+	dbw $0a, $6567
+	dbw $05, $4209
+	dbw $3e, $7841
 	dbw BANK(SpecialSnorlaxAwake),SpecialSnorlaxAwake
-	dbw $01,$7413
-	dbw $01,$7418
-	dbw $01,$741d
-	dbw $03,$4472
-	dbw $09,$65ee
+	dbw $01, $7413
+	dbw $01, $7418
+	dbw $01, $741d
+	dbw $03, $4472
+	dbw $09, $65ee
 	dbw BANK(SpecialGameboyCheck),SpecialGameboyCheck
 	dbw BANK(SpecialTrainerHouse),SpecialTrainerHouse
-	dbw $05,$6dc7
+	dbw $05, $6dc7
 	dbw BANK(SpecialRoamMons), SpecialRoamMons
-	dbw $03,$448f
-	dbw $03,$449f
-	dbw $03,$44ac
-	dbw $46,$6c3e
-	dbw $46,$7444
-	dbw $46,$75e8
-	dbw $46,$77e5
-	dbw $46,$7879
-	dbw $46,$7920
-	dbw $46,$793b
-	dbw $5c,$40b0
-	dbw $5c,$40ba
-	dbw $5c,$4114
-	dbw $5c,$4215
-	dbw $5c,$44e1
-	dbw $5c,$421d
-	dbw $5c,$4b44
-	dbw $46,$7a38
-	dbw $5c,$4bd3
-	dbw $45,$7656
-	dbw $00,$0150
-	dbw $40,$51f1
-	dbw $40,$5220
-	dbw $40,$5225
-	dbw $40,$5231
-	dbw $12,$525b
-	dbw $22,$6def
-	dbw $47,$41ab
-	dbw $5c,$4687
-	dbw $22,$6e68
-	dbw $5f,$5224
-	dbw $5f,$52b6
-	dbw $5f,$52ce
-	dbw $5f,$753d
-	dbw $40,$7612
+	dbw $03, $448f
+	dbw $03, $449f
+	dbw $03, $44ac
+	dbw $46, $6c3e
+	dbw $46, $7444
+	dbw $46, $75e8
+	dbw $46, $77e5
+	dbw $46, $7879
+	dbw $46, $7920
+	dbw $46, $793b
+	dbw $5c, $40b0
+	dbw $5c, $40ba
+	dbw $5c, $4114
+	dbw $5c, $4215
+	dbw $5c, $44e1
+	dbw $5c, $421d
+	dbw $5c, $4b44
+	dbw $46, $7a38
+	dbw $5c, $4bd3
+	dbw $45, $7656
+	dbw $00, $0150
+	dbw $40, $51f1
+	dbw $40, $5220
+	dbw $40, $5225
+	dbw $40, $5231
+	dbw $12, $525b
+	dbw $22, $6def
+	dbw $47, $41ab
+	dbw $5c, $4687
+	dbw $22, $6e68
+	dbw $5f, $5224
+	dbw $5f, $52b6
+	dbw $5f, $52ce
+	dbw $5f, $753d
+	dbw $40, $7612
 	dbw BANK(SpecialHoOhChamber),SpecialHoOhChamber
-	dbw $40,$6142
-	dbw $12,$589a
-	dbw $12,$5bf9
-	dbw $13,$70bc
-	dbw $22,$6f6b
-	dbw $22,$6fd4
+	dbw $40, $6142
+	dbw $12, $589a
+	dbw $12, $5bf9
+	dbw $13, $70bc
+	dbw $22, $6f6b
+	dbw $22, $6fd4
 	dbw BANK(SpecialDratini),SpecialDratini
-	dbw $04,$5485
+	dbw $04, $5485
 	dbw BANK(SpecialBeastsCheck),SpecialBeastsCheck
 	dbw BANK(SpecialMonCheck),SpecialMonCheck
-	dbw $03,$4225
-	dbw $5c,$4bd2
-	dbw $40,$766e
-	dbw $40,$77eb
-	dbw $40,$783c
-	dbw $41,$60a2
-	dbw $05,$4168
-	dbw $40,$77c2
-	dbw $41,$630f
-	dbw $40,$7780
-	dbw $40,$787b
-	dbw $12,$6e12
-	dbw $41,$47eb
-	dbw $12,$6927
-	dbw $24,$4a54
-	dbw $24,$4a88
-	dbw $03,$4224
+	dbw $03, $4225
+	dbw $5c, $4bd2
+	dbw $40, $766e
+	dbw $40, $77eb
+	dbw $40, $783c
+	dbw $41, $60a2
+	dbw $05, $4168
+	dbw $40, $77c2
+	dbw $41, $630f
+	dbw $40, $7780
+	dbw $40, $787b
+	dbw $12, $6e12
+	dbw $41, $47eb
+	dbw $12, $6927
+	dbw $24, $4a54
+	dbw $24, $4a88
+	dbw $03, $4224
 
-INCBIN "baserom.gbc",$c224,$c3e2 - $c224
+INCBIN "baserom.gbc", $c224, $c3e2 - $c224
 
 ScriptReturnCarry: ; c3e2
 	jr c, .carry
@@ -4277,7 +4886,7 @@
 	ret
 ; c3ef
 
-INCBIN "baserom.gbc",$c3ef,$c419 - $c3ef
+INCBIN "baserom.gbc", $c3ef, $c419 - $c3ef
 
 SpecialCheckPokerus: ; c419
 ; Check if a monster in your party has Pokerus
@@ -4285,7 +4894,7 @@
 	jp ScriptReturnCarry
 ; c422
 
-INCBIN "baserom.gbc",$c422,$c43d - $c422
+INCBIN "baserom.gbc", $c422, $c43d - $c422
 
 SpecialSnorlaxAwake: ; 0xc43d
 ; Check if the Poké Flute channel is playing, and if the player is standing
@@ -4329,14 +4938,14 @@
 	ret
 
 .ProximityCoords
-	db $21,$08
-	db $22,$0a
-	db $23,$0a
-	db $24,$08
-	db $24,$09
+	db $21, $08
+	db $22, $0a
+	db $23, $0a
+	db $24, $08
+	db $24, $09
 	db $ff
 
-INCBIN "baserom.gbc",$c472,$c478 - $c472
+INCBIN "baserom.gbc", $c472, $c478 - $c472
 
 SpecialGameboyCheck: ; c478
 ; check cgb
@@ -4362,7 +4971,7 @@
 	ld [ScriptVar], a
 	ret
 
-INCBIN "baserom.gbc",$c48f,$c4b9 - $c48f
+INCBIN "baserom.gbc", $c48f, $c4b9 - $c48f
 
 SpecialTrainerHouse: ; 0xc4b9
 	ld a, 0
@@ -4371,10 +4980,10 @@
 	ld [ScriptVar], a
 	jp CloseSRAM
 
-INCBIN "baserom.gbc",$c4c7,$c5d2 - $c4c7
+INCBIN "baserom.gbc", $c4c7, $c5d2 - $c4c7
 
 PrintNumber_PrintDigit: ; c5d2
-INCBIN "baserom.gbc",$c5d2,$c644 - $c5d2
+INCBIN "baserom.gbc", $c5d2, $c644 - $c5d2
 
 PrintNumber_PrintLeadingZero: ; c644
 ; prints a leading zero unless they are turned off in the flags
@@ -4398,7 +5007,7 @@
 	ret
 ; 0xc658
 
-INCBIN "baserom.gbc",$c658,$c706 - $c658
+INCBIN "baserom.gbc", $c658, $c706 - $c658
 
 GetPartyNick: ; c706
 ; write CurPartyMon nickname to StringBuffer1-3
@@ -4492,7 +5101,7 @@
 	ret
 ; c779
 
-INCBIN "baserom.gbc",$c779,$c986 - $c779
+INCBIN "baserom.gbc", $c779, $c986 - $c779
 
 UsedSurfScript: ; c986
 ; print "[MON] used SURF!"
@@ -4650,17 +5259,17 @@
 	db "@"				; Want to SURF?
 ; ca3b
 
-INCBIN "baserom.gbc",$ca3b,$fa0b - $ca3b
+INCBIN "baserom.gbc", $ca3b, $fa0b - $ca3b
 
 
 SECTION "bank4",DATA,BANK[$4]
 
-INCBIN "baserom.gbc",$10000,$10b16 - $10000
+INCBIN "baserom.gbc", $10000, $10b16 - $10000
 
 PackGFX:
 INCBIN "gfx/misc/pack.2bpp"
 
-INCBIN "baserom.gbc",$113d6,$1167a - $113d6
+INCBIN "baserom.gbc", $113d6, $1167a - $113d6
 
 TechnicalMachines: ; 0x1167a
 	db DYNAMICPUNCH
@@ -4721,7 +5330,7 @@
 	db WHIRLPOOL
 	db WATERFALL
 
-INCBIN "baserom.gbc",$116b3,$11ce7 - $116b3
+INCBIN "baserom.gbc", $116b3, $11ce7 - $116b3
 
 NameInputLower:
 	db "a b c d e f g h i"
@@ -4750,7 +5359,7 @@
 	db "- ? ! ♂ ♀ / . , &"
 	db "lower  DEL   END "
 
-INCBIN "baserom.gbc",$11e5d,$12976 - $11e5d
+INCBIN "baserom.gbc", $11e5d, $12976 - $11e5d
 
 OpenPartyMenu: ; $12976
 	ld a, [PartyCount]
@@ -4806,7 +5415,7 @@
 	ret
 ; 0x129d5
 
-INCBIN "baserom.gbc",$129d5,$12a88 - $129d5
+INCBIN "baserom.gbc", $129d5, $12a88 - $129d5
 
 PokemonActionSubmenu ; 0x12a88
 	ld hl, $c5cd ; coord
@@ -4855,7 +5464,7 @@
 ; no terminator?
 ; 0x12aec
 
-INCBIN "baserom.gbc",$12aec,$12e00 - $12aec
+INCBIN "baserom.gbc", $12aec, $12e00 - $12aec
 
 OpenPartyStats: ; 12e00
 	call $1d6e
@@ -4871,7 +5480,7 @@
 	ret
 ; 0x12e1b
 
-INCBIN "baserom.gbc",$12e1b,$13b87 - $12e1b
+INCBIN "baserom.gbc", $12e1b, $13b87 - $12e1b
 
 GetSquareRoot: ; 13b87
 ; Return the square root of de in b.
@@ -4908,7 +5517,7 @@
 
 SECTION "bank5",DATA,BANK[$5]
 
-INCBIN "baserom.gbc",$14000,$14032 - $14000
+INCBIN "baserom.gbc", $14000, $14032 - $14000
 
 GetTimeOfDay: ; 14032
 ; get time of day based on the current hour
@@ -4944,7 +5553,7 @@
 	db 24, $02 ; NITE
 ; 1404c
 
-INCBIN "baserom.gbc",$1404c,$152ab - $1404c
+INCBIN "baserom.gbc", $1404c, $152ab - $1404c
 
 BlackoutPoints: ; 0x152ab
 	db GROUP_KRISS_HOUSE_2F, MAP_KRISS_HOUSE_2F, 3, 3
@@ -4977,7 +5586,7 @@
 	db GROUP_FAST_SHIP_CABINS_SW_SSW_NW, MAP_FAST_SHIP_CABINS_SW_SSW_NW, 6, 2
 	db $ff, $ff, $ff, $ff
 
-INCBIN "baserom.gbc",$1531f,$174ba - $1531f
+INCBIN "baserom.gbc", $1531f, $174ba - $1531f
 
 
 SECTION "bank6",DATA,BANK[$6]
@@ -5287,7 +5896,7 @@
 
 SECTION "bank9",DATA,BANK[$9]
 
-INCBIN "baserom.gbc",$24000,$270c4 - $24000
+INCBIN "baserom.gbc", $24000, $270c4 - $24000
 
 GetTrainerDVs: ; 270c4
 ; get dvs based on trainer class
@@ -5382,12 +5991,20 @@
 	db $98, $88 ; mysticalman
 ; 2715c
 
-INCBIN "baserom.gbc",$2715c,$27a2d - $2715c
+INCBIN "baserom.gbc", $2715c, $271f4 - $2715c
 
+MoveEffectsPointers: ; 271f4
+INCLUDE "battle/moves/move_effects_pointers.asm"
 
+MoveEffects: ; 2732e
+INCLUDE "battle/moves/move_effects.asm"
+
+INCBIN "baserom.gbc", $27a28, $27a2d - $27a28
+
+
 SECTION "bankA",DATA,BANK[$A]
 
-INCBIN "baserom.gbc",$28000,$2a2a0 - $28000
+INCBIN "baserom.gbc", $28000, $2a2a0 - $28000
 
 SpecialRoamMons: ; 2a2a0
 ; initialize RoamMon structs
@@ -5434,7 +6051,7 @@
 	ret
 ; 2a2ce
 
-INCBIN "baserom.gbc",$2a2ce,$2a5e9 - $2a2ce
+INCBIN "baserom.gbc", $2a2ce, $2a5e9 - $2a2ce
 
 
 WildMons1: ; 0x2a5e9
@@ -5471,7 +6088,7 @@
 
 SECTION "bankB",DATA,BANK[$B]
 
-INCBIN "baserom.gbc",$2C000,$2c1ef - $2C000
+INCBIN "baserom.gbc", $2C000, $2c1ef - $2C000
 
 TrainerClassNames: ; 2c1ef
 	db "LEADER@"
@@ -5542,7 +6159,7 @@
 	db "ROCKET@"
 	db "MYSTICALMAN@"
 
-INCBIN "baserom.gbc",$2C41a,$2ee8f - $2C41a
+INCBIN "baserom.gbc", $2C41a, $2ee8f - $2C41a
 
 ; XXX this is not the start of the routine
 ; determine what music plays in battle
@@ -5625,7 +6242,7 @@
 	pop hl
 	ret
 
-INCBIN "baserom.gbc",$2ef18,$2ef9f - $2ef18
+INCBIN "baserom.gbc", $2ef18, $2ef9f - $2ef18
 
 
 SECTION "bankC",DATA,BANK[$C]
@@ -5717,23 +6334,17 @@
 INCBIN "gfx/tilesets/30.lz"
 ; 0x329ed
 
-INCBIN "baserom.gbc",$329ed,$333f0 - $329ed
+INCBIN "baserom.gbc", $329ed, $333f0 - $329ed
 
 
 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
+INCBIN "baserom.gbc", $38000, $39999 - $38000
 
 TrainerGroups: ; 0x39999
 INCLUDE "trainers/trainer_pointers.asm"
@@ -5743,8 +6354,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.
 
@@ -5798,13 +6493,13 @@
 	db BLUE
 	db $ff
 
-INCBIN "baserom.gbc",$3d14e,$3ddc2 - $3d14e
+INCBIN "baserom.gbc", $3d14e, $3ddc2 - $3d14e
 
 	ld hl, RecoveredUsingText
 	jp $3ad5
 ; 0x3ddc8
 
-INCBIN "baserom.gbc",$3ddc8,$3e8eb - $3ddc8
+INCBIN "baserom.gbc", $3ddc8, $3e8eb - $3ddc8
 
 LoadEnemyMon: ; 3e8eb
 ; Initialize enemy monster parameters
@@ -6610,12 +7305,19 @@
 	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
+INCBIN "baserom.gbc", $40000, $40c65-$40000
 
 AlphabeticalPokedexOrder: ; 0x40c65
 INCLUDE "stats/pokedex/order_alpha.asm"
@@ -6623,12 +7325,12 @@
 NewPokedexOrder: ; 0x40d60
 INCLUDE "stats/pokedex/order_new.asm"
 
-INCBIN "baserom.gbc",$40e5b,$41afb-$40e5b
+INCBIN "baserom.gbc", $40e5b, $41afb-$40e5b
 
 Moves: ; 0x41afb
 INCLUDE "battle/moves/moves.asm"
 
-INCBIN "baserom.gbc",$421d8,$425b1-$421d8
+INCBIN "baserom.gbc", $421d8, $425b1-$421d8
 
 EvosAttacksPointers: ; 0x425b1
 INCLUDE "stats/evos_attacks_pointers.asm"
@@ -6638,22 +7340,22 @@
 
 SECTION "bank11",DATA,BANK[$11]
 
-INCBIN "baserom.gbc",$44000,$44378 - $44000
+INCBIN "baserom.gbc", $44000, $44378 - $44000
 
 PokedexDataPointerTable: ; 0x44378
 INCLUDE "stats/pokedex/entry_pointers.asm"
 
-INCBIN "baserom.gbc",$4456e,$44997 - $4456e
+INCBIN "baserom.gbc", $4456e, $44997 - $4456e
 
 
 SECTION "bank12",DATA,BANK[$12]
 
-INCBIN "baserom.gbc",$48000,$48e9b - $48000
+INCBIN "baserom.gbc", $48000, $48e9b - $48000
 
 PackFGFX:
 INCBIN "gfx/misc/pack_f.2bpp"
 
-INCBIN "baserom.gbc",$4925b,$49962 - $4925b
+INCBIN "baserom.gbc", $4925b, $49962 - $4925b
 
 SpecialCelebiGFX:
 INCBIN "gfx/special/celebi/leaf.2bpp"
@@ -6662,7 +7364,7 @@
 INCBIN "gfx/special/celebi/3.2bpp"
 INCBIN "gfx/special/celebi/4.2bpp"
 
-INCBIN "baserom.gbc",$49aa2,$49d24 - $49aa2
+INCBIN "baserom.gbc", $49aa2, $49d24 - $49aa2
 
 ContinueText: ; 0x49d24
 	db "CONTINUE@"
@@ -6759,7 +7461,7 @@
 	db MOBILE_STUDIUM
 	db $ff
 
-INCBIN "baserom.gbc",$49da4,$4a6e8 - $49da4
+INCBIN "baserom.gbc", $49da4, $4a6e8 - $49da4
 
 SpecialBeastsCheck: ; 0x4a6e8
 ; Check if the player owns all three legendary beasts.
@@ -7019,7 +7721,7 @@
 	ret
 ; 0x4a843
 
-INCBIN "baserom.gbc",$4a843,$4ae78 - $4a843
+INCBIN "baserom.gbc", $4a843, $4ae78 - $4a843
 
 
 SECTION "bank13",DATA,BANK[$13]
@@ -7133,7 +7835,7 @@
 INCBIN "tilesets/20_palette_map.bin"
 ; 0x4cb65
 
-INCBIN "baserom.gbc",$4cb65,$4cbd5-$4cb65
+INCBIN "baserom.gbc", $4cb65, $4cbd5-$4cb65
 
 Tileset29PalMap: ; 0x4cbd5
 INCBIN "tilesets/29_palette_map.bin"
@@ -7528,7 +8230,7 @@
 	ret
 ; 4d87a
 
-INCBIN "baserom.gbc",$4d87a,$4dc8a - $4d87a
+INCBIN "baserom.gbc", $4d87a, $4dc8a - $4d87a
 
 StatsScreenInit: ; 4dc8a
 	ld hl, StatsScreenMain
@@ -7591,7 +8293,7 @@
 	ret
 ; 0x4dcf7
 
-INCBIN "baserom.gbc",$4dcf7,$4dd2a - $4dcf7
+INCBIN "baserom.gbc", $4dcf7, $4dd2a - $4dcf7
 
 StatsScreenPointerTable: ; 4dd2a
     dw $5d72 ; regular pokémon
@@ -7605,7 +8307,7 @@
 
 ; 4dd3a
 
-INCBIN "baserom.gbc",$4dd3a,$4dda1 - $4dd3a
+INCBIN "baserom.gbc", $4dd3a, $4dda1 - $4dd3a
 
 EggStatsInit: ; 4dda1
 	call EggStatsScreen
@@ -7615,7 +8317,7 @@
 	ret
 ; 0x4ddac
 
-INCBIN "baserom.gbc",$4ddac,$4e21e - $4ddac
+INCBIN "baserom.gbc", $4ddac, $4e21e - $4ddac
 
 IDNoString: ; 4e21e
     db $73, "№.@"
@@ -7624,7 +8326,7 @@
     db "OT/@"
 ; 4e226
 
-INCBIN "baserom.gbc",$4e226,$4e33a - $4e226
+INCBIN "baserom.gbc", $4e226, $4e33a - $4e226
 
 EggStatsScreen: ; 4e33a
 	xor a
@@ -7701,18 +8403,18 @@
 
 ; 0x4e497
 
-INCBIN "baserom.gbc",$4e497,$4e831 - $4e497
+INCBIN "baserom.gbc", $4e497, $4e831 - $4e497
 
 EvolutionGFX:
 INCBIN "gfx/evo/bubble_large.2bpp"
 INCBIN "gfx/evo/bubble.2bpp"
 
-INCBIN "baserom.gbc",$4e881,$4f31c - $4e881
+INCBIN "baserom.gbc", $4e881, $4f31c - $4e881
 
 
 SECTION "bank14",DATA,BANK[$14]
 
-INCBIN "baserom.gbc",$50000,$5005f-$50000
+INCBIN "baserom.gbc", $50000, $5005f-$50000
 
 WritePartyMenuTilemap: ; 0x5005f
 	ld hl, Options
@@ -7741,7 +8443,7 @@
 	ret
 ; 0x50089
 
-INCBIN "baserom.gbc",$50089,$50457-$50089
+INCBIN "baserom.gbc", $50089, $50457-$50089
 
 PartyMenuSelect: ; 0x50457
 ; sets carry if exitted menu.
@@ -7844,12 +8546,94 @@
 YouHaveNoPKMNString: ; 0x50556
     db "You have no ", $e1, $e2, "!@"
 
-INCBIN "baserom.gbc",$50566,$5097B-$50566
 
-dw Normal, Fighting, Flying, Poison, Ground, Rock, Bird, Bug, Ghost, Steel
-dw Normal, Normal, Normal, Normal, Normal, Normal, Normal, Normal, Normal
-dw UnknownType, Fire, Water, Grass, Electric, Psychic, Ice, Dragon, Dark
+INCBIN "baserom.gbc", $50566, $5093a - $50566
 
+
+PrintMoveType: ; 5093a
+; Print the type of move b at hl.
+
+	push hl
+	ld a, b
+	dec a
+	ld bc, Move2 - Move1
+	ld hl, Moves
+	call AddNTimes
+	ld de, StringBuffer1
+	ld a, BANK(Moves)
+	call FarCopyBytes
+	ld a, [StringBuffer1 + PlayerMoveType - PlayerMoveStruct]
+	pop hl
+
+	ld b, a
+; 50953
+
+PrintType: ; 50953
+; Print type b at hl.
+	ld a, b
+
+	push hl
+	add a
+	ld hl, TypeNames
+	ld e, a
+	ld d, 0
+	add hl, de
+	ld a, [hli]
+	ld e, a
+	ld d, [hl]
+	pop hl
+
+	jp PlaceString
+; 50964
+
+
+LoadTypeName: ; 50964
+; Copy the name of type $d265 to StringBuffer1.
+	ld a, [$d265]
+	ld hl, TypeNames
+	ld e, a
+	ld d, 0
+	add hl, de
+	add hl, de
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	ld de, StringBuffer1
+	ld bc, $000d
+	jp CopyBytes
+; 5097b
+
+
+TypeNames: ; 5097b
+	dw Normal
+	dw Fighting
+	dw Flying
+	dw Poison
+	dw Ground
+	dw Rock
+	dw Bird
+	dw Bug
+	dw Ghost
+	dw Steel
+	dw Normal
+	dw Normal
+	dw Normal
+	dw Normal
+	dw Normal
+	dw Normal
+	dw Normal
+	dw Normal
+	dw Normal
+	dw UnknownType
+	dw Fire
+	dw Water
+	dw Grass
+	dw Electric
+	dw Psychic
+	dw Ice
+	dw Dragon
+	dw Dark
+
 Normal:
 	db "NORMAL@"
 Fighting:
@@ -7888,7 +8672,9 @@
 	db "DRAGON@"
 Dark:
 	db "DARK@"
+; 50a28
 
+
 INCBIN "baserom.gbc", $50a28, $50bdd - $50a28
 
 
@@ -8018,7 +8804,7 @@
 PokemonNames:
 INCLUDE "stats/pokemon_names.asm"
 
-INCBIN "baserom.gbc",$53D84,$53e2e - $53D84
+INCBIN "baserom.gbc", $53D84, $53e2e - $53D84
 
 
 SECTION "bank15",DATA,BANK[$15]
@@ -8239,7 +9025,7 @@
 
 SECTION "bank20",DATA,BANK[$20]
 
-INCBIN "baserom.gbc",$80000,$80430-$80000
+INCBIN "baserom.gbc", $80000, $80430-$80000
 
 GetFlag2: ; 80430
 ; Do action b on flag de from BitTable2
@@ -8331,7 +9117,7 @@
 ; 80648
 
 
-INCBIN "baserom.gbc",$80648,$80730-$80648
+INCBIN "baserom.gbc", $80648, $80730-$80648
 
 BattleText_0x80730: ; 0x80730
 	db $0, $52, " picked up", $4f
@@ -8700,52 +9486,52 @@
 	db "is angry!", $58
 ; 0x80ce7
 
-BattleText_0x80ce7: ; 0x80ce7
+FastAsleepText: ; 0x80ce7
 	db $0, $5a, $4f
 	db "is fast asleep!", $58
 ; 0x80cfa
 
-BattleText_0x80cfa: ; 0x80cfa
+WokeUpText: ; 0x80cfa
 	db $0, $5a, $4f
 	db "woke up!", $58
 ; 0x80d06
 
-BattleText_0x80d06: ; 0x80d06
+FrozenSolidText: ; 0x80d06
 	db $0, $5a, $4f
 	db "is frozen solid!", $58
 ; 0x80d1a
 
-BattleText_0x80d1a: ; 0x80d1a
+FlinchedText: ; 0x80d1a
 	db $0, $5a, $4f
 	db "flinched!", $58
 ; 0x80d27
 
-BattleText_0x80d27: ; 0x80d27
+MustRechargeText: ; 0x80d27
 	db $0, $5a, $4f
 	db "must recharge!", $58
 ; 0x80d39
 
-BattleText_0x80d39: ; 0x80d39
+DisabledNoMoreText: ; 0x80d39
 	db $0, $5a, "'s", $4f
 	db "disabled no more!", $58
 ; 0x80d4f
 
-BattleText_0x80d4f: ; 0x80d4f
+IsConfusedText: ; 0x80d4f
 	db $0, $5a, $4f
 	db "is confused!", $58
 ; 0x80d5f
 
-BattleText_0x80d5f: ; 0x80d5f
+HurtItselfText: ; 0x80d5f
 	db $0, "It hurt itself in", $4f
 	db "its confusion!", $58
 ; 0x80d81
 
-BattleText_0x80d81: ; 0x80d81
+ConfusedNoMoreText: ; 0x80d81
 	db $0, $5a, "'s", $4f
 	db "confused no more!", $58
 ; 0x80d97
 
-BattleText_0x80d97: ; 0x80d97
+BecameConfusedText: ; 0x80d97
 	db $0, $59, $4f
 	db "became confused!", $58
 ; 0x80dab
@@ -8758,7 +9544,7 @@
 	db "of its confusion.", $58
 ; 0x80dcc
 
-BattleText_0x80dcc: ; 0x80dcc
+AlreadyConfusedText: ; 0x80dcc
 	db $0, $59, "'s", $4f
 	db "already confused!", $58
 ; 0x80de2
@@ -8779,45 +9565,45 @@
 	db $0, "!", $58
 ; 0x80e11
 
-BattleText_0x80e11: ; 0x80e11
+UsedBindText: ; 0x80e11
 	db $0, $5a, $4f
 	db "used BIND on", $55
 	db $59, "!", $58
 ; 0x80e24
 
-BattleText_0x80e24: ; 0x80e24
+WhirlpoolTrapText: ; 0x80e24
 	db $0, $59, $4f
 	db "was trapped!", $58
 ; 0x80e34
 
-BattleText_0x80e34: ; 0x80e34
+FireSpinTrapText: ; 0x80e34
 	db $0, $59, $4f
 	db "was trapped!", $58
 ; 0x80e44
 
-BattleText_0x80e44: ; 0x80e44
+WrappedByText: ; 0x80e44
 	db $0, $59, $4f
 	db "was WRAPPED by", $55
 	db $5a, "!", $58
 ; 0x80e59
 
-BattleText_0x80e59: ; 0x80e59
+ClampedByText: ; 0x80e59
 	db $0, $59, $4f
 	db "was CLAMPED by", $55
 	db $5a, "!", $58
 ; 0x80e6e
 
-BattleText_0x80e6e: ; 0x80e6e
+StoringEnergyText: ; 0x80e6e
 	db $0, $5a, $4f
 	db "is storing energy!", $58
 ; 0x80e84
 
-BattleText_0x80e84: ; 0x80e84
+UnleashedEnergyText: ; 0x80e84
 	db $0, $5a, $4f
 	db "unleashed energy!", $58
 ; 0x80e99
 
-BattleText_0x80e99: ; 0x80e99
+HungOnText: ; 0x80e99
 	db $0, $59, $4f
 	db "hung on with", $55
 	db "@"
@@ -8825,24 +9611,24 @@
 	db $0, "!", $58
 ; 0x80eb0
 
-BattleText_0x80eb0: ; 0x80eb0
+EnduredText: ; 0x80eb0
 	db $0, $59, $4f
 	db "ENDURED the hit!", $58
 ; 0x80ec4
 
-BattleText_0x80ec4: ; 0x80ec4
+InLoveWithText: ; 0x80ec4
 	db $0, $5a, $4f
 	db "is in love with", $55
 	db $59, "!", $58
 ; 0x80eda
 
-BattleText_0x80eda: ; 0x80eda
+InfatuationText: ; 0x80eda
 	db $0, $5a, "'s", $4f
 	db "infatuation kept", $55
 	db "it from attacking!", $58
 ; 0x80f02
 
-BattleText_0x80f02: ; 0x80f02
+DisabledMoveText: ; 0x80f02
 	db $0, $5a, "'s", $4f
 	db "@"
 	text_from_ram $d073
@@ -8850,48 +9636,48 @@
 	db "DISABLED!", $58
 ; 0x80f19
 
-BattleText_0x80f19: ; 0x80f19
+LoafingAroundText: ; 0x80f19
 	text_from_ram $c621
 	db $0, " is", $4f
 	db "loafing around.", $58
 ; 0x80f31
 
-BattleText_0x80f31: ; 0x80f31
+BeganToNapText: ; 0x80f31
 	text_from_ram $c621
 	db $0, " began", $4f
 	db "to nap!", $58
 ; 0x80f44
 
-BattleText_0x80f44: ; 0x80f44
+WontObeyText: ; 0x80f44
 	text_from_ram $c621
 	db $0, " won't", $4f
 	db "obey!", $58
 ; 0x80f54
 
-BattleText_0x80f54: ; 0x80f54
+TurnedAwayText: ; 0x80f54
 	text_from_ram $c621
 	db $0, " turned", $4f
 	db "away!", $58
 ; 0x80f66
 
-BattleText_0x80f66: ; 0x80f66
+IgnoredOrdersText: ; 0x80f66
 	text_from_ram $c621
 	db $0, " ignored", $4f
 	db "orders!", $58
 ; 0x80f7b
 
-BattleText_0x80f7b: ; 0x80f7b
+IgnoredSleepingText: ; 0x80f7b
 	text_from_ram $c621
 	db $0, " ignored", $4f
 	db "orders…sleeping!", $58
 ; 0x80f99
 
-BattleText_0x80f99: ; 0x80f99
+NoPPLeftText: ; 0x80f99
 	db $0, "But no PP is left", $4f
 	db "for the move!", $58
 ; 0x80fba
 
-BattleText_0x80fba: ; 0x80fba
+HasNoPPLeftText: ; 0x80fba
 	db $0, $5a, $4f
 	db "has no PP left for", $55
 	db "@"
@@ -8899,93 +9685,93 @@
 	db $0, "!", $58
 ; 0x80fd7
 
-BattleText_0x80fd7: ; 0x80fd7
+WentToSleepText: ; 0x80fd7
 	db $0, $5a, $4f
 	db "went to sleep!", $57
 ; 0x80fe9
 
-BattleText_0x80fe9: ; 0x80fe9
+RestedText: ; 0x80fe9
 	db $0, $5a, $4f
 	db "fell asleep and", $55
 	db "became healthy!", $57
 ; 0x8100c
 
-BattleText_0x8100c: ; 0x8100c
+RegainedHealthText: ; 0x8100c
 	db $0, $5a, $4f
 	db "regained health!", $58
 ; 0x81020
 
-BattleText_0x81020: ; 0x81020
+AttackMissedText: ; 0x81020
 	db $0, $5a, "'s", $4f
 	db "attack missed!", $58
 ; 0x81033
 
-BattleText_0x81033: ; 0x81033
+AttackMissed2Text: ; 0x81033
 	db $0, $5a, "'s", $4f
 	db "attack missed!", $58
 ; 0x81046
 
-BattleText_0x81046: ; 0x81046
+CrashedText: ; 0x81046
 	db $0, $5a, $4f
 	db "kept going and", $55
 	db "crashed!", $58
 ; 0x81061
 
-BattleText_0x81061: ; 0x81061
+UnaffectedText: ; 0x81061
 	db $0, $59, "'s", $4f
 	db "unaffected!", $58
 ; 0x81071
 
-BattleText_0x81071: ; 0x81071
+DoesntAffectText: ; 0x81071
 	db $0, "It doesn't affect", $4f
 	db $59, "!", $58
 ; 0x81086
 
-BattleText_0x81086: ; 0x81086
+CriticalHitText: ; 0x81086
 	db $0, "A critical hit!", $58
 ; 0x81097
 
-BattleText_0x81097: ; 0x81097
+OneHitKOText: ; 0x81097
 	db $0, "It's a one-hit KO!", $58
 ; 0x810aa
 
-BattleText_0x810aa: ; 0x810aa
+SuperEffectiveText: ; 0x810aa
 	db $0, "It's super-", $4f
 	db "effective!", $58
 ; 0x810c1
 
-BattleText_0x810c1: ; 0x810c1
+NotVeryEffectiveText: ; 0x810c1
 	db $0, "It's not very", $4f
 	db "effective…", $58
 ; 0x810da
 
-BattleText_0x810da: ; 0x810da
+TookDownWithItText: ; 0x810da
 	db $0, $59, $4f
 	db "took down with it,", $55
 	db $5a, "!", $58
 ; 0x810f3
 
-BattleText_0x810f3: ; 0x810f3
+RageBuildingText: ; 0x810f3
 	db $0, $5a, "'s", $4f
 	db "RAGE is building!", $58
 ; 0x81109
 
-BattleText_0x81109: ; 0x81109
+GotAnEncoreText: ; 0x81109
 	db $0, $59, $4f
 	db "got an ENCORE!", $58
 ; 0x8111b
 
-BattleText_0x8111b: ; 0x8111b
+SharedPainText: ; 0x8111b
 	db $0, "The battlers", $4f
 	db "shared pain!", $58
 ; 0x81136
 
-BattleText_0x81136: ; 0x81136
+TookAimText: ; 0x81136
 	db $0, $5a, $4f
 	db "took aim!", $58
 ; 0x81143
 
-BattleText_0x81143: ; 0x81143
+SketchedText: ; 0x81143
 	db $0, $5a, $4f
 	db "SKETCHED", $55
 	db "@"
@@ -8993,13 +9779,13 @@
 	db $0, "!", $58
 ; 0x81156
 
-BattleText_0x81156: ; 0x81156
+DestinyBondEffectText: ; 0x81156
 	db $0, $5a, "'s", $4f
 	db "trying to take its", $55
 	db "opponent with it!", $58
 ; 0x8117f
 
-BattleText_0x8117f: ; 0x8117f
+SpiteEffectText: ; 0x8117f
 	db $0, $59, "'s", $4f
 	db "@"
 	text_from_ram $d073
@@ -9009,62 +9795,62 @@
 	db $0, "!", $58
 ; 0x811a0
 
-BattleText_0x811a0: ; 0x811a0
+BellChimedText: ; 0x811a0
 	db $0, "A bell chimed!", $4f
 	db $58
 ; 0x811b1
 
-BattleText_0x811b1: ; 0x811b1
+FellAsleepText: ; 0x811b1
 	db $0, $59, $4f
 	db "fell asleep!", $58
 ; 0x811c1
 
-BattleText_0x811c1: ; 0x811c1
+AlreadyAsleepText: ; 0x811c1
 	db $0, $59, "'s", $4f
 	db "already asleep!", $58
 ; 0x811d5
 
-BattleText_0x811d5: ; 0x811d5
+WasPoisonedText: ; 0x811d5
 	db $0, $59, $4f
 	db "was poisoned!", $58
 ; 0x811e6
 
-BattleText_0x811e6: ; 0x811e6
+BadlyPoisonedText: ; 0x811e6
 	db $0, $59, "'s", $4f
 	db "badly poisoned!", $58
 ; 0x811fa
 
-BattleText_0x811fa: ; 0x811fa
+AlreadyPoisonedText: ; 0x811fa
 	db $0, $59, "'s", $4f
 	db "already poisoned!", $58
 ; 0x81210
 
-BattleText_0x81210: ; 0x81210
+SuckedHealthText: ; 0x81210
 	db $0, "Sucked health from", $4f
 	db $59, "!", $58
 ; 0x81227
 
-BattleText_0x81227: ; 0x81227
+DreamEatenText: ; 0x81227
 	db $0, $59, "'s", $4f
 	db "dream was eaten!", $58
 ; 0x8123c
 
-BattleText_0x8123c: ; 0x8123c
+WasBurnedText: ; 0x8123c
 	db $0, $59, $4f
 	db "was burned!", $58
 ; 0x8124b
 
-BattleText_0x8124b: ; 0x8124b
+DefrostedOpponentText: ; 0x8124b
 	db $0, $59, $4f
 	db "was defrosted!", $58
 ; 0x8125d
 
-BattleText_0x8125d: ; 0x8125d
+WasFrozenText: ; 0x8125d
 	db $0, $59, $4f
 	db "was frozen solid!", $58
 ; 0x81272
 
-BattleText_0x81272: ; 0x81272
+WontRiseAnymoreText: ; 0x81272
 	db $0, $5a, "'s", $4f
 	db "@"
 	text_from_ram $d086
@@ -9072,7 +9858,7 @@
 	db "rise anymore!", $58
 ; 0x8128f
 
-BattleText_0x8128f: ; 0x8128f
+WontDropAnymoreText: ; 0x8128f
 	db $0, $59, "'s", $4f
 	db "@"
 	text_from_ram $d086
@@ -9080,81 +9866,81 @@
 	db "drop anymore!", $58
 ; 0x812ac
 
-BattleText_0x812ac: ; 0x812ac
+FledFromBattleText: ; 0x812ac
 	db $0, $5a, $4f
 	db "fled from battle!", $58
 ; 0x812c1
 
-BattleText_0x812c1: ; 0x812c1
+FledInFearText: ; 0x812c1
 	db $0, $59, $4f
 	db "fled in fear!", $58
 ; 0x812d2
 
-BattleText_0x812d2: ; 0x812d2
+BlownAwayText: ; 0x812d2
 	db $0, $59, $4f
 	db "was blown away!", $58
 ; 0x812e5
 
-BattleText_0x812e5: ; 0x812e5
+PlayerHitTimesText: ; 0x812e5
 	db $0, "Hit @"
 	deciram $c682, $11
 	db $0, " times!", $58
 ; 0x812f8
 
-BattleText_0x812f8: ; 0x812f8
+EnemyHitTimesText: ; 0x812f8
 	db $0, "Hit @"
 	deciram $c684, $11
 	db $0, " times!", $58
 ; 0x8130b
 
-BattleText_0x8130b: ; 0x8130b
+MistText: ; 0x8130b
 	db $0, $5a, "'s", $4f
 	db "shrouded in MIST!", $58
 ; 0x81321
 
-BattleText_0x81321: ; 0x81321
+ProtectedByMistText: ; 0x81321
 	db $0, $59, "'s", $4f
 	db "protected by MIST.", $58
 ; 0x81338
 
-BattleText_0x81338: ; 0x81338
+GettingPumpedText: ; 0x81338
 	interpret_data
 	db $0, $5a, "'s", $4f
 	db "getting pumped!", $58
 ; 0x8134d
 
-BattleText_0x8134d: ; 0x8134d
+RecoilText: ; 0x8134d
 	db $0, $5a, "'s", $4f
 	db "hit with recoil!", $58
 ; 0x81362
 
-BattleText_0x81362: ; 0x81362
+MadeSubstituteText: ; 0x81362
 	db $0, $5a, $4f
 	db "made a SUBSTITUTE!", $58
 ; 0x81378
 
-BattleText_0x81378: ; 0x81378
+HasSubstituteText: ; 0x81378
 	db $0, $5a, $4f
 	db "has a SUBSTITUTE!", $58
 ; 0x8138d
 
-BattleText_0x8138d: ; 0x8138d
+TooWeakSubText: ; 0x8138d
 	db $0, "Too weak to make", $4f
 	db "a SUBSTITUTE!", $58
 ; 0x813ad
 
-BattleText_0x813ad: ; 0x813ad
+SubTookDamageText: ; 0x813ad
 	db $0, "The SUBSTITUTE", $4f
 	db "took damage for", $55
 	db $59, "!", $58
 ; 0x813d0
 
-BattleText_0x813d0: ; 0x813d0
+SubFadedText: ; 0x813d0
 	db $0, $59, "'s", $4f
 	db "SUBSTITUTE faded!", $58
 ; 0x813e6
 
-BattleText_0x813e6: ; 0x813e6
+LearnedMoveText: ; 0x813e6
 	db $0, $5a, $4f
 	db "learned", $55
 	db "@"
@@ -9162,17 +9948,17 @@
 	db $0, "!", $58
 ; 0x813f8
 
-BattleText_0x813f8: ; 0x813f8
+WasSeededText: ; 0x813f8
 	db $0, $59, $4f
 	db "was seeded!", $58
 ; 0x81407
 
-BattleText_0x81407: ; 0x81407
+EvadedText: ; 0x81407
 	db $0, $59, $4f
 	db "evaded the attack!", $58
 ; 0x8141d
 
-BattleText_0x8141d: ; 0x8141d
+WasDisabledText: ; 0x8141d
 	db $0, $59, "'s", $4f
 	db "@"
 	text_from_ram $d073
@@ -9180,12 +9966,12 @@
 	db "DISABLED!", $58
 ; 0x81435
 
-BattleText_0x81435: ; 0x81435
+CoinsScatteredText: ; 0x81435
 	db $0, "Coins scattered", $4f
 	db "everywhere!", $58
 ; 0x81452
 
-BattleText_0x81452: ; 0x81452
+TransformedTypeText: ; 0x81452
 	db $0, $5a, $4f
 	db "transformed into", $55
 	db "the @"
@@ -9193,12 +9979,12 @@
 	db $0, "-type!", $58
 ; 0x81476
 
-BattleText_0x81476: ; 0x81476
+EliminatedStatsText: ; 0x81476
 	db $0, "All stat changes", $4f
 	db "were eliminated!", $58
 ; 0x81499
 
-BattleText_0x81499: ; 0x81499
+TransformedText: ; 0x81499
 	db $0, $5a, $4f
 	db "TRANSFORMED into", $55
 	db "@"
@@ -9206,66 +9992,66 @@
 	db $0, "!", $58
 ; 0x814b4
 
-BattleText_0x814b4: ; 0x814b4
+LightScreenEffectText: ; 0x814b4
 	db $0, $5a, "'s", $4f
 	db "SPCL.DEF rose!", $58
 ; 0x814c7
 
-BattleText_0x814c7: ; 0x814c7
+ReflectEffectText: ; 0x814c7
 	db $0, $5a, "'s", $4f
 	db "DEFENSE rose!", $58
 ; 0x814d9
 
-BattleText_0x814d9: ; 0x814d9
+NothingHappenedText: ; 0x814d9
 	db $0, "But nothing", $4f
 	db "happened.", $58
 ; 0x814f0
 
-BattleText_0x814f0: ; 0x814f0
+ButItFailedText: ; 0x814f0
 	db $0, "But it failed!", $58
 ; 0x81500
 
-BattleText_0x81500: ; 0x81500
+ItFailedText: ; 0x81500
 	db $0, "It failed!", $58
 ; 0x8150c
 
-BattleText_0x8150c: ; 0x8150c
+DidntAffect1Text: ; 0x8150c
 	db $0, "It didn't affect", $4f
 	db $59, "!", $58
 ; 0x81520
 
-BattleText_0x81520: ; 0x81520
+DidntAffect2Text: ; 0x81520
 	db $0, "It didn't affect", $4f
 	db $59, "!", $58
 ; 0x81534
 
-BattleText_0x81534: ; 0x81534
+HPIsFullText: ; 0x81534
 	db $0, $5a, "'s", $4f
 	db "HP is full!", $58
 ; 0x81544
 
-BattleText_0x81544: ; 0x81544
+DraggedOutText: ; 0x81544
 	db $0, $5a, $4f
 	db "was dragged out!", $58
 ; 0x81558
 
-BattleText_0x81558: ; 0x81558
+ParalyzedText: ; 0x81558
 	db $0, $59, "'s", $4f
 	db "paralyzed! Maybe", $55
 	db "it can't attack!", $58
 ; 0x8157d
 
-BattleText_0x8157d: ; 0x8157d
+FullyParalyzedText: ; 0x8157d
 	db $0, $5a, "'s", $4f
 	db "fully paralyzed!", $58
 ; 0x81592
 
-BattleText_0x81592: ; 0x81592
+AlreadyParalyzedText: ; 0x81592
 	db $0, $59, "'s", $4f
 	db "already paralyzed!", $58
 ; 0x815a9
 
-BattleText_0x815a9: ; 0x815a9
+ProtectedByText: ; 0x815a9
 	db $0, $59, "'s", $4f
 	db "protected by", $55
 	db "@"
@@ -9273,11 +10059,11 @@
 	db $0, "!", $58
 ; 0x815c1
 
-BattleText_0x815c1: ; 0x815c1
+MirrorMoveFailedText: ; 0x815c1
 	db $0, "The MIRROR MOVE", $4e, "failed!", $58
 ; 0x815da
 
-BattleText_0x815da: ; 0x815da
+StoleText: ; 0x815da
 	db $0, $5a, $4f
 	db "stole @"
 	text_from_ram $d073
@@ -9285,23 +10071,23 @@
 	db "from its foe!", $58
 ; 0x815f7
 
-BattleText_0x815f7: ; 0x815f7
+CantEscapeNowText: ; 0x815f7
 	db $0, $59, $4f
 	db "can't escape now!", $58
 ; 0x8160b
 
-BattleText_0x8160b: ; 0x8160b
+StartedNightmareText: ; 0x8160b
 	db $0, $59, $4f
 	db "started to have a", $55
 	db "NIGHTMARE!", $58
 ; 0x8162b
 
-BattleText_0x8162b: ; 0x8162b
+WasDefrostedText: ; 0x8162b
 	db $0, $5a, $4f
 	db "was defrosted!", $58
 ; 0x8163d
 
-BattleText_0x8163d: ; 0x8163d
+PutACurseText: ; 0x8163d
 	db $0, $5a, $4f
 	db "cut its own HP and", $51
 	db "put a CURSE on", $4f
@@ -9308,98 +10094,98 @@
 	db $59, "!", $58
 ; 0x81665
 
-BattleText_0x81665: ; 0x81665
+ProtectedItselfText: ; 0x81665
 	db $0, $5a, $4f
 	db "PROTECTED itself!", $58
 ; 0x8167a
 
-BattleText_0x8167a: ; 0x8167a
+ProtectingItselfText: ; 0x8167a
 	db $0, $59, "'s", $4f
 	db "PROTECTING itself!", $57
 ; 0x81691
 
-BattleText_0x81691: ; 0x81691
+SpikesText: ; 0x81691
 	db $0, "SPIKES scattered", $4f
 	db "all around", $55
 	db $59, "!", $58
 ; 0x816b1
 
-BattleText_0x816b1: ; 0x816b1
+IdentifiedText: ; 0x816b1
 	db $0, $5a, $4f
 	db "identified", $55
 	db $59, "!", $58
 ; 0x816c2
 
-BattleText_0x816c2: ; 0x816c2
+StartPerishText: ; 0x816c2
 	db $0, "Both #MON will", $4f
 	db "faint in 3 turns!", $58
 ; 0x816e4
 
-BattleText_0x816e4: ; 0x816e4
+SandstormBrewedText: ; 0x816e4
 	db $0, "A SANDSTORM", $4f
 	db "brewed!", $58
 ; 0x816f9
 
-BattleText_0x816f9: ; 0x816f9
+BracedItselfText: ; 0x816f9
 	db $0, $5a, $4f
 	db "braced itself!", $58
 ; 0x8170b
 
-BattleText_0x8170b: ; 0x8170b
+FellInLoveText: ; 0x8170b
 	db $0, $59, $4f
 	db "fell in love!", $58
 ; 0x8171c
 
-BattleText_0x8171c: ; 0x8171c
+CoveredByVeilText: ; 0x8171c
 	db $0, $5a, "'s", $4f
 	db "covered by a veil!", $58
 ; 0x81733
 
-BattleText_0x81733: ; 0x81733
+SafeguardProtectText: ; 0x81733
 	db $0, $59, $4f
 	db "is protected by", $55
 	db "SAFEGUARD!", $58
 ; 0x81751
 
-BattleText_0x81751: ; 0x81751
+MagnitudeText: ; 0x81751
 	db $0, "Magnitude @"
 	deciram $d265, $11
 	db $0, "!", $58
 ; 0x81764
 
-BattleText_0x81764: ; 0x81764
+ReleasedByText: ; 0x81764
 	db $0, $5a, $4f
 	db "was released by", $55
 	db $59, "!", $58
 ; 0x8177a
 
-BattleText_0x8177a: ; 0x8177a
+ShedLeechSeedText: ; 0x8177a
 	db $0, $5a, $4f
 	db "shed LEECH SEED!", $58
 ; 0x8178e
 
-BattleText_0x8178e: ; 0x8178e
+BlewSpikesText: ; 0x8178e
 	db $0, $5a, $4f
 	db "blew away SPIKES!", $58
 ; 0x817a3
 
-BattleText_0x817a3: ; 0x817a3
+DownpourText: ; 0x817a3
 	db $0, "A downpour", $4f
 	db "started!", $58
 ; 0x817b8
 
-BattleText_0x817b8: ; 0x817b8
+SunGotBrightText: ; 0x817b8
 	db $0, "The sunlight got", $4f
 	db "bright!", $58
 ; 0x817d2
 
-BattleText_0x817d2: ; 0x817d2
+BellyDrumText: ; 0x817d2
 	db $0, $5a, $4f
 	db "cut its HP and", $55
 	db "maximized ATTACK!", $58
 ; 0x817f6
 
-BattleText_0x817f6: ; 0x817f6
+CopiedStatsText: ; 0x817f6
 	db $0, $5a, $4f
 	db "copied the stat", $51
 	db "changes of", $4f
@@ -9406,23 +10192,23 @@
 	db $59, "!", $58
 ; 0x81817
 
-BattleText_0x81817: ; 0x81817
+ForesawAttackText: ; 0x81817
 	db $0, $5a, $4f
 	db "foresaw an attack!", $58
 ; 0x8182d
 
-BattleText_0x8182d: ; 0x8182d
+BeatUpAttackText: ; 0x8182d
 	text_from_ram $d073
 	db $0, "'s", $4f
 	db "attack!", $57
 ; 0x8183b
 
-BattleText_0x8183b: ; 0x8183b
+RefusedGiftText: ; 0x8183b
 	db $0, $59, $4f
 	db "refused the gift!", $58
 ; 0x81850
 
-BattleText_0x81850: ; 0x81850
+IgnoredOrders2Text: ; 0x81850
 	db $0, $5a, $4f
 	db "ignored orders!", $58
 ; 0x81863
@@ -9438,12 +10224,12 @@
 	db "left today!", $57
 ; 0x818ac
 
-INCBIN "baserom.gbc",$818ac,$81fe3-$818ac
+INCBIN "baserom.gbc", $818ac, $81fe3-$818ac
 
 DebugColorTestGFX:
 INCBIN "gfx/debug/color_test.2bpp"
 
-INCBIN "baserom.gbc",$82153,$823c8-$82153
+INCBIN "baserom.gbc", $82153, $823c8-$82153
 
 
 SECTION "bank21",DATA,BANK[$21]
@@ -9730,7 +10516,7 @@
 
 SECTION "bank22",DATA,BANK[$22]
 
-INCBIN "baserom.gbc",$88000,$8832c - $88000
+INCBIN "baserom.gbc", $88000, $8832c - $88000
 
 GetPlayerIcon: ; 8832c
 ; Get the player icon corresponding to gender
@@ -9751,7 +10537,7 @@
 	ret
 ; 8833e
 
-INCBIN "baserom.gbc",$8833e,$896ff - $8833e
+INCBIN "baserom.gbc", $8833e, $896ff - $8833e
 
 ClearScreenArea: ; 0x896ff
 ; clears an area of the screen
@@ -9788,7 +10574,7 @@
 	ret
 ; 0x8971f
 
-INCBIN "baserom.gbc",$8971f,$8addb - $8971f
+INCBIN "baserom.gbc", $8971f, $8addb - $8971f
 
 SpecialHoOhChamber: ; 0x8addb
 	ld hl, PartySpecies
@@ -9803,7 +10589,7 @@
 	ret
 ; 0x8adef
 
-INCBIN "baserom.gbc",$8adef,$8b170 - $8adef
+INCBIN "baserom.gbc", $8adef, $8b170 - $8adef
 
 SpecialDratini: ; 0x8b170
 ; if ScriptVar is 0 or 1, change the moveset of the last Dratini in the party.
@@ -9858,8 +10644,8 @@
 
 	; get the PP of the new move
 	dec a
-	ld hl, Moves + 5
-	ld bc, Move1 - Move0
+	ld hl, Moves + PlayerMovePP - PlayerMoveStruct
+	ld bc, Move2 - Move1
 	call AddNTimes
 	ld a, BANK(Moves)
 	call GetFarByte
@@ -9916,12 +10702,12 @@
 	scf
 	ret
 
-INCBIN "baserom.gbc",$8b1e1,$8ba24-$8b1e1
+INCBIN "baserom.gbc", $8b1e1, $8ba24-$8b1e1
 
 
 SECTION "bank23",DATA,BANK[$23]
 
-INCBIN "baserom.gbc",$8c000,$8c011 - $8c000
+INCBIN "baserom.gbc", $8c000, $8c011 - $8c000
 
 TimeOfDayPals: ; 8c011
 ; return carry if pals are changed
@@ -10031,7 +10817,7 @@
 	ret
 ; 8c079
 
-INCBIN "baserom.gbc",$8c079,$8c117 - $8c079
+INCBIN "baserom.gbc", $8c079, $8c117 - $8c079
 
 GetTimePalette: ; 8c117
 ; get time of day
@@ -10100,7 +10886,7 @@
 	ret
 ; 8c15e
 
-INCBIN "baserom.gbc",$8c15e,$8c17c - $8c15e
+INCBIN "baserom.gbc", $8c15e, $8c17c - $8c15e
 
 GetTimePalFade: ; 8c17c
 ; check cgb
@@ -10295,7 +11081,7 @@
 	db %00000000
 ; 8c20f
 
-INCBIN "baserom.gbc",$8c20f,$8e9ac - $8c20f
+INCBIN "baserom.gbc", $8c20f, $8e9ac - $8c20f
 
 GetSpeciesIcon: ; 8e9ac
 ; Load species icon into VRAM at tile a
@@ -10309,7 +11095,7 @@
 	ret
 ; 8e9bc
 
-INCBIN "baserom.gbc",$8e9bc,$8e9de - $8e9bc
+INCBIN "baserom.gbc", $8e9bc, $8e9de - $8e9bc
 
 GetIconGFX: ; 8e9de
 	call GetIcon_a
@@ -10379,7 +11165,7 @@
 	jp $dc9
 ; 8ea4a
 
-INCBIN "baserom.gbc",$8ea4a,$8eab3 - $8ea4a
+INCBIN "baserom.gbc", $8ea4a, $8eab3 - $8ea4a
 
 ReadMonMenuIcon: ; 8eab3
 	cp EGG
@@ -10733,7 +11519,7 @@
 
 SECTION "bank24",DATA,BANK[$24]
 
-INCBIN "baserom.gbc",$90000,$909F2-$90000
+INCBIN "baserom.gbc", $90000, $909F2-$90000
 
 dw Sunday
 dw Monday
@@ -11260,11 +12046,11 @@
 
 INCLUDE "maps/second_map_headers.asm"
 
-INCBIN "baserom.gbc",$966b0,$96cb1 - $966b0
+INCBIN "baserom.gbc", $966b0, $96cb1 - $966b0
 
 INCLUDE "scripting.asm"
 
-INCBIN "baserom.gbc",$97c20,$35e
+INCBIN "baserom.gbc", $97c20, $35e
 
 SECTION "bank26",DATA,BANK[$26]
 
@@ -11322,12 +12108,12 @@
 
 SECTION "bank28",DATA,BANK[$28]
 
-INCBIN "baserom.gbc",$a0000,$a1eca - $a0000
+INCBIN "baserom.gbc", $a0000, $a1eca - $a0000
 
 
 SECTION "bank29",DATA,BANK[$29]
 
-INCBIN "baserom.gbc",$a4000,$a64ad - $a4000
+INCBIN "baserom.gbc", $a4000, $a64ad - $a4000
 
 
 SECTION "bank2A",DATA,BANK[$2A]
@@ -11352,7 +12138,9 @@
 	INCBIN "maps/Route28.blk"
 ; 0xa8546
 
-INCBIN "baserom.gbc",$a8546,$a8552 - $a8546
+BetaHerosHouse_BlockData: ; 0xa8546
+	INCBIN "maps/BetaHerosHouse.blk"
+; 0xa8552
 
 CeladonCity_BlockData: ; 0xa8552
 	INCBIN "maps/CeladonCity.blk"
@@ -11370,25 +12158,33 @@
 	INCBIN "maps/ElmsHouse.blk"
 ; 0xa8940
 
-INCBIN "baserom.gbc",$a8940,$5a
+BetaSproutTower1_BlockData: ; 0xa8940
+	INCBIN "maps/BetaSproutTower1.blk"
+; 0xa899a
 
 Route11_BlockData: ; 0xa899a
 	INCBIN "maps/Route11.blk"
 ; 0xa8a4e
 
-INCBIN "baserom.gbc",$a8a4e,$a8aa8 - $a8a4e
+BetaSproutTower5_BlockData: ; 0xa8a4e
+	INCBIN "maps/BetaSproutTower5.blk"
+; 0xa8aa8
 
 Route15_BlockData: ; 0xa8aa8
 	INCBIN "maps/Route15.blk"
 ; 0xa8b5c
 
-INCBIN "baserom.gbc",$a8b5c,$24
+BetaSproutTower9_BlockData: ; 0xa8b5c
+	INCBIN "maps/BetaSproutTower9.blk"
+; 0xa8b80
 
 Route19_BlockData: ; 0xa8b80
 	INCBIN "maps/Route19.blk"
 ; 0xa8c34
 
-INCBIN "baserom.gbc",$a8c34,$a8d9c - $a8c34
+BetaBlackthornCity_BlockData: ; 0xa8c34
+	INCBIN "maps/BetaBlackthornCity.blk"
+; 0xa8d9c
 
 Route10South_BlockData: ; 0xa8d9c
 	INCBIN "maps/Route10South.blk"
@@ -11434,7 +12230,9 @@
 	INCBIN "maps/Route24.blk"
 ; 0xa9659
 
-INCBIN "baserom.gbc",$a9659,$a97c1 - $a9659
+BetaVioletCity_BlockData: ; 0xa9659
+	INCBIN "maps/BetaVioletCity.blk"
+; 0xa97c1
 
 Route3_BlockData: ; 0xa97c1
 	INCBIN "maps/Route3.blk"
@@ -11444,20 +12242,34 @@
 	INCBIN "maps/PewterCity.blk"
 ; 0xa9a37
 
-INCBIN "baserom.gbc",$a9a37,$a9bf9 - $a9a37
+BetaIlexForest_BlockData: ; 0xa9a37
+	INCBIN "maps/BetaIlexForest.blk"
+; 0xa9b9f
 
+BetaSproutTower2_BlockData: ; 0xa9b9f
+	INCBIN "maps/BetaSproutTower2.blk"
+; 0xa9bf9
+
 Route12_BlockData: ; 0xa9bf9
 	INCBIN "maps/Route12.blk"
 ; 0xa9d07
 
-INCBIN "baserom.gbc",$a9d07,$168
+BetaGoldenrodCity_BlockData: ; 0xa9d07
+	INCBIN "maps/BetaGoldenrodCity.blk"
+; 0xa9e6f
 
 Route20_BlockData: ; 0xa9e6f
 	INCBIN "maps/Route20.blk"
 ; 0xa9f7d
 
-INCBIN "baserom.gbc",$a9f7d,$a9ff7 - $a9f7d
+BetaSproutTower6_BlockData: ; 0xa9f7d
+	INCBIN "maps/BetaSproutTower6.blk"
+; 0xa9fd7
 
+BetaPokecenterMainHouse_BlockData: ; 0xa9fd7
+	INCBIN "maps/BetaPokecenterMainHouse.blk"
+; 0xa9ff7
+
 Route30_BlockData: ; 0xa9ff7
 	INCBIN "maps/Route30.blk"
 ; 0xaa105
@@ -11486,7 +12298,9 @@
 	INCBIN "maps/Route38.blk"
 ; 0xaa80d
 
-INCBIN "baserom.gbc",$aa80d,$5a
+BetaCianwoodCity_BlockData: ; 0xaa80d
+	INCBIN "maps/BetaCianwoodCity.blk"
+; 0xaa867
 
 OlivineVoltorbHouse_BlockData: ; 0xaa867
 	INCBIN "maps/OlivineVoltorbHouse.blk"
@@ -11496,8 +12310,14 @@
 	INCBIN "maps/SafariZoneFuchsiaGateBeta.blk"
 ; 0xaa88b
 
-INCBIN "baserom.gbc",$aa88b,$aaa4d - $aa88b
+BetaTeakCity_BlockData: ; 0xaa88b
+	INCBIN "maps/BetaTeakCity.blk"
+; 0xaa9f3
 
+BetaCherrygroveCity_BlockData: ; 0xaa9f3
+	INCBIN "maps/BetaCherrygroveCity.blk"
+; 0xaaa4d
+
 CinnabarIsland_BlockData: ; 0xaaa4d
 	INCBIN "maps/CinnabarIsland.blk"
 ; 0xaaaa7
@@ -11510,7 +12330,9 @@
 	INCBIN "maps/Route8.blk"
 ; 0xaac0f
 
-INCBIN "baserom.gbc",$aac0f,$aac69 - $aac0f
+BetaSproutTower3_BlockData: ; 0xaac0f
+	INCBIN "maps/BetaSproutTower3.blk"
+; 0xaac69
 
 ViridianCity_BlockData: ; 0xaac69
 	INCBIN "maps/ViridianCity.blk"
@@ -11524,13 +12346,17 @@
 	INCBIN "maps/Route21.blk"
 ; 0xaaf93
 
-INCBIN "baserom.gbc",$aaf93,$aafed - $aaf93
+BetaSproutTower7_BlockData: ; 0xaaf93
+	INCBIN "maps/BetaSproutTower7.blk"
+; 0xaafed
 
 Route17_BlockData: ; 0xaafed
 	INCBIN "maps/Route17.blk"
 ; 0xab1af
 
-INCBIN "baserom.gbc",$ab1af,$ab209 - $ab1af
+BetaMahoganyTown_BlockData: ; 0xab1af
+	INCBIN "maps/BetaMahoganyTown.blk"
+; 0xab209
 
 Route31_BlockData: ; 0xab209
 	INCBIN "maps/Route31.blk"
@@ -11560,14 +12386,22 @@
 	INCBIN "maps/Route38EcruteakGate.blk"
 ; 0xab6c3
 
-INCBIN "baserom.gbc",$ab6c3,$ab82b - $ab6c3
+BetaAzaleaTown_BlockData: ; 0xab6c3
+	INCBIN "maps/BetaAzaleaTown.blk"
+; 0xab82b
 
 VermilionCity_BlockData: ; 0xab82b
 	INCBIN "maps/VermilionCity.blk"
 ; 0xab993
 
-INCBIN "baserom.gbc",$ab993,$abb55 - $ab993
+BetaOlivineCity_BlockData: ; 0xab993
+	INCBIN "maps/BetaOlivineCity.blk"
+; 0xabafb
 
+BetaNewBarkTown_BlockData: ; 0xabafb
+	INCBIN "maps/BetaNewBarkTown.blk"
+; 0xabb55
+
 ElmsLab_BlockData: ; 0xabb55
 	INCBIN "maps/ElmsLab.blk"
 ; 0xabb73
@@ -11599,7 +12433,9 @@
 	INCBIN "maps/Route14.blk"
 ; 0xac0b4
 
-INCBIN "baserom.gbc",$ac0b4,$5a
+BetaSproutTower8_BlockData: ; 0xac0b4
+	INCBIN "maps/BetaSproutTower8.blk"
+; 0xac10e
 
 OlivineMart_BlockData: ; 0xac10e
 	INCBIN "maps/OlivineMart.blk"
@@ -11609,20 +12445,42 @@
 	INCBIN "maps/Route10North.blk"
 ; 0xac180
 
-INCBIN "baserom.gbc",$ac180,$168
+BetaLakeOfRage_BlockData: ; 0xac180
+	INCBIN "maps/BetaLakeOfRage.blk"
+; 0xac2e8
 
 OlivinePokeCenter1F_BlockData: ; 0xac2e8
 	INCBIN "maps/OlivinePokeCenter1F.blk"
 ; 0xac2fc
 
-INCBIN "baserom.gbc",$ac2fc,$ac340 - $ac2fc
+BetaPewterMuseumOfScience1F_BlockData: ; 0xac2fc
+	INCBIN "maps/BetaPewterMuseumOfScience1F.blk"
+; 0xac324
 
+BetaPewterMuseumOfScience2F_BlockData: ; 0xac324
+	INCBIN "maps/BetaPewterMuseumOfScience2F.blk"
+; 0xac340
+
 EarlsPokemonAcademy_BlockData: ; 0xac340
 	INCBIN "maps/EarlsPokemonAcademy.blk"
 ; 0xac360
 
-INCBIN "baserom.gbc",$ac360,$ac3b4 - $ac360
+BetaCinnabarIslandPokemonLabHallway_BlockData: ; 0xac360
+	INCBIN "maps/BetaCinnabarIslandPokemonLabHallway.blk"
+; 0xac384
 
+BetaCinnabarIslandPokemonLabRoom1_BlockData: ; 0xac384
+	INCBIN "maps/BetaCinnabarIslandPokemonLabRoom1.blk"
+; 0xac394
+
+BetaCinnabarIslandPokemonLabRoom2_BlockData: ; 0xac394
+	INCBIN "maps/BetaCinnabarIslandPokemonLabRoom2.blk"
+; 0xac3a4
+
+BetaCinnabarIslandPokemonLabRoom3_BlockData: ; 0xac3a4
+	INCBIN "maps/BetaCinnabarIslandPokemonLabRoom3.blk"
+; 0xac3b4
+
 GoldenrodDeptStore1F_BlockData: ; 0xac3b4
 	INCBIN "maps/GoldenrodDeptStore1F.blk"
 ; 0xac3d4
@@ -11667,7 +12525,9 @@
 	INCBIN "maps/CeladonMansionRoof.blk"
 ; 0xac4c8
 
-INCBIN "baserom.gbc",$ac4c8,$ac4d8 - $ac4c8
+BetaHouse_BlockData: ; 0xac4c8
+	INCBIN "maps/BetaHouse.blk"
+; 0xac4d8
 
 CeladonGameCorner_BlockData: ; 0xac4d8
 	INCBIN "maps/CeladonGameCorner.blk"
@@ -11689,7 +12549,9 @@
 	INCBIN "maps/EcruteakLugiaSpeechHouse.blk"
 ; 0xac55f
 
-INCBIN "baserom.gbc",$ac55f,$5a
+BetaCave_BlockData: ; 0xac55f
+	INCBIN "maps/BetaCave.blk"
+; 0xac5b9
 
 UnionCaveB1F_BlockData: ; 0xac5b9
 	INCBIN "maps/UnionCaveB1F.blk"
@@ -11711,7 +12573,9 @@
 	INCBIN "maps/Route6UndergroundEntrance.blk"
 ; 0xaca01
 
-INCBIN "baserom.gbc",$aca01,$10
+BetaPokecenterTradeStation_BlockData: ; 0xaca01
+	INCBIN "maps/BetaPokecenterTradeStation.blk"
+; 0xaca11
 
 KurtsHouse_BlockData: ; 0xaca11
 	INCBIN "maps/KurtsHouse.blk"
@@ -11725,7 +12589,9 @@
 	INCBIN "maps/RuinsofAlphOutside.blk"
 ; 0xacb3f
 
-INCBIN "baserom.gbc",$acb3f,$acb53 - $acb3f
+BetaAlphRuinUnsolvedPuzzleRoom_BlockData: ; 0xacb3f
+	INCBIN "maps/BetaAlphRuinUnsolvedPuzzleRoom.blk"
+; 0xacb53
 
 RuinsofAlphInnerChamber_BlockData: ; 0xacb53
 	INCBIN "maps/RuinsofAlphInnerChamber.blk"
@@ -11739,19 +12605,25 @@
 	INCBIN "maps/SproutTower1F.blk"
 ; 0xacc43
 
-INCBIN "baserom.gbc",$acc43,$acc4d - $acc43
+BetaSproutTowerCutOut1_BlockData: ; 0xacc43
+	INCBIN "maps/BetaSproutTowerCutOut1.blk"
+; 0xacc4d
 
 SproutTower2F_BlockData: ; 0xacc4d
 	INCBIN "maps/SproutTower2F.blk"
 ; 0xacc9d
 
-INCBIN "baserom.gbc",$acc9d,$acca7 - $acc9d
+BetaSproutTowerCutOut2_BlockData: ; 0xacc9d
+	INCBIN "maps/BetaSproutTowerCutOut2.blk"
+; 0xacca7
 
 SproutTower3F_BlockData: ; 0xacca7
 	INCBIN "maps/SproutTower3F.blk"
 ; 0xaccf7
 
-INCBIN "baserom.gbc",$accf7,$acd01 - $accf7
+BetaSproutTowerCutOut3_BlockData: ; 0xaccf7
+	INCBIN "maps/BetaSproutTowerCutOut3.blk"
+; 0xacd01
 
 RadioTower1F_BlockData: ; 0xacd01
 	INCBIN "maps/RadioTower1F.blk"
@@ -11853,7 +12725,9 @@
 	INCBIN "maps/UndergroundWarehouse.blk"
 ; 0xadf76
 
-INCBIN "baserom.gbc",$adf76,$19
+BetaElevator_BlockData: ; 0xadf76
+	INCBIN "maps/BetaElevator.blk"
+; 0xadf8f
 
 TinTower1F_BlockData: ; 0xadf8f
 	INCBIN "maps/TinTower1F.blk"
@@ -11903,7 +12777,9 @@
 	INCBIN "maps/BurnedTowerB1F.blk"
 ; 0xae3c7
 
-INCBIN "baserom.gbc",$ae3c7,$ae4d5 - $ae3c7
+BetaCaveTestMap_BlockData: ; 0xae3c7
+	INCBIN "maps/BetaCaveTestMap.blk"
+; 0xae4d5
 
 MountMortar1FOutside_BlockData: ; 0xae4d5
 	INCBIN "maps/MountMortar1FOutside.blk"
@@ -11985,8 +12861,22 @@
 	INCBIN "maps/SilverCaveRoom3.blk"
 ; 0xaf44d
 
-INCBIN "baserom.gbc",$af44d,$438
+BetaRocketHideout1_BlockData: ; 0xaf44d
+	INCBIN "maps/BetaRocketHideout1.blk"
+; 0xaf55b
 
+BetaRocketHideout2_BlockData: ; 0xaf55b
+	INCBIN "maps/BetaRocketHideout2.blk"
+; 0xaf669
+
+BetaEmptyHouse_BlockData: ; 0xaf669
+	INCBIN "maps/BetaEmptyHouse.blk"
+; 0xaf777
+
+BetaRocketHideout3_BlockData: ; 0xaf777
+	INCBIN "maps/BetaRocketHideout3.blk"
+; 0xaf885
+
 MahoganyMart1F_BlockData: ; 0xaf885
 	INCBIN "maps/MahoganyMart1F.blk"
 ; 0xaf895
@@ -12003,7 +12893,9 @@
 	INCBIN "maps/TeamRocketBaseB3F.blk"
 ; 0xafa2a
 
-INCBIN "baserom.gbc",$afa2a,$afa84 - $afa2a
+BetaRoute23EarlyVersion_BlockData: ; 0xafa2a
+	INCBIN "maps/BetaRoute23EarlyVersion.blk"
+; 0xafa84
 
 IndigoPlateauPokeCenter1F_BlockData: ; 0xafa84
 	INCBIN "maps/IndigoPlateauPokeCenter1F.blk"
@@ -12049,7 +12941,9 @@
 	INCBIN "maps/OlivineGym.blk"
 ; 0xafca3
 
-INCBIN "baserom.gbc",$afca3,$afcb7 - $afca3
+BetaUnknown_BlockData: ; 0xafca3
+	INCBIN "maps/BetaUnknown.blk"
+; 0xafcb7
 
 CianwoodGym_BlockData: ; 0xafcb7
 	INCBIN "maps/CianwoodGym.blk"
@@ -12090,7 +12984,9 @@
 
 SECTION "bank2C",DATA,BANK[$2C]
 
-INCBIN "baserom.gbc",$b0000,$b0023 - $b0000
+BetaCave2_BlockData: ; 0xb0000
+	INCBIN "maps/BetaCave2.blk"
+; 0xb0023
 
 SlowpokeWellB1F_BlockData: ; 0xb0023
 	INCBIN "maps/SlowpokeWellB1F.blk"
@@ -12148,7 +13044,9 @@
 	INCBIN "maps/FastShipB1F.blk"
 ; 0xb0700
 
-INCBIN "baserom.gbc",$b0700,$10
+BetaSsAquaInsideCutOut_BlockData: ; 0xb0700
+	INCBIN "maps/BetaSsAquaInsideCutOut.blk"
+; 0xb0710
 
 FastShipCabins_NNW_NNE_NE_BlockData: ; 0xb0710
 	INCBIN "maps/FastShipCabins_NNW_NNE_NE.blk"
@@ -12262,13 +13160,17 @@
 	INCBIN "maps/CeladonGym.blk"
 ; 0xb0ce2
 
-INCBIN "baserom.gbc",$b0ce2,$b0cf6 - $b0ce2
+BetaHouse2_BlockData: ; 0xb0ce2
+	INCBIN "maps/BetaHouse2.blk"
+; 0xb0cf6
 
 CeladonCafe_BlockData: ; 0xb0cf6
 	INCBIN "maps/CeladonCafe.blk"
 ; 0xb0d0e
 
-INCBIN "baserom.gbc",$b0d0e,$18
+BetaCeladonMansion_BlockData: ; 0xb0d0e
+	INCBIN "maps/BetaCeladonMansion.blk"
+; 0xb0d26
 
 RockTunnel1F_BlockData: ; 0xb0d26
 	INCBIN "maps/RockTunnel1F.blk"
@@ -12422,7 +13324,9 @@
 	INCBIN "maps/BattleTowerOutside.blk"
 ; 0xb1afa
 
-INCBIN "baserom.gbc",$b1afa,$28
+BetaBlank_BlockData: ; 0xb1afa
+	INCBIN "maps/BetaBlank.blk"
+; 0xb1b22
 
 GoldenrodDeptStoreRoof_BlockData: ; 0xb1b22
 	INCBIN "maps/GoldenrodDeptStoreRoof.blk"
@@ -12548,7 +13452,7 @@
 
 SECTION "bank2E",DATA,BANK[$2E]
 
-INCBIN "baserom.gbc",$B8000,$b8219 - $b8000
+INCBIN "baserom.gbc", $B8000, $b8219 - $b8000
 
 Functionb8219: ; b8219
 ; deals strictly with rockmon encounter
@@ -12606,7 +13510,7 @@
 	ret
 ; b825e
 
-INCBIN "baserom.gbc",$B825E,$b82c5 - $b825e
+INCBIN "baserom.gbc", $B825E, $b82c5 - $b825e
 
 WildRockMonMapTable: ; b82c5
 	db GROUP_CIANWOOD_CITY, MAP_CIANWOOD_CITY, $07
@@ -12788,12 +13692,12 @@
 	db $ff ; end
 ; b83e5
 
-INCBIN "baserom.gbc",$b83e5,$b9e8b - $b83e5
+INCBIN "baserom.gbc", $b83e5, $b9e8b - $b83e5
 
 
 SECTION "bank2F",DATA,BANK[$2F]
 
-INCBIN "baserom.gbc",$bc000,$bc09c - $bc000
+INCBIN "baserom.gbc", $bc000, $bc09c - $bc000
 
 PokeCenterNurseScript: ; bc09c
 ; Talking to a nurse in a Pokemon Center
@@ -12926,7 +13830,7 @@
 	end
 ; bc162
 
-INCBIN "baserom.gbc",$bc162,$bcea5-$bc162
+INCBIN "baserom.gbc", $bc162, $bcea5-$bc162
 
 UnusedPhoneScript: ; 0xbcea5
 	3writetext BANK(UnusedPhoneText), UnusedPhoneText
@@ -12982,13 +13886,13 @@
 
 .violet ; 0xbcf15
 	displaylocation $7 ; sprout tower
-	3call $3,$4edf
+	3call $3, $4edf
 .azalea ; 0xbcf1b
 	displaylocation $d ; slowpoke well
-	3call $3,$4edf
+	3call $3, $4edf
 .goldenrod ; 0xbcf21
 	displaylocation $11 ; radio tower
-	3call $3,$4edf
+	3call $3, $4edf
 	3writetext $6d, $411c
 	keeptextopen
 	2jump UnknownScript_0xbcf37
@@ -13217,27 +14121,27 @@
 	specialphonecall $0000
 	end
 
-INCBIN "baserom.gbc",$bd0d0,$be699-$bd0d0
+INCBIN "baserom.gbc", $bd0d0, $be699-$bd0d0
 
 
 SECTION "bank30",DATA,BANK[$30]
 
-INCBIN "baserom.gbc",$c0000,$c3fc0 - $c0000
+INCBIN "baserom.gbc", $c0000, $c3fc0 - $c0000
 
 
 SECTION "bank31",DATA,BANK[$31]
 
-INCBIN "baserom.gbc",$c4000,$c7f80 - $c4000
+INCBIN "baserom.gbc", $c4000, $c7f80 - $c4000
 
 
 SECTION "bank32",DATA,BANK[$32]
 
-INCBIN "baserom.gbc",$c8000,$cbe2b - $c8000
+INCBIN "baserom.gbc", $c8000, $cbe2b - $c8000
 
 
 SECTION "bank33",DATA,BANK[$33]
 
-INCBIN "baserom.gbc",$cc000, $cfd9e - $cc000
+INCBIN "baserom.gbc", $cc000, $cfd9e - $cc000
 
 ;                          Songs iii
 
@@ -13429,7 +14333,7 @@
 
 SECTION "bank38",DATA,BANK[$38]
 
-INCBIN "baserom.gbc",$e0000,$e37f9 - $e0000
+INCBIN "baserom.gbc", $e0000, $e37f9 - $e0000
 
 
 SECTION "bank39",DATA,BANK[$39]
@@ -13737,13 +14641,13 @@
 SECTION "bank3E",DATA,BANK[$3E]
 
 FontExtra:
-INCBIN "gfx/misc/font_extra.2bpp",$0,$200
+INCBIN "gfx/misc/font_extra.2bpp", $0, $200
 
 Font:
-INCBIN "gfx/misc/font.1bpp",$0,$400
+INCBIN "gfx/misc/font.1bpp", $0, $400
 
 FontBattleExtra:
-INCBIN "gfx/misc/font_battle_extra.2bpp",$0,$200
+INCBIN "gfx/misc/font_battle_extra.2bpp", $0, $200
 
 INCBIN "baserom.gbc", $f8800, $f8ba0 - $f8800
 
@@ -13755,9 +14659,216 @@
 
 INCLUDE "battle/magikarp_length.asm"
 
-INCBIN "baserom.gbc",$fbccf,$fbe91 - $fbccf
+INCBIN "baserom.gbc", $fbccf, $fbda4 - $fbccf
 
 
+DoWeatherModifiers: ; fbda4
+
+	ld de, .WeatherTypeModifiers
+	ld a, [Weather]
+	ld b, a
+	ld a, [$d265] ; move type
+	ld c, a
+
+.CheckWeatherType
+	ld a, [de]
+	inc de
+	cp $ff
+	jr z, .asm_fbdc0
+
+	cp b
+	jr nz, .NextWeatherType
+
+	ld a, [de]
+	cp c
+	jr z, .ApplyModifier
+
+.NextWeatherType
+	inc de
+	inc de
+	jr .CheckWeatherType
+
+
+.asm_fbdc0
+	ld de, .WeatherMoveModifiers
+
+	ld a, BATTLE_VARS_MOVE_EFFECT
+	call CleanGetBattleVarPair
+	ld c, a
+
+.CheckWeatherMove
+	ld a, [de]
+	inc de
+	cp $ff
+	jr z, .done
+
+	cp b
+	jr nz, .NextWeatherMove
+
+	ld a, [de]
+	cp c
+	jr z, .ApplyModifier
+
+.NextWeatherMove
+	inc de
+	inc de
+	jr .CheckWeatherMove
+
+.ApplyModifier
+	xor a
+	ld [$ffb4], a
+	ld hl, CurDamage
+	ld a, [hli]
+	ld [$ffb5], a
+	ld a, [hl]
+	ld [$ffb6], a
+
+	inc de
+	ld a, [de]
+	ld [$ffb7], a
+
+	call Multiply
+
+	ld a, 10
+	ld [$ffb7], a
+	ld b, $4
+	call Divide
+
+	ld a, [$ffb4]
+	and a
+	ld bc, $ffff
+	jr nz, .Update
+
+	ld a, [$ffb5]
+	ld b, a
+	ld a, [$ffb6]
+	ld c, a
+	or b
+	jr nz, .Update
+
+	ld bc, 1
+
+.Update
+	ld a, b
+	ld [CurDamage], a
+	ld a, c
+	ld [CurDamage + 1], a
+
+.done
+	ret
+
+.WeatherTypeModifiers
+	db WEATHER_RAIN, WATER, 15
+	db WEATHER_RAIN, FIRE,  05
+	db WEATHER_SUN,  FIRE,  15
+	db WEATHER_SUN,  WATER, 05
+	db $ff
+
+.WeatherMoveModifiers
+	db WEATHER_RAIN, EFFECT_SOLARBEAM, 05
+	db $ff
+; fbe24
+
+
+DoBadgeTypeBoosts: ; fbe24
+	ld a, [InLinkBattle]
+	and a
+	ret nz
+
+	ld a, [$cfc0]
+	and a
+	ret nz
+
+	ld a, [hBattleTurn]
+	and a
+	ret nz
+
+	push de
+	push bc
+
+	ld hl, .BadgeTypes
+
+	ld a, [KantoBadges]
+	ld b, a
+	ld a, [JohtoBadges]
+	ld c, a
+
+.CheckBadge
+	ld a, [hl]
+	cp $ff
+	jr z, .done
+
+	srl b
+	rr c
+	jr nc, .NextBadge
+
+	ld a, [$d265] ; move type
+	cp [hl]
+	jr z, .ApplyBoost
+
+.NextBadge
+	inc hl
+	jr .CheckBadge
+
+.ApplyBoost
+	ld a, [CurDamage]
+	ld h, a
+	ld d, a
+	ld a, [CurDamage + 1]
+	ld l, a
+	ld e, a
+
+	srl d
+	rr e
+	srl d
+	rr e
+	srl d
+	rr e
+
+	ld a, e
+	or d
+	jr nz, .asm_fbe6f
+	ld e, 1
+
+.asm_fbe6f
+	add hl, de
+	jr nc, .Update
+
+	ld hl, $ffff
+
+.Update
+	ld a, h
+	ld [CurDamage], a
+	ld a, l
+	ld [$d257], a
+
+.done
+	pop bc
+	pop de
+	ret
+
+.BadgeTypes
+	db FLYING   ; zephyrbadge
+	db BUG      ; hivebadge
+	db NORMAL   ; plainbadge
+	db GHOST    ; fogbadge
+	db STEEL    ; mineralbadge
+	db FIGHTING ; stormbadge
+	db ICE      ; glacierbadge
+	db DRAGON   ; risingbadge
+
+	db ROCK     ; boulderbadge
+	db WATER    ; cascadebadge
+	db ELECTRIC ; thunderbadge
+	db GRASS    ; rainbowbadge
+	db POISON   ; soulbadge
+	db PSYCHIC  ; marshbadge
+	db FIRE     ; volcanobadge
+	db GROUND   ; earthbadge
+	db $ff
+; fbe91
+
+
 SECTION "bank3F",DATA,BANK[$3F]
 
 DoTileAnimation: ; fc000
@@ -13862,7 +14973,7 @@
 	dw $0000, DoneTileAnimation
 ; 0xfc0d7
 
-INCBIN "baserom.gbc",$fc0d7,$fc12f-$fc0d7
+INCBIN "baserom.gbc", $fc0d7, $fc12f-$fc0d7
 
 Tileset09Anim: ; 0xfc12f
 ;	   param, function
@@ -13892,7 +15003,7 @@
 	dw $0000, DoneTileAnimation
 ; 0xfc17f
 
-INCBIN "baserom.gbc",$fc17f,$fc1e7-$fc17f
+INCBIN "baserom.gbc", $fc17f, $fc1e7-$fc17f
 
 Tileset24Anim: ; 0xfc1e7
 Tileset30Anim: ; 0xfc1e7
@@ -13961,7 +15072,7 @@
 	dw $0000, DoneTileAnimation
 ; 0xfc2bf
 
-INCBIN "baserom.gbc",$fc2bf,$fc2e7-$fc2bf
+INCBIN "baserom.gbc", $fc2bf, $fc2e7-$fc2bf
 
 Tileset04Anim: ; 0xfc2e7
 Tileset05Anim: ; 0xfc2e7
@@ -14296,7 +15407,7 @@
 	ret
 ; 0xfcdd7
 
-INCBIN "baserom.gbc",$fcdd7,$fce58-$fcdd7
+INCBIN "baserom.gbc", $fcdd7, $fce58-$fcdd7
 
 Trades: ; 0xfce58
 ; byte 1: dialog
@@ -14310,49 +15421,408 @@
 ; byte 31 gender
 ; byte 32 XXX always zero?
 
-	db 0,ABRA,MACHOP,"MUSCLE@@@@@",$37,$66,GOLD_BERRY,$54,$92,"MIKE@@@@@@@",0,0
-	db 0,BELLSPROUT,ONIX,"ROCKY@@@@@@",$96,$66,BITTER_BERRY,$1e,$bf,"KYLE@@@@@@@",0,0
-	db 1,KRABBY,VOLTORB,"VOLTY@@@@@@",$98,$88,PRZCUREBERRY,$05,$72,"TIM@@@@@@@@",0,0
-	db 3,DRAGONAIR,DODRIO,"DORIS@@@@@@",$77,$66,SMOKE_BALL,$1b,$01,"EMY@@@@@@@@",2,0
-	db 2,HAUNTER,XATU,"PAUL@@@@@@@",$96,$86,MYSTERYBERRY,$00,$3d,"CHRIS@@@@@@",0,0
-	db 3,CHANSEY,AERODACTYL,"AEROY@@@@@@",$96,$66,GOLD_BERRY,$7b,$67,"KIM@@@@@@@@",0,0
-	db 0,DUGTRIO,MAGNETON,"MAGGIE@@@@@",$96,$66,METAL_COAT,$a2,$c3,"FOREST@@@@@",0,0
+	db 0,ABRA,MACHOP,"MUSCLE@@@@@", $37, $66,GOLD_BERRY, $54, $92,"MIKE@@@@@@@",0,0
+	db 0,BELLSPROUT,ONIX,"ROCKY@@@@@@", $96, $66,BITTER_BERRY, $1e, $bf,"KYLE@@@@@@@",0,0
+	db 1,KRABBY,VOLTORB,"VOLTY@@@@@@", $98, $88,PRZCUREBERRY, $05, $72,"TIM@@@@@@@@",0,0
+	db 3,DRAGONAIR,DODRIO,"DORIS@@@@@@", $77, $66,SMOKE_BALL, $1b, $01,"EMY@@@@@@@@",2,0
+	db 2,HAUNTER,XATU,"PAUL@@@@@@@", $96, $86,MYSTERYBERRY, $00, $3d,"CHRIS@@@@@@",0,0
+	db 3,CHANSEY,AERODACTYL,"AEROY@@@@@@", $96, $66,GOLD_BERRY, $7b, $67,"KIM@@@@@@@@",0,0
+	db 0,DUGTRIO,MAGNETON,"MAGGIE@@@@@", $96, $66,METAL_COAT, $a2, $c3,"FOREST@@@@@",0,0
 
-INCBIN "baserom.gbc",$fcf38,$fd1d2-$fcf38
+INCBIN "baserom.gbc", $fcf38, $fd1d2-$fcf38
 
 
 SECTION "bank40",DATA,BANK[$40]
 
-INCBIN "baserom.gbc",$100000,$10389d - $100000
+INCBIN "baserom.gbc", $100000, $10389d - $100000
 
 
 SECTION "bank41",DATA,BANK[$41]
 
-INCBIN "baserom.gbc",$104000,$104350 - $104000
+INCBIN "baserom.gbc", $104000, $104350 - $104000
 
 INCBIN "gfx/ow/misc.2bpp"
 
-INCBIN "baserom.gbc",$1045b0,$105258 - $1045b0
+INCBIN "baserom.gbc", $1045b0, $105258 - $1045b0
 
 MysteryGiftGFX:
 INCBIN "gfx/misc/mystery_gift.2bpp"
 
-INCBIN "baserom.gbc",$105688,$105930 - $105688
+INCBIN "baserom.gbc", $105688, $105930 - $105688
 
 ; 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
 
-INCBIN "baserom.gbc",$105ef7,$106078 - $105ef7
+INCBIN "baserom.gbc", $105ef7, $106078 - $105ef7
 
 HallOfFame1: ; 0x106078
 	ret
 
-INCBIN "baserom.gbc",$106079,$1060bb - $106079
+INCBIN "baserom.gbc", $106079, $1060bb - $106079
 
 Function1060bb: ; 1060bb
 ; commented out
@@ -14359,7 +15829,7 @@
 	ret
 ; 1060bc
 
-INCBIN "baserom.gbc",$1060bc,$106dbc - $1060bc
+INCBIN "baserom.gbc", $1060bc, $106dbc - $1060bc
 
 
 SECTION "bank42",DATA,BANK[$42]
@@ -14518,11 +15988,11 @@
 	call $6f06
 	
 ; Save WRAM bank
-	ld a, [$ff70]
+	ld a, [rSVBK]
 	push af
 ; WRAM bank 5
 	ld a, 5
-	ld [$ff70], a
+	ld [rSVBK], a
 	
 ; Update palette colors
 	ld hl, TitleScreenPalettes
@@ -14537,17 +16007,17 @@
 	
 ; Restore WRAM bank
 	pop af
-	ld [$ff70], a
+	ld [rSVBK], a
 	
 	
 ; LY/SCX trickery starts here
 	
 ; Save WRAM bank
-	ld a, [$ff70]
+	ld a, [rSVBK]
 	push af
 ; WRAM bank 5
 	ld a, 5
-	ld [$ff70], a
+	ld [rSVBK], a
 	
 ; Make alternating lines come in from opposite sides
 
@@ -14577,7 +16047,7 @@
 	
 ; Restore WRAM bank
 	pop af
-	ld [$ff70], a
+	ld [rSVBK], a
 	
 	
 ; Reset audio
@@ -14746,7 +16216,7 @@
 
 SECTION "bank44",DATA,BANK[$44]
 
-INCBIN "baserom.gbc",$110000,$110fad - $110000
+INCBIN "baserom.gbc", $110000, $110fad - $110000
 
 URIPrefix: ; 0x110fad
 	ascii "http://"
@@ -14759,11 +16229,11 @@
 HTTPRankingURL: ; 0x111020
 	ascii "gameboy.datacenter.ne.jp/cgb/ranking"
 
-INCBIN "baserom.gbc",$111044,$113f84 - $111044
+INCBIN "baserom.gbc", $111044, $113f84 - $111044
 
 SECTION "bank45",DATA,BANK[$45]
 
-INCBIN "baserom.gbc",$114000,$117a7f - $114000
+INCBIN "baserom.gbc", $114000, $117a7f - $114000
 
 ; everything from here to the end of the bank is related to the
 ; Mobile Stadium option from the continue/newgame menu.
@@ -14972,10 +16442,10 @@
 	ld [$cf63], a
 	ret
 .asm_117be7
-	ld a, [$ff70]
+	ld a, [rSVBK]
 	push af
 	ld a, $3
-	ld [$ff70], a
+	ld [rSVBK], a
 	ld a, [$cd89]
 	and $1
 	jr nz, .asm_117c16 ; 0x117bf3 $21
@@ -14999,20 +16469,20 @@
 	jr .asm_117c20 ; 0x117c14 $a
 .asm_117c16
 	pop af
-	ld [$ff70], a
+	ld [rSVBK], a
 	ld a, $d3
 	ld [$c300], a
 	jr .asm_117bd0 ; 0x117c1e $b0
 .asm_117c20
 	pop af
-	ld [$ff70], a
+	ld [rSVBK], a
 	ld a, $5c
 	ld hl, $6eb9
 	rst FarCall
-	ld a, [$ff70]
+	ld a, [rSVBK]
 	push af
 	ld a, $3
-	ld [$ff70], a
+	ld [rSVBK], a
 	ld a, $7
 	call GetSRAMBank
 	ld hl, $d002
@@ -15021,7 +16491,7 @@
 	call CopyBytes
 	call CloseSRAM
 	pop af
-	ld [$ff70], a
+	ld [rSVBK], a
 	jp Function117cdd
 
 Function117c4a:
@@ -15034,10 +16504,10 @@
 	rst FarCall
 	ld hl, MobileStadiumSuccessText
 	call $1057
-	ld a, [$ff70]
+	ld a, [rSVBK]
 	push af
 	ld a, $5
-	ld [$ff70], a
+	ld [rSVBK], a
 	ld hl, $d000
 	ld de, $0008
 	ld c, $8
@@ -15053,7 +16523,7 @@
 	jr nz, .asm_117c71 ; 0x117c7b $f4
 	call $04b6
 	pop af
-	ld [$ff70], a
+	ld [rSVBK], a
 	ld a, $80
 	ld [$cf63], a
 	ret
@@ -15089,10 +16559,10 @@
 	ret
 
 Data117cbc: ; 0x117cbc
-	db $40,$0c,$00,$11,$13,$00,$00,$00
+	db $40, $0c, $00, $11, $13, $00, $00, $00
 
 Data117cc4: ; 0x117cc4
-	db $40,$07,$0e,$0b,$13,$00,$00,$00 ; XXX what is this
+	db $40, $07, $0e, $0b, $13, $00, $00, $00 ; XXX what is this
 
 YesNo117ccc: ; 0x117ccc
 	db "はい", $4e ; Yes
@@ -15107,7 +16577,7 @@
 	db "@"
 
 Function117cdd: ; 0x117cdd
-	ld hl,$cf63
+	ld hl, $cf63
 	inc [hl]
 	ret
 
@@ -15114,7 +16584,7 @@
 
 SECTION "bank46",DATA,BANK[$46]
 
-INCBIN "baserom.gbc",$118000,$118ba5 - $118000
+INCBIN "baserom.gbc", $118000, $118ba5 - $118000
 
 ExchangeDownloadURL: ; 0x118ba5
 	ascii "http://gameboy.datacenter.ne.jp/cgb/download?name=/01/CGB-BXTJ/exchange/index.txt"
@@ -15141,11 +16611,11 @@
 
 db $0
 
-INCBIN "baserom.gbc",$118d35,$11bc9e - $118d35
+INCBIN "baserom.gbc", $118d35, $11bc9e - $118d35
 
 SECTION "bank47",DATA,BANK[$47]
 
-INCBIN "baserom.gbc",$11c000,$11f686 - $11c000
+INCBIN "baserom.gbc", $11c000, $11f686 - $11c000
 
 
 SECTION "bank48",DATA,BANK[$48]
@@ -15972,17 +17442,17 @@
 
 SECTION "bank5B",DATA,BANK[$5B]
 
-INCBIN "baserom.gbc",$16c000,$16d7fe - $16c000
+INCBIN "baserom.gbc", $16c000, $16d7fe - $16c000
 
 
 SECTION "bank5C",DATA,BANK[$5C]
 
-INCBIN "baserom.gbc",$170000,$17367f - $170000
+INCBIN "baserom.gbc", $170000, $17367f - $170000
 
 
 SECTION "bank5D",DATA,BANK[$5D]
 
-INCBIN "baserom.gbc",$174000,$177561 - $174000
+INCBIN "baserom.gbc", $174000, $177561 - $174000
 
 
 SECTION "bank5E",DATA,BANK[$5E]
@@ -16000,17 +17470,17 @@
 Music_BattleTowerLobby:  INCLUDE "audio/music/battletowerlobby.asm"
 Music_MobileCenter:      INCLUDE "audio/music/mobilecenter.asm"
 
-INCBIN "baserom.gbc",$17982d, $1799ef - $17982d
+INCBIN "baserom.gbc", $17982d, $1799ef - $17982d
 
 MobileAdapterGFX:
 INCBIN "gfx/misc/mobile_adapter.2bpp"
 
-INCBIN "baserom.gbc",$17a68f, $17b629 - $17a68f
+INCBIN "baserom.gbc", $17a68f, $17b629 - $17a68f
 
 
 SECTION "bank5F",DATA,BANK[$5F]
 
-INCBIN "baserom.gbc",$17c000,$17ff6c - $17c000
+INCBIN "baserom.gbc", $17c000, $17ff6c - $17c000
 
 
 SECTION "bank60",DATA,BANK[$60]
@@ -16026,6 +17496,12 @@
 INCLUDE "maps/HallOfFame.asm"
 
 
+;                       Pokedex entries I
+;                            001-064
+
+INCLUDE "stats/pokedex/entries_1.asm"
+
+
 SECTION "bank61",DATA,BANK[$61]
 
 ;                        Map Scripts XIV
@@ -16308,7 +17784,7 @@
 
 SECTION "bank6F",DATA,BANK[$6F]
 
-INCBIN "baserom.gbc",$1bc000,$1be08d - $1bc000
+INCBIN "baserom.gbc", $1bc000, $1be08d - $1bc000
 
 
 SECTION "bank70",DATA,BANK[$70]
@@ -16452,13 +17928,13 @@
 ; 1de2c5
 
 
-INCBIN "baserom.gbc",$1de2c5,$1de2e4 - $1de2c5
+INCBIN "baserom.gbc", $1de2c5, $1de2e4 - $1de2c5
 
 PokegearGFX: ; 1de2e4
 INCBIN "gfx/misc/pokegear.lz"
 ; 1de5c7
 
-INCBIN "baserom.gbc",$1de5c7,$1df238 - $1de5c7
+INCBIN "baserom.gbc", $1de5c7, $1df238 - $1de5c7
 
 
 SECTION "bank78",DATA,BANK[$78]
@@ -16488,26 +17964,26 @@
 
 SECTION "bank7B",DATA,BANK[$7B]
 
-INCBIN "baserom.gbc",$1ec000,$1ecf02 - $1ec000
+INCBIN "baserom.gbc", $1ec000, $1ecf02 - $1ec000
 
 
 SECTION "bank7C",DATA,BANK[$7C]
 
-INCBIN "baserom.gbc",$1f0000,$1f09d8 - $1f0000
+INCBIN "baserom.gbc", $1f0000, $1f09d8 - $1f0000
 
 
 SECTION "bank7D",DATA,BANK[$7D]
 
-INCBIN "baserom.gbc",$1f4000,$1f636a - $1f4000
+INCBIN "baserom.gbc", $1f4000, $1f636a - $1f4000
 
 
 SECTION "bank7E",DATA,BANK[$7E]
 
-INCBIN "baserom.gbc",$1f8000,$1fb8a8 - $1f8000
+INCBIN "baserom.gbc", $1f8000, $1fb8a8 - $1f8000
 
 
 SECTION "bank7F",DATA,BANK[$7F]
 
 SECTION "stadium2",DATA[$8000-$220],BANK[$7F]
-INCBIN "baserom.gbc",$1ffde0,$220
+INCBIN "baserom.gbc", $1ffde0, $220
 
--- /dev/null
+++ b/maps/BetaAlphRuinUnsolvedPuzzleRoom.blk
@@ -1,0 +1,1 @@
+

,+
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaAzaleaTown.blk
@@ -1,0 +1,10 @@
+aaaaaaaaFDaaaaaaaaaaaaaaaaaFDaaaaaaaaaaaaaaaaaFHIIaaaaaaBaaaFaaaaaaFaFaaaHJGFee>aacaaaFaaaadeefaaaaFGbaaaaaaaaFDaaaaaaaFaaDaU
+aaaaaaaHIY
+aaaaaaa~zU
+aaaaaaa5Y
+aaaaa@AAAA5z
+vvvUaaaaaaaaaaa552955zvvvvvvvvvv
+aa55551111111111111
+
+a555555555555555552
+a
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaBlackthornCity.blk
@@ -1,0 +1,1 @@
+hqqqqqqqqqqqqqqqqqqqhqorrrrrrrrrnqqqqqqqhqiaKeWaKeWahqqqqqqqhqieKaWWWaeWhqorrnqqhqiaWWKWeaWehqi !hqqhqiKWWeeaWWahqi$%hqqhqieKeaWWeeehqi$%hqqhqiaKaWeeWaahqi$%hqqlrmKeWWaWeWahqi()hqqKaWKaWaeWlrmtuhqqWWWWWWKaWWWWWWhqqhqqlrrG
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaBlank.blk
@@ -1,0 +1,1 @@
+
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaCave.blk
@@ -1,0 +1,8 @@
+








+
+
+
+
+
+
+	
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaCave2.blk
@@ -1,0 +1,5 @@
+



+(+
+)*
+
+						
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaCaveTestMap.blk
@@ -1,0 +1,18 @@
+	










		
+;<		;6<
+	
+	589:
+	
+	
+				
+	
+	5


+	
+


	
+	
+5

		
+	
+
	
+	
+		5
6		
+



																																																																		
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaCeladonMansion.blk
@@ -1,0 +1,1 @@
+?	+,/
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaCherrygroveCity.blk
@@ -1,0 +1,9 @@
+
+aaaaaaaa
+
+a6
+a6YEa6Y,-6YG./a52vUa551
+
+aaaaa5555
+
+aaaa
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaCianwoodCity.blk
@@ -1,0 +1,1 @@
+aaaaXaaTyaaX5ETy5Tv455aTvvyfaXYaaXYEaaeaaa
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaCinnabarIslandPokemonLabHallway.blk
@@ -1,0 +1,2 @@
+	
+
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaCinnabarIslandPokemonLabRoom1.blk
@@ -1,0 +1,2 @@
+	
+

\ No newline at end of file
--- /dev/null
+++ b/maps/BetaCinnabarIslandPokemonLabRoom2.blk
@@ -1,0 +1,1 @@
+
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaCinnabarIslandPokemonLabRoom3.blk
@@ -1,0 +1,1 @@
+
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaElevator.blk
@@ -1,0 +1,1 @@
+&$$$%$$$$$$$$$$$$$$$$$$
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaEmptyHouse.blk
@@ -1,0 +1,15 @@
+												
+					
+									
+		
+										
+		
+													
+												
+			
+											
+							
+			
+		%					
+			
+











\ No newline at end of file
--- /dev/null
+++ b/maps/BetaGoldenrodCity.blk
@@ -1,0 +1,10 @@
+
+
+
+FD
+
+JHU !Y$#Y"HEzv%&IIIIIIIIJII55)*		@-.EAAAAAAAAAAFIHIJEEvvU55YY@AEYDFYHFzU5
+
+B
@55
+
+F~D
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaHerosHouse.blk
@@ -1,0 +1,1 @@
+ !"
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaHouse.blk
@@ -1,0 +1,1 @@
+*+,*-.12/0/
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaHouse2.blk
@@ -1,0 +1,1 @@
+?',9..',9
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaIlexForest.blk
@@ -1,0 +1,1 @@
+hqqqqqihqqqqqilrrsm
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaLakeOfRage.blk
@@ -1,0 +1,1 @@
+\^af\a\^afG^f\\f>^fTU^abfd?fdTvyY>dG\fd\X55Ya^d?f^Tvy55Y<d`f\\Ty555Y`f]\?\aX555Y\\^?Tvvy555Y^<fTvy555555Y^bd\bf^X5555555Ydf\ffTy5555555Y\b\af\fX55555Ya^d<d\daX555Yfd\\G`f^^\<G^\<bad>>e\adfa
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaMahoganyTown.blk
@@ -1,0 +1,1 @@
+`N=`RZW,-G./WEZWWG?
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaNewBarkTown.blk
@@ -1,0 +1,1 @@
+^]?II~IDGaaHTvEX5@~~{XDGGXHIIIIIIIaXvvvvvvvvv1
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaOlivineCity.blk
@@ -1,0 +1,4 @@
+FDIJHIIIFDFZFDFDFFZFFZFFDFFZFAABFZFFDF|}FTvvvvvvvvvUDF|}FXYX55YDF|}FXYX55YHIIIJ|}FXYX556vvv
+
+JXYX5545552
+Xzvvvvy55255552vvvy555
555550555552995555~5555:5555
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaPewterMuseumOfScience1F.blk
@@ -1,0 +1,2 @@
+	
+ 
!&!&
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaPewterMuseumOfScience2F.blk
@@ -1,0 +1,1 @@
+012!
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaPokecenterMainHouse.blk
@@ -1,0 +1,1 @@
+	
'
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaPokecenterTradeStation.blk
@@ -1,0 +1,1 @@
+'
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaRocketHideout1.blk
@@ -1,0 +1,5 @@
+													
+:?










<?
)		
+			
+
?

)

==







>>
"!
89
*>
*






89

:?:?
)




;?;?
)
?
<?<?
)
?

)






?



+
)
*






,-.,//////////-
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaRocketHideout2.blk
@@ -1,0 +1,4 @@
+													
+













			
+
			
+

>:)






><)
>>






)89





>>







8:
::?



?<
<<?

*
?


)

 
 
*









),/////////////-
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaRocketHideout3.blk
@@ -1,0 +1,5 @@
+					+=1,////?
					
+===	:?5////4???
<?105//
)==		 
>>:)5//////>89<)			
+,/////->>>>				18899///=			
+5///->:?1	=
+><?
>?
?
,/////-,////-
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaRoute23EarlyVersion.blk
@@ -1,0 +1,7 @@
+
+ !
+
+ohi
+omhi!nm7:~nm'nm'nm'nm'nm'nm'nm'nm
+^
+noo 


!hihi
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaSproutTower1.blk
@@ -1,0 +1,3 @@
+																													
+						
+				
		
																			
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaSproutTower2.blk
@@ -1,0 +1,9 @@
+			
+	
+		


		
+					
+	

	
+									
+				
+							
+
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaSproutTower3.blk
@@ -1,0 +1,7 @@
+			
+												
+	


	
+							
+		
+				
+
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaSproutTower5.blk
@@ -1,0 +1,9 @@
+		
+		
+
		
+	
+	
+	
		
			
+		
+			
+		



								
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaSproutTower6.blk
@@ -1,0 +1,4 @@
+			
+				




								


						




+		
		
+			
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaSproutTower7.blk
@@ -1,0 +1,8 @@
+	
+
+					
+			
+				

					


+			


+							
+			
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaSproutTower8.blk
@@ -1,0 +1,5 @@
+		
+				

						
+			
+							
+		




								
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaSproutTower9.blk
@@ -1,0 +1,1 @@
+				
									
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaSproutTowerCutOut1.blk
@@ -1,0 +1,1 @@
+
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaSproutTowerCutOut2.blk
@@ -1,0 +1,1 @@
+
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaSproutTowerCutOut3.blk
@@ -1,0 +1,1 @@
+
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaSsAquaInsideCutOut.blk
@@ -1,0 +1,1 @@
+
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaTeakCity.blk
@@ -1,0 +1,1 @@
+?eeeeeeeeeeeb !bb$%b>$%`&;',-&'`$%`*"+#/*+aE$%dg,-b()#/tuWZWVWVWVWZ@AABGTU !FXY$%&'XYa$%*+VVZVVVVVVZaa()EatuIIJ~{@AAAAA		HII
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaUnknown.blk
@@ -1,0 +1,1 @@
+(
\ No newline at end of file
--- /dev/null
+++ b/maps/BetaVioletCity.blk
@@ -1,0 +1,7 @@
+??&;'TU&;'b?*"+XY*"+?=G^bXYTU]]]]]]]]]]]]]XYXYXYb`b !`GbD$%F`
+&;'
+bD()F`G*"+
+eeebDtuF`
+
+AEA
+bpk`bsm`=]E`G`G?e`b`?eeeeeeeeeef`b
\ No newline at end of file
--- a/maps/HallOfFame.asm
+++ b/maps/HallOfFame.asm
@@ -123,10 +123,6 @@
 ; 0x181695
 
 
-;                         Pokedex entries I
-;                             001-064
-
-INCLUDE "stats/pokedex/entries_1.asm"
 
 
 
--- a/maps/ManiasHouse.asm
+++ b/maps/ManiasHouse.asm
@@ -16,7 +16,7 @@
 	2writetext UnknownText_0x9d303
 	yesorno
 	iffalse UnknownScript_0x9d2b6
-	special $004b
+	special SPECIAL_GIVESHUCKLE
 	iffalse UnknownScript_0x9d2b0
 	2writetext UnknownText_0x9d3ed
 	keeptextopen
--- /dev/null
+++ b/pokecrystal.bat
@@ -1,0 +1,3 @@
+@set PATH=%PATH%;C:\Program Files (x86)\GnuWin32\bin\;C:\Python27\
+@make winclean && make win
+@pause
--- a/preprocessor.py
+++ b/preprocessor.py
@@ -18,6 +18,7 @@
     text_command_classes,
     movement_command_classes,
     music_classes,
+    effect_classes,
 )
 
 even_more_macros = [
@@ -34,6 +35,7 @@
 macros += [each[1] for each in text_command_classes]
 macros += movement_command_classes
 macros += music_classes
+macros += effect_classes
 
 # show lines before preprocessing in stdout
 show_original_lines = False
--- a/wram.asm
+++ b/wram.asm
@@ -476,13 +476,34 @@
 BattleMonSpclDef: ; c648
 	ds 2
 
-	ds 25
+BattleMonType1: ; c64a
+	ds 1
+BattleMonType2: ; c64b
+	ds 1
 
+	ds 23
+
 CurOTMon: ; c663
 	ds 1
 	
-	ds 4
+	ds 1
+
+TypeModifier: ; c665
+; >10: super-effective
+;  10: normal
+; <10: not very effective
+
+; bit 7: stab
+	ds 1
+
+CriticalHit: ; c666
+; nonzero for a critical hit
+	ds 1
 	
+AttackMissed: ; c667
+; nonzero for a miss
+	ds 1
+	
 PlayerSubStatus1: ; c668
 ; bit
 ; 7 attract
@@ -495,15 +516,23 @@
 ; 0 nightmare
 	ds 1
 PlayerSubStatus2: ; c669
-; unknown
+; bit
+; 7
+; 6
+; 5
+; 4
+; 3
+; 2
+; 1
+; 0 curled
 	ds 1
 PlayerSubStatus3: ; c66a
 ; bit
 ; 7 confusion
-; 6
-; 5
+; 6 flying
+; 5 underground
 ; 4 charged
-; 3 
+; 3 flinch
 ; 2
 ; 1 rollout
 ; 0 bide
@@ -511,22 +540,30 @@
 PlayerSubStatus4: ; c66b
 ; bit
 ; 7 leech seed
-; 6
+; 6 rage
 ; 5 recharge
 ; 4 substitute
 ; 3
+; 2 focus energy
+; 1
+; 0 bide: unleashed energy
+	ds 1
+PlayerSubStatus5: ; c66c
+; bit
+; 7
+; 6 destiny bond
+; 5 lock-on
+; 4
+; 3
 ; 2
 ; 1
 ; 0
 	ds 1
-PlayerSubStatus5: ; c66c
-; unknown
-	ds 1
 
 EnemySubStatus1: ; c66d
 ; see PlayerSubStatus1
 	ds 1
-EnemySubstatus2: ; c66e
+EnemySubStatus2: ; c66e
 ; see PlayerSubStatus2
 	ds 1
 EnemySubStatus3: ; c66f
@@ -539,28 +576,42 @@
 ; see PlayerSubStatus5
 	ds 1
 
-	ds 4
-
+PlayerRolloutCount: ; c672
+	ds 1
+PlayerConfuseCount: ; c673
+	ds 1
+	ds 1
+PlayerDisableCount: ; c675
+	ds 1
 PlayerEncoreCount: ; c676
 	ds 1
 PlayerPerishCount: ; c677
 	ds 1
+PlayerFuryCutterCount: ; c678
+	ds 1
+	ds 1
 
-	ds 5
-
-EnemyEncoreCount: ; c67e
+EnemyRolloutCount: ; c67a
 	ds 1
-EnemyPerishCount: ; c67f
+EnemyConfuseCount: ; c67b
 	ds 1
+	ds 1
+EnemyEncoreCount: ; c67d
+	ds 1
+EnemyPerishCount: ; c67e
+	ds 1
+	ds 1
+EnemyFuryCutterCount: ; c680
+	ds 1
 
+PlayerDamageTaken: ; c681
 	ds 2
-
-PlayerDamageTaken: ; c682
+EnemyDamageTaken: ; c683
 	ds 2
-EnemyDamageTaken: ; c684
-	ds 2
 
 	ds 4
+	
+	ds 1
 
 BattleScriptBuffer: ; c68a
 	ds 40
@@ -568,14 +619,46 @@
 BattleScriptBufferLoc: ; c6b2
 	ds 2
 
-	ds 25
+	ds 24
 
 PlayerStatLevels: ; c6cc
 ; 07 neutral
-	ds 8
+PlayerAtkLevel: ; c6cc
+	ds 1
+PlayerDefLevel: ; c6cd
+	ds 1
+PlayerSpdLevel: ; c6ce
+	ds 1
+PlayerSAtkLevel: ; c6cf
+	ds 1
+PlayerSDefLevel: ; c6d0
+	ds 1
+PlayerAccLevel: ; c6d1
+	ds 1
+PlayerEvaLevel: ; c6d2
+	ds 1
+; c6d3
+	ds 1
+PlayerStatLevelsEnd:
+
 EnemyStatLevels: ; c6d4
 ; 07 neutral
-	ds 8
+EnemyAtkLevel: ; c6d4
+	ds 1
+EnemyDefLevel: ; c6d5
+	ds 1
+EnemySpdLevel: ; c6d6
+	ds 1
+EnemySAtkLevel: ; c6d7
+	ds 1
+EnemySDefLevel: ; c6d8
+	ds 1
+EnemyAccLevel: ; c6d9
+	ds 1
+EnemyEvaLevel: ; c6da
+	ds 1
+; c6db
+	ds 1
 
 EnemyTurnsTaken: ; c6dc
 	ds 1
@@ -593,13 +676,22 @@
 ; how far through the prng stream
 	ds 1
 
-	ds 15
+	ds 3
 
-DisabledMove: ; c6f5
+CurEnemyMoveNum: ; c6e9
 	ds 1
 
-	ds 2
+	ds 10
 
+AlreadyDisobeyed: ; c6f4
+	ds 1
+
+DisabledMove: ; c6f5
+	ds 1
+EnemyEncoredMove: ; c6f6
+	ds 1
+	ds 1
+
 ; exists so you can't counter on switch
 LastEnemyCounterMove: ; c6f8
 	ds 1
@@ -606,15 +698,39 @@
 LastPlayerCounterMove: ; c6f9
 	ds 1
 
-	ds 8
+	ds 1
 
+AlreadyFailed: ; c6fb
+	ds 1
+
+	ds 3
+	
+PlayerScreens: ; c6ff
+; bit 4: reflect
+; bit 3: light screen
+	ds 1
+
+EnemyScreens: ; c700
+; bit 4: reflect
+; bit 3: light screen	
+	ds 1
+
+	ds 1
+
 PlayerLightScreenCount: ; c702
 	ds 1
 PlayerReflectCount: ; c703
 	ds 1
 
-	ds 6
+	ds 2
 
+EnemyLightScreenCount: ; c706
+	ds 1
+EnemyReflectCount: ; c707
+	ds 1
+
+	ds 2
+
 Weather: ; c70a
 ; 00 normal
 ; 01 rain
@@ -647,7 +763,7 @@
 SECTION "overworldmap",BSS[$c800]
 OverworldMap: ; c800
 	ds 1300
-OverworldMapEnd
+OverworldMapEnd:
 	
 	ds 12
 
@@ -813,8 +929,77 @@
 ; 0-5
 	ds 1
 
-	ds 55
+	ds 4
 
+TempMon:
+TempMonSpecies: ; d10e
+	ds 1
+TempMonItem: ; d10f
+	ds 1
+TempMonMoves: ; d110
+TempMonMove1: ; d110
+	ds 1
+TempMonMove2: ; d111
+	ds 1
+TempMonMove3: ; d112
+	ds 1
+TempMonMove4: ; d113
+	ds 1
+TempMonID: ; d114
+	ds 2
+TempMonExp: ; d116
+	ds 3
+TempMonHPExp: ; d119
+	ds 2
+TempMonAtkExp: ; d11b
+	ds 2
+TempMonDefExp: ; d11d
+	ds 2
+TempMonSpdExp: ; d11f
+	ds 2
+TempMonSpclExp: ; d121
+	ds 2
+TempMonDVs: ; d123
+; hp = %1000 for each dv
+	ds 1 ; atk/def
+	ds 1 ; spd/spc
+TempMonPP: ; d125
+	ds 4
+TempMonHappiness: ; d129
+	ds 1
+TempMonPokerusStatus: ; d12a
+	ds 1
+TempMonCaughtData: ; d12b
+TempMonCaughtTime: ; d12b
+TempMonCaughtLevel: ; d12b
+	ds 1
+TempMonCaughtGender: ; d12c
+TempMonCaughtLocation: ; d12c
+	ds 1
+TempMonLevel: ; d12d
+	ds 1
+TempMonStatus: ; d12e
+	ds 1
+; d12f
+	ds 1
+TempMonCurHP: ; d130
+	ds 2
+TempMonMaxHP: ; d132
+	ds 2
+TempMonAtk: ; d134
+	ds 2
+TempMonDef: ; d136
+	ds 2
+TempMonSpd: ; d138
+	ds 2
+TempMonSpclAtk: ; d13a
+	ds 2
+TempMonSpclDef: ; d13c
+	ds 2
+TempMonEnd: ; d13e
+
+	ds 3
+
 PartyMenuActionText ; d141
     ds 1
     
@@ -847,8 +1032,11 @@
 ; bank 3f
 	ds 2
 
-	ds 2
+EvolvableFlags: ; d1e8
+	ds 1
 
+	ds 1
+
 Buffer1:
 MagikarpLength: ; d1ea
 	ds 1
@@ -928,6 +1116,12 @@
 EnemyMonSpclDef: ; d222
 	ds 2
 
+EnemyMonType1: ; d224
+	ds 1
+EnemyMonType2: ; d225
+	ds 1
+
+
 SECTION "Battle",BSS[$d22d]
 
 IsInBattle: ; d22d
@@ -974,6 +1168,9 @@
 CurBaseStats: ; d236
 	ds 32
 
+CurDamage: ; d256
+	ds 2
+
 SECTION "TimeOfDay",BSS[$d269]
 
 TimeOfDay: ; d269
@@ -994,7 +1191,7 @@
 	     ; or the routine will keep going
 
 OTPartyMon1:
-OTPartyMon1Species2: ; d288
+OTPartyMon1Species: ; d288
 	ds 1
 OTPartyMon1Item: ; d289
 	ds 1
@@ -1131,6 +1328,7 @@
 	ds 2
 PlayerName: ; d47d
 	ds 11
+PlayerNameEnd: ; d478
 
 	ds 46
 	
@@ -1322,9 +1520,8 @@
 	ds 1 ; number of Pokémon in party
 PartySpecies: ; dcd8
 	ds 6 ; species of each Pokémon in party
-; dcde
-	ds 1 ; any empty slots including the 7th must be FF
-	     ; or the routine will keep going
+PartyEnd: ; dcde
+	ds 1 ; legacy functions don't check PartyCount
 		 
 PartyMons:
 PartyMon1:
@@ -1371,7 +1568,7 @@
 	ds 1
 PartyMon1CaughtData: ; dcfc
 PartyMon1CaughtTime: ; dcfc
-PartyMon1CaughtLevel ; dcfc
+PartyMon1CaughtLevel: ; dcfc
 	ds 1
 PartyMon1CaughtGender: ; dcfd
 PartyMon1CaughtLocation: ; dcfd
@@ -1482,7 +1679,7 @@
 BreedMon2OT: ; df3a
 	ds 11
 BreedMon2Stats:
-BreedMon1Species: ; df45
+BreedMon2Species: ; df45
 	ds 1
 	ds 31
 
--