shithub: pokecrystal

Download patch

ref: 93902a38bd9b9a1a6dd1cbd4b34650549cbc5f35
parent: 572370fb456f6f95ec18b063a63f6d490b065307
author: IIMarckus <[email protected]>
date: Tue Mar 20 18:23:40 EDT 2012

Add code for the Extremespeed Dratini.

--- a/Makefile
+++ b/Makefile
@@ -4,7 +4,7 @@
 
 all: pokecrystal.gbc
 
-pokecrystal.o: pokecrystal.asm main.tx constants.asm ${TEXTFILES}
+pokecrystal.o: pokecrystal.asm main.tx constants.asm wram.asm ${TEXTFILES}
 	rgbasm -o pokecrystal.o pokecrystal.asm
 	
 .asm.tx:
--- a/main.asm
+++ b/main.asm
@@ -1,5 +1,40 @@
 SECTION "bank0",HOME
-INCBIN "baserom.gbc",$0,$4000
+INCBIN "baserom.gbc",$0,$304d
+
+GetFarByte: ; 0x304d
+; retrieve a single byte from a:hl, and return it in a.
+	; bankswitch to new bank
+	ld [$ff00+$8b], a
+	ld a, [$ff00+$9d]
+	push af
+	ld a, [$ff00+$8b]
+	rst $10
+
+	; get byte from new bank
+	ld a, [hl]
+	ld [$ff00+$8b], a
+
+	; bankswitch to previous bank
+	pop af
+	rst $10
+
+	; return retrieved value in a
+	ld a, [$ff00+$8b]
+	ret
+
+INCBIN "baserom.gbc",$305d,$30fe-$305d
+
+AddNTimes ; 0x30fe
+	and a
+	ret z
+.loop
+	add hl, bc
+	dec a
+	jr nz, .loop
+	ret
+; 0x3105
+
+INCBIN "baserom.gbc",$3105,$4000-$3105
 SECTION "bank1",DATA,BANK[$1]
 INCBIN "baserom.gbc",$4000,$4000
 SECTION "bank2",DATA,BANK[$2]
@@ -156,7 +191,7 @@
 	dbw $13,$70bc
 	dbw $22,$6f6b
 	dbw $22,$6fd4
-	dbw $22,$7170
+	dbw BANK(SpecialDratini),SpecialDratini
 	dbw $04,$5485
 	dbw $12,$66e8
 	dbw $12,$6711
@@ -3135,6 +3170,7 @@
 ; characteristics of each move
 ; animation, effect, power, type, accuracy, PP, XXX something else
 	db POUND,$00,40,NORMAL,$ff,35,$00
+Move1:
 	db KARATE_CHOP,$00,50,FIGHTING,$ff,25,$00
 	db DOUBLESLAP,$1d,15,NORMAL,$d8,10,$00
 	db COMET_PUNCH,$1d,18,NORMAL,$d8,15,$00
@@ -3681,8 +3717,124 @@
 INCBIN "baserom.gbc",$80000,$4000
 SECTION "bank21",DATA,BANK[$21]
 INCBIN "baserom.gbc",$84000,$4000
+
 SECTION "bank22",DATA,BANK[$22]
-INCBIN "baserom.gbc",$88000,$4000
+INCBIN "baserom.gbc",$88000,$3170
+
+SpecialDratini: ; 0x8b170
+; if $c2dd 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, [$c2dd]
+	cp $2
+	ret nc
+	ld bc, TeamCount
+	ld a, [bc]
+	ld hl, 0
+	call GetNthTeamMon
+	ld a, [bc]
+	ld c, a
+	ld de, TeamMon2 - TeamMon1
+.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, [$c2dd]
+	ld hl, .Movesets
+	ld bc, .Moveset1 - .Moveset0
+	call AddNTimes
+
+	; get address of mon's first move
+	pop de
+	inc de
+	inc de
+
+.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 + 5
+	ld bc, Move1 - Moves
+	call AddNTimes
+	ld a, BANK(Moves)
+	call GetFarByte
+
+	; get the address of the move's PP and update the PP
+	ld hl, TeamMon1PP - TeamMon1Moves
+	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
+
+
+GetNthTeamMon: ; 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, TeamMon1
+	add hl, de
+	and a
+	jr z, .EmptyParty
+	dec a
+	ret z
+	ld de, TeamMon2 - TeamMon1
+.loop
+	add hl, de
+	dec a
+	jr nz, .loop
+	ret
+.EmptyParty
+	scf
+	ret
+
+INCBIN "baserom.gbc",$8b1e1,$8c000-$8b1e1
+
 SECTION "bank23",DATA,BANK[$23]
 INCBIN "baserom.gbc",$8C000,$4000
 SECTION "bank24",DATA,BANK[$24]
--- a/pokecrystal.asm
+++ b/pokecrystal.asm
@@ -1,2 +1,3 @@
+INCLUDE "wram.asm"
 INCLUDE "constants.asm"
 INCLUDE "main.tx"
--- /dev/null
+++ b/wram.asm
@@ -1,0 +1,67 @@
+SECTION "PlayerTeam",BSS[$dcd7]
+
+TeamCount: ; 0xdcd7
+	ds 1 ; number of Pokémon in party
+TeamSpecies: ; 0xdcd8
+	ds 6 ; species of each Pokémon in party
+; 0xdcde
+; XXX what is this
+	ds 1
+
+TeamMon1:
+TeamMon1Species: ; 0xdcdf
+	ds 1
+TeamMon1Item: ; 0xdce0
+	ds 1
+TeamMon1Moves: ; 0xdce1
+	ds 4
+TeamMon1ID: ; 0xdce5
+	ds 2
+TeamMon1Exp: ; 0xdce7
+	ds 3
+TeamMon1HPExp: ; 0xdcea
+	ds 2
+TeamMon1AtkExp: ; 0xdcec
+	ds 2
+TeamMon1DefExp: ; 0xdcee
+	ds 2
+TeamMon1SpdExp: ; 0xdcf0
+	ds 2
+TeamMon1SpclExp: ; 0xdcf2
+	ds 2
+TeamMon1DVs: ; 0xdcf4
+	ds 2 ; Atk/Def/Spd/Spcl, HP is the high bits of these four nybbles
+TeamMon1PP: ; 0xdcf6
+	ds 4
+TeamMon1Happiness: ; 0xdcfa
+	ds 1
+TeamMon1PokerusStatus: ; 0xdcfb
+	ds 1
+TeamMon1SeerModifier: ; 0xdcfc
+	ds 2
+TeamMon1Level: ; 0xdcfe
+	ds 1
+TeamMon1Status: ; 0xdcff
+	ds 1
+
+; 0xdd00
+; XXX what is this
+	ds 1
+
+TeamMon1CurHP: ; 0xdd01
+	ds 2
+TeamMon1MaxHP: ; 0xdd03
+	ds 2
+TeamMon1Atk: ; 0xdd05
+	ds 2
+TeamMon1Def: ; 0xdd07
+	ds 2
+TeamMon1Spd: ; 0xdd09
+	ds 2
+TeamMon1SpclAtk: ; 0xdd0b
+	ds 2
+TeamMon1SpclDef: ; 0xdd0d
+	ds 2
+
+TeamMon2: ; 0xdd00
+	ds 5 * (TeamMon2 - TeamMon1)