shithub: pokecrystal

Download patch

ref: 016174486ff0bf2d4c8365df205daa4f90ed2f4e
parent: f6db9f965ae2bf175a2a96d68bfa4247ab7651a1
parent: 7df002c3e20f1b728b1d29a877c3731d4867f502
author: Bryan Bishop <[email protected]>
date: Sat Feb 2 20:46:07 EST 2013

Merge pull request #98 from Sanky/master

Assorted menu code, will probably regret this.

--- a/constants.asm
+++ b/constants.asm
@@ -8,6 +8,11 @@
 	db \2
 	ENDM
 
+dbw: MACRO
+	db \1
+	dw \2
+	ENDM
+
 dn: MACRO
 	db \1 << 4 + \2
 	ENDM
@@ -48,6 +53,25 @@
 	db \1
 	ENDM
 
+; It's better to use *coord than FuncCoord.
+FuncCoord: MACRO
+Coord = $c4a0 + 20 * \2 + \1
+	ENDM
+
+bccoord: MACRO
+    FuncCoord \1, \2
+    ld bc, Coord
+	ENDM
+	
+decoord: MACRO
+    FuncCoord \1, \2
+    ld de, Coord
+	ENDM
+
+hlcoord: MACRO
+    FuncCoord \1, \2
+    ld hl, Coord
+	ENDM
 
 BULBASAUR  EQU 1
 IVYSAUR    EQU 2
--- a/main.asm
+++ b/main.asm
@@ -1969,7 +1969,7 @@
 
 INCBIN "baserom.gbc",$1024,$1078 - $1024
 
-PlaceString:
+PlaceString: ; $1078
 	push hl
 PlaceNextChar:
 	ld a, [de]
@@ -4499,7 +4499,7 @@
 	dwb $4cdb, $14
 	dwb $4c50, $14
 	dwb $4bdd, $14
-	dwb $5c8a, $13
+	dwb StatsScreenInit, BANK(StatsScreenInit) ; stats screen
 	dwb $4b0a, $14
 	dwb $4b0e, $14
 	dwb $4b7b, $14
@@ -5280,9 +5280,130 @@
 	db "- ? ! ♂ ♀ / . , &"
 	db "lower  DEL   END "
 
+INCBIN "baserom.gbc",$11e5d,$12976 - $11e5d
 
-INCBIN "baserom.gbc",$11e5d,$14000 - $11e5d
+OpenPartyMenu: ; $12976
+	ld a, [PartyCount]
+	and a
+	jr z, .return ; no pokémon in party
+	call $2b29 ; fade in?
+.choosemenu ; 1297f
+	xor a
+	ld [PartyMenuActionText], a ; Choose a POKéMON.
+	call $31f3 ; this is also a predef/special, something with delayframe
+.menu ; 12986
+	ld a, $14
+	ld hl, $404f
+	rst $8 ; load gfx
+	ld a, $14
+	ld hl, $4405
+	rst $8 ; setup menu?
+	ld a, $14
+	ld hl, $43e0
+	rst $8 ; load menu pokémon sprites
+.menunoreload ; 12998
+	ld a, BANK(WritePartyMenuTilemap)
+	ld hl, WritePartyMenuTilemap
+	rst $8
+	ld a, BANK(PrintPartyMenuText)
+	ld hl, PrintPartyMenuText
+	rst $8
+	call $31f6
+	call $32f9 ; load regular palettes?
+	call DelayFrame
+	ld a, BANK(PartyMenuSelect)
+	ld hl, PartyMenuSelect
+	rst $8
+	jr c, .return ; if cancelled or pressed B
+	call PokemonActionSubmenu
+	cp $3
+	jr z, .menu
+	cp $0
+	jr z, .choosemenu
+	cp $1
+	jr z, .menunoreload
+	cp $2
+	jr z, .quit
+.return ; 129c8
+	call $2b3c
+	ld a, $0
+	ret
+.quit ; 129ce
+	ld a, b
+	push af
+	call $2b4d
+	pop af
+	ret
+; 0x129d5
 
