summaryrefslogtreecommitdiff
path: root/engine/battle/wild_encounters.asm
diff options
context:
space:
mode:
authoryenatch <yenatch@gmail.com>2015-04-01 12:56:42 -0400
committeryenatch <yenatch@gmail.com>2015-04-01 12:56:42 -0400
commitc2efe700ac1c5cca88bac710b98388a99665741e (patch)
treeb30d2f676d5ad0d78b959c8ffcf0f8dcfca13943 /engine/battle/wild_encounters.asm
parent52add272c6bca00d2ea827ef7fa4611a4bc41b47 (diff)
parentce9940a2eb89caa9f53507a6d6071f8eaf85ee48 (diff)
Merge pull request #90 from xCrystal/master
Rename/split battle and move effect files. Battle functions, AI, and attack animations
Diffstat (limited to 'engine/battle/wild_encounters.asm')
-rw-r--r--engine/battle/wild_encounters.asm118
1 files changed, 118 insertions, 0 deletions
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