pokecrystal/engine/flypoints.asm

917 lines
13 KiB
NASM
Executable File

_FlyMap: ; 91af3
call ClearBGPalettes
call ClearTileMap
call ClearSprites
ld hl, hInMenu
ld a, [hl]
push af
ld [hl], $1
xor a
ld [hBGMapMode], a
callba Function8cf53
call Function91ff2
ld de, GFX_922e1
ld hl, VTiles2 tile $30
lb bc, BANK(GFX_922e1), 6
call Request1bpp
call FlyMap
call Function91c8f
ld b, $2
call GetSGBLayout
call SetPalettes
.loop
call JoyTextDelay
ld hl, hJoyPressed
ld a, [hl]
and B_BUTTON
jr nz, .pressedB
ld a, [hl]
and A_BUTTON
jr nz, .pressedA
call FlyMapScroll
call GetMapCursorCoordinates
callba Function8cf69
call DelayFrame
jr .loop
.pressedB
ld a, -1
jr .exit
.pressedA
ld a, [wd002]
ld l, a
ld h, 0
add hl, hl
ld de, Flypoints + 1
add hl, de
ld a, [hl]
.exit
ld [wd002], a
pop af
ld [hInMenu], a
call ClearBGPalettes
ld a, $90
ld [hWY], a
xor a
ld [hBGMapAddress], a
ld a, VBGMap0 / $100
ld [hBGMapAddress + 1], a
ld a, [wd002]
ld e, a
ret
; 91b73
FlyMapScroll: ; 91b73
ld a, [StartFlypoint]
ld e, a
ld a, [EndFlypoint]
ld d, a
ld hl, hJoyLast
ld a, [hl]
and D_UP
jr nz, .ScrollNext
ld a, [hl]
and D_DOWN
jr nz, .ScrollPrev
ret
.ScrollNext
ld hl, wd002
ld a, [hl]
cp d
jr nz, .NotAtEndYet
ld a, e
dec a
ld [hl], a
.NotAtEndYet
inc [hl]
call CheckIfVisitedFlypoint
jr z, .ScrollNext
jr .Finally
.ScrollPrev
ld hl, wd002
ld a, [hl]
cp e
jr nz, .NotAtStartYet
ld a, d
inc a
ld [hl], a
.NotAtStartYet
dec [hl]
call CheckIfVisitedFlypoint
jr z, .ScrollPrev
.Finally
call TownMapBubble
call WaitBGMap
xor a
ld [hBGMapMode], a
ret
; 91bb5
TownMapBubble: ; 91bb5
; Draw the bubble containing the location text in the town map HUD
; Top-left corner
hlcoord 1, 0
ld a, $30
ld [hli], a
; Top row
ld bc, 16
ld a, " "
call ByteFill
; Top-right corner
ld a, $31
ld [hl], a
hlcoord 1, 1
; Middle row
ld bc, 18
ld a, " "
call ByteFill
; Bottom-left corner
hlcoord 1, 2
ld a, $32
ld [hli], a
; Bottom row
ld bc, 16
ld a, " "
call ByteFill
; Bottom-right corner
ld a, $33
ld [hl], a
; Print "Where?"
hlcoord 2, 0
ld de, .Where
call PlaceString
; Print the name of the default flypoint
call .Name
; Up/down arrows
hlcoord 18, 1
ld [hl], $34
ret
.Where
db "Where?@"
.Name
; We need the map location of the default flypoint
ld a, [wd002]
ld l, a
ld h, 0
add hl, hl ; two bytes per flypoint
ld de, Flypoints
add hl, de
ld e, [hl]
callba GetLandmarkName
hlcoord 2, 1
ld de, StringBuffer1
call PlaceString
ret
; 91c17
GetMapCursorCoordinates: ; 91c17
ld a, [wd002]
ld l, a
ld h, $0
add hl, hl
ld de, Flypoints
add hl, de
ld e, [hl]
callba GetLandmarkCoords
ld a, [wd003]
ld c, a
ld a, [wd004]
ld b, a
ld hl, $4
add hl, bc
ld [hl], e
ld hl, $5
add hl, bc
ld [hl], d
ret
; 91c3c
CheckIfVisitedFlypoint: ; 91c3c
; Check if the flypoint loaded in [hl] has been visited yet.
push bc
push de
push hl
ld l, [hl]
ld h, 0
add hl, hl
ld de, Flypoints + 1
add hl, de
ld c, [hl]
call HasVisitedSpawn
pop hl
pop de
pop bc
and a
ret
; 91c50
HasVisitedSpawn: ; 91c50
; Check if spawn point c has been visited.
ld hl, VisitedSpawns
ld b, CHECK_FLAG
ld d, 0
predef FlagPredef
ld a, c
ret
; 91c5e
Flypoints: ; 91c5e
; landmark, spawn point
const_def
flypoint: MACRO
; \1\@FLY EQUS "FLY_\1"
; \1\@SPAWN EQUS "SPAWN_\1"
; const \1\@FLY
; db \2, \1\@SPAWN
const FLY_\1
db \2, SPAWN_\1
ENDM
; Johto
flypoint NEW_BARK, NEW_BARK_TOWN
flypoint CHERRYGROVE, CHERRYGROVE_CITY
flypoint VIOLET, VIOLET_CITY
flypoint AZALEA, AZALEA_TOWN
flypoint GOLDENROD, GOLDENROD_CITY
flypoint ECRUTEAK, ECRUTEAK_CITY
flypoint OLIVINE, OLIVINE_CITY
flypoint CIANWOOD, CIANWOOD_CITY
flypoint MAHOGANY, MAHOGANY_TOWN
flypoint LAKE, LAKE_OF_RAGE
flypoint BLACKTHORN, BLACKTHORN_CITY
flypoint MT_SILVER, SILVER_CAVE
; Kanto
KANTO_FLYPOINT EQU const_value
flypoint PALLET, PALLET_TOWN
flypoint VIRIDIAN, VIRIDIAN_CITY
flypoint PEWTER, PEWTER_CITY
flypoint CERULEAN, CERULEAN_CITY
flypoint VERMILION, VERMILION_CITY
flypoint ROCK_TUNNEL, ROCK_TUNNEL
flypoint LAVENDER, LAVENDER_TOWN
flypoint CELADON, CELADON_CITY
flypoint SAFFRON, SAFFRON_CITY
flypoint FUCHSIA, FUCHSIA_CITY
flypoint CINNABAR, CINNABAR_ISLAND
flypoint INDIGO, INDIGO_PLATEAU
db -1
; 91c8f
Function91c8f: ; 91c8f
ret
; 91c90
FlyMap: ; 91c90
ld a, [MapGroup]
ld b, a
ld a, [MapNumber]
ld c, a
call GetWorldMapLocation
; If we're not in a valid location, i.e. Pokecenter floor 2F,
; the backup map information is used
cp SPECIAL_MAP
jr nz, .CheckRegion
ld a, [BackupMapGroup]
ld b, a
ld a, [BackupMapNumber]
ld c, a
call GetWorldMapLocation
.CheckRegion
; The first 46 locations are part of Johto. The rest are in Kanto
cp KANTO_LANDMARK
jr nc, .KantoFlyMap
.JohtoFlyMap
; Note that .NoKanto should be modified in tandem with this branch
push af
; Start from New Bark Town
ld a, FLY_NEW_BARK
ld [wd002], a
; Flypoints begin at New Bark Town...
ld [StartFlypoint], a
; ..and end at Silver Cave
ld a, FLY_MT_SILVER
ld [EndFlypoint], a
; Fill out the map
call FillJohtoMap
call .MapHud
pop af
call TownMapPlayerIcon
ret
.KantoFlyMap
; The event that there are no flypoints enabled in a map is not
; accounted for. As a result, if you attempt to select a flypoint
; when there are none enabled, the game will crash. Additionally,
; the flypoint selection has a default starting point that
; can be flown to even if none are enabled
; To prevent both of these things from happening when the player
; enters Kanto, fly access is restricted until Indigo Plateau is
; visited and its flypoint enabled
push af
ld c, SPAWN_INDIGO
call HasVisitedSpawn
and a
jr z, .NoKanto
; Kanto's map is only loaded if we've visited Indigo Plateau
; Flypoints begin at Pallet Town...
ld a, FLY_PALLET
ld [StartFlypoint], a
; ...and end at Indigo Plateau
ld a, FLY_INDIGO
ld [EndFlypoint], a
; Because Indigo Plateau is the first flypoint the player
; visits, it's made the default flypoint
ld [wd002], a
; Fill out the map
call FillKantoMap
call .MapHud
pop af
call TownMapPlayerIcon
ret
.NoKanto
; If Indigo Plateau hasn't been visited, we use Johto's map instead
; Start from New Bark Town
ld a, FLY_NEW_BARK
ld [wd002], a
; Flypoints begin at New Bark Town...
ld [StartFlypoint], a
; ..and end at Silver Cave
ld a, FLY_MT_SILVER
ld [EndFlypoint], a
call FillJohtoMap
pop af
.MapHud
call TownMapBubble
call TownMapPals
ld hl, VBGMap0 ; BG Map 0
call TownMapBGUpdate
call TownMapMon
ld a, c
ld [wd003], a
ld a, b
ld [wd004], a
ret
; 91d11
Function91d11: ; 91d11
ld a, [wd002]
push af
ld a, [wd003]
push af
ld a, e
ld [wd002], a
call ClearSprites
xor a
ld [hBGMapMode], a
ld a, $1
ld [hInMenu], a
ld de, GFX_922d1
ld hl, VTiles0 tile $7f
lb bc, BANK(GFX_922d1), 1
call Request2bpp ; actually 1bpp
call Function91ed0
ld hl, VTiles0 tile $78
ld c, $4
call Request2bpp
call Function91ff2
call FillKantoMap
call Function91de9
call TownMapPals
ld hl, VBGMap1
call TownMapBGUpdate
call FillJohtoMap
call Function91de9
call TownMapPals
ld hl, VBGMap0
call TownMapBGUpdate
ld b, $2
call GetSGBLayout
call SetPalettes
xor a
ld [hBGMapMode], a
xor a
call Function91e1e
.asm_91d6e
call JoyTextDelay
ld hl, hJoyPressed
ld a, [hl]
and A_BUTTON | B_BUTTON
jr nz, .asm_91d8f
ld a, [hJoypadDown]
and SELECT
jr nz, .asm_91d87
call Function91d9b
call Function91dcd
jr .asm_91d8a
.asm_91d87
call Function91e5a
.asm_91d8a
call DelayFrame
jr .asm_91d6e
.asm_91d8f
call ClearSprites
pop af
ld [wd003], a
pop af
ld [wd002], a
ret
; 91d9b
Function91d9b: ; 91d9b
ld a, [hl]
and $20
jr nz, .asm_91da6
ld a, [hl]
and $10
jr nz, .asm_91db7
ret
.asm_91da6
ld a, [hWY]
cp $90
ret z
call ClearSprites
ld a, $90
ld [hWY], a
xor a
call Function91e1e
ret
.asm_91db7
ld a, [StatusFlags]
bit 6, a ; hall of fame
ret z
ld a, [hWY]
and a
ret z
call ClearSprites
xor a
ld [hWY], a
ld a, $1
call Function91e1e
ret
; 91dcd
Function91dcd: ; 91dcd
ld a, [hVBlankCounter]
ld e, a
and $f
ret nz
ld a, e
and $10
jr nz, .asm_91ddc
call ClearSprites
ret
.asm_91ddc
hlcoord 0, 0
ld de, Sprites
ld bc, $a0
call CopyBytes
ret
; 91de9
Function91de9: ; 91de9
hlcoord 0, 0
ld bc, SCREEN_WIDTH
ld a, $7f
call ByteFill
hlcoord 0, 1
ld a, $6
ld [hli], a
ld bc, SCREEN_HEIGHT
ld a, $7
call ByteFill
ld [hl], $17
call GetPokemonName
hlcoord 2, 0
call PlaceString
ld h, b
ld l, c
ld de, String_91e16
call PlaceString
ret
; 91e16
String_91e16:
db "'S NEST@"
; 91e1e
Function91e1e: ; 91e1e
ld [wd003], a
ld e, a
callba Function2a01f
decoord 0, 0
ld hl, Sprites
.asm_91e2e
ld a, [de]
and a
jr z, .asm_91e4d
push de
ld e, a
push hl
callba GetLandmarkCoords
pop hl
ld a, d
sub $4
ld [hli], a
ld a, e
sub $4
ld [hli], a
ld a, $7f
ld [hli], a
xor a
ld [hli], a
pop de
inc de
jr .asm_91e2e
.asm_91e4d
ld hl, Sprites
decoord 0, 0
ld bc, $a0
call CopyBytes
ret
; 91e5a
Function91e5a: ; 91e5a
call Function91ea9
ret c
ld a, [wd002]
ld e, a
callba GetLandmarkCoords
ld c, e
ld b, d
ld de, Unknown_91e9c
ld hl, Sprites
.asm_91e70
ld a, [de]
cp $80
jr z, .asm_91e91
add b
ld [hli], a
inc de
ld a, [de]
add c
ld [hli], a
inc de
ld a, [de]
add $78
ld [hli], a
inc de
push bc
ld c, 0
ld a, [PlayerGender]
bit 0, a
jr z, .asm_91e8c
inc c
.asm_91e8c
ld a, c
ld [hli], a
pop bc
jr .asm_91e70
.asm_91e91
ld hl, Sprites + $10
ld bc, SpritesEnd - (Sprites + $10)
xor a
call ByteFill
ret
; 91e9c
Unknown_91e9c: ; 91e9c
db -8, -8, 0
db -8, 0, 1
db 0, -8, 2
db 0, 0, 3
db $80 ; terminator
; 91ea9
Function91ea9: ; 91ea9
ld a, [wd002]
cp FAST_SHIP
jr z, .johto
cp KANTO_LANDMARK
jr c, .johto
.kanto
ld a, [wd003]
and a
jr z, .clear
jr .ok
.johto
ld a, [wd003]
and a
jr nz, .clear
.ok
and a
ret
.clear
ld hl, Sprites
ld bc, SpritesEnd - Sprites
xor a
call ByteFill
scf
ret
; 91ed0
Function91ed0: ; 91ed0
ld a, [wd002]
cp FAST_SHIP
jr z, .asm_91ede
callba GetPlayerIcon
ret
.asm_91ede
ld de, FastShipGFX
ld b, BANK(FastShipGFX)
ret
; 91ee4
TownMapBGUpdate: ; 91ee4
; Update BG Map tiles and attributes
; BG Map address
ld a, l
ld [hBGMapAddress], a
ld a, h
ld [hBGMapAddress + 1], a
; Only update palettes on CGB
ld a, [hCGB]
and a
jr z, .tiles
; BG Map mode 2 (palettes)
ld a, 2
ld [hBGMapMode], a
; The BG Map is updated in thirds, so we wait
; 3 frames to update the whole screen's palettes.
ld c, 3
call DelayFrames
.tiles
; Update BG Map tiles
call WaitBGMap
; Turn off BG Map update
xor a
ld [hBGMapMode], a
ret
; 91eff
FillJohtoMap: ; 91eff
ld de, JohtoMap
jr FillTownMap
FillKantoMap: ; 91f04
ld de, KantoMap
FillTownMap: ; 91f07
hlcoord 0, 0
.loop
ld a, [de]
cp $ff
ret z
ld a, [de]
ld [hli], a
inc de
jr .loop
; 91f13
TownMapPals: ; 91f13
; Assign palettes based on tile ids
hlcoord 0, 0
decoord 0, 0, AttrMap
ld bc, 360
.loop
; Current tile
ld a, [hli]
push hl
; HP/borders use palette 0
cp $60
jr nc, .pal0
; The palette data is condensed to nybbles,
; least-significant first.
ld hl, TownMapPalMap
srl a
jr c, .odd
; Even-numbered tile ids take the bottom nybble...
add l
ld l, a
ld a, h
adc 0
ld h, a
ld a, [hl]
and %111
jr .update
.odd
; ...and odd ids take the top.
add l
ld l, a
ld a, h
adc 0
ld h, a
ld a, [hl]
swap a
and %111
jr .update
.pal0
xor a
.update
pop hl
ld [de], a
inc de
dec bc
ld a, b
or c
jr nz, .loop
ret
TownMapPalMap:
db $11, $21, $22, $00, $11, $13, $54, $54, $11, $21, $22, $00
db $11, $10, $01, $00, $11, $21, $22, $00, $00, $00, $00, $00
db $00, $00, $44, $04, $00, $00, $00, $00, $33, $33, $33, $33
db $33, $33, $33, $03, $33, $33, $33, $33, $00, $00, $00, $00
; 91f7b
TownMapMon: ; 91f7b
; Draw the FlyMon icon at town map location in
; Get FlyMon species
ld a, [CurPartyMon]
ld hl, PartySpecies
ld e, a
ld d, $0
add hl, de
ld a, [hl]
ld [wd265], a
; Get FlyMon icon
ld e, 8 ; starting tile in VRAM
callba GetSpeciesIcon
; Animation/palette
ld de, 0
ld a, $0
call _InitSpriteAnimStruct
ld hl, 3
add hl, bc
ld [hl], 8
ld hl, 2
add hl, bc
ld [hl], 0
ret
; 91fa6
TownMapPlayerIcon: ; 91fa6
; Draw the player icon at town map location in a
push af
callba GetPlayerIcon
; Standing icon
ld hl, VTiles0 tile $10
ld c, 4 ; # tiles
call Request2bpp
; Walking icon
ld hl, $c0
add hl, de
ld d, h
ld e, l
ld hl, VTiles0 tile $14
ld c, 4 ; # tiles
ld a, BANK(ChrisSpriteGFX) ; does nothing
call Request2bpp
; Animation/palette
ld de, 0
ld b, $0a ; Male
ld a, [PlayerGender]
bit 0, a
jr z, .asm_91fd3
ld b, $1e ; Female
.asm_91fd3
ld a, b
call _InitSpriteAnimStruct
ld hl, $3
add hl, bc
ld [hl], $10
pop af
ld e, a
push bc
callba GetLandmarkCoords
pop bc
ld hl, 4
add hl, bc
ld [hl], e
ld hl, 5
add hl, bc
ld [hl], d
ret
; 0x91ff2
Function91ff2: ; 91ff2
ld hl, TownMapGFX
ld de, VTiles2
lb bc, BANK(TownMapGFX), $30
call DecompressRequest2bpp
ret
; 91fff
JohtoMap: ; 91fff
INCBIN "gfx/misc/johto.bin"
; 92168
KantoMap: ; 92168
INCBIN "gfx/misc/kanto.bin"
; 922d1
GFX_922d1: ; 922d1
INCBIN "gfx/unknown/0922d1.2bpp"
GFX_922e1: ; 922e1
INCBIN "gfx/unknown/0922e1.2bpp"
GFX_92301: ; 92301
INCBIN "gfx/unknown/092301.2bpp"