+INCBIN "baserom.gbc",$129d5,$12a88 - $129d5
+
+PokemonActionSubmenu ; 0x12a88
+	ld hl, $c5cd ; coord
+	ld bc, $0212 ; box size
+	call $0fb6 ; draw box
+	ld a, $9
+	ld hl, $4d19
+	rst $8
+	call $389c
+	ld a, [$cf74] ; menu selection?
+	ld hl, PokemonSubmenuActionPointerTable
+	ld de, $0003 ; skip 3 bytes each time
+	call IsInArray
+	jr nc, .nothing
+	inc hl
+	ld a, [hli]
+	ld h, [hl]
+	ld l, a
+	jp [hl]
+.nothing
+	ld a, $0
+	ret
+; 0x12ab0
+
+PokemonSubmenuActionPointerTable: ; 0x12ab0
+    dbw $01, $6e1b
+    dbw $02, $6e30
+    dbw $03, $6ebd
+    dbw $04, $6e6a
+    dbw $06, $6e55
+    dbw $07, $6e7f
+    dbw $08, $6ed1
+    dbw $09, $6ea9
+    dbw $0a, $6ee6
+    dbw $0d, $6ee6
+    dbw $0b, $6f26
+    dbw $05, $6e94
+    dbw $0c, $6f3b
+    dbw $0e, $6f50
+    dbw $0f, OpenPartyStats ; stats
+    dbw $10, $6aec ; switch
+    dbw $11, $6b60 ; item
+    dbw $12, $6a79
+    dbw $13, $6fba ; move
+    dbw $14, $6d45 ; mail
+; no terminator?
+; 0x12aec
+
+INCBIN "baserom.gbc",$12aec,$12e00 - $12aec
+
+OpenPartyStats: ; 12e00
+	call $1d6e
+	call $300b
+	xor a
+	ld [MonType], a ; partymon
+	call LowVolume
+	ld a, $25
+	call Predef
+	call MaxVolume
+	call $1d7d
+	ld a, $0
+	ret
+; 0x12e1b
+
+INCBIN "baserom.gbc",$12e1b,$14000 - $12e1b
+
+
 SECTION "bank5",DATA,BANK[$5]
 
 INCBIN "baserom.gbc",$14000,$14032 - $14000
@@ -20673,11 +20794,316 @@
 	ret
 ; 4d87a
 
-INCBIN "baserom.gbc",$4d87a,$50000 - $4d87a
+INCBIN "baserom.gbc",$4d87a,$4dc8a - $4d87a
 
