summaryrefslogtreecommitdiff
path: root/engine/town_map.asm
diff options
context:
space:
mode:
Diffstat (limited to 'engine/town_map.asm')
-rwxr-xr-xengine/town_map.asm460
1 files changed, 237 insertions, 223 deletions
diff --git a/engine/town_map.asm b/engine/town_map.asm
index 5a718519..d417e0a3 100755
--- a/engine/town_map.asm
+++ b/engine/town_map.asm
@@ -1,4 +1,4 @@
-DisplayTownMap: ; 70e3e (1c:4e3e)
+DisplayTownMap:
call LoadTownMap
ld hl, wUpdateSpritesEnabled
ld a, [hl]
@@ -7,11 +7,11 @@ DisplayTownMap: ; 70e3e (1c:4e3e)
push hl
ld a, $1
ld [hJoy7], a
- ld a, [W_CURMAP] ; W_CURMAP
+ ld a, [wCurMap]
push af
ld b, $0
- call Func_711c4
- hlCoord 1, 0
+ call DrawPlayerOrBirdSprite ; player sprite
+ coord hl, 1, 0
ld de, wcd6d
call PlaceString
ld hl, wOAMBuffer
@@ -19,191 +19,190 @@ DisplayTownMap: ; 70e3e (1c:4e3e)
ld bc, $10
call CopyData
ld hl, vSprites + $40
- ld de, TownMapCursor ; $4f40
- ld bc, (BANK(TownMapCursor) << 8) + $04
+ ld de, TownMapCursor
+ lb bc, BANK(TownMapCursor), (TownMapCursorEnd - TownMapCursor) / $8
call CopyVideoDataDouble
xor a
- ld [wWhichTrade], a ; wWhichTrade
+ ld [wWhichTownMapLocation], a
pop af
- jr Func_70e92
+ jr .enterLoop
-Func_70e7e: ; 70e7e (1c:4e7e)
- ld hl, wTileMap
- ld bc, $114
+.townMapLoop
+ coord hl, 0, 0
+ lb bc, 1, 20
call ClearScreenArea
- ld hl, TownMapOrder ; $4f11
- ld a, [wWhichTrade] ; wWhichTrade
+ ld hl, TownMapOrder
+ ld a, [wWhichTownMapLocation]
ld c, a
- ld b, $0
+ ld b, 0
add hl, bc
ld a, [hl]
-
-Func_70e92: ; 70e92 (1c:4e92)
- ld de, wHPBarMaxHP
- call Func_712f1
+.enterLoop
+ ld de, wTownMapCoords
+ call LoadTownMapEntry
ld a, [de]
push hl
- call Func_71258
+ call TownMapCoordsToOAMCoords
ld a, $4
- ld [wcd5b], a
+ ld [wOAMBaseTile], a
ld hl, wOAMBuffer + $10
- call Func_71279
+ call WriteTownMapSpriteOAM ; town map cursor sprite
pop hl
ld de, wcd6d
-.asm_70eac
+.copyMapName
ld a, [hli]
ld [de], a
inc de
cp $50
- jr nz, .asm_70eac
- hlCoord 1, 0
+ jr nz, .copyMapName
+ coord hl, 1, 0
ld de, wcd6d
call PlaceString
ld hl, wOAMBuffer + $10
ld de, wTileMapBackup + 16
ld bc, $10
call CopyData
-.asm_70ec8
+.inputLoop
call TownMapSpriteBlinkingAnimation
call JoypadLowSensitivity
ld a, [hJoy5]
ld b, a
- and $c3
- jr z, .asm_70ec8
- ld a, (SFX_02_3c - SFX_Headers_02) / 3
+ and A_BUTTON | B_BUTTON | D_UP | D_DOWN
+ jr z, .inputLoop
+ ld a, SFX_TINK
call PlaySound
bit 6, b
- jr nz, .asm_70ef2
+ jr nz, .pressedUp
bit 7, b
- jr nz, .asm_70f01
+ jr nz, .pressedDown
xor a
ld [wTownMapSpriteBlinkingEnabled], a
ld [hJoy7], a
- ld [wTownMapSpriteBlinkingCounter], a
- call Func_711ab
+ ld [wAnimCounter], a
+ call ExitTownMap
pop hl
pop af
ld [hl], a
ret
-.asm_70ef2
- ld a, [wWhichTrade] ; wWhichTrade
+.pressedUp
+ ld a, [wWhichTownMapLocation]
inc a
- cp $2f
- jr nz, .asm_70efb
+ cp TownMapOrderEnd - TownMapOrder ; number of list items + 1
+ jr nz, .noOverflow
xor a
-.asm_70efb
- ld [wWhichTrade], a ; wWhichTrade
- jp Func_70e7e
-.asm_70f01
- ld a, [wWhichTrade] ; wWhichTrade
+.noOverflow
+ ld [wWhichTownMapLocation], a
+ jp .townMapLoop
+.pressedDown
+ ld a, [wWhichTownMapLocation]
dec a
- cp $ff
- jr nz, .asm_70f0b
- ld a, $2e
-.asm_70f0b
- ld [wWhichTrade], a ; wWhichTrade
- jp Func_70e7e
+ cp -1
+ jr nz, .noUnderflow
+ ld a, TownMapOrderEnd - TownMapOrder - 1 ; number of list items
+.noUnderflow
+ ld [wWhichTownMapLocation], a
+ jp .townMapLoop
INCLUDE "data/town_map_order.asm"
-TownMapCursor: ; 70f40 (1c:4f40)
+TownMapCursor:
INCBIN "gfx/town_map_cursor.1bpp"
+TownMapCursorEnd:
-LoadTownMap_Nest: ; 70f60 (1c:4f60)
+LoadTownMap_Nest:
call LoadTownMap
ld hl, wUpdateSpritesEnabled
ld a, [hl]
push af
ld [hl], $ff
push hl
- call Func_711ef
+ call DisplayWildLocations
call GetMonName
- hlCoord 1, 0
+ coord hl, 1, 0
call PlaceString
ld h, b
ld l, c
ld de, MonsNestText
call PlaceString
call WaitForTextScrollButtonPress
- call Func_711ab
+ call ExitTownMap
pop hl
pop af
ld [hl], a
ret
-MonsNestText: ; 70f89 (1c:4f89)
+MonsNestText:
db "'s NEST@"
-LoadTownMap_Fly: ; 70f90 (1c:4f90)
+LoadTownMap_Fly:
call ClearSprites
call LoadTownMap
call LoadPlayerSpriteGraphics
call LoadFontTilePatterns
- ld de, BirdSprite ; $4d80
+ ld de, BirdSprite
ld hl, vSprites + $40
- ld bc, (BANK(BirdSprite) << 8) + $0c
+ lb bc, BANK(BirdSprite), $c
call CopyVideoData
- ld de, TownMapUpArrow ; $5093
+ ld de, TownMapUpArrow
ld hl, vChars1 + $6d0
- ld bc, (BANK(TownMapUpArrow) << 8) + $01
+ lb bc, BANK(TownMapUpArrow), (TownMapUpArrowEnd - TownMapUpArrow) / $8
call CopyVideoDataDouble
- call Func_71070
+ call BuildFlyLocationsList
ld hl, wUpdateSpritesEnabled
ld a, [hl]
push af
ld [hl], $ff
push hl
- ld hl, wTileMap
+ coord hl, 0, 0
ld de, ToText
call PlaceString
- ld a, [W_CURMAP] ; W_CURMAP
+ ld a, [wCurMap]
ld b, $0
- call Func_711c4
- ld hl, wTrainerEngageDistance
- deCoord 18, 0
-
+ call DrawPlayerOrBirdSprite
+ ld hl, wFlyLocationsList
+ coord de, 18, 0
.townMapFlyLoop
- ld a, $7f
+ ld a, " "
ld [de], a
push hl
push hl
- hlCoord 3, 0
- ld bc, $10f
+ coord hl, 3, 0
+ lb bc, 1, 15
call ClearScreenArea
pop hl
ld a, [hl]
ld b, $4
- call Func_711c4
- hlCoord 3, 0
+ call DrawPlayerOrBirdSprite ; draw bird sprite
+ coord hl, 3, 0
ld de, wcd6d
call PlaceString
- ld c, $f
+ ld c, 15
call DelayFrames
- hlCoord 18, 0
- ld [hl], $ed
- hlCoord 19, 0
- ld [hl], $ee
+ coord hl, 18, 0
+ ld [hl], "▲"
+ coord hl, 19, 0
+ ld [hl], "▼"
pop hl
-.asm_71004
+.inputLoop
push hl
call DelayFrame
call JoypadLowSensitivity
ld a, [hJoy5]
ld b, a
pop hl
- and $c3
- jr z, .asm_71004
+ and A_BUTTON | B_BUTTON | D_UP | D_DOWN
+ jr z, .inputLoop
bit 0, b
- jr nz, .asm_71026
- ld a, (SFX_02_3c - SFX_Headers_02) / 3
+ jr nz, .pressedA
+ ld a, SFX_TINK
call PlaySound
bit 6, b
- jr nz, .asm_71042
+ jr nz, .pressedUp
bit 7, b
- jr nz, .asm_71058
- jr .asm_71037
-.asm_71026
- ld a, (SFX_02_3e - SFX_Headers_02) / 3
+ jr nz, .pressedDown
+ jr .pressedB
+.pressedA
+ ld a, SFX_HEAL_AILMENT
call PlaySound
ld a, [hl]
ld [wDestinationMap], a
@@ -211,7 +210,7 @@ LoadTownMap_Fly: ; 70f90 (1c:4f90)
set 3, [hl]
inc hl
set 7, [hl]
-.asm_71037
+.pressedB
xor a
ld [wTownMapSpriteBlinkingEnabled], a
call GBPalWhiteOutWithDelay3
@@ -219,86 +218,87 @@ LoadTownMap_Fly: ; 70f90 (1c:4f90)
pop af
ld [hl], a
ret
-.asm_71042
- deCoord 18, 0
+.pressedUp
+ coord de, 18, 0
inc hl
ld a, [hl]
cp $ff
- jr z, .asm_71052
+ jr z, .wrapToStartOfList
cp $fe
- jr z, .asm_71042
+ jr z, .pressedUp ; skip past unvisited towns
jp .townMapFlyLoop
-.asm_71052
- ld hl, wTrainerEngageDistance
+.wrapToStartOfList
+ ld hl, wFlyLocationsList
jp .townMapFlyLoop
-.asm_71058
- deCoord 19, 0
+.pressedDown
+ coord de, 19, 0
dec hl
ld a, [hl]
cp $ff
- jr z, .asm_71068
+ jr z, .wrapToEndOfList
cp $fe
- jr z, .asm_71058
+ jr z, .pressedDown ; skip past unvisited towns
jp .townMapFlyLoop
-.asm_71068
- ld hl, wcd49
- jr .asm_71058
+.wrapToEndOfList
+ ld hl, wFlyLocationsList + 11
+ jr .pressedDown
-ToText: ; 7106d (1c:506d)
+ToText:
db "To@"
-Func_71070: ; 71070 (1c:5070)
- ld hl, wWhichTrade ; wWhichTrade
+BuildFlyLocationsList:
+ ld hl, wFlyLocationsList - 1
ld [hl], $ff
inc hl
- ld a, [W_TOWNVISITEDFLAG]
+ ld a, [wTownVisitedFlag]
ld e, a
- ld a, [W_TOWNVISITEDFLAG + 1]
+ ld a, [wTownVisitedFlag + 1]
ld d, a
- ld bc, $b
-.asm_71081
+ ld bc, SAFFRON_CITY + 1
+.loop
srl d
rr e
- ld a, $fe
- jr nc, .asm_7108a
- ld a, b
-.asm_7108a
+ ld a, $fe ; store $fe if the town hasn't been visited
+ jr nc, .notVisited
+ ld a, b ; store the map number of the town if it has been visited
+.notVisited
ld [hl], a
inc hl
inc b
dec c
- jr nz, .asm_71081
+ jr nz, .loop
ld [hl], $ff
ret
-TownMapUpArrow: ; 71093 (1c:5093)
+TownMapUpArrow:
INCBIN "gfx/up_arrow.1bpp"
+TownMapUpArrowEnd:
-LoadTownMap: ; 7109b (1c:509b)
+LoadTownMap:
call GBPalWhiteOutWithDelay3
call ClearScreen
call UpdateSprites
- ld hl, wTileMap
+ coord hl, 0, 0
ld b, $12
ld c, $12
call TextBoxBorder
call DisableLCD
- ld hl, WorldMapTileGraphics ; $65a8
+ ld hl, WorldMapTileGraphics
ld de, vChars2 + $600
- ld bc, $100
+ ld bc, WorldMapTileGraphicsEnd - WorldMapTileGraphics
ld a, BANK(WorldMapTileGraphics)
call FarCopyData2
- ld hl, MonNestIcon ; $56be
+ ld hl, MonNestIcon
ld de, vSprites + $40
- ld bc, $8
+ ld bc, MonNestIconEnd - MonNestIcon
ld a, BANK(MonNestIcon)
call FarCopyDataDouble
- ld hl, wTileMap
- ld de, CompressedMap ; $5100
-.asm_710d3
+ coord hl, 0, 0
+ ld de, CompressedMap
+.nextTile
ld a, [de]
and a
- jr z, .asm_710e9
+ jr z, .done
ld b, a
and $f
ld c, a
@@ -306,29 +306,30 @@ LoadTownMap: ; 7109b (1c:509b)
swap a
and $f
add $60
-.asm_710e2
+.writeRunLoop
ld [hli], a
dec c
- jr nz, .asm_710e2
+ jr nz, .writeRunLoop
inc de
- jr .asm_710d3
-.asm_710e9
+ jr .nextTile
+.done
call EnableLCD
- ld b, $2
- call GoPAL_SET
+ ld b, SET_PAL_TOWN_MAP
+ call RunPaletteCommand
call Delay3
call GBPalNormal
xor a
- ld [wTownMapSpriteBlinkingCounter], a
+ ld [wAnimCounter], a
inc a
ld [wTownMapSpriteBlinkingEnabled], a
ret
-CompressedMap: ; 71100 (1c:5100)
+CompressedMap:
; you can decompress this file with the redrle program in the extras/ dir
INCBIN "gfx/town_map.rle"
-Func_711ab: ; 711ab (1c:51ab)
+ExitTownMap:
+; clear town map graphics data and load usual graphics data
xor a
ld [wTownMapSpriteBlinkingEnabled], a
call GBPalWhiteOut
@@ -337,117 +338,126 @@ Func_711ab: ; 711ab (1c:51ab)
call LoadPlayerSpriteGraphics
call LoadFontTilePatterns
call UpdateSprites
- jp GoPAL_SET_CF1C
+ jp RunDefaultPaletteCommand
-Func_711c4: ; 711c4 (1c:51c4)
+DrawPlayerOrBirdSprite:
+; a = map number
+; b = OAM base tile
push af
ld a, b
- ld [wcd5b], a
+ ld [wOAMBaseTile], a
pop af
- ld de, wHPBarMaxHP
- call Func_712f1
+ ld de, wTownMapCoords
+ call LoadTownMapEntry
ld a, [de]
push hl
- call Func_71258
- call Func_7126d
+ call TownMapCoordsToOAMCoords
+ call WritePlayerOrBirdSpriteOAM
pop hl
ld de, wcd6d
-.asm_711dc
+.loop
ld a, [hli]
ld [de], a
inc de
- cp $50
- jr nz, .asm_711dc
+ cp "@"
+ jr nz, .loop
ld hl, wOAMBuffer
ld de, wTileMapBackup
ld bc, $a0
jp CopyData
-Func_711ef: ; 711ef (1c:51ef)
+DisplayWildLocations:
callba FindWildLocationsOfMon
- call Func_712d9
+ call ZeroOutDuplicatesInList
ld hl, wOAMBuffer
- ld de, wBuffer
-.asm_71200
+ ld de, wTownMapCoords
+.loop
ld a, [de]
cp $ff
- jr z, .asm_7121d
+ jr z, .exitLoop
and a
- jr z, .asm_7121a
+ jr z, .nextEntry
push hl
- call Func_712f1
+ call LoadTownMapEntry
pop hl
ld a, [de]
- cp $19
- jr z, .asm_7121a
- call Func_71258
- ld a, $4
+ cp $19 ; Cerulean Cave's coordinates
+ jr z, .nextEntry ; skip Cerulean Cave
+ call TownMapCoordsToOAMCoords
+ ld a, $4 ; nest icon tile no.
ld [hli], a
xor a
ld [hli], a
-.asm_7121a
+.nextEntry
inc de
- jr .asm_71200
-.asm_7121d
+ jr .loop
+.exitLoop
ld a, l
- and a
- jr nz, .asm_71236
- hlCoord 1, 7
- ld b, $2
- ld c, $f
+ and a ; were any OAM entries written?
+ jr nz, .drawPlayerSprite
+; if no OAM entries were written, print area unknown text
+ coord hl, 1, 7
+ ld b, 2
+ ld c, 15
call TextBoxBorder
- hlCoord 2, 9
+ coord hl, 2, 9
ld de, AreaUnknownText
call PlaceString
- jr .asm_7123e
-.asm_71236
- ld a, [W_CURMAP] ; W_CURMAP
+ jr .done
+.drawPlayerSprite
+ ld a, [wCurMap]
ld b, $0
- call Func_711c4
-.asm_7123e
+ call DrawPlayerOrBirdSprite
+.done
ld hl, wOAMBuffer
ld de, wTileMapBackup
ld bc, $a0
jp CopyData
-AreaUnknownText: ; 7124a (1c:524a)
+AreaUnknownText:
db " AREA UNKNOWN@"
-Func_71258: ; 71258 (1c:5258)
+TownMapCoordsToOAMCoords:
+; in: lower nybble of a = x, upper nybble of a = y
+; out: b and [hl] = (y * 8) + 24, c and [hl+1] = (x * 8) + 24
push af
and $f0
srl a
- add $18
+ add 24
ld b, a
ld [hli], a
pop af
and $f
swap a
srl a
- add $18
+ add 24
ld c, a
ld [hli], a
ret
-Func_7126d: ; 7126d (1c:526d)
- ld a, [wcd5b]
+WritePlayerOrBirdSpriteOAM:
+ ld a, [wOAMBaseTile]
and a
- ld hl, wOAMBuffer + $90
- jr z, Func_71279
- ld hl, wOAMBuffer + $80
+ ld hl, wOAMBuffer + $90 ; for player sprite
+ jr z, WriteTownMapSpriteOAM
+ ld hl, wOAMBuffer + $80 ; for bird sprite
-Func_71279: ; 71279 (1c:5279)
+WriteTownMapSpriteOAM:
push hl
- ld hl, $fcfc
+
+; Subtract 4 from c (X coord) and 4 from b (Y coord). However, the carry from c
+; is added to b, so the net result is that only 3 is subtracted from b.
+ lb hl, -4, -4
add hl, bc
+
ld b, h
ld c, l
pop hl
-WriteAsymmetricMonPartySpriteOAM: ; 71281 (1c:5281)
-; Writes 4 OAM blocks for a helix mon party sprite, since is does not have
+WriteAsymmetricMonPartySpriteOAM:
+; Writes 4 OAM blocks for a helix mon party sprite, since it does not have
; a vertical line of symmetry.
- ld de, $202
+ lb de, 2, 2
.loop
push de
push bc
@@ -456,51 +466,51 @@ WriteAsymmetricMonPartySpriteOAM: ; 71281 (1c:5281)
ld [hli], a
ld a, c
ld [hli], a
- ld a, [wcd5b]
+ ld a, [wOAMBaseTile]
ld [hli], a
inc a
- ld [wcd5b], a
+ ld [wOAMBaseTile], a
xor a
ld [hli], a
inc d
- ld a, $8
+ ld a, 8
add c
ld c, a
dec e
jr nz, .innerLoop
pop bc
pop de
- ld a, $8
+ ld a, 8
add b
ld b, a
dec d
jr nz, .loop
ret
-WriteSymmetricMonPartySpriteOAM: ; 712a6 (1c:52a6)
+WriteSymmetricMonPartySpriteOAM:
; Writes 4 OAM blocks for a mon party sprite other than a helix. All the
; sprites other than the helix one have a vertical line of symmetry which allows
; the X-flip OAM bit to be used so that only 2 rather than 4 tile patterns are
; needed.
xor a
- ld [wcd5c], a
- ld de, $202
+ ld [wSymmetricSpriteOAMAttributes], a
+ lb de, 2, 2
.loop
push de
push bc
.innerLoop
ld a, b
- ld [hli], a
+ ld [hli], a ; Y
ld a, c
- ld [hli], a
- ld a, [wcd5b]
- ld [hli], a
- ld a, [wcd5c]
- ld [hli], a
- xor $20
- ld [wcd5c], a
+ ld [hli], a ; X
+ ld a, [wOAMBaseTile]
+ ld [hli], a ; tile
+ ld a, [wSymmetricSpriteOAMAttributes]
+ ld [hli], a ; attributes
+ xor (1 << OAM_X_FLIP)
+ ld [wSymmetricSpriteOAMAttributes], a
inc d
- ld a, $8
+ ld a, 8
add c
ld c, a
dec e
@@ -508,20 +518,21 @@ WriteSymmetricMonPartySpriteOAM: ; 712a6 (1c:52a6)
pop bc
pop de
push hl
- ld hl, wcd5b
+ ld hl, wOAMBaseTile
inc [hl]
inc [hl]
pop hl
- ld a, $8
+ ld a, 8
add b
ld b, a
dec d
jr nz, .loop
ret
-Func_712d9: ; 712d9 (1c:52d9)
- ld de, wHPBarMaxHP
-.asm_712dc
+ZeroOutDuplicatesInList:
+; replace duplicate bytes in the list of wild pokemon locations with 0
+ ld de, wBuffer
+.loop
ld a, [de]
inc de
cp $ff
@@ -529,39 +540,41 @@ Func_712d9: ; 712d9 (1c:52d9)
ld c, a
ld l, e
ld h, d
-.asm_712e4
+.zeroDuplicatesLoop
ld a, [hl]
cp $ff
- jr z, .asm_712dc
+ jr z, .loop
cp c
- jr nz, .asm_712ee
+ jr nz, .skipZeroing
xor a
ld [hl], a
-.asm_712ee
+.skipZeroing
inc hl
- jr .asm_712e4
+ jr .zeroDuplicatesLoop
-Func_712f1: ; 712f1 (1c:52f1)
+LoadTownMapEntry:
+; in: a = map number
+; out: lower nybble of [de] = x, upper nybble of [de] = y, hl = address of name
cp REDS_HOUSE_1F
- jr c, .asm_71304
- ld bc, $4
- ld hl, InternalMapEntries ; $5382
-.asm_712fb
+ jr c, .external
+ ld bc, 4
+ ld hl, InternalMapEntries
+.loop
cp [hl]
- jr c, .asm_71301
+ jr c, .foundEntry
add hl, bc
- jr .asm_712fb
-.asm_71301
+ jr .loop
+.foundEntry
inc hl
- jr .asm_7130d
-.asm_71304
- ld hl, ExternalMapEntries ; $5313
+ jr .readEntry
+.external
+ ld hl, ExternalMapEntries
ld c, a
- ld b, $0
+ ld b, 0
add hl, bc
add hl, bc
add hl, bc
-.asm_7130d
+.readEntry
ld a, [hli]
ld [de], a
ld a, [hli]
@@ -573,11 +586,12 @@ INCLUDE "data/town_map_entries.asm"
INCLUDE "text/map_names.asm"
-MonNestIcon: ; 716be (1c:56be)
+MonNestIcon:
INCBIN "gfx/mon_nest_icon.1bpp"
+MonNestIconEnd:
-TownMapSpriteBlinkingAnimation: ; 716c6 (1c:56c6)
- ld a, [wTownMapSpriteBlinkingCounter]
+TownMapSpriteBlinkingAnimation:
+ ld a, [wAnimCounter]
inc a
cp 25
jr z, .hideSprites
@@ -601,5 +615,5 @@ TownMapSpriteBlinkingAnimation: ; 716c6 (1c:56c6)
jr nz, .hideSpritesLoop
ld a, 25
.done
- ld [wTownMapSpriteBlinkingCounter], a
+ ld [wAnimCounter], a
jp DelayFrame