ref: 5aac8afae7a3514b76f684237f3de59e6a27977e
dir: /engine/pokegear.asm/
PokeGear: ; 90b8d (24:4b8d) ld hl, Options ld a, [hl] push af set NO_TEXT_SCROLL, [hl] ld a, [hInMenu] push af ld a, $1 ld [hInMenu], a ld a, [VramState] push af xor a ld [VramState], a call .InitTilemap call DelayFrame .loop call UpdateTime call JoyTextDelay ld a, [wJumptableIndex] bit 7, a jr nz, .done call PokegearJumptable callba PlaySpriteAnimations call DelayFrame jr .loop .done ld de, SFX_READ_TEXT_2 call PlaySFX call WaitSFX pop af ld [VramState], a pop af ld [hInMenu], a pop af ld [Options], a call ClearBGPalettes xor a ld [hBGMapAddress], a ld a, VBGMap0 / $100 ld [hBGMapAddress + 1], a ld a, $90 ld [hWY], a call ExitPokegearRadio_HandleMusic ret .InitTilemap: ; 90bea (24:4bea) call ClearBGPalettes call ClearTileMap call ClearSprites call DisableLCD xor a ld [hSCY], a ld [hSCX], a ld a, $7 ld [hWX], a call Pokegear_LoadGFX callba ClearSpriteAnims call InitPokegearModeIndicatorArrow ld a, 8 call SkipMusic ld a, $e3 ld [rLCDC], a call TownMap_InitCursorAndPlayerIconPositions xor a ld [wJumptableIndex], a ld [wcf64], a ld [wcf65], a ld [wcf66], a ld [wPokegearPhoneScrollPosition], a ld [wPokegearPhoneCursorPosition], a ld [wPokegearPhoneSelectedPerson], a ld [wPokegearRadioChannelBank], a ld [wPokegearRadioChannelAddr], a ld [wPokegearRadioChannelAddr + 1], a call Pokegear_InitJumptableIndices call InitPokegearTilemap ld b, SCGB_POKEGEAR_PALS call GetSGBLayout call SetPalettes ld a, [hCGB] and a ret z ld a, %11100100 call DmgToCgbObjPal0 ret Pokegear_LoadGFX: ; 90c4e call ClearVBank1 ld hl, TownMapGFX ld de, VTiles2 ld a, BANK(TownMapGFX) call FarDecompress ld hl, PokegearGFX ld de, VTiles2 + $30 tiles ld a, BANK(PokegearGFX) call FarDecompress ld hl, PokegearSpritesGFX ld de, VTiles0 ld a, BANK(PokegearSpritesGFX) call Decompress ld a, [MapGroup] ld b, a ld a, [MapNumber] ld c, a call GetWorldMapLocation cp FAST_SHIP jr z, .ssaqua callba GetPlayerIcon push de ld h, d ld l, e ld a, b ; standing sprite push af ld de, VTiles0 tile $10 ld bc, 4 tiles call FarCopyBytes pop af pop hl ; walking sprite ld de, 12 tiles add hl, de ld de, VTiles0 tile $14 ld bc, 4 tiles call FarCopyBytes ret .ssaqua ld hl, FastShipGFX ld de, VTiles0 tile $10 ld bc, 8 tiles call CopyBytes ret ; 90cb2 FastShipGFX: ; 90cb2 INCBIN "gfx/pokegear/fast_ship.2bpp" ; 90d32 InitPokegearModeIndicatorArrow: ; 90d32 (24:4d32) depixel 4, 2, 4, 0 ld a, SPRITE_ANIM_INDEX_POKEGEAR_ARROW call _InitSpriteAnimStruct ld hl, SPRITEANIMSTRUCT_TILE_ID add hl, bc ld [hl], $0 ret AnimatePokegearModeIndicatorArrow: ; 90d41 (24:4d41) ld hl, wcf64 ld e, [hl] ld d, 0 ld hl, .XCoords add hl, de ld a, [hl] ld hl, SPRITEANIMSTRUCT_XOFFSET add hl, bc ld [hl], a ret ; 90d52 (24:4d52) .XCoords: ; 90d52 db $00, $10, $20, $30 ; 90d56 TownMap_GetCurrentLandmark: ; 90d56 ld a, [MapGroup] ld b, a ld a, [MapNumber] ld c, a call GetWorldMapLocation cp SPECIAL_MAP ret nz ld a, [BackupMapGroup] ld b, a ld a, [BackupMapNumber] ld c, a call GetWorldMapLocation ret ; 90d70 TownMap_InitCursorAndPlayerIconPositions: ; 90d70 (24:4d70) ld a, [MapGroup] ld b, a ld a, [MapNumber] ld c, a call GetWorldMapLocation cp FAST_SHIP jr z, .FastShip cp SPECIAL_MAP jr nz, .LoadLandmark ld a, [BackupMapGroup] ld b, a ld a, [BackupMapNumber] ld c, a call GetWorldMapLocation .LoadLandmark: ld [wPokegearMapPlayerIconLandmark], a ld [wPokegearMapCursorLandmark], a ret .FastShip: ld [wPokegearMapPlayerIconLandmark], a ld a, NEW_BARK_TOWN ld [wPokegearMapCursorLandmark], a ret Pokegear_InitJumptableIndices: ; 90d9e (24:4d9e) ld a, $0 ld [wJumptableIndex], a xor a ld [wcf64], a ret InitPokegearTilemap: ; 90da8 (24:4da8) xor a ld [hBGMapMode], a hlcoord 0, 0 ld bc, TileMapEnd - TileMap ld a, $4f call ByteFill ld a, [wcf64] and $3 add a ld e, a ld d, 0 ld hl, .Jumptable add hl, de ld a, [hli] ld h, [hl] ld l, a ld de, .return_from_jumptable push de jp hl .return_from_jumptable call Pokegear_FinishTilemap callba TownMapPals ld a, [wcf65] and a jr nz, .kanto_0 xor a ld [hBGMapAddress], a ld a, VBGMap0 / $100 ld [hBGMapAddress + 1], a call .UpdateBGMap ld a, $90 jr .finish .kanto_0 xor a ld [hBGMapAddress], a ld a, VBGMap1 / $100 ld [hBGMapAddress + 1], a call .UpdateBGMap xor a .finish ld [hWY], a ld a, [wcf65] and 1 xor 1 ld [wcf65], a ret .UpdateBGMap: ; 90e00 (24:4e00) ld a, [hCGB] and a jr z, .dmg ld a, $2 ld [hBGMapMode], a ld c, 3 call DelayFrames .dmg call WaitBGMap ret ; 90e12 (24:4e12) .Jumptable: ; 90e12 dw .Clock dw .Map dw .Phone dw .Radio ; 90e1a .Clock: ; 90e1a ld de, ClockTilemapRLE call Pokegear_LoadTilemapRLE hlcoord 12, 1 ld de, .switch call PlaceString hlcoord 0, 12 lb bc, 4, 18 call TextBox call Pokegear_UpdateClock ret ; 90e36 (24:4e36) .switch db " SWITCH▶@" ; 90e3f .Map: ; 90e3f ld a, [wPokegearMapPlayerIconLandmark] cp FAST_SHIP jr z, .johto cp KANTO_LANDMARK jr nc, .kanto .johto ld e, 0 jr .ok .kanto ld e, 1 .ok callba PokegearMap ld a, $7 ld bc, $12 hlcoord 1, 2 call ByteFill hlcoord 0, 2 ld [hl], $6 hlcoord 19, 2 ld [hl], $17 ld a, [wPokegearMapCursorLandmark] call PokegearMap_UpdateLandmarkName ret ; 90e72 .Radio: ; 90e72 ld de, RadioTilemapRLE call Pokegear_LoadTilemapRLE hlcoord 0, 12 lb bc, 4, 18 call TextBox ret ; 90e82 .Phone: ; 90e82 ld de, PhoneTilemapRLE call Pokegear_LoadTilemapRLE hlcoord 0, 12 lb bc, 4, 18 call TextBox call .PlacePhoneBars call PokegearPhone_UpdateDisplayList ret ; 90e98 .PlacePhoneBars: ; 90e98 (24:4e98) hlcoord 17, 1 ld a, $3c ld [hli], a inc a ld [hl], a hlcoord 17, 2 inc a ld [hli], a call GetMapHeaderPhoneServiceNybble and a ret nz hlcoord 18, 2 ld [hl], $3f ret Pokegear_FinishTilemap: ; 90eb0 (24:4eb0) hlcoord 0, 0 ld bc, $8 ld a, $4f call ByteFill hlcoord 0, 1 ld bc, $8 ld a, $4f call ByteFill ld de, wPokegearFlags ld a, [de] bit 0, a call nz, .PlaceMapIcon ld a, [de] bit 2, a call nz, .PlacePhoneIcon ld a, [de] bit 1, a call nz, .PlaceRadioIcon hlcoord 0, 0 ld a, $46 call .PlacePokegearCardIcon ret .PlaceMapIcon: ; 90ee4 (24:4ee4) hlcoord 2, 0 ld a, $40 jr .PlacePokegearCardIcon .PlacePhoneIcon: ; 90eeb (24:4eeb) hlcoord 4, 0 ld a, $44 jr .PlacePokegearCardIcon .PlaceRadioIcon: ; 90ef2 (24:4ef2) hlcoord 6, 0 ld a, $42 .PlacePokegearCardIcon: ; 90ef7 (24:4ef7) ld [hli], a inc a ld [hld], a ld bc, $14 add hl, bc add $f ld [hli], a inc a ld [hld], a ret PokegearJumptable: ; 90f04 (24:4f04) ld a, [wJumptableIndex] ld e, a ld d, 0 ld hl, .Jumptable add hl, de add hl, de ld a, [hli] ld h, [hl] ld l, a jp hl .Jumptable: ; 90f13 (24:4f13) dw PokegearClock_Init dw PokegearClock_Joypad dw PokegearMap_CheckRegion dw PokegearMap_Init dw PokegearMap_JohtoMap dw PokegearMap_Init dw PokegearMap_KantoMap dw PokegearPhone_Init dw PokegearPhone_Joypad dw PokegearPhone_MakePhoneCall dw PokegearPhone_FinishPhoneCall dw PokegearRadio_Init dw PokegearRadio_Joypad PokegearClock_Init: ; 90f2d (24:4f2d) call InitPokegearTilemap ld hl, PokegearText_PressAnyButtonToExit call PrintText ld hl, wJumptableIndex inc [hl] call ExitPokegearRadio_HandleMusic ret PokegearClock_Joypad: ; 90f3e (24:4f3e) call .UpdateClock ld hl, hJoyLast ld a, [hl] and A_BUTTON + B_BUTTON + START + SELECT jr nz, .quit ld a, [hl] and D_RIGHT ret z ld a, [wPokegearFlags] bit 0, a jr z, .no_map_card ld c, $2 ld b, $1 jr .done .no_map_card ld a, [wPokegearFlags] bit 2, a jr z, .no_phone_card ld c, $7 ld b, $2 jr .done .no_phone_card ld a, [wPokegearFlags] bit 1, a ret z ld c, $b ld b, $3 .done call Pokegear_SwitchPage ret .quit ld hl, wJumptableIndex set 7, [hl] ret .UpdateClock: ; 90f7b (24:4f7b) xor a ld [hBGMapMode], a call Pokegear_UpdateClock ld a, $1 ld [hBGMapMode], a ret Pokegear_UpdateClock: ; 90f86 (24:4f86) hlcoord 3, 5 lb bc, 5, 14 call ClearBox ld a, [hHours] ld b, a ld a, [hMinutes] ld c, a decoord 6, 8 callba PrintHoursMins ld hl, .DayText bccoord 6, 6 call PlaceHLTextAtBC ret ; 90fa8 (24:4fa8) db "ごぜん@" db "ごご@" .DayText: ; 0x90faf text_jump UnknownText_0x1c5821 db "@" ; 0x90fb4 PokegearMap_CheckRegion: ; 90fb4 (24:4fb4) ld a, [wPokegearMapPlayerIconLandmark] cp FAST_SHIP jr z, .johto cp KANTO_LANDMARK jr nc, .kanto .johto ld a, 3 jr .done ret .kanto ld a, 5 .done ld [wJumptableIndex], a call ExitPokegearRadio_HandleMusic ret PokegearMap_Init: ; 90fcd (24:4fcd) call InitPokegearTilemap ld a, [wPokegearMapPlayerIconLandmark] call PokegearMap_InitPlayerIcon ld a, [wPokegearMapCursorLandmark] call PokegearMap_InitCursor ld a, c ld [wPokegearMapCursorObjectPointer], a ld a, b ld [wPokegearMapCursorObjectPointer + 1], a ld hl, wJumptableIndex inc [hl] ret PokegearMap_KantoMap: ; 90fe9 (24:4fe9) call TownMap_GetKantoLandmarkLimits jr PokegearMap_ContinueMap PokegearMap_JohtoMap: ; 90fee (24:4fee) ld d, SILVER_CAVE ld e, NEW_BARK_TOWN PokegearMap_ContinueMap: ; 90ff2 (24:4ff2) ld hl, hJoyLast ld a, [hl] and B_BUTTON jr nz, .cancel ld a, [hl] and D_RIGHT jr nz, .right ld a, [hl] and D_LEFT jr nz, .left call .DPad ret .right ld a, [wPokegearFlags] bit 2, a jr z, .no_phone ld c, $7 ld b, $2 jr .done .no_phone ld a, [wPokegearFlags] bit 1, a ret z ld c, $b ld b, $3 jr .done .left ld c, $0 ld b, $0 .done call Pokegear_SwitchPage ret .cancel ld hl, wJumptableIndex set 7, [hl] ret .DPad: ; 9102f (24:502f) ld hl, hJoyLast ld a, [hl] and D_UP jr nz, .up ld a, [hl] and D_DOWN jr nz, .down ret .up ld hl, wPokegearMapCursorLandmark ld a, [hl] cp d jr c, .wrap_around_up ld a, e dec a ld [hl], a .wrap_around_up inc [hl] jr .done_dpad .down ld hl, wPokegearMapCursorLandmark ld a, [hl] cp e jr nz, .wrap_around_down ld a, d inc a ld [hl], a .wrap_around_down dec [hl] .done_dpad ld a, [wPokegearMapCursorLandmark] call PokegearMap_UpdateLandmarkName ld a, [wPokegearMapCursorObjectPointer] ld c, a ld a, [wPokegearMapCursorObjectPointer + 1] ld b, a ld a, [wPokegearMapCursorLandmark] call PokegearMap_UpdateCursorPosition ret PokegearMap_InitPlayerIcon: ; 9106a push af depixel 0, 0 ld b, SPRITE_ANIM_INDEX_RED_WALK ld a, [PlayerGender] bit 0, a jr z, .got_gender ld b, SPRITE_ANIM_INDEX_BLUE_WALK .got_gender ld a, b call _InitSpriteAnimStruct ld hl, SPRITEANIMSTRUCT_TILE_ID add hl, bc ld [hl], $10 pop af ld e, a push bc callba GetLandmarkCoords pop bc ld hl, SPRITEANIMSTRUCT_XCOORD add hl, bc ld [hl], e ld hl, SPRITEANIMSTRUCT_YCOORD add hl, bc ld [hl], d ret ; 91098 PokegearMap_InitCursor: ; 91098 push af depixel 0, 0 ld a, SPRITE_ANIM_INDEX_POKEGEAR_ARROW call _InitSpriteAnimStruct ld hl, SPRITEANIMSTRUCT_TILE_ID add hl, bc ld [hl], $4 ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID add hl, bc ld [hl], SPRITE_ANIM_SEQ_NULL pop af push bc call PokegearMap_UpdateCursorPosition pop bc ret ; 910b4 PokegearMap_UpdateLandmarkName: ; 910b4 push af hlcoord 8, 0 lb bc, 2, 12 call ClearBox pop af ld e, a push de callba GetLandmarkName pop de callba TownMap_ConvertLineBreakCharacters hlcoord 8, 0 ld [hl], $34 ret ; 910d4 PokegearMap_UpdateCursorPosition: ; 910d4 push bc ld e, a callba GetLandmarkCoords pop bc ld hl, SPRITEANIMSTRUCT_XCOORD add hl, bc ld [hl], e ld hl, SPRITEANIMSTRUCT_YCOORD add hl, bc ld [hl], d ret ; 910e8 TownMap_GetKantoLandmarkLimits: ; 910e8 ld a, [StatusFlags] bit 6, a jr z, .not_hof ld d, ROUTE_28 ld e, PALLET_TOWN ret .not_hof ld d, ROUTE_28 ld e, VICTORY_ROAD ret ; 910f9 PokegearRadio_Init: ; 910f9 (24:50f9) call InitPokegearTilemap depixel 4, 10, 4, 4 ld a, SPRITE_ANIM_INDEX_RADIO_TUNING_KNOB call _InitSpriteAnimStruct ld hl, SPRITEANIMSTRUCT_TILE_ID add hl, bc ld [hl], $8 call _UpdateRadioStation ld hl, wJumptableIndex inc [hl] ret PokegearRadio_Joypad: ; 91112 (24:5112) ld hl, hJoyLast ld a, [hl] and B_BUTTON jr nz, .cancel ld a, [hl] and D_LEFT jr nz, .left ld a, [wPokegearRadioChannelAddr] ld l, a ld a, [wPokegearRadioChannelAddr + 1] ld h, a ld a, [wPokegearRadioChannelBank] and a ret z rst FarCall ret .left ld a, [wPokegearFlags] bit 2, a jr z, .no_phone ld c, $7 ld b, $2 jr .switch_page .no_phone ld a, [wPokegearFlags] bit 0, a jr z, .no_map ld c, $2 ld b, $1 jr .switch_page .no_map ld c, $0 ld b, $0 .switch_page call Pokegear_SwitchPage ret .cancel ld hl, wJumptableIndex set 7, [hl] ret PokegearPhone_Init: ; 91156 (24:5156) ld hl, wJumptableIndex inc [hl] xor a ld [wPokegearPhoneScrollPosition], a ld [wPokegearPhoneCursorPosition], a ld [wPokegearPhoneSelectedPerson], a call InitPokegearTilemap call ExitPokegearRadio_HandleMusic ld hl, PokegearText_WhomToCall call PrintText ret PokegearPhone_Joypad: ; 91171 (24:5171) ld hl, hJoyPressed ld a, [hl] and B_BUTTON jr nz, .b ld a, [hl] and A_BUTTON jr nz, .a ld hl, hJoyLast ld a, [hl] and D_LEFT jr nz, .left ld a, [hl] and D_RIGHT jr nz, .right call PokegearPhone_GetDPad ret .left ld a, [wPokegearFlags] bit 0, a jr z, .no_map ld c, $2 ld b, $1 jr .switch_page .no_map ld c, $0 ld b, $0 jr .switch_page .right ld a, [wPokegearFlags] bit 1, a ret z ld c, $b ld b, $3 .switch_page call Pokegear_SwitchPage ret .b ld hl, wJumptableIndex set 7, [hl] ret .a ld hl, wPhoneList ld a, [wPokegearPhoneScrollPosition] ld e, a ld d, 0 add hl, de ld a, [wPokegearPhoneCursorPosition] ld e, a ld d, 0 add hl, de ld a, [hl] and a ret z ld [wPokegearPhoneSelectedPerson], a hlcoord 1, 4 ld a, [wPokegearPhoneCursorPosition] ld bc, 20 * 2 call AddNTimes ld [hl], "▷" call PokegearPhoneContactSubmenu jr c, .quit_submenu ld hl, wJumptableIndex inc [hl] ret .quit_submenu ld a, $8 ld [wJumptableIndex], a ret PokegearPhone_MakePhoneCall: ; 911eb (24:51eb) call GetMapHeaderPhoneServiceNybble and a jr nz, .no_service ld hl, Options res NO_TEXT_SCROLL, [hl] xor a ld [hInMenu], a ld de, SFX_CALL call PlaySFX ld hl, .dotdotdot call PrintText call WaitSFX ld de, SFX_CALL call PlaySFX ld hl, .dotdotdot call PrintText call WaitSFX ld a, [wPokegearPhoneSelectedPerson] ld b, a call Function90199 ld c, 10 call DelayFrames ld hl, Options set NO_TEXT_SCROLL, [hl] ld a, $1 ld [hInMenu], a call PokegearPhone_UpdateCursor ld hl, wJumptableIndex inc [hl] ret .no_service callba Phone_NoSignal ld hl, .OutOfServiceArea call PrintText ld a, $8 ld [wJumptableIndex], a ld hl, PokegearText_WhomToCall call PrintText ret ; 9124c (24:524c) .dotdotdot ; 0x9124c ; text_jump UnknownText_0x1c5824 db "@" ; 0x91251 .OutOfServiceArea: ; 0x91251 ; You're out of the service area. text_jump UnknownText_0x1c5827 db "@" ; 0x91256 PokegearPhone_FinishPhoneCall: ; 91256 (24:5256) ld a, [hJoyPressed] and A_BUTTON | B_BUTTON ret z callba HangUp ld a, $8 ld [wJumptableIndex], a ld hl, PokegearText_WhomToCall call PrintText ret PokegearPhone_GetDPad: ; 9126d (24:526d) ld hl, hJoyLast ld a, [hl] and D_UP jr nz, .up ld a, [hl] and D_DOWN jr nz, .down ret .up ld hl, wPokegearPhoneCursorPosition ld a, [hl] and a jr z, .scroll_page_up dec [hl] jr .done_joypad_same_page .scroll_page_up ld hl, wPokegearPhoneScrollPosition ld a, [hl] and a ret z dec [hl] jr .done_joypad_update_page .down ld hl, wPokegearPhoneCursorPosition ld a, [hl] cp $3 jr nc, .scroll_page_down inc [hl] jr .done_joypad_same_page .scroll_page_down ld hl, wPokegearPhoneScrollPosition ld a, [hl] cp $6 ret nc inc [hl] jr .done_joypad_update_page .done_joypad_same_page xor a ld [hBGMapMode], a call PokegearPhone_UpdateCursor call WaitBGMap ret .done_joypad_update_page xor a ld [hBGMapMode], a call PokegearPhone_UpdateDisplayList call WaitBGMap ret PokegearPhone_UpdateCursor: ; 912b7 (24:52b7) ld a, " " hlcoord 1, 4 ld [hl], a hlcoord 1, 6 ld [hl], a hlcoord 1, 8 ld [hl], a hlcoord 1, 10 ld [hl], a hlcoord 1, 4 ld a, [wPokegearPhoneCursorPosition] ld bc, 2 * SCREEN_WIDTH call AddNTimes ld [hl], "▶" ret PokegearPhone_UpdateDisplayList: ; 912d8 (24:52d8) hlcoord 1, 3 ld b, 9 ld a, " " .row ld c, 18 .col ld [hli], a dec c jr nz, .col inc hl inc hl dec b jr nz, .row ld a, [wPokegearPhoneScrollPosition] ld e, a ld d, $0 ld hl, wPhoneList add hl, de xor a ld [wPokegearPhoneLoadNameBuffer], a .loop ld a, [hli] push hl push af hlcoord 2, 4 ld a, [wPokegearPhoneLoadNameBuffer] ld bc, 2 * SCREEN_WIDTH call AddNTimes ld d, h ld e, l pop af ld b, a call Function90380 pop hl ld a, [wPokegearPhoneLoadNameBuffer] inc a ld [wPokegearPhoneLoadNameBuffer], a cp $4 jr c, .loop call PokegearPhone_UpdateCursor ret ; 9131e (24:531e) PokegearPhone_DeletePhoneNumber: ; 9131e ld hl, wPhoneList ld a, [wPokegearPhoneScrollPosition] ld e, a ld d, 0 add hl, de ld a, [wPokegearPhoneCursorPosition] ld e, a ld d, 0 add hl, de ld [hl], 0 ld hl, wPhoneList ld c, CONTACT_LIST_SIZE .loop ld a, [hli] and a jr nz, .skip ld a, [hld] ld [hli], a ld [hl], 0 .skip dec c jr nz, .loop ret ; 91342 PokegearPhoneContactSubmenu: ; 91342 (24:5342) ld hl, wPhoneList ld a, [wPokegearPhoneScrollPosition] ld e, a ld d, 0 add hl, de ld a, [wPokegearPhoneCursorPosition] ld e, a ld d, 0 add hl, de ld c, [hl] callba CheckCanDeletePhoneNumber ld a, c and a jr z, .cant_delete ld hl, .CallDeleteCancelJumptable ld de, .CallDeleteCancelStrings jr .got_menu_data .cant_delete ld hl, .CallCancelJumptable ld de, .CallCancelStrings .got_menu_data xor a ld [hBGMapMode], a push hl push de ld a, [de] ld l, a inc de ld a, [de] ld h, a inc de push hl ld bc, hBGMapAddress + 1 add hl, bc ld a, [de] inc de sla a ld b, a ld c, 8 push de call TextBox pop de pop hl inc hl call PlaceString pop de xor a ld [wPokegearPhoneSubmenuCursor], a call .UpdateCursor call WaitBGMap .loop push de call JoyTextDelay pop de ld hl, hJoyPressed ld a, [hl] and D_UP jr nz, .d_up ld a, [hl] and D_DOWN jr nz, .d_down ld a, [hl] and A_BUTTON | B_BUTTON jr nz, .a_b call DelayFrame jr .loop .d_up ld hl, wPokegearPhoneSubmenuCursor ld a, [hl] and a jr z, .loop dec [hl] call .UpdateCursor jr .loop .d_down ld hl, 2 add hl, de ld a, [wPokegearPhoneSubmenuCursor] inc a cp [hl] jr nc, .loop ld [wPokegearPhoneSubmenuCursor], a call .UpdateCursor jr .loop .a_b xor a ld [hBGMapMode], a call PokegearPhone_UpdateDisplayList ld a, $1 ld [hBGMapMode], a pop hl ld a, [hJoyPressed] and B_BUTTON jr nz, .Cancel ld a, [wPokegearPhoneSubmenuCursor] ld e, a ld d, 0 add hl, de add hl, de ld a, [hli] ld h, [hl] ld l, a jp hl .Cancel: ; 913f1 ld hl, PokegearText_WhomToCall call PrintText scf ret ; 913f9 (24:53f9) .Delete: ; 913f9 ld hl, PokegearText_DeleteStoredNumber call MenuTextBox call YesNoBox call ExitMenu jr c, .CancelDelete call PokegearPhone_DeletePhoneNumber xor a ld [hBGMapMode], a call PokegearPhone_UpdateDisplayList ld hl, PokegearText_WhomToCall call PrintText call WaitBGMap .CancelDelete: scf ret ; 9141b .Call: ; 9141b and a ret ; 9141d .UpdateCursor: ; 9141d (24:541d) push de ld a, [de] inc de ld l, a ld a, [de] inc de ld h, a ld a, [de] ld c, a push hl ld a, " " ld de, SCREEN_WIDTH * 2 .clear_column ld [hl], a add hl, de dec c jr nz, .clear_column pop hl ld a, [wPokegearPhoneSubmenuCursor] ld bc, SCREEN_WIDTH * 2 call AddNTimes ld [hl], "▶" pop de ret ; 9143f (24:543f) .CallDeleteCancelStrings: ; 9143f dwcoord 10, 6 db 3 db "CALL" next "DELETE" next "CANCEL" db "@" ; 91455 .CallDeleteCancelJumptable: ; 91455 dw .Call dw .Delete dw .Cancel ; 9145b .CallCancelStrings: ; 9145b dwcoord 10, 8 db 2 db "CALL" next "CANCEL" db "@" ; 9146a .CallCancelJumptable: ; 9146a dw .Call dw .Cancel ; 9146e ; XXX ld a, [hHours] cp 12 jr c, .am sub 12 ld [wd265], a scf ret .am ld [wd265], a and a ret ; 91480 Pokegear_SwitchPage: ; 91480 (24:5480) ld de, SFX_READ_TEXT_2 call PlaySFX ld a, c ld [wJumptableIndex], a ld a, b ld [wcf64], a call DeleteSpriteAnimStruct2ToEnd ret ExitPokegearRadio_HandleMusic: ; 91492 ld a, [wPokegearRadioMusicPlaying] cp $fe jr z, .restart_map_music cp $ff call z, EnterMapMusic xor a ld [wPokegearRadioMusicPlaying], a ret .restart_map_music call RestartMapMusic xor a ld [wPokegearRadioMusicPlaying], a ret ; 914ab DeleteSpriteAnimStruct2ToEnd: ; 914ab (24:54ab) ld hl, SpriteAnim2 ld bc, wSpriteAnimationStructsEnd - SpriteAnim2 xor a call ByteFill ld a, 2 ld [wSpriteAnimCount], a ret Pokegear_LoadTilemapRLE: ; 914bb (24:54bb) ; Format: repeat count, tile ID ; Terminated with $FF hlcoord 0, 0 .loop ld a, [de] cp $ff ret z ld b, a inc de ld a, [de] ld c, a inc de ld a, b .load ld [hli], a dec c jr nz, .load jr .loop ; 914ce (24:54ce) PokegearText_WhomToCall: ; 0x914ce ; Whom do you want to call? text_jump UnknownText_0x1c5847 db "@" ; 0x914d3 PokegearText_PressAnyButtonToExit: ; 0x914d3 ; Press any button to exit. text_jump UnknownText_0x1c5862 db "@" ; 0x914d8 PokegearText_DeleteStoredNumber: ; 0x914d8 ; Delete this stored phone number? text_jump UnknownText_0x1c587d db "@" ; 0x914dd PokegearSpritesGFX: ; 914dd INCBIN "gfx/pokegear/pokegear_sprites.2bpp.lz" ; 9150d RadioTilemapRLE: ; 9150d INCBIN "gfx/pokegear/radio.tilemap.rle" PhoneTilemapRLE: ; 9158a INCBIN "gfx/pokegear/phone.tilemap.rle" ClockTilemapRLE: ; 915db INCBIN "gfx/pokegear/clock.tilemap.rle" ; 9163e _UpdateRadioStation: ; 9163e (24:563e) jr UpdateRadioStation ; called from engine/sprite_anims.asm AnimateTuningKnob: ; 91640 (24:5640) push bc call .TuningKnob pop bc ld a, [wRadioTuningKnob] ld hl, SPRITEANIMSTRUCT_XOFFSET add hl, bc ld [hl], a ret .TuningKnob: ; 9164e (24:564e) ld hl, hJoyLast ld a, [hl] and D_DOWN jr nz, .down ld a, [hl] and D_UP jr nz, .up ret .down ld hl, wRadioTuningKnob ld a, [hl] and a ret z dec [hl] dec [hl] jr .update .up ld hl, wRadioTuningKnob ld a, [hl] cp 80 ret nc inc [hl] inc [hl] .update UpdateRadioStation: ; 9166f (24:566f) ld hl, wRadioTuningKnob ld d, [hl] ld hl, RadioChannels .loop ld a, [hli] cp -1 jr z, .nostation cp d jr z, .foundstation inc hl inc hl jr .loop .nostation call NoRadioStation ret .foundstation ld a, [hli] ld h, [hl] ld l, a ld de, .returnafterstation push de jp hl .returnafterstation ld a, [wPokegearRadioChannelBank] and a ret z xor a ld [hBGMapMode], a hlcoord 2, 9 call PlaceString ld a, $1 ld [hBGMapMode], a ret ; 916a1 (24:56a1) ; XXX ld [wPokegearRadioChannelBank], a ld a, [hli] ld [wPokegearRadioChannelAddr], a ld a, [hli] ld [wPokegearRadioChannelAddr + 1], a ret ; 916ad RadioChannels: ; frequencies and the shows that play on them. ; frequency value given here = 4 × ingame_frequency − 2 dbw 16, .PkmnTalkAndPokedexShow dbw 28, .PokemonMusic dbw 32, .LuckyChannel dbw 40, .BuenasPassword dbw 52, .RuinsOfAlphRadio dbw 64, .PlacesAndPeople dbw 72, .LetsAllSing dbw 78, .PokeFluteRadio dbw 80, .EvolutionRadio db -1 .PkmnTalkAndPokedexShow: ; Pokédex Show in the morning ; Oak's Pokémon Talk in the afternoon and evening call .InJohto jr nc, .NoSignal ld a, [TimeOfDay] and a jp z, LoadStation_PokedexShow jp LoadStation_OaksPokemonTalk .PokemonMusic: call .InJohto jr nc, .NoSignal jp LoadStation_PokemonMusic .LuckyChannel: call .InJohto jr nc, .NoSignal jp LoadStation_LuckyChannel .BuenasPassword: call .InJohto jr nc, .NoSignal jp LoadStation_BuenasPassword .RuinsOfAlphRadio: ld a, [wPokegearMapPlayerIconLandmark] cp RUINS_OF_ALPH jr nz, .NoSignal jp LoadStation_UnownRadio .PlacesAndPeople: call .InJohto jr c, .NoSignal ld a, [wPokegearFlags] bit 3, a jr z, .NoSignal jp LoadStation_PlacesAndPeople .LetsAllSing: call .InJohto jr c, .NoSignal ld a, [wPokegearFlags] bit 3, a jr z, .NoSignal jp LoadStation_LetsAllSing .PokeFluteRadio: call .InJohto jr c, .NoSignal ld a, [wPokegearFlags] bit 3, a jr z, .NoSignal jp LoadStation_PokeFluteRadio .EvolutionRadio: ; This station airs in the Lake of Rage area when Rocket are still in Mahogany. ld a, [StatusFlags] bit 4, a jr z, .NoSignal ld a, [wPokegearMapPlayerIconLandmark] cp MAHOGANY_TOWN jr z, .ok cp ROUTE_43 jr z, .ok cp LAKE_OF_RAGE jr nz, .NoSignal .ok jp LoadStation_EvolutionRadio .NoSignal: call NoRadioStation ret .InJohto: ; if in Johto or on the S.S. Aqua, set carry ; otherwise clear carry ld a, [wPokegearMapPlayerIconLandmark] cp FAST_SHIP jr z, .johto cp KANTO_LANDMARK jr c, .johto .kanto and a ret .johto scf ret LoadStation_OaksPokemonTalk: ; 91753 (24:5753) xor a ; OAKS_POKEMON_TALK ld [wCurrentRadioLine], a ld [wNumRadioLinesPrinted], a ld a, BANK(PlayRadioShow) ld hl, PlayRadioShow call Radio_BackUpFarCallParams ld de, OaksPkmnTalkName ret LoadStation_PokedexShow: ; 91766 (24:5766) ld a, POKEDEX_SHOW ld [wCurrentRadioLine], a xor a ld [wNumRadioLinesPrinted], a ld a, BANK(PlayRadioShow) ld hl, PlayRadioShow call Radio_BackUpFarCallParams ld de, PokedexShowName ret LoadStation_PokemonMusic: ; 9177b (24:577b) ld a, POKEMON_MUSIC ld [wCurrentRadioLine], a xor a ld [wNumRadioLinesPrinted], a ld a, BANK(PlayRadioShow) ld hl, PlayRadioShow call Radio_BackUpFarCallParams ld de, PokemonMusicName ret LoadStation_LuckyChannel: ; 91790 (24:5790) ld a, LUCKY_CHANNEL ld [wCurrentRadioLine], a xor a ld [wNumRadioLinesPrinted], a ld a, BANK(PlayRadioShow) ld hl, PlayRadioShow call Radio_BackUpFarCallParams ld de, LuckyChannelName ret LoadStation_BuenasPassword: ; 917a5 (24:57a5) ld a, BUENAS_PASSWORD ld [wCurrentRadioLine], a xor a ld [wNumRadioLinesPrinted], a ld a, BANK(PlayRadioShow) ld hl, PlayRadioShow call Radio_BackUpFarCallParams ld de, NotBuenasPasswordName ld a, [StatusFlags2] bit 0, a ret z ld de, BuenasPasswordName ret ; 917c3 (24:57c3) BuenasPasswordName: db "BUENA'S PASSWORD@" NotBuenasPasswordName: db "@" LoadStation_UnownRadio: ; 917d5 (24:57d5) ld a, UNOWN_RADIO ld [wCurrentRadioLine], a xor a ld [wNumRadioLinesPrinted], a ld a, BANK(PlayRadioShow) ld hl, PlayRadioShow call Radio_BackUpFarCallParams ld de, UnknownStationName ret LoadStation_PlacesAndPeople: ; 917ea (24:57ea) ld a, PLACES_AND_PEOPLE ld [wCurrentRadioLine], a xor a ld [wNumRadioLinesPrinted], a ld a, BANK(PlayRadioShow) ld hl, PlayRadioShow call Radio_BackUpFarCallParams ld de, PlacesAndPeopleName ret LoadStation_LetsAllSing: ; 917ff (24:57ff) ld a, LETS_ALL_SING ld [wCurrentRadioLine], a xor a ld [wNumRadioLinesPrinted], a ld a, BANK(PlayRadioShow) ld hl, PlayRadioShow call Radio_BackUpFarCallParams ld de, LetsAllSingName ret ; 91814 (24:5814) LoadStation_RocketRadio: ; 91814 ld a, ROCKET_RADIO ld [wCurrentRadioLine], a xor a ld [wNumRadioLinesPrinted], a ld a, BANK(PlayRadioShow) ld hl, PlayRadioShow call Radio_BackUpFarCallParams ld de, LetsAllSingName ret ; 91829 LoadStation_PokeFluteRadio: ; 91829 (24:5829) ld a, POKE_FLUTE_RADIO ld [wCurrentRadioLine], a xor a ld [wNumRadioLinesPrinted], a ld a, BANK(PlayRadioShow) ld hl, PlayRadioShow call Radio_BackUpFarCallParams ld de, PokeFluteStationName ret LoadStation_EvolutionRadio: ; 9183e (24:583e) ld a, EVOLUTION_RADIO ld [wCurrentRadioLine], a xor a ld [wNumRadioLinesPrinted], a ld a, BANK(PlayRadioShow) ld hl, PlayRadioShow call Radio_BackUpFarCallParams ld de, UnknownStationName ret ; 91853 (24:5853) LoadStation_Dummy: ; 91853 ret RadioMusicRestartDE: ; 91854 (24:5854) push de ld a, e ld [wPokegearRadioMusicPlaying], a ld de, MUSIC_NONE call PlayMusic pop de ld a, e ld [wMapMusic], a call PlayMusic ret RadioMusicRestartPokemonChannel: ; 91868 (24:5868) push de ld a, $fe ld [wPokegearRadioMusicPlaying], a ld de, MUSIC_NONE call PlayMusic pop de ld de, MUSIC_POKEMON_CHANNEL call PlayMusic ret Radio_BackUpFarCallParams: ; 9187c (24:587c) ld [wPokegearRadioChannelBank], a ld a, l ld [wPokegearRadioChannelAddr], a ld a, h ld [wPokegearRadioChannelAddr + 1], a ret NoRadioStation: ; 91888 (24:5888) call NoRadioMusic call NoRadioName xor a ld [wPokegearRadioChannelBank], a ld [wPokegearRadioChannelAddr], a ld [wPokegearRadioChannelAddr + 1], a ld a, $1 ld [hBGMapMode], a ret NoRadioMusic: ; 9189d (24:589d) ld de, MUSIC_NONE call PlayMusic ld a, $ff ld [wPokegearRadioMusicPlaying], a ret NoRadioName: ; 918a9 (24:58a9) xor a ld [hBGMapMode], a hlcoord 1, 8 lb bc, 3, 18 call ClearBox hlcoord 0, 12 ld bc, $412 call TextBox ret ; 918bf OaksPkmnTalkName: db "OAK's <PK><MN> Talk@" PokedexShowName: db "#DEX Show@" PokemonMusicName: db "#MON Music@" LuckyChannelName: db "Lucky Channel@" UnknownStationName: db "?????@" PlacesAndPeopleName: db "Places & People@" LetsAllSingName: db "Let's All Sing!@" PokeFluteStationName: db "# FLUTE@" ; 9191c _TownMap: ; 9191c ld hl, Options ld a, [hl] push af set NO_TEXT_SCROLL, [hl] ld a, [hInMenu] push af ld a, $1 ld [hInMenu], a ld a, [VramState] push af xor a ld [VramState], a call ClearBGPalettes call ClearTileMap call ClearSprites call DisableLCD call Pokegear_LoadGFX callba ClearSpriteAnims ld a, 8 call SkipMusic ld a, $e3 ld [rLCDC], a call TownMap_GetCurrentLandmark ld [wTownMapPlayerIconLandmark], a ld [wTownMapCursorLandmark], a xor a ld [hBGMapMode], a call .InitTilemap call WaitBGMap2 ld a, [wTownMapPlayerIconLandmark] call PokegearMap_InitPlayerIcon ld a, [wTownMapCursorLandmark] call PokegearMap_InitCursor ld a, c ld [wTownMapCursorObjectPointer], a ld a, b ld [wTownMapCursorObjectPointer + 1], a ld b, SCGB_POKEGEAR_PALS call GetSGBLayout call SetPalettes ld a, [hCGB] and a jr z, .dmg ld a, %11100100 call DmgToCgbObjPal0 call DelayFrame .dmg ld a, [wTownMapPlayerIconLandmark] cp KANTO_LANDMARK jr nc, .kanto ld d, KANTO_LANDMARK - 1 ld e, 1 call .loop jr .resume .kanto call TownMap_GetKantoLandmarkLimits call .loop .resume pop af ld [VramState], a pop af ld [hInMenu], a pop af ld [Options], a call ClearBGPalettes ret .loop call JoyTextDelay ld hl, hJoyPressed ld a, [hl] and B_BUTTON ret nz ld hl, hJoyLast ld a, [hl] and D_UP jr nz, .pressed_up ld a, [hl] and D_DOWN jr nz, .pressed_down .loop2 push de callba PlaySpriteAnimations pop de call DelayFrame jr .loop .pressed_up ld hl, wTownMapCursorLandmark ld a, [hl] cp d jr c, .okay ld a, e dec a ld [hl], a .okay inc [hl] jr .next .pressed_down ld hl, wTownMapCursorLandmark ld a, [hl] cp e jr nz, .okay2 ld a, d inc a ld [hl], a .okay2 dec [hl] .next push de ld a, [wTownMapCursorLandmark] call PokegearMap_UpdateLandmarkName ld a, [wTownMapCursorObjectPointer] ld c, a ld a, [wTownMapCursorObjectPointer + 1] ld b, a ld a, [wTownMapCursorLandmark] call PokegearMap_UpdateCursorPosition pop de jr .loop2 ; 91a04 .InitTilemap: ; 91a04 ld a, [wTownMapPlayerIconLandmark] cp KANTO_LANDMARK jr nc, .kanto2 ld e, $0 jr .okay_tilemap .kanto2 ld e, $1 .okay_tilemap callba PokegearMap ld a, $7 ld bc, 6 hlcoord 1, 0 call ByteFill hlcoord 0, 0 ld [hl], $6 hlcoord 7, 0 ld [hl], $17 hlcoord 7, 1 ld [hl], $16 hlcoord 7, 2 ld [hl], $26 ld a, $7 ld bc, NAME_LENGTH hlcoord 8, 2 call ByteFill hlcoord 19, 2 ld [hl], $17 ld a, [wTownMapCursorLandmark] call PokegearMap_UpdateLandmarkName callba TownMapPals ret ; 91a53 PlayRadio: ; 91a53 ld hl, Options ld a, [hl] push af set 4, [hl] call .PlayStation ld c, 100 call DelayFrames .loop call JoyTextDelay ld a, [hJoyPressed] and A_BUTTON | B_BUTTON jr nz, .stop ld a, [wPokegearRadioChannelAddr] ld l, a ld a, [wPokegearRadioChannelAddr + 1] ld h, a ld a, [wPokegearRadioChannelBank] and a jr z, .zero rst FarCall .zero call DelayFrame jr .loop .stop pop af ld [Options], a call ExitPokegearRadio_HandleMusic ret ; 91a87 .PlayStation: ; 91a87 ld a, -1 ld [EnemyTurnsTaken], a ld hl, .StationPointers ld d, $0 add hl, de add hl, de ld a, [hli] ld h, [hl] ld l, a ld de, .jump_return push de jp hl .jump_return push de hlcoord 0, 12 lb bc, 4, 18 call TextBox hlcoord 1, 14 ld [hl], $72 pop de hlcoord 2, 14 call PlaceString ld h, b ld l, c ld [hl], $73 call WaitBGMap ret ; 91ab9 .StationPointers: ; 91ab9 dw .OakOrPnP dw LoadStation_OaksPokemonTalk dw LoadStation_PokedexShow dw LoadStation_PokemonMusic dw LoadStation_LuckyChannel dw LoadStation_UnownRadio dw LoadStation_PlacesAndPeople dw LoadStation_LetsAllSing dw LoadStation_RocketRadio ; 91acb .OakOrPnP: ; 91acb call IsInJohto and a jr nz, .kanto call UpdateTime ld a, [TimeOfDay] and a jp z, LoadStation_PokedexShow jp LoadStation_OaksPokemonTalk .kanto jp LoadStation_PlacesAndPeople ; 91ae1 PokegearMap: ; 91ae1 ld a, e and a jr nz, .kanto call LoadTownMapGFX call FillJohtoMap ret .kanto call LoadTownMapGFX call FillKantoMap ret ; 91af3 _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 ClearSpriteAnims call LoadTownMapGFX ld de, FlyMapLabelBorderGFX ld hl, VTiles2 tile $30 lb bc, BANK(FlyMapLabelBorderGFX), 6 call Request1bpp call FlyMap call ret_91c8f ld b, SCGB_POKEGEAR_PALS 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 PlaySpriteAnimations call DelayFrame jr .loop .pressedB ld a, -1 jr .exit .pressedA ld a, [wTownMapPlayerIconLandmark] ld l, a ld h, 0 add hl, hl ld de, Flypoints + 1 add hl, de ld a, [hl] .exit ld [wTownMapPlayerIconLandmark], 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, [wTownMapPlayerIconLandmark] 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, wTownMapPlayerIconLandmark 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, wTownMapPlayerIconLandmark 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, [wTownMapPlayerIconLandmark] 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, [wTownMapPlayerIconLandmark] ld l, a ld h, $0 add hl, hl ld de, Flypoints add hl, de ld e, [hl] callba GetLandmarkCoords ld a, [wTownMapCursorCoordinates] ld c, a ld a, [wTownMapCursorCoordinates + 1] 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 INCLUDE "data/flypoints.asm" ret_91c8f: ; 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 [wTownMapPlayerIconLandmark], 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 [wTownMapPlayerIconLandmark], 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 [wTownMapPlayerIconLandmark], 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 hlbgcoord 0, 0 ; BG Map 0 call TownMapBGUpdate call TownMapMon ld a, c ld [wTownMapCursorCoordinates], a ld a, b ld [wTownMapCursorCoordinates + 1], a ret ; 91d11 _Area: ; 91d11 ; e: Current landmark ld a, [wTownMapPlayerIconLandmark] push af ld a, [wTownMapCursorLandmark] push af ld a, e ld [wTownMapPlayerIconLandmark], a call ClearSprites xor a ld [hBGMapMode], a ld a, $1 ld [hInMenu], a ld de, PokedexNestIconGFX ld hl, VTiles0 tile $7f lb bc, BANK(PokedexNestIconGFX), 1 call Request2bpp call .GetPlayerOrFastShipIcon ld hl, VTiles0 tile $78 ld c, 4 call Request2bpp call LoadTownMapGFX call FillKantoMap call .PlaceString_MonsNest call TownMapPals hlbgcoord 0, 0, VBGMap1 call TownMapBGUpdate call FillJohtoMap call .PlaceString_MonsNest call TownMapPals hlbgcoord 0, 0 call TownMapBGUpdate ld b, SCGB_POKEGEAR_PALS call GetSGBLayout call SetPalettes xor a ld [hBGMapMode], a xor a ; Johto call .GetAndPlaceNest .loop call JoyTextDelay ld hl, hJoyPressed ld a, [hl] and A_BUTTON | B_BUTTON jr nz, .a_b ld a, [hJoypadDown] and SELECT jr nz, .select call .LeftRightInput call .BlinkNestIcons jr .next .select call .HideNestsShowPlayer .next call DelayFrame jr .loop .a_b call ClearSprites pop af ld [wTownMapCursorLandmark], a pop af ld [wTownMapPlayerIconLandmark], a ret ; 91d9b .LeftRightInput: ; 91d9b ld a, [hl] and D_LEFT jr nz, .left ld a, [hl] and D_RIGHT jr nz, .right ret .left ld a, [hWY] cp $90 ret z call ClearSprites ld a, $90 ld [hWY], a xor a ; Johto call .GetAndPlaceNest ret .right 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 ; Kanto call .GetAndPlaceNest ret ; 91dcd .BlinkNestIcons: ; 91dcd ld a, [hVBlankCounter] ld e, a and $f ret nz ld a, e and $10 jr nz, .copy_sprites call ClearSprites ret .copy_sprites hlcoord 0, 0 ld de, Sprites ld bc, SpritesEnd - Sprites call CopyBytes ret ; 91de9 .PlaceString_MonsNest: ; 91de9 hlcoord 0, 0 ld bc, SCREEN_WIDTH ld a, " " call ByteFill hlcoord 0, 1 ld a, $6 ld [hli], a ld bc, SCREEN_WIDTH - 2 ld a, $7 call ByteFill ld [hl], $17 call GetPokemonName hlcoord 2, 0 call PlaceString ld h, b ld l, c ld de, .String_SNest call PlaceString ret ; 91e16 .String_SNest: db "'S NEST@" ; 91e1e .GetAndPlaceNest: ; 91e1e ld [wTownMapCursorLandmark], a ld e, a callba FindNest ; load nest landmarks into TileMap[0,0] decoord 0, 0 ld hl, Sprites .nestloop ld a, [de] and a jr z, .done_nest push de ld e, a push hl callba GetLandmarkCoords pop hl ; load into OAM ld a, d sub 4 ld [hli], a ld a, e sub 4 ld [hli], a ld a, $7f ; nest icon in this context ld [hli], a xor a ld [hli], a ; next pop de inc de jr .nestloop .done_nest ld hl, Sprites decoord 0, 0 ld bc, SpritesEnd - Sprites call CopyBytes ret ; 91e5a .HideNestsShowPlayer: ; 91e5a call .CheckPlayerLocation ret c ld a, [wTownMapPlayerIconLandmark] ld e, a callba GetLandmarkCoords ld c, e ld b, d ld de, .PlayerOAM ld hl, Sprites .ShowPlayerLoop: ld a, [de] cp $80 jr z, .clear_oam add b ld [hli], a inc de ld a, [de] add c ld [hli], a inc de ld a, [de] add $78 ; where the player's sprite is loaded ld [hli], a inc de push bc ld c, 0 ; RED ld a, [PlayerGender] bit 0, a jr z, .got_gender inc c ; BLUE .got_gender ld a, c ld [hli], a pop bc jr .ShowPlayerLoop .clear_oam ld hl, Sprites + 4 * 4 ld bc, SpritesEnd - (Sprites + 4 * 4) xor a call ByteFill ret ; 91e9c .PlayerOAM: ; 91e9c db -1 * 8, -1 * 8, 0 ; top left db -1 * 8, 0 * 8, 1 ; top right db 0 * 8, -1 * 8, 2 ; bottom left db 0 * 8, 0 * 8, 3 ; bottom right db $80 ; terminator ; 91ea9 .CheckPlayerLocation: ; 91ea9 ; Don't show the player's sprite if you're ; not in the same region as what's currently ; on the screen. ld a, [wTownMapPlayerIconLandmark] cp FAST_SHIP jr z, .johto cp KANTO_LANDMARK jr c, .johto .kanto ld a, [wTownMapCursorLandmark] and a jr z, .clear jr .ok .johto ld a, [wTownMapCursorLandmark] and a jr nz, .clear .ok and a ret .clear ld hl, Sprites ld bc, SpritesEnd - Sprites xor a call ByteFill scf ret ; 91ed0 .GetPlayerOrFastShipIcon: ; 91ed0 ld a, [wTownMapPlayerIconLandmark] cp FAST_SHIP jr z, .FastShip callba GetPlayerIcon ret .FastShip: 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 -1 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, SCREEN_WIDTH * SCREEN_HEIGHT .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, .PalMap 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 .PalMap: INCLUDE "data/palettes/town_map.asm" ; 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 depixel 0, 0 ld a, SPRITE_ANIM_INDEX_PARTY_MON call _InitSpriteAnimStruct ld hl, SPRITEANIMSTRUCT_TILE_ID add hl, bc ld [hl], $8 ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID add hl, bc ld [hl], SPRITE_ANIM_SEQ_NULL 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 depixel 0, 0 ld b, SPRITE_ANIM_INDEX_RED_WALK ; Male ld a, [PlayerGender] bit 0, a jr z, .got_gender ld b, SPRITE_ANIM_INDEX_BLUE_WALK ; Female .got_gender ld a, b call _InitSpriteAnimStruct ld hl, SPRITEANIMSTRUCT_TILE_ID add hl, bc ld [hl], $10 pop af ld e, a push bc callba GetLandmarkCoords pop bc ld hl, SPRITEANIMSTRUCT_XCOORD add hl, bc ld [hl], e ld hl, SPRITEANIMSTRUCT_YCOORD add hl, bc ld [hl], d ret ; 0x91ff2 LoadTownMapGFX: ; 91ff2 ld hl, TownMapGFX ld de, VTiles2 lb bc, BANK(TownMapGFX), $30 call DecompressRequest2bpp ret ; 91fff JohtoMap: ; 91fff INCBIN "gfx/pokegear/johto.bin" ; 92168 KantoMap: ; 92168 INCBIN "gfx/pokegear/kanto.bin" ; 922d1 PokedexNestIconGFX: ; 922d1 INCBIN "gfx/pokegear/dexmap_nest_icon.2bpp" FlyMapLabelBorderGFX: ; 922e1 INCBIN "gfx/pokegear/flymap_label_border.1bpp" ; XXX xor a ld [wTownMapPlayerIconLandmark], a call ClearBGPalettes call ClearTileMap call ClearSprites ld hl, hInMenu ld a, [hl] push af ld [hl], $1 xor a ld [hBGMapMode], a callba ClearSpriteAnims call LoadTownMapGFX ld de, FlyMapLabelBorderGFX ld hl, VTiles2 tile $30 lb bc, BANK(FlyMapLabelBorderGFX), 6 call Request1bpp call FillKantoMap call TownMapBubble call TownMapPals hlbgcoord 0, 0, VBGMap1 call TownMapBGUpdate call FillJohtoMap call TownMapBubble call TownMapPals hlbgcoord 0, 0 call TownMapBGUpdate call TownMapMon ld a, c ld [wTownMapCursorCoordinates], a ld a, b ld [wTownMapCursorCoordinates + 1], a ld b, SCGB_POKEGEAR_PALS 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 .HandleDPad call GetMapCursorCoordinates callba PlaySpriteAnimations call DelayFrame jr .loop .pressedB ld a, -1 jr .finished_a_b .pressedA ld a, [wTownMapPlayerIconLandmark] ld l, a ld h, 0 add hl, hl ld de, Flypoints + 1 add hl, de ld a, [hl] .finished_a_b ld [wTownMapPlayerIconLandmark], 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, [wTownMapPlayerIconLandmark] ld e, a ret ; 923b8 .HandleDPad: ; 923b8 ld hl, hJoyLast ld a, [hl] and D_DOWN | D_RIGHT jr nz, .down_right ld a, [hl] and D_UP | D_LEFT jr nz, .up_left ret .down_right ld hl, wTownMapPlayerIconLandmark ld a, [hl] cp FLY_INDIGO jr c, .okay_dr ld [hl], -1 .okay_dr inc [hl] jr .continue .up_left ld hl, wTownMapPlayerIconLandmark ld a, [hl] and a jr nz, .okay_ul ld [hl], FLY_INDIGO + 1 .okay_ul dec [hl] .continue ld a, [wTownMapPlayerIconLandmark] cp KANTO_FLYPOINT jr c, .johto call FillKantoMap xor a ld b, $9c jr .finish .johto call FillJohtoMap ld a, $90 ld b, $98 .finish ld [hWY], a ld a, b ld [hBGMapAddress + 1], a call TownMapBubble call WaitBGMap xor a ld [hBGMapMode], a ret ; 92402