mirror of
https://github.com/thornAvery/kep-hack.git
synced 2025-09-17 02:40:50 +12:00
add code that gives enemies special moves
hg-commit-id: cf9177d9be80
This commit is contained in:
parent
9dc6221168
commit
a715484609
201
pokered.asm
201
pokered.asm
|
@ -1,11 +1,37 @@
|
||||||
; wram locations
|
; wram locations
|
||||||
|
W_CUROPPONENT EQU $D059 ; in a wild battle, this is the species of pokemon
|
||||||
|
; in a trainer battle, this is the trainer class
|
||||||
|
|
||||||
|
W_LONEATTACKNO EQU $D05C ; which entry in LoneAttacks to use
|
||||||
|
W_TRAINERNO EQU $D05D ; which instance of [youngster, lass, etc] is this?
|
||||||
|
|
||||||
|
W_CURENEMYLVL EQU $D127
|
||||||
|
|
||||||
|
W_ISLINKBATTLE EQU $D12B
|
||||||
|
|
||||||
W_CURMAP EQU $D35E
|
W_CURMAP EQU $D35E
|
||||||
|
|
||||||
|
W_RIVALSTARTER EQU $D715
|
||||||
|
|
||||||
W_GRASSRATE EQU $D887
|
W_GRASSRATE EQU $D887
|
||||||
W_GRASSMONS EQU $D888
|
W_GRASSMONS EQU $D888
|
||||||
W_WATERRATE EQU $D8A4
|
W_WATERRATE EQU $D8A4
|
||||||
W_WATERMONS EQU $D8A5
|
W_WATERMONS EQU $D8A5
|
||||||
|
|
||||||
|
W_ENEMYMONCOUNT EQU $D89C
|
||||||
|
|
||||||
|
W_ENEMYMON1MOVE3 EQU $D8AE
|
||||||
|
|
||||||
|
W_ENEMYMON2MOVE3 EQU $D8DA
|
||||||
|
|
||||||
|
W_ENEMYMON3MOVE3 EQU $D906
|
||||||
|
|
||||||
|
W_ENEMYMON4MOVE3 EQU $D932
|
||||||
|
|
||||||
|
W_ENEMYMON5MOVE3 EQU $D95E
|
||||||
|
|
||||||
|
W_ENEMYMON6MOVE3 EQU $D98A
|
||||||
|
|
||||||
|
|
||||||
; pokemon name constants
|
; pokemon name constants
|
||||||
RHYDON EQU $01
|
RHYDON EQU $01
|
||||||
|
@ -1620,14 +1646,181 @@ SECTION "bankD",DATA,BANK[$D]
|
||||||
INCBIN "baserom.gbc",$34000,$4000
|
INCBIN "baserom.gbc",$34000,$4000
|
||||||
|
|
||||||
SECTION "bankE",DATA,BANK[$E]
|
SECTION "bankE",DATA,BANK[$E]
|
||||||
INCBIN "baserom.gbc",$38000,$1D22
|
INCBIN "baserom.gbc",$38000,$1C53
|
||||||
|
|
||||||
; trainer data: from 5D22 to 652E
|
; trainer data: from 5C53 to 652E
|
||||||
|
|
||||||
|
ReadTrainer: ; 5C53
|
||||||
|
|
||||||
|
; don't change any moves in a link battle
|
||||||
|
ld a,[W_ISLINKBATTLE]
|
||||||
|
and a
|
||||||
|
ret nz
|
||||||
|
|
||||||
|
; set [W_ENEMYMONCOUNT] to 0, [$D89D] to FF
|
||||||
|
; first is total enemy pokemon?
|
||||||
|
; second is species of first pokemon?
|
||||||
|
ld hl,W_ENEMYMONCOUNT
|
||||||
|
xor a
|
||||||
|
ld [hli],a
|
||||||
|
dec a
|
||||||
|
ld [hl],a
|
||||||
|
|
||||||
|
; get the pointer to trainer data for this class
|
||||||
|
ld a,[W_CUROPPONENT]
|
||||||
|
sub $C9 ; convert value from pokemon to trainer
|
||||||
|
add a,a
|
||||||
|
ld hl,TrainerDataPointers
|
||||||
|
ld c,a
|
||||||
|
ld b,0
|
||||||
|
add hl,bc ; hl points to trainer class
|
||||||
|
ld a,[hli]
|
||||||
|
ld h,[hl]
|
||||||
|
ld l,a
|
||||||
|
ld a,[W_TRAINERNO]
|
||||||
|
ld b,a
|
||||||
|
; at this point b contains the trainer number,
|
||||||
|
; and hl points to the trainer class.
|
||||||
|
; the next function is to iterate through the trainers,
|
||||||
|
; decrementing b each time, until we get to the right one
|
||||||
|
.outer\@
|
||||||
|
dec b
|
||||||
|
jr z,.IterateTrainer
|
||||||
|
.inner\@
|
||||||
|
ld a,[hli]
|
||||||
|
and a
|
||||||
|
jr nz,.inner\@
|
||||||
|
jr .outer\@
|
||||||
|
|
||||||
|
; if the first byte of trainer data is FF,
|
||||||
|
; - each pokemon has a specific level
|
||||||
|
; (as opposed to the whole team being of the same level)
|
||||||
|
; - if [W_LONEATTACKNO] != 0, one pokemon on the team has a special move
|
||||||
|
; else the first byte is the level of every pokemon on the team
|
||||||
|
.IterateTrainer
|
||||||
|
ld a,[hli]
|
||||||
|
cp $FF ; is the trainer special?
|
||||||
|
jr z,.SpecialTrainer\@ ; if so, check for special attacks
|
||||||
|
ld [W_CURENEMYLVL],a
|
||||||
|
.LoopTrainerData\@
|
||||||
|
ld a,[hli]
|
||||||
|
and a ; have we reached the end of the trainer data?
|
||||||
|
jr z,.FinishUp\@
|
||||||
|
ld [$CF91],a ; write species somewhere (why?)
|
||||||
|
ld a,1
|
||||||
|
ld [$CC49],a
|
||||||
|
push hl
|
||||||
|
call $3927
|
||||||
|
pop hl
|
||||||
|
jr .LoopTrainerData\@
|
||||||
|
.SpecialTrainer\@
|
||||||
|
; if this code is being run:
|
||||||
|
; - each pokemon has a specific level
|
||||||
|
; (as opposed to the whole team being of the same level)
|
||||||
|
; - if [W_LONEATTACKNO] != 0, one pokemon on the team has a special move
|
||||||
|
ld a,[hli]
|
||||||
|
and a ; have we reached the end of the trainer data?
|
||||||
|
jr z,.AddLoneAttack\@
|
||||||
|
ld [W_CURENEMYLVL],a
|
||||||
|
ld a,[hli]
|
||||||
|
ld [$CF91],a
|
||||||
|
ld a,1
|
||||||
|
ld [$CC49],a
|
||||||
|
push hl
|
||||||
|
call $3927
|
||||||
|
pop hl
|
||||||
|
jr .SpecialTrainer\@
|
||||||
|
.AddLoneAttack\@
|
||||||
|
; does the trainer have a single monster with a different move
|
||||||
|
ld a,[W_LONEATTACKNO] ; Brock is 01, Misty is 02, Erika is 04, etc
|
||||||
|
and a
|
||||||
|
jr z,.AddTeamAttack\@
|
||||||
|
dec a
|
||||||
|
add a,a
|
||||||
|
ld c,a
|
||||||
|
ld b,0
|
||||||
|
ld hl,LoneAttacks
|
||||||
|
add hl,bc
|
||||||
|
ld a,[hli]
|
||||||
|
ld d,[hl]
|
||||||
|
ld hl,W_ENEMYMON1MOVE3
|
||||||
|
ld bc,W_ENEMYMON2MOVE3 - W_ENEMYMON1MOVE3
|
||||||
|
call $3A87
|
||||||
|
ld [hl],d
|
||||||
|
jr .FinishUp\@
|
||||||
|
.AddTeamAttack\@
|
||||||
|
; check if our trainer's team has special moves
|
||||||
|
|
||||||
|
; get trainer class number
|
||||||
|
ld a,[$D059]
|
||||||
|
sub $C8
|
||||||
|
ld b,a
|
||||||
|
ld hl,TeamAttacks
|
||||||
|
|
||||||
|
; iterate through entries in TeamAttacks, checking each for our trainer class
|
||||||
|
.IterateTeamAttacks\@
|
||||||
|
ld a,[hli]
|
||||||
|
cp b
|
||||||
|
jr z,.GiveTeamAttacks\@ ; is there a match?
|
||||||
|
inc hl ; if not, go to the next entry
|
||||||
|
inc a
|
||||||
|
jr nz,.IterateTeamAttacks\@
|
||||||
|
|
||||||
|
; no matches found. is this trainer champion rival?
|
||||||
|
ld a,b
|
||||||
|
cp SONY3
|
||||||
|
jr z,.ChampionRival\@
|
||||||
|
jr .FinishUp\@ ; nope
|
||||||
|
.GiveTeamAttacks\@
|
||||||
|
ld a,[hl]
|
||||||
|
ld [$D95E],a
|
||||||
|
jr .FinishUp\@
|
||||||
|
.ChampionRival\@ ; give attacks to his team
|
||||||
|
|
||||||
|
; pidgeot
|
||||||
|
ld a,SKY_ATTACK
|
||||||
|
ld [W_ENEMYMON1MOVE3],a
|
||||||
|
|
||||||
|
; starter
|
||||||
|
ld a,[W_RIVALSTARTER]
|
||||||
|
cp BULBASAUR
|
||||||
|
ld b,MEGA_DRAIN
|
||||||
|
jr z,.GiveStarterMove\@
|
||||||
|
cp CHARMANDER
|
||||||
|
ld b,FIRE_BLAST
|
||||||
|
jr z,.GiveStarterMove\@
|
||||||
|
ld b,BLIZZARD ; must be squirtle
|
||||||
|
.GiveStarterMove\@
|
||||||
|
ld a,b
|
||||||
|
ld [W_ENEMYMON6MOVE3],a
|
||||||
|
.FinishUp\@ ; this needs documenting
|
||||||
|
xor a ; clear D079-D07B
|
||||||
|
ld de,$D079
|
||||||
|
ld [de],a
|
||||||
|
inc de
|
||||||
|
ld [de],a
|
||||||
|
inc de
|
||||||
|
ld [de],a
|
||||||
|
ld a,[W_CURENEMYLVL]
|
||||||
|
ld b,a
|
||||||
|
.LastLoop\@
|
||||||
|
ld hl,$D047
|
||||||
|
ld c,2
|
||||||
|
push bc
|
||||||
|
ld a,$B
|
||||||
|
call $3E6D
|
||||||
|
pop bc
|
||||||
|
inc de
|
||||||
|
inc de
|
||||||
|
dec b
|
||||||
|
jr nz,.LastLoop\@
|
||||||
|
ret
|
||||||
|
|
||||||
LoneAttacks: ; 5D22
|
LoneAttacks: ; 5D22
|
||||||
; these are used for gym leaders.
|
; these are used for gym leaders.
|
||||||
; this is not automatic! you have to write the move you want to $D05C first.
|
; this is not automatic! you have to write the number you want to W_LONEATTACKNO
|
||||||
; e.g., erika's script writes 4 to $D05C to get mega drain.
|
; first. e.g., erika's script writes 4 to W_LONEATTACKNO to get mega drain,
|
||||||
|
; the fourth entry in the list.
|
||||||
|
|
||||||
; first byte: pokemon in the trainer's party that gets the move
|
; first byte: pokemon in the trainer's party that gets the move
|
||||||
; second byte: move
|
; second byte: move
|
||||||
|
|
Loading…
Reference in a new issue