Add the Ho-oh chamber special, along with some helper functions.

This commit is contained in:
IIMarckus 2012-07-08 01:57:29 -06:00
parent fa019d2f51
commit d23f14000b

206
main.asm
View File

@ -162,7 +162,163 @@ UnknownScript_0x26ef: ; 0x26ef
jumptextfaceplayer $26f2 jumptextfaceplayer $26f2
; 0x26f2 ; 0x26f2
INCBIN "baserom.gbc",$26f2,$2fcb-$26f2 INCBIN "baserom.gbc",$26f2,$2bed-$26f2
GetMapHeaderPointer: ; 0x2bed
; Prior to calling this function, you must have switched banks so that
; MapHeaderPointers is visible.
; inputs:
; b = map group, c = map number
; XXX de = ???
; outputs:
; hl points to the map header
push bc ; save map number for later
; get pointer to map group
dec b
ld c, b
ld b, $0
ld hl, MapHeaderPointers
add hl, bc
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a
pop bc ; restore map number
; find the cth map header
dec c
ld b, $0
ld a, OlivineGym_MapHeader - MapHeader_0x94034
call AddNTimes
ret
GetMapHeaderMember: ; 0x2c04
; Extract a pointer from the current map's header.
; inputs:
; de = offset of desired pointer within the mapheader
; outputs:
; bc = pointer from the current map's
; (e.g., de = $0003 would return a pointer to the secondary map header)
ld a, [MapGroup]
ld b, a
ld a, [MapNumber]
ld c, a
; bankswitch
ld a, [$ff00+$9d]
push af
ld a, BANK(MapHeaderPointers)
rst $10
call GetMapHeaderPointer
add hl, de
ld c, [hl]
inc hl
ld b, [hl]
; bankswitch back
pop af
rst $10
ret
; 0x2c1c
INCBIN "baserom.gbc",$2c1c,$2c7d-$2c1c
GetSecondaryMapHeaderPointer: ; 0x2c7d
; returns the current map's secondary map header pointer in hl.
push bc
push de
ld de, $0003 ; secondary map header pointer (offset within header)
call GetMapHeaderMember
ld l, c
ld h, b
pop de
pop bc
ret
INCBIN "baserom.gbc",$2c8a,$2e6f-$2c8a
BitTable1Func: ; 0x2e6f
ld hl, $da72
call BitTableFunc
ret
BitTableFunc: ; 0x2e76
; Perform a function on a bit in memory.
; inputs:
; b: function
; 0 clear bit
; 1 set bit
; 2 check bit
; de: bit number
; hl: index within bit table
; get index within the byte
ld a, e
and $7
; shift de right by three bits (get the index within memory)
srl d
rr e
srl d
rr e
srl d
rr e
add hl, de
; implement a decoder
ld c, $1
rrca
jr nc, .one
rlc c
.one
rrca
jr nc, .two
rlc c
rlc c
.two
rrca
jr nc, .three
swap c
.three
; check b's value: 0, 1, 2
ld a, b
cp 1
jr c, .clearbit ; 0
jr z, .setbit ; 1
; check bit
ld a, [hl]
and c
ld c, a
ret
.setbit
; set bit
ld a, [hl]
or c
ld [hl], a
ret
.clearbit
; clear bit
ld a, c
cpl
and [hl]
ld [hl], a
ret
; 0x2ead
INCBIN "baserom.gbc",$2ead,$2fcb-$2ead
Function2fcb: ; 0x2fcb Function2fcb: ; 0x2fcb
cp $4 cp $4
@ -699,7 +855,7 @@ SpecialsPointers: ; 0xc029
dbw $5f,$52ce dbw $5f,$52ce
dbw $5f,$753d dbw $5f,$753d
dbw $40,$7612 dbw $40,$7612
dbw $22,$6ddb dbw BANK(SpecialHoOhChamber),SpecialHoOhChamber
dbw $40,$6142 dbw $40,$6142
dbw $12,$589a dbw $12,$589a
dbw $12,$5bf9 dbw $12,$5bf9
@ -49205,7 +49361,22 @@ ClearScreenArea: ; 0x896ff
ret ret
; 0x8971f ; 0x8971f
INCBIN "baserom.gbc",$8971f,$8b170 - $8971f INCBIN "baserom.gbc",$8971f,$8addb - $8971f
SpecialHoOhChamber: ; 0x8addb
ld hl, PartySpecies
ld a, [hl]
cp HO_OH ; is Ho-oh the first Pokémon in the party?
jr nz, .done ; if not, we're done
call GetSecondaryMapHeaderPointer
ld de, $0326
ld b, $1
call BitTable1Func
.done
ret
; 0x8adef
INCBIN "baserom.gbc",$8adef,$8b170 - $8adef
SpecialDratini: ; 0x8b170 SpecialDratini: ; 0x8b170
; if $c2dd is 0 or 1, change the moveset of the last Dratini in the party. ; if $c2dd is 0 or 1, change the moveset of the last Dratini in the party.
@ -49330,7 +49501,34 @@ INCBIN "baserom.gbc",$90000,$4000
SECTION "bank25",DATA,BANK[$25] SECTION "bank25",DATA,BANK[$25]
INCBIN "baserom.gbc",$94000,$94034 - $94000 MapHeaderPointers: ; 0x94000
; pointers to the first map header of each map group
dw MapHeader_0x94034
dw MahoganyRedGyaradosSpeechHouse_MapHeader
dw SproutTower1F_MapHeader
dw EcruteakHouse_MapHeader
dw BlackthornGym1F_MapHeader
dw CinnabarPokeCenter1F_MapHeader
dw CeruleanGymBadgeSpeechHouse_MapHeader
dw AzaleaPokeCenter1F_MapHeader
dw LakeofRageHiddenPowerHouse_MapHeader
dw Route32_MapHeader
dw Route34_MapHeader
dw Route6_MapHeader
dw Route1_MapHeader
dw Route3_MapHeader
dw OlivinePort_MapHeader
dw Route23_MapHeader
dw Route13_MapHeader
dw Route8_MapHeader
dw Route28_MapHeader
dw PokeCenter2F_MapHeader
dw Route7_MapHeader
dw Route40_MapHeader
dw Route2_MapHeader
dw Route26_MapHeader
dw Route5_MapHeader
dw Route30_MapHeader
MapHeader_0x94034: ; 0x94034 MapHeader_0x94034: ; 0x94034
; bank, tileset, permission ; bank, tileset, permission