summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxCrystal <rgr.crystal@gmail.com>2015-04-01 11:23:27 +0200
committerxCrystal <rgr.crystal@gmail.com>2015-04-01 17:05:10 +0200
commite74dce24b4bbb0d0d23a1724932b289050b66d4a (patch)
treeac695b04a00f7af920e1e84b88adbcb0fce84842
parent9d93b5b630eaabd57f213c9dc5761223ff7445ec (diff)
Rename battle files and split move effects Part 1
1.asm, 4.asm, and 4_2.asm
-rwxr-xr-xengine/battle/4.asm77
-rwxr-xr-xengine/battle/4_2.asm413
-rwxr-xr-xengine/battle/animations.asm26
-rwxr-xr-xengine/battle/e.asm2
-rw-r--r--engine/battle/end_of_battle.asm88
-rw-r--r--engine/battle/get_trainer_name.asm24
-rw-r--r--engine/battle/moveEffects/conversion_effect.asm34
-rw-r--r--[-rwxr-xr-x]engine/battle/moveEffects/drain_hp_effect.asm (renamed from engine/battle/1.asm)0
-rw-r--r--engine/battle/moveEffects/haze_effect.asm76
-rw-r--r--engine/battle/moveEffects/recoil_effect.asm68
-rw-r--r--engine/battle/wild_encounters.asm118
-rwxr-xr-xengine/menu/status_screen.asm64
-rw-r--r--engine/overworld/is_player_just_outside_map.asm16
-rwxr-xr-xmain.asm11
14 files changed, 510 insertions, 507 deletions
diff --git a/engine/battle/4.asm b/engine/battle/4.asm
deleted file mode 100755
index e96267c4..00000000
--- a/engine/battle/4.asm
+++ /dev/null
@@ -1,77 +0,0 @@
-; returns whether the player is one tile outside the map in Z
-IsPlayerJustOutsideMap: ; 128d8 (4:68d8)
- ld a, [W_YCOORD]
- ld b, a
- ld a, [W_CURMAPHEIGHT]
- call .compareCoordWithMapDimension
- ret z
- ld a, [W_XCOORD]
- ld b, a
- ld a, [W_CURMAPWIDTH]
-.compareCoordWithMapDimension
- add a
- cp b
- ret z
- inc b
- ret
-
-DrawHP: ; 128ef (4:68ef)
- call GetPredefRegisters
- ld a, $1
- jr DrawHP_
-
-DrawHP2: ; 128f6 (4:68f6)
- call GetPredefRegisters
- ld a, $2
-
-DrawHP_: ; 128fb (4:68fb)
- ld [wHPBarType], a
- push hl
- ld a, [wLoadedMonHP]
- ld b, a
- ld a, [wLoadedMonHP + 1]
- ld c, a
- or b
- jr nz, .nonzeroHP
- xor a
- ld c, a
- ld e, a
- ld a, $6
- ld d, a
- jp .drawHPBarAndPrintFraction
-.nonzeroHP
- ld a, [wLoadedMonMaxHP]
- ld d, a
- ld a, [wLoadedMonMaxHP + 1]
- ld e, a
- predef HPBarLength
- ld a, $6
- ld d, a
- ld c, a
-.drawHPBarAndPrintFraction
- pop hl
- push de
- push hl
- push hl
- call DrawHPBar
- pop hl
- ld a, [hFlags_0xFFF6]
- bit 0, a
- jr z, .printFractionBelowBar
- ld bc, $9 ; right of bar
- jr .printFraction
-.printFractionBelowBar
- ld bc, SCREEN_WIDTH + 1 ; below bar
-.printFraction
- add hl, bc
- ld de, wLoadedMonHP
- ld bc, $203
- call PrintNumber
- ld a, "/"
- ld [hli], a
- ld de, wLoadedMonMaxHP
- ld bc, $203
- call PrintNumber
- pop hl
- pop de
- ret
diff --git a/engine/battle/4_2.asm b/engine/battle/4_2.asm
deleted file mode 100755
index ea29cca7..00000000
--- a/engine/battle/4_2.asm
+++ /dev/null
@@ -1,413 +0,0 @@
-EndOfBattle: ; 137aa (4:77aa)
- ld a, [wLinkState]
- cp LINK_STATE_BATTLING
- jr nz, .notLinkBattle
-; link battle
- ld a, [wEnemyMonPartyPos]
- ld hl, wEnemyMon1Status
- ld bc, wEnemyMon2 - wEnemyMon1
- call AddNTimes
- ld a, [wEnemyMonStatus]
- ld [hl], a
- call ClearScreen
- callab DisplayLinkBattleVersusTextBox
- ld a, [wBattleResult]
- cp $1
- ld de, YouWinText
- jr c, .placeWinOrLoseString
- ld de, YouLoseText
- jr z, .placeWinOrLoseString
- ld de, DrawText
-.placeWinOrLoseString
- hlCoord 6, 8
- call PlaceString
- ld c, $c8
- call DelayFrames
- jr .evolution
-.notLinkBattle
- ld a, [wBattleResult]
- and a
- jr nz, .resetVariables
- ld hl, wTotalPayDayMoney
- ld a, [hli]
- or [hl]
- inc hl
- or [hl]
- jr z, .evolution ; if pay day money is 0, jump
- ld de, wPlayerMoney + 2
- ld c, $3
- predef AddBCDPredef
- ld hl, PickUpPayDayMoneyText
- call PrintText
-.evolution
- xor a
- ld [wccd4], a
- predef EvolutionAfterBattle
-.resetVariables
- xor a
- ld [wLowHealthAlarm], a ;disable low health alarm
- ld [wc02a], a
- ld [W_ISINBATTLE], a
- ld [W_BATTLETYPE], a
- ld [W_MOVEMISSED], a
- ld [W_CUROPPONENT], a
- ld [wd11f], a
- ld [wNumRunAttempts], a
- ld [wEscapedFromBattle], a
- ld hl, wcc2b
- ld [hli], a
- ld [hli], a
- ld [hli], a
- ld [hl], a
- ld [wListScrollOffset], a
- ld hl, wPlayerStatsToDouble
- ld b, $18
-.loop
- ld [hli], a
- dec b
- jr nz, .loop
- ld hl, wd72c
- set 0, [hl]
- call WaitForSoundToFinish
- call GBPalWhiteOut
- ld a, $ff
- ld [wDestinationWarpID], a
- ret
-
-YouWinText: ; 13853 (4:7853)
- db "YOU WIN@"
-
-YouLoseText: ; 1385b (4:785b)
- db "YOU LOSE@"
-
-DrawText: ; 13864 (4:7864)
- db " DRAW@"
-
-PickUpPayDayMoneyText: ; 1386b (4:786b)
- TX_FAR _PickUpPayDayMoneyText
- db "@"
-
-; try to initiate a wild pokemon encounter
-; returns success in Z
-TryDoWildEncounter: ; 13870 (4:7870)
- ld a, [wNPCMovementScriptPointerTableNum]
- and a
- ret nz
- ld a, [wd736]
- and a
- ret nz
- callab IsPlayerStandingOnDoorTileOrWarpTile
- jr nc, .notStandingOnDoorOrWarpTile
-.CantEncounter
- ld a, $1
- and a
- ret
-.notStandingOnDoorOrWarpTile
- callab IsPlayerJustOutsideMap
- jr z, .CantEncounter
- ld a, [wRepelRemainingSteps]
- and a
- jr z, .asm_1389e
- dec a
- jr z, .lastRepelStep
- ld [wRepelRemainingSteps], a
-.asm_1389e
-; determine if wild pokémon can appear in the half-block we’re standing in
-; is the bottom right tile (9,9) of the half-block we're standing in a grass/water tile?
- hlCoord 9, 9
- ld c, [hl]
- ld a, [W_GRASSTILE]
- cp c
- ld a, [W_GRASSRATE]
- jr z, .CanEncounter
- ld a, $14 ; in all tilesets with a water tile, this is its id
- cp c
- ld a, [W_WATERRATE]
- jr z, .CanEncounter
-; even if not in grass/water, standing anywhere we can encounter pokémon
-; so long as the map is “indoor” and has wild pokémon defined.
-; …as long as it’s not Viridian Forest or Safari Zone.
- ld a, [W_CURMAP]
- cp REDS_HOUSE_1F ; is this an indoor map?
- jr c, .CantEncounter2
- ld a, [W_CURMAPTILESET]
- cp FOREST ; Viridian Forest/Safari Zone
- jr z, .CantEncounter2
- ld a, [W_GRASSRATE]
-.CanEncounter
-; compare encounter chance with a random number to determine if there will be an encounter
- ld b, a
- ld a, [hRandomAdd]
- cp b
- jr nc, .CantEncounter2
- ld a, [hRandomSub]
- ld b, a
- ld hl, WildMonEncounterSlotChances
-.determineEncounterSlot
- ld a, [hli]
- cp b
- jr nc, .gotEncounterSlot
- inc hl
- jr .determineEncounterSlot
-.gotEncounterSlot
-; determine which wild pokémon (grass or water) can appear in the half-block we’re standing in
- ld c, [hl]
- ld hl, W_GRASSMONS
- aCoord 8, 9
- cp $14 ; is the bottom left tile (8,9) of the half-block we're standing in a water tile?
- jr nz, .gotWildEncounterType ; else, it's treated as a grass tile by default
- ld hl, W_WATERMONS
-; since the bottom right tile of a "left shore" half-block is $14 but the bottom left tile is not,
-; "left shore" half-blocks (such as the one in the east coast of Cinnabar) load grass encounters.
-.gotWildEncounterType
- ld b, $0
- add hl, bc
- ld a, [hli]
- ld [W_CURENEMYLVL], a
- ld a, [hl]
- ld [wcf91], a
- ld [wEnemyMonSpecies2], a
- ld a, [wRepelRemainingSteps]
- and a
- jr z, .willEncounter
- ld a, [wPartyMon1Level]
- ld b, a
- ld a, [W_CURENEMYLVL]
- cp b
- jr c, .CantEncounter2 ; repel prevents encounters if the leading party mon's level is higher than the wild mon
- jr .willEncounter
-.lastRepelStep
- ld [wRepelRemainingSteps], a
- ld a, $d2
- ld [H_DOWNARROWBLINKCNT2], a
- call EnableAutoTextBoxDrawing
- call DisplayTextID
-.CantEncounter2
- ld a, $1
- and a
- ret
-.willEncounter
- xor a
- ret
-
-WildMonEncounterSlotChances: ; 13918 (4:7918)
-; There are 10 slots for wild pokemon, and this is the table that defines how common each of
-; those 10 slots is. A random number is generated and then the first byte of each pair in this
-; table is compared against that random number. If the random number is less than or equal
-; to the first byte, then that slot is chosen. The second byte is double the slot number.
- db $32, $00 ; 51/256 = 19.9% chance of slot 0
- db $65, $02 ; 51/256 = 19.9% chance of slot 1
- db $8C, $04 ; 39/256 = 15.2% chance of slot 2
- db $A5, $06 ; 25/256 = 9.8% chance of slot 3
- db $BE, $08 ; 25/256 = 9.8% chance of slot 4
- db $D7, $0A ; 25/256 = 9.8% chance of slot 5
- db $E4, $0C ; 13/256 = 5.1% chance of slot 6
- db $F1, $0E ; 13/256 = 5.1% chance of slot 7
- db $FC, $10 ; 11/256 = 4.3% chance of slot 8
- db $FF, $12 ; 3/256 = 1.2% chance of slot 9
-
-RecoilEffect_: ; 1392c (4:792c)
- ld a, [H_WHOSETURN]
- and a
- ld a, [W_PLAYERMOVENUM]
- ld hl, wBattleMonMaxHP
- jr z, .asm_1393d
- ld a, [W_ENEMYMOVENUM]
- ld hl, wEnemyMonMaxHP
-.asm_1393d
- ld d, a
- ld a, [W_DAMAGE]
- ld b, a
- ld a, [W_DAMAGE + 1]
- ld c, a
- srl b
- rr c
- ld a, d
- cp STRUGGLE
- jr z, .asm_13953
- srl b
- rr c
-.asm_13953
- ld a, b
- or c
- jr nz, .asm_13958
- inc c
-.asm_13958
- ld a, [hli]
- ld [wHPBarMaxHP+1], a
- ld a, [hl]
- ld [wHPBarMaxHP], a
- push bc
- ld bc, $fff2
- add hl, bc
- pop bc
- ld a, [hl]
- ld [wHPBarOldHP], a
- sub c
- ld [hld], a
- ld [wHPBarNewHP], a
- ld a, [hl]
- ld [wHPBarOldHP+1], a
- sbc b
- ld [hl], a
- ld [wHPBarNewHP+1], a
- jr nc, .asm_13982
- xor a
- ld [hli], a
- ld [hl], a
- ld hl, wHPBarNewHP
- ld [hli], a
- ld [hl], a
-.asm_13982
- hlCoord 10, 9
- ld a, [H_WHOSETURN]
- and a
- ld a, $1
- jr z, .asm_13990
- hlCoord 2, 2
- xor a
-.asm_13990
- ld [wHPBarType], a
- predef UpdateHPBar2
- ld hl, HitWithRecoilText
- jp PrintText
-HitWithRecoilText: ; 1399e (4:799e)
- TX_FAR _HitWithRecoilText
- db "@"
-
-ConversionEffect_: ; 139a3 (4:79a3)
- ld hl, wEnemyMonType1
- ld de, wBattleMonType1
- ld a, [H_WHOSETURN]
- and a
- ld a, [W_ENEMYBATTSTATUS1]
- jr z, .asm_139b8
- push hl
- ld h, d
- ld l, e
- pop de
- ld a, [W_PLAYERBATTSTATUS1]
-.asm_139b8
- bit Invulnerable, a ; is mon immune to typical attacks (dig/fly)
- jr nz, PrintButItFailedText
- ld a, [hli]
- ld [de], a
- inc de
- ld a, [hl]
- ld [de], a
- ld hl, PlayCurrentMoveAnimation
- call CallBankF
- ld hl, ConvertedTypeText
- jp PrintText
-
-ConvertedTypeText: ; 139cd (4:79cd)
- TX_FAR _ConvertedTypeText
- db "@"
-
-PrintButItFailedText: ; 139d2 (4:79d2)
- ld hl, PrintButItFailedText_
-CallBankF: ; 139d5 (4:79d5)
- ld b, BANK(PrintButItFailedText_)
- jp Bankswitch
-
-HazeEffect_: ; 139da (4:79da)
- ld a, $7
- ld hl, wPlayerMonAttackMod
- call ResetStatMods
- ld hl, wEnemyMonAttackMod
- call ResetStatMods
- ld hl, wPlayerMonUnmodifiedAttack
- ld de, wBattleMonAttack
- call ResetStats
- ld hl, wEnemyMonUnmodifiedAttack
- ld de, wEnemyMonAttack
- call ResetStats
- ld hl, wEnemyMonStatus
- ld de, wEnemySelectedMove
- ld a, [H_WHOSETURN]
- and a
- jr z, .asm_13a09
- ld hl, wBattleMonStatus
- dec de
-
-.asm_13a09
- ld a, [hl]
- ld [hl], $0
- and $27
- jr z, .asm_13a13
- ld a, $ff
- ld [de], a
-
-.asm_13a13
- xor a
- ld [W_PLAYERDISABLEDMOVE], a
- ld [W_ENEMYDISABLEDMOVE], a
- ld hl, wccee
- ld [hli], a
- ld [hl], a
- ld hl, W_PLAYERBATTSTATUS1
- call CureStatuses
- ld hl, W_ENEMYBATTSTATUS1
- call CureStatuses
- ld hl, PlayCurrentMoveAnimation
- call CallBankF
- ld hl, StatusChangesEliminatedText
- jp PrintText
-
-CureStatuses: ; 13a37 (4:7a37)
- res Confused, [hl]
- inc hl ; BATTSTATUS2
- ld a, [hl]
- and (1 << UsingRage) | (1 << NeedsToRecharge) | (1 << HasSubstituteUp) | (1 << 3) ; clear all but these from BATTSTATUS2
- ld [hli], a ; BATTSTATUS3
- ld a, [hl]
- and %11110000 | (1 << Transformed) ; clear Bad Poison, Reflect and Light Screen statuses
- ld [hl], a
- ret
-
-ResetStatMods: ; 13a43 (4:7a43)
- ld b, $8
-.loop
- ld [hli], a
- dec b
- jr nz, .loop
- ret
-
-ResetStats: ; 13a4a (4:7a4a)
- ld b, $8
-.loop
- ld a, [hli]
- ld [de], a
- inc de
- dec b
- jr nz, .loop
- ret
-
-StatusChangesEliminatedText: ; 13a53 (4:7a53)
- TX_FAR _StatusChangesEliminatedText
- db "@"
-
-GetTrainerName_: ; 13a58 (4:7a58)
- ld hl, W_GRASSRATE
- ld a, [wLinkState]
- and a
- jr nz, .rival
- ld hl, W_RIVALNAME
- ld a, [W_TRAINERCLASS]
- cp SONY1
- jr z, .rival
- cp SONY2
- jr z, .rival
- cp SONY3
- jr z, .rival
- ld [wd0b5], a
- ld a, TRAINER_NAME
- ld [wNameListType], a
- ld a, BANK(TrainerNames)
- ld [wPredefBank], a
- call GetName
- ld hl, wcd6d
-.rival
- ld de, W_TRAINERNAME
- ld bc, $d
- jp CopyData
diff --git a/engine/battle/animations.asm b/engine/battle/animations.asm
index 0f12e05a..dc08e0e1 100755
--- a/engine/battle/animations.asm
+++ b/engine/battle/animations.asm
@@ -407,7 +407,7 @@ MoveAnimation: ; 78d5e (1e:4d5e)
ld c,30
call DelayFrames
.next4
- call PlayApplyingAttackAnimation ; reload pic and flash the pic in and out (to show damage)
+ call PlayApplyingAttackAnimation ; shake the screen or flash the pic in and out (to show damage)
.AnimationFinished
call WaitForSoundToFinish
xor a
@@ -463,37 +463,37 @@ PlayApplyingAttackAnimation: ; 78dbd (1e:4dbd)
jp [hl]
AnimationTypePointerTable: ; 78dcf (1e:4dcf)
- dw ShakeScreenVertically ; enemy mon has used a non-damaging move
+ dw ShakeScreenVertically ; enemy mon has used a damaging move without a side effect
dw ShakeScreenHorizontallyHeavy ; enemy mon has used a damaging move with a side effect
- dw ShakeScreenHorizontallySlow ; enemy mon has used a damaging move without a side effect
- dw BlinkEnemyMonSprite ; player mon has used a non-damaging move
+ dw ShakeScreenHorizontallySlow ; enemy mon has used a non-damaging move
+ dw BlinkEnemyMonSprite ; player mon has used a damaging move without a side effect
dw ShakeScreenHorizontallyLight ; player mon has used a damaging move with a side effect
- dw ShakeScreenHorizontallySlow2 ; player mon has used a damaging move without a side effect
+ dw ShakeScreenHorizontallySlow2 ; player mon has used a non-damaging move
-ShakeScreenVertically: ; 78ddb (1e:4ddb)
+ShakeScreenVertically: ; 78ddb (1e:4ddb)
call PlayApplyingAttackSound
ld b, $8
jp AnimationShakeScreenVertically
-ShakeScreenHorizontallyHeavy: ; 78de3 (1e:4de3)
+ShakeScreenHorizontallyHeavy: ; 78de3 (1e:4de3)
call PlayApplyingAttackSound
ld b, $8
- jp AnimationShakeScreenHorizontallyFast
+ jp AnimationShakeScreenHorizontallyFast
-ShakeScreenHorizontallySlow: ; 78deb (1e:4deb)
+ShakeScreenHorizontallySlow: ; 78deb (1e:4deb)
ld bc, $602
- jr AnimationShakeScreenHorizontallySlow
+ jr AnimationShakeScreenHorizontallySlow
-BlinkEnemyMonSprite: ; 78df0 (1e:4df0)
+BlinkEnemyMonSprite: ; 78df0 (1e:4df0)
call PlayApplyingAttackSound
jp AnimationBlinkEnemyMon
-ShakeScreenHorizontallyLight: ; 78df6 (1e:4df6)
+ShakeScreenHorizontallyLight: ; 78df6 (1e:4df6)
call PlayApplyingAttackSound
ld b, $2
jp AnimationShakeScreenHorizontallyFast
-ShakeScreenHorizontallySlow2: ; 78dfe (1e:4dfe)
+ShakeScreenHorizontallySlow2: ; 78dfe (1e:4dfe)
ld bc, $302
AnimationShakeScreenHorizontallySlow: ; 78e01 (1e:4e01)
diff --git a/engine/battle/e.asm b/engine/battle/e.asm
index e7802e4e..1144abe8 100755
--- a/engine/battle/e.asm
+++ b/engine/battle/e.asm
@@ -335,7 +335,7 @@ AIMoveChoiceModification3: ; 39817 (e:5817)
ld a, [W_ENEMYMOVETYPE]
ld d, a
ld hl, wEnemyMonMoves ; enemy moves
- ld b, $5
+ ld b, NUM_MOVES + 1
ld c, $0
.loopMoves
dec b
diff --git a/engine/battle/end_of_battle.asm b/engine/battle/end_of_battle.asm
new file mode 100644
index 00000000..f03dd07f
--- /dev/null
+++ b/engine/battle/end_of_battle.asm
@@ -0,0 +1,88 @@
+EndOfBattle: ; 137aa (4:77aa)
+ ld a, [wLinkState]
+ cp LINK_STATE_BATTLING
+ jr nz, .notLinkBattle
+; link battle
+ ld a, [wEnemyMonPartyPos]
+ ld hl, wEnemyMon1Status
+ ld bc, wEnemyMon2 - wEnemyMon1
+ call AddNTimes
+ ld a, [wEnemyMonStatus]
+ ld [hl], a
+ call ClearScreen
+ callab DisplayLinkBattleVersusTextBox
+ ld a, [wBattleResult]
+ cp $1
+ ld de, YouWinText
+ jr c, .placeWinOrLoseString
+ ld de, YouLoseText
+ jr z, .placeWinOrLoseString
+ ld de, DrawText
+.placeWinOrLoseString
+ hlCoord 6, 8
+ call PlaceString
+ ld c, $c8
+ call DelayFrames
+ jr .evolution
+.notLinkBattle
+ ld a, [wBattleResult]
+ and a
+ jr nz, .resetVariables
+ ld hl, wTotalPayDayMoney
+ ld a, [hli]
+ or [hl]
+ inc hl
+ or [hl]
+ jr z, .evolution ; if pay day money is 0, jump
+ ld de, wPlayerMoney + 2
+ ld c, $3
+ predef AddBCDPredef
+ ld hl, PickUpPayDayMoneyText
+ call PrintText
+.evolution
+ xor a
+ ld [wccd4], a
+ predef EvolutionAfterBattle
+.resetVariables
+ xor a
+ ld [wLowHealthAlarm], a ;disable low health alarm
+ ld [wc02a], a
+ ld [W_ISINBATTLE], a
+ ld [W_BATTLETYPE], a
+ ld [W_MOVEMISSED], a
+ ld [W_CUROPPONENT], a
+ ld [wd11f], a
+ ld [wNumRunAttempts], a
+ ld [wEscapedFromBattle], a
+ ld hl, wcc2b
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ ld [hl], a
+ ld [wListScrollOffset], a
+ ld hl, wPlayerStatsToDouble
+ ld b, $18
+.loop
+ ld [hli], a
+ dec b
+ jr nz, .loop
+ ld hl, wd72c
+ set 0, [hl]
+ call WaitForSoundToFinish
+ call GBPalWhiteOut
+ ld a, $ff
+ ld [wDestinationWarpID], a
+ ret
+
+YouWinText: ; 13853 (4:7853)
+ db "YOU WIN@"
+
+YouLoseText: ; 1385b (4:785b)
+ db "YOU LOSE@"
+
+DrawText: ; 13864 (4:7864)
+ db " DRAW@"
+
+PickUpPayDayMoneyText: ; 1386b (4:786b)
+ TX_FAR _PickUpPayDayMoneyText
+ db "@" \ No newline at end of file
diff --git a/engine/battle/get_trainer_name.asm b/engine/battle/get_trainer_name.asm
new file mode 100644
index 00000000..961f25cf
--- /dev/null
+++ b/engine/battle/get_trainer_name.asm
@@ -0,0 +1,24 @@
+GetTrainerName_: ; 13a58 (4:7a58)
+ ld hl, W_GRASSRATE
+ ld a, [wLinkState]
+ and a
+ jr nz, .rival
+ ld hl, W_RIVALNAME
+ ld a, [W_TRAINERCLASS]
+ cp SONY1
+ jr z, .rival
+ cp SONY2
+ jr z, .rival
+ cp SONY3
+ jr z, .rival
+ ld [wd0b5], a
+ ld a, TRAINER_NAME
+ ld [wNameListType], a
+ ld a, BANK(TrainerNames)
+ ld [wPredefBank], a
+ call GetName
+ ld hl, wcd6d
+.rival
+ ld de, W_TRAINERNAME
+ ld bc, $d
+ jp CopyData
diff --git a/engine/battle/moveEffects/conversion_effect.asm b/engine/battle/moveEffects/conversion_effect.asm
new file mode 100644
index 00000000..511df2fd
--- /dev/null
+++ b/engine/battle/moveEffects/conversion_effect.asm
@@ -0,0 +1,34 @@
+ConversionEffect_: ; 139a3 (4:79a3)
+ ld hl, wEnemyMonType1
+ ld de, wBattleMonType1
+ ld a, [H_WHOSETURN]
+ and a
+ ld a, [W_ENEMYBATTSTATUS1]
+ jr z, .asm_139b8
+ push hl
+ ld h, d
+ ld l, e
+ pop de
+ ld a, [W_PLAYERBATTSTATUS1]
+.asm_139b8
+ bit Invulnerable, a ; is mon immune to typical attacks (dig/fly)
+ jr nz, PrintButItFailedText
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hl]
+ ld [de], a
+ ld hl, PlayCurrentMoveAnimation
+ call CallBankF
+ ld hl, ConvertedTypeText
+ jp PrintText
+
+ConvertedTypeText: ; 139cd (4:79cd)
+ TX_FAR _ConvertedTypeText
+ db "@"
+
+PrintButItFailedText: ; 139d2 (4:79d2)
+ ld hl, PrintButItFailedText_
+CallBankF: ; 139d5 (4:79d5)
+ ld b, BANK(PrintButItFailedText_)
+ jp Bankswitch
diff --git a/engine/battle/1.asm b/engine/battle/moveEffects/drain_hp_effect.asm
index 517d53d1..517d53d1 100755..100644
--- a/engine/battle/1.asm
+++ b/engine/battle/moveEffects/drain_hp_effect.asm
diff --git a/engine/battle/moveEffects/haze_effect.asm b/engine/battle/moveEffects/haze_effect.asm
new file mode 100644
index 00000000..2343e784
--- /dev/null
+++ b/engine/battle/moveEffects/haze_effect.asm
@@ -0,0 +1,76 @@
+HazeEffect_: ; 139da (4:79da)
+ ld a, $7
+ ld hl, wPlayerMonAttackMod
+ call ResetStatMods
+ ld hl, wEnemyMonAttackMod
+ call ResetStatMods
+ ld hl, wPlayerMonUnmodifiedAttack
+ ld de, wBattleMonAttack
+ call ResetStats
+ ld hl, wEnemyMonUnmodifiedAttack
+ ld de, wEnemyMonAttack
+ call ResetStats
+ ld hl, wEnemyMonStatus
+ ld de, wEnemySelectedMove
+ ld a, [H_WHOSETURN]
+ and a
+ jr z, .asm_13a09
+ ld hl, wBattleMonStatus
+ dec de
+
+.asm_13a09
+ ld a, [hl]
+ ld [hl], $0
+ and $27
+ jr z, .asm_13a13
+ ld a, $ff
+ ld [de], a
+
+.asm_13a13
+ xor a
+ ld [W_PLAYERDISABLEDMOVE], a
+ ld [W_ENEMYDISABLEDMOVE], a
+ ld hl, wccee
+ ld [hli], a
+ ld [hl], a
+ ld hl, W_PLAYERBATTSTATUS1
+ call CureStatuses
+ ld hl, W_ENEMYBATTSTATUS1
+ call CureStatuses
+ ld hl, PlayCurrentMoveAnimation
+ call CallBankF
+ ld hl, StatusChangesEliminatedText
+ jp PrintText
+
+CureStatuses: ; 13a37 (4:7a37)
+ res Confused, [hl]
+ inc hl ; BATTSTATUS2
+ ld a, [hl]
+ and (1 << UsingRage) | (1 << NeedsToRecharge) | (1 << HasSubstituteUp) | (1 << 3) ; clear all but these from BATTSTATUS2
+ ld [hli], a ; BATTSTATUS3
+ ld a, [hl]
+ and %11110000 | (1 << Transformed) ; clear Bad Poison, Reflect and Light Screen statuses
+ ld [hl], a
+ ret
+
+ResetStatMods: ; 13a43 (4:7a43)
+ ld b, $8
+.loop
+ ld [hli], a
+ dec b
+ jr nz, .loop
+ ret
+
+ResetStats: ; 13a4a (4:7a4a)
+ ld b, $8
+.loop
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec b
+ jr nz, .loop
+ ret
+
+StatusChangesEliminatedText: ; 13a53 (4:7a53)
+ TX_FAR _StatusChangesEliminatedText
+ db "@"
diff --git a/engine/battle/moveEffects/recoil_effect.asm b/engine/battle/moveEffects/recoil_effect.asm
new file mode 100644
index 00000000..0460b208
--- /dev/null
+++ b/engine/battle/moveEffects/recoil_effect.asm
@@ -0,0 +1,68 @@
+RecoilEffect_: ; 1392c (4:792c)
+ ld a, [H_WHOSETURN]
+ and a
+ ld a, [W_PLAYERMOVENUM]
+ ld hl, wBattleMonMaxHP
+ jr z, .asm_1393d
+ ld a, [W_ENEMYMOVENUM]
+ ld hl, wEnemyMonMaxHP
+.asm_1393d
+ ld d, a
+ ld a, [W_DAMAGE]
+ ld b, a
+ ld a, [W_DAMAGE + 1]
+ ld c, a
+ srl b
+ rr c
+ ld a, d
+ cp STRUGGLE
+ jr z, .asm_13953
+ srl b
+ rr c
+.asm_13953
+ ld a, b
+ or c
+ jr nz, .asm_13958
+ inc c
+.asm_13958
+ ld a, [hli]
+ ld [wHPBarMaxHP+1], a
+ ld a, [hl]
+ ld [wHPBarMaxHP], a
+ push bc
+ ld bc, $fff2
+ add hl, bc
+ pop bc
+ ld a, [hl]
+ ld [wHPBarOldHP], a
+ sub c
+ ld [hld], a
+ ld [wHPBarNewHP], a
+ ld a, [hl]
+ ld [wHPBarOldHP+1], a
+ sbc b
+ ld [hl], a
+ ld [wHPBarNewHP+1], a
+ jr nc, .asm_13982
+ xor a
+ ld [hli], a
+ ld [hl], a
+ ld hl, wHPBarNewHP
+ ld [hli], a
+ ld [hl], a
+.asm_13982
+ hlCoord 10, 9
+ ld a, [H_WHOSETURN]
+ and a
+ ld a, $1
+ jr z, .asm_13990
+ hlCoord 2, 2
+ xor a
+.asm_13990
+ ld [wHPBarType], a
+ predef UpdateHPBar2
+ ld hl, HitWithRecoilText
+ jp PrintText
+HitWithRecoilText: ; 1399e (4:799e)
+ TX_FAR _HitWithRecoilText
+ db "@"
diff --git a/engine/battle/wild_encounters.asm b/engine/battle/wild_encounters.asm
new file mode 100644
index 00000000..03119b90
--- /dev/null
+++ b/engine/battle/wild_encounters.asm
@@ -0,0 +1,118 @@
+; try to initiate a wild pokemon encounter
+; returns success in Z
+TryDoWildEncounter: ; 13870 (4:7870)
+ ld a, [wNPCMovementScriptPointerTableNum]
+ and a
+ ret nz
+ ld a, [wd736]
+ and a
+ ret nz
+ callab IsPlayerStandingOnDoorTileOrWarpTile
+ jr nc, .notStandingOnDoorOrWarpTile
+.CantEncounter
+ ld a, $1
+ and a
+ ret
+.notStandingOnDoorOrWarpTile
+ callab IsPlayerJustOutsideMap
+ jr z, .CantEncounter
+ ld a, [wRepelRemainingSteps]
+ and a
+ jr z, .asm_1389e
+ dec a
+ jr z, .lastRepelStep
+ ld [wRepelRemainingSteps], a
+.asm_1389e
+; determine if wild pokémon can appear in the half-block we’re standing in
+; is the bottom right tile (9,9) of the half-block we're standing in a grass/water tile?
+ hlCoord 9, 9
+ ld c, [hl]
+ ld a, [W_GRASSTILE]
+ cp c
+ ld a, [W_GRASSRATE]
+ jr z, .CanEncounter
+ ld a, $14 ; in all tilesets with a water tile, this is its id
+ cp c
+ ld a, [W_WATERRATE]
+ jr z, .CanEncounter
+; even if not in grass/water, standing anywhere we can encounter pokémon
+; so long as the map is “indoor” and has wild pokémon defined.
+; …as long as it’s not Viridian Forest or Safari Zone.
+ ld a, [W_CURMAP]
+ cp REDS_HOUSE_1F ; is this an indoor map?
+ jr c, .CantEncounter2
+ ld a, [W_CURMAPTILESET]
+ cp FOREST ; Viridian Forest/Safari Zone
+ jr z, .CantEncounter2
+ ld a, [W_GRASSRATE]
+.CanEncounter
+; compare encounter chance with a random number to determine if there will be an encounter
+ ld b, a
+ ld a, [hRandomAdd]
+ cp b
+ jr nc, .CantEncounter2
+ ld a, [hRandomSub]
+ ld b, a
+ ld hl, WildMonEncounterSlotChances
+.determineEncounterSlot
+ ld a, [hli]
+ cp b
+ jr nc, .gotEncounterSlot
+ inc hl
+ jr .determineEncounterSlot
+.gotEncounterSlot
+; determine which wild pokémon (grass or water) can appear in the half-block we’re standing in
+ ld c, [hl]
+ ld hl, W_GRASSMONS
+ aCoord 8, 9
+ cp $14 ; is the bottom left tile (8,9) of the half-block we're standing in a water tile?
+ jr nz, .gotWildEncounterType ; else, it's treated as a grass tile by default
+ ld hl, W_WATERMONS
+; since the bottom right tile of a "left shore" half-block is $14 but the bottom left tile is not,
+; "left shore" half-blocks (such as the one in the east coast of Cinnabar) load grass encounters.
+.gotWildEncounterType
+ ld b, $0
+ add hl, bc
+ ld a, [hli]
+ ld [W_CURENEMYLVL], a
+ ld a, [hl]
+ ld [wcf91], a
+ ld [wEnemyMonSpecies2], a
+ ld a, [wRepelRemainingSteps]
+ and a
+ jr z, .willEncounter
+ ld a, [wPartyMon1Level]
+ ld b, a
+ ld a, [W_CURENEMYLVL]
+ cp b
+ jr c, .CantEncounter2 ; repel prevents encounters if the leading party mon's level is higher than the wild mon
+ jr .willEncounter
+.lastRepelStep
+ ld [wRepelRemainingSteps], a
+ ld a, $d2
+ ld [H_DOWNARROWBLINKCNT2], a
+ call EnableAutoTextBoxDrawing
+ call DisplayTextID
+.CantEncounter2
+ ld a, $1
+ and a
+ ret
+.willEncounter
+ xor a
+ ret
+
+WildMonEncounterSlotChances: ; 13918 (4:7918)
+; There are 10 slots for wild pokemon, and this is the table that defines how common each of
+; those 10 slots is. A random number is generated and then the first byte of each pair in this
+; table is compared against that random number. If the random number is less than or equal
+; to the first byte, then that slot is chosen. The second byte is double the slot number.
+ db $32, $00 ; 51/256 = 19.9% chance of slot 0
+ db $65, $02 ; 51/256 = 19.9% chance of slot 1
+ db $8C, $04 ; 39/256 = 15.2% chance of slot 2
+ db $A5, $06 ; 25/256 = 9.8% chance of slot 3
+ db $BE, $08 ; 25/256 = 9.8% chance of slot 4
+ db $D7, $0A ; 25/256 = 9.8% chance of slot 5
+ db $E4, $0C ; 13/256 = 5.1% chance of slot 6
+ db $F1, $0E ; 13/256 = 5.1% chance of slot 7
+ db $FC, $10 ; 11/256 = 4.3% chance of slot 8
+ db $FF, $12 ; 3/256 = 1.2% chance of slot 9
diff --git a/engine/menu/status_screen.asm b/engine/menu/status_screen.asm
index f95a0710..b5254694 100755
--- a/engine/menu/status_screen.asm
+++ b/engine/menu/status_screen.asm
@@ -1,3 +1,67 @@
+DrawHP: ; 128ef (4:68ef)
+; Draws the HP bar in the stats screen
+ call GetPredefRegisters
+ ld a, $1
+ jr DrawHP_
+
+DrawHP2: ; 128f6 (4:68f6)
+; Draws the HP bar in the party screen
+ call GetPredefRegisters
+ ld a, $2
+
+DrawHP_: ; 128fb (4:68fb)
+ ld [wHPBarType], a
+ push hl
+ ld a, [wLoadedMonHP]
+ ld b, a
+ ld a, [wLoadedMonHP + 1]
+ ld c, a
+ or b
+ jr nz, .nonzeroHP
+ xor a
+ ld c, a
+ ld e, a
+ ld a, $6
+ ld d, a
+ jp .drawHPBarAndPrintFraction
+.nonzeroHP
+ ld a, [wLoadedMonMaxHP]
+ ld d, a
+ ld a, [wLoadedMonMaxHP + 1]
+ ld e, a
+ predef HPBarLength
+ ld a, $6
+ ld d, a
+ ld c, a
+.drawHPBarAndPrintFraction
+ pop hl
+ push de
+ push hl
+ push hl
+ call DrawHPBar
+ pop hl
+ ld a, [hFlags_0xFFF6]
+ bit 0, a
+ jr z, .printFractionBelowBar
+ ld bc, $9 ; right of bar
+ jr .printFraction
+.printFractionBelowBar
+ ld bc, SCREEN_WIDTH + 1 ; below bar
+.printFraction
+ add hl, bc
+ ld de, wLoadedMonHP
+ ld bc, $203
+ call PrintNumber
+ ld a, "/"
+ ld [hli], a
+ ld de, wLoadedMonMaxHP
+ ld bc, $203
+ call PrintNumber
+ pop hl
+ pop de
+ ret
+
+
; Predef 0x37
StatusScreen: ; 12953 (4:6953)
call LoadMonData
diff --git a/engine/overworld/is_player_just_outside_map.asm b/engine/overworld/is_player_just_outside_map.asm
new file mode 100644
index 00000000..24e434b3
--- /dev/null
+++ b/engine/overworld/is_player_just_outside_map.asm
@@ -0,0 +1,16 @@
+; returns whether the player is one tile outside the map in Z
+IsPlayerJustOutsideMap: ; 128d8 (4:68d8)
+ ld a, [W_YCOORD]
+ ld b, a
+ ld a, [W_CURMAPHEIGHT]
+ call .compareCoordWithMapDimension
+ ret z
+ ld a, [W_XCOORD]
+ ld b, a
+ ld a, [W_CURMAPWIDTH]
+.compareCoordWithMapDimension
+ add a
+ cp b
+ ret z
+ inc b
+ ret
diff --git a/main.asm b/main.asm
index cb77e5a3..958c774f 100755
--- a/main.asm
+++ b/main.asm
@@ -1907,7 +1907,7 @@ FieldMoveDisplayData: ; 7823 (1:7823)
db $ff ; list terminator
-INCLUDE "engine/battle/1.asm"
+INCLUDE "engine/battle/moveEffects/drain_hp_effect.asm"
INCLUDE "engine/menu/players_pc.asm"
@@ -4755,7 +4755,7 @@ PlayerCharacterTitleGraphics: INCBIN "gfx/player_title.2bpp"
SECTION "Battle (bank 4)", ROMX, BANK[$4]
-INCLUDE "engine/battle/4.asm"
+INCLUDE "engine/overworld/is_player_just_outside_map.asm"
INCLUDE "engine/menu/status_screen.asm"
INCLUDE "engine/menu/party_menu.asm"
@@ -4766,7 +4766,12 @@ ShrinkPic2:: INCBIN "pic/trainer/shrink2.pic"
INCLUDE "engine/turn_sprite.asm"
INCLUDE "engine/menu/start_sub_menus.asm"
INCLUDE "engine/items/tms.asm"
-INCLUDE "engine/battle/4_2.asm"
+INCLUDE "engine/battle/end_of_battle.asm"
+INCLUDE "engine/battle/wild_encounters.asm"
+INCLUDE "engine/battle/moveEffects/recoil_effect.asm"
+INCLUDE "engine/battle/moveEffects/conversion_effect.asm"
+INCLUDE "engine/battle/moveEffects/haze_effect.asm"
+INCLUDE "engine/battle/get_trainer_name.asm"
INCLUDE "engine/random.asm"