+StatsScreenInit: ; 4dc8a
+	ld hl, StatsScreenMain
+	jr .gotaddress
+	ld hl, $5cf7
+	jr .gotaddress
+.gotaddress
+	ld a, [$ffde]
+	push af
+	xor a
+	ld [$ffde], a ; disable overworld tile animations
+	ld a, [$c2c6] ; whether sprite is to be mirrorred
+	push af
+	ld a, [$cf63]
+	ld b, a
+	ld a, [$cf64]
+	ld c, a
+	push bc
+	push hl
+	call $31f3
+	call $0fc8
+	call $1ad2
+	ld a, $3e
+	ld hl, $753e
+	rst $8 ; this loads graphics
+	pop hl
+	call JpHl
+	call $31f3
+	call $0fc8
+	pop bc
+	; restore old values
+	ld a, b
+	ld [$cf63], a
+	ld a, c
+	ld [$cf64], a
+	pop af
+	ld [$c2c6], a
+	pop af
+	ld [$ffde], a
+	ret
+; 0x4dcd2
+
+StatsScreenMain: ; 0x4dcd2
+	xor a
+	ld [$cf63], a
+	ld [$cf64], a
+	ld a, [$cf64]
+	and $fc
+	or $1
+	ld [$cf64], a
+.loop ; 4dce3
+	ld a, [$cf63]
+	and $7f
+	ld hl, StatsScreenPointerTable
+	rst $28
+	call $5d3a ; check for keys?
+	ld a, [$cf63]
+	bit 7, a
+	jr z, .loop
+	ret
+; 0x4dcf7
+
+INCBIN "baserom.gbc",$4dcf7,$4dd2a - $4dcf7
+
+StatsScreenPointerTable: ; 4dd2a
+    dw $5d72 ; regular pokémon
+    dw EggStatsInit ; egg
+    dw $5de6
+    dw $5dac
+    dw $5dc6
+    dw $5de6
+    dw $5dd6
+    dw $5d6c
+
+; 4dd3a
+
+INCBIN "baserom.gbc",$4dd3a,$4dda1 - $4dd3a
+
+EggStatsInit: ; 4dda1
+	call EggStatsScreen
+	ld a, [$cf63]
+	inc a
+	ld [$cf63], a
+	ret
+; 0x4ddac
+
+INCBIN "baserom.gbc",$4ddac,$4e21e - $4ddac
+
+IDNoString: ; 4e21e
+    db $73, "№.@"
+
+OTString: ; 4e222
+    db "OT/@"
+; 4e226
+
+INCBIN "baserom.gbc",$4e226,$4e33a - $4e226
+
+EggStatsScreen: ; 4e33a
+	xor a
+	ld [$ffd4], a
+	ld hl, $cda1
+	call $334e ; SetHPPal
+	ld b, $3
+	call GetSGBLayout
+	call $5f8f
+	ld de, EggString
+	hlcoord 8, 1 ; $c4bc
+	call PlaceString
+	ld de, IDNoString
+	hlcoord 8, 3 ; $c4e4
+	call PlaceString
+	ld de, OTString
+	hlcoord 8, 5 ; $c50c
+	call PlaceString
+	ld de, FiveQMarkString
+	hlcoord 11, 3 ; $c4e7
+	call PlaceString
+	ld de, FiveQMarkString
+	hlcoord 11, 5 ; $c50f
+	call PlaceString
+	ld a, [$d129] ; egg status
+	ld de, EggSoonString
+	cp $6
+	jr c, .picked
+	ld de, EggCloseString
+	cp $b
+	jr c, .picked
+	ld de, EggMoreTimeString
+	cp $29
+	jr c, .picked
+	ld de, EggALotMoreTimeString
+.picked
+	hlcoord 1, 9 ; $c555
+	call PlaceString
+	ld hl, $cf64
+	set 5, [hl]
+	call $32f9 ; pals
+	call $045a
+	ld hl, TileMap
+	call $3786
+	ld a, $41
+	ld hl, $402d
+	rst $8
+	call $6497
+	ld a, [$d129]
+	cp $6
+	ret nc
+	ld de, $00bb
+	call StartSFX
+	ret
+; 0x4e3c0
+
+EggString: ; 4e3c0
+    db "EGG@"
+
+FiveQMarkString: ; 4e3c4
+    db "?????@"
+
+EggSoonString: ; 0x4e3ca
+    db "It's making sounds", $4e, "inside. It's going", $4e, "to hatch soon!@"
+
+EggCloseString: ; 0x4e3fd
+    db "It moves around", $4e, "inside sometimes.", $4e, "It must be close", $4e, "to hatching.@"
+
+EggMoreTimeString: ; 0x4e43d
+    db "Wonder what's", $4e, "inside? It needs", $4e, "more time, though.@"
+
+EggALotMoreTimeString: ; 0x4e46e
+    db "This EGG needs a", $4e, "lot more time to", $4e, "hatch.@"
+
+; 0x4e497
+
+INCBIN "baserom.gbc",$4e497,$50000 - $4e497
+
 SECTION "bank14",DATA,BANK[$14]
 
