diff --git a/.gitignore b/.gitignore index c9260280d..094c03a17 100644 --- a/.gitignore +++ b/.gitignore @@ -26,8 +26,10 @@ extras/*.json # 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 diff --git a/INSTALL.md b/INSTALL.md index da91a08fb..7060b5e20 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -1,4 +1,21 @@ -# 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 @@ cd pokecrystal # install python requirements pip install -r requirements.txt +``` +To compile the ROM from ASM source: +``` 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 -``` - -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 -``` - -If that fails (it shouldn't), you can download binaries like so: - -```bash -# download rgbds binaries -wget http://diyhpl.us/~bryan/irc/pokered/rgbds/rgbds.zip --output-document=rgbds.zip - -# unzip -unzip rgbds.zip - -# make rgbds accessible for all time -export PATH=$PATH:`pwd`/rgbds -echo "export PATH=$PATH:`pwd`/rgbds" >> ~/.bashrc - -# clean up that zip file -rm rgbds.zip -``` - -The next step is to install `unittest2`, unless you installed python2.7 -earlier: - -```bash -cd ~ -wget http://peak.telecommunity.com/dist/ez_setup.py -python ez_setup.py -easy_install unittest2 -``` - -Now you should be able to build `pokecrystal` for the first time: - -```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! +`cmp baserom.gbc pokecrystal.gbc` as the last line, the build was successful! Rejoice! -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: +## Windows -```bash -make clean && make -``` +Set up [GitHub for Windows](http://windows.github.com/) and clone this 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://mibbit.com/) or something. +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)). -# Contributing changes +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` -## Setting up a public git repo +Install [make](http://gnuwin32.sourceforge.net/downlinks/make.php) for Windows. + +To compile the ROM from ASM source, run `pokecrystal.bat`. + +That will take between 3 and 15 seconds, depending on your computer. If you see +`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. + + +# Contributions are welcome! -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). diff --git a/Makefile b/Makefile index 3d917f941..ce6258cc8 100644 --- 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 @@ TEXTFILES = text/sweethoney.tx \ 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 @@ HORIZGFX = $(filter-out gfx/%.png, $(VERTGFX)) # 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.o: pokecrystal.asm constants.asm wram.asm ${TEXTFILES} 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 @@ front.png: tiles.png 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 $@ diff --git a/README.md b/README.md index aed427f86..f8b59dddd 100644 --- a/README.md +++ b/README.md @@ -4,65 +4,29 @@ This is a hand-crafted disassembly of Pokémon Crystal. 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)! diff --git a/battle/effect_command_pointers.asm b/battle/effect_command_pointers.asm new file mode 100644 index 000000000..a8f382693 --- /dev/null +++ b/battle/effect_command_pointers.asm @@ -0,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 diff --git a/battle/effect_commands.asm b/battle/effect_commands.asm new file mode 100644 index 000000000..c6b0c1c7a --- /dev/null +++ b/battle/effect_commands.asm @@ -0,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 + + + diff --git a/battle/moves/move_effects.asm b/battle/moves/move_effects.asm new file mode 100644 index 000000000..a17a9a7d5 --- /dev/null +++ b/battle/moves/move_effects.asm @@ -0,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 + + + + diff --git a/battle/moves/move_effects_pointers.asm b/battle/moves/move_effects_pointers.asm new file mode 100644 index 000000000..4f955444a --- /dev/null +++ b/battle/moves/move_effects_pointers.asm @@ -0,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 + diff --git a/battle/moves/moves.asm b/battle/moves/moves.asm index c2b72d2c9..ee30cd1e7 100644 --- 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 + +Move1: + 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 diff --git a/constants.asm b/constants.asm index 03df937c1..b764c8585 100644 --- a/constants.asm +++ b/constants.asm @@ -2337,6 +2337,7 @@ EVOLVE_HAPPINESS EQU 4 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 @@ NOTE_16 EQU $0f ; 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 @@ -3442,6 +3446,221 @@ 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 BUTTONS EQU %00010000 D_PAD EQU %00100000 diff --git a/extras/chars.py b/extras/chars.py index 28f37cb84..159a479a7 100644 --- a/extras/chars.py +++ b/extras/chars.py @@ -98,6 +98,7 @@ chars = { 0xE9: "&", 0xEA: "é", 0xEB: "→", + 0xED: "▶", 0xEF: "♂", 0xF0: "¥", 0xF1: "×", diff --git a/extras/crystal.py b/extras/crystal.py index d620d3fdd..790125222 100644 --- a/extras/crystal.py +++ b/extras/crystal.py @@ -2917,7 +2917,7 @@ music_command_enders = [0xEA, 0xEB, 0xEE, 0xFC, 0xFF,] # 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} @@ -2943,6 +2943,221 @@ def create_music_command_classes(debug=False): 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 this is dumped into script_macros.asm""" diff --git a/hram.asm b/hram.asm index fd9ed2134..bfab6e295 100644 --- a/hram.asm +++ b/hram.asm @@ -26,6 +26,16 @@ hJoyDown EQU $ffa8 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 diff --git a/main.asm b/main.asm index 52f7109a7..a2c1f9460 100644 --- a/main.asm +++ b/main.asm @@ -56,14 +56,14 @@ Start: SECTION "start",HOME[$150] -INCBIN "baserom.gbc",$150,$283 - $150 +INCBIN "baserom.gbc", $150, $283 - $150 VBlank: ; 283 INCLUDE "vblank.asm" -DelayFrame: ; 0x45a +DelayFrame: ; 45a ; Wait for one frame ld a, 1 ld [VBlankOccurred], a @@ -75,25 +75,26 @@ DelayFrame: ; 0x45a 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,7 +107,9 @@ RTC: ; 46f ret ; 485 -INCBIN "baserom.gbc",$485,$52f - $485 + +INCBIN "baserom.gbc", $485, $52f - $485 + IncGradGBPalTable_01: ; 52f db %11111111 ; bgp @@ -142,7 +145,9 @@ IncGradGBPalTable_01: ; 52f db %00000000 ; 547 -INCBIN "baserom.gbc",$547,$568 - $547 + +INCBIN "baserom.gbc", $547, $568 - $547 + DisableLCD: ; 568 ; Turn the LCD off @@ -186,6 +191,7 @@ DisableLCD: ; 568 ret ; 58a + EnableLCD: ; 58a ld a, [rLCDC] set 7, a ; lcd enable @@ -193,10 +199,12 @@ EnableLCD: ; 58a 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 @@ LatchClock: ; 59c ret ; 5a7 + UpdateTime: ; 5a7 ; get rtc data call GetClock @@ -218,6 +227,7 @@ UpdateTime: ; 5a7 ret ; 5b7 + GetClock: ; 5b7 ; store clock data in hRTCDayHi-hRTCSeconds @@ -374,7 +384,7 @@ FixTime: ; 61d 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 @@ SetClock: ; 691 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,121 +821,62 @@ UpdatePalsIfCGB: ; c2f ld a, [hCGB] and a ret z - + + UpdateCGBPals: ; c33 ; return carry if successful ; any pals to update? 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 @@ DmgToCgbBGPals: ; c9f ; 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 @@ DmgToCgbBGPals: ; c9f ; 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,51 +931,50 @@ DmgToCgbObjPals: ; ccb ; 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 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,70 +1028,125 @@ CopyPals: ; d50 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 ; 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 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 @@ -1185,9 +1189,10 @@ TextBoxBorder: ; ff1 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 @@ NPlaceChar: ; 0x101e 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 @@ NextChar: ; 1083 inc de jp PlaceNextChar -CheckDict: +CheckDict: ; 1087 cp $15 jp z, $117b cp $4f @@ -1329,7 +1385,9 @@ CheckDict: jp NextChar ; 0x117b -INCBIN "baserom.gbc",$117b,$1203 - $117b + +INCBIN "baserom.gbc", $117b, $1203 - $117b + Char5D: ld a, [hBattleTurn] @@ -1400,14 +1458,14 @@ Char5DText: ; 0x1276 Char5BText: ; 0x127e db "PC@" -INCBIN "baserom.gbc",$1281,$1293 - $1281 +INCBIN "baserom.gbc", $1281, $1293 - $1281 Char56Text: ; 0x1293 db "…@" 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 @@ Char5F: ; 0x1356 pop hl ret -INCBIN "baserom.gbc",$135a,$15d8 - $135a +INCBIN "baserom.gbc", $135a, $15d8 - $135a DMATransfer: ; 15d8 ; DMA transfer @@ -2025,7 +2083,7 @@ SafeTileAnimation: ; 17d3 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 @@ GetTileType: ; 185d 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 @@ AskSerial: ; 2063 ret ; 208a -INCBIN "baserom.gbc",$208a,$209e - $208a +INCBIN "baserom.gbc", $208a, $209e - $208a GameTimer: ; 209e ; precautionary @@ -2220,7 +2278,7 @@ UpdateGameTimer: ; 20ad 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 @@ PushScriptPointer: ; 261f 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 @@ ObjectEventText: 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 @@ GetAnyMapHeaderMember: ; 0x2c0c 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 @@ GetSecondaryMapHeaderPointer: ; 0x2c7d 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 @@ GetWorldMapLocation: ; 0x2caf ret ; 0x2cbd -INCBIN "baserom.gbc",$2cbd,$2d63-$2cbd +INCBIN "baserom.gbc", $2cbd, $2d63-$2cbd FarJpHl: ; 2d63 ; Jump to a:hl. @@ -2500,7 +2558,7 @@ Predef: ; 2d83 ret ; 2dba -INCBIN "baserom.gbc",$2dba,$2e6f-$2dba +INCBIN "baserom.gbc", $2dba, $2e6f-$2dba BitTable1Func: ; 0x2e6f ld hl, $da72 @@ -2692,7 +2750,7 @@ JpHl: ; 2fec jp [hl] ; 2fed -INCBIN "baserom.gbc",$2fed,$300b-$2fed +INCBIN "baserom.gbc", $2fed, $300b-$2fed ClearSprites: ; 300b ld hl, Sprites @@ -2813,7 +2871,7 @@ GetFarHalfword: ; 0x305d ret ; 0x306b -INCBIN "baserom.gbc",$306b,$30d6-$306b +INCBIN "baserom.gbc", $306b, $30d6-$306b CopyName1: ; 30d6 ld hl, StringBuffer2 @@ -2836,7 +2894,7 @@ IsInArray: ; 30e1 ld c,a .loop\@ ld a,[hl] - cp a,$FF + cp a, $FF jr z,.NotInArray\@ cp c jr z,.InArray\@ @@ -2874,33 +2932,48 @@ AddNTimes: ; 0x30fe 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 @@ -3004,7 +3077,7 @@ CopyDataUntil: ; 318c 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 @@ StringCmp: ; 31db ret ; 0x31e4 -INCBIN "baserom.gbc",$31e4,$31f3 - $31e4 +INCBIN "baserom.gbc", $31e4, $31f3 - $31e4 WhiteBGMap: ; 31f3 call ClearPalettes @@ -3033,7 +3106,7 @@ WaitBGMap: ; 31f6 ret ; 3200 -INCBIN "baserom.gbc",$3200,$3317 - $3200 +INCBIN "baserom.gbc", $3200, $3317 - $3200 ClearPalettes: ; 3317 ; Make all palettes white @@ -3052,11 +3125,11 @@ ClearPalettes: ; 3317 .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 @@ ClearPalettes: ; 3317 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 @@ GetSGBLayout: ; 3340 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 @@ CountSetBits: ; 0x335f ret ; 0x3376 -INCBIN "baserom.gbc",$3376,$33ab - $3376 +INCBIN "baserom.gbc", $3376, $33ab - $3376 NamesPointerTable: ; 33ab dbw BANK(PokemonNames), PokemonNames @@ -3181,7 +3254,7 @@ GetName: ; 33c3 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,7 +3273,9 @@ GetNthString: ; 3411 ret ; 0x3420 -INCBIN "baserom.gbc",$3420,$3468 - $3420 + +INCBIN "baserom.gbc", $3420, $3468 - $3420 + GetItemName: ; 3468 push hl @@ -3220,9 +3295,30 @@ GetItemName: ; 3468 pop bc pop hl ret -; 0x3487 +; 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 -INCBIN "baserom.gbc",$3487,$3856 - $3487 GetBaseStats: ; 3856 push bc @@ -3286,7 +3382,7 @@ GetBaseStats: ; 3856 ret ; 389c -INCBIN "baserom.gbc",$389c,$38a2 - $389c +INCBIN "baserom.gbc", $389c, $38a2 - $389c GetNick: ; 38a2 ; get the nickname of a partymon @@ -3407,15 +3503,38 @@ GetPartyParamLocation: ; 3917 ; 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 @@ -3429,7 +3548,216 @@ SetEnemyTurn: ; 3989 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 @@ -3476,7 +3804,7 @@ StartMusic: ; 3b97 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 @@ StartSFX: ; 3c23 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 @@ WaitSFX: ; 3c55 ret ; 3c74 -INCBIN "baserom.gbc",$3c74,$3c97-$3c74 +INCBIN "baserom.gbc", $3c74, $3c97-$3c74 MaxVolume: ; 3c97 ld a, $77 ; max @@ -3626,7 +3954,7 @@ VolumeOff: ; 3ca3 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 @@ CheckSFX: ; 3dde 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 @@ SFXChannelsOff: ; 3e21 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,14 +4017,14 @@ IntroFadePalettes: ; 0x617c db %11100100 ; 6182 -INCBIN "baserom.gbc",$6182,$6274 - $6182 +INCBIN "baserom.gbc", $6182, $6274 - $6182 FarStartTitleScreen: ; 6274 callba StartTitleScreen ret ; 627b -INCBIN "baserom.gbc",$627b,$62bc - $627b +INCBIN "baserom.gbc", $627b, $62bc - $627b TitleScreenEntrance: ; 62bc @@ -3748,7 +4076,7 @@ TitleScreenEntrance: ; 62bc ret ; 62f6 -INCBIN "baserom.gbc",$62f6,$669f - $62f6 +INCBIN "baserom.gbc", $62f6, $669f - $62f6 CheckNickErrors: ; 669f ; error-check monster nick before use @@ -3828,7 +4156,207 @@ CheckNickErrors: ; 669f 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: @@ -3856,12 +4384,93 @@ DrawGraphic: ; 6eef 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 @@ PredefPointers: ; 856b 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 @@ CheckShininess: ; 0x8a68 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 @@ DrawDefaultTiles: ; 0x9a64 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 @@ DarkPal: ; 0xb3d9 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 @@ ScriptReturnCarry: ; c3e2 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 @@ SpecialCheckPokerus: ; c419 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 @@ SpecialSnorlaxAwake: ; 0xc43d 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 @@ SpecialGameboyCheck: ; c478 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 @@ SpecialTrainerHouse: ; 0xc4b9 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 @@ PrintNumber_AdvancePointer: ; c64a 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 @@ CheckPartyMove: ; c742 ret ; c779 -INCBIN "baserom.gbc",$c779,$c986 - $c779 +INCBIN "baserom.gbc", $c779, $c986 - $c779 UsedSurfScript: ; c986 ; print "[MON] used SURF!" @@ -4650,17 +5259,17 @@ AskSurfText: ; ca36 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 @@ TechnicalMachines: ; 0x1167a 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 @@ BoxNameInputUpper: 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 @@ OpenPartyMenu: ; $12976 ret ; 0x129d5 -INCBIN "baserom.gbc",$129d5,$12a88 - $129d5 +INCBIN "baserom.gbc", $129d5, $12a88 - $129d5 PokemonActionSubmenu ; 0x12a88 ld hl, $c5cd ; coord @@ -4855,7 +5464,7 @@ PokemonSubmenuActionPointerTable: ; 0x12ab0 ; no terminator? ; 0x12aec -INCBIN "baserom.gbc",$12aec,$12e00 - $12aec +INCBIN "baserom.gbc", $12aec, $12e00 - $12aec OpenPartyStats: ; 12e00 call $1d6e @@ -4871,7 +5480,7 @@ OpenPartyStats: ; 12e00 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 @@ root set root+1 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 @@ TimeOfDayTable: ; 14044 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 @@ BlackoutPoints: ; 0x152ab 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 @@ INCLUDE "stats/egg_moves.asm" 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 @@ TrainerClassDVs ; 270d6 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 @@ SpecialRoamMons: ; 2a2a0 ret ; 2a2ce -INCBIN "baserom.gbc",$2a2ce,$2a5e9 - $2a2ce +INCBIN "baserom.gbc", $2a2ce, $2a5e9 - $2a2ce WildMons1: ; 0x2a5e9 @@ -5471,7 +6088,7 @@ INCBIN "gfx/misc/dude.lz" 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 @@ TrainerClassNames: ; 2c1ef 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 @@ INCBIN "baserom.gbc",$2C41a,$2ee8f - $2C41a pop hl ret -INCBIN "baserom.gbc",$2ef18,$2ef9f - $2ef18 +INCBIN "baserom.gbc", $2ef18, $2ef9f - $2ef18 SECTION "bankC",DATA,BANK[$C] @@ -5717,23 +6334,17 @@ Tileset30GFX: ; 0x326b0 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 - -TypeMatchup: ; 34bb1 -INCLUDE "battle/type_matchup.asm" -; 34cfd - -INCBIN "baserom.gbc",$34cfd,$37ee2 - $34cfd +INCLUDE "battle/effect_commands.asm" 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,7 +6354,91 @@ INCLUDE "trainers/trainers.asm" 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 @@ KantoGymLeaders: 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 @@ BattleStartMessage: 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 @@ INCLUDE "stats/pokedex/order_alpha.asm" 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 @@ INCLUDE "stats/evos_attacks.asm" 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/2.2bpp" 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 @@ StudiumMenu: ; 0x49d9e 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 @@ UpdateOTPointer: ; 0x4a83a ret ; 0x4a843 -INCBIN "baserom.gbc",$4a843,$4ae78 - $4a843 +INCBIN "baserom.gbc", $4a843, $4ae78 - $4a843 SECTION "bank13",DATA,BANK[$13] @@ -7133,7 +7835,7 @@ Tileset20PalMap: ; 0x4caf5 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 @@ CheckPokerus: ; 4d860 ret ; 4d87a -INCBIN "baserom.gbc",$4d87a,$4dc8a - $4d87a +INCBIN "baserom.gbc", $4d87a, $4dc8a - $4d87a StatsScreenInit: ; 4dc8a ld hl, StatsScreenMain @@ -7591,7 +8293,7 @@ StatsScreenMain: ; 0x4dcd2 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 @@ StatsScreenPointerTable: ; 4dd2a ; 4dd3a -INCBIN "baserom.gbc",$4dd3a,$4dda1 - $4dd3a +INCBIN "baserom.gbc", $4dd3a, $4dda1 - $4dd3a EggStatsInit: ; 4dda1 call EggStatsScreen @@ -7615,7 +8317,7 @@ EggStatsInit: ; 4dda1 ret ; 0x4ddac -INCBIN "baserom.gbc",$4ddac,$4e21e - $4ddac +INCBIN "baserom.gbc", $4ddac, $4e21e - $4ddac IDNoString: ; 4e21e db $73, "№.@" @@ -7624,7 +8326,7 @@ OTString: ; 4e222 db "OT/@" ; 4e226 -INCBIN "baserom.gbc",$4e226,$4e33a - $4e226 +INCBIN "baserom.gbc", $4e226, $4e33a - $4e226 EggStatsScreen: ; 4e33a xor a @@ -7701,18 +8403,18 @@ EggALotMoreTimeString: ; 0x4e46e ; 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 @@ WritePartyMenuTilemap: ; 0x5005f ret ; 0x50089 -INCBIN "baserom.gbc",$50089,$50457-$50089 +INCBIN "baserom.gbc", $50089, $50457-$50089 PartyMenuSelect: ; 0x50457 ; sets carry if exitted menu. @@ -7844,11 +8546,93 @@ ToWhichPKMNString: ; 0x50549 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@" @@ -7888,6 +8672,8 @@ Dragon: db "DRAGON@" Dark: db "DARK@" +; 50a28 + INCBIN "baserom.gbc", $50a28, $50bdd - $50a28 @@ -8018,7 +8804,7 @@ INCLUDE "stats/base_stats.asm" 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 @@ INCLUDE "maps/Route12SuperRodHouse.asm" 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 @@ INCLUDE "bittable2.asm" ; 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 @@ BattleText_0x80cd1: ; 0x80cd1 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 @@ BattleText_0x80dab: ; 0x80dab 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 @@ BattleText_0x80df5: ; 0x80df5 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 @@ BattleText_0x80e99: ; 0x80e99 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 @@ BattleText_0x80f02: ; 0x80f02 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 @@ BattleText_0x80fba: ; 0x80fba 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 @@ BattleText_0x81143: ; 0x81143 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 @@ BattleText_0x8117f: ; 0x8117f 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 @@ BattleText_0x81272: ; 0x81272 db "rise anymore!", $58 ; 0x8128f -BattleText_0x8128f: ; 0x8128f +WontDropAnymoreText: ; 0x8128f db $0, $59, "'s", $4f db "@" text_from_ram $d086 @@ -9080,81 +9866,81 @@ BattleText_0x8128f: ; 0x8128f 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 @@ BattleText_0x813e6: ; 0x813e6 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 @@ BattleText_0x8141d: ; 0x8141d 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 @@ BattleText_0x81452: ; 0x81452 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 @@ BattleText_0x81499: ; 0x81499 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 @@ BattleText_0x815a9: ; 0x815a9 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,144 +10071,144 @@ BattleText_0x815da: ; 0x815da 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 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 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 @@ BattleText_0x8188e: ; 0x8188e 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 @@ INCBIN "baserom.gbc", $86455, $88000 - $86455 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 @@ GetPlayerIcon: ; 8832c 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 @@ ClearScreenArea: ; 0x896ff ret ; 0x8971f -INCBIN "baserom.gbc",$8971f,$8addb - $8971f +INCBIN "baserom.gbc", $8971f, $8addb - $8971f SpecialHoOhChamber: ; 0x8addb ld hl, PartySpecies @@ -9803,7 +10589,7 @@ SpecialHoOhChamber: ; 0x8addb 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 @@ SpecialDratini: ; 0x8b170 ; 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 @@ GetNthPartyMon: ; 0x8b1ce 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 @@ UpdateTimePals: ; 8c070 ret ; 8c079 -INCBIN "baserom.gbc",$8c079,$8c117 - $8c079 +INCBIN "baserom.gbc", $8c079, $8c117 - $8c079 GetTimePalette: ; 8c117 ; get time of day @@ -10100,7 +10886,7 @@ DmgToCgbTimePals: ; 8c14e ret ; 8c15e -INCBIN "baserom.gbc",$8c15e,$8c17c - $8c15e +INCBIN "baserom.gbc", $8c15e, $8c17c - $8c15e GetTimePalFade: ; 8c17c ; check cgb @@ -10295,7 +11081,7 @@ GetTimePalFade: ; 8c17c 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 @@ GetSpeciesIcon: ; 8e9ac ret ; 8e9bc -INCBIN "baserom.gbc",$8e9bc,$8e9de - $8e9bc +INCBIN "baserom.gbc", $8e9bc, $8e9de - $8e9bc GetIconGFX: ; 8e9de call GetIcon_a @@ -10379,7 +11165,7 @@ GetGFXUnlessMobile: ; 8ea3f jp $dc9 ; 8ea4a -INCBIN "baserom.gbc",$8ea4a,$8eab3 - $8ea4a +INCBIN "baserom.gbc", $8ea4a, $8eab3 - $8ea4a ReadMonMenuIcon: ; 8eab3 cp EGG @@ -10733,7 +11519,7 @@ BigmonIcon: INCBIN "gfx/icon/bigmon.2bpp" ; 0x8fe8d 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/map_headers.asm" 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 @@ INCLUDE "maps/BattleTowerOutside.asm" 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 @@ Route28_BlockData: ; 0xa8492 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 @@ ElmsHouse_BlockData: ; 0xa8930 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 @@ Route24_BlockData: ; 0xa95ff 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,19 +12242,33 @@ PewterCity_BlockData: ; 0xa98cf 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" @@ -11486,7 +12298,9 @@ Route38_BlockData: ; 0xaa759 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,7 +12310,13 @@ SafariZoneFuchsiaGateBeta_BlockData: ; 0xaa877 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" @@ -11510,7 +12330,9 @@ Route8_BlockData: ; 0xaab5b 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 @@ Route21_BlockData: ; 0xaaedf 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,13 +12386,21 @@ Route38EcruteakGate_BlockData: ; 0xab6af 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" @@ -11599,7 +12433,9 @@ Route14_BlockData: ; 0xac000 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,19 +12445,41 @@ Route10North_BlockData: ; 0xac126 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" @@ -11667,7 +12525,9 @@ CeladonMansionRoof_BlockData: ; 0xac4b4 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 @@ EcruteakLugiaSpeechHouse_BlockData: ; 0xac54f 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 @@ Route6UndergroundEntrance_BlockData: ; 0xac9f1 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 @@ RuinsofAlphOutside_BlockData: ; 0xaca8b 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 @@ SproutTower1F_BlockData: ; 0xacbf3 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 @@ UndergroundWarehouse_BlockData: ; 0xadf1c 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 @@ BurnedTowerB1F_BlockData: ; 0xae36d 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,7 +12861,21 @@ SilverCaveRoom3_BlockData: ; 0xaf399 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" @@ -12003,7 +12893,9 @@ TeamRocketBaseB3F_BlockData: ; 0xaf9a3 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 @@ OlivineGym_BlockData: ; 0xafc7b 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 @@ OlivineLighthouse6F_BlockData: ; 0xaff00 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 @@ FastShipB1F_BlockData: ; 0xb0680 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 @@ CeladonGym_BlockData: ; 0xb0cb5 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 @@ BattleTowerOutside_BlockData: ; 0xb1a6e 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 @@ INCBIN "tilesets/16_collision.bin" 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 @@ GetTreeMonEncounterTable: ; b823f 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 @@ WildRockMonTable: ; b83de 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 @@ PokeCenterNurseScript: ; bc09c end ; bc162 -INCBIN "baserom.gbc",$bc162,$bcea5-$bc162 +INCBIN "baserom.gbc", $bc162, $bcea5-$bc162 UnusedPhoneScript: ; 0xbcea5 3writetext BANK(UnusedPhoneText), UnusedPhoneText @@ -12982,13 +13886,13 @@ UnknownScript_0xbcee7: ; 0xbcee7 .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 @@ ElmPhoneScript2: ; 0xbd081 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 @@ INCBIN "tilesets/36_collision.bin" 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 @@ Music_BugCatchingContest: INCLUDE "audio/music/bugcatchingcontest.asm" 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,7 +14659,214 @@ INCBIN "baserom.gbc", $f8ea3, $fbbfc - $f8ea3 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] @@ -13862,7 +14973,7 @@ Tileset01Anim: ; 0xfc0a3 dw $0000, DoneTileAnimation ; 0xfc0d7 -INCBIN "baserom.gbc",$fc0d7,$fc12f-$fc0d7 +INCBIN "baserom.gbc", $fc0d7, $fc12f-$fc0d7 Tileset09Anim: ; 0xfc12f ; param, function @@ -13892,7 +15003,7 @@ Tileset15Anim: ; 0xfc15f dw $0000, DoneTileAnimation ; 0xfc17f -INCBIN "baserom.gbc",$fc17f,$fc1e7-$fc17f +INCBIN "baserom.gbc", $fc17f, $fc1e7-$fc17f Tileset24Anim: ; 0xfc1e7 Tileset30Anim: ; 0xfc1e7 @@ -13961,7 +15072,7 @@ Tileset23Anim: ; 0xfc27f dw $0000, DoneTileAnimation ; 0xfc2bf -INCBIN "baserom.gbc",$fc2bf,$fc2e7-$fc2bf +INCBIN "baserom.gbc", $fc2bf, $fc2e7-$fc2bf Tileset04Anim: ; 0xfc2e7 Tileset05Anim: ; 0xfc2e7 @@ -14296,7 +15407,7 @@ LoadTradesPointer: ; 0xfcdc2 ret ; 0xfcdd7 -INCBIN "baserom.gbc",$fcdd7,$fce58-$fcdd7 +INCBIN "baserom.gbc", $fcdd7, $fce58-$fcdd7 Trades: ; 0xfce58 ; byte 1: dialog @@ -14310,56 +15421,415 @@ Trades: ; 0xfce58 ; 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 ret ; 1060bc -INCBIN "baserom.gbc",$1060bc,$106dbc - $1060bc +INCBIN "baserom.gbc", $1060bc, $106dbc - $1060bc SECTION "bank42",DATA,BANK[$42] @@ -14518,11 +15988,11 @@ StartTitleScreen: ; 10ed67 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 @@ StartTitleScreen: ; 10ed67 ; 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 @@ StartTitleScreen: ; 10ed67 ; Restore WRAM bank pop af - ld [$ff70], a + ld [rSVBK], a ; Reset audio @@ -14746,7 +16216,7 @@ TitleScreenPalettes: 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 @@ HTTPUtilityURL: ; 0x110ffc 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 @@ Function117bb6: 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 @@ Function117bb6: 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 @@ Function117bb6: call CopyBytes call CloseSRAM pop af - ld [$ff70], a + ld [rSVBK], a jp Function117cdd Function117c4a: @@ -15034,10 +16504,10 @@ Function117c4a: 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 @@ Function117c4a: 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 @@ Function117c89: 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,14 +16577,14 @@ MobileStadiumSuccessText: ; 0x117cd8 db "@" Function117cdd: ; 0x117cdd - ld hl,$cf63 + ld hl, $cf63 inc [hl] ret 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 @@ IndexDownloadURL: ; 0x118ce4 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 @@ INCBIN "gfx/pics/201r/back.lz" 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_SuicuneBattle: INCLUDE "audio/music/suicunebattle.asm" 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/LancesRoom.asm" 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 @@ INCLUDE "stats/pokedex/entries_2.asm" 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 @@ DudeAutoInput_DownA: ; 1de2af ; 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 "bank7A",DATA,BANK[$7A] 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 diff --git a/maps/BetaAlphRuinUnsolvedPuzzleRoom.blk b/maps/BetaAlphRuinUnsolvedPuzzleRoom.blk new file mode 100644 index 000000000..a3aa06bd6 --- /dev/null +++ b/maps/BetaAlphRuinUnsolvedPuzzleRoom.blk @@ -0,0 +1 @@ + ,+ \ No newline at end of file diff --git a/maps/BetaAzaleaTown.blk b/maps/BetaAzaleaTown.blk new file mode 100644 index 000000000..8faa18369 --- /dev/null +++ b/maps/BetaAzaleaTown.blk @@ -0,0 +1,10 @@ +aaaaaaaaFDaaaaaaaaaaaaaaaaaFDaaaaaaaaaaaaaaaaaFHIIaaaaaaBaaaFaaaaaaFaFaaaHJGFee>aacaaaFaaaadeefaaaaFGbaaaaaaaaFDaaaaaaaFaaDaU +aaaaaaaHIY +aaaaaaa~zU +aaaaaaa5Y +aaaaa@AAAA5z +vvvUaaaaaaaaaaa552955zvvvvvvvvvv +aa55551111111111111 + +a555555555555555552 +a \ No newline at end of file diff --git a/maps/BetaBlackthornCity.blk b/maps/BetaBlackthornCity.blk new file mode 100644 index 000000000..c6fc4f210 --- /dev/null +++ b/maps/BetaBlackthornCity.blk @@ -0,0 +1 @@ +hqqqqqqqqqqqqqqqqqqqhqorrrrrrrrrnqqqqqqqhqiaKeWaKeWahqqqqqqqhqieKaWWWaeWhqorrnqqhqiaWWKWeaWehqi !hqqhqiKWWeeaWWahqi$%hqqhqieKeaWWeeehqi$%hqqhqiaKaWeeWaahqi$%hqqlrmKeWWaWeWahqi()hqqKaWKaWaeWlrmtuhqqWWWWWWKaWWWWWWhqqhqqlrrG \ No newline at end of file diff --git a/maps/BetaBlank.blk b/maps/BetaBlank.blk new file mode 100644 index 000000000..e53405655 --- /dev/null +++ b/maps/BetaBlank.blk @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/maps/BetaCave.blk b/maps/BetaCave.blk new file mode 100644 index 000000000..b103c2532 --- /dev/null +++ b/maps/BetaCave.blk @@ -0,0 +1,8 @@ +  + + + + + + +  \ No newline at end of file diff --git a/maps/BetaCave2.blk b/maps/BetaCave2.blk new file mode 100644 index 000000000..a2722d010 --- /dev/null +++ b/maps/BetaCave2.blk @@ -0,0 +1,5 @@ +  +(+ +)* + +   \ No newline at end of file diff --git a/maps/BetaCaveTestMap.blk b/maps/BetaCaveTestMap.blk new file mode 100644 index 000000000..eba6c84c8 --- /dev/null +++ b/maps/BetaCaveTestMap.blk @@ -0,0 +1,18 @@ +   +;<  ; 6< + + 589: + + + + +  5  + +    + + 5   + +    +  + 5 6 +    \ No newline at end of file diff --git a/maps/BetaCeladonMansion.blk b/maps/BetaCeladonMansion.blk new file mode 100644 index 000000000..8d3e219df --- /dev/null +++ b/maps/BetaCeladonMansion.blk @@ -0,0 +1 @@ +? +,/ \ No newline at end of file diff --git a/maps/BetaCherrygroveCity.blk b/maps/BetaCherrygroveCity.blk new file mode 100644 index 000000000..440952f6f --- /dev/null +++ b/maps/BetaCherrygroveCity.blk @@ -0,0 +1,9 @@ + +aaaaaaaa + +a6 +a6YEa6Y,-6YG./a52vUa551 + +aaaaa5555 + +aaaa \ No newline at end of file diff --git a/maps/BetaCianwoodCity.blk b/maps/BetaCianwoodCity.blk new file mode 100644 index 000000000..d946e1de7 --- /dev/null +++ b/maps/BetaCianwoodCity.blk @@ -0,0 +1 @@ +aaaaXaaTyaaX5ETy5Tv455aTvvyfaXYaaXYEaaeaaa \ No newline at end of file diff --git a/maps/BetaCinnabarIslandPokemonLabHallway.blk b/maps/BetaCinnabarIslandPokemonLabHallway.blk new file mode 100644 index 000000000..7a6502a26 --- /dev/null +++ b/maps/BetaCinnabarIslandPokemonLabHallway.blk @@ -0,0 +1,2 @@ +  +  \ No newline at end of file diff --git a/maps/BetaCinnabarIslandPokemonLabRoom1.blk b/maps/BetaCinnabarIslandPokemonLabRoom1.blk new file mode 100644 index 000000000..ef77b6561 --- /dev/null +++ b/maps/BetaCinnabarIslandPokemonLabRoom1.blk @@ -0,0 +1,2 @@ +  +  \ No newline at end of file diff --git a/maps/BetaCinnabarIslandPokemonLabRoom2.blk b/maps/BetaCinnabarIslandPokemonLabRoom2.blk new file mode 100644 index 000000000..822db175b --- /dev/null +++ b/maps/BetaCinnabarIslandPokemonLabRoom2.blk @@ -0,0 +1 @@ +  \ No newline at end of file diff --git a/maps/BetaCinnabarIslandPokemonLabRoom3.blk b/maps/BetaCinnabarIslandPokemonLabRoom3.blk new file mode 100644 index 000000000..d9a64a5da --- /dev/null +++ b/maps/BetaCinnabarIslandPokemonLabRoom3.blk @@ -0,0 +1 @@ +   \ No newline at end of file diff --git a/maps/BetaElevator.blk b/maps/BetaElevator.blk new file mode 100644 index 000000000..32fb22697 --- /dev/null +++ b/maps/BetaElevator.blk @@ -0,0 +1 @@ +&$$$%$$$$$$$$$$$$$$$$$$ \ No newline at end of file diff --git a/maps/BetaEmptyHouse.blk b/maps/BetaEmptyHouse.blk new file mode 100644 index 000000000..dcec62794 --- /dev/null +++ b/maps/BetaEmptyHouse.blk @@ -0,0 +1,15 @@ +  +   +  + + + +   +  +   +   +   + + % + +   \ No newline at end of file diff --git a/maps/BetaGoldenrodCity.blk b/maps/BetaGoldenrodCity.blk new file mode 100644 index 000000000..1a156122d --- /dev/null +++ b/maps/BetaGoldenrodCity.blk @@ -0,0 +1,10 @@ + + + +FD + +JHU !Y$#Y"HEzv%&IIIIIIIIJII55)* @-.EAAAAAAAAAA FIHIJEEvvU55YY@AEYDFYHFzU5 + +B @55 + +F~D \ No newline at end of file diff --git a/maps/BetaHerosHouse.blk b/maps/BetaHerosHouse.blk new file mode 100644 index 000000000..b5b53b4bd --- /dev/null +++ b/maps/BetaHerosHouse.blk @@ -0,0 +1 @@ + ! " \ No newline at end of file diff --git a/maps/BetaHouse.blk b/maps/BetaHouse.blk new file mode 100644 index 000000000..187a3cd32 --- /dev/null +++ b/maps/BetaHouse.blk @@ -0,0 +1 @@ +*+,*-.12/0/ \ No newline at end of file diff --git a/maps/BetaHouse2.blk b/maps/BetaHouse2.blk new file mode 100644 index 000000000..993ea3a8d --- /dev/null +++ b/maps/BetaHouse2.blk @@ -0,0 +1 @@ +?',9..',9 \ No newline at end of file diff --git a/maps/BetaIlexForest.blk b/maps/BetaIlexForest.blk new file mode 100644 index 000000000..3cde14007 --- /dev/null +++ b/maps/BetaIlexForest.blk @@ -0,0 +1 @@ +hqqqqqihqqqqqilrrsm \ No newline at end of file diff --git a/maps/BetaLakeOfRage.blk b/maps/BetaLakeOfRage.blk new file mode 100644 index 000000000..d1d63a0d4 --- /dev/null +++ b/maps/BetaLakeOfRage.blk @@ -0,0 +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^^\>e\adfa \ No newline at end of file diff --git a/maps/BetaMahoganyTown.blk b/maps/BetaMahoganyTown.blk new file mode 100644 index 000000000..6b4c62e10 --- /dev/null +++ b/maps/BetaMahoganyTown.blk @@ -0,0 +1 @@ +`N=`RZW,-G./WEZWWG? \ No newline at end of file diff --git a/maps/BetaNewBarkTown.blk b/maps/BetaNewBarkTown.blk new file mode 100644 index 000000000..395c91f1b --- /dev/null +++ b/maps/BetaNewBarkTown.blk @@ -0,0 +1 @@ +^]?II~IDGaaHTvEX5@~~{XDGGXHIIIIIIIaXvvvvvvvvv1 \ No newline at end of file diff --git a/maps/BetaOlivineCity.blk b/maps/BetaOlivineCity.blk new file mode 100644 index 000000000..749f05a5c --- /dev/null +++ b/maps/BetaOlivineCity.blk @@ -0,0 +1,4 @@ +FDIJHIIIFDFZFDFDFFZFFZFFDFFZFAABFZFFDF|}FTvvvvvvvvvUDF|}FXYX55YDF|}FXYX55YHIIIJ|}FXYX556vvv + +JXYX5545552 +Xzvvvvy55255552vvvy555 555550555552995555~5555:5555 \ No newline at end of file diff --git a/maps/BetaPewterMuseumOfScience1F.blk b/maps/BetaPewterMuseumOfScience1F.blk new file mode 100644 index 000000000..1eec02a37 --- /dev/null +++ b/maps/BetaPewterMuseumOfScience1F.blk @@ -0,0 +1,2 @@ + +  ! &! & \ No newline at end of file diff --git a/maps/BetaPewterMuseumOfScience2F.blk b/maps/BetaPewterMuseumOfScience2F.blk new file mode 100644 index 000000000..ac5622246 --- /dev/null +++ b/maps/BetaPewterMuseumOfScience2F.blk @@ -0,0 +1 @@ +012! \ No newline at end of file diff --git a/maps/BetaPokecenterMainHouse.blk b/maps/BetaPokecenterMainHouse.blk new file mode 100644 index 000000000..261350738 --- /dev/null +++ b/maps/BetaPokecenterMainHouse.blk @@ -0,0 +1 @@ +  ' \ No newline at end of file diff --git a/maps/BetaPokecenterTradeStation.blk b/maps/BetaPokecenterTradeStation.blk new file mode 100644 index 000000000..555abfa07 --- /dev/null +++ b/maps/BetaPokecenterTradeStation.blk @@ -0,0 +1 @@ +' \ No newline at end of file diff --git a/maps/BetaRocketHideout1.blk b/maps/BetaRocketHideout1.blk new file mode 100644 index 000000000..988208073 --- /dev/null +++ b/maps/BetaRocketHideout1.blk @@ -0,0 +1,5 @@ + + :?  > "! 89  *> *   89 :?:? )  ;?;? )  ? :)   ><) >>    )89      >>   8: ::?   ?< <>:) 5//////>89<)  +,/////- >>>> 1 8899///= + 5///->:?  1 = + >? ? ,/////-,////- \ No newline at end of file diff --git a/maps/BetaRoute23EarlyVersion.blk b/maps/BetaRoute23EarlyVersion.blk new file mode 100644 index 000000000..a62533dd4 --- /dev/null +++ b/maps/BetaRoute23EarlyVersion.blk @@ -0,0 +1,7 @@ + + ! + +ohi +omhi!nm7:~nm'nm'nm'nm'nm'nm'nm'nm +^ +noo !hihi \ No newline at end of file diff --git a/maps/BetaSproutTower1.blk b/maps/BetaSproutTower1.blk new file mode 100644 index 000000000..6c0b2ea41 --- /dev/null +++ b/maps/BetaSproutTower1.blk @@ -0,0 +1,3 @@ +      +   +    \ No newline at end of file diff --git a/maps/BetaSproutTower2.blk b/maps/BetaSproutTower2.blk new file mode 100644 index 000000000..a13cec16b --- /dev/null +++ b/maps/BetaSproutTower2.blk @@ -0,0 +1,9 @@ +  +  +   +  +   +   +   +  + \ No newline at end of file diff --git a/maps/BetaSproutTower3.blk b/maps/BetaSproutTower3.blk new file mode 100644 index 000000000..846bb9016 --- /dev/null +++ b/maps/BetaSproutTower3.blk @@ -0,0 +1,7 @@ +  +    +  +    +  +   + \ No newline at end of file diff --git a/maps/BetaSproutTower5.blk b/maps/BetaSproutTower5.blk new file mode 100644 index 000000000..baaeaa926 --- /dev/null +++ b/maps/BetaSproutTower5.blk @@ -0,0 +1,9 @@ +  +  +  +  +  +     +  + +         \ No newline at end of file diff --git a/maps/BetaSproutTower6.blk b/maps/BetaSproutTower6.blk new file mode 100644 index 000000000..ea9395657 --- /dev/null +++ b/maps/BetaSproutTower6.blk @@ -0,0 +1,4 @@ +  +              +   +   \ No newline at end of file diff --git a/maps/BetaSproutTower7.blk b/maps/BetaSproutTower7.blk new file mode 100644 index 000000000..bfa5da286 --- /dev/null +++ b/maps/BetaSproutTower7.blk @@ -0,0 +1,8 @@ +  + +   +  +      +    +   +  \ No newline at end of file diff --git a/maps/BetaSproutTower8.blk b/maps/BetaSproutTower8.blk new file mode 100644 index 000000000..254c0c565 --- /dev/null +++ b/maps/BetaSproutTower8.blk @@ -0,0 +1,5 @@ +   +     +   +     +     \ No newline at end of file diff --git a/maps/BetaSproutTower9.blk b/maps/BetaSproutTower9.blk new file mode 100644 index 000000000..f5737b226 --- /dev/null +++ b/maps/BetaSproutTower9.blk @@ -0,0 +1 @@ +     \ No newline at end of file diff --git a/maps/BetaSproutTowerCutOut1.blk b/maps/BetaSproutTowerCutOut1.blk new file mode 100644 index 000000000..21808bb71 --- /dev/null +++ b/maps/BetaSproutTowerCutOut1.blk @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/maps/BetaSproutTowerCutOut2.blk b/maps/BetaSproutTowerCutOut2.blk new file mode 100644 index 000000000..21808bb71 --- /dev/null +++ b/maps/BetaSproutTowerCutOut2.blk @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/maps/BetaSproutTowerCutOut3.blk b/maps/BetaSproutTowerCutOut3.blk new file mode 100644 index 000000000..21808bb71 --- /dev/null +++ b/maps/BetaSproutTowerCutOut3.blk @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/maps/BetaSsAquaInsideCutOut.blk b/maps/BetaSsAquaInsideCutOut.blk new file mode 100644 index 000000000..b385b0198 --- /dev/null +++ b/maps/BetaSsAquaInsideCutOut.blk @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/maps/BetaTeakCity.blk b/maps/BetaTeakCity.blk new file mode 100644 index 000000000..ce448c2ef --- /dev/null +++ b/maps/BetaTeakCity.blk @@ -0,0 +1 @@ +?eeeeeeeeeeeb !bb$%b>$%`&;',-&'`$%`*"+#/*+aE$%dg,-b()#/tuWZWVWVWVWZ@AABGTU !FXY$%&'XYa$%*+VVZVVVVVVZaa()EatuIIJ~{@AAAAA HII \ No newline at end of file diff --git a/maps/BetaUnknown.blk b/maps/BetaUnknown.blk new file mode 100644 index 000000000..c3063adc7 --- /dev/null +++ b/maps/BetaUnknown.blk @@ -0,0 +1 @@ +( \ No newline at end of file diff --git a/maps/BetaVioletCity.blk b/maps/BetaVioletCity.blk new file mode 100644 index 000000000..963dbb2ed --- /dev/null +++ b/maps/BetaVioletCity.blk @@ -0,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 diff --git a/maps/HallOfFame.asm b/maps/HallOfFame.asm index 26d531e0e..591963f1a 100644 --- a/maps/HallOfFame.asm +++ b/maps/HallOfFame.asm @@ -123,10 +123,6 @@ HallOfFame_MapEventHeader: ; 0x181678 ; 0x181695 -; Pokedex entries I -; 001-064 - -INCLUDE "stats/pokedex/entries_1.asm" diff --git a/maps/ManiasHouse.asm b/maps/ManiasHouse.asm index a3847e4fc..ce4d58b8e 100644 --- a/maps/ManiasHouse.asm +++ b/maps/ManiasHouse.asm @@ -16,7 +16,7 @@ UnknownScript_0x9d278: ; 0x9d278 2writetext UnknownText_0x9d303 yesorno iffalse UnknownScript_0x9d2b6 - special $004b + special SPECIAL_GIVESHUCKLE iffalse UnknownScript_0x9d2b0 2writetext UnknownText_0x9d3ed keeptextopen diff --git a/pokecrystal.bat b/pokecrystal.bat new file mode 100644 index 000000000..211c33b1f --- /dev/null +++ b/pokecrystal.bat @@ -0,0 +1,3 @@ +@set PATH=%PATH%;C:\Program Files (x86)\GnuWin32\bin\;C:\Python27\ +@make winclean && make win +@pause diff --git a/preprocessor.py b/preprocessor.py index a2c0000e9..10447295f 100644 --- a/preprocessor.py +++ b/preprocessor.py @@ -18,6 +18,7 @@ from extras.crystal import ( text_command_classes, movement_command_classes, music_classes, + effect_classes, ) even_more_macros = [ @@ -34,6 +35,7 @@ macros += even_more_macros 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 diff --git a/wram.asm b/wram.asm index 444856409..cbe51a7b4 100644 --- a/wram.asm +++ b/wram.asm @@ -476,12 +476,33 @@ BattleMonSpclAtk: ; c646 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 @@ -495,15 +516,23 @@ PlayerSubStatus1: ; c668 ; 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 @@ PlayerSubStatus3: ; c66a 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 @@ EnemySubStatus5: ; c671 ; 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 - - ds 5 - -EnemyEncoreCount: ; c67e +PlayerFuryCutterCount: ; c678 ds 1 -EnemyPerishCount: ; c67f ds 1 - ds 2 +EnemyRolloutCount: ; c67a + ds 1 +EnemyConfuseCount: ; c67b + ds 1 + ds 1 +EnemyEncoreCount: ; c67d + ds 1 +EnemyPerishCount: ; c67e + ds 1 + ds 1 +EnemyFuryCutterCount: ; c680 + ds 1 -PlayerDamageTaken: ; c682 +PlayerDamageTaken: ; c681 ds 2 -EnemyDamageTaken: ; c684 +EnemyDamageTaken: ; c683 ds 2 ds 4 + + ds 1 BattleScriptBuffer: ; c68a ds 40 @@ -568,14 +619,46 @@ BattleScriptBuffer: ; c68a 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,12 +676,21 @@ LinkBattleRNCount: ; c6e5 ; how far through the prng stream ds 1 - ds 15 + ds 3 + +CurEnemyMoveNum: ; c6e9 + ds 1 + + ds 10 + +AlreadyDisobeyed: ; c6f4 + ds 1 DisabledMove: ; c6f5 ds 1 - - ds 2 +EnemyEncoredMove: ; c6f6 + ds 1 + ds 1 ; exists so you can't counter on switch LastEnemyCounterMove: ; c6f8 @@ -606,14 +698,38 @@ LastEnemyCounterMove: ; c6f8 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 @@ -647,7 +763,7 @@ LastEnemyMove: ; c71c SECTION "overworldmap",BSS[$c800] OverworldMap: ; c800 ds 1300 -OverworldMapEnd +OverworldMapEnd: ds 12 @@ -813,7 +929,76 @@ CurPartyMon: ; d109 ; 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,7 +1032,10 @@ TileSetPalettes: ; d1e6 ; bank 3f ds 2 - ds 2 +EvolvableFlags: ; d1e8 + ds 1 + + ds 1 Buffer1: MagikarpLength: ; d1ea @@ -928,6 +1116,12 @@ EnemyMonSpclAtk: ; d220 EnemyMonSpclDef: ; d222 ds 2 +EnemyMonType1: ; d224 + ds 1 +EnemyMonType2: ; d225 + ds 1 + + SECTION "Battle",BSS[$d22d] IsInBattle: ; d22d @@ -974,6 +1168,9 @@ UnownLetter: ; d234 CurBaseStats: ; d236 ds 32 +CurDamage: ; d256 + ds 2 + SECTION "TimeOfDay",BSS[$d269] TimeOfDay: ; d269 @@ -994,7 +1191,7 @@ OTPartySpecies: ; d281 ; or the routine will keep going OTPartyMon1: -OTPartyMon1Species2: ; d288 +OTPartyMon1Species: ; d288 ds 1 OTPartyMon1Item: ; d289 ds 1 @@ -1131,6 +1328,7 @@ PlayerID: ; d47b ds 2 PlayerName: ; d47d ds 11 +PlayerNameEnd: ; d478 ds 46 @@ -1322,9 +1520,8 @@ PartyCount: ; dcd7 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 @@ PartyMon1PokerusStatus: ; dcfb ds 1 PartyMon1CaughtData: ; dcfc PartyMon1CaughtTime: ; dcfc -PartyMon1CaughtLevel ; dcfc +PartyMon1CaughtLevel: ; dcfc ds 1 PartyMon1CaughtGender: ; dcfd PartyMon1CaughtLocation: ; dcfd @@ -1482,7 +1679,7 @@ BreedMon2Nick: ; df2f BreedMon2OT: ; df3a ds 11 BreedMon2Stats: -BreedMon1Species: ; df45 +BreedMon2Species: ; df45 ds 1 ds 31