123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- ; try to initiate a wild pokemon encounter
- ; returns success in Z
- TryDoWildEncounter:
- 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, .next
- dec a
- jr z, .lastRepelStep
- ld [wRepelRemainingSteps], a
- .next
- ; determine if wild pokemon 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?
- coord hl, 9, 9
- ld c, [hl]
- ld a, [wGrassTile]
- cp c
- ld a, [wGrassRate]
- jr z, .CanEncounter
- ld a, $14 ; in all tilesets with a water tile, this is its id
- cp c
- ld a, [wWaterRate]
- jr z, .CanEncounter
- ; even if not in grass/water, standing anywhere we can encounter pokemon
- ; so long as the map is "indoor" and has wild pokemon defined.
- ; ...as long as it's not Viridian Forest or Safari Zone.
- ld a, [wCurMap]
- cp REDS_HOUSE_1F ; is this an indoor map?
- jr c, .CantEncounter2
- ld a, [wCurMapTileset]
- cp FOREST ; Viridian Forest/Safari Zone
- jr z, .CantEncounter2
- ld a, [wGrassRate]
- .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 pokemon (grass or water) can appear in the half-block we're standing in
- ld c, [hl]
- ld hl, wGrassMons
- 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, wWaterMons
- ; 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 [wCurEnemyLVL], 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, [wCurEnemyLVL]
- 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, TEXT_REPEL_WORE_OFF
- ld [hSpriteIndexOrTextID], a
- call EnableAutoTextBoxDrawing
- call DisplayTextID
- .CantEncounter2
- ld a, $1
- and a
- ret
- .willEncounter
- xor a
- ret
- WildMonEncounterSlotChances:
- ; 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
|