DisplayTownMap: ; 70e3e (1c:4e3e) call LoadTownMap ld hl, wUpdateSpritesEnabled ld a, [hl] push af ld [hl], $ff push hl ld a, $1 ld [hJoy7], a ld a, [W_CURMAP] push af ld b, $0 call DrawPlayerOrBirdSprite ; player sprite hlCoord 1, 0 ld de, wcd6d call PlaceString ld hl, wOAMBuffer ld de, wTileMapBackup ld bc, $10 call CopyData ld hl, vSprites + $40 ld de, TownMapCursor ld bc, (BANK(TownMapCursor) << 8) + $04 call CopyVideoDataDouble xor a ld [wWhichTownMapLocation], a pop af jr .next .changeSelectedLocation ld hl, wTileMap ld bc, $114 call ClearScreenArea ld hl, TownMapOrder ld a, [wWhichTownMapLocation] ld c, a ld b, 0 add hl, bc ld a, [hl] .next ld de, wTownMapCoords call LoadTownMapEntry ld a, [de] push hl call TownMapCoordsToOAMCoords ld a, $4 ld [wOAMBaseTile], a ld hl, wOAMBuffer + $10 call WriteTownMapSpriteOAM ; town map cursor sprite pop hl ld de, wcd6d .copyMapName ld a, [hli] ld [de], a inc de cp $50 jr nz, .copyMapName hlCoord 1, 0 ld de, wcd6d call PlaceString ld hl, wOAMBuffer + $10 ld de, wTileMapBackup + 16 ld bc, $10 call CopyData .inputLoop call TownMapSpriteBlinkingAnimation call JoypadLowSensitivity ld a, [hJoy5] ld b, a and D_UP | D_DOWN | A_BUTTON | B_BUTTON jr z, .inputLoop ld a, (SFX_02_3c - SFX_Headers_02) / 3 call PlaySound bit 6, b jr nz, .pressedUp bit 7, b jr nz, .pressedDown xor a ld [wTownMapSpriteBlinkingEnabled], a ld [hJoy7], a ld [wAnimCounter], a call TownMapCleanUp pop hl pop af ld [hl], a ret .pressedUp ld a, [wWhichTownMapLocation] inc a cp NUM_TOWN_MAP_LOCATIONS jr nz, .skipWrapping1 xor a ; wrap to 0 .skipWrapping1 ld [wWhichTownMapLocation], a jp .changeSelectedLocation .pressedDown ld a, [wWhichTownMapLocation] dec a cp -1 jr nz, .skipWrapping2 ld a, NUM_TOWN_MAP_LOCATIONS - 1 ; wrap to last location .skipWrapping2 ld [wWhichTownMapLocation], a jp .changeSelectedLocation INCLUDE "data/town_map_order.asm" TownMapCursor: ; 70f40 (1c:4f40) INCBIN "gfx/town_map_cursor.1bpp" LoadTownMap_Nest: ; 70f60 (1c:4f60) call LoadTownMap ld hl, wUpdateSpritesEnabled ld a, [hl] push af ld [hl], $ff push hl call Func_711ef call GetMonName hlCoord 1, 0 call PlaceString ld h, b ld l, c ld de, MonsNestText call PlaceString call WaitForTextScrollButtonPress call TownMapCleanUp pop hl pop af ld [hl], a ret MonsNestText: ; 70f89 (1c:4f89) db "'s NEST@" LoadTownMap_Fly: ; 70f90 (1c:4f90) call ClearSprites call LoadTownMap call LoadPlayerSpriteGraphics call LoadFontTilePatterns ld de, BirdSprite ld hl, vSprites + $40 ld bc, (BANK(BirdSprite) << 8) + $0c call CopyVideoData ld de, TownMapUpArrow ld hl, vChars1 + $6d0 ld bc, (BANK(TownMapUpArrow) << 8) + $01 call CopyVideoDataDouble call BuildFlyLocationsList ld hl, wUpdateSpritesEnabled ld a, [hl] push af ld [hl], $ff push hl ld hl, wTileMap ld de, ToText call PlaceString ld a, [W_CURMAP] ld b, $0 call DrawPlayerOrBirdSprite ld hl, wFlyLocationsList deCoord 18, 0 .townMapFlyLoop ld a, $7f ld [de], a push hl push hl hlCoord 3, 0 ld bc, $10f call ClearScreenArea pop hl ld a, [hl] ld b, $4 call DrawPlayerOrBirdSprite ; draw bird sprite hlCoord 3, 0 ld de, wcd6d call PlaceString ld c, 15 call DelayFrames hlCoord 18, 0 ld [hl], $ed hlCoord 19, 0 ld [hl], $ee pop hl .inputLoop push hl call DelayFrame call JoypadLowSensitivity ld a, [hJoy5] ld b, a pop hl and D_UP | D_DOWN | A_BUTTON | B_BUTTON jr z, .inputLoop bit 0, b jr nz, .pressedA ld a, (SFX_02_3c - SFX_Headers_02) / 3 call PlaySound bit 6, b jr nz, .pressedUp bit 7, b jr nz, .pressedDown jr .pressedB .pressedA ld a, (SFX_02_3e - SFX_Headers_02) / 3 call PlaySound ld a, [hl] ld [wDestinationMap], a ld hl, wd732 set 3, [hl] inc hl set 7, [hl] .pressedB xor a ld [wTownMapSpriteBlinkingEnabled], a call GBPalWhiteOutWithDelay3 pop hl pop af ld [hl], a ret .pressedUp deCoord 18, 0 inc hl ld a, [hl] cp $ff jr z, .wrapToStartOfList cp $fe jr z, .pressedUp ; skip past unvisited towns jp .townMapFlyLoop .wrapToStartOfList ld hl, wFlyLocationsList jp .townMapFlyLoop .pressedDown deCoord 19, 0 dec hl ld a, [hl] cp $ff jr z, .wrapToEndOfList cp $fe jr z, .pressedDown ; skip past unvisited towns jp .townMapFlyLoop .wrapToEndOfList ld hl, wFlyLocationsList + 11 jr .pressedDown ToText: ; 7106d (1c:506d) db "To@" BuildFlyLocationsList: ; 71070 (1c:5070) ld hl, wFlyLocationsList - 1 ld [hl], $ff inc hl ld a, [W_TOWNVISITEDFLAG] ld e, a ld a, [W_TOWNVISITEDFLAG + 1] ld d, a ld bc, 11 ; number of towns .loop srl d rr e ld a, $fe ; store $fe if the town hasn't been visited jr nc, .next ld a, b ; store the map number of the town if it has been visited .next ld [hl], a inc hl inc b dec c jr nz, .loop ld [hl], $ff ret TownMapUpArrow: ; 71093 (1c:5093) INCBIN "gfx/up_arrow.1bpp" LoadTownMap: ; 7109b (1c:509b) call GBPalWhiteOutWithDelay3 call ClearScreen call UpdateSprites ld hl, wTileMap ld b, $12 ld c, $12 call TextBoxBorder call DisableLCD ld hl, WorldMapTileGraphics ld de, vChars2 + $600 ld bc, $100 ld a, BANK(WorldMapTileGraphics) call FarCopyData2 ld hl, MonNestIcon ld de, vSprites + $40 ld bc, $8 ld a, BANK(MonNestIcon) call FarCopyDataDouble ld hl, wTileMap ld de, CompressedMap .loop ld a, [de] and a jr z, .done ld b, a and $f ld c, a ld a, b swap a and $f add $60 .writeRunLoop ; write one run of the RLE data ld [hli], a dec c jr nz, .writeRunLoop inc de jr .loop .done call EnableLCD ld b, $2 call GoPAL_SET call Delay3 call GBPalNormal xor a ld [wAnimCounter], a inc a ld [wTownMapSpriteBlinkingEnabled], a ret CompressedMap: ; 71100 (1c:5100) ; you can decompress this file with the redrle program in the extras/ dir INCBIN "gfx/town_map.rle" TownMapCleanUp: ; 711ab (1c:51ab) ; clear town map graphics data and load usual graphics data xor a ld [wTownMapSpriteBlinkingEnabled], a call GBPalWhiteOut call ClearScreen call ClearSprites call LoadPlayerSpriteGraphics call LoadFontTilePatterns call UpdateSprites jp GoPAL_SET_CF1C DrawPlayerOrBirdSprite: ; 711c4 (1c:51c4) ; a = map number ; b = OAM base tile push af ld a, b ld [wOAMBaseTile], a pop af ld de, wTownMapCoords call LoadTownMapEntry ld a, [de] push hl call TownMapCoordsToOAMCoords call WritePlayerOrBirdSpriteOAM pop hl ld de, wcd6d .asm_711dc ld a, [hli] ld [de], a inc de cp $50 jr nz, .asm_711dc ld hl, wOAMBuffer ld de, wTileMapBackup ld bc, $a0 jp CopyData Func_711ef: ; 711ef (1c:51ef) callba FindWildLocationsOfMon call ZeroOutDuplicatesInList ld hl, wOAMBuffer ld de, wTownMapCoords .loop ld a, [de] cp $ff jr z, .loopDone and a jr z, .nextEntry push hl call LoadTownMapEntry pop hl ld a, [de] cp $19 ; Cerulean Cave's coordinates jr z, .nextEntry ; skip Cerulean Cave call TownMapCoordsToOAMCoords ld a, $4 ld [hli], a xor a ld [hli], a .nextEntry inc de jr .loop .loopDone ld a, l and a ; were any OAM entries written? jr nz, .drawPlayerSprite ; if no OAM entries were written, print area unknown text hlCoord 1, 7 ld b, $2 ld c, $f call TextBoxBorder hlCoord 2, 9 ld de, AreaUnknownText call PlaceString jr .done .drawPlayerSprite ld a, [W_CURMAP] ld b, $0 call DrawPlayerOrBirdSprite .done ld hl, wOAMBuffer ld de, wTileMapBackup ld bc, $a0 jp CopyData AreaUnknownText: ; 7124a (1c:524a) db " AREA UNKNOWN@" TownMapCoordsToOAMCoords: ; 71258 (1c:5258) ; 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 24 ld b, a ld [hli], a pop af and $f swap a srl a add 24 ld c, a ld [hli], a ret WritePlayerOrBirdSpriteOAM: ; 7126d (1c:526d) ld a, [wOAMBaseTile] and a ld hl, wOAMBuffer + $90 ; for player sprite jr z, WriteTownMapSpriteOAM ld hl, wOAMBuffer + $80 ; for bird sprite WriteTownMapSpriteOAM: ; 71279 (1c:5279) push hl ld hl, $fcfc add hl, bc ; subtract 4 from c (X coord) and 3 from b (Y coord) ld b, h ld c, l pop hl WriteAsymmetricMonPartySpriteOAM: ; 71281 (1c:5281) ; Writes 4 OAM blocks for a helix mon party sprite, since it does not have ; a vertical line of symmetry. ld de, $202 .loop push de push bc .innerLoop ld a, b ld [hli], a ld a, c ld [hli], a ld a, [wOAMBaseTile] ld [hli], a inc a ld [wOAMBaseTile], a xor a ld [hli], a inc d ld a, $8 add c ld c, a dec e jr nz, .innerLoop pop bc pop de ld a, $8 add b ld b, a dec d jr nz, .loop ret WriteSymmetricMonPartySpriteOAM: ; 712a6 (1c:52a6) ; 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 .loop push de push bc .innerLoop ld a, b ld [hli], a ld a, c ld [hli], a ld a, [wOAMBaseTile] ld [hli], a ld a, [wcd5c] ld [hli], a xor $20 ld [wcd5c], a inc d ld a, $8 add c ld c, a dec e jr nz, .innerLoop pop bc pop de push hl ld hl, wOAMBaseTile inc [hl] inc [hl] pop hl ld a, $8 add b ld b, a dec d jr nz, .loop ret ZeroOutDuplicatesInList: ; 712d9 (1c:52d9) ; replace duplicate bytes in the list of wild pokemon locations with 0 ld de, wBuffer .loop ld a, [de] inc de cp $ff ret z ld c, a ld l, e ld h, d .zeroDuplicatesLoop ld a, [hl] cp $ff jr z, .loop cp c jr nz, .skipZeroing xor a ld [hl], a .skipZeroing inc hl jr .zeroDuplicatesLoop LoadTownMapEntry: ; 712f1 (1c:52f1) ; 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, .external ld bc, 4 ld hl, InternalMapEntries .loop cp [hl] jr c, .foundEntry add hl, bc jr .loop .foundEntry inc hl jr .readEntry .external ld hl, ExternalMapEntries ld c, a ld b, 0 add hl, bc add hl, bc add hl, bc .readEntry ld a, [hli] ld [de], a ld a, [hli] ld h, [hl] ld l, a ret INCLUDE "data/town_map_entries.asm" INCLUDE "text/map_names.asm" MonNestIcon: ; 716be (1c:56be) INCBIN "gfx/mon_nest_icon.1bpp" TownMapSpriteBlinkingAnimation: ; 716c6 (1c:56c6) ld a, [wAnimCounter] inc a cp 25 jr z, .hideSprites cp 50 jr nz, .done ; show sprites when the counter reaches 50 ld hl, wTileMapBackup ld de, wOAMBuffer ld bc, $90 call CopyData xor a jr .done .hideSprites ld hl, wOAMBuffer ld b, $24 ld de, $4 .hideSpritesLoop ld [hl], $a0 add hl, de dec b jr nz, .hideSpritesLoop ld a, 25 .done ld [wAnimCounter], a jp DelayFrame