diff options
Diffstat (limited to 'engine/town_map.asm')
-rwxr-xr-x | engine/town_map.asm | 460 |
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 |