pokecrystal/event/dratini.asm

113 lines
1.8 KiB
NASM

SpecialDratini: ; 0x8b170
; if ScriptVar is 0 or 1, change the moveset of the last Dratini in the party.
; 0: give it a special moveset with Extremespeed.
; 1: give it the normal moveset of a level 15 Dratini.
ld a, [ScriptVar]
cp $2
ret nc
ld bc, PartyCount
ld a, [bc]
ld hl, 0
call GetNthPartyMon
ld a, [bc]
ld c, a
ld de, PARTYMON_STRUCT_LENGTH
.CheckForDratini
; start at the end of the party and search backwards for a Dratini
ld a, [hl]
cp DRATINI
jr z, .GiveMoveset
ld a, l
sub e
ld l, a
ld a, h
sbc d
ld h, a
dec c
jr nz, .CheckForDratini
ret
.GiveMoveset
push hl
ld a, [ScriptVar]
ld hl, .Movesets
ld bc, .Moveset1 - .Moveset0
call AddNTimes
; get address of mon's first move
pop de
rept 2
inc de
endr
.GiveMoves
ld a, [hl]
and a ; is the move 00?
ret z ; if so, we're done here
push hl
push de
ld [de], a ; give the Pokémon the new move
; get the PP of the new move
dec a
ld hl, Moves + MOVE_PP
ld bc, MOVE_LENGTH
call AddNTimes
ld a, BANK(Moves)
call GetFarByte
; get the address of the move's PP and update the PP
ld hl, MON_PP - MON_MOVES
add hl, de
ld [hl], a
pop de
pop hl
inc de
inc hl
jr .GiveMoves
.Movesets
.Moveset0
; Dratini does not normally learn Extremespeed. This is a special gift.
db WRAP
db THUNDER_WAVE
db TWISTER
db EXTREMESPEED
db 0
.Moveset1
; This is the normal moveset of a level 15 Dratini
db WRAP
db LEER
db THUNDER_WAVE
db TWISTER
db 0
GetNthPartyMon: ; 0x8b1ce
; inputs:
; hl must be set to 0 before calling this function.
; a must be set to the number of Pokémon in the party.
; outputs:
; returns the address of the last Pokémon in the party in hl.
; sets carry if a is 0.
ld de, PartyMon1
add hl, de
and a
jr z, .EmptyParty
dec a
ret z
ld de, PARTYMON_STRUCT_LENGTH
.loop
add hl, de
dec a
jr nz, .loop
ret
.EmptyParty
scf
ret
; 8b1e1