-INCBIN "baserom.gbc",$50000,$5097B-$50000
+INCBIN "baserom.gbc",$50000,$5005f-$50000
+
+WritePartyMenuTilemap: ; 0x5005f
+	ld hl, Options
+	ld a, [hl]
+	push af
+	set 4, [hl] ; Disable text delay
+	xor a
+	ld [$ffd4], a
+	ld hl, TileMap
+	ld bc, $0168
+	ld a, " "
+	call $3041 ; blank the tilemap
+	call $4396 ; This reads from a pointer table???
+.asm_50077
+	ld a, [hli]
+	cp $ff
+	jr z, .asm_50084 ; 0x5007a $8
+	push hl
+	ld hl, $4089
+	rst $28
+	pop hl
+	jr .asm_50077 ; 0x50082 $f3
+.asm_50084
+	pop af
+	ld [Options], a
+	ret
+; 0x50089
+
+INCBIN "baserom.gbc",$50089,$50457-$50089
+
+PartyMenuSelect: ; 0x50457
+; sets carry if exitted menu.
+	call $1bc9
+	call $1bee
+	ld a, [PartyCount]
+	inc a
+	ld b, a
+	ld a, [$cfa9] ; menu selection?
+	cp b
+	jr z, .exitmenu ; CANCEL
+	ld [$d0d8], a
+	ld a, [$ffa9]
+	ld b, a
+	bit 1, b
+	jr nz, .exitmenu ; B button?
+	ld a, [$cfa9]
+	dec a
+	ld [CurPartyMon], a
+	ld c, a
+	ld b, $0
+	ld hl, PartySpecies
+	add hl, bc
+	ld a, [hl]
+	ld [CurPartySpecies], a
+	ld de, $0008
+	call StartSFX
+	call WaitSFX
+	and a
+	ret
+.exitmenu
+	ld de, $0008
+	call StartSFX
+	call WaitSFX
+	scf
+	ret
+; 0x5049a
+
+
+PrintPartyMenuText: ; 5049a
+	ld hl, $c5b8
+	ld bc, $0212
+	call $0fe8 ; related to TextBoxBorder
+	ld a, [PartyCount]
+	and a
+	jr nz, .haspokemon
+	ld de, YouHaveNoPKMNString
+	jr .gotstring
+.haspokemon ; 504ae
+	ld a, [PartyMenuActionText]
+	and $f ; drop high nibble
+	ld hl, PartyMenuStrings
+	ld e, a
+	ld d, $0
+	add hl, de
+	add hl, de
+	ld a, [hli]
+	ld d, [hl]
+	ld e, a
+.gotstring ; 504be
+	ld a, [Options]
+	push af
+	set 4, a ; disable text delay
+	ld [Options], a
+	ld hl, $c5e1 ; Coord
+	call PlaceString
+	pop af
+	ld [Options], a
+	ret
+; 0x504d2
+
+PartyMenuStrings: ; 0x504d2
+    dw ChooseAMonString
+    dw UseOnWhichPKMNString
+    dw WhichPKMNString
+    dw TeachWhichPKMNString
+    dw MoveToWhereString
+    dw UseOnWhichPKMNString
+    dw ChooseAMonString ; Probably used to be ChooseAFemalePKMNString
+    dw ChooseAMonString ; Probably used to be ChooseAMalePKMNString
+    dw ToWhichPKMNString
+
+ChooseAMonString: ; 0x504e4
+    db "Choose a #MON.@"
+UseOnWhichPKMNString: ; 0x504f3
+    db "Use on which ", $e1, $e2, "?@"
+WhichPKMNString: ; 0x50504
+    db "Which ", $e1, $e2, "?@"
+TeachWhichPKMNString: ; 0x5050e
+    db "Teach which ", $e1, $e2, "?@"
+MoveToWhereString: ; 0x5051e
+    db "Move to where?@"
+ChooseAFemalePKMNString: ; 0x5052d  ; UNUSED
+    db "Choose a ♀", $e1, $e2, ".@"
+ChooseAMalePKMNString: ; 0x5053b    ; UNUSED
+    db "Choose a ♂", $e1, $e2, ".@"
+ToWhichPKMNString: ; 0x50549
+    db "To which ", $e1, $e2, "?@"
+
+YouHaveNoPKMNString: ; 0x50556
+    db "You have no ", $e1, $e2, "!@"
+
+INCBIN "baserom.gbc",$50566,$5097B-$50566
 
 dw Normal, Fighting, Flying, Poison, Ground, Rock, Bird, Bug, Ghost, Steel
 dw Normal, Normal, Normal, Normal, Normal, Normal, Normal, Normal, Normal
--- a/wram.asm
+++ b/wram.asm
@@ -768,8 +768,13 @@
 ; 0-5
 	ds 1
 
-	ds 57
+	ds 55
 
+PartyMenuActionText ; d141
+    ds 1
+    
+    ds 1
+
 CurPartyLevel: ; d143
 	ds 1
 
@@ -1464,4 +1469,4 @@
 RoamMon3CurHP: ; dfe1
 	ds 1
 RoamMon3DVs: ; dfe2
-	ds 2
\ No newline at end of file
+	ds 2