mirror of
https://github.com/pret/pokered.git
synced 2024-10-24 15:27:10 +00:00
119 lines
3.5 KiB
NASM
119 lines
3.5 KiB
NASM
|
; 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<6F>mon can appear in the half-block we<77>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<6F>mon
|
|||
|
; so long as the map is <20>indoor<6F> and has wild pok<6F>mon defined.
|
|||
|
; <20>as long as it<69>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<6F>mon (grass or water) can appear in the half-block we<77>